Ciao a tutti ragazzi. Questo week-end sono stato inchiodato a Milano per varie vicissitudini familiari, perdendomi clamorosamente Neverland e quindi il grande incontro dedicato (al vino) e alla robotica. Sono sicuro vi siate divertiti!!
Seguendo il principio K.I.S. (keep it simple) ho sviluppato questo tutorial per permettere a chi non c'è stato di capire meglio cosa abbiamo sviluppato negli scorsi workshop:

Questo robot si basa sul kit pico, che è un piccolissimo automa a 3 ruote, con classica ruotina posteriore pivotante. Diciamo che è studiato per dare capacità di movimento nello spazio a una scheda arduino e permettere di approcciare alla robotica economicamente, o almeno l'idea iniziale era quella poi siamo sfociati nel self-balancing e quindi il mio *è stato adattato per questo utilizzo.
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 ), ma sembrano fare decisamente bene il loro lavoro.

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.
Codice:
#include <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 / 10;
if(delta > 90) delta = 90;
if(delta < -90) delta = -90;
left.write(81 - delta);
right.write(81 + delta);
Serial.print(orientation);
Serial.print(" * ");
Serial.println(delta);
}
Qui il video (non riesco a embeddarlo mi embedda quello precedentemente postato?!?!)
http://www.youtube.com/watch?v=18pmm4bZ20c
Ecco tutto, fatto il self-balancing .
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.
Ho capito, scrivero' un articolo sul PID. *;D
Qui l'articolo originale:
http://www.gioblu.com/index.php?opti...tica&Itemid=34