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;
} 


Ceva neclar in articolul de mai sus ? Ai vrea sa discuti cu cineva despre proiectul tau ? Vino in fiecare marti seara de la ora 19:00 la Intalnirea Tehnorama, sau ne poti contacta direct.
Vezi aici detalii complete.

Despre... Ro-Bot-X

Acest autor a publicat 14 articole.

Share

FacebookTwitterEmailWindows LiveTechnoratiDeliciousDiggStumbleponMyspaceLikedin

Comentarii


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.

Trimite un comentariu