Scriviamo un caricatore OTA per ATmega128RFA1 (incluso nel dispositivo Smart Response XE)

Scriviamo un caricatore OTA per ATmega128RFA1 (incluso nel dispositivo Smart Response XE)

Tutto è iniziato con l'acquisto da parte dell'autore di un dispositivo interessante sul mercato secondario — Smart Response XE (una breve descrizione). È destinato alle scuole: ogni studente in classe riceve un dispositivo simile a un quaderno elettronico o a un traduttore degli anni '90, l'insegnante pone una domanda e gli studenti digitano le risposte sulle tastiere dei dispositivi, che vengono trasmesse tramite un canale radio (802.15.4) a un ricevitore collegato al PC dell'insegnante.

Il supporto per questi dispositivi è stato interrotto diversi anni fa, e quello che le scuole acquistavano a 100-200 dollari l'uno ora riemerge su eBay a 10 o meno. L'hardware è davvero adatto per esperimenti geek:

  • una tastiera con 60 tasti
  • uno schermo con risoluzione 384×136, 2 bit per pixel — simile a BK, CGA, ma 4 non colori, bensì gradazioni di luminosità
  • microcontrollore ATmega128RFA1 (128 kB di memoria flash, 4 kB di ROM, 16 kB di RAM, trasmettitore e ricevitore conforme allo standard 802.15.4)
  • memoria flash esterna (rispetto al microcontrollore, e non all'intero dispositivo) di 1 megabit (128 kilobyte) con interfaccia SPI
  • scomparto per 4 elementi AAA.

Dal nome del microcontrollore è chiaro che appartiene alla famiglia AVR, il che rende l'idea di rendere il dispositivo compatibile con Arduino un compito più che banale...

Dalla notizia su Hackaday l'autore ha appreso che è già stato fatto (nello stesso link si descrive dove collegare), ottenendo la possibilità di eseguire giochi per Arduboy:

Riproduci video

Ma l'autore è più interessato alla possibilità di non solo giocare sul dispositivo, ma di esplorarlo:
  • memoria flash con interfaccia SPI
  • bootloader per AVR
  • standard 802.15.4

L'autore ha iniziato scrivendo della libreria (GPL v3), che consente di inizializzare il display, visualizzare testo e rettangoli, oltre a accedere alla memoria flash tramite interfaccia SPI. Successivamente ha iniziato a elaborare idee per utilizzi pratici del dispositivo: un terminale portatile compatibile con VT-100, giochi multiplayer. Dopo aver modificato tre dispositivi, ha deciso di 'insegnare' loro a ricevere sketch 'via aria'. Sarebbe stato non solo interessante, ma anche molto comodo: aprire il case del dispositivo è difficile, e sotto il coperchio del vano batterie ci sono solo aperture che consentono di collegare un programmatori JTAG alla scheda.

Scriviamo un caricatore OTA per ATmega128RFA1 (incluso nel dispositivo Smart Response XE)

Questo è sufficiente per caricare il bootloader di Arduino, ma non lo sketch — la porta seriale non è stata portata lì, quindi è comunque necessario aprire il case. Inoltre, le linee TX0 e RX0 della prima porta seriale sono collegate alle linee di polling della matrice della tastiera, ovvero quelle che gestiscono il polling dei tasti funzione ai lati del display. Tuttavia, che ci puoi fare — l'autore ha costruito questo:

Scriviamo un caricatore OTA per ATmega128RFA1 (incluso nel dispositivo Smart Response XE)

Ha portato le linee JTAG lì, e ora non è necessario aprire il vano delle batterie. E per permettere anche il caricamento degli sketch, ha riportato su questo stesso connettore entrambe le porte seriali, aggiungendo anche un interruttore, poiché con le batterie installate l'unità non può essere fisicamente spenta in altro modo.

È stato necessario lavorare per un po' con il saldatore, un coltellino e una pistola per colla. In generale, caricare gli sketch 'sulla rete' è decisamente più comodo, è urgente inventare qualcosa per questo.

L'IDE di Arduino per caricare gli sketch utilizza il programma avrdude. Esso interagisce con il microcontrollore tramite il protocollo STK500, позволяющему передавать файлы в обе стороны. Он плохо совместим с каналами, где возможны переменные задержки, искажение и потеря данных. Если в последовательном канале что-то отходит или шуршит, можно сойти с ума в поисках причины. Один раз автор промучился полдня, пока не понял, что дело в плохом кабеле, а также капризном преобразователе интерфейса CP2102. Даже микроконтроллер со встроенным преобразователем интерфейса, например, ATmega32u4, может иногда так «шалить». Каждый пользователь Arduino замечал, что ошибки при заливке скетчей не так уж редки. Иногда запись проходит нормально, а при проверочном считывании обнаруживается ошибка. Это не значит, что ошибка была при записи — сбой был при чтении. А теперь представьте, что при работе «по воздуху» будет происходить то же самое, но намного чаще.

Dopo aver provato vari modi per affrontare questo problema, l'autore ha ideato quanto segue. Il dispositivo ha una memoria flash da 128 kilobyte con interfaccia SPI — riceviamo dati attraverso i fili (ricordiamo che l'autore ha già uno di quei dispositivi con la porta laterale), utilizziamo questa memoria come buffer e trasmettiamo i dati a un altro dispositivo tramite radio. È un saluto da Cybiko.

