Archivi categoria: hw config

Beta1test. Bachi e passi avanti

Ieri ho ottenuto questo risultato:

beta1_graph1

Grazie alle seguenti azioni:

1)Il test con la semisfera montata sotto il quadricottero non mi convinceva piu’. l’attrito, i limiti sulle rotazioni dovuti al pavimento sono vincoli non presenti nel volo.

Per cui ho deciso di passare alla soluzione piu usata e riconosciuta , appendendo il drone con due fili.

beta1_tied_up

2) A questo punto mi sono accorto che c’era qualcosa di anomalo nel comportamento dei motori. Eseguendo   beta1.py  il suono del motore era discontinuo e instabile anche se non avevo ancora attivato il controllo PID , ma mantenendo la velocità costante.

Questo non accadeva se eseguivo  motor_test.py.

Alle fine sono riuscito a riprodurre il problema e ho riscontrato un baco (o meglio un comportamento inatteso)  nella libreria RPIO. Ho riprodotto il problema con il loop sottostante :

while true:

mymotor.servo.set_servo(self.pin, PW)

sleep(0.01)

 

La spiegazione che mi son dato e’ che cad ogni chiamata di  set_servo() , viene resettato a zero il segnale e poi settato nuovamente al valore desiderato di PWM.

Pertanto ho usato una funzione a piu basso livello :

myMotor.PWM.add_channel_pulse(1,self.pin,0,PW)

A questo punto nel loop ho ottenuto un suono del motore (e quindi la sua rotazione) perfetto stabile e costante.

Questi 2 miglioramneti mi hanno permeso di fare un passo avanti. Il tuning puo’ procedere in modo piu’ veloce.

Sopra e’  mostrato il grafico del comportameto attuale.In blu in roll target , in rosso la posizione reale del roll. Devo migliorare il tuning per ridurre il tempo necessario a stabilizzarsi (ora 5/6 seconds)e per eliminare le oscillazioni ( +/- 3 gradi). Ma sono comunque soddisfatto della situazione attuale.

Livello successivo

In questi giorni mi sono dedicato al passo successivo.

Il giorno del decollo si avvicina e mi e’ sembrato  il tempo per passare a definire la struttura nel suo complesso.

Qui mi limito a mostrare le fasi del montaggio del mio quadricottero.

frame1 frame2 frame3 frame4 frame5 frame6 frame7 frame8 frame9 frame10

Quindi mi manca di:

  • saldare i connettori per 2 esc.
  • montare sul supporto il connettore segnali e  l’IMU.
  • sviluppare il software per la gestine dei 4 motori

 

Preparazione della sessione di test

E’ giunto il tempo di muovermi dalla scrivania al garage per iniziare la seconda fase dello sviluppo.

Gli obiettivi sono:

  • verificare la procedura di avvio dell’esc. Voglio vedere se e come avviare l’esc anche se e’ gia alimentato.Questo sara’ utile per alimentare rpi direttamente dal BEC di un esc.
  • verificare i disturbi sui dati IMU per la vibrazione dei motori.Settare al meglio la severita’ dei filtri.
  • verificare il loop di controllo e ottimizzare i parametri PID per la rotazione del quadricottero.
  • sviluppare il controllo da remoto per l’utente via wifi per controllare i motori e la posizione del quadricottero.

Per fare questi test ho costruito una struttura che spero sicura.Di seguito alcune foto del progetto e della struttura realizzata.

Test_Frame

Ho anche finito i cablaggi del sistema includendo l’IMU e una basetta fatta in casa per la connessione dei motori.L’alimentazione di rpi e’ ancora via usb e la connessione ethernet via cavo.

wiring_IMU_MOTORS

Quindi il setup della connessione dei motori e’ la seguente:

  • GPIO 18 (pin 12) >M0
  • GPIO 23 (pin 16) >M1
  • GPIO 24 (pin 18) >M2
  • GPIO 25 (pin 22) >M3

Tutorial: come leggere i dati dal IMU

Nel precedente post ho descritto come settare raspberry pi per la connessione col sensore IMU.

Ora e’ tempo di vedere come leggere dati dal sensore.

Prima di tutto e’ necessario il sw che gestisca l’interfaccia i2c.Si possono trovare diversi esempi. Di seguito ne trovi uno : adafruit_i2c.py da github.

Quindi e’ necessario definire un codice specifico per il proprio sensore , nel mio caso un MPU6050.

Ho cercato per diversi giorni di scrivere il mio codice incontrando un problema di inconsistenza sui dati:anche tenendo il sensore fermo ricevevo dei risultati sempre differenti.Sospetto fosse un problema di formattazione dei dati.

Alla fine , grazie al grande lavoro di Hove nel suo blog, ho utilizzato il suo codice code e sono ora in grado di ricevere dati correttamente dal sensore.

Ho fatto alcune minime modifiche e preparato questo IMU_test file.

Cosi ho iniziato alcuni test preliminare per verificare il comportamento del sensore.

Ho montato il sensore su una barra orizzontalmente,quindi ho fatto ruotare la barra di una quantita’ ( 13 gradi, misurata con la bolla dello smartphone); infine l ho riposto orizzontale.

