Nous écrivons le chargeur OTA pour ATmega128RFA1 (dans le cadre de l'appareil Smart Response XE)



Tout a commencé avec l'acquisition par l'auteur sur le marché secondaire d'un appareil intéressant - Smart Response XE ( brève description ). Il est destiné aux écoles: chaque élève de la classe reçoit un appareil similaire à un cahier électronique ou un traducteur des années 90, l'enseignant pose une question, et les élèves tapent sur les claviers des appareils les réponses reçues via le canal radio (802.15.4) au récepteur connecté au PC de l'enseignant.

La prise en charge de ces appareils a été interrompue il y a plusieurs années, et le fait que les écoles ont acheté entre 100 et 200 $ chacune apparaît désormais sur eBay pour 10 ou moins. Le fer est très approprié pour les expériences de geek:

  • Clavier à 60 touches
  • affichage avec une résolution de 384x136, 2 bits par pixel - similaire à BK, CGA, mais 4 ne sont pas des couleurs, mais des gradations de luminosité
  • Microcontrôleur ATmega128RFA1 (mémoire flash de 128 Ko, ROM de 4 Ko, RAM de 16 Ko, émetteur-récepteur standard 802.15.4)
  • mémoire flash externe (par rapport au microcontrôleur et non à l'ensemble de l'appareil) de 1 mégaoctet (128 kilo-octets) avec SPI
  • compartiment pour 4 éléments AAA.

Du nom du microcontrôleur, il est clair qu'il appartient à la famille AVR, ce qui signifie que fabriquer un appareil compatible Arduino est une tâche plus que triviale ...

D'après les informations sur Hackaday, l' auteur a découvert qu'ils avaient déjà fait cela (le même lien indique à quoi se connecter), ayant la possibilité d'exécuter des jeux pour Arduboy:


Mais l'auteur est plus intéressé par l'opportunité de ne pas jouer sur l'appareil, mais d'étudier:

  • flash série SPI
  • téléchargeurs pour AVR
  • norme 802.15.4

L'auteur a commencé par écrire une bibliothèque (GPL v3) qui vous permet d'initialiser l'affichage, d'afficher du texte et des rectangles, et également d'accéder à la mémoire flash avec l'interface SPI. Puis il a commencé à trouver des idées pour l'utilisation pratique de l'appareil: un terminal compatible VT-100 de poche, des jeux multi-joueurs. Après avoir refait les trois appareils, il a décidé de leur «apprendre» à faire des croquis «dans les airs». Ce qui serait non seulement intéressant, mais aussi très pratique: il est difficile d'ouvrir le boîtier de l'appareil à chaque fois, et sous le couvercle de la batterie, il n'y a que des ouvertures qui vous permettent de connecter un programmeur JTAG à la carte.



C'est suffisant pour remplir le chargeur de démarrage Arduino, mais pas un croquis - le port série n'y est pas sorti, vous ne pouvez toujours pas vous passer de l'ouverture du boîtier. De plus, les lignes TX0 et RX0 du premier port série sont alignées avec les lignes d'interrogation de la matrice du clavier, à savoir celles le long desquelles les touches de fonction sont interrogées sur les côtés de l'écran. Mais que faire - l'auteur a construit ceci:



Là, il a sorti les lignes JTAG, et maintenant il n'est pas nécessaire d'ouvrir le compartiment des piles. Et afin de pouvoir remplir les croquis, j'ai apporté les deux ports série au même connecteur, en ajoutant également un commutateur, car lorsque les piles sont installées, l'appareil ne peut pas être physiquement éteint différemment.

Il a fallu un certain temps pour travailler avec un fer à souder, un couteau de bureau et un pistolet à colle. En général, les esquisses de coulée «over the air» sont beaucoup plus pratiques, il est urgent d'inventer quelque chose pour cela.

Arduino IDE utilise avrdude pour remplir des croquis. Il interagit avec le microcontrôleur via le protocole STK500 , ce qui vous permet de transférer des fichiers dans les deux sens. Il est peu compatible avec les canaux où des retards, des distorsions et des pertes de données variables sont possibles. Si quelque chose se déclenche ou bruit dans le canal série, vous pouvez devenir fou à la recherche d'une cause. Une fois l'auteur a tourmenté pendant une demi-journée jusqu'à ce qu'il se rende compte que le problème était dans le mauvais câble, ainsi que dans le convertisseur capricieux de l'interface CP2102. Même un microcontrôleur avec un convertisseur d'interface intégré, par exemple, ATmega32u4, peut parfois être si méchant. Chaque utilisateur d'Arduino a remarqué que les erreurs lors du téléchargement de croquis ne sont pas si rares. Parfois, l'enregistrement se passe bien et une erreur est détectée lors de la lecture de vérification. Cela ne signifie pas qu'il y a eu une erreur lors de l'écriture - l'échec s'est produit lors de la lecture. Imaginez maintenant que lorsque vous travaillez "en direct", la même chose se produira, mais beaucoup plus souvent.

Ayant essayé différentes façons de surmonter ce problème, l'auteur a proposé ce qui suit. L'appareil dispose d'une mémoire flash de 128 kilo-octets avec interface SPI - nous recevons des données via des câbles (rappelez-vous que l'auteur a déjà un appareil avec un connecteur sur le côté), nous utilisons cette mémoire comme tampon et envoyons des données à un autre appareil via un canal radio. Un tel bonjour de Cybiko.

