miércoles, 19 de enero de 2011

Robot Arduino Wifi Español

Hola a continuación mostrare un robot que es controlado por visual basic a través de una red wifi con winsoc.

El proyecto es una aplicación de visual basic 6.0 puedo conectar el modulo wifi de arduino a una red wifi casera, con visual puedo controlar mi robot a demás puedo ver lo que el robot captura de sus sensores, en este caso un acelerómetro  aunque se puede visualizar los datos de los sensores sharp.
La interfaz es muy simple tienes un edittext para la dirección IP, uno para el puerto y el botón de conexión y desconexión.
En el edit tex que dice "Put Mouse Pointer Here" coloca el puntero del mouse y con las teclas de flechas puedes controlar tu robot ahora si lo quieres autónomo, existe un botón respectivo para esto y otro para regresarlo al modo de control.
Espero les guste
Anexo el código en arduino y el proyecto en VB6
Gracias.




Codigo VB:

http://www.2shared.com/file/5HoGGZ23/Cliente_VB.html

Codigo Arduino:

#include <WiShield.h>
#include <Servo.h>

#define VOLTS_PER_UNIT    .0049F        // (.0049 for 10 bit A-D)

#define WIRELESS_MODE_INFRA 1
#define WIRELESS_MODE_ADHOC 2

// Wireless configuration parameters ----------------------------------------
byte local_ip[]    = {your ip}; // IP address of WiShield
byte gateway_ip[]  = {your gateway_ip}; // router or gateway IP address
byte subnet_mask[] = {your subnet_mask }; // subnet mask for the local network
prog_char ssid[] PROGMEM    = {"YOUR_SSID"}; // max 32 bytes
unsigned char security_type = 0; // 0 - open; 1 - WEP; 2 - WPA; 3 - WPA2

// WPA/WPA2 passphrase
const prog_char security_passphrase[] PROGMEM = {"big_secret"}; // max 64 characters

// WEP 128-bit keys
// sample HEX keys
prog_uchar wep_keys[] PROGMEM = {
  0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, // Key 0
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Key 1
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Key 2
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // Key 3
};

// setup the wireless mode
// infrastructure - connect to AP
// adhoc - connect to another WiFi device
unsigned char wireless_mode = WIRELESS_MODE_INFRA;

unsigned char ssid_len;
unsigned char security_passphrase_len;
//---------------------------------------------------------------------------


Server server(80);
Client client_a;
int Dato = 0;
byte A =0;


word X1 = 0;
word Y1 = 0;
word Z1 = 0;
word Dis = 0;

float volts = 0.0;
float inches = 0.0;
float cm = 0.0;
float cm_1 = 0.0;
float cm_2 = 0.0;

Servo myservo_0; 
Servo myservo_1;
Servo myservo_2;

void setup(){
  Serial.begin(9600);
  WiFi.begin(local_ip, gateway_ip, subnet_mask);

  server.begin();
  myservo_0.attach(5);
  myservo_1.attach(6); 
  myservo_2.attach(7);   
  Cero();
}


void loop(){
  Wifi_Ardu();
  Serial.println("loop");
}

void Wifi_Ardu(){
 if(!client_a.connected()) {
     server.available(&client_a);
     client_a.println("Conecto"); 
 }else{ 
     while(client_a.available()){      
      // Captura datos del acelerometro
       X1 = analogRead(4);
       Y1 = analogRead(3);
       Z1 = analogRead(5);
      
       client_a.print("#");
       client_a.print(X1);
       client_a.print("$");
       client_a.print(Y1);
       client_a.print("%");
       client_a.println(Z1);

//--------------------------------------------------------      

//--------------------------------------------------------   

       char c = (char)client_a.read();
       A = c;
      
       Serial.println(A);      
      
       if(A==65){      
          Adelante();
       }else if(A == 66){
          Atras();
       }else if(A == 67){
          Izquierda();      
       }else if(A == 68){
          Derecha();      
       }else if(A == 69){
          Cero();      
       }else if(A==70){
         Autonomo();
       }
     }
   } 
}

void Autonomo(){
  while(1){
   while(client_a.available()){
      Cal_Dis_0();
      Cal_Dis_1();
      Cal_Dis_2(); 
      Evadir_OBJ();
      char c = (char)client_a.read();
      A = c;
      Serial.println(A);
      if(A==71){
        Serial.println("ntro");
        return;   
      }else{}
    } 
  }
} 
 

 void Cal_Dis_0(){       
    Dis = analogRead(0);     
    volts = (float)Dis * VOLTS_PER_UNIT; // ("proxSens" is from analog read)
    inches = 23.897 * pow(volts,-1.1907); //calc inches using "power" trend line from Excel
    cm = 60.495 * pow(volts,-1.1904);     // same in cm
    if (volts < .2) inches = -1.0;
    //Serial.println(cm); 
}
 void Cal_Dis_1(){       
    Dis = analogRead(1);     
    volts = (float)Dis * VOLTS_PER_UNIT; // ("proxSens" is from analog read)
    inches = 23.897 * pow(volts,-1.1907); //calc inches using "power" trend line from Excel
    cm_1 = 60.495 * pow(volts,-1.1904);     // same in cm
    if (volts < .2) inches = -1.0;
    //Serial.println(cm_1); 
}
 void Cal_Dis_2(){       
    Dis = analogRead(2);     
    volts = (float)Dis * VOLTS_PER_UNIT; // ("proxSens" is from analog read)
    inches = 23.897 * pow(volts,-1.1907); //calc inches using "power" trend line from Excel
    cm_2 = 60.495 * pow(volts,-1.1904);     // same in cm
    if (volts < .2) inches = -1.0;
    //Serial.println(cm_2); 
}

void Evadir_OBJ(){
 if(cm < 20){
   Atras();
   Busca();
 }
 if(cm_1 < 20){
   Izquierda();
   delay(100);
 }
 if(cm_2 < 20){
   Derecha();
   delay(100);  
 }

 if(cm > 20 && cm_1 > 20 && cm_2 > 20){
   Adelante();
 }else{}
}

void Busca(){
while(1){
  Izquierda();
   if(cm_2 < 20){
   Derecha();
   delay(100);  
   break;
 }else{
   break;
 }
}

while(1){
  Derecha();
   if(cm_1 < 20){
   Izquierda();
   delay(100);  
   break;
 }else{
   break;
 }
}
 
}



void Atras(){
   myservo_0.write(140);
   delay(15);  
   myservo_1.write(160);
   delay(15);   
}


void Adelante(){
   myservo_0.write(160);
   delay(15);  
   myservo_1.write(140);
   delay(15);   
}

void Izquierda(){
   myservo_0.write(140);
   delay(15);  
   myservo_1.write(140);
   delay(15);   
}

void Derecha(){
   myservo_0.write(160);
   delay(15);  
   myservo_1.write(160);
   delay(15);   
}

void Cero(){
   myservo_0.write(150);
   delay(15);  
   myservo_1.write(150);
   delay(15);   
   myservo_2.write(150);
   delay(15);   
}

1 comentario:

  1. amigo quiero empezar un proyecto con arduino wifi pero no puedo hacer ninguna practica por que no me puedo conecta ala tarjeta arduino me podrías ayudar para hacer lo que tu hiciste paso paso.

    Te agradecería tu generosa ayuda.

    ResponderEliminar