IMU_test1

Ho registrato su di un file i dati: accelerazione lungo gli assi (da ACCelerometro) e la velocita’ angolare(dal GYROscopio). Su di un foglio excel ho calcolato l’angolo sia rispetto ACC che il GYRO:

  • rx ACC=DEGREES(ATAN2(accZ+9.8;accY))
  • rx(i) GYRO=wx(i) *dt+wx(i-1)

Sotto trovi il grafico risultante.

IMU

Ho sottolineato in figura i due tipici problemi sul IMU :

  • lo slittamento del Gyro (puoi vedere un angolo che da 1 grado deriva mentre dovrebbe essere uguale a 0)
  • la sensibilita’ al rumore dell’ Accelerometro.

Quindi il prossimo passo dello sviluppo e’ cercare di ridurre questi due problemi cercando di filtrare e combinare i risultati dai due tipi di sensori.

Istallazione del sensore IMU

Da una settimana circa sto giocando  col mio IMU: Inertial Measurement Unit.

Ho acquistato su e-bay un MPU6050, sensore che include:

  • un giroscopio a tre assi,che e’ ingrado di restituire la velocita’ angolare registrata intorno a 3 assi x,y,z.
  • un accelerometro che e’ in grado di misurare l’accelerazione lungo i 3 assi x,y,z.

Tale sensore e’ in grado di comuncare attraverso l’interfaccia  I2C.

Qui potete trovare lo schema elettrico che sto utilizzando.

wiring_IMU

Per la parte di software ho trovato un chiaro tutorial sul sito della Adafruit , per cui vi rimando li per i dettagli. Qui riporto per promemoria i passaggi fondamentali per istallazione:

in sudo nano /etc/modules  add:

  • i2c-bcm2708
  • i2c-dev

sudo apt-get install python-smbus

sudo apt-get install i2c-tools

in sudo nano /etc/modprobe.d/raspi-blacklist.conf  comment:

  • #blacklist spi-bcm2708
  • #blacklist i2c-bcm2708

Ora, lanciando  sudo i2cdetect -y 1 si dovra’ vedere l’indirizzo 0x68, corrispondente all’indirizzo di default del sensore.

Tutorial: Come controllare un motore brushless con Raspberry PI

Sabato scorso e’ stato il grande giorno: primo brushless mosso! E mosso con rpi!!!

Per ora non ho voluto mischiare troppe cose, per cui rpi e’ alimentato da USB e collegato via cavo col pc.

wiring_2

Questi nel dettaglio i passaggi necessari.

  1. Monta il motore ben fissato ad un sostegno.IMPORTANTE: Ricorda che si muovera’,fissalo bene !
  2. Collega i cavi del motore all’ESC.Il motore che ho io,ha 3 cavi, nero,rosso e giallo. Io ho deciso di collegare sempre il nero al cavo centrale ,mentre invertiro’ il rosso col giallo per ottenere rotazioni orarie o antiorarie.
  3. NON collegare ancora i cavi di potenza dell’ESC alla batteria
  4. Collega il cavo segnale  di 0v (nero) dell’ESC al ground di rpi (per esempio pin 25)
  5. Collega il cavo segnale PWM (bianco) ad un output di rpi (nella mia prova l’ho collegato col pin fisico 11,corrispondente a GPIO17. Questo valore (17) sara’ usato poi nel programma.
  6. Collega cavo Ethernet
  7. Collega USB per alimentare rpi.motor_test_setup

Passiamo ora al lato sotware.E’ necessario che su rpi sia istallata la libreria RPIO.Se non ancora fatto, qui trovi la descrizione dell’ istallazione SW.

  1. Scarica la cartella motor_test che contiene motor_test.py e motor.py e posizionala nella cartella home/python/motor_test del tuo pc.
  2. Dal terminale del pc  usa il comando per copiare la cartella su rpi(chiedera’ password di rpi):
    scp -r python/motor_test  pi@10.42.0.63:./python
    password : raspberry
  3. Dal terminale del pc  usa il comando per connettersi con rpi.Il terminale del pc ora e’ diventato il terminale del rpi
    ssh pi@10.42.0.63
    password : raspberry
  4. Infine lancia il programma motor_test.Importante: la sequenza di avvio dell’ESC varia da modello a modello. Vedi la pagina dell ESC per i dettagli.
    cd python/motor_test 
    sudo python motor_test.py
  5. Segui le istruzioni del programma.

motor_test

Dopo il primo ENTER il PWM viene settato al massimo (un impulso lungo 2000us ogni 20ms). A questo punto occorre collegare i cavi di potenza del ESC.Se tutto va a buon fine (tensione corretta,numero di celle della batterie corrette) l ESC e’ pronto a pilotare il motore.Viene settato il PWM a 1000us, il minimo. A questo punto e’ possibile alzare e abbassare la velocita del motore ed il motore si muovera’. Il mio motore comincia a muoversi sopra il 5%, cioe’ 1050us.Questo dipende dall’inerzia del motore,dagli attriti  e dal livello di carica della batteria