Sări la conţinut

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.

 

Lasă un răspuns

Completează mai jos detaliile cerute sau dă clic pe un icon pentru a te autentifica:

Logo WordPress.com

Comentezi folosind contul tău WordPress.com. Dezautentificare /  Schimbă )

Poză Twitter

Comentezi folosind contul tău Twitter. Dezautentificare /  Schimbă )

Fotografie Facebook

Comentezi folosind contul tău Facebook. Dezautentificare /  Schimbă )

Conectare la %s

Acest site folosește Akismet pentru a reduce spamul. Află cum sunt procesate datele comentariilor tale.

%d blogeri au apreciat: