Salve a tutti,
ho iniziato un nuovo esperimento, e cioè voglio creare un sistema di autobilanciamento su un bilico per arduino.
1 prova)
Componenti:
1 potenziometro da 2.2k
1 mini servo mg90
1 bullone esagonale (pesante)
1 vite lunga con altri pesi montati in cima.
1 psu 7805 per il servo
Montaggio:
ho montato il potenziomatro (contatti verso l’alto) , su una base in legno, con l’albero sporgente ed ho fissato in maniera solidale all’albero un braccio con un peso che lo tiene a metà corsa (il bullone esagonale).
dal lato opposto della base in legno ho fissato il servo, ed alla sua crociera ho fissato la vite con i pesi scorrevoli (tutti in cima per la prima prova).
Software:
L’esempio servo knob K.I.S.S.
Prova sul campo:
posto il tutto su un bilico, muovendo la base con la mano il servo muove il peso in direzione opposta tentando di controbilanciare la pressione della mano.
direi che è l’effetto che volevo…
Ma andiamo oltre…
2 prova)
Componenti:
2 sensori sharp GP2D12
1 solito servo
1 solita vite con pesi montati in cima
1 psu 7805 per il servo ed i sensori
Montaggio:
ho posizionato i due sensori a infrarossi sotto la base in legno, uno in testa ed uno in coda (come il robot di gbm).
il servo e montato come nella prova precedente.
Software:
Questa volta ho messo giù qualche riga di sw per leggere la distanza sei sensori dal suolo e istruire il servo a spostarsi in caso di sbilanciamento dalla posizione di 0 (90°).
#include <Servo.h>
#define IRFront 2
#define IRBack 3
int frontSense = 0; //sensore ir anteriore
int backSense = 0; //sensore ir posteriore
Servo myservo; // creo oggetto servo per il controllo
int val ; // variable per posizione servo
void setup()
{
Serial.begin(9600);
val=90; //servo al centro, si parte paralleli al suolo
myservo.attach(9); // assegno il servo al pin 9
}
void getValues() {
frontSense = 0;
backSense = 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;
}}}
void loop() {
val=90;
getValues(); //leggi i dati e posiziona il servo in base allo sbilanciamento
if (frontSense > backSense) val++;
if (frontSense < backSense) val--;
if (frontSense == backSense) val=90;
Serial.print("FS:"); //un pò di debugging
Serial.println(frontSense);
Serial.print("BS:");
Serial.println(backSense);
//val = map(val, 0, 1023, 0, 179); // scalo o no? ci penserò dopo
myservo.write(val); // posiziona il servo
Serial.print("Servo_Pos:");
Serial.println(val);
delay(15); // aspettiamo il servo...
}
Prova sul campo:
Non riesco a leggere dei valori affidabili e coerenti dai sensori!
e non capisco perchè… dove sbaglio?