
Alles begann mit dem Erwerb eines interessanten GerĂ€ts durch den Autor auf dem SekundĂ€rmarkt â Smart Response XE (). Es ist fĂŒr Schulen gedacht: Jeder SchĂŒler in der Klasse erhĂ€lt ein GerĂ€t, das einer elektronischen Notizbuch oder einem Ăbersetzer aus den 90ern Ă€hnelt, der Lehrer stellt eine Frage, und die SchĂŒler geben ihre Antworten ĂŒber die Tastaturen der GerĂ€te ein, die kabellos (802.15.4) an einen EmpfĂ€nger gesendet werden, der mit dem PC des Lehrers verbunden ist.
Die UnterstĂŒtzung dieser GerĂ€te wurde vor einigen Jahren eingestellt, und das, was Schulen fĂŒr 100-200 Dollar pro StĂŒck kauften, taucht jetzt fĂŒr 10 Dollar oder weniger auf eBay auf. Die Hardware ist sehr gut fĂŒr Geek-Experimente geeignet:
- 60-Tasten-Tastatur
- Display mit einer Auflösung von 384Ă136, 2 Bit pro Pixel â Ă€hnlich wie BK, CGA, aber 4 keine Farben, sondern Helligkeitsstufen
- Microcontroller ATmega128RFA1 (128 kB Flash-Speicher, 4 kB EEPROM, 16 kB RAM, Transceiver vom Typ 802.15.4)
- externer (bezĂŒglich des Mikrocontrollers, nicht des gesamten GerĂ€ts) Flash-Speicher mit 1 Megabit (128 Kilobyte) mit SPI-Schnittstelle
- Fach fĂŒr 4 AAA-Batterien.
Der Name des Mikrocontrollers deutet darauf hin, dass er zur AVR-Familie gehört, was bedeutet, dass es mehr als trivial ist, das GerÀt mit Arduino kompatibel zu machen...
Aus einer Nachricht auf erfuhr der Autor, dass dies (der gleiche Link erklĂ€rt auch, wohin was angeschlossen werden muss), wodurch die Möglichkeit entstand, Spiele fĂŒr Arduboy zu starten:

Der Autor ist jedoch mehr an der Möglichkeit interessiert, nicht auf dem GerÀt zu spielen, sondern es zu erforschen:
- Flash-Speicher mit serieller SPI-Schnittstelle
- Bootloader fĂŒr AVR
- Standards 802.15.4
Der Autor begann mit dem Schreiben von (GPL v3), das die Initialisierung des Displays ermöglicht, Text und Rechtecke anzuzeigen und Zugriff auf den Flash-Speicher ĂŒber die SPI-Schnittstelle zu erhalten. Dann begann er, Ideen fĂŒr die praktische Nutzung des GerĂ€ts zu entwickeln: ein tragbares VT-100-kompatibles Terminal, Mehrspielerspiele. Nachdem er drei GerĂ€te umgebaut hatte, beschloss er, sie "zu lehren", Sketche "ĂŒber die Luft" zu empfangen. Was nicht nur interessant, sondern auch sehr praktisch wĂ€re: Das GehĂ€use des GerĂ€ts jedes Mal zu öffnen, ist schwierig, und unter der Abdeckung des Batteriefachs befinden sich nur Löcher, die den Anschluss eines JTAG-Programmierers an die Platine ermöglichen.

Das reicht aus, um den Arduino Bootloader zu flashen, aber nicht den Sketch â der serielle Port ist dafĂŒr nicht bereitgestellt, ohne das GehĂ€use zu öffnen, wird es trotzdem nicht gehen. Auch die TX0- und RX0-Leitungen des ersten seriellen Ports sind mit den Abtastleitungen des Tastaturrasters verbunden, und zwar genau den, ĂŒber die die Funktionstasten an den Seiten des Displays abgefragt werden. Aber was soll man machen â der Autor hat Folgendes gemacht:

