Concurs : Robot Comandat RC

 

Acest articol este publicat in cadrul concursului Robofun 2012. Daca iti place si vrei sa castige unul dintre cele 10 premii, ofera-i un vot apasand butonul “Like” de mai jos.

 

Robot comandat RC

Aspecte tehnice

Youtube:

 Proiectul de fata este un proiect relativ simplu ce are ca scop in principiu transmiterea unor variabile prin modulele RC de transmisie si receptie. In functie de aceste date receptate robotul se va pune in miscare. Robotului ii pot fi adaugate multe imbunatatiri, el fiind deocamdata in faza de dezvoltare. Un senzor pentru evitarea obstacolelor, face din el sa fie semiautonom, si totodata comandat, insa pentru a facilita intelegerea proiectului nu am mai adaugat senzorul.

Asa zisa telecomanda este compusa dintr-un transmitator radio, un Arduino pro mini si un joystick impreuna cu shieldul pentru acesta, toate acestea gasindu-se pe http://www.robofun.ro.

IMG 0001

IMG 0045

De cealalta parte robotul este creat din kitul magician robot de pe www.robofun.ro, care contine cadrul pentru robot, motoarele de current continuu, driverul de motoare, si un Arduino Uno. Pentru a putea reutiliza calurile brick folosite, pentru conectarea lor am folosit un breadboard.

IMG 0072

Conectarea cablurilor pentru Arduino Pro Mini se face la portul 12 pentru transmitator, respectiv porturile analogice A0 si A2 pentru citirea celor doua potensiometre de la joystick.

Pentru Arduino Uno se folosesc portul 11 pentru conectarea receptorului , respective doua porturi digitale 8 si 7, pentru aprinderea a doua leduri.

IMG 0060

Aspectele Software

Pentru transmisie se foloseste biblioteca VirtualWire, care poate transmite un sir de octeti.

Partea de transmisie:

#include <VirtualWire.h>

void setup()

{

vw_set_ptt_inverted(true); // Required for DR3100

vw_setup(2000); // Bits per sec

}

void loop()

{

char axis[6]; //declaram un vector pentru transmiterea a maxim 6 octeti, in caz

// ca vrem sa mai introducem si alti octeti

int x=analogRead(2);// se citesc datele de la cele doua potensiometre ale joystickului

int y=analogRead(0);

Serial.print(x); //le afisam pentru a vedea valorile

Serial.print(” “);

Serial.println(y);

byte lowerByte1 = (x & 0xFF); // facem din cei 10 biti pe care I are o varibila

byte upperByte1=(x >>8); //doi octeti

byte lowerByte2 = (y & 0xFF);

byte upperByte2=(y >>8);

axis[0]=lowerByte1; //initializam componentele vectorului cu cei 4 octeti rezultati

axis[1]=upperByte1;

axis[2]=lowerByte2;

axis[3]=upperByte2;

{

vw_send((uint8_t *)axis, sizeof(axis)); //transmitem vectorul ce contine octetii, precum

//si dimensiunea sa

vw_wait_tx(); // Wait until the whole message is gone

digitalWrite(13, false);

}

}

De asemenea pentru a recepta datele folosim functiile aflate in libraria VirtualWire.

Partea de receptie

#include <VirtualWire.h>

unsigned long timer; //cream un mic timer pentru aprinderea ledurilor

boolean ledon=true;

int M1_1 = 3; //declaram pinii pentru cele doua motoare ale robotului

int M1_2 = 5;

int M2_1 = 6;

int M2_2 = 9;

void setup()

{

pinMode(7,OUTPUT); //declararea celor doua leduri la porturile 8,7

pinMode(8,OUTPUT);

pinMode(M1_1, OUTPUT); //declararea pinilor pentru motoare ca output

pinMode(M1_2, OUTPUT);

pinMode(M2_2, OUTPUT);

pinMode(M2_1, OUTPUT);

vw_setup(2000); // setarea vitezei de transmisie precum inceperea sa

vw_rx_start();

}

void loop()

{

digitalWrite(7,ledon);

digitalWrite(8,!ledon);

if(millis()>timer)

{digitalWrite(7,ledon);

digitalWrite(8,!ledon);

ledon= !ledon;

timer=millis()+500; //pana ain acest punct este un mic programel pentru aprinderea //celor doua leduri

}

{

byte temp[VW_MAX_MESSAGE_LEN];

byte templen = VW_MAX_MESSAGE_LEN;

if (vw_get_message(temp, &templen)) //daca s-a receptat sirul de octeti

{

int x,y;

digitalWrite(13, true);

x= (temp[1] << 8 ) | temp[0]; //vom reface valorile transmise

y= (temp[3] << 8 ) | temp[2];

if (y>1000) //si in functie de ele vom face posibila miscarea robotului

{

analogWrite(M1_1,0);

analogWrite(M1_2,255);

analogWrite(M2_1,0);

analogWrite(M2_2,255);

}

else if (y<40)

{analogWrite(M1_1,150);

analogWrite(M1_2,0);

analogWrite(M2_1,255);

analogWrite(M2_2,0);

}

else if (x>1000)

{analogWrite(M1_1,0);

analogWrite(M1_2,255);

analogWrite(M2_1,255);

analogWrite(M2_2,0);

}

else if (x<40)

{analogWrite(M1_1,255);

analogWrite(M1_2,0);

analogWrite(M2_1,0);

analogWrite(M2_2,255);

}

else

{analogWrite(M1_1,0);

analogWrite(M1_2,0);

analogWrite(M2_1,0);

analogWrite(M2_2,0);

}

}

}

}

 

Acest articol este publicat in cadrul concursului Robofun 2012. Daca iti place si vrei sa castige unul dintre cele 10 premii, ofera-i un vot apasand butonul “Like” de mai jos.

 

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s