Après avoir écrit le code pour travailler avec le canal radio, ainsi que la police, le chargeur de démarrage est devenu plus long que 4 kilo-octets. Par conséquent, la valeur HFUSE a dû être modifiée de 0xDA à 0xD8. Maintenant, le chargeur de démarrage peut mesurer jusqu'à 8 kilo-octets et l'adresse de départ est devenue 0x1E000. Cela se reflète dans le Makefile, mais doit être pris en compte lors du remplissage du chargeur de démarrage avec avrdude.

L'émetteur-récepteur standard 802.15.4 de l'ATmega128RFA1 a été initialement conçu pour fonctionner sur le protocole ZigBee , ce qui est plutôt compliqué.L'auteur a donc décidé de transmettre simplement des paquets à la place. Il s'agit du matériel implémenté dans l'ATmega128RFA1, donc un peu de code est requis. Aussi, pour plus de simplicité, l'auteur a décidé d'utiliser un canal fixe, l'empêchant de le choisir même manuellement. La norme 802.15.4 prend en charge 16 canaux avec des nombres de 11 à 26. Ils sont assez obstrués, certains se chevauchent également les canaux WiFi (le rouge indique les canaux ZigBee, bleu, vert et jaune - WiFi).



Il s'est avéré que les canaux 15 et 26 sont les moins sensibles aux interférences du Wi-Fi. L'auteur a choisi le deuxième d'entre eux. Avertissement: Le traducteur ne sait pas si ZigBee est si simplifié. Peut-être que cela vaut un peu plus de programmation et sa mise en œuvre complète?

Sur le premier des appareils, il est nécessaire d'implémenter une machine d'état qui transfère les données à l'aide du protocole STK500. Pour la plupart, les messages envoyés et reçus sont autosuffisants, mais certains sont liés à ceux qui sont passés par le canal plus tôt. Une description du dialogue est donnée ici .

Un élément important de ce dialogue est le transfert de paquets destinés à être écrits dans la mémoire flash du périphérique de destination. Les microcontrôleurs simples de la famille AVR ont une taille de page de 128 octets, mais ATmega128RFA1 a une taille de 256. Mais la mémoire flash connectée via le protocole SPI a la même taille. Le programme du premier appareil lors du versement de l'esquisse ne le transfère pas immédiatement au second, mais l'écrit dans cette mémoire. Lorsque l'IDE Arduino vérifie l'exactitude de l'enregistrement, ils lui envoient ce qui y a été écrit. Vous devez maintenant transférer les données reçues par voie aérienne vers le deuxième appareil. Dans le même temps, le passage de la réception à la transmission et vice versa se produit assez souvent. Le protocole STK500 est indifférent aux retards, mais ne tolère pas la perte de données (étrange, mais il est dit ci-dessus que les retards dans la transmission des données affectent également). Et les pertes de transmission sans fil sont inévitables. ATmega128RFA1 a une implémentation matérielle intégrée de demandes répétées avec des doutes sur la transmission correcte, mais l'auteur a décidé de mettre en œuvre le même programme par lui-même. Il a développé un protocole dans lequel beaucoup plus de données passent dans un sens que dans l'autre.

C'est imparfait, mais tout fonctionne. Une page de 256 octets est divisée en quatre segments, chacun étant transmis en direct sous forme de paquet. Un paquet contient jusqu'à 125 octets de données plus une longueur d'octet et deux CRC. Ainsi, des fragments de 64 octets de long ainsi que des numéros de page et de segment (de 0 à 3) y sont placés. Dans le périphérique de réception, une variable est fournie qui vous permet de suivre le nombre de segments reçus, et lorsque les quatre arrivent, une confirmation est envoyée au périphérique d'envoi que la page entière a été reçue. Aucune confirmation (CRC ne correspond pas) - renvoyez la page entière. La vitesse s'avère en même temps encore plus que lorsqu'elle est transmise par câble. Voir:


Mais en fait, il serait nécessaire de fournir un moyen pratique de connecter des appareils câblés aux appareils pour remplir des croquis et dessus. Par exemple, placez à l'intérieur d'un tel convertisseur d'interface sur CP2102, comme sur la photo, et collez-le sur la carte afin qu'il puisse résister à la force lors de la connexion et de la déconnexion du câble Micro USB.



Il a également un stabilisateur de 3,3 volts (et comment l'utiliser dans un appareil avec une alimentation de 6 volts - si seulement il y a le même stabilisateur, et vous pouvez ajouter deux diodes pour choisir automatiquement celle à partir de laquelle l'appareil sera alimenté). Les trois voyants doivent être retirés de la carte du convertisseur d'interface, sinon ils chargeront en outre les batteries lors de leur utilisation, et interféreront également avec l'interrogation du clavier et fonctionneront avec la mémoire flash avec l'interface SPI.

La poursuite de l'objectif s'est avérée encore plus intéressante que sa réalisation (et vous n'avez pas besoin de cette blague sur le bus). L'auteur a beaucoup appris sur les chargeurs de démarrage pour AVR, la mémoire flash avec SPI, le protocole STK500 et la norme 802.15.4.

Tout autre code en plus de la bibliothèque décrite ci-dessus est ici , et il est également sous GPL v3. Le twitter de l'auteur est ici .

Source: https://habr.com/ru/post/fr447026/


All Articles