Er hat die JTAG-Leitungen herausgefĂŒhrt, und jetzt ist es nicht mehr nötig, das Batteriefach zu öffnen. Um auch Sketches zu laden, hat er ebenfalls beide seriellen Ports an diesen Anschluss gelegt und zusĂ€tzlich einen Schalter hinzugefĂŒgt, da das GerĂ€t mit installierten Batterien physisch nicht anders ausgeschaltet werden kann.
Es war notwendig, ziemlich lange mit dem Lötkolben, einem Cutter und einer HeiĂklebepistole zu arbeiten. Insgesamt ist das Laden von Sketches âĂŒber die Luftâ viel bequemer, dafĂŒr muss dringend etwas erfunden werden.
Die Arduino IDE verwendet fĂŒr das Flashen von Sketches ein Programm . Es interagiert mit dem Mikrocontroller ĂŒber das Protokoll , das den Datenaustausch in beide Richtungen ermöglicht. Es ist schlecht kompatibel mit KanĂ€len, in denen variable Verzögerungen, Verzerrungen und Datenverluste möglich sind. Wenn im seriellen Kanal etwas stört oder knistert, kann man wahnsinnig werden auf der Suche nach der Ursache. Einmal hat der Autor einen halben Tag damit gekĂ€mpft, bis er verstand, dass es am schlechten Kabel lag, sowie am wĂ€hlerischen Interface-Wandler CP2102. Sogar Mikrocontroller mit integriertem Interface-Wandler, wie zum Beispiel der ATmega32u4, können manchmal so âzickenâ. Jeder Arduino-Nutzer hat festgestellt, dass Fehler beim Flashen von Sketches nicht so selten sind. Manchmal lĂ€uft das Schreiben normal, und beim ĂberprĂŒfen wird ein Fehler entdeckt. Das bedeutet nicht, dass beim Schreiben ein Fehler war â der Fehler trat beim Lesen auf. Und jetzt stellt euch vor, dass beim Arbeiten âĂŒber die Luftâ dasselbe viel hĂ€ufiger passieren wird.
Nachdem er verschiedene Möglichkeiten ausprobiert hat, um dieses Problem zu ĂŒberwinden, hat der Autor Folgendes erfunden. Das GerĂ€t verfĂŒgt ĂŒber einen 128-Kilobyte-Flashspeicher mit SPI-Schnittstelle â Daten werden ĂŒber Leitungen empfangen (wir erinnern uns, dass der Autor bereits ein GerĂ€t mit seitlichem Anschluss hat), wir verwenden diesen Speicher als Puffer und senden die Daten ĂŒber den Funkkanal an ein anderes GerĂ€t. So eine GrĂŒĂe von Cybiko.
Nach dem Schreiben des Codes fĂŒr die Arbeit mit dem Radio-Kanal sowie dem Schriftarten wurde der Bootloader lĂ€nger als 4 Kilobyte. Daher musste der Wert von HFUSE von 0xDA auf 0xD8 geĂ€ndert werden. Nun kann der Bootloader bis zu 8 Kilobyte lang sein, und die Startadresse betrĂ€gt 0x1E000. Dies ist im Makefile vermerkt, muss jedoch auch beim Flashen beachtet werden. mit avrdude.
Der 802.15.4 Sender-EmpfĂ€nger im ATmega128RFA1 ist ursprĂŒnglich fĂŒr die Arbeit mit dem Protokoll , das ziemlich komplex ist, daher entschied der Autor, stattdessen einfach Pakete zu ĂŒbertragen. Dies ist im ATmega128RFA1 hardwaremĂ€Ăig implementiert, sodass nur wenig Code benötigt wird. Auch zur Vereinfachung entschied der Autor, einen festen Kanal zu verwenden und es nicht einmal manuell auswĂ€hlen zu lassen. Der Standard 802.15.4 unterstĂŒtzt 16 KanĂ€le mit den Nummern 11 bis 26. Diese sind ziemlich ĂŒberlastet, einige ĂŒberlappen auch mit WiFi-KanĂ€len (rote KanĂ€le sind ZigBee, blaue, grĂŒne und gelbe â WiFi).

