
Alles begann mit der Übernahme eines interessanten Geräts durch den Autor auf dem Sekundärmarkt - Smart Response XE (
Kurzbeschreibung ). Es ist für Schulen gedacht: Jeder Schüler in der Klasse erhält ein Gerät, das einem elektronischen Notizbuch oder Übersetzer der neunziger Jahre ähnelt, der Lehrer stellt eine Frage, und die Schüler geben auf den Tastaturen der Geräte die über den Funkkanal (802.15.4) empfangenen Antworten an den Empfänger ein, der an den PC des Lehrers angeschlossen ist.
Die Unterstützung für diese Geräte wurde vor einigen Jahren eingestellt, und die Tatsache, dass Schulen für jeweils 100 bis 200 US-Dollar gekauft haben, wird jetzt bei eBay für 10 oder weniger angezeigt. Eisen ist dort sehr gut für Geek-Experimente geeignet:
- Tastatur mit 60 Tasten
- Display mit einer Auflösung von 384x136, 2 Bit pro Pixel - ähnlich wie bei BK, CGA, aber 4 sind keine Farben, sondern Helligkeitsabstufungen
- ATmega128RFA1-Mikrocontroller (128 kB Flash-Speicher, 4 kB ROM, 16 kB RAM, 802.15.4 Standard-Transceiver)
- externer (in Bezug auf den Mikrocontroller und nicht das gesamte Gerät) Flash-Speicher für 1 Megabit (128 Kilobyte) mit SPI
- Fach für 4 AAA-Elemente.
Unter dem Namen des Mikrocontrollers ist klar, dass er zur AVR-Familie gehört, was bedeutet, dass die Herstellung eines Arduino-kompatiblen Geräts eine mehr als triviale Aufgabe ist ...
Aus den Nachrichten auf
Hackaday ging hervor, dass der Autor
dies bereits getan hat (derselbe Link sagt, womit er sich verbinden soll) und die Möglichkeit hatte, Spiele für Arduboy auszuführen:
Der Autor ist jedoch mehr an der Möglichkeit interessiert, nicht auf dem Gerät zu spielen, sondern zu studieren:
- serieller Flash-SPI
- Downloader für AVR
- Standard 802.15.4
Der Autor begann mit dem Schreiben einer
Bibliothek (GPL v3), mit der Sie die Anzeige initialisieren, Text und Rechtecke anzeigen und über die SPI-Schnittstelle auf den Flash-Speicher zugreifen können. Dann begann er, Ideen für den praktischen Einsatz des Geräts zu entwickeln: ein VT-100-kompatibles Terminal im Taschenformat, Multiplayer-Spiele. Nachdem er die drei Geräte neu hergestellt hatte, beschloss er, ihnen beizubringen, wie man Skizzen „durch die Luft“ bekommt. Das wäre nicht nur interessant, sondern auch sehr praktisch: Es ist schwierig, das Gerätegehäuse jedes Mal zu öffnen, und unter der Batterieabdeckung befinden sich nur Löcher, durch die Sie einen JTAG-Programmierer an die Platine anschließen können.

Dies reicht aus, um den Arduino-Bootloader zu füllen, aber keine Skizze - die serielle Schnittstelle wird dort nicht ausgegeben, Sie können jedoch immer noch nicht auf das Öffnen des Gehäuses verzichten. Außerdem sind die TX0- und RX0-Leitungen der ersten seriellen Schnittstelle an den Abfrageleitungen der Tastaturmatrix ausgerichtet, nämlich an denen, entlang derer die Funktionstasten an den Seiten des Displays abgefragt werden. Aber was tun - der Autor hat das gebaut:

