Faire une guirlande avec un enfant

image

Niveau de difficulté: pour les débutants.

L'idĂ©e est nĂ©e lorsque la vieille guirlande s'est brisĂ©e la veille du nouvel an. Le fils a regardĂ© la bande LED RGB et a demandĂ© s'il Ă©tait possible d'en faire une guirlande. Vous pouvez - j'ai dit, et le fils a commencĂ© Ă  dĂ©crire pendant longtemps exactement comment la guirlande devait clignoter. Je n'ai rien compris et j'ai dĂ©cidĂ© de m'assurer qu'il pouvait faire ce qu'il voulait de lui-mĂȘme. J'ai commencĂ© par analyser mes propres souhaits pour le projet:

  1. Environnement de développement de style scratch
  2. travail hors ligne - la possibilité de travailler avec l'appareil éteint
  3. Travaillez par avion, sans connecter de fil
  4. Fiabilité - aucun programme téléchargé ne doit "bloquer" l'appareil jusqu'à ce qu'un redémarrage soit nécessaire


Plateforme matérielle


transistors

Sur la base de la carte ESP8266 avec NodeMCU ( comme celle-ci ), quelques transistors et rĂ©sistances y ont Ă©tĂ© ajoutĂ©s. Les modules sĂ©lectionnĂ©s ont un rĂ©gulateur de tension de 3-20 volts, ce qui lui permet d'ĂȘtre alimentĂ© Ă  partir de la mĂȘme source que la bande. Les sorties esp donnent une tension de 3 volts avec une limite de courant de 12mA, j'ai donc utilisĂ© des transistors bipolaires conventionnels pour contrĂŽler la bande.

image

Pour que la fumée blanche ne sorte pas du microcontrÎleur, j'ai mis une résistance de 220 Ohms entre la sortie et la base. Esp a un logiciel pwm, certaines broches ont un but particulier, j'ai sélectionné expérimentalement.

Firmware


Avant d'utiliser, esp8266 doit ĂȘtre flashĂ©, j'utilise NodeMCU avec lua, bien qu'il ait un peu moins de fonctionnalitĂ©s que Arduino avec C ++. Ainsi, la façon la plus simple de commencer est d' utiliser un micrologiciel prĂȘt Ă  l'emploi de nodemcu-build.com . Pour notre projet, nous devrons ajouter le module pwm. AprĂšs un certain temps, un lien vers l'image tombera dans l'e-mail. Vous devez prendre celui avec flotteur.

Vous pouvez le flasher avec n'importe quel programmeur d'ici , et j'utilise NodeMCU Flasher.

NodeMCU a un systÚme de fichiers, l'exécution commence avec le module init.lua, j'utilise ESPlorer pour le téléchargement.

Diode clignotante


Le moment suivant m'a induit en erreur. La numérotation interne (GPIO0-16) est utilisée uniquement dans les programmes natifs (Arduino / C ++). De lua, la notation du tableau est utilisée. Par exemple, pour utiliser GPIO16 / D0 (LED intégrée). depuis Lua, vous devez écrire gpio.write (0, gpio.HIGH). Vous pouvez faire clignoter une diode directement depuis la console ESPlorer.

image

Contrairement Ă  Arduino, nodemcu ne peut pas utiliser le dĂ©lai et la boucle occupĂ©e, la console et le wifi utilisent le mĂȘme processeur pour fonctionner. Un chien de garde est Ă©galement intĂ©grĂ© Ă  la carte, qui le redĂ©marrera si votre code s'exĂ©cute plus de 500 ms. Il est recommandĂ© de ne pas occuper le processeur plus de 2 ms. Pour rĂ©soudre le problĂšme, il existe des fonctions node.task.post et tmr

Choisir un environnement de développement


Au dĂ©but, je voulais utiliser Scratch, mais cela ne me convenait pas, car cela ne me permet pas de travailler hors ligne - le programme s'exĂ©cute sur un ordinateur dans un environnement de travail, et toutes les cartes pour cela fonctionnent passivement. AprĂšs avoir fouillĂ© sur Internet, je suis tombĂ© sur Google Blockly . Cela s'est avĂ©rĂ© ĂȘtre exactement ce dont vous avez besoin: il prend en charge la gĂ©nĂ©ration de code dans lua et la crĂ©ation de ses propres blocs. AprĂšs avoir expĂ©rimentĂ©, j'ai dĂ©cidĂ© de crĂ©er mon projet Web, j'ai choisi nodejs comme serveur et Blockly comme interface. Il Ă©tait absolument nĂ©cessaire de crĂ©er 2 blocs - en dĂ©finissant la couleur et le retard. Blockly a des fonctions intĂ©grĂ©es pour travailler avec des couleurs au format #ffffff, la crĂ©ation d'une fonction pour dĂ©finir la couleur n'Ă©tait pas un problĂšme.

En-tĂȘte de spoiler
Blockly.Lua['set_color'] = function (block) { var parseColor = Blockly.Lua.provideFunction_( 'set_colour_rgb', ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(s)', ' local rs,gs,bs = s.match(s, "#(..)(..)(..)");', ' setColor(tonumber(rs, 16),tonumber(gs, 16),tonumber(bs, 16));', 'end']); var value_color = Blockly.Lua.valueToCode(block, 'Color', Blockly.Lua.ORDER_ATOMIC); var code = `set_colour_rgb(${value_color})\n`; return code; }; 


Ainsi, 2 exigences sur 3 ont été clÎturées.

Fonction Sleep ()


Ici, j'ai dû réfléchir spécifiquement à la façon de combiner le fonctionnement fiable d'OTA avec l'exécution de code personnalisé. Heureusement, lua a une bibliothÚque coroutine

AprĂšs avoir rĂ©flĂ©chi et lu attentivement la documentation, j'ai rĂ©alisĂ© que tout le code client devait ĂȘtre exĂ©cutĂ© dans coroutine, et utiliser yield au lieu de sleep pour que le module principal puisse rĂ©gler une minuterie.

Aussi, pour protéger la carte d'une boucle infinie, j'ai patché le code aprÚs le générateur en insérant yield (0) au début de chaque itération de chaque boucle

 function MCUPostProcessLua(code) { return code.replace(/ do[ ]?\n/, ' do \ncoroutine.yield(0);\n'); } 

Téléchargement OTA


J'ai dĂ©cidĂ© de mettre en Ɠuvre la solution la plus simple pour le rĂ©seau local, la carte se connecte au wifi domestique, se connecte au serveur Ă  une adresse fixe, envoie un identifiant unique (afin de traiter correctement les reconnexions), et attend les mises Ă  jour du programme via cette socket.

Résultat


github.com/farafonoff/BlocklyESP8266


Vous pouvez ajouter beaucoup, par exemple, une sorte d'option d'autorisation pour travailler à travers les réseaux publics, un configurateur convivial en mode hostap, améliorer la modularité init.lua et le support de sa mise à jour OTA (maintenant seul le module avec le programme chargé est mis à jour).

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


All Articles