Es stellte sich heraus, dass die am wenigsten störanfĂ€lligen von WiFi-KanĂ€len 15 und 26 sind. Letzteren wĂ€hlte der Autor aus. Disclaimer: Der Ăbersetzer weiĂ nicht, ob es erlaubt ist, ZigBee auf diese Weise zu vereinfachen. Vielleicht sollte man noch ein wenig programmieren und es vollstĂ€ndig umsetzen?
Auf dem ersten GerĂ€t muss ein finite State Machine implementiert werden, die Daten ĂŒber das STK500-Protokoll ĂŒbertrĂ€gt. In der Regel sind die ĂŒbertragenen und empfangenen Nachrichten eigenstĂ€ndig, aber einige hĂ€ngen von zuvor ĂŒber den Kanal gesendeten ab. Eine Beschreibung des Dialogs ist beigefĂŒgt. .
Ein wichtiger Bestandteil dieses Dialogs ist die Ăbertragung von Paketen, die zur Speicherung im Flash-Speicher des ZielgerĂ€ts vorgesehen sind. Bei einfachen Mikrocontrollern der AVR-Familie betrĂ€gt die SeitenlĂ€nge 128 Byte, wĂ€hrend sie bei der ATmega128RFA1 256 Byte betrĂ€gt. Bei dem Flash-Speicher, der ĂŒber das SPI-Protokoll angeschlossen wird, ist sie ebenfalls gleich. Das Programm im ersten GerĂ€t ĂŒbertrĂ€gt den Sketch nicht sofort auf das zweite GerĂ€t, sondern schreibt ihn in diesen Speicher. Wenn die Arduino IDE dann die Korrektheit der Speicherung ĂŒberprĂŒft, erhĂ€lt sie die Daten, die dorthin geschrieben wurden. Nun mĂŒssen die erhaltenen Daten ĂŒber den Funkkanal an das zweite GerĂ€t ĂŒbertragen werden. Dabei erfolgt der Wechsel von Empfang auf Sendung und zurĂŒck ziemlich hĂ€ufig. Das STK500-Protokoll ist unempfindlich gegenĂŒber Verzögerungen, vertrĂ€gt jedoch keinen Datenverlust (seltsam, denn zuvor wurde gesagt, dass Verzögerungen bei der DatenĂŒbertragung auch Auswirkungen haben). Aber Verluste bei der drahtlosen Ăbertragung sind unvermeidlich. In der ATmega128RFA1 ist eine Hardware-Implementierung von Wiederholungsanforderungen bei Zweifeln an der Korrektheit der Ăbertragung eingebaut, doch der Autor entschloss sich, das gleiche programmatisch selbst umzusetzen. Er entwickelte ein Protokoll, bei dem in eine Richtung deutlich mehr Daten ĂŒbertragen werden als in die andere.
Es ist nicht ideal, aber alles funktioniert. Eine 256-Byte-Seite wird in vier Segmente unterteilt, von denen jedes ĂŒber den Funkkanal als Paket ĂŒbertragen wird. Das Paket fasst bis zu 125 Byte Daten plus ein Byte â fĂŒr die LĂ€nge und zwei â fĂŒr CRC. So werden Fragmente mit einer LĂ€nge von 64 Byte zusammen mit den Seiten- und Segmentnummern (von 0 bis 3) dort untergebracht. Im empfangenden GerĂ€t gibt es eine Variable, die verfolgt, wie viele Segmente empfangen wurden, und wenn alle vier eintreffen, geht eine BestĂ€tigung an das sendende GerĂ€t, dass die gesamte Seite empfangen wurde. Wenn keine BestĂ€tigung erfolgt (CRC stimmt nicht ĂŒberein), wird die gesamte Seite erneut gesendet. Die Geschwindigkeit ist dabei sogar höher als bei der Ăbertragung ĂŒber Kabel. Siehe:

Aber eigentlich sollte man eine bequeme Möglichkeit vorsehen, ein Kabel zum Hochladen von Sketches an die GerĂ€te anzuschlieĂen. Zum Beispiel könnte man einen solchen Schnittstellenwandler auf CP2102, wie im Foto, in das GehĂ€use einbauen und so auf der Platine befestigen, dass er die Kraft beim Anschluss und Trennen des Micro-USB-Kabels aushĂ€lt.

Es gibt auch einen 3,3-Volt-Spannungsregler (und wie er in einem GerĂ€t mit 6-Volt-Stromversorgung angewendet werden kann - falls es einen Ă€hnlichen Spannungsregler gibt, können zwei Dioden hinzugefĂŒgt werden, um automatisch auszuwĂ€hlen, von welchem der beiden das GerĂ€t gespeist wird). Alle drei LEDs auf der Schnittstellenwandlerplatine mĂŒssen entfernt werden, da sie sonst die Batterien zusĂ€tzlich belasten, wenn das GerĂ€t von ihnen betrieben wird, und das Abfragen der Tastatur sowie die Arbeit mit dem Flash-Speicher ĂŒber die SPI-Schnittstelle behindern.
Das Verfolgen des Ziels war sogar interessanter als dessen Erreichung (und das mit dem Bus muss nicht erwĂ€hnt werden). Der Autor hat viel Neues ĂŒber Bootloader fĂŒr AVR, Flash-Speicher mit SPI-Schnittstelle, das STK500-Protokoll und den Standard 802.15.4 gelernt.
Der gesamte ĂŒbrige Code zusĂ€tzlich zur oben beschriebenen Bibliothek - , und er steht ebenfalls unter GPL v3. Der Twitter des Autors - .
Quelle: habr.com