Dort brachte er die JTAG-Leitungen heraus, und jetzt ist es nicht notwendig, das Batteriefach zu öffnen. Und um die Skizzen ausfüllen zu können, habe ich beide seriellen Anschlüsse an denselben Anschluss angeschlossen und auch einen Schalter hinzugefügt, da das Gerät bei eingelegten Batterien nicht auf andere Weise physisch ausgeschaltet werden kann.
Die Arbeit mit einem Lötkolben, einem Schreibmesser und einer Klebepistole dauerte eine Weile. Im Allgemeinen ist das Gießen von Skizzen über die Luft viel praktischer. Es ist dringend erforderlich, etwas dafür zu erfinden.
Arduino IDE verwendet
avrdude , um Skizzen auszufüllen. Es interagiert mit dem Mikrocontroller über das
STK500- Protokoll, mit dem Sie Dateien in beide Richtungen übertragen können. Es ist schlecht kompatibel mit Kanälen, bei denen variable Verzögerungen, Verzerrungen und Datenverluste möglich sind. Wenn im seriellen Kanal etwas losgeht oder raschelt, können Sie auf der Suche nach einer Ursache verrückt werden. Einmal quälte der Autor einen halben Tag lang, bis er feststellte, dass das Problem im schlechten Kabel sowie im launischen Schnittstellenkonverter CP2102 lag. Sogar ein Mikrocontroller mit einem eingebauten Schnittstellenkonverter, zum Beispiel ATmega32u4, kann manchmal so ungezogen sein. Jeder Arduino-Benutzer hat festgestellt, dass Fehler beim Hochladen von Skizzen nicht so selten sind. Manchmal funktioniert die Aufzeichnung einwandfrei, und beim Lesen der Überprüfung wird ein Fehler festgestellt. Dies bedeutet nicht, dass beim Schreiben ein Fehler aufgetreten ist - der Fehler war beim Lesen. Stellen Sie sich nun vor, dass beim Arbeiten "über Funk" dasselbe passiert, jedoch viel häufiger.
Nachdem der Autor verschiedene Wege ausprobiert hatte, um dieses Problem zu lösen, kam er auf Folgendes. Das Gerät verfügt über einen 128-Kilobyte-Flash-Speicher mit SPI-Schnittstelle. Wir empfangen Daten über Kabel (denken Sie daran, dass der Autor bereits ein Gerät mit einem Anschluss an der Seite hat), verwenden diesen Speicher als Puffer und senden Daten über einen Funkkanal an ein anderes Gerät. So ein Hallo von Cybiko.
Nach dem Schreiben des Codes für die Arbeit mit dem Funkkanal sowie der Schriftart wurde der Bootloader länger als 4 Kilobyte. Daher musste der HFUSE-Wert von 0xDA auf 0xD8 geändert werden. Jetzt kann der Bootloader bis zu 8 Kilobyte lang sein und die Startadresse ist 0x1E000 geworden. Dies spiegelt sich im Makefile wider, sollte jedoch beim Befüllen des
Bootloaders mit avrdude berücksichtigt werden.
Der 802.15.4-Standardtransceiver im ATmega128RFA1 wurde ursprünglich für den Betrieb mit dem
ZigBee- Protokoll entwickelt, was ziemlich kompliziert ist. Daher entschied sich der Autor, stattdessen einfach Pakete zu übertragen. Dies ist Hardware, die im ATmega128RFA1 implementiert ist, daher ist ein bisschen Code erforderlich. Der Einfachheit halber entschied sich der Autor auch für die Verwendung eines festen Kanals, sodass er ihn nicht einmal manuell auswählen konnte. Der 802.15.4-Standard unterstützt 16 Kanäle mit Nummern von 11 bis 26. Sie sind ziemlich verstopft, einige überlappen auch WiFi-Kanäle (rot zeigt ZigBee-Kanäle an, blau, grün und gelb - WiFi).

