Una volta eseguita la fase di montaggio del busto, lasciate collegati i servomotori ma senza assemblare le gambe e le ginocchia in modo da poter eseguire correttamente in seguito il settaggio dello zero dei servomotori.
Inizia tutto con il download della libreria dal seguente qui e ricordatevi di rinominare la cartella in OpenCat
Quindi caricate il file .ino e inviatelo a Bittle,vedi figura sotto.
Inizia con un errore (ma non fateci tanto caso) in fase di compilazione di OpenCat.ino (che si trova nella cartella Utente\Documents\Arduino\OpenCat)
In file included from C:\Users\Sergio\AppData\Local\Temp\arduino_build_604654\sketch\WriteInstinct/OpenCat.h:85:0,
from C:\Users\Sergio\Documents\Arduino\libraries\OpenCat\OpenCat.ino:31:
C:\Users\Sergio\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src/Wire.h: In member function 'void Motion::loadDataFromI2cEeprom(unsigned int&)':
C:\Users\Sergio\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src/Wire.h:68:13: note: candidate 1: uint8_t TwoWire::requestFrom(int, int)
uint8_t requestFrom(int, int);
^~~~~~~~~~~
C:\Users\Sergio\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src/Wire.h:65:13: note: candidate 2: uint8_t TwoWire::requestFrom(uint8_t, uint8_t)
uint8_t requestFrom(uint8_t, uint8_t);
^~~~~~~~~~~
La compilazione procede e lo sketch viene inviato al Bittle quandoha finito di inviare aprite il terminal di Arduino ,riceverete il seguente messaggio (rappresentato anche in figura sopra) :
18:25:44.207 -> * Start *
18:25:44.207 -> Initialize I2C
18:25:44.207 -> Connect MPU6050
18:25:44.720 -> Test connection
18:25:44.720 -> MPU successful
18:25:44.720 -> Initialize DMP
18:25:45.573 -> 1693 41 -31 8
18:25:45.573 -> Enable DMP
18:25:45.573 -> Enable interrupt
18:25:45.573 -> DMP ready!
18:25:46.391 ->
18:25:46.391 -> * Assigning 1 skill addresses...
18:25:46.391 -> Finished!
che conferma che il programma è stato trasferito e che tutte le componenti sono attive
Andare quindi nella sottodirectory di (Utente\Documents\Arduino\librerie\OpenCat\WriteInstinct ), e modificare le righe di WriteInstinct.ino come descritto dal manuale decommentando la vostra scheda di bordo correttamente
#include "InstinctBittle.h" //activate the correct header file according to your model
//#include "InstinctNybble.h"
//#define NyBoard_V0_1
//#define NyBoard_V0_2
#define NyBoard_V1_0
Quindi trasferiamo OpenCat.h (una delle quattro schede schede), sarà il codice principale da inviare al Bittle
Il codice comprende 3 file :
WriteInstinct è responsabile della scrittura dei dati raccolti durante la calibrazione nella EEPROM.
Instinct definisce tutti i tipi di posture. Qui viene definita la postura di riferimento, postura seduta, in piedi ecc.
OpenCat è il programma generale che esegue i movimenti delle posture definite in Instinct.h .
Ancora una volta durante la compilazione compariranno gli stessi errori postati sopra che per comodità ri-posto nuovamente
In file included from C:\Users\Sergio\AppData\Local\Temp\arduino_build_132630\sketch\OpenCat.h:85:0,
from C:\Users\Sergio\Documents\Arduino\libraries\OpenCat\WriteInstinct\WriteInstinct.ino:31:
C:\Users\Sergio\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src/Wire.h: In member function 'void Motion::loadDataFromI2cEeprom(unsigned int&)':
C:\Users\Sergio\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src/Wire.h:68:13: note: candidate 1: uint8_t TwoWire::requestFrom(int, int)
uint8_t requestFrom(int, int);
^~~~~~~~~~~
C:\Users\Sergio\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src/Wire.h:65:13: note: candidate 2: uint8_t TwoWire::requestFrom(uint8_t, uint8_t)
uint8_t requestFrom(uint8_t, uint8_t);
^~~~~~~~~~~
alla fine della compilazione si avranno i seguenti messaggi
avrdude: Version 6.3-20190619
Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
Copyright (c) 2007-2014 Joerg Wunsch
System wide configuration file is "C:\Users\Sergio\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino17/etc/avrdude.conf"
Using Port : COM13
Using Programmer : arduino
Overriding Baud Rate : 115200
AVR Part : ATmega328P
Chip Erase delay : 9000 us
PAGEL : PD7
BS2 : PC2
RESET disposition : dedicated
RETRY pulse : SCK
serial program mode : yes
parallel program mode : yes
Timeout : 200
StabDelay : 100
CmdexeDelay : 25
SyncLoops : 32
ByteDelay : 0
PollIndex : 3
PollValue : 0x53
Memory Detail :
Block Poll Page Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
eeprom 65 20 4 0 no 1024 4 0 3600 3600 0xff 0xff
flash 65 6 128 0 yes 32768 128 256 4500 4500 0xff 0xff
lfuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
hfuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
efuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
lock 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
calibration 0 0 0 0 no 1 0 0 0 0 0x00 0x00
signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00
Programmer Type : Arduino
Description : Arduino
Hardware Version: 3
Firmware Version: 4.4
Vtarget : 0.3 V
Varef : 0.3 V
Oscillator : 28.800 kHz
SCK period : 3.3 us
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: reading input file "C:\Users\Sergio\AppData\Local\Temp\arduino_build_851178/WriteInstinct.ino.hex"
avrdude: writing flash (25572 bytes):
Writing | ################################################## | 100% 3.97s
avrdude: 25572 bytes of flash written
avrdude: verifying flash memory against C:\Users\Sergio\AppData\Local\Temp\arduino_build_851178/WriteInstinct.ino.hex:
avrdude: load data flash data from input file C:\Users\Sergio\AppData\Local\Temp\arduino_build_851178/WriteInstinct.ino.hex:
avrdude: input file C:\Users\Sergio\AppData\Local\Temp\arduino_build_851178/WriteInstinct.ino.hex contains 25572 bytes
avrdude: reading on-chip flash data:
Reading | ##
avrdude: stk500_paged_load(): (a) protocol error, expect=0x10, resp=0x00
#avrdude: stk500_cmd(): programmer is out of sync
avr_read(): error reading address 0x0000
reathe selected serial port rea does not exist or your board is not connected
d operation not supported for memory "flash"
avrdude: failed to read all of flash memory, rc=-2
avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x2a
avrdude done. Thank you.
NOTA!!!!!
Ricordarsi nel monitor seriale, di impostare Nessuna fine di riga e baudrate su 115200 (o 57600 per NyBoard V0_ *). Immettere tre Y maiuscole dopo il prompt e attendere che la MPU si calibri.
Confermate quindi "y" alle domande che vi saranno rivolte
Calibrate infine la MPU? (Y/n) rispondendo ancora Y
Inizierà quindi la calibrazione......
Se tutto andrà bene dopo al massimo un paio di minuti otterrete un beep lungo con la seguente schermata :
ATTENZIONE!!! Non toccare nulla durante questo periodo di attesa !!!!
È NECESSARIO collegare tutti i servi e le batterie per una corretta calibrazione. Quindi, nel monitor seriale, digitare "c" per accedere alla modalità di calibrazione.
Ci sarà rumore proveniente dal sistema di ingranaggi dei servi e vedrete la tabella di calibrazione:
18:58:22.725 -> 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
18:58:22.760 -> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
18:58:22.760 -> c0, 0,
La prima riga sono i valori la seconda gli offset
Con tutti i servi in angolo zero, collegate testa, e gambe preparate nella sezione precedente al corpo., modo perpendicolare alla struttura del corpo evitatando di ruotare i servo durante il funzionamento.
A questo punto riferendoci all'immagine del manuale dove sono rappresentati i servo digitiamo il comando c(numeroservo) (valore) c11 -4 assicurandoci che l'arto si allinei perfettamente ed utilizzando lo strumento di calibrazione ad L in dotazione con Bittle.
Alla fine della calibrazione di tutti i motori, fissate gli arti con le viti in dotazione e digitate il comando "s" e di seguito "kbalance" per salvare i settaggi impostati.
Posto di seguito la calibrazione da me eseguita con l'elenco dei comandi impartiti al terminal a scopo dimostrativo
18:51:58.971 -> Data is printed as: acelX acelY acelZ giroX giroY giroZ
18:51:58.971 -> Readings should be ,⸮k⸮⸮to: 0 0 16384 0 0 0
18:51:58.971 -> Sensor readings with offsets: -70, -11, 16388, -1, 0, 0,
18:51:58.971 -> Your calibration offsets: 3106, 1645, 1376, 44, -29, -25,
18:51:58.971 -> The ˙͕⸮́are saved and automatically sent to mpu.setXAccelOffset(yourOffset)
18:51:58.971 ->
18:58:22.725 ->
18:58:22.725 -> 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
18:58:22.760 -> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
18:58:22.760 -> c0, 0,
19:08:14.384 -> moving [ targetIdx, angle ]:
19:08:14.384 -> m12, -4,
19:08:26.530 -> moving [ targetIdx, angle ]:
19:08:26.530 -> m13, -6,
19:08:35.977 -> moving [ targetIdx, angle ]:
19:08:35.977 -> m8, 4,
19:08:40.372 -> moving [ targetIdx, angle ]:
19:08:40.372 -> m8, -8,
19:09:05.359 -> moving [ targetIdx, angle ]:
19:09:05.359 -> m12, 2,
19:09:08.354 -> moving [ targetIdx, angle ]:
19:09:08.354 -> m12, 4,
19:09:11.686 -> moving [ targetIdx, angle ]:
19:09:11.686 -> m12, 6,
19:09:16.621 -> save calibration
19:09:42.187 -> moving [ targetIdx, angle ]:
19:09:42.187 -> m11, -4,
19:09:51.349 -> moving [ targetIdx, angle ]:
19:09:51.349 -> m11, 8,
19:09:59.192 -> moving [ targetIdx, angle ]:
19:09:59.192 -> m11, 6,
19:10:19.290 -> moving [ targetIdx, angle ]: C⸮+⸮bJ4,
19:10:53.825 -> moving [ targetIdx, angle ]:
19:10:53.825 -> m10, 4,
19:10:57.884 -> moving [ targetIdx, angle ]:
19:10:57.884 -> m10, 10,
19:11:01.935 -> moving [ targetIdx, angle ]:
19:11:01.935 -> m10, 14,
19:11:06.259 -> moving [ targetIdx, angle ]:
19:11:06.259 -> m10, 16,
19:11:09.216 -> moving [ targetIdx, angle ]:
19:11:09.216 -> m10, 18,
19:11:26.785 -> moving [ targetIdx, angle ]:
19:11:26.785 -> m14, 6,
19:11:29.911 -> save calibration
19:13:25.415 -> moving [ targetIdx, angle ]:
19:13:25.415 -> m0, 0,
19:13:30.005 ->
19:13:30.005 -> 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
19:13:30.005 -> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
19:13:30.039 -> c0, 0,
19:13:49.123 -> moving [ targetIdx, angle ]:
19:13:49.123 -> m0, 0,
19:13:51.704 -> save calibration
NOTA IMPORTANTE !!!
Vi è una modifica da eseguire nel file codice IRemote.h presente nella cartella Utente\Documents\Arduino\libraries\IRremote\src del telecomando nel caso in cui esso non funzioni
#define DECODE_RC5 0
#define SEND_RC5 0
#define DECODE_RC6 0
#define SEND_RC6 0
#define DECODE_NEC 1
#define SEND_NEC 0
#define DECODE_SONY 0
#define SEND_SONY 0
#define DECODE_PANASONIC 0
#define SEND_PANASONIC 0
#define DECODE_JVC 0
#define SEND_JVC 0
#define DECODE_SAMSUNG 0
#define SEND_SAMSUNG 0
#define DECODE_WHYNTER 0
#define SEND_WHYNTER 0
#define DECODE_AIWA_RC_T501 0
#define SEND_AIWA_RC_T501 0
#define DECODE_LG 0
#define SEND_LG 0
#define DECODE_SANYO 0
#define SEND_SANYO 0 // NOT WRITTEN
#define DECODE_MITSUBISHI 0
#define SEND_MITSUBISHI 0 // NOT WRITTEN
#define DECODE_DISH 0 // NOT WRITTEN
#define SEND_DISH 0
#define DECODE_SHARP 0
#define SEND_SHARP 0
#define DECODE_SHARP_ALT 0
#define SEND_SHARP_ALT 0
#define DECODE_DENON 0
#define SEND_DENON 0
#define DECODE_LEGO_PF 0 // NOT WRITTEN
#define SEND_LEGO_PF 0
#define DECODE_BOSEWAVE 0
#define SEND_BOSEWAVE 0
#define DECODE_MAGIQUEST 0
#define SEND_MAGIQUEST 0
#define DECODE_HASH 1 // special decoder for all protocols
Di seguito i comandi preimpostati sul telecomando a infrarossi :
Vi è una versione di terze parti CodeCraft non ancora completamente testata che permette la costruzione di codici Py, la calibrazione e la creazione di profili che potrebbe essere interessante prendere in considerazione.
NOTA
Dato che l'attrito gioca un ruolo importante nel bilanciamento dinamico del Bittle, sebbene i gommini possano migliorare la presa, potrebbero amplificare le differenze derivanti dal tipo delle superfici.
E' quindi consigliato usare Bittle senza gommini a meno che non venga regolata l'andatura agendo sul software.
Cinematica e Dinamica
Dopo aver correttamente assemblato e settato 2 dei 5 Bittle acquistati, installato il software in dotazione e gli ambienti di sviluppo nonchè il Python e relative libreria IKpy consigliate nel Forum, di seguito provo a fare un punto sulla situazione raggiunta :
Dal mio punto di vista nel programma testato e fornito da @Gero che permette di creare un andatura piuttosto valida, ci vorrebbe come già detto nel suo post un implementazione grafica con interfaccia GUI che impostato un piano 3D con un immagine si produca in qualche un target della posizione (finale) che permetta la generazione della dinamica di tutto il movimento dal punto di partenza al punto target .
Potremmo pensare di interagire con l'immagine statica muovendo i servimotore de robot e generando una serie di nuove posizione (agganciando un arto, spalla o ginocchio con il mouse e trascinandolo in un punto successivo) generando alcune sequenze definite (frame) del movimento e quindi esportando le intere sequenze dei dati da importare successivamente nello scketch instinct.h
Mi sono guardato attorno ed intanto ho trovato un paio di Link da verificare per lo scopo ma sarebbe interessante avere qualche tool o APP grafica che ci desse già un nuova impostazione e successivamente modificarlo con un software personalizzato che ne regoli le nuove andature e generi una corretta sequenza di coordinate. http://gazebosim.org/
https://robodk.com/doc/it/Basic-Guide.html#Start
Python
in fase di verifica potete installare dal link l'API per poter colloquiare tramite python attraverso la porta seriale.
Una volta installato il Python potete scaricare il software di @Gero per generare l'andatura da qui
Di seguito procedete ad installare le librerie grafiche del Python e l'API per la cinematica inversa a questo link
link Petoi documentazione assemblaggio
link Documentazione
link Codecraft
link Post per la cinematica del Robot
Inserisco un Link diretto ad un nuovo argomento dove tratteremo alcuni esempi in cui mi sono imbattuto utili per dare un idea ai lettori di quello che potrebbe essere il futuro sviluppo di un applicazione completa ed interattiva per il Bittle.
Very useful. I speak spanish so it is easier to understand :) Grazie!
Ivio foto del mio laboratorio....tanto per capirci..=)
Ciao, ho disassemblato e ri-assemblato il tutto ma niente da fare.
Comunque ho notato una cosa ( si vede anche nel tuo screen-shot ) è fondamentale che, dopo qualche secondo di i valori si stabilizzino....credo che dopo 2 letture DELLO STESSO VALORE il sensore venga calibrato....si vede benissimo dal tuo screen-shot.
e si vede anche che i sensori che non "vedo" nel MIO CASO siano proprio quelli che non vengono acquisiti perché TROPPO variabili...
Sheda difettosa?
NON DEVE PREOCCUPARTI LA VARIAZIONE PERENTORIA DEI VALORI !!!
Pensa che prima che il mio test andasse a buon fine ho dovuto fare diverse prove , alla fine ho disassemblato e riassemblato il tutto, e ci ha impiegato meno di 1 minuto a calibrare. Il problema forse era dovuto alla calibrazione ??? Non lo so, so solo che ne ho montato un altro e tutto è andato liscio
Fammi sapere
Dear Rongzhong Li and SRosselli
Thanks for your help!
@SRosselli: Yep obviosly I didn't move the board during calibration, was only a test to realize how the sensors react.
At last after 1 hour I got the 1234.6 ( so #5 was missed )
@Li:I have done the test you suggest: I can't find a "logical" reaction for the #5 column...
For the other coloumns Yes! more or less I find how to "increase" o decrease" the values.
Please look at the picture, I didn't move the board, but seems some values change too much.
Dopo risposto alla domanda :
Calibrate infine la MPU? (Y/n) r Y
Inizierà la calibrazione......
ATTENZIONE!!! Non devi toccare nulla durante questo periodo di attesa !!!!
Se tutto andrà bene dopo al massimo un paio di minuti otterrai un beep lungo.
Altra cosa non ho MAI visto numeri superiori a 123... ( dovrebbe arrivare a 6) ho anche fatto una cosa assurda, agendo sullo switch arduino/Rsb in questo caso i numeri sono sempre 12.456 però ovviamente tutto il resto è a 0 ( zero)
Se qualcuno ha un'idea e mi può aiutare..
Grazie
Molto utile, il mio problema è che non ho il file opencat.ino nella cartella sopra specificata, anche se credo si solo per il modulo WiFi. ( io NON sto usando il WiFi)
in pratica durante la calibrazione della MPU, il test si ferma a 123... in un loop infinito.
Contina 123...
continua .23...
Non si ferma mai
Se inclino la scheda il test mostra ...... ( cioè nemmeno 123...) praticamente la calibrazione non finisce mai
Thank you!
Wow,very nice job!