OttoBot

Da raspibo.
Jump to navigation Jump to search

OttoBot è il risultato di un tentativo di usare un ATmega8 al posto di una board Arduino.

Le specifiche tecniche

L'ATmega8, prodotto da Atmel, è piuttosto modesto.

  • Ha 8KB di memoria flash. Se usate il bootloader di Arduino allora ve ne rimarranno solo 7.
  • Il clock è massimo 16Mhz usando un risuonatore esterno. Quello interno va a 8Mhz (ma vi risparmiate un bel po' di circuiteria). Per usare il risuonatore interno occorre cambiare un fuse.
  • 23 pin programmabili.
  • 2 interrupt.
  • Porte SPI, I²C e seriale (ma non è possibile usare seriali software, presenti nella libreria di Arduino).
  • Costa una bazzecola.

Per essere acceso ha bisogno da 2,7 a 5,5 Volt. Il prezzo oscilla attorno all'euro.

Prima versione

8bot.jpg

Come potete vedere, la dimensione è proprio mini. Si comanda tramite bluetooth. Ruote e chassis sono stampate 3d.

Modificare l'ATmega8 affinché sembri un Arduino

Per ottenere questo occorre fare tre cose:

  • Trovare un programmatore (potete usare la porta parallela oppure acquistarne uno, ma anche un normalissimo Arduino può essere usato come programmatore)
  • Settare i fuses
  • Caricare il bootloader
  • Aggiungere l'ATmega8 nel file boards.txt di Arduino

Una volta fatti questi passi, potrete usare l'IDE come per qualsiasi altra board.

Di guide su come usare i programmatori ne trovate a bizzeffe su internet, noi ci concentreremo sull'utilizzo di Arduino come ISP, che è la procedura che ho usato io.

Arduino as ISP

Negli sketch di esempio nella IDE di Arduino c'è "Arduino as ISP" (In-System Programmer). Caricatelo su un Arduino di vostra scelta con l'accortezza di controllare i pin da usare: sui Mega sono diversi. Dovrete usare la porta SPI e in genere avete: 10 reset, 11 MOSI, 12 MISO e 13 clock (SCK). Sui Mega le porte sono rispettivamente 53, 51, 50 e 52. Trovate tutto nei commenti dello sketch. Altri pin, opzionali, sono il 9 (heartbeat, mostra se il programma sta girando), 8 (error, si accende se c'è un problema), 7 (programming, si accende durante le comunicazioni).

La porta SPI va così collegata, MISO con MISO, MOSI con MOSI, SCK con SCK e reset con reset. Il datasheet lo trovate qui [1]

Atmega8 arduinopinout.png

I pin che vedete sono quelli come da IDE di Arduino. Se lo programmate con altri sistemi (come Eclipse) i riferimenti possono essere diversi. Se il vostro ATmega8 è settato per avere un risuonatore esterno, dovrete collegarlo con un pin XTAL1 e l'altro su XTAL2. Entrambi i pin XTAL1 e XTAL2 vanno poi collegati a terra con un condensatore da 22 picofarad. Ne avrete bisogno se volete raggiungere frequenze superiori agli 8 Mhz o se avete bisogno di maggiore stabilità (il risuonatore interno non è molto preciso). Per contro, il risuonatore interno non ha bisogno di collegare nulla. Per approfondire guardate questa guida [2]

avrdude

Per interagire con l'ATmega8 dovrete usare avrdude, questa è una riga di esempio:

avrdude -p m8 -c arduino -P /dev/ttyACM1 -U flash:w:{bootloader}.hex -U hfuse:w:0xd9:m -U lfuse:w:0xe3:m 

Per saperne di più [3]

-p m8 

dice che abbiamo a che fare con un ATmega8

-c arduino

segnala che stiamo usando un Arduino come programmatore

-P /dev/(porta)

è la porta dove avete collegato il programmatore, di solito per gli Arduino è ttyACMx o ttyUSBx; per conoscerla ci sono due modi: guardare nella IDE di Arduino le porte disponibili o collegare l'Arduino e guardare gli ultimi messaggi in dmesg

-U flash:w:{bootloader}.hex

scrive il bootloader, vedi sotto

-U hfuse:w:0xd9:m -U lfuse:w:0xe3:m 

modifica i fuse, vedi sotto

Caricare il bootloader

Se volete usarlo come Arduino dovreste caricare il bootloader. Potete farne anche a meno e risparmiare 1Kb (su 8, non è poco). In teoria potreste farne a meno e continuare a caricare gli sketch sull'ATmega8 l'Arduino come programmatore. Fatto sta che l'ho caricato una volta e non ho mai provato a toglierlo (del resto: if ain't broke, don't fix it). I bootloader li trovate in {cartella di Arduino}/hardware/arduino/avr/bootloaders. Se non li avete li trovate qua [4]

Settare i fuse

Molte opzioni dell'ATmega8 sono settabili tramite dei fuse. I fuse sono dei bit su una memoria EEPROM che dicono al microcontrollore come deve comportarsi. Tramite i fuses è possibile settare il clock, se usare un oscillatore esterno o interno, quanto deve aspettare durante il boot per una nuova programmazione, etc. Qui trovate due calcolatori di fuse, questo è più semplice da usare avrfuse questo è più completo Engbedded AVR Fuse Calculator.

Aggiungere le opzioni alla IDE di Arduino

Se siete affezionati alla IDE dovrete aggiungere al menu delle board l'ATmega8. In teoria, nel menu Tools/boards, c'è già "Arduino NG or older" che ha, fra le varie opzioni, anche la possibilità di usare l'ATmega8, ma io ho avuto una serie di problemi a usarla e alla fine non ho provato a capire perché non funzionasse. Andate in {cartella di Arduino}/hardware/arduino/avr e aprite il file boards.txt (se avete paura di fare dei danni, fate una copia di questo file prima, per precauzione). Per aggiungere l'ATmega8 basta aggiungere queste opzioni alla fine [5]. Se caricate uno sketch sul microcontrollore con un clock sbagliato accadranno risultati imprevedibili, ad es. caricate dalla IDE usando ATmega8 a 4Mhz con i fuses settati in modo che vada a 8Mhz scoprirete che tutto andrà al doppio della velocità. I secondi diventano mezzi secondi, 9600 baud diventano 19200 e così via. Non una gran cosa se state cercando di programmare, però può sfuggirvi perché non segnala nessun errore. Una volta editato boards.txt riavviate la IDE se l'avevate aperta e vedrete comparire nel menu Tools/board una nuova voce, quella dell'ATmega8.

Caricare uno sketch

Facilissimo. Collegate il programmatore (nei nostri esempi, l'Arduino) all'ATmega8 alla seriale (se avete caricato il bootloader) o alla SPI, collegate il reset (di default su Arduino as ISP è il pin 10), il +5v e la terra, andate sotto Sketch e usate "Upload Using Programmer". Alternativamente potete cliccare shift+pulsante del caricamento dello sketch. Se tutto è andato come dovrebbe vedrete lampeggiare i LED della seriale dell'Arduino per qualche secondo fino a che l'IDE non ci comunicherà "done".

Problemi più frequenti: cavetti non collegati bene, cavetti invertiti, alimentazione non sufficiente, oscillatore esterno previsto ma mancante.