Es stellte sich heraus, dass die Kanäle 15 und 26 am wenigsten anfällig für Störungen durch WLAN sind. Der Autor wählte den zweiten. Haftungsausschluss: Der Übersetzer weiß nicht, ob ZigBee so vereinfacht ist. Vielleicht lohnt es sich, etwas mehr zu programmieren und es vollständig umzusetzen?
Auf dem ersten Gerät muss eine Zustandsmaschine implementiert werden, die Daten mithilfe des STK500-Protokolls überträgt. Zum größten Teil sind gesendete und empfangene Nachrichten autark, aber einige sind an diejenigen gebunden, die den Kanal zuvor durchlaufen haben. Eine Beschreibung des Dialogs finden Sie
hier .
Ein wichtiger Bestandteil dieses Dialogs ist die Übertragung von Paketen zum Schreiben in den Flash-Speicher des Zielgeräts. Einfache Mikrocontroller der AVR-Familie haben eine Seitengröße von 128 Byte, ATmega128RFA1 hat jedoch eine Größe von 256. Der Flash-Speicher, der über das SPI-Protokoll eine Verbindung herstellt, hat dieselbe Größe. Das Programm im ersten Gerät überträgt beim Gießen der Skizze diese nicht sofort auf das zweite, sondern schreibt sie in diesen Speicher. Wenn die Arduino IDE die Richtigkeit der Aufzeichnung überprüft, senden sie ihr, was dort geschrieben wurde. Jetzt müssen Sie die empfangenen Daten drahtlos auf das zweite Gerät übertragen. Gleichzeitig erfolgt häufig ein Wechsel vom Empfang zum Senden und umgekehrt. Das STK500-Protokoll ist gegenüber Verzögerungen gleichgültig, toleriert jedoch keinen Datenverlust (seltsam, aber es wurde oben gesagt, dass Verzögerungen bei der Datenübertragung ebenfalls Auswirkungen haben). Und Verluste bei der drahtlosen Übertragung sind unvermeidlich. ATmega128RFA1 verfügt über eine integrierte Hardware-Implementierung für wiederholte Anforderungen mit Zweifeln an der korrekten Übertragung. Der Autor hat jedoch beschlossen, diese programmgesteuert selbst zu implementieren. Er entwickelte ein Protokoll, bei dem viel mehr Daten in die eine als in die andere Richtung übertragen werden.
Es ist unvollkommen, aber alles funktioniert. Eine 256-Byte-Seite ist in vier Segmente unterteilt, von denen jedes als Paket über Funk übertragen wird. Ein Paket enthält bis zu 125 Datenbytes plus eine Bytelänge und zwei CRC. So werden dort 64 Byte lange Fragmente zusammen mit Seiten- und Segmentnummern (von 0 bis 3) platziert. Auf dem empfangenden Gerät wird eine Variable bereitgestellt, mit der Sie verfolgen können, wie viele Segmente empfangen werden. Wenn alle vier eintreffen, wird eine Bestätigung an das sendende Gerät gesendet, dass die gesamte Seite empfangen wurde. Keine Bestätigung (CRC stimmte nicht überein) - Senden Sie die gesamte Seite erneut. Die Geschwindigkeit ist gleichzeitig noch höher als bei der Übertragung über Kabel. Siehe:
Tatsächlich wäre es jedoch erforderlich, eine bequeme Möglichkeit zum Anschließen von Kabelgeräten an die Geräte zum Ausfüllen von Skizzen und darauf bereitzustellen. Setzen Sie beispielsweise einen solchen Schnittstellenkonverter wie auf dem Foto in CP2102 ein und kleben Sie ihn auf die Platine, damit er der Kraft beim Anschließen und Trennen des Micro-USB-Kabels standhält.

Es hat auch einen 3,3-Volt-Stabilisator (und wie man ihn in einem Gerät mit 6-Volt-Stromversorgung verwendet - wenn nur derselbe Stabilisator vorhanden ist und Sie zwei Dioden hinzufügen können, um automatisch auszuwählen, von welcher das Gerät mit Strom versorgt wird). Alle drei LEDs sollten von der Schnittstellenkonverterplatine entfernt werden, da sie sonst die Batterien zusätzlich laden, wenn sie von ihnen aus arbeiten, und auch die Tastaturabfrage stören und mit dem Flash-Speicher der SPI-Schnittstelle arbeiten.
Die Verfolgung des Ziels erwies sich als noch interessanter als seine Erreichung (und Sie brauchen diesen Witz über den Bus nicht). Der Autor hat viel über Bootloader für AVR, Flash-Speicher mit SPI, STK500-Protokoll und 802.15.4-Standard gelernt.
Der gesamte andere Code neben der oben beschriebenen Bibliothek befindet sich
hier und befindet sich auch unter GPL v3. Das Twitter des Autors ist
hier .