Compact – un robot micut cu Arduino
Autor: Ro-Bot-X -12/10/2010-
Am dorit sa construiesc un robot demonstrativ pentru a pune in evidenta usurinta construirii unui robot cu Arduino, folosind Shield-ul Constructorului de Roboti (the Robot Builder’s Shield). Am mai folosit 2 micromotoare cu reductor de 100:1 de la Pololu, 2 suporti de baterii R3 (AAA) si un suport cu bila de 8mm (3/8″) tot de la Pololu. Pentru rotirea senzorului de distanta Sharp am folosit un micro servo HXT900 montat pe un distantier.
Pentru ca nu imi place sa prind piesele cu banda dublu adeziva, m-am decis sa fac o placa de sasiu la CNC-ul meu. Am folosit o bucata de plexiglas, ceea ce a creat probleme la gaurire, intrucat nu am folosit un burghiu normal, ci o freza dreapta, care s-a incarcat de plastic si acesta a largit cateva gauri, pina cand m-am intors langa masina si am observat ce se intampla. In afara de aceste cateva gauri, placa a iesit OK. Am mai facut un model, putin mai mare si de data asta i-am dat o forma octogonala. Dar aceasta placa o voi folosi la un robot asemanator.
Am filetat gaurile folosind un tarod #4-40 deoarece asta am avut la indemana. Urmeaza sa cumpar si un tarod M3, dar de obicei se gaseste doar in seturi si nu sunt chiar ieftine. Am montat apoi motorasele, suportii de baterii, suportul cu bila, placa Arduino, shield-ul, apoi am adaugat si servomotorul, montat pe un distantier. Pe servomotor am prins cu banda dublu adeziva senzorul de distanta Sharp. Am conectat motorasele la puntea H de pe shield, am conectat senzorul la bancul de conectori pentru senzori si servomotorul la bancul de conectori pentru servomotoare. Simplu, nu? A trebuit doar sa adaug un comutator pentru alimentare, deoarece placa Arduino nu este prevazuta cu asa ceva si nici eu nu am montat unul pe shield.
Iata cateva poze, am sa pun si un filmulet in curand:
Si in final un filmulet:
Si acum vreti si programul? OK…
// Compact, a small Arduino (Duemilanove) robot
// 2 Pololu micro motors 100:1 and small wheels,
// one HXT900 micro servo, one Sharp IR sensor,
// 2 AAA battery holders, the Robot Builder's Shield
//
// Arduino pinout:
//
// Shield Funct Arduino ATmega168 Arduino Funct Shield
// +-----\/----+
// Reset 1| PC6 PC5 |28 D19 A5 SCL
// Rx D0 2| PD0 PC4 |27 D18 A4 SDA
// Tx D1 3| PD1 PC3 |26 D17 A3
// Int0 D2 4| PD2 PC2 |25 D16 A2
// Int1 D3 5| PD3 PC1 |24 D15 A1
// M1B D4 6| PD4 PC0 |23 D14 A0 IR sensor
// 7| VCC GND |22
// 8| GND AREF |21
// Xtal 9| PB6 AVCC |20
// Xtal 10| PB7 PB5 |19 D13 SCK LED
// M1A OC0B D5 11| PD5 PB4 |18 D12 MISO Pan servo
// M2A OC0A D6 12| PD6 PB3 |17 D11 OC2A MOSI
// M2B D7 13| PD7 PB2 |16 D10 OC1B
// D8 14| PB0 PB1 |15 D 9 OC1A
// +-----------+
//
#include
//Inputs/outputs
#define Motor_1_PWM 5 // digital pin 5 // Right Motor
#define Motor_1_Dir 4 // digital pin 4
#define Motor_2_PWM 6 // digital pin 6 // Left Motor
#define Motor_2_Dir 7 // digital pin 7
#define IR_Pin 14 // digital pin 14 (analog pin 0)
#define PanPin 12
#define LedPin 13
#define SR 1 //Sharp Short Range sensor
#define MR 2 //Sharp Medium Range sensor
#define LR 3 //Sharp Long Range sensor
#define center 90
//Variables
byte dir=0;
byte speed1=250;
byte speed2=255;
int turn90=110;
int turn45=55;
int straight=500;
int stopTime=200;
int IRdistance=0;
int treshold=20; //20cm min distance
Servo Pan;
//-----------------------------------------------------------------------------
void setup() {
// set motor pins as output and LOW so the motors are breaked
pinMode(Motor_1_PWM, OUTPUT);
pinMode(Motor_1_Dir, OUTPUT);
pinMode(Motor_2_PWM, OUTPUT);
pinMode(Motor_2_Dir, OUTPUT);
Stop();
Pan.attach(PanPin);
Pan.write(center); //90
StepDelay();
pinMode(LedPin, OUTPUT);
digitalWrite(LedPin, LOW);
Serial.begin (19200);
Serial.println("start");
Forward();
}
void loop(){
Drive();
//square();
}
void square(){
Forward();
delay(straight);
Stop();
delay(stopTime);
Right();
delay(turn90);
Stop();
delay(stopTime);
Forward();
delay(straight);
Stop();
delay(stopTime);
Right();
delay(turn90);
Stop();
delay(stopTime);
Forward();
delay(straight);
Stop();
delay(stopTime);
Right();
delay(turn90);
Stop();
delay(stopTime);
Forward();
delay(straight);
Stop();
delay(stopTime);
Right();
delay(turn90);
Stop();
delay(stopTime);
}
//--------------------------
void Drive(){
IRdistance=Read_Sharp_Sensor(MR, IR_Pin);
Serial.print("IRdistance ");
Serial.println(IRdistance);
if (IRdistance<10){
Stop();
StepDelay();
TurnAround();
}
if (IRdistance<5; i++){
Pan.write(i*45);
StepDelay();
StepDelay();
IRdistance=Read_Sharp_Sensor(MR, IR_Pin);
if (IRdistance>prev){
dir=i;
prev=IRdistance;
}
}
Pan.write(center);
StepDelay();
switch (dir){
case 0:
Right();
delay(turn90);
Stop();
StepDelay();
break;
case 1:
Right();
delay(turn90); //turn45
Stop();
StepDelay();
break;
case 2:
Forward();
break;
case 3:
Left();
delay(turn90); //turn45
Stop();
StepDelay();
break;
case 4:
Left();
delay(turn90);
Stop();
StepDelay();
break;
}
delay(500);
}
// Read Sensors
int Read_Sharp_Sensor(byte model, byte pin) {
int value = 0;
value = analogRead(pin);
switch (model) {
case SR: //short range, aka GP2D120 (4-30cm)
return (2914/(value+5))-1;
break;
case MR: //medium range, aka GP2D12 (10-80cm)
return 5*1384.4*pow(value,-.9988); //I had to multiply by 5, different sensor
break;
case LR: //long range, aka GP2Y0A02YK (20-150cm)
return 11441*pow(value,-.9792);
break;
}
}
void StepDelay() {
for (byte t=0; t<10; t++){
delay(20);
}
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void Forward(){
digitalWrite(Motor_1_Dir, LOW); // forward
digitalWrite(Motor_2_Dir, LOW); // forward
analogWrite(Motor_1_PWM, speed1); //
analogWrite(Motor_2_PWM, speed2); //
return;
}
void Reverse(){
digitalWrite(Motor_1_Dir, HIGH); // reverse
digitalWrite(Motor_2_Dir, HIGH); // reverse
analogWrite(Motor_1_PWM, 255-speed1); //
analogWrite(Motor_2_PWM, 255-speed2); //
return;
}
void Right(){
digitalWrite(Motor_1_Dir, HIGH); // reverse
digitalWrite(Motor_2_Dir, LOW); // forward
analogWrite(Motor_1_PWM, 255-speed1); //
analogWrite(Motor_2_PWM, speed2); //
return;
}
void Left(){
digitalWrite(Motor_1_Dir, LOW); // forward
digitalWrite(Motor_2_Dir, HIGH); // reverse
analogWrite(Motor_1_PWM, speed1); //
analogWrite(Motor_2_PWM, 255-speed2); //
return;
}
void Stop()
{
digitalWrite(Motor_1_PWM, LOW);
digitalWrite(Motor_1_Dir, LOW);
digitalWrite(Motor_2_PWM, LOW);
digitalWrite(Motor_2_Dir, LOW);
return;
}
Vezi aici detalii complete.












Cristi
October 19th, 2010
vreau sa fac si eu un astfel de robot.am putea vorbi mai multe pe messenger?
Viorel
October 20th, 2010
Salut Cristi,
Cu mare placere, doar ca pe YM ma gasesti greu
Ma gasesti in schimb aproape tot timpul pe GTalk (http://www.google.com/talk), iti dau acum un email cu id-ul meu.
Numai bine,
Viorel
Coman Cosmin
October 20th, 2010
As vrea sa fac si eu un astfel de robot pentru un proiect de licenta. St anul 4 la facultatea de calculatoare. Cum am putea sa discutam?
Multumesc anticipat
Cristi
October 20th, 2010
salut.imi mai poti trimite inca odata id-ul ca nu l-am primit.mersi
Viorel
October 20th, 2010
Salut Cosmin,
TI-am trimis un email cu datele mele de contact, ne auzim curand.
Liviu
October 22nd, 2010
Buna ziua! Ma bucur foarte mult ca am gasit acest site. Eu sunt student in anul 4 la Facultatea de Electronica si am ca tema construirea unui astfel de robot pentru proiectul meu de licenta. Am putea sa discutam cumva pentru mai multe detalii? Am o multime de intrebari…
Va multumesc anticipat si astept un raspuns.
Viorel
October 22nd, 2010
Salut Liviu,
Ai un email de la mine cu datele mele de contact.
Viorel
Stefan
October 28th, 2010
Salutare,
As dori si eu datele de contact sa discutam despre acest proiect.
Multumesc!
Viorel
October 29th, 2010
Stefan, ai un email cu datele mele.
constantin
January 11th, 2011
Salutare
ar prinde bine si schema electronica
adrian
January 22nd, 2011
f tare ideea.. am gasit-o pe un alt site dar in loc de arduino folosea picaxe. am caut prin romania picaxe28 si din cate am inteles nu se prea gaseste. si asa am dat peste site-ul asta. ok ideea e buna dar m-ar interesa ca robotul sa fie controlat printr-un joystick. nu am cunostiinte de electronica avansata sau de programare (intentionez sa imi creez robotul dupa cateva scheme gata facute). poti sa ma ajuti pe mine cu o idee in ce priveste controlul robotului cu un joystick?
Viorel
January 22nd, 2011
Salut Adrian,
Ma bucur ca iti place, multumesc pentru comentariu.
Nu este complicat sa il comanzi prin joystick, chiar si fara fir. Cel mai simplu este cu transmitatoare RF (eu am facut ceva similar, dar in loc de joystick am folosit un giroscop, si astfel robotul raspundea la miscarea mainii mele).
Esti din Bucuresti ? Daca da, cel mai simplu este sa ne vedem la o cafea si sa stam de vorba pe indelete. Daca nu esti din Bucuresti, ne auzim la un telefon. Ti-am dat pe mail datele mele de contact.
Viorel
FlorinV
March 11th, 2011
Salut,
Nu am vazut sa folositi encodere pentru cele 2 roti(pentru feedback). Din cate am citit e posibil ca robotul sa nu mearga drept din aceasta cauza. Ati avut problema aceasta? (din filmulet para sa mearga drept
)
Numai bine,
Florin Vasilescu
Ro-Bot-X
March 15th, 2011
Pentru a “convinge” robotelul sa mearga drept, am ajustat valoarea PWM a motorului care merge mai repede si din mai multe incercari am gasit valoarea potrivita. Dar si aceasta valoare este relativa, intrucat depinde de suprafate pe care se deplaseaza si de cat de tare este descarcata bateria.
Am folosit encodere la alti roboti. Mai intai am construit encodere optice, folosind o pereche de fototranzistor+LED IR si au rezultat encodere simple (nu quadratura), foarte sensibile la distanta pina la discul cu dungi alb-negre, si care dadeau si intreruperi “false”, din cauza efectului de “bounce”. Am incercat sa folosesc si rotite luate din mousi (rotita de scroll), care sunt mecanice si sufera si ele de efectul de “bounce”. Pina la urma m-am hotarat sa folosesc motoare cu encodere integrate, cu 2 canale (quadratura), ceea ce a eliminat problemele amintite. Ah, semnalul de la fiecare encoder era conectat la un pin de intrerupere externa, unul pt stanga si unul pt dreapta, iar al doilea canal era conectat la un pin digital disponibil. In faza de testare a codului, de fiecare data cand era detectata o intrerupere, foloseam o comanda serial.print si ma miram de ce la viteza mica merge perfect iar la viteza mare nu mai numara bine. Am incercat tot felul de metode de a numara intreruperile (si simplu, si quadratura, manipulare directa a registrilor, etc.) dar nu am mers nimic cum trebuia pina in momentul in care am scos comanda seriala si am lasat motorul sa mearga 10 secunde si am printat apoi numarul intreruperilor si culmea, a fost bun, cu fiecare metoda de numarare. Apoi am facut un control PD care compara cele 2 encodere si ajusteaza viteza unui motor pentru a le aduce la aceeasi viteza. Avand encodere, am inceput sa dau instructiuni de deplasare pe distante fixe sau de intoarceri cu un anumit numar de grade si robotul le executa perfect. Cauta la proiecte, robotul MiniEric – modulul de control al motoarelor sa vezi exemplul de cod. Vroiam sa modific codul si sa il fac mai performant, cu un control PID pentru deplasare si intoarcere exacta (necesita quadratura) plus controlul pentru egalizarea motoarelor, dar nu am apucat sa il termin. O sa-i vina din nou vremea dupa ce voi modifica mai intai sasiul robotului.
Cheers!
FlorinV
March 16th, 2011
Multumesc frumos Robotx pentru raspuns si spor in continuare.
Numai bine,
Florin
Dragos
May 8th, 2011
Salut am mare nevoie de ajutor am de facut un proiect in termen de 1 saptamana si am gasit acest robotel daca vreti sa-mi trimiteti o lista cu componete si niste instructiuni ca sa pot realiza robotelu sau de la un alt robotel mai simplu care sal pot realiza in termen de o saptamana va rog mult de am nevoie de ajutor sunt student la constructii de masini
Emilian F.
October 6th, 2011
Buna seara tuturor in primul rand. Am marea placere sa ma alatur site-ului tehnorama.ro, deoarece am vizulizat multe dintre proiecte si doresc sa aflu mai multe, astfel sa pot veni cu propuneri. In al doilea rand doresc sa salut pe domnul Viorel, caruia ii adresez “un strigat de ajutor”, in scopul unui proiect deja existent pe site-ul tehnorama.ro. Daca se poate domnul Viorel, bineinteles daca sunteti si de acord sa imi oferiti acel sprijin. V-as fi recunoscator daca imi puteti da id-ul de mess, sau id-ul de gmail. Va multumesc anticipat.
danyrox
January 21st, 2012
buna ziua! as dori sa stiu dak aveti de vanzare un servo hxt 900?
am nev cat mai repede..
va multumesc!
tarcu tudor
March 11th, 2012
as vrea sa fac si eu un astfel de robot daca ma puteti contacra pe messenger si sa imi ziceti toate piesele necesare si de unde le-as putea procura va multumesc.