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.
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.
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.
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.