Dopo aver scritto il codice per lavorare con il canale radio e il font, il bootloader è diventato più lungo di 4 kilobyte. Pertanto, è stato necessario cambiare il valore di HFUSE da 0xDA a 0xD8. Ora il bootloader può essere lungo fino a 8 kilobyte e l'indirizzo iniziale è diventato 0x1E000. Questo è riflesso nel Makefile, ma deve essere considerato anche durante il caricamento. bootloader utilizzando avrdude.

Il trasmettitore e ricevitore standard 802.15.4 nell'ATmega128RFA1 è progettato inizialmente per lavorare secondo il protocollo ZigBee, che è piuttosto complicato, quindi l'autore ha deciso di trasmettere semplicemente i pacchetti. Questo è implementato in modo hardware nel ATmega128RFA1, quindi ci vorrà poco codice. Inoltre, per semplificare, l'autore ha deciso di utilizzare un canale fisso, senza permettere nemmeno la selezione manuale. Lo standard 802.15.4 supporta 16 canali numerati da 11 a 26. Sono abbastanza congestionati, alcuni sovrappongono anche i canali WiFi (i canali ZigBee sono contrassegnati in rosso, quelli WiFi in blu, verde e giallo).

Scriviamo un caricatore OTA per ATmega128RFA1 (incluso nel dispositivo Smart Response XE)

Si è scoperto che i canali 15 e 26 sono i meno soggetti a interferenze da WiFi. L'autore ha scelto il secondo. Dichiarazione: il traduttore non sa se sia consentito semplificare così ZigBee. Forse vale la pena programmare ancora un po' e implementarlo completamente?

Sul primo dei dispositivi, devono implementare un automa che trasmette dati tramite il protocollo STK500. Nella maggior parte dei casi, i messaggi trasmessi e ricevuti sono autosufficienti, ma alcuni sono legati a quelli precedentemente passati attraverso il canale. La descrizione del dialogo è fornita qui.

Un elemento fondamentale di questo dialogo è la trasmissione di pacchetti destinati alla registrazione nella memoria flash del dispositivo di destinazione. Nei semplici microcontrollori della famiglia AVR, la dimensione della pagina è di 128 byte, mentre per l'ATmega128RFA1 è di 256. La stessa dimensione si applica anche alla memoria flash collegata tramite il protocollo SPI. Quando il programma nel primo dispositivo carica lo sketch, non lo trasferisce immediatamente al secondo dispositivo, ma lo scrive prima in questa memoria. Quando l'Arduino IDE verifica l correttezza della scrittura, riceve ciò che è stato registrato. Ora è necessario trasferire i dati ottenuti attraverso il canale radio al secondo dispositivo. Durante questo processo, il passaggio dalla ricezione alla trasmissione e viceversa avviene piuttosto frequentemente. Il protocollo STK500 è indifferente ai ritardi, ma non tollera la perdita di dati (è strano, perché in precedenza è stato detto che i ritardi nella trasmissione dei dati influiscono). Tuttavia, le perdite durante la trasmissione wireless sono inevitabili. Nell'ATmega128RFA1 è implementata una realizzazione hardware delle richieste di ritrasmissione in caso di dubbi sulla correttezza della trasmissione, ma l'autore ha deciso di realizzare la stessa cosa a livello software autonomamente. Ha sviluppato un protocollo in cui nella direzione di trasmissione passano molti più dati rispetto all'altra.

Non è perfetto, ma funziona tutto. Una pagina di 256 byte è suddivisa in quattro segmenti, ognuno dei quali viene trasmesso tramite radio come pacchetto. Un pacchetto può contenere fino a 125 byte di dati più un byte per la lunghezza e due per il CRC. Quindi i frammenti di 64 byte, insieme ai numeri di pagina e di segmento (da 0 a 3), vengono inclusi. Il dispositivo ricevente prevede una variabile che permette di monitorare quanti segmenti sono stati ricevuti e, quando arrivano tutti e quattro, viene inviato un riconoscimento all'unità trasmittente, confermando che l'intera pagina è stata ricevuta. Se non c'è riconoscimento (il CRC non corrisponde), inviamo di nuovo l'intera pagina. La velocità così ottenuta è anche superiore a quella della trasmissione via cavo. Vedi:

Riproduci video

Ma in realtà, sarebbe opportuno prevedere un modo comodo per collegare i dispositivi tramite cavo per caricare gli sketch. Ad esempio, inserire un convertitore di interfaccia CP2102, come in foto, e attaccarlo alla scheda in modo da resistere alla forza durante il collegamento e lo scollegamento del cavo Micro USB.

Scriviamo un caricatore OTA per ATmega128RFA1 (incluso nel dispositivo Smart Response XE)

C'è anche un regolatore di tensione da 3,3 volt (e come applicarlo in un dispositivo con alimentazione a 6 volt — a condizione che ci sia lo stesso regolatore, e si possano aggiungere due diodi per selezionare automaticamente quale dei due alimenterà il dispositivo). Dalla scheda del convertitore di interfaccia, è necessario dissaldare tutti e tre i LED, altrimenti andranno a sovraccaricare le batterie quando funzionano da esse, oltre a interferire con l'interrogazione della tastiera e il funzionamento della memoria flash con interfaccia SPI.

Perseguire l'obiettivo si è rivelato persino più interessante che raggiungerlo (e non serve il famoso aneddoto sull'autobus). L'autore ha imparato molte cose nuove sui bootloader per AVR, sulla memoria flash con interfaccia SPI, sul protocollo STK500 e sullo standard 802.15.4.

Tutto il resto del codice, in aggiunta alla libreria descritta sopra — qui, ed è anch'esso sotto GPL v3. Il Twitter dell'autore — qui.

Fonte: habr.com

Acquista un hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista un hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster