gbm
Self-balancing robot per principianti
Tutorials -
Martedì 29 Giugno 2010 00:17
Scritto da gbm

kit pico self balancing

Questo robot si basa sul kit pico, che è un piccolissimo automa a 3 ruote, con classica ruotina posteriore pivotante. Diciamo che sono quattro componentini al prezzo minore possibile immaginable, che danno capacità di movimento nello spazio ad Arduino, e permettono di approcciare alla robotica economicamente, o almeno l'idea iniziale era quella poi siamo sfociati nel self-balancing e quindi il mio Fico è stato adattato per questo utilizzo.

 

Pico self balancing robot

Il robot è composto da:

  • 2x ruote per servi/microservi con pneumatico in foam
  • 2x staffe microservi
  • 2x microservi (in questo caso Turborix)
  • 2x sensori ir possibilmente analogici (in questo caso SHARP)
  • 1x Arduino duemilanove
  • 1x layer Pico
  • 1x portabatterie 4xAAA
  • 4x batterie stilo AAA

Questo primo prototipo è in grado solo di mantenere una posizione bilanciata e correggere eventuali errori di inclinazione. Per farlo utilizza due semplicissimi sensori Sharp, che in realtà non sono esattamente studiati per rilevare cosi' brevi distanze (in teoria sono utilizzati per range da 50 a 3cm io li uso tra 3 e 0 Fico), ma sembrano fare decisamente bene il loro lavoro.

Visione da sotto kit pico self balancing

 

L'algoritmo che ho scritto è semplicissimo: calcolo la distanza dal suolo per ognuno dei due sensori, e sottraggo la prima alla seconda. Se il robot è parallelo al terreno il valore sarà 0 o vicinissimo allo 0 (micro-correzioni). Quindi basterà scrivere: Servo.write(90 + il nostro valore); per ottenere una reazione in rapporto alle due distanze rilevate dai sensori. Cioè il nostro valore sarà negativo se il primo dei due sensori otterrà una rilevazione minore della seconda, o positivo in caso contrario.

Ecco tutto, fatto il self-balancing Linguaccia. Qui dentro ragazzi c'è tutto quello che serve. Se analizzate il primo programma da noi postato sul self-balancing grazie a IMU e questo, sono del tutto simili, ed entrambi utilizzano sistemi fondamentali per noi potenziali creatori di automi. Il valore delta, buttato direttamente in servo.write, è definibile come la P del PID. Infatti il robot è in grado solo di correggere non oltre una quindicina di gradi di inclinazione per lato e chiaramente solo sul posto, non in movimento, proporzionalmente all'errore di inclinazione. La mancanza della I e della D si sentono infatti se il robot accelera in una direzione.

La semplicità di questo sistema permette più o meno a chiunque di poterlo testare con ciarpame di recupero e componenti a costo irrisorio. Con questo bisogna chiaramente prendere atto delle elevate limitazioni di questo sistema, per esempio senza almeno un accelerometro che determini il reale vettore gravità i nostri amici non potranno mai fare una salita o una discesa.

Il codice: (ricordatevi di includere la libreria Servo.h )

 

Servo left;
Servo right;

#define servoLeftPin     9
#define servoRightPin   10
#define servoZero       81
#define IRFront         0
#define IRBack          1
#define ledPin          13

int frontSense = 0;
int backSense = 0;
int orientation = 0;

void setup() {
pinMode(ledPin, OUTPUT);
left.attach(servoLeftPin);
right.attach(servoRightPin);
left.write(servoZero);
right.write(servoZero);
Serial.begin(9600);
}


void getOrientation() {
  frontSense = 0;
  backSense = 0;
  orientation = 0;
 for (int i = 0; i < 10; i++) {
  frontSense = analogRead(IRFront) + frontSense;
  backSense = analogRead(IRBack) + backSense;
  if (i == 9) {
   frontSense = frontSense / 10;
   backSense = backSense / 10;
   orientation = frontSense - backSense;
  }
 }
}


void loop() {
getOrientation();

float delta = orientation / 8;
if(delta > 90) delta = 90;
if(delta < -90) delta = -90;
left.write(81 - delta);
right.write(81 + delta);
Serial.println(orientation);
}

 

Scommetto che dopo pochi minuti di gioco con il nuovo e tremolante automa Occhiolino noterete che, se cade da una parte il programma non è in grado di ritrovare una posizione stabile, è solo in grado di accelerare per sempre in una direzione strusciando il muso per terra. Per questo oggi ho scritto queste due righe in piu' che ovviano il problema.

Come potrete notare il codice non si è allungato molto. Viene utilizzato il valore fall per richiamare un delay di 250 millisecondi, che permette al robot di avere abbastanza momento inerziale dato dall'accensione repentina dei motori per ritornare nella posizione corretta.

Servo left;
Servo right;

#define servoLeftPin     9
#define servoRightPin   10
#define servoZero       81
#define IRFront         0
#define IRBack          1
#define ledPin          13

int frontSense = 0;
int backSense = 0;
int orientation = 0;
int fall = 0;


void setup() {
pinMode(ledPin, OUTPUT);
left.attach(servoLeftPin);
right.attach(servoRightPin);
left.write(servoZero);
right.write(servoZero);
Serial.begin(9600);
}


void getOrientation() {
  frontSense = 0;
  backSense = 0;
  orientation = 0;
 for (int i = 0; i < 10; i++) {
  frontSense = analogRead(IRFront) + frontSense;
  backSense = analogRead(IRBack) + backSense;
  if (i == 9) {
   frontSense = frontSense / 10;
   backSense = backSense / 10;
   orientation = frontSense - backSense;
  }
 }
}


void loop() {
getOrientation();

float delta = orientation / 8;
if(delta > 90) delta = 90;
if(delta < -90) delta = -90;
if(orientation > 250) fall = fall + 1;
if(orientation < -250) fall = fall - 1;
left.write(81 - delta);
right.write(81 + delta);
if (fall == 25 || fall == -25) {
   left.write(servoZero);
   right.write(servoZero);
   delay(250);
   fall = 0;
}
Serial.print(orientation);
Serial.print("   ");
Serial.println(fall);
}

Creative Commons License
PICO robot by Giovanni Blu Mitolo is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.
Based on a work at
www.gioblu.com.

 

Gioblu Robotics © 2010 - 2012 · Sitemap · privacy

gioscarab@gmail.com

Gioblu BOTServer è online dal 10 Aprile 2010 - 319.232 Visite - 1.027.175 Pagine visualizzate - 182.309 Visitatori unici - 536 utenti attivi