Civade.com2024-03-18T06:25:41+01:00Jean-Philippe Civadeurn:md5:e38aa1c08fb459e3f7570573d11b7322DotclearStand minimaliste pour ampli guitare et à très bas couturn:md5:f30da67b3fe658d761a517311bafcb8f2024-01-21T08:56:00+01:002024-02-27T06:33:05+01:00jphiDIY-MusiqueAmpliGuitareSupport<p>Il existe de multiples solutions de supports pour ampli guitare. Les plus évolués, permettant non seulement de les incliner, mais aussi de les dsurélever de façon à avoir les contrôles plus facilement accessibles pour le guitariste. Lorsqu'un ampli est posé au sol, le soucis est qu'il diffuse le son sur ... les pieds. Voyons si il est possible dde faire quelque chos epour au moins pouvoir mieux entendre le son duffisé.</p> <p>Une petite recherche internet sur "Guitare amplifier stand" vous montrera la diversité des solutions disponibles. En bois, en métal, réglable en inclinaison, et même pour certains réglables en hauteur. Le plus basqiue coute 20 euros, tandis qu'un réglabe en hauteur, inclinaison, pliable et métal peut couter jusqu'à une centaine d'euros.</p>
<p>Il exite aussi des solutions de béquille intégrées à l'ampli, ou que l'on met sur le coté de l'ampli, et qui permettent de l'incliner. Malheureusement celles-ci nécessitent de percer l'ampli pour fixer la béquille.</p>
<p>La béquille me semblait une solution intéressante, à condition qu'elle ne nécessite pas de perçage sur l'ampli pour que la solution soit réellement réversible. J'ai donc développé sous OpenSCAD une pièce plastique qui permet de glisser un bout de baguette de batterie (récup, on connait tous un batteur!) en guise de béquille. La baguette devra être amovible, pour le rangement.</p>
<p><a href="https://civade.com/images/GuitarAmpStand/2024-01-22_08_34_21-cabinet_12__.skp_-_SketchUp_Pro_2021.png"><img src="https://civade.com/images/GuitarAmpStand/.2024-01-22_08_34_21-cabinet_12__.skp_-_SketchUp_Pro_2021_m.png" alt=""></a></p>
<p>Elle sera fixée sur l'ampli par des pads autocollants 3M (double face sur mousse polyuréthane de faible épaisseur) que l'on trouvce assez facilement sur Aliexpress. Par contre bien prendre du 3M.... D'expérience, sur une surface parfaitement dégraissée, ces pads tiennent très très bien.</p>
<p><a href="https://civade.com/images/GuitarAmpStand/2024-01-22_08_49_27-Ruban_adhesif_double_face_de_3m<strong>10_pieces_lot</strong>rond_et_carre<strong>epaisseur_1.5mm</strong>.png"><img src="https://civade.com/images/GuitarAmpStand/.2024-01-22_08_49_27-Ruban_adhesif_double_face_de_3m__10_pieces_lot__rond_et_carre__epaisseur_1.5mm___m.png" alt=""></a></p>
<p>Voici le dispositif mis en situation sur une 3D (cliquer pour agrandir):</p>
<p><a href="https://civade.com/images/GuitarAmpStand/2024-01-22_08_34_59-cabinet_12__.skp_-_SketchUp_Pro_2021.png"><img src="https://civade.com/images/GuitarAmpStand/.2024-01-22_08_34_59-cabinet_12__.skp_-_SketchUp_Pro_2021_m.png" alt=""></a>
<a href="https://civade.com/images/GuitarAmpStand/2024-01-22_08_35_30-cabinet_12__.skp_-_SketchUp_Pro_2021.png"><img src="https://civade.com/images/GuitarAmpStand/.2024-01-22_08_35_30-cabinet_12__.skp_-_SketchUp_Pro_2021_m.png" alt=""></a>
<a href="https://civade.com/images/GuitarAmpStand/2024-01-22_08_36_03-cabinet_12__.skp_-_SketchUp_Pro_2021.png"><img src="https://civade.com/images/GuitarAmpStand/.2024-01-22_08_36_03-cabinet_12__.skp_-_SketchUp_Pro_2021_m.png" alt=""></a></p>
<p>Le support béquille a été développé sous OpenSCAD et rendu paramétrable. Ceci permet de préciser les dimensions de la base (largeur, hauteur, épaisseur) en fonction des pads adhésifs que vous trouverez et de la rigidité souhaitée, l'inclinaison du support baguette (ici, sur la 3D, 35 degrés), le diamètre intérieur (qui doit correspondre au diamètre extérieur de votre baguette de batterie), l'épaisseur du tube support baguette et bien sur sa longeur de guidage.</p>
<p>OpenSCAD est un logiciel libre téléchargeable sur https://openscad.org/ (PC/Max/Linux). Lorsque vous chargez le fichier dedans vous pourrez ouvrir le panneau de paramètres à droite pour changer les valeurs énumérées ci dessus :</p>
<p><a href="https://civade.com/images/GuitarAmpStand/2024-01-22_09_07_23-AmplifierTilt.scad_-_OpenSCAD.png"><img src="https://civade.com/images/GuitarAmpStand/2024-01-22_09_07_23-AmplifierTilt.scad_-_OpenSCAD.png" alt=""></a></p>
<p>En voici le code source : <a href="https://civade.com/images/GuitarAmpStand/AmplifierTilt.scad">AmplifierTilt.scad</a></p>
<p>La pièce est rendue sur OpenScan en prévisualisation par F5:</p>
<p><a href="https://civade.com/images/GuitarAmpStand/2024-01-22_09_14_33-AmplifierTilt.scad_-_OpenSCAD.png"><img src="https://civade.com/images/GuitarAmpStand/.2024-01-22_09_14_33-AmplifierTilt.scad_-_OpenSCAD_m.png" alt=""></a></p>
<p>Ensuite il vous suffira de calculer le rendu final haute résolution (F6), puis exporter en STL (F7) avant d'utiliser votre logiciel d'impression 3D favori. Un remplissage de 20% et une épaisseur de parois de 1.2 sont suffisant pour assurer une bonne rigidité à la pièce. Pour ma part, j'ai imprimé en couches de 0.2mm d'épaisseurs en PLA+.</p>
<p>La baguette doit entrer très légèrement en force, de façon à ne pas tomber toute seule, et être facilement enlevable pour le transport. Elle pourra voyager avec vos pédales d'effet. Il faudra la recouper à la bonne longeur, le mieux étant qu'elle soit verticale lorsque l'ampli est basculé pour avoir un appui stable :</p>
<p><a href="https://civade.com/images/GuitarAmpStand/2024-01-22_08_36_03-cabinet_12__.skp_-_SketchUp_Pro_2021.png"><img src="https://civade.com/images/GuitarAmpStand/.2024-01-22_08_36_03-cabinet_12__.skp_-_SketchUp_Pro_2021_m.png" alt=""></a></p>
<p>Vous pouvez aisément changer l'orientation de l'ampli si les 35 degrés ne sont pas suffisants, il suffit de le faire dans le source OpenScad et de réimprimer la pièce.</p>
<p>Si vous en avez marre, il suffit de décoller le support et l'ampli est intact... pas de trous, pas de vis.. Les éventuelles tradces d'autocollant sont nettoyables à l'essence F.</p>
<p>Le cout de la solution est imbattable puisqu'il n'y a que la pièce imrpimée en 3D (qq grammes de PLA), et une baguette de batterie de récup!</p>
<p>Bonne réalisation.</p>https://civade.com/post/2024/01/21/Stand-minimaliste-pour-ampli-guitare-et-%C3%A0-tr%C3%A8s-bas-cout#comment-formhttps://civade.com/feed/atom/comments/124Pilotage de CNC et de découpe laser avec ESP32 et FluidNCurn:md5:a5f30bae207b035b2b52909a646320872023-05-19T12:00:00+02:002024-02-27T06:27:23+01:00jphiMachines à commande numériquesCNCESP32K40Laser<p>Dernière évolution des solutions logicielles de pilotage de CNC et de découpe laser, FluidNC sur ESP32 représente une aubaine pour bien des makers. Facilité de mise en oeuvre, adaptabilité, et faible coût. Faisons ensemble le tout de la question....</p> <h3>Généralités</h3>
<p>Cela fait maintenant près de 15 ans que je m'intéresse aux machines d'usinage à commande numérique et aux solutions logicielles et matérielles pour piloter celles-ci. Cela m'a donné l'occasion de mettre en œuvre sur des machines diverses des solutions logicielles complètes que ce soit sur PC sous Linux ou Windows ( LinuxCNC/EMC2, Mach 2, Mach3, Mach4), que des solutions sur OrangePi (AllWinCNC), aussi bien que des solutions embarquées avec interface légère (GRBL, TinyG2, Marlin, Smoothieware, etc..).</p>
<p>Sur cette durée, c'est assez spectaculaire comme il est devenu de plus en plus aisé de manipuler ces technologies. Les limitations de départ (prix, bugs, vitesse d'interprétation et nombre d'entrées sorties) sont repoussées à chaque itération.</p>
<p>Une bonne partie des solutions fonctionnant sur des cartes autonomes ont été largement inspirées par GRBL. Ce petit logiciel sur Arduino a en effet démontré la possibilité d'interpréter du GCODE (langage de programmation des machines à commande numérique) et de piloter des moteurs avec un petit microprocesseur. Il a servi de base ou inspiré des générations de makers et est à la base du développement de l'impression 3D grand public et de bien des machines low cost. Il a été depuis porté sur de nombreuses plateformes matérielles (autres microprocesseurs que celui de l'Arduino) ou adapté pour répondre à des besoins spécifiques. GRBL a de plus profité de la démocratisation des processeurs 32 bits en étant porté sur de plus puissants processeurs que ceux d'ATMEL/Arduino (STM32, ESP32, Texas, LPC1769, etc...).</p>
<p>Cette fois ci nous allons nous intéresser à la dernière évolution du logiciel de Bart Ding : <a href="https://github.com/bdring/FluidNC" title="FluidNC">FluidNC</a>. Le portage de GRBL sur esp32 ayant manifestement atteint ses limites, un tout nouveau projet a été créé, avec une communauté de près d'une trentaine de développeurs pilotée par Mitch Bradley et Bart Ding. Et le moins qu'on puisse dire, c'est qu'avec l'expérience acquise, ils sont allés très vite pour proposer une solution hors du commun.</p>
<h3>ESP32 ?</h3>
<p>L'ESP32 est un SOC (System on Chip) embarquant 2 processeurs Tensilica Xtensa LX6 fonctionnant jusqu'à 160 Mhz. L'un est dédié aux télécommunications (Wifi), l'autre aux programmes utilisateur, bien que l'on puisse tout à fait utiliser les 2 cœurs dans une application. Avec ses nombreux périphériques, c'est un ordinateur complet dans une seule puce.</p>
<p>Le LX6 est en fait un SIP (Semiconductor Interllectual Property core), c'est à dire le "code source silicium" permettant de fabriquer un processeur. Il est commercialisé sous licence par Cadence. Tout comme l'ESP8266 (son prédécesseur et petit frère monocœur), Il repose sur une architecture Harvard ( https://fr.wikipedia.org/wiki/Architecture_Harvard ).</p>
<p>Les 2 processeurs peuvent chacun accéder à la mémoire et au périphériques sur un bus partagé. La plupart des périphériques ont eux même un accès direct à la mémoire par DMA (Direct memory Access) ce qui en fait une architecture très performante. (pour plus d'infos, voir <a href="https://en.wikipedia.org/wiki/ESP32">https://en.wikipedia.org/wiki/ESP32</a> )</p>
<p>Avec une fréquence de 160Mhz (240 sur certains produits), du Wifi et du Bluetooth 4 LE intégré, cela fait une solution idéale pour motoriser bon nombre de projets DIY et même pro. On est donc très loin de l'Arduino de base 8 bits / 16 Mhz ! Surtout à 5 euros la carte....</p>
<h3>FluidNC</h3>
<p><a href="https://civade.com/images/FluidNC/FluidNC.svg"><img src="https://civade.com/images/FluidNC/FluidNC.svg" alt=""></a></p>
<p>FluidNC est le logiciel que nous allons installer sur notre ESP32 pour piloter une CNC ou découpe laser.</p>
<h4>Caractéristiques :</h4>
<p>FluidNC, reprend les bonnes idées de GRBL/ESP32 et ajoute d'autres fonctionnalités :</p>
<ul>
<li>Pas de nécessité de compiler le firmware pour s'adapter à une carte particulière. C'est un fichier de configuration au format YAML qui est lu au démarrage pour le paramétrer. C'était une idée clé de Smoothieware, qui n'a pas été beaucoup utilisée ailleurs et qui se révèle bien pratique pour les makers en herbe. En effet, plus besoin de compiler le firmware pour l'adapter à votre matériel, c'est le même pour tout le monde. C'est du coup également très simple pour le mettre à jour.</li>
<li>Mise à jour par USB ou OTA (wofi, over the air) du firmware.</li>
<li>Conception orientée objet, favorisant l'extensibilité. Une fonctionnalité = un objet logiciel.</li>
<li>Couche d’abstraction matérielle pour les fonctionnalités machines comme les broches, lasers, moteurs, et contrôleurs moteurs pas à pas. Il est doc facile de lier un objet aux ressources matérielles.</li>
<li>Support des cinématiques cartésiennes, corexy, midtbot, wallplotter permettant de faire des machines aux caractéristiques et géométries les plus diverses.</li>
<li>Multiples interface de contrôle :
<ul>
<li>Interfaces série via usb, la plus classique</li>
<li>Interface Wifi ou Bluetooth (2 firmwares différents, car l'ESP32 ne peut faire que l'un ou l'autre, mais pas les 2)
<ul>
<li>en Wifi: interfaces complémentaires Webui (port 80), websocket (port 81), telnet (port 23), et donc possibilité de contrôler la machine par des solutions suportant le Wifi (Lightburn, bCNC, etc..)</li>
<li>en bluetooth, profil serial BT, et utilisation par une application mobile (pour le moment Android only...)</li>
</ul></li>
</ul></li>
<li>Support d'une carte SD externe pour le stockage des fichiers d'usinage / gravure, accessible par une interface web (WebUI). On peut ainsi lancer des fichier par l'interface web sur des fichiers stockés sur carte SD, la machine devenant autonome dans l'exécutiion, sans ordinateur branché.</li>
<li>Support d'un système de fichiers interne et indépendant de la carte SD pour stocker les fichiers de configuration, accessible également par WebUI</li>
<li>Dans la WebUI, pilotage de base de la machine (jog, recherche d'origine machine, déclenchement des broches, lasers et autres, et surtout lancement de l’exécution d'un fichier Gcode stocké sur carte SD. Il est également possible de créer des macros assignables à des boutons personnalisés.</li>
<li>Documentation très complète sur http://wiki.fluidnc.com/</li>
</ul>
<h4>Broches d'usinages / lasers:</h4>
<p>Un grand nombre de types d'outils / broches sont supportés par Fluid NC:</p>
<ul>
<li>0>10V - Pilotage d'une broche avec vitesse proportionnelle à une tension (classique sur le contrôleurs VFD=Variable Frequency Drive).</li>
<li>PWM - Modulation de largeur d'impulsion, pour pilotage moteur DC</li>
<li>BESC - Pilotage d'un moteur Brushless de modélisme par contrôleur ESC (Electronic Speed Controler)</li>
<li>VFD - Pilotage de divers systèmes de commandes de broche VFD (Variable Frequency Drive) dialoguant en RS485 (laisiion série) comme les Huanyang, H100, YL620. Très bien pour piloter les plus grosses broches (jusqu'à 5Kw!)</li>
<li>DAC - Tension continue de 0>3.3V (8 bits)</li>
<li>HBridge - Pont en H en PWM. Supporte vitesse variable et 2 sens de rotation (ce qui permet un pilotage simplifié de moteur à courant continu à vitesse variable)</li>
<li>Relais - Le plus classique. On off, et peut supporter le sens de rotation avec 2 relais (On CW, On CCW). Permet aussi de supporter un solénoide (par exemple pour faire un pen up / down sur un wall plotter)</li>
<li>Laser - Pilotage en PWM, et active le mode "Laser" de FLuidNC (M3= constant power, M4 = Puissance variable). Le mode M4 supporte notamment la modulation de la puissance du laser durant l'accélération afin de maintenir constant le rapport vitesse / puissance pour ne pas bruler le modèle à basse vitesse pendant une accélération.</li>
</ul>
<h4>Moteurs Pas à Pas:</h4>
<p>FluidNC est capable de piloter des moteurs avec une grande variété de possibilités :</p>
<ul>
<li>Contrôleurs externes, pilotés par les classiques signaux STEP (pas) et DIR (direction)</li>
<li>Support d'un "Global Enable" qui permet de couper les moteurs lorsque la machine est en veille.</li>
<li>Support des Stepstick, très utilisés sur les imprimantes 3D, comme les A4988, DRV8825, TB67S249FTG</li>
<li>Support des Trinamic contrôlés en mode SPI (TMC2130 et TMC5160)</li>
<li>Support des Trinamic en mode UART (TMC2209)</li>
<li>Les Trinamic en mode Step/Dir, peuvent être utilisés en mode "Steptick", à condition de les avoir préparamétrés avant.</li>
<li>RC Servo (servo moteur type modélisme), en mode PWM</li>
<li>Dynamixel Servo en mode série.</li>
<li>Solenoid</li>
<li>Moteurs unipolaires.</li>
</ul>
<h3>Maquette de test :</h3>
<h4>La mécanique</h4>
<p>Pour les tests, j'ai réalisé une petite machine à 3 axes. Elle a tout d'abord été dessinée sous Sketchup (<a href="https://civade.com/images/FluidNC/TinyFluid.skp">fichier ICI: TinyFluid.skp</a>). J'ai finalement mis un axe Z (ex: <a href="https://www.aliexpress.com/item/1005004533356691.html">https://www.aliexpress.com/item/1005004533356691.html</a> ) trouvé d'occasion sur le bon coin pour 15 euros. A ce prix, et avec le moteur, pas la peine de concevoir quoi que ce soit. Des interrupteurs de détection d'origine ont étés ajoutés sur les 3 axes (X0, Y0, Z max) après le dessin initial. Cela donne ceci sans les fins de courses et l'axe Z:</p>
<p><a href="https://civade.com/images/FluidNC/TinyFluid1.png"><img src="https://civade.com/images/FluidNC/.TinyFluid1_m.png" alt=""></a></p>
<p><a href="https://civade.com/images/FluidNC/TinyFluid2.png"><img src="https://civade.com/images/FluidNC/.TinyFluid2_m.png" alt=""></a></p>
<p><a href="https://civade.com/images/FluidNC/TinyFluid3.png"><img src="https://civade.com/images/FluidNC/.TinyFluid3_m.png" alt=""></a></p>
<h4>L'électronique</h4>
<p>Le Wiki de FuildNC décrit pas mal de solutions matérielles supportant plus ou moins bien FluidNC: <a href="http://wiki.fluidnc.com/en/hardware/existing_hardware">http://wiki.fluidnc.com/en/hardware/existing_hardware</a>.</p>
<p>Pour la mise en œuvre du logiciel, j'ai choisi une carte MKS DLC32 V2.1 (15 euros) qui supporte 3 axes dont un double avec des contrôleurs pas à pas Stepstick ou externes, peut piloter une petit broche d'usinage (sur une sortie de puissance commandée par un MOSFET) ou un laser (en PWM). Elle n'est pas open hardware au sens littéral du terme, puisque les schémas sont à peine publiés. Néanmoins la documentation est plus que suffisante pour mettre en œuvre FluidNC sans surprise.</p>
<p><a href="https://civade.com/images/FluidNC/dlc32v2.1.jpg"><img src="https://civade.com/images/FluidNC/.dlc32v2.1_m.jpg" alt=""></a></p>
<p>J'ai réalisé une petite boite pour héberger la carte et son câblage, un ventilateur de refroidissement pour les stepsticks (DRV8825), un arrêt d'urgence, un marche arrêt et une antenne wifi externe. Les découpes permettent un accès à la prise d'alimentation, prise USB, carte SD, et les sorties des fils. Elle a été réalisée avec une découpe laser K40 sur du contreplaqué de 3mm. En voici les plans en format <a href="https://civade.com/images/FluidNC/mks32.skp">Sketchup</a>, <a href="https://civade.com/images/FluidNC/mks32.dxf">DXF</a> et au format <a href="https://civade.com/images/FluidNC/mks32.lbrn2">Lightburn</a></p>
<p><a href="https://civade.com/images/FluidNC/TinyFluid4.png"><img src="https://civade.com/images/FluidNC/.TinyFluid4_m.png" alt=""></a></p>
<p><a href="https://civade.com/images/FluidNC/TinyFluid5.png"><img src="https://civade.com/images/FluidNC/.TinyFluid5_m.png" alt=""></a></p>
<p><a href="https://civade.com/images/FluidNC/TinyFluid6.png"><img src="https://civade.com/images/FluidNC/.TinyFluid6_m.png" alt=""></a></p>
<p><a href="https://civade.com/images/FluidNC/TinyFluid7.png"><img src="https://civade.com/images/FluidNC/.TinyFluid7_m.png" alt=""></a></p>
<h4>Le logiciel: FluidNC</h4>
<p>Le wiki de FluicNC est assez clair sur la méthode d'installation: <a href="http://wiki.fluidnc.com/en/installation">Page d'installation</a>.</p>
<p>Le logiciel est à prendre de <a href="https://github.com/bdring/FluidNC">https://github.com/bdring/FluidNC</a> . A droite se trouve un bloc "Releases" avec lien direct de téléchargement sur la dernière.
Pour une première installation, prendre "fluidnc-vx.y.z-win64.zip". Puis :</p>
<ul>
<li>Le décompresser.</li>
<li>Connecter la carte en USB, et l'alimenter en 12, 19 ou 24V, En effet, le câble USB ne permet pas d'alimenter la partie logique, mais seulement de communiquer. Il nous faut donc brancher les 2...</li>
<li>Lancer install-wifi.bat (ou install-bt.bat pour une connexion Bluetooth uniquement)</li>
<li>Si c'est une première installation sur la carte, lancer install-fs.bat, qui va créer la partition spiffs pour stocker les fichiers de configuration. Ne le faire que lors de la première installation, sinon vos fichiers de config seront effacés.</li>
</ul>
<p>A l'issue, votre carte est installée sous FluidNC mais :</p>
<ul>
<li>N'est pas encore connectée à votre réseau WIfi</li>
<li>N'a pas encore de fichier de configuration pour faire fonctionner votre machine;</li>
<li>N'a pas encore l'interface HTML "WebUI" fonctionnelle.</li>
</ul>
<p>Pour le Wifi, cela va être assez simple à paramétrer. A la fin de l'installation, le logiciel lance un terminal qui va nous permettre de communiquer avec la carte afin de paramétrer le wifi grâce à quelques commandes qu'il vous suffira de lancer dans la console. Si vous l'avez fermé, pas de soucis, il suffit de lancer "fluidterm.bat" pour le ré-ouvrir.</p>
<p>Les commandes Wifi sont dans le WIKI: <a href="http://wiki.fluidnc.com/en/features/wifi_bt">http://wiki.fluidnc.com/en/features/wifi_bt</a> . C'est en lançant quelques unes de ces commandes que nous allons pouvoir paramétrer le wifi (supprimer les commentaires à la fin avant de lancer les commandes... et remplacez les données par les vôtres):</p>
<pre>
$Hostname=FluidNC ' nom d'hôte de la carte
$WiFi/Mode=STA ' Connectée à un réseau domestique
$Sta/SSID=SSIDdeMonReseau ' Votre SSID
$Sta/Password=MonMotDePasse ' Votre mit de passe wifi
$Sta/IPMode=DHCP ' Adresse attribuée automatiquement
$HTTP/Enable=1 ' interface web adctivée
$HTTP/Port=80 ' sur le port 80
$HTTP/BlockDuringMotion=1 ' n'actualise pas le web durant les déplacements
$Telnet/Enable=1 ' telnet activé
$Telnet/Port=23 ' sur le port 23
</pre>
<p>Il est également possible de passe en IP Fixe à l'aide des commande complémentaires suivantes :</p>
<pre>
$Sta/IPMode=Static
$Sta/IP=192.168.0.2
$Sta/Gateway=192.168.0.1
$Sta/Netmask=255.255.255.0
</pre>
<p>Après redémarrage, la carte est désormais joignable sur votre réseau Wifi. Toutefois, il lui manque encore un fichier pour qu'elle dispose de l'interface web. Celui-ci est livré dans l'archive, dans le sous répertoire "wifi/index.html.gz'. <a href="http://wiki.fluidnc.com/en/installation#upgrading-firmware">Il suffit de suivre la procédure "Upgrading Firmware" dans le Wiki</a>.</p>
<p>Après avoir redémarré la carte, vous devriez maintenant voir l'interface web en vous connectant sur <a href="http://fluidnc.local">http://fluidnc.local</a> :</p>
<p><a href="https://civade.com/images/FluidNC/FluidNC1.png"><img src="https://civade.com/images/FluidNC/.FluidNC1_m.png" alt=""></a></p>
<p>Il est temps de créer le fichier de configuration. L'ESP32 ne disposant pas d'un grand nombre de sorties, une astuce a été mise en oeuvre par MKS sur la carte DLC32, à savoir utiliser le port i2S (normalement réservé à une sortie audio numérique) et mettre un composant qui désérialise les données pour avoir plusieurs sorties en parallèle. Cela permet d'avoir 8 sorties supplémentaires qui seront utilisées pour les moteurs.</p>
<p>Voici l'affectation des entrées sorties de la carte, avec les fonctions des signaux et leurs noms. Ceci a été synthétisé à partir du schéma et de diverses inforamtions, n'état pas directment mis à dispoition par MKS :</p>
<style>
tr
{mso-height-source:auto;}
col
{mso-width-source:auto;}
br
{mso-data-placement:same-cell;}
.style0
{mso-number-format:General;
text-align:general;
vertical-align:bottom;
white-space:nowrap;
mso-rotate:0;
mso-background-source:auto;
mso-pattern:auto;
color:black;
font-size:11.0pt;
font-weight:400;
font-style:normal;
text-decoration:none;
font-family:Calibri, sans-serif;
mso-font-charset:0;
border:none;
mso-protection:locked visible;
mso-style-name:Normal;
mso-style-id:0;}
td
{mso-style-parent:style0;
padding-top:1px;
padding-right:1px;
padding-left:1px;
mso-ignore:padding;
color:black;
font-size:11.0pt;
font-weight:400;
font-style:normal;
text-decoration:none;
font-family:Calibri, sans-serif;
mso-font-charset:0;
mso-number-format:General;
text-align:general;
vertical-align:bottom;
border:none;
mso-background-source:auto;
mso-pattern:auto;
mso-protection:locked visible;
white-space:nowrap;
mso-rotate:0;}
.xl65
{mso-style-parent:style0;
border:.5pt solid windowtext;}
.xl66
{mso-style-parent:style0;
border-top:1.0pt solid windowtext;
border-right:.5pt solid windowtext;
border-bottom:.5pt solid windowtext;
border-left:1.0pt solid windowtext;}
.xl67
{mso-style-parent:style0;
border-top:1.0pt solid windowtext;
border-right:.5pt solid windowtext;
border-bottom:.5pt solid windowtext;
border-left:.5pt solid windowtext;}
.xl68
{mso-style-parent:style0;
border-top:1.0pt solid windowtext;
border-right:1.0pt solid windowtext;
border-bottom:.5pt solid windowtext;
border-left:.5pt solid windowtext;}
.xl69
{mso-style-parent:style0;
border-top:.5pt solid windowtext;
border-right:.5pt solid windowtext;
border-bottom:.5pt solid windowtext;
border-left:1.0pt solid windowtext;}
.xl70
{mso-style-parent:style0;
border-top:.5pt solid windowtext;
border-right:1.0pt solid windowtext;
border-bottom:.5pt solid windowtext;
border-left:.5pt solid windowtext;}
.xl71
{mso-style-parent:style0;
border-top:.5pt solid windowtext;
border-right:.5pt solid windowtext;
border-bottom:1.0pt solid windowtext;
border-left:1.0pt solid windowtext;}
.xl72
{mso-style-parent:style0;
border-top:.5pt solid windowtext;
border-right:.5pt solid windowtext;
border-bottom:1.0pt solid windowtext;
border-left:.5pt solid windowtext;}
.xl73
{mso-style-parent:style0;
border-top:.5pt solid windowtext;
border-right:1.0pt solid windowtext;
border-bottom:1.0pt solid windowtext;
border-left:.5pt solid windowtext;}
.xl74
{mso-style-parent:style0;
vertical-align:middle;
border-top:1.0pt solid windowtext;
border-right:.5pt solid windowtext;
border-bottom:.5pt solid windowtext;
border-left:1.0pt solid windowtext;}
.xl75
{mso-style-parent:style0;
vertical-align:top;
border-top:1.0pt solid windowtext;
border-right:.5pt solid windowtext;
border-bottom:.5pt solid windowtext;
border-left:1.0pt solid windowtext;}
.xl76
{mso-style-parent:style0;
vertical-align:top;
border-top:1.0pt solid windowtext;
border-right:.5pt solid windowtext;
border-bottom:.5pt solid windowtext;
border-left:.5pt solid windowtext;}
.xl77
{mso-style-parent:style0;
border-top:1.0pt solid windowtext;
border-right:1.0pt solid windowtext;
border-bottom:.5pt solid windowtext;
border-left:.5pt solid windowtext;
white-space:normal;}
.xl78
{mso-style-parent:style0;
font-size:16.0pt;
vertical-align:top;
border-top:1.0pt solid windowtext;
border-right:.5pt solid windowtext;
border-bottom:1.0pt solid windowtext;
border-left:1.0pt solid windowtext;
background:#F2F2F2;
mso-pattern:black none;
white-space:normal;}
.xl79
{mso-style-parent:style0;
font-size:16.0pt;
vertical-align:top;
border-top:1.0pt solid windowtext;
border-right:.5pt solid windowtext;
border-bottom:1.0pt solid windowtext;
border-left:.5pt solid windowtext;
background:#F2F2F2;
mso-pattern:black none;}
.xl80
{mso-style-parent:style0;
font-size:16.0pt;
vertical-align:top;
border-top:1.0pt solid windowtext;
border-right:1.0pt solid windowtext;
border-bottom:1.0pt solid windowtext;
border-left:.5pt solid windowtext;
background:#F2F2F2;
mso-pattern:black none;}
.xl81
{mso-style-parent:style0;
border-top:1.0pt solid windowtext;
border-right:.5pt solid windowtext;
border-bottom:.5pt solid windowtext;
border-left:1.0pt solid windowtext;
background:#D9D9D9;
mso-pattern:black none;}
.xl82
{mso-style-parent:style0;
border-top:1.0pt solid windowtext;
border-right:.5pt solid windowtext;
border-bottom:.5pt solid windowtext;
border-left:.5pt solid windowtext;
background:#D9D9D9;
mso-pattern:black none;}
.xl83
{mso-style-parent:style0;
font-weight:700;
border-top:1.0pt solid windowtext;
border-right:1.0pt solid windowtext;
border-bottom:.5pt solid windowtext;
border-left:.5pt solid windowtext;
background:#D9D9D9;
mso-pattern:black none;}
.xl84
{mso-style-parent:style0;
border-top:.5pt solid windowtext;
border-right:.5pt solid windowtext;
border-bottom:.5pt solid windowtext;
border-left:1.0pt solid windowtext;
background:#D9D9D9;
mso-pattern:black none;}
.xl85
{mso-style-parent:style0;
border:.5pt solid windowtext;
background:#D9D9D9;
mso-pattern:black none;}
.xl86
{mso-style-parent:style0;
border-top:.5pt solid windowtext;
border-right:1.0pt solid windowtext;
border-bottom:.5pt solid windowtext;
border-left:.5pt solid windowtext;
background:#D9D9D9;
mso-pattern:black none;}
.xl87
{mso-style-parent:style0;
border-top:.5pt solid windowtext;
border-right:.5pt solid windowtext;
border-bottom:1.0pt solid windowtext;
border-left:1.0pt solid windowtext;
background:#D9D9D9;
mso-pattern:black none;}
.xl88
{mso-style-parent:style0;
border-top:.5pt solid windowtext;
border-right:.5pt solid windowtext;
border-bottom:1.0pt solid windowtext;
border-left:.5pt solid windowtext;
background:#D9D9D9;
mso-pattern:black none;}
.xl89
{mso-style-parent:style0;
border-top:.5pt solid windowtext;
border-right:1.0pt solid windowtext;
border-bottom:1.0pt solid windowtext;
border-left:.5pt solid windowtext;
background:#D9D9D9;
mso-pattern:black none;}
.xl90
{mso-style-parent:style0;
font-weight:700;
vertical-align:middle;
border-top:1.0pt solid windowtext;
border-right:1.0pt solid windowtext;
border-bottom:.5pt solid windowtext;
border-left:.5pt solid windowtext;
background:#D9D9D9;
mso-pattern:black none;}
</style>
<table border=0 cellpadding=0 cellspacing=0 width=738 style='border-collapse:
collapse;table-layout:fixed;width:554pt'>
<col width=116 style='mso-width-source:userset;mso-width-alt:4242;width:87pt'>
<col width=115 style='mso-width-source:userset;mso-width-alt:4205;width:86pt'>
<col width=145 style='mso-width-source:userset;mso-width-alt:5302;width:109pt'>
<col width=362 style='mso-width-source:userset;mso-width-alt:13238;width:272pt'>
<tr height=57 style='height:42.75pt'>
<td height=57 class=xl78 width=116 style='height:42.75pt;width:87pt'>Port /
<br>
connecteur</td>
<td class=xl79 width=115 style='border-left:none;width:86pt'>Nom signal</td>
<td class=xl79 width=145 style='border-left:none;width:109pt'>IO</td>
<td class=xl80 width=362 style='border-left:none;width:272pt'>Commentaire</td>
</tr>
<tr height=20 style='height:15.0pt'>
<td height=20 class=xl81 style='height:15.0pt;border-top:none'>Port I2S</td>
<td class=xl82 style='border-top:none;border-left:none'>I2S_WS</td>
<td class=xl82 style='border-top:none;border-left:none'>GPIO.17</td>
<td class=xl83 style='border-top:none;border-left:none'>Pour référence
uniquement, ne pas utiliser.</td>
</tr>
<tr height=20 style='height:15.0pt'>
<td height=20 class=xl84 style='height:15.0pt;border-top:none'> </td>
<td class=xl85 style='border-top:none;border-left:none'>I2S_BCK</td>
<td class=xl85 style='border-top:none;border-left:none'>GPIO.16</td>
<td class=xl86 style='border-top:none;border-left:none'>Utilisé pour fournir
8 sorties (I2SO.0 à 7).<span style='mso-spacerun:yes'> </span></td>
</tr>
<tr height=21 style='height:15.75pt'>
<td height=21 class=xl87 style='height:15.75pt;border-top:none'> </td>
<td class=xl88 style='border-top:none;border-left:none'>I2S_DATA</td>
<td class=xl88 style='border-top:none;border-left:none'>GPIO.21</td>
<td class=xl89 style='border-top:none;border-left:none'> </td>
</tr>
<tr height=20 style='height:15.0pt'>
<td height=20 class=xl81 style='height:15.0pt;border-top:none'>Port SPI<span
style='mso-spacerun:yes'> </span></td>
<td class=xl82 style='border-top:none;border-left:none'>MISO_PIN</td>
<td class=xl82 style='border-top:none;border-left:none'>GPIO.12</td>
<td class=xl90 style='border-top:none;border-left:none'>Pour référence
uniquement, ne pas utiliser.</td>
</tr>
<tr height=20 style='height:15.0pt'>
<td height=20 class=xl84 style='height:15.0pt;border-top:none'> </td>
<td class=xl85 style='border-top:none;border-left:none'>MOSI_PIN</td>
<td class=xl85 style='border-top:none;border-left:none'>GPIO.13</td>
<td class=xl86 style='border-top:none;border-left:none'>Port SPI déjà utilisé
par la carte SD </td>
</tr>
<tr height=20 style='height:15.0pt'>
<td height=20 class=xl84 style='height:15.0pt;border-top:none'> </td>
<td class=xl85 style='border-top:none;border-left:none'>SCK_PIN</td>
<td class=xl85 style='border-top:none;border-left:none'>GPIO.14</td>
<td class=xl86 style='border-top:none;border-left:none'> </td>
</tr>
<tr height=20 style='height:15.0pt'>
<td height=20 class=xl84 style='height:15.0pt;border-top:none'> </td>
<td class=xl85 style='border-top:none;border-left:none'>CS</td>
<td class=xl85 style='border-top:none;border-left:none'>GPIO.15</td>
<td class=xl86 style='border-top:none;border-left:none'> </td>
</tr>
<tr height=21 style='height:15.75pt'>
<td height=21 class=xl87 style='height:15.75pt;border-top:none'> </td>
<td class=xl88 style='border-top:none;border-left:none'>CARD_DETECT </td>
<td class=xl88 style='border-top:none;border-left:none'><span lang=EN-US>GPIO.39</span></td>
<td class=xl89 style='border-top:none;border-left:none'> </td>
</tr>
<tr height=20 style='height:15.0pt'>
<td height=20 class=xl74 style='height:15.0pt;border-top:none'>Moteur X</td>
<td class=xl67 style='border-top:none;border-left:none'>Enable (shared)<span
style='mso-spacerun:yes'> </span></td>
<td class=xl67 style='border-top:none;border-left:none'>I2SO.0</td>
<td class=xl68 style='border-top:none;border-left:none'>1 sortie drv externe
+ 1 sortie moteur X1</td>
</tr>
<tr height=20 style='height:15.0pt'>
<td height=20 class=xl69 style='height:15.0pt;border-top:none'> </td>
<td class=xl65 style='border-top:none;border-left:none'>Step</td>
<td class=xl65 style='border-top:none;border-left:none'>I2SO.1</td>
<td class=xl70 style='border-top:none;border-left:none'> </td>
</tr>
<tr height=21 style='height:15.75pt'>
<td height=21 class=xl71 style='height:15.75pt;border-top:none'> </td>
<td class=xl72 style='border-top:none;border-left:none'>Dir</td>
<td class=xl72 style='border-top:none;border-left:none'>I2SO.2</td>
<td class=xl73 style='border-top:none;border-left:none'> </td>
</tr>
<tr height=20 style='height:15.0pt'>
<td height=20 class=xl74 style='height:15.0pt;border-top:none'>Moteur Y</td>
<td class=xl67 style='border-top:none;border-left:none'>Enable (shared)<span
style='mso-spacerun:yes'> </span></td>
<td class=xl67 style='border-top:none;border-left:none'>I2SO.0</td>
<td class=xl68 style='border-top:none;border-left:none'>1 sortie drv externe
+ 2 sorties moteur Y1 Y2</td>
</tr>
<tr height=20 style='height:15.0pt'>
<td height=20 class=xl69 style='height:15.0pt;border-top:none'> </td>
<td class=xl65 style='border-top:none;border-left:none'>Step</td>
<td class=xl65 style='border-top:none;border-left:none'>I2SO.5</td>
<td class=xl70 style='border-top:none;border-left:none'> </td>
</tr>
<tr height=21 style='height:15.75pt'>
<td height=21 class=xl71 style='height:15.75pt;border-top:none'> </td>
<td class=xl72 style='border-top:none;border-left:none'>Dir</td>
<td class=xl72 style='border-top:none;border-left:none'>I2SO.6</td>
<td class=xl73 style='border-top:none;border-left:none'> </td>
</tr>
<tr height=20 style='height:15.0pt'>
<td height=20 class=xl74 style='height:15.0pt;border-top:none'>Moteur Z</td>
<td class=xl67 style='border-top:none;border-left:none'>Enable (shared)<span
style='mso-spacerun:yes'> </span></td>
<td class=xl67 style='border-top:none;border-left:none'>I2SO.0</td>
<td class=xl68 style='border-top:none;border-left:none'>1 sortie drv externe
+ 1 sortie moteur Z1</td>
</tr>
<tr height=20 style='height:15.0pt'>
<td height=20 class=xl69 style='height:15.0pt;border-top:none'> </td>
<td class=xl65 style='border-top:none;border-left:none'>Step</td>
<td class=xl65 style='border-top:none;border-left:none'>I2SO.3</td>
<td class=xl70 style='border-top:none;border-left:none'> </td>
</tr>
<tr height=21 style='height:15.75pt'>
<td height=21 class=xl71 style='height:15.75pt;border-top:none'> </td>
<td class=xl72 style='border-top:none;border-left:none'>Dir</td>
<td class=xl72 style='border-top:none;border-left:none'>I2SO.4</td>
<td class=xl73 style='border-top:none;border-left:none'> </td>
</tr>
<tr height=20 style='height:15.0pt'>
<td height=20 class=xl66 style='height:15.0pt;border-top:none'>Limites</td>
<td class=xl67 style='border-top:none;border-left:none'>X-</td>
<td class=xl67 style='border-top:none;border-left:none'>GPIO.36<span
style='mso-spacerun:yes'> </span></td>
<td class=xl68 style='border-top:none;border-left:none'>Sur connecteur [J9]</td>
</tr>
<tr height=20 style='height:15.0pt'>
<td height=20 class=xl69 style='height:15.0pt;border-top:none'> </td>
<td class=xl65 style='border-top:none;border-left:none'>Y-</td>
<td class=xl65 style='border-top:none;border-left:none'>GPIO.35<span
style='mso-spacerun:yes'> </span></td>
<td class=xl70 style='border-top:none;border-left:none'>Sur connecteur [J10]</td>
</tr>
<tr height=21 style='height:15.75pt'>
<td height=21 class=xl71 style='height:15.75pt;border-top:none'> </td>
<td class=xl72 style='border-top:none;border-left:none'>Z-</td>
<td class=xl72 style='border-top:none;border-left:none'>GPIO.34</td>
<td class=xl73 style='border-top:none;border-left:none'>Sur connecteur [J11]</td>
</tr>
<tr height=20 style='height:15.0pt'>
<td height=20 class=xl66 style='height:15.0pt;border-top:none'>Probe</td>
<td class=xl67 style='border-top:none;border-left:none'>1</td>
<td class=xl67 style='border-top:none;border-left:none'>+5V</td>
<td class=xl68 style='border-top:none;border-left:none'>Sur connecteur [J12]</td>
</tr>
<tr height=20 style='height:15.0pt'>
<td height=20 class=xl69 style='height:15.0pt;border-top:none'> </td>
<td class=xl65 style='border-top:none;border-left:none'>2</td>
<td class=xl65 style='border-top:none;border-left:none'>GND</td>
<td class=xl70 style='border-top:none;border-left:none'> </td>
</tr>
<tr height=21 style='height:15.75pt'>
<td height=21 class=xl71 style='height:15.75pt;border-top:none'> </td>
<td class=xl72 style='border-top:none;border-left:none'>3</td>
<td class=xl72 style='border-top:none;border-left:none'>GPIO.22</td>
<td class=xl73 style='border-top:none;border-left:none'> </td>
</tr>
<tr height=20 style='height:15.0pt'>
<td height=20 class=xl66 style='height:15.0pt;border-top:none'>Spindle<span
style='mso-spacerun:yes'> </span></td>
<td class=xl67 style='border-top:none;border-left:none'>1</td>
<td class=xl67 style='border-top:none;border-left:none'>+12V permanent</td>
<td class=xl68 style='border-top:none;border-left:none'>Sur connecteur [J7]</td>
</tr>
<tr height=21 style='height:15.75pt'>
<td height=21 class=xl71 style='height:15.75pt;border-top:none'> </td>
<td class=xl72 style='border-top:none;border-left:none'>2</td>
<td class=xl72 style='border-top:none;border-left:none'>GND (cmd par GPIO.32)</td>
<td class=xl73 style='border-top:none;border-left:none'>, coupure de masse
par mosfet</td>
</tr>
<tr height=20 style='height:15.0pt'>
<td height=20 class=xl74 style='height:15.0pt;border-top:none'>Spindle TTL</td>
<td class=xl67 style='border-top:none;border-left:none'>1</td>
<td class=xl67 style='border-top:none;border-left:none'>+12V</td>
<td class=xl68 style='border-top:none;border-left:none'>Sur connecteur [J18]</td>
</tr>
<tr height=20 style='height:15.0pt'>
<td height=20 class=xl69 style='height:15.0pt;border-top:none'> </td>
<td class=xl65 style='border-top:none;border-left:none'>2</td>
<td class=xl65 style='border-top:none;border-left:none'>GND</td>
<td class=xl70 style='border-top:none;border-left:none'> </td>
</tr>
<tr height=21 style='height:15.75pt'>
<td height=21 class=xl71 style='height:15.75pt;border-top:none'> </td>
<td class=xl72 style='border-top:none;border-left:none'>3</td>
<td class=xl72 style='border-top:none;border-left:none'>GPIO.32 (TTL)</td>
<td class=xl73 style='border-top:none;border-left:none'> </td>
</tr>
<tr height=40 style='height:30.0pt'>
<td height=40 class=xl75 style='height:30.0pt;border-top:none'>Disable F1
Fuse</td>
<td class=xl76 style='border-top:none;border-left:none'>1</td>
<td class=xl76 style='border-top:none;border-left:none'>In power</td>
<td class=xl77 width=362 style='border-top:none;border-left:none;width:272pt'>Sur
connecteur [J3], <br>
enlever le fuse et connecter un M/A</td>
</tr>
<tr height=21 style='height:15.75pt'>
<td height=21 class=xl71 style='height:15.75pt;border-top:none'> </td>
<td class=xl72 style='border-top:none;border-left:none'>2</td>
<td class=xl72 style='border-top:none;border-left:none'>Ext power</td>
<td class=xl73 style='border-top:none;border-left:none'> </td>
</tr>
<tr height=20 style='height:15.0pt'>
<td height=20 class=xl66 style='height:15.0pt;border-top:none'>Bus I2C</td>
<td class=xl67 style='border-top:none;border-left:none'>1</td>
<td class=xl67 style='border-top:none;border-left:none'>3V3</td>
<td class=xl68 style='border-top:none;border-left:none'>Sur connecteur [J2]</td>
</tr>
<tr height=20 style='height:15.0pt'>
<td height=20 class=xl69 style='height:15.0pt;border-top:none'> </td>
<td class=xl65 style='border-top:none;border-left:none'>2</td>
<td class=xl65 style='border-top:none;border-left:none'>GND</td>
<td class=xl70 style='border-top:none;border-left:none'> </td>
</tr>
<tr height=20 style='height:15.0pt'>
<td height=20 class=xl69 style='height:15.0pt;border-top:none'> </td>
<td class=xl65 style='border-top:none;border-left:none'>3 - I2C_SDA</td>
<td class=xl65 style='border-top:none;border-left:none'>GPIO.0</td>
<td class=xl70 style='border-top:none;border-left:none'> </td>
</tr>
<tr height=21 style='height:15.75pt'>
<td height=21 class=xl71 style='height:15.75pt;border-top:none'> </td>
<td class=xl72 style='border-top:none;border-left:none'>4 - I2C_SCL </td>
<td class=xl72 style='border-top:none;border-left:none'>GPIO.4</td>
<td class=xl73 style='border-top:none;border-left:none'> </td>
</tr>
<tr height=20 style='height:15.0pt'>
<td height=20 class=xl66 style='height:15.0pt;border-top:none'>Reset</td>
<td class=xl67 style='border-top:none;border-left:none'>1</td>
<td class=xl67 style='border-top:none;border-left:none'>GND</td>
<td class=xl68 style='border-top:none;border-left:none'>Sur connecteur [J5]</td>
</tr>
<tr height=21 style='height:15.75pt'>
<td height=21 class=xl71 style='height:15.75pt;border-top:none'> </td>
<td class=xl72 style='border-top:none;border-left:none'>2</td>
<td class=xl72 style='border-top:none;border-left:none'>RESET</td>
<td class=xl73 style='border-top:none;border-left:none'> </td>
</tr>
<tr height=20 style='height:15.0pt'>
<td height=20 class=xl66 style='height:15.0pt;border-top:none'>Beeper<span
style='mso-spacerun:yes'> </span></td>
<td class=xl67 style='border-top:none;border-left:none'>1</td>
<td class=xl67 style='border-top:none;border-left:none'>GND (cmd<span
style='mso-spacerun:yes'> </span>par I2SO.7)</td>
<td class=xl68 style='border-top:none;border-left:none'>Sur connecteur [J4]</td>
</tr>
<tr height=21 style='height:15.75pt'>
<td height=21 class=xl71 style='height:15.75pt;border-top:none'> </td>
<td class=xl72 style='border-top:none;border-left:none'>2</td>
<td class=xl72 style='border-top:none;border-left:none'>+12V permanent</td>
<td class=xl73 style='border-top:none;border-left:none'> </td>
</tr>
</table>
<p>C'est à partir de cette information que nous allons pouvoir batir le fichier texte de configuration "config.yaml" qui va être envoyé à la carte pour lui documenter comment sont utilisées les différente broches :</p>
<pre>
board: MKS-DLC32 V2.1
name: Hybrid CNC/Laser JPC 335x275x53mm -
meta: (24/09/2022) 09:00
kinematics:
Cartesian:
stepping:
engine: I2S_STATIC
idle_ms: 0
pulse_us: 4
dir_delay_us: 1
disable_delay_us: 0
axes:
shared_stepper_disable_pin: I2SO.0
x:
steps_per_mm: 80
max_rate_mm_per_min: 20000.000
acceleration_mm_per_sec2: 1500.000
max_travel_mm: 335.000
soft_limits: true
homing:
cycle: 2
positive_direction: false
mpos_mm: 0.000
feed_mm_per_min: 200.000
seek_mm_per_min:2000.000
settle_ms: 500
seek_scaler: 1.100
feed_scaler: 1.100
motor0:
limit_neg_pin: gpio.36:low
hard_limits: false
pulloff_mm: 2.000
stepstick:
step_pin: I2SO.5
direction_pin: I2SO.6
y:
steps_per_mm: 80
max_rate_mm_per_min: 20000.000
acceleration_mm_per_sec2: 1500.000
max_travel_mm: 275.000
soft_limits: true
homing:
cycle: 2
positive_direction: false
mpos_mm: 0.000
feed_mm_per_min: 200.000
seek_mm_per_min: 2000.000
settle_ms: 500
seek_scaler: 1.100
feed_scaler: 1.100
motor0:
limit_neg_pin: gpio.35:low
hard_limits: false
pulloff_mm: 2.000
stepstick:
step_pin: I2SO.1
direction_pin: I2SO.2
z:
steps_per_mm: 1600.00
max_rate_mm_per_min: 2000.000
acceleration_mm_per_sec2: 100.000
max_travel_mm: 53.000
soft_limits: true
homing:
cycle: 1
positive_direction: true
mpos_mm: 0.000
feed_mm_per_min: 200.000
seek_mm_per_min: 500.000
settle_ms: 500
seek_scaler: 1.100
feed_scaler: 1.100
motor0:
limit_neg_pin: gpio.34:low
hard_limits: false
pulloff_mm: 1.000
stepstick:
step_pin: I2SO.3
direction_pin: I2SO.4
i2so:
bck_pin: gpio.16
data_pin: gpio.21
ws_pin: gpio.17
spi:
miso_pin: gpio.12
mosi_pin: gpio.13
sck_pin: gpio.14
sdcard:
cs_pin: gpio.15
card_detect_pin: NO_PIN
control:
safety_door_pin: NO_PIN
reset_pin: NO_PIN
feed_hold_pin: NO_PIN
cycle_start_pin: NO_PIN
macro0_pin: NO_PIN
# macro0_pin: gpio.33:low:pu
macro1_pin: NO_PIN
macro2_pin: NO_PIN
macro3_pin: NO_PIN
macros:
startup_line0:
startup_line1:
macro0: $SD/Run=lasertest.gcode
macro1: $SD/Run=home.gcode
macro2:
macro3:
coolant:
flood_pin: NO_PIN
mist_pin: NO_PIN
delay_ms: 0
probe:
# Sonde raccordée en J12
pin: gpio.22
check_mode_start: true
Laser:
# PWM à 1Khz.
pwm_hz: 1000
# Laser raccordé sur connecteur J18
output_pin: gpio.32
enable_pin: NO_PIN
disable_with_s0: false
s0_with_disable: false
tool_num: 0
speed_map: 0=0.000% 1000=100.000%
pwm:
pwm_hz: 5000
direction_pin: NO_PIN
# Broche 12V (ou 24V) raccordée au connecteur J7.
# Attention à ne pas dépasser la puissance du MOSFET.
output_pin: gpio.32
enable_pin: NO_PIN
disable_with_s0: false
s0_with_disable: true
spinup_ms: 0
spindown_ms: 0
tool_num: 1
speed_map: 0=0.000% 10000=100.000%
user_outputs:
analog0_pin: NO_PIN
analog1_pin: NO_PIN
analog2_pin: NO_PIN
analog3_pin: NO_PIN
analog0_hz: 5000
analog1_hz: 5000
analog2_hz: 5000
analog3_hz: 5000
digital0_pin: NO_PIN
digital1_pin: NO_PIN
digital2_pin: NO_PIN
digital3_pin: NO_PIN
start:
must_home: true
</pre>
<p>Cette implémentation fait appel à plsuieurs astuces :</p>
<ul>
<li>L'axe X de la machine étant piloté par 2 moteurs, il sera drivé par la seule sortie ayant 2 connecteurs de sortie moteurs : Y</li>
<li>De ce fait l'axe X machine est piloté par l'axe Y de la carte (permutation...).</li>
<li>2 outils ont été définits, un laser (outil 0) et un moteur de broche (outil 1). Pour en sélectionner, il suffit d'envoyer un GCODE M6 Tx (ex : "M6 T0" pour le laser)</li>
<li>La puissance de sortie du laser étant senseiblement linéaire lorsque l'on module sa puissance en PWM, speed_map définit une courbe de transfert droite. Il est tout à fait possible de spéciier autre chose.</li>
<li>Les 2 outils sont racordés sur la même sortie. Il ne pourront donc pas fonctionner en même temps. Mais vous pourriez utiliser une autre sortie de la carte pour le moteur de broche en mettant un relais sstatique externe par exemple pour contourner cela.</li>
<li>l"outil "Laser" active automatiquement le "Laser Mode" de FluidNC, c'est à dire la capacité à changer la puissance du laser à la volée sans faire d'arrêt. Ceci n'est bien sur pas posisble sur une CNC (et donc sur l'outil broche "PWM").</li>
</ul>
<p>Je vous encourage à consulter le wiki sur la syntaxe de ce fichier YAML pour bien comprendre ce qui a été fait ci dessus : <a href="http://wiki.fluidnc.com/en/config/overview">http://wiki.fluidnc.com/en/config/overview</a></p>
<p>Ce fichier config.yaml doit ensuite être envoyé à la carte, par l'interface web. La prodécure est documentée également dans le wiki ("Overview" / "Uploading".
Des changements minimes à la volée pourront être faits directemnet par l'interface web, afin de tester des paramètres par exemple ("Overview" / "Live changes"). Bien que cela soit possible, je ne vous encorage pas à sauver ces changements dans l'interface car le formatage de votre fichier de config et ses commentaires seront perdus. Dès que vous avez trouvé les bons réglages, reportez les dans votre "config.yaml" et renvoyez le à la carte. Vous pouvez égalemetn mettre plusieurs fichier de configuration sur la carte, et les activer par "$Config/Filename" dans le réglages. Attention toutefois, la mémoire interne est très faible, vous ne pourrez pas stocker beaucoup de fichiers différents dessus.</p>
<h4>Branchement d'un afficheur OLED</h4>
<p>Les versions récentes de FluidNC permettent le raccordement d'un petit afficheur OLED basé sur un SSD1306 avec 128X64 pixels. Disponibles à 2€ en 0.96<em> et 4 euros en 1.3 </em>, il vont permettent d'afficher l'adresse IP ainsi que les coordonnées machine en temps réel. Pratique.
Le raccordement est aisé puisqu'il suffit de se brancher sur le connecteur J2 et de raccorder les broches de même nom entre elles (SD > SDA, SCL > SCL, DND > GND, 3.3V > VCC).</p>
<p>Quelques lignes ajoutées à la fin du fichier config.yaml vont faire le reste de la magie. Attention à l'adresse de l'afficheur, qui ne sera peut être pas la même pour le votre. Elle est généralement marquée sur la sérigraphie du circuit imprimée. Ici donnée pour un 0.96''.</p>
<pre>
i2c0:
sda_pin: gpio.0
scl_pin: gpio.4
oled:
i2c_num: 0
# 3C en hexa = 60
# 78 en hexa = 120
i2c_address: 60
width: 128
height: 64
radio_delay_ms: 1000
</pre>
<h3>Logiciel de pilotage</h3>
<p>J'ai testé la découpe laser avec succès sur Lightburn ( <a href="https://lightburnsoftware.com/">https://lightburnsoftware.com/</a> ). Pour que la compatibilité soit parfaite il suffit de choir GRBL. Cerise sur le gateau, il sera ensuite possble de piloter la machine soit en USB (port sériie sur USB), et même en réseau en donnant l'adresse de la machine ( choisir "Ethernet/TCP" et donner l'adresse IP de la machine).</p>
<p>A noter qu'en WIFI, le débit de transmission de commande vers la machine est beaucoup plus faible. Ce n'est pas un soucis lorsque l'on fait de la découpe, mais peut le devenir lorsque l'on fait de la gravure en mode "raster" d'un image par exemple. En effet, dans ce mode chaque changement de puissance du laser sur un trait continu donnera lieu à l'envoi de commandes... Du coup la machine peut s'arrêter brièvement, laser allumé ce qui est claiement un soucis. Pour faire du gravage sans niveau de gris c'est fonctionnel (ex: sérigraphie de textes sur une face avant d'appareil).</p>
<p>Il est aussi possible dde sauver le fichie GCODE produit par l'outil et de l'envoyer par l'interface web sur la carte SD. La machine devient ainsi autonome, et cela coutourne la limitation du straming de commande via Wifi.</p>
<p>En mode CNC, j'ai travaillé avec un logiciel écrit en Python qui se nomme BCNC: (voir <a href="https://github.com/vlachoudis/bCNC">https://github.com/vlachoudis/bCNC</a>)
C'est un peu pénible à installer dans les dernières versions mais marche plutot pas mal !</p>
<ul>
<li>Installer Python 3.10 dernière version de https://www.python.org/downloads/</li>
<li>Lancer un interpréteur de commande</li>
<li>Taper la commadne suivante</li>
</ul>
<pre>
pip install --upgrade bCNC
</pre>
<ul>
<li>Le lanceur de bCNC se trouve dans (copier coller le chimin dans la barre d'adresse de l'explorateur windows)</li>
</ul>
<pre>
%LocalAppData%\Programs\Python\Python310\Lib\site-packages\bCNC\bCNC.bat
</pre>
<p>A noter que :</p>
<ul>
<li>BCNC permet la connexion part port série (classique) mais aussi par réseau (ex: socket://192.168.xx.yy:23) sur le port telnet.</li>
<li>BCNC supporte l'auto level avec une sonde qui peut être raccordée à J12, ce qui permet de corriger des défauts de planéité de la machine / table. Voir procédure : https://github.com/vlachoudis/bCNC/wiki/AutoLevel</li>
</ul>
<p>Voila, j'espère vous avoir donné envie d'essayer, et les clés pour démarrer. Bonne bidouille!</p>https://civade.com/post/2023/04/22/Pilotage-de-CNC-et-de-d%C3%A9coupe-laser-avec-ESP32-et-FluidNC#comment-formhttps://civade.com/feed/atom/comments/123Ajouter un pédalier pour changements de sons au multieffet Zoom MS70-CDR (ou MS50/MS60)urn:md5:068d9341d188f813b037625b75fcdc162023-02-18T08:10:00+01:002024-02-27T06:31:52+01:00jphiDIY-MusiqueArduinoDIYEmbarquéFirmwareMusique<p>Zoom fait une pédale multi effet très intéressante car pour une somme modique elle permet de disposer d'une palette d'effets pour guitare et basse. On peut d'ailleurs chainer plusieurs effets et stocket ses réglage dans l'un des 50 emplacements disponibles. Toutefois, bien que l'on puisse faire un marche arrêt au pied, soit d'un effet dans une chaine, soit de la chaine complète, on ne peut pas au pied changer de presets. Nous allons ici corriger ce défaut en ajoutant un pédalier avec afficheur.</p> <p><a href="https://civade.com/images/Zoom_ms70/IMG_3281.jpg"><img src="https://civade.com/images/Zoom_ms70/.IMG_3281_m.jpg" alt=""></a></p>
<p>En fait, dans ce post, je n'ai pas développé grand chose. C'est Mastrum, un toulousain qui a réalisé cette interface pour MS50/60/70 et qui permet de changer (Programme - / Programme +) et d'afficher le programme courant sur un afficheur OLED complémentaire. Simple et efficace ce projet contourne la principale limitation du Zoom MS-70CDR / MS-50 / MS-60B pour une utilisation sur scène en lui donnant la capacité de changer de programme au pied. Mon intervention ici, est donc plus pour documenter la réalisation (le GIT est assez sommaire sur ce sujet), faire quelques modifs de code suite à des évolutions dans les bibliothèques, et ajouter un plastron pour faciliter l'intégration de l'afficheur.</p>
<p>Le projet initial est ICI: <a href="https://github.com/maestun/zoom-multistomp-patch-changer">https://github.com/maestun/zoom-multistomp-patch-changer</a></p>
<h3>Liste du Matériel :</h3>
<ul>
<li>1 x Arduino pro mini 3.3V 8Mhz: <a href="https://www.adafruit.com/product/2377">https://www.adafruit.com/product/2377</a></li>
<li>1 x Mini USB Host Shield 2.0 pour Arduino pro mini: <a href="https://www.aliexpress.com/premium/%22mini-usb-host%22-shield.html">https://www.aliexpress.com/premium/%22mini-usb-host%22-shield.html</a></li>
<li>1 x Afficheur OLED 0.91 pouces 128x32: <a href="https://www.aliexpress.com/premium/oled-0.91-12832.html">https://www.aliexpress.com/premium/oled-0.91-12832.html</a></li>
<li>2 X Interrupteur momentané au pied <a href="https://www.aliexpress.com/premium/spst-footswitch.html">https://www.aliexpress.com/premium/spst-footswitch.html</a></li>
<li>1 x régulateur de tension ajustable 9v > 5V <a href="https://fr.aliexpress.com/premium/Module-d'alimentation-abaisseur-3A-r%C3%A9glable-LM2596.html">https://fr.aliexpress.com/premium/Module-d'alimentation-abaisseur-3A-r%C3%A9glable-LM2596.html</a></li>
<li>1 x connecteur d'alimentation femelle 5.5x2.1mm DC022B <a href="https://www.aliexpress.com/premium/dc022b-femelle.html">https://www.aliexpress.com/premium/dc022b-femelle.html</a></li>
<li>1 x plastron pour afficheur OLED 128x32 (impression 3D, sources dans l'article)</li>
<li>1 x boitier à votre convenance</li>
<li>1 x Câble USB > Mini USB</li>
<li>1 x adaptateur FTDI 3.3V vers USB <a href="https://www.aliexpress.com/premium/3.3v-usb-ftdi232.html">https://www.aliexpress.com/premium/3.3v-usb-ftdi232.html</a> . Il ne servira que durant la phase de programmation de la carte Arduino.</li>
</ul>
<h3>Câblage :</h3>
<p>Avant de parler de câblage il faut un peu parler d'alimentation... En effet, il y a quelques petites contraintes :</p>
<ul>
<li>Ce montage est basé sur une shield USB host 2.0 qui ne fonctionne qu'en 3.3V et n'est pas compatible 5V.</li>
<li>Ce même montage doit fournir une alimentation 5V à la pédale Zoom faute de quoi l'USB ne sera pas reconnu.</li>
<li>Enfin, nous souhaitons alimenter le tout en 9V avec une alimentation de pédale,</li>
</ul>
<p>Ceci va avoir pas mal de conséquences :</p>
<ul>
<li>Il va falloir modifier la shield USB 2.0 pour qu'elle fournisse un 5V pour alimenter la pédale zoom. Nativement et sans modification, elle ne fournit qu'un 3.3v sous très faible puissance....</li>
<li>Il va falloir utiliser une carte Arduino qui fonctionne en 3.3V (d’où le choix de la pro mini 3.3V), à défaut de quoi la shield USB serait détruite car il ne faut pas du tout dépasser les 3.3V dessus.</li>
<li>La carte Arduino étant munie d'un régulateur 5V > 3.3V, il va également nous falloir un régulateur abaisseur de tension 9V > 5V pour s'adapter à l’alimentions standard de pédale d'effet vers l'entrée non régulée (RAW) de la carte Arduino .</li>
</ul>
<p>Pour que ce soit plus clair, voici un synoptique de la chaine d'alimentation :</p>
<p><a href="https://civade.com/images/Zoom_ms70/ChaineAlimentation.png"><img src="https://civade.com/images/Zoom_ms70/ChaineAlimentation.png" alt=""></a></p>
<p>Une fois ceci compris nous allons devoir d'abord modifier la Shield USB. Il va nous falloir couper une piste (3.3V > Power USB) et ajouter un fil (5V > power USB) comme ceci (a faire avec un petit scalpel et y aller très précautionneusement...) :</p>
<p><a href="https://civade.com/images/Zoom_ms70/couper-la-piste.jpg"><img src="https://civade.com/images/Zoom_ms70/.couper-la-piste_m.jpg" alt=""></a></p>
<p>La shield USB étant prévue pour une Arduino pro mini, le câblage va être simplifié, puisque les 2 s'empilent. il suffira de les monter tête bêche comme suit. Les broches verticales à droite doivent égalemnet être soudées. C'est sur ces broches que nous raccorderons l'interface de programmation.</p>
<p><a href="https://civade.com/images/Zoom_ms70/usb_shield.jpg"><img src="https://civade.com/images/Zoom_ms70/usb_shield.jpg" alt=""></a></p>
<p>Enfin, il fa falloir ajouter sous la shield USB un fil pour alimenter l'USB en 5V comme suit :</p>
<p><a href="https://civade.com/images/Zoom_ms70/filalimentation.jpg"><img src="https://civade.com/images/Zoom_ms70/.filalimentation_m.jpg" alt=""></a></p>
<p>Avant de raccorder l'alimentation, nous allons devoir la régler. Pour ce faire il nous fait câbler le jack femelle dessus (attention sur les alimentations de pédales d'effet, le point central est la masse, et l'extérieur est le +5V ce qui est l'inverse d'un câblage classique) et mesurer la sortie de façon à avoir exactement 5V. Le cas échéant retoucher le réglage avec le potentiomètre. Ne pas vous tromper sur la polarité des alimentations, c'est destructif!!!</p>
<p>Une fois réglée, nous allons pouvoir raccorder la carte alimentation entre le GND et le RAW (+5V) de la carte Arduino.</p>
<p>Les interrupteurs au pied se raccordent quand à eux entre GND et A1 pour le bouton précédent et GND et A2 pour le bouton suivant.</p>
<p>L'afficheur OLED quand à lui se raccorde entre directement sur la carte Arduino, L’alimentation se raccorde entre les broches GND et 3.3V de l’Arduino, SCL se raccorde à la broche A5 de l’Arduino et SDA se raccorde à la broche A4. Attention, ces 2 broches sont 2 pastilles à part sur la carte Arduino (cliquez pour agrandir...):</p>
<p><a href="https://civade.com/images/Zoom_ms70/arduino-mini-pro-pinout.png"><img src="https://civade.com/images/Zoom_ms70/.arduino-mini-pro-pinout_m.png" alt=""></a></p>
<h3>Chargement du code :</h3>
<p>L'Arduino pro mini ne disposant pas de port USB il va nous falloir utiliser l'interface FTDI USB pour la programmer. Il faut tout d'abord configurer l'interface pour qu'elle fonctionne en 3.3V à l'aide du cavalier d'alimentation qui est dessus. Une sérigraphie en face de ce cavalier (5V/3.3V) vous permet d'identifier la bonne position (3.3V). <strong>Ceci est très important et si ce n'est pas fait vous allez cramer la shield USB...</strong></p>
<p>Ensuite le raccordement ne pose pas de problème. Il se fait sur le connecteur de programmation au bout de l’Arduino. Il ne nous faudra que 4 fils. Câbler le TX de l’Arduino sur le RX de la FTDI et vice versa. Raccorder ensuite les 2 broches d'alimentation. Les autres broches peuvent être laissées libres.</p>
<p>Pour le moment ne pas raccorder l'alimentation externe. C'est l'interface USB FTDI qui va aliemnter l'arduino.</p>
<p>Récupérer le code ICI: <a href="https://civade.com/images/Zoom_ms70/zoom-multistomp-patch-changer.zip">zoom-multistomp-patch-changer.zip</a> et dézippez le dans votre répertoire arduino. Ouvrez le et n'oubliez pas de paramétrer votre carte en "Arduino Pro Mini 3.3V / 8Mhz). Comme la carte ne se resette pas automatiquement pour la mettre en mode programmation, il vous faudra à la fin de la compilation appuyer sur le bouton reset de la carte pour la mettre en mode programmation; Comme elle ne reste dans cet état que 2/3 secondes, vous risquez de rater la fenêtre de programmation; Refaire l'opération (upload + reset) jusqu'à ce que cela fonctionne.</p>
<h3>Tests :</h3>
<p>Pour les premiers tests, nous allons restés alimentés par l'interface FTDI.</p>
<p>Dès la carte programmée, l'afficheur OLED devrait vous indiquer "USB RESET". Si ce n'est pas le cas, débranchez le câble USB et vérifiez votre câblage... Si c'est le cas, branchez votre pédale Zoom sur l'entrée USB de la USB Host Shield. Quelques secondes après l'afficheur devrait vous indiquer successivement :</p>
<ul>
<li>"USB INIT"</li>
<li>"MS-70CDR"</li>
<li>Version du Ms70CDR</li>
<li>Et enfin le nom du patch sélectionné sur le MS70</li>
</ul>
<p>Si il reste bloqué sur USB init, vous pouvez vous aider de la console série qui fournit quelques informations sur l'état de connexion USB (et vérifiez votre câblage et vos câbles USB!).</p>
<h3>Mise en boite :</h3>
<p>Pour faire la mise en boite, il sera plus pratique d'utiliser un plastron imprimé en 3D pour y intégrer l'afficheur. J'ai fait un modèle 3D que vous trouverez ici : <a href="https://civade.com/images/Zoom_ms70/bezel.zip">bezel.zip</a> . Ce plastron venant recouvrir la découpe, cela sera joli même si la découpe n'est pas très propre.</p>
<p>Voici ce a quoi cela ressemble :</p>
<p><a href="https://civade.com/images/Zoom_ms70/bezel1.png"><img src="https://civade.com/images/Zoom_ms70/bezel1.png" alt=""></a></p>
<p><a href="https://civade.com/images/Zoom_ms70/bezel2.png"><img src="https://civade.com/images/Zoom_ms70/bezel2.png" alt=""></a></p>
<p>Dans mon cas, j'ai intégré ce montage directement dans un pedal board qui fera l'objet d'un prochain article; un pièce de tôle pliée reçoit l'électronique et sert de repose pied.</p>
<p><a href="https://civade.com/images/Zoom_ms70/IMG_3279.jpg"><img src="https://civade.com/images/Zoom_ms70/.IMG_3279_m.jpg" alt=""></a></p>
<p>l'électronique est montée à la colle chaude dans le barreau, en dessous. Simple, efficace et surtout démontable... (cliquez sur les photos pour zoomer)</p>
<p><a href="https://civade.com/images/Zoom_ms70/IMG_3282.jpg"><img src="https://civade.com/images/Zoom_ms70/.IMG_3282_m.jpg" alt=""></a></p>
<p><a href="https://civade.com/images/Zoom_ms70/IMG_3284.jpg"><img src="https://civade.com/images/Zoom_ms70/.IMG_3284_m.jpg" alt=""></a></p>
<p>Je n'ai pas utilisé l'alimentation décrite dans l'article, mais une simple alimentation 5V bâtie autour d'un régulateur 7805 et de 2 condensateurs.</p>
<p><a href="https://civade.com/images/Zoom_ms70/IMG_3285.jpg"><img src="https://civade.com/images/Zoom_ms70/.IMG_3285_m.jpg" alt=""></a></p>
<p>Mais vous pourrez tout aussi bien l'intégrer dans un boitier 125B, qui vous permettra de mettre l'afficheur en face avant, les 2 switch, l'alimentation et la prise alimentation. Voici à quoi cela pourrait ressembler :</p>
<p><a href="https://civade.com/images/Zoom_ms70/hammond125b.png"><img src="https://civade.com/images/Zoom_ms70/.hammond125b_m.png" alt=""></a></p>
<p>Bonne réalisation!</p>https://civade.com/post/2023/02/18/Ajouter-un-p%C3%A9dalier-pour-changements-de-sons-au-multieffet-Zoom-MS-70CDR-%28ou-MS-50/MS-60B%29#comment-formhttps://civade.com/feed/atom/comments/122Enregistrement audio/vidéo avec carte son externe sur iphone / ipadurn:md5:38d4831dc5c04f537988891a1b03f5962023-01-21T20:05:00+01:002024-02-27T06:30:00+01:00jphiDIY-MusiqueDIYMusique<p>L'enregistrement video + audio ou audio seul sur iphone ou iPad peut vite devenir une galère dès lors que l'on désire une certaine souplesse de positionnement des micros, ou tout simplement avec un volume important (répétitions, concerts, etc..). Le micro intégré ne supporte en effet pas très bien les volumes sonores du live, et sa directivité le rend très moyen pour des prises de son de conférences par exemple. Mais il y a des solutions...</p> <h3>Les Micros dédiés :</h3>
<p>Certes il existe des micros dédiés, disposant d'une prise Lightning (Zoom IQ6, Zoom IQ7, Rode Vlogger, Rode VideoMic, etc..). Mais ce sont des accessoires dédiés, et qui ne permettront que de faire de la prise micro. Et à 100 ou 180 euros, cela fait réfléchir car ils ne seront utilisables que pour un usage.</p>
<p>Exemple de micro dédié, le Zoom IQ6 :</p>
<p><a href="https://civade.com/images/ios-external-audio/Zoom_IQ6.jpg"><img src="https://civade.com/images/ios-external-audio/.Zoom_IQ6_m.jpg" alt=""></a></p>
<h3>Raccorder une carte son externe</h3>
<p>Heureusement, le noyau d'IOS intègre des drivers qui permettent de raccorder une carte son USB "Class compliant". Ceci veut dire qu'une carte son moderne, qui se branche sur PC/Mac/linux sans installer de drivers sera visible de l'iphone.</p>
<p>Il y a 2 pré requis pour pouvoir raccorder une carte son externe :</p>
<ul>
<li>Disposer d'un adaptateur Lightning > USB</li>
<li>Raccorder la carte son externe via un hub USB alimenté</li>
</ul>
<h4>L'adaptateur Lightning USB</h4>
<p>Le premier pré requis pour effectuer une configuration de ce genre est de disposer d'une interface lightning <> USB. Chez Apple, cela se nomme "Adaptateur pour appareil photo Lightning vers USB". il existe en 2 versions, l'une avec seulement une prise USB et une avec prise USB ET la prise de charge Lightning. Cette 2e version est préférable car elle permettra de charger le téléphone en même temps que l'on utilisera le périphérique USB. Intéressant si l'on doit filmer une conférence ou un concert de 2 heures.</p>
<p>L'adaptateur Caméra USB d'Apple, avec port de charge Lightning</p>
<p><a href="https://civade.com/images/ios-external-audio/lightning-USB.jpg"><img src="https://civade.com/images/ios-external-audio/.lightning-USB_m.jpg" alt=""></a></p>
<p>L'adaptateur Caméra USB d'Apple, sans port de charge Lightning :</p>
<p><a href="https://civade.com/images/ios-external-audio/AdaptateurPhoto.jpg"><img src="https://civade.com/images/ios-external-audio/.AdaptateurPhoto_m.jpg" alt=""></a></p>
<p>J'ai essayé avec succès un adaptateur Lightning USB sans port de charge de provenance chinoise. Avec le mien, cela a fonctionné. Toutefois, il semblerait que certains ne soient pas correctement reconnus après des mises à jour d'IOS. Essayer avant d'acheter !</p>
<h4>Hub USB alimenté</h4>
<p>Warning!!!!! La plupart des soucis de détection de la carte son viennent de l'alimentation. En effet, un iphone ne peut délivrer sur l'USB que quelques centaines de milliampères. Si lors du branchement de la carte vous avez une mention "Ce périphérique USB consomme trop", il va vous falloir utiliser un concentrateur (hub) usb alimenté. Ainsi votre carte son sera alimentée par le hub, et ne tirera plus sur la prise USB de l'adaptateur Lightning.</p>
<p>Exemple de concentrateur USB avec alimentation externe:</p>
<p><a href="https://civade.com/images/ios-external-audio/PoweredUsbHub.jpg"><img src="https://civade.com/images/ios-external-audio/.PoweredUsbHub_m.jpg" alt=""></a></p>
<p>Attention à ce que ce hub dispose d'une alimentation avec une puissance suffisante (5V, 1 ou 2 ampères) faute de quoi la carte son n'aura pas assez de puissance pour fonctionner correctement voir s'allumer. A noter qu'on peut la voir s'allumer sans pour autant qu'elle soit reconnue dans l'iphone / ipad si l'alim n'est pas assez puissante... On a l'impression que cela fonctionne, mais en fait non... J'en ai fait l'expérience cuisante! Le simple changement d'alim sur le hub pour une plus puissante a suffit à régler le problème.</p>
<p>Dans mes essais, j'ai vu que si le téléphone est complètement chargé, et qu'on utilise l'adaptateur Apple avec prise Lightning branchée à un chargeur Apple, la carte son peut fonctionner, seulement branchée à la prise usb (sans hub donc). J'ai fait une prise vidéo dans ces conditions pendant 2 heures, mais la batterie du téléphone s'est progressivement déchargée. Si l'on veut pouvoir tenir plus de 2 heures et dans toutes les conditions, il faut clairement envisager le hub USB alimenté.</p>
<h3>Essais Audio</h3>
<p>J'ai essayé avec plusieurs cartes sons ou périphériques audio en ma possession, avec succès :</p>
<p><strong>MAudio Fast Trak pro</strong></p>
<p><a href="https://civade.com/images/ios-external-audio/M_Audio_Fast_Track_PRO_USB_Audio_interface_2.jpg"><img src="https://civade.com/images/ios-external-audio/.M_Audio_Fast_Track_PRO_USB_Audio_interface_2_m.jpg" alt=""></a></p>
<p><a href="https://civade.com/images/ios-external-audio/M_Audio_Fast_Track_PRO_USB_Audio_interface_1.jpg"><img src="https://civade.com/images/ios-external-audio/.M_Audio_Fast_Track_PRO_USB_Audio_interface_1_m.jpg" alt=""></a></p>
<ul>
<li>2 entrées XLR/Jack Mic/Line</li>
<li>2 sorties ligne sur Jack 6.35</li>
<li>4 sorties ligne sur Cinch</li>
<li>E/S SPDIF</li>
<li>2 inserts</li>
<li>1 sortie casque avec potentiomètre de volume</li>
<li>Mixeur entre le son provenant de la carte et le monitoring direct (pour le cas et le line out).</li>
<li>Entrées/Sorties Midi</li>
<li>Alimentation fantôme 48V débrayable</li>
<li>Max 16 bits 48khz.</li>
<li>Plus fabriquée. Se trouve d'occasion sur LBC à 20 euros... Imbattable pour débuter ou faire des essais!</li>
</ul>
<p>Çà fait le job sur l'enregistreur audio ou vidéo. Je n'ai pas trouvé comment passer l'enregistrement en 48Khz, il est par défaut en 44.1/16bits stéréo.</p>
<ul>
<li>Une fois branché, les entrées et sorties prises en compte par l'iPhone sont celles de la carte.</li>
<li>On peut avec le mixeur de monitoring doser le mix entre le monitoring direct et le retour de la carte.</li>
<li>On gagne le midi, et la possibilité de brancher un clavier, mais c'est un autre sujet :).</li>
<li>Les convertisseurs sont pas terribles, mais à 20 balles d'occasion faut pas demander la lune non plus....</li>
<li>Sera galère à installer sur Mac, mais fonctionne sous Windows 10/11</li>
</ul>
<p><strong>Behringer U-PHORIA UMC202HD</strong></p>
<p><a href="https://civade.com/images/ios-external-audio/UMC202HD-frony.png"><img src="https://civade.com/images/ios-external-audio/.UMC202HD-frony_m.png" alt=""></a></p>
<p><a href="https://civade.com/images/ios-external-audio/UMC202HD_Rear.png"><img src="https://civade.com/images/ios-external-audio/.UMC202HD_Rear_m.png" alt=""></a></p>
<ul>
<li>2 entrées XLR/Jack Mic/Line</li>
<li>2 sorties ligne sur Jack 6.35</li>
<li>1 sortie casque avec potentiomètre de volume</li>
<li>Bouton "Direct Monitor" permettant de sélectionner le son provenant de la carte ou le monitoring direct de l'entrée.</li>
<li>Alimentation fantôme 48V débrayable</li>
<li>Max 24 bits / 192 kHz.</li>
<li>Tarif indicatif 90€</li>
</ul>
<p>Détectée sans soucis. Je n'ai pas non plus trouvé comment passer l'enregistrement en 48Khz ou plus, il est par défaut en 44.1/16bits stéréo.</p>
<ul>
<li>Une fois branché, les entrées et sorties prises en compte par l'iPhone sont celles de la carte.</li>
<li>L'appui sur le bouton "Direct Monitor" permet d'entendre ce qui est capté par les entrées et sera enregistré.</li>
<li>Très bon rapport qualité / prix et faible latence.</li>
<li>Testée sur un enregistrement vidéo de 2 heures sur iPhone, sans hub USB alimenté... Ça a tenu!</li>
<li>Devrait fonctionner de la même manière sur la UMC204HD (4 sorties, et midi en plus), qui est basée sur la même technologie.</li>
</ul>
<p><strong>Focusrite Scarlett 2i2</strong></p>
<p><a href="https://civade.com/images/ios-external-audio/FocusriteScarlett2i2.jpg"><img src="https://civade.com/images/ios-external-audio/.FocusriteScarlett2i2_m.jpg" alt=""></a></p>
<ul>
<li>2 entrées XLR/Jack Mic/Line</li>
<li>2 sorties ligne sur Jack 6.35</li>
<li>1 sortie casque avec potentiomètre de volume</li>
<li>Bouton "Direct Monitor" permettant de sélectionner le son provenant de la carte ou le monitoring direct de l'entrée.</li>
<li>Alimentation fantôme 48V débrayable</li>
<li>Max 24 bits / 192 kHz.</li>
<li>Tarif indicatif 160/170€</li>
</ul>
<p>Détectée sans soucis. Je n'ai pas non plus trouvé comment passer l'enregistrement en 48Khz ou plus, il est par défaut en 44.1/16bits stéréo.</p>
<ul>
<li>Une fois branché, les entrées et sorties prises en compte par l'iPhone sont celles de la carte.</li>
<li>L'appui sur le bouton "Direct Monitor" permet d'entendre ce qui est capté par les entrées et sera enregistré.</li>
<li>Chouette qualité sonore, mais le prix l'est aussi.</li>
<li>Un peu lourde.</li>
</ul>
<p><strong>Zoom H1n</strong></p>
<p><a href="https://civade.com/images/ios-external-audio/zoom-h1-n.jpg"><img src="https://civade.com/images/ios-external-audio/.zoom-h1-n_m.jpg" alt=""></a>__</p>
<ul>
<li>Micros stéréo X/Y intégrés</li>
<li>Enregistrement 24 bits 96 kHz</li>
<li>Entrée ligne externe</li>
<li>Sortie ligne ou casque</li>
<li>Tarif indicatif : 90€</li>
</ul>
<p>Le Zoom H1 est un enregistreur audio autonome. Toutefois, on peut le brancher sur un ordi en USB (ou l'iPhone) et dans ce cas, après avoir sélectionné le mode "Sound card" parmi les 2 modes disponibles (SD Card ou Sound card), il est correctement détecté par l'iPhone.</p>
<ul>
<li>On peut choisir de passer en contrôle de gain automatique, ou manuel (et dans ce cas il faut régler le niveau d'entrée).</li>
<li>On peut brancher un casque sur la sortie 3.5 stéréo, et ainsi disposer du monitoring.</li>
<li>Détecté directement, et ne nécessite pas de hub USB alimenté (très faible consommation).</li>
<li>Marche nickel.</li>
</ul>
<h3>Conclusion :</h3>
<p>Le choix de la solution dépend clairement du scénario d'usage.</p>
<ul>
<li>Un micro avec connecteur lightning sera clairement la solution la plus compacte et transformera votre iphone... mais ne sera utilisable que sur iphone. Et quand Apple basculera l'USB 3 sur tous les téléphones, cet accessoire deviendra obsolète.</li>
</ul>
<ul>
<li>Brancher une carte son peut être intéressant pour récupérer un signal en sortie de table dans un concert, ou pour raccorder des micros spécifiques (ex: micros canons pour faire de la prise de sonore animalière ou sur une conférence lorsque l'on est loin). C'est plus adaptable, mais plus encombrant, et il faudra beaucoup de fils. L'alimentation de la carte son par hub USB est quasiment obligatoire. Mais la carte pourra servir à autre chose (dans son home studio par exemple).</li>
</ul>
<ul>
<li>Utiliser un micro enregistreur de type H1 peut s'avérer être plus pratique (config plus light). Le H1 est utilisable seul pour faire des prises de son de répétition, ou de conférences. Par contre il faudra le mettre en situation pour tirer parti du couple de micros à 90 degrés, qui ne sont pas très directif. De nombreux autres enregistreurs de ce type existent, mais il faudra prendre soin de valider qu'ils fonctionnent bien en USB "Class Compliant" (ex : Tascam DR-05x, Philips DVT6110, etc...).</li>
</ul>
<p>C'est à vous de voir !</p>https://civade.com/post/2023/01/23/Enregistrement-audio/vid%C3%A9o-avec-carte-son-externe-sur-iphone-ipad#comment-formhttps://civade.com/feed/atom/comments/121Ampli guitare Boss Katana, CME WIDI UHost, BLE et transformation d'un pédalier Beringher FCB1010 en bluetooth avec un ESP32urn:md5:867c98eba0df4881de48fabeaa8bea142022-12-24T08:00:00+01:002024-02-27T06:34:34+01:00jphiDIY-MusiqueArduinoDIYEmbarquéESP32FirmwareMusiqueOpenSource<p>Certes le titre est long, mais c'est aussi pour teaser autour des possibilités offerts pour l'édition, le changement de son en live avec un pédalier midi et autres avec un Ampli Boss Katana (ici, MK2, mais cela fonctionnera de la même manière avec un MK1.</p> <h3>L'amplificateur Boss Katana:</h3>
<p>L'amplificateur guitare Boss katana est un produit très intéressant. Si au premier abord cela s'apparente à un ampli guitare, dès qu'on y branche un PC sur la prise USB et que l'on charge l'éditeur de son Boss Tone Studio (BTS) <a href="https://www.boss.info/fr/support/by_product/katana-100/updates_drivers/4f7cb65a-3d35-45ab-b051-bab5f29b722f/">pour mk1</a> ou <a href="https://www.boss.info/fr/support/by_product/katana-100_mk2/updates_drivers/91dc2706-d5c6-4e94-bff9-ad60f13b2e6f/">pour mk2</a> ou même le logiciel libre <a href="https://sourceforge.net/projects/fxfloorboard/files/KatanaFxFloorBoard/">Katana FX Floorboard</a> c'est une autre histoire.</p>
<p><a class="media-link" href="https://civade.com/images/bt-katana/katana-100-mkii.jpg"><img alt="" class="media" src="https://civade.com/images/bt-katana/.katana-100-mkii_m.jpg" /></a></p>
<p>On découvre un monde de possibilités permettant de programmer de nombreux effets simultanés et les modélisations d'amplis, et de les stocker dans l'un des 9 emplacements mémoires. Cela va bien au delç des possibilités de changements de sons offertes par le panneau avant, la plupart des réglages avancés n'étant disponibles que par éditeur. On peut brancher des équipements avancés soit sur la prise USB, qui expose non seulement une prise midi, mais aussi un port audio permettant des enregistrements, mais aussi sur une prise dédié aux accessoires Boss: GA/FC.</p>
<h3>Le Pédalier Midi Boss</h3>
<p>Boss commercialise un pédalier midi, qui se connecte par l'interface "GA/FC", dédiée au pédalier du même nom. Toutefois, ce produit n'est pas donné non plus (160 €pour la version EX, qui permet d'exploiter presque pleinement le katana).</p>
<h3>Le pédalier midi Xsonic</h3>
<p>Xsonic commercialise un autre pédalier pour le Katana, le Aitrstep Kat Edition. Avec des fonctionnalités similaires à celui de boss, il ajoute une interface Bluetooth qui permet de connecter un téléphone avec le pédalier, lui même étant relié en USB à l'ampli. On a ainsi la possibilité d'éditer les sons par téléphone ou tablette ET de commuter les sons. C'est simpa, mais pas donné (175 € également). On le trouve beaucoup moins cher chez Aliexpress (autour de 100€). Par contre cela suppose de brancher un cable usb sur scène, et on sera forcément limité par la longeur de cable (2.5mètres max).</p>
<h3>Et le bluetooth sur le Katana alors?</h3>
<p>Mais seul un produit de la gamme Katana est doté d'une interface Bluetooth native.... Heureusement, le fabriquant CME a développé une interface nommée "Widi Uhost". Elle se branche su rle port USB, est toute petite et ajoute à l'ampli la possibilité de communiquer en Bluetooth Midi.</p>
<p><a class="media-link" href="https://civade.com/images/bt-katana/CME_WIDI_UHOST_1.jpg"><img alt="" class="media" src="https://civade.com/images/bt-katana/.CME_WIDI_UHOST_1_m.jpg" /></a></p>
<p>Cette interface est paramétrable par une application gratuite sur les stores. Elle lui permet de devenir host ou device Bluetooth 4 LE (BLE Midi!). Il devient ainsi raccordable à un PC équipé de BT 4.1 minimum (voir BT 5.0), à un téléphone mobile ou une tablette équipé du logiciel Katana Librarian pour <a href="https://play.google.com/store/apps/details?id=com.appsforamps.katana&hl=en&gl=US">Android</a> ou <a href="https://apps.apple.com/us/app/katana-librarian/id1616920240">IOS</a> . Ce dernier logiciel est malheureusement payant (20 euros si mes souvenis sont exacts) mais fait le job.</p>
<p>L'interface CME offre aussi la possibilité pour un périphérique (ex: pédalier Bluetooth) d'envoyer des program et control changes pour changer les sons. La fiche d’implémentation midi précise en effet qu'on peut changer les programmes en envoyant des programmes change (de 1 à 9), et mettre les effets on/off en envoyant des control change (CC 16 à 31), et même d'actionner 2 pédales d'expression sur les contrôles continus 80 et 81... et suivants.</p>
<p>A ce stade, n'importe quel pédalier midi bluetooth programmable devient donc utilsiable pour piloter le Katana, dès lors qu'il a été programmé pour envoyer les program et control changes requis. Rien de bien sorcier...</p>
<h3>Pédalier Midi Behringer FCB1010</h3>
<p>Ayant remisé il y a quelques années un pédalier Behringer FCB1010, je me suis demandé si il n'y avait pas quelque chose à faire avec celui-ci. Pour mémoire, ce pédalier dispose de 10 boutons de changement de sons numérotés 1 à 10, de 2 pédales banque + et banque -, et de 2 pédales d'expression. Il permet aussi de piloter des relais ( x 2) pour allumer ou éteindre des effets externes par exemple.</p>
<p><a class="media-link" href="https://civade.com/images/bt-katana/fcb1010.jpg"><img alt="" class="media" src="https://civade.com/images/bt-katana/.fcb1010_m.jpg" /></a></p>
<h3>FCB UNO V1.0.4</h3>
<p>Le firmware d'origine du pédalier et daté, assez buggé, et surtout ne permet pas de faire une chose qui va vite se révéler essentielle avec le KATANA : le mode "Stomp Box" ou la capacité d'actionner les effets indépendamment; Un développeur membre de la (RIP) communauté Yahoo avait développé un firmware qui corrigeait les bugs et ajoutait une fonctionnalité de stomp boxe: UNO. Avec Uno 1.0.4 et dans le mode stomp box, 5 des pédales sont dédiées au changement de sons et changent avec chaque banque, tandis que 5 autres permettent d'allumer et éteindre les effets et restent avec les mêmes contrôles quel que soit la banque. Cela tombe plutôt bien puisqu'il y a 5 effets simultanés sur le Katana MK2 (3 sur le katana MK1).</p>
<p><a class="media-link" href="https://civade.com/images/bt-katana/uno1.0.4.jpg"><img alt="" class="media" src="https://civade.com/images/bt-katana/.uno1.0.4_m.jpg" /></a></p>
<p>On peut programmer le pédalier équipé avec Uno de façon à ce que les 5 switch "Stomp" soient sur la rangée du haut ou du bas, les 5 autres étant dédiés aux changement de programme.</p>
<p>La dernière version du firmware gratuit (UNO V1.0.4) est trouvable sur le forum dédié au FCB1010 qui a remplacé celui de yahoo : <a href="https://fcb1010.groups.io/g/uno/files/UnO%20firmware%20information/FCB_V104_256.BIN">https://fcb1010.groups.io/g/uno/files/UnO%20firmware%20information/FCB_V104_256.BIN</a> . Ensuite l'auteur est passé sur un tout autre concept, bien plus puissant, mais qui ne nous servira à rien ici. L'eprom UNO 1.0.4 est achetable chez l'auteur au prix de 26 euros (<a href="https://www.fcb1010.eu">https://www.fcb1010.eu</a>), ou sur ebay par exemple à partir de 10€. Vous pouvez la programmez vous même si vous disposez d'un programmateur d'Eprom. C'est l'option que j'ai choisie sur une mémoire (27C256) et remplacé le firmware d'origine par Uno 1.0.4. On peut aussi utiliser une 27C512, mais dans ce cas le firmware devra être chargé 2 fois dans la mémoire, une fois en 0x0000 et une fois en 0x8000.</p>
<p>A la fin de ce port, vous trouverz une revue détaillée des différences entre le UNO et le firmware d'origine.</p>
<h3>Éditeur pour FCB UNO 1.0.4</h3>
<p>A noter qu'éditer les programmes avec le pédalier est très fastidieux, et pas aisé à comprendre. Une lecture attentive de la documentation ( <a href="https://civade.com/images/bt-katana/FCB_UnO_v1_0_4_UserGuide.pdf">FCB_UnO_v1_0_4_UserGuide.pdf</a> ) n'y change malheuresemetn pas grand chose. C'est faisable mais pénible. J'ai rapidement testé divers éditeurs gratuits, pais anciens. Il buggent plus ou moins, et dans certains cas ne reconaissent pas la version 1.0.4, s'arrêtant à la version 1.0.3. Pour ceux qui souhaiteraient exploiter pleinement, je vous recommanderai d'utiliser l'éditeur écrit par l'auteur de Uno: <a href="https://www.fcb1010.uno/">FCB1010 Control Center</a>. Certes il est payant (24 euros), mais est très bien écrit et sable et fonctionne à merveille y compris sous WIndows 11. Il se nomme "FCB1010 Control Center".</p>
<p>Note concernant la documentation : Le manuel de UNO ne reprend pas les manips standard, comme par exemple la calibration des pédales, ou le reset usine de la ram. Gardez donc le sous le coude...ca peut servir ! ( <a href="https://mediadl.musictribe.com/media/PLM/data/docs/P0089/FCB1010_P0089_M_FR.pdf">https://mediadl.musictribe.com/media/PLM/data/docs/P0089/FCB1010_P0089_M_FR.pdf</a> )</p>
<p><br />
<u><strong>Vue du FCB1010 control center :</strong></u></p>
<p><a class="media-link" href="https://civade.com/images/bt-katana/fcb1010ControlCenter.png"><img alt="" class="media" src="https://civade.com/images/bt-katana/.fcb1010ControlCenter_m.png" /></a></p>
<h3>Du bluetooth dans le FCB1010?</h3>
<p>Mais le FCB1010 ne gère que du MIDI filaire.... et il n'y a pas de prise Midi IN sur le Katana 100 MK2. A ce stade, 2 possibilités :</p>
<ul>
<li>Equiper le Katana d'une interface "CME Midi Master", qui parle en bluetooth directement avec le Midi UHost.</li>
<li>Développer sa propre interface Midi Bluetooth et l'intégrer dans le FCB1010</li>
</ul>
<p>C'est sur cette dernière piste que je suis parti, en utilisant un ESP32. En effet, l'ESP parle Bluetooth nativement, dispose de plusieurs ports série matériels et ne coute que 4 euros. Ne prenant que très peu de place, il est facile à intégrer à l'intérieur du FCB1010 et sa faible consommation le rend raccordable à l'alimentation interne 5V existante. Seul bémol, ses interfaces sont en 3.3V alors que le 8032 intégré au FCB1010 parle en 5V. Mais c'est assez facile à régler avec un simple pont diviseur.</p>
<p>Voici le schéma d'interconnexion de l'ESP32 avec l’électronique intégrée du FCB1010. Sur J1, on va 'voler" les signaux à partir de la carte midi du FCB1010, et notamment la sortie série (TX du microcontrôleur 8031) avant qu'elle soit convertie en Midi, la masse et le +5v. L'interface Midi d'origine reste totalement cablée et fonctionnelle. Ainsi le pédalier est capable de sortie en Bluetooth, mais reste éditable en midi avec les prises DIN. Par contre seul le TX étant cablé en bluetooth, il ne sera pas posisble d'éditer le pédalier en bluetooth. Ce serait réalisable en intervenant sur le circuit Midi du FCB 1010 pour mettre en place un aiguillage (interrupteur, ou "OU" logique) sur l'entrée RX du 8032. Il faudra aussi réaliser une adaptation de nivreau (3.3V > 5V). Rien d'impossible mais je n'en voyais pas l'intérêt. Il serait également possible de totalement convertir en BT le FCB. Il suffirant de supprimer la carte midi et de reprendre TX,RX, GND et +5v pour les envoyer vers l'esp32.</p>
<p><a class="media-link" href="https://civade.com/images/bt-katana/schema-esp32-fcb1010.png"><img alt="" class="media" src="https://civade.com/images/bt-katana/.schema-esp32-fcb1010_m.png" /></a></p>
<p>Voici un visuel de la carte MIDI du FCB 1010. C'est sur celle ci que nous allons prélever les signaux pour les diriger vers l'ESP32 (verrs le J1 du schéma).</p>
<p><a class="media-link" href="https://civade.com/images/bt-katana/midi1.jpg"><img alt="" class="media" src="https://civade.com/images/bt-katana/.midi1_m.jpg" /></a></p>
<p>Et voici une vue détaillée cu câblage et du branchement du connecteur Midi / TTL. On voit notamment les 2 résistance qui servent au pont diviseur pour fabriquer le midi out en 3.3V (fil orange).</p>
<p><a class="media-link" href="https://civade.com/images/bt-katana/midi2.jpg"><img alt="" class="media" src="https://civade.com/images/bt-katana/.midi2_m.jpg" /></a></p>
<p><u><strong>Note importante : Attention,vous faut déconnecter le 5V qui va de la carte MIDI vers l'ESP32 lorsque vous brancherez l'USB ppour programmer l'ESP afin d'éviter tout conflit d'alimentation.</strong></u></p>
<h3> </h3>
<h3>Le programme Bluetooth</h3>
<p>Le programme nécessite plusieurs bibliothèques pour pouvoir fonctionner :</p>
<ul>
<li>BLE-MIDI ( https://github.com/lathoub/Arduino-BLE-MIDI ) et ses dépendances
<ul>
<li>MIDI Library</li>
<li>NimBLE-Arduino</li>
<li>ArduinoBLE</li>
</ul>
</li>
</ul>
<p>En fait, BLE-Midi, qui est la bibliothèque constituant le coeur de ce programme, peut travailler avec plusieurs piles Bluetooth:</p>
<ul>
<li>La pile de protocole native de l'ESP32 (ESP32_BLE_Arduino)</li>
<li>La pile de protocole ArduinoBLE</li>
<li>La pile de protocole NimBLE</li>
</ul>
<p>Après plusieurs essais je suis toutefois resté sur NimBLE, car a une empreinte mémoire plus faible et se reconnecte plus rapidement en cas de perte de connexion.</p>
<p>Ce code est basé sur l'exemple MidiBle_Client de la bibliothèque BLE-MIDI". Après s'être connecté sur un "WIDI Uhost" (mais il peut se connecter sur n'importe quel périphérique midi, ou au contraire sur un périphérique Midi avec un SSID très précis). A adapter en fonction de votre matériel...), il se met en lecture de la liaison série 2, connectée au midi out du pédalier. Il prend les messages de type "Control change" et "program Change" et les réexpédie sur BT Midi. Il ne traitera pas les autres messages (Sysex, notes, etc..) puisque inutiles pour nous. En cas de déconnexion les callbacks permettent la reconnexion automatique.</p>
<p>Le code se connecte autotomatiquement à tout "WMIDI Uhost" grace à la ligne "BLEMIDI_CREATE_INSTANCE("WIDI Uhost",MIDI)". Toutefois vous pouvez être encore plus spécifique en précisant l'adresse de VOTRE interface dans le constructeur en utilisant la ligne "BLEMIDI_CREATE_INSTANCE("cd:38:9a:99:67:9f",MIDI)" et en adaptant bien sur l'adresse. Vous pourrer la relever aisément dans la console série de l'ESP32 lors de la 1ere connexion.</p>
<h3>Tests : Couplage du Katana+Midi UHost avec le FCB1010</h3>
<p>Il faut tout d'abord bien avoir programmé l'interface CME à l'aide du logiciel sur mobile. "BLE ROLE" devra avoir été positionné à "Auto - to all BLE MIDI Devices":</p>
<p><a class="media-link" href="https://civade.com/images/bt-katana/Settings-wmidi.png"><img alt="" class="media" src="https://civade.com/images/bt-katana/.Settings-wmidi_m.png" /></a></p>
<p>Pensez à vous déconnecter du télphone/tablette après avoir paramétré le Wmidi Uhost. Le voyant bleu devrait repasser à clignotant.</p>
<p>Ensuite vous pourrez allumer le pédalier et le code de connexion de l'ESP32 se connectera directement au Wmidi Uhost le plus proche..</p>
<p>Dès allumage du pédalier midi, vous pourrez voir le voyant bluetooth du WMIDI passer de bleu clignotant à vert fixe.</p>
<p>A noter que si vous voulez voir ce qu'il se passe, vous pourrez connecter momentanément l'esp32 au PC (en ayant bien déconnecté le +5v venant du pédalier), et ouvert la console série de l'environnement arduino à 115200 bauds. Vous verrez défiler les messages de connexion et éventuelles erreurs.</p>
<h3>La programmation du FCB1010 pour le Katana</h3>
<p>Seulement 2 banques de 5 sons vous seront utiles. La banque 1 sera assignée aux presets A, et la banque 2 aux presets B.</p>
<p>Le 5e son pourra être assigné au "PANEL" sur les 2 banques, tandis que les sont 1 à 4 appelleront le son correspondant dans la banque.</p>
<p>Les 2 pédales pourront être utilisées (cc 80 et 81). Ce sera dans l'édition de son du katana et dans la matrice de modulation que vous pourrez les router ou bon vous semble pour commander la Wah ou l'efficacité du booster par exemple. C'est à vous de choisir.</p>
<p>Comme la communication avec le Katana ne sera qu'unidirectionnelle, vous ne pourrez pas lire l'état d'un effet (on/off) pour un effet/preset donné. Il vous appratiendra donc de mettre en conformité l'état initial des stomp après changement de programmes aux sons que vous aurrez programmés. Vous trouverez un exemple dans la colonne "Stomp" ci dessous.</p>
<pre>
Index | Stompbox name | PC1 PC2 PC3 PC4 PC5 | CC1: on/off CC2: on/off | Note| ExprA:min-max ExprB:min-max | SW | Stomps|
---------------------------------------------------------------------------------------------------------------------------
SB.01 | BOOSTER | ... ... ... ... ... | 016 127 000 ... ... ... | ... | . ... ... ... . ... ... ... | .. | |
SB.02 | MODULARTION | ... ... ... ... ... | 017 127 000 ... ... ... | ... | . ... ... ... . ... ... ... | .. | |
SB.03 | EFFECT | ... ... ... ... ... | 018 127 000 ... ... ... | ... | . ... ... ... . ... ... ... | .. | |
SB.04 | DELAY | ... ... ... ... ... | 019 127 000 ... ... ... | ... | . ... ... ... . ... ... ... | .. | |
SB.05 | REVERB | ... ... ... ... ... | 020 127 000 ... ... ... | ... | . ... ... ... . ... ... ... | .. | |
---------------------------------------------------------------------------------------------------------------------------
Index | Preset name | PC1 PC2 PC3 PC4 PC5 | CC1:val CC2:val | Note| ExprA:min-max ExprB:min-max | SW | Stomps|
---------------------------------------------------------------------------------------------------------------------------
00.01 | Bank A/1 | 001 ... ... ... ... | ... ... ... ... | ... | 1 080 001 127 1 081 000 127 | .. | 00011 |
00.02 | Bank A/2 | 002 ... ... ... ... | ... ... ... ... | ... | 1 080 001 127 1 081 000 127 | .. | 00011 |
00.03 | Bank A/3 | 003 ... ... ... ... | ... ... ... ... | ... | 1 080 001 127 1 081 000 127 | .. | 00011 |
00.04 | Bank A/4 | 004 ... ... ... ... | ... ... ... ... | ... | 1 080 001 127 1 081 000 127 | .. | 10011 |
00.05 | PANEL | 005 ... ... ... ... | ... ... ... ... | ... | 1 080 001 127 1 081 000 127 | .. | 00001 |
01.01 | Bank B/1 | 006 ... ... ... ... | ... ... ... ... | ... | 1 080 001 127 1 081 000 127 | .. | 11011 |
01.02 | Bank B/2 | 007 ... ... ... ... | ... ... ... ... | ... | 1 080 001 127 1 081 000 127 | .. | 01011 |
01.03 | Bank B/3 | 008 ... ... ... ... | ... ... ... ... | ... | 1 080 001 127 1 081 000 127 | .. | 00000 |
01.04 | Bank B/4 | 009 ... ... ... ... | ... ... ... ... | ... | 1 080 001 127 1 081 000 127 | .. | 11011 |
01.05 | PANEL | 005 ... ... ... ... | ... ... ... ... | ... | 1 080 001 127 1 081 000 127 | .. | 00001 |
</pre>
<p> </p>
<h3>ANNEXE 1 le code Arduino pour ESP32</h3>
<pre>
/*
* Katana Midi to bluetooth interface
* Uses a CME WIDI Host as interface on Katana, and an ESP32 integrated into FCB1010
* Since Katana takes program changes to change program, and CC to enable disable effects
* This is the only implemaentation needed.
* ESP32 must be powered by stoling 5V on Midi interface cable (5 pins cable, 4 black & 1 red
* coming from motherboard to midi interface).
* The Midi TX have to be took on the same connector.
* Be careful, Midi TX is 5V. Should be adapted before connecting to RX on ESP32.
* A simple divisor bridge is enough (3.3K/1.8K). Serial 2 is used, and RX assiged to D16.
*/
/* Katana Midi implementation (MK2)
* -----------------------------------------
* Program Change0
* -----------------------------------------
* 1 (00h) Bank A ch 1
* 2 (01h) Bank A ch 2
* 3 (02h) Bank A ch 3
* 4 (03h) Bank A ch 4
* 5 (04h) Panel
* 6 (05h) Bank B ch 1
* 7 (06h) Bank B ch 2
* 8 (07h) Bank B ch 3
* 9 (08h) Bank B ch 4
*
* -----------------------------------------
* Control changes :
* -----------------------------------------
* #16 Booster SW (0>64 off, 64>127 on)
* #17 Mod SW (0>64 off, 64>127 on)
* #18 FX SW (0>64 off, 64>127 on)
* #19 Delay (0>64 off, 64>127 on)
* #20 Reverb (0>64 off, 64>127 on)
* #21 Effect loop (0>64 off, 64>127 on)
* #80 GA/FC exp pedal 1 (FX) (0>127)
* #81 GA/FC exp pedal 2 (VOLUME) (0>127)
* #82 Exp pedal (0>127)
* #83 GA/FC FS1 (0>64 off, 64>127 on)
* #84 GA/FC FS2 (0>64 off, 64>127 on)
*/
#include <Arduino.h>
#include <MIDI.h>
#include <BLEMIDI_Transport.h>
// Using NIMBLE library for transport.
#include <hardware/BLEMIDI_ESP32_NimBLE.h>
//Connect to any BLE server
//BLEMIDI_CREATE_DEFAULT_INSTANCE()
//Connect to a specific model (here CME Widi UHOST)
BLEMIDI_CREATE_INSTANCE("WIDI Uhost",MIDI)
//Connect to a specific BLE address server
//BLEMIDI_CREATE_INSTANCE("cd:38:9a:99:67:9f",MIDI)
struct Serial2MIDISettings : public midi::DefaultSettings
{
static const long BaudRate = 31250;
static const int8_t RxPin = 16;
static const int8_t TxPin = 17;
};
MIDI_CREATE_CUSTOM_INSTANCE(HardwareSerial, Serial2, MIDISerial, Serial2MIDISettings);
unsigned long t0 = millis();
bool isConnected = false;
unsigned char PC=0;
unsigned char CC=16;
unsigned char ONOFF=127;
midi::MidiType MidiType;
unsigned int MidiData1;
unsigned int MidiData2;
unsigned int MidiChannel;
// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
void setup()
{
Serial.begin(115200);
MIDISerial.turnThruOff();
MIDISerial.begin(MIDI_CHANNEL_OMNI);
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
MIDI.turnThruOff();
MIDI.begin(MIDI_CHANNEL_OMNI);
BLEMIDI.setHandleConnected(OnConnected);
BLEMIDI.setHandleDisconnected(OnDisconnected);
}
// -----------------------------------------------------------------------------
// Bridge BT <> Serial
// -----------------------------------------------------------------------------
void loop()
{
// Midi received on midiserial, send it on BT and display it on serial for debug purpose.
if (MIDISerial.read())
{
MidiType=MIDISerial.getType();
MidiData1=MIDISerial.getData1();
MidiData2=MIDISerial.getData2();
MidiChannel=MIDISerial.getChannel();
MIDI.send( MidiType,MidiData1,MidiData2,MidiChannel);
printMidiMsg(MidiType, MidiData1, MidiData2, MidiChannel);
}
// Midi received over bluetooth? Send it on Midiserial, and Display it on serial for debug purpose.
if (MIDI.read())
{
MidiType=MIDI.getType();
MidiData1=MIDI.getData1();
MidiData2=MIDI.getData2();
MidiChannel=MIDI.getChannel();
printMidiMsg(MidiType, MidiData1, MidiData2, MidiChannel);
MIDISerial.send( MidiType,MidiData1,MidiData2,MidiChannel);
}
}
// ====================================================================================
// Event handlers for incoming MIDI messages
// ====================================================================================
// -----------------------------------------------------------------------------
// Device connected
// -----------------------------------------------------------------------------
void OnConnected() {
isConnected = true;
digitalWrite(LED_BUILTIN, HIGH);
Serial.println("---------CONNECTED---------");
isConnected = true;
}
// -----------------------------------------------------------------------------
// Device disconnected
// -----------------------------------------------------------------------------
void OnDisconnected() {
isConnected = false;
digitalWrite(LED_BUILTIN, LOW);
Serial.println("---------NOT CONNECTED---------");
isConnected = false;
}
void printMidiMsg (uint8_t cmd, uint8_t d1, uint8_t d2, uint8_t ch) {
switch (cmd) {
case midi::ActiveSensing:
// Ignore
return;
break;
}
if (ch<10) Serial.print(" ");
Serial.print(ch);
Serial.print(" 0x");
Serial.print(cmd, HEX);
Serial.print(" 0x");
Serial.print(d1, HEX);
Serial.print(" 0x");
Serial.print(d2, HEX);
Serial.print("\t");
switch(cmd) {
case midi::NoteOff:
Serial.print("NoteOff\t");
Serial.print(d1);
Serial.print("\t");
Serial.print(d2);
break;
case midi::NoteOn:
Serial.print("NoteOn\t");
Serial.print(d1);
Serial.print("\t");
Serial.print(d2);
break;
case midi::AfterTouchPoly:
Serial.print("AfterTouchPoly\t");
Serial.print(d1);
Serial.print("\t");
Serial.print(d2);
break;
case midi::ControlChange:
Serial.print("ControlChange\t");
Serial.print(d1);
Serial.print("\t");
Serial.print(d2);
break;
case midi::ProgramChange:
Serial.print("ProgramChange\t");
Serial.print(d1);
break;
case midi::AfterTouchChannel:
Serial.print("AfterTouchChannel\t");
Serial.print(d1);
break;
case midi::PitchBend:
Serial.print("PitchBend\t");
Serial.print(d1);
Serial.print("\t");
Serial.print(d2);
break;
}
Serial.print("\n");
}
</pre>
<h3>ANNEXE2: Différences entre le firmware d'origine Behringer v2.5.1.e et Uno 1.0.4</h3>
<p> </p>
<table>
<tbody>
<tr>
<td><code>Usine v2.5.1.e </code></td>
<td><code>UNO V1.0.4 </code></td>
</tr>
<tr>
<td><code>Merging MIDI IN with FCB-generated messages does not work correctly. This causes (for instance) hanging notes when simulatuously playing a keyboard, connected to MIDI IN, and moving the expression pedal(s).</code></td>
<td><code>Problem solved</code></td>
</tr>
<tr>
<td><code>When powering the FCB while an instrument is connected to the MIDI IN port, the FCB display shows a flashing 88, and the unit does not work correctly (in case the connected instrument sends ActiveSense messages, as many keyboards do)</code></td>
<td><code>Problem solved</code></td>
</tr>
<tr>
<td><code>When MIDI merge enabled, all messages are forwarded from MIDI IN to MIDI OUT port</code></td>
<td><code>ActiveSense messages are no longer forwarded in order to reduce amount of data traffic</code></td>
</tr>
<tr>
<td><code>The global setting for enabling/disabling Running Status does not work</code></td>
<td><code>Problem solved</code></td>
</tr>
<tr>
<td><code>Part of the global setup is not sent along with a sysex dump, and therefore can not be edited using an external PC editor.</code></td>
<td><code>Problem solved</code></td>
</tr>
<tr>
<td><code>While pressing a footswitch, expression pedals cannot be used</code></td>
<td><code>While pressing a footswitch (for instance used as keyboard damper pedal), expression pedals can still be used</code></td>
</tr>
<tr>
<td><code>Receiving a sysex dump is done by going into global setup, pressing a footswitch, and then starting the sysex dump from PC</code></td>
<td><code>A sysex dump can be received at all times without any action required on the FCB1010</code></td>
</tr>
<tr>
<td><code>“Stomp box behavior” : each patch can have 2 CC messages – if both are on the same MIDI channel (global setup) and have the same CC number, it is possible to send 2 toggling values alternately, instead of sending both messages simultaneously.</code></td>
<td><code>Each patch can have 2 independent CC messages (each with its own MIDI channel). For each of these messages, 2 values can be programmed in order to implement toggling behavior – no more need to combine both CC messages for this.</code></td>
</tr>
<tr>
<td><code>“Stomp box behavior” : when clicking a patch or a stompbox, its corresponding LED is lighting up. Impossible to see the status of the stompbox (on or off) or to see the last selected patch after clicking a stompbox.</code></td>
<td><code>“Stomp box behavior”: when clicking a stomp- box, its status (on or off) is shown on its LED. Also, the LED of the last selected patch stays on. Apart from stompboxes, “momentary” (non-toggling) effects are introduced, which also leave the last patch LED on when clicked.</code></td>
</tr>
<tr>
<td><code>Possibility to program 10 banks of 10 presets </code></td>
<td><code>Choice between normal mode (10 banks of 10 presets) or “stompbox mode” : 19 banks of 5 presets (on 1 of the 2 footswitch rows) + 5 global stomp boxes (on the other row).</code></td>
</tr>
<tr>
<td><code>-</code></td>
<td><code>Possibility for “momentary effects” to send the programmed CC number and value when depressing the footswitch, and same CC number with value 0 when releasing the footswitch.</code></td>
</tr>
<tr>
<td><code>Switches can be latched or momentary ( = normally-open, i.e. contact closed as long as a footswitch is depressed )</code></td>
<td><code>Switches can be latched or momentary. When momentary, one can choose between “normally-open” or “normally-closed” behavior (global setting)</code></td>
</tr>
<tr>
<td><code>Each patch can be programmed to turn the 2 switches ON or OFF</code></td>
<td><code>Apart from forcing a switch ON or OFF, a patch can also be programmed to leave a switch unchanged</code></td>
</tr>
<tr>
<td><code>Toggling the switches by pressing 1 key is possible only in DirectSelect mode (using UP/DOWN keys)</code></td>
<td><code>Toggling the switches is possible using any of the stomp boxes</code></td>
</tr>
<tr>
<td><code>Each patch can turn the 2 expression pedals off or turn them on with corresponding CC number</code></td>
<td><code>Apart from forcing an expression pedal ON or OFF, a patch can also be programmed to leave the expr.pedal CC unchanged</code></td>
</tr>
<tr>
<td><code>-</code></td>
<td><code>When moving an expression pedal, the CC value sent is shortly shown on the display</code></td>
</tr>
<tr>
<td><code>-</code></td>
<td><code>Possibility to block repeating PC messages</code></td>
</tr>
<tr>
<td><code>-</code></td>
<td><code>Possibility to disable Behringer taptempo message generation</code></td>
</tr>
<tr>
<td><code>-</code></td>
<td><code>Possibility to change the NoteOn velocity as a global parameter</code></td>
</tr>
</tbody>
</table>
<p> </p>https://civade.com/post/2022/11/19/Ampli-guitare-Boss-Katana%2C-CME-WIDI-UHost%2C-BLE-et-transformation-d-un-p%C3%A9dalier-Beringher-FCB1010-en-bluetooth-avec-un-ESP32#comment-formhttps://civade.com/feed/atom/comments/120Utilisation de multiples entrées physiques pour la détection de longueur d'outil (Probe) dans MACH3urn:md5:b7126215e5ef17503dfe3ba377f134b32022-05-24T20:30:00+02:002024-02-27T06:37:52+01:00jphiMachines à commande numériquesCNCMach3<p>Sur Mach 3, certaines fonctions sont raccordables à une entrée (ex: Probe). Mais que se passe t'il si l'on a plusieurs dispositifs à raccorder sur la même entrée? Si ce sont des interrupteurs mécaniques, , pas de soucis. Cela peut se régler matériellement. Mais si l'on mixe des détecteurs actifs (délivrant une tension) et passifs (interrupteurs) les ennuis commencent.</p>
<p><a href="https://civade.com/images/Mach3/tld.jpg"><img src="https://civade.com/images/Mach3/.tld_m.jpg" alt=""></a></p>
<p>Capteur de longueur d'outil</p> <h3>Pourquoi plusieurs switches?</h3>
<p>Il peut y avoir de multiples raisons. La plus évidente est de vouloir utiliser la détection de longueur d'outil sur plusieurs détecteurs, notamment quand le jeu d'écrans le nécessite comme le Screenset 2010 de Jerry qui utilise 2 capteurs de longueurs, d'outil, l'un fixé sur la table pour avoir une référence, et l'autre mobile pour détecter le zéro pièce. On peut aussi vouloir ajouter à ces 2 détecteurs un palpeur 3D par exemple.</p>
<h3>Série ou parallèle</h3>
<p>Pour des interrupteurs passifs, il n'y a pas de soucis.</p>
<ul>
<li>Si ils sont normalement ouverts au repose, il suffit de les câbler en parallèle.</li>
<li>Si ils sont normalement fermés au repos, il suffit de les câbler en série.</li>
<li>On ne pourra pas mixer des switches normalement ouverts et normalement fermés.</li>
</ul>
<h3>Actif/Actif ou Actif/Passif</h3>
<p>Dans le cas ou l'on a un mixe de switches et de capteurs actifs, il va falloir trouver une solution. Il est tout à fait possible de faire une carte électronique qui conditionne les entrées et fasse un ou logique des différentes entrées sur une unique sortie. Je ne m'étendrai pas sur cette solution, car elle est dépendante du type de détecteurs utilisés (ouvert ou fermé au repos) et des capteurs actifs utilisés (sortie en tension, collecteur ouvert, 5v, 12v, optiques, inductifs, etc..)</p>
<p>Si votre carte dispose de suffisamment d'entrées et que celles si supportent soit des interrupteurs (résistances de tirage au 5V ntégrées) ou des entrées délivrant un niveau logique 5V (les résistances de tirage au 5V sont de suffisamment grande valeur), cela ouvre des possibilités à une solution entièrement logicielle.</p>
<p><a href="https://civade.com/images/Mach3/InputPalpeur.png"><img src="https://civade.com/images/Mach3/.InputPalpeur_m.png" alt=""></a></p>
<p>Mach3 ne prévoit qu'une entrée par fonction. Ainsi, lorsque l'on raccorde une sonde (probe), on l'associe dan Mach3 à une unique entrée. L'astuce consiste donc à reconfigurer Mach3 à la volée pour lui signifier le changement d'entrée. Une fonction spécifique permet ceci : SetInputData . Appelée dans Mach3, elle va permettre de changer l'entrée associée à une fonction.</p>
<p>Usage :
SetInputData ( NuméroEntreeDansMach3, NumeroDeBrocheEntreePhysique, EntréeInverseeOuiNon)</p>
<ul>
<li>NuméroEntreeDansMach3 : A relever dans le fichier XML de définition machine. L'entrée Probe est la 22 par exemple.</li>
<li>NumeroDeBrocheEntreePhysique : Numéro de broche sur le port (ex 10 ou 11 ou 12...)</li>
<li>EntréeInverseeOuiNon : Mettre 1 si la broche est inversée (active à l'état 0).</li>
</ul>
<p>A noter que le numéro de port n'est pas programmable. Pour utiliser cette technique il va donc falloir utiliser le même port pour toutes les entrées à permuter. Dans ce cas de certaines cartes (Exemple: Ethernet Smooth Stepper) qui disposent de l’équivalent de plusieurs ports parallèles, c'est à prendre en compte à la conception.</p>
<p>Avec cette fonction, on va donc pouvoir modifier une macro M1s pour ajouter la permutation d'entrée avant d'utiliser un capteur spécifique par exemple), en n'oubliant pas de remettre l'entrée précédente juste avant de quitter la macro.</p>
<h3>Conclusion :</h3>
<p>Pour conclure, voici les modifications à appliquer sur le screenset 2010 de Gerry, afin d'utiliser une autre entrée pour le capteur fixe sur la table. Le capteur mobile (mesure de la hauteur de la pièce par rapport à la fraise) sera celui qui sera configuré par défaut dans Mach 3. Dans cet exemple, le capteur mobile est sur l'entrée 12 (capteur actif, donne 5v si actif), et le fixe sur la 11 (détecteur normalement ouvert, câblé sur une entrée avec résistances de tirage au 5V). Dans la config par défaut de Mach3, c'est le 12 qui est sélectionné (non inversé)</p>
<p>Pour M6end (changement d'outil)
Ligne138</p>
<pre>SetInputData(22,11,1) ' Fixed switch</pre>
<p>Ligne 162</p>
<pre>SetInputData(22,12,0) ' Back to mobile Switch</pre>
<p>Pour y m881.m1s ( mesue complete de longeur d'outil avec les 2 switches)
Ligne 181</p>
<pre>SetInputData(22,11,1) ' Fixed switch</pre>
<p>Ligne 201</p>
<pre>SetInputData(22,12,0) ' Back to mobile Switch</pre>
<p>Et un aperçu de la macro pour voir comment on substitue l'entrée juste avant la détection :</p>
<pre>
Code "(Probing for Reference Position.....)" ' Puts this message in the status bar
'**************************************
SetInputData(22,11,1) ' Fixed switch
'**************************************
ZPlate = (GetOEMDRO(802) - FirstProbeDist)
Code "G90 G31 Z" & Zplate ' Probe move to current Z - 6 inches
While IsMoving()
Wend
ZPlate = GetVar(2002) ' Read the touch point
Code "G0 Z" & ( ZPlate + FirstRetractDist ) ' Move up .1 inch in case of overshoot
While IsMoving()
Wend
Code "F" & SecondProbeFeed ' Set feedrate to 1 ipm or 25mm/min
ZPlate = (GetOEMDRO(802) - SecProbeDist)
Code "G90 G31 Z" & Zplate ' Probe move to current Z - .25 inches
While IsMoving()
Wend
'**************************************
SetInputData(22,12,0) ' Back to mobile Switch
'**************************************
ZPlate = GetVar(2002) ' Read the touch point
Code "G1 Z" & ZPlate ' Move back to hit point in case of overshoot
While IsMoving()
Wend
</pre>https://civade.com/post/2022/05/24/Utilisation-de-multiples-entr%C3%A9es-physiques-pour-la-d%C3%A9tection-de-longueur-d-outil-%28Probe%29-dans-MACH3#comment-formhttps://civade.com/feed/atom/comments/119Utilisation d'une télécommande "Electronic Handwheel cncdiy.org" sur logiciel de pilotage CNC Mach3urn:md5:f3d403753691549489df6240a10f2a742022-05-21T14:55:00+02:002024-02-27T06:38:58+01:00jphiMachines à commande numériquesCNCDIYMach3<p><strong></strong>On trouve sur ebay, Aliexpress ou Banggood des manettes de pilotage (handwheel) pour le logiciel Mach3 à peu de frais (moins de 35 euros livrées). Il n'y a pas beaucoup d'informations sur les sites concernant le fonctionnement avec Mach3. Ces manettes sont filaires, livrées avec un cordon type téléphone et sans pilote. Mais si cela fonctionne très bien avec le screenset livré avec Mach3 US, ce n'est pas du tout le cas avec d'autres...</p>
<p><a href="https://civade.com/images/Mach3/jog1.jpg"><img src="https://civade.com/images/Mach3/.jog1_m.jpg" alt=""></a></p> <h3>Généralités</h3>
<p>Ces manettes fournissent un jeu réduit de contrôles, mais bien suffisants pour le pilotage d'une machine :</p>
<ul>
<li>Arrêt d'urgence</li>
<li>Contrôle des axes X,Y,Z,A,B,C à l'aide d'une petite manette de jeu "PS".</li>
<li>Contrôle de la vitesse de déplacement en positionnement (+/-)</li>
<li>Modulation de la vitesse d'avance (Feed Override +/-)</li>
<li>Modulation de la vitesse de broche (Speed Override +/-)</li>
<li>Départ Cycle Usinage</li>
<li>Arrêt Cycle usinage</li>
<li>Marche / Arrêt broche</li>
<li>Rembobinage du programme Gcode</li>
<li>Avance d'un pas dans le programme Gcode</li>
<li>Retour de la machine à l'origine des axes (0,X).</li>
</ul>
<p><a href="https://civade.com/images/Mach3/Mapping.jpg"><img src="https://civade.com/images/Mach3/Mapping.jpg" alt=""></a></p>
<p>A noter que le joystick ne pilotant que 2 axes à la fois, il est nécessaire de cliquer dessus (pression longue en poussant sur le levier du joy) pour changer d'axe entre XY et ZA. Pour changer vers AB, il faut maintenir enfoncées les 2 touches <strong>CycleStart</strong> et <strong>STOP</strong> pendant 2 secondes.
Les axes concernés seront indiqués par une led (XY / ZA / BC). C'est simple, mais efficace et permet de piloter jusqu'à 6 axes.</p>
<p>Ces manettes sont vues comme des périphérique HID (clavier) et envoient des raccourcis clavier tout faits à chaque appui de touche, correspondant à ceux implémentés dans Mach3, sur l'écran d'origine en anglais. Dans cette configuration, cela fonctionne dès déballage, et sans aucune configuration particulière et surtout sans drivers.</p>
<p>Un petit outil en ligne du W3C va nous permettre de relever les codes de la manette : <a href="https://w3c.github.io/uievents/tools/key-event-viewer.html">https://w3c.github.io/uievents/tools/key-event-viewer.html</a>. Je les mets ici pour référence :</p>
<ul>
<li>Arrêt d'urgence : <strong>'²'</strong></li>
<li>Spindle On/Off: <strong>F5</strong></li>
<li>Rewind : <strong>CTRL + 'Z'</strong></li>
<li>Single BLK : <strong>ALT + 'N'</strong></li>
<li>Origin : <strong> CTRL + 'O'</strong></li>
<li>Feed rate + : <strong>F11</strong></li>
<li>Feed rate - : <strong>F10</strong></li>
<li>Cycle Start : <strong>ALT + 'R'</strong></li>
<li>Stop : <strong>ESCAPE</strong></li>
<li>Spindle Speed up : <strong>NUMPAD +</strong></li>
<li>Spindle Speed down : <strong>NUMPAD -</strong></li>
<li>Jog speed + : <strong>'$'</strong></li>
<li>Jog Speed - : <strong> '^'</strong></li>
<li>Jog X+: <strong>Flèche Droite</strong></li>
<li>Jog X- : <strong>Flèche Gauche</strong></li>
<li>Jog Y+ : <strong>Fleche Haute</strong></li>
<li>Jog Y- : <strong>Fleche Basse</strong></li>
<li>Jog Z+ : <strong>Page Up</strong></li>
<li>Jog Z- : <strong>Page Down</strong></li>
<li>Jog A+ : <strong>Insert</strong></li>
<li>Jog A- : <strong>End</strong></li>
<li>Jog B+ : <strong>'s'</strong></li>
<li>Jog B- : <strong>'q'</strong></li>
<li>Jog C+ : <strong>'d'</strong></li>
<li>Jog C- : <strong>'z'</strong></li>
</ul>
<h3>Mise en œuvre</h3>
<p>Lorsque l'on utilise d'autres jeux d'écrans écrans (screenset) Mach3, comme l'écran de Mach3 fr, ou le jeu d'écrans 2010 développé par Gerry de CNCWoodworker et francisé par mes soins ( <a href="http://www.thecncwoodworker.com/2010.html">http://www.thecncwoodworker.com/2010.html</a>) c'est beaucoup moins plug and play. En effet, une partie des touches de la télécommande ne pilotent rien, car les raccourcis dans le jeu d'écrans ont étés modifiés. On pourrait penser que c'est mort... En fait pas du tout.</p>
<p>Sur le jeu d'écrans 2010 par exemple, les incompatibilités suivantes ont étés relevées :</p>
<ul>
<li>F5 : va sur le 5e onglet sur le 2010, mais est censé lancer la broche par la télécommande.</li>
<li>CTRL + O sur le 2010 ouvre un nouveau fichier, mais est censer amener la broche à l'origine par la téléccommande.</li>
<li>Pas de boutons sur 2010 pour Feed +/-, Speed +/-, il va falloir les créer...</li>
<li>D'autres raccourcis de 2010 entrent en conflit, comme celui sur le Wizard de Newfangle (à supprimer) et celui sur le homing par laser (à supprimer).</li>
</ul>
<p>Il est possible de changer ces raccourcis dans le jeu d'écrans lui même. Pour ce faire, il va nous falloir le programme gratuit Screen4, à prendre sur la page de téléchargement officielle: <a href="https://www.machsupport.com/downloads-updates/mach3-downloads/">https://www.machsupport.com/downloads-updates/mach3-downloads/</a> .</p>
<p>Screen4 est un peu fragile, n'étant pas forcément très bien écrit et vieux. Cela reste néanmoins possible de faire des choses avec à trois conditions :</p>
<ul>
<li>Le faire marcher dans un mode de compatibilité Windows XP service pack 2. Cela se fait avec bouton de droite dans l'explorateur, résoudre les problèmes de compatibilité et suivre les étapes de l’assistant en forçant le type à XP SP2. Je l'ai fait fonctionner sans soucis sur un Windows 11.</li>
<li>Toujours travailler à partir d'une copie de l'écran que l'on modifie</li>
<li>Ne pas cliquer partout et faire exactement les manips à faire... pas plus :).. Et si on se trompe refaire du début, car empiler les bêtises ne règle rien...</li>
</ul>
<p>Screen4, après téléchargement se comporte de quelques fichiers et d'un exécutable 'screen4.Exe'. Vous pouvez créer un sous dossier dans votre installation Mach3 pour y placer l'ensemble. Pour ma part j'ai également copié le jeu d'écran que je voulais modifier, et l'ai renommé (de "2010 (1920x1080).set" a "2010 (1920x1080)Jog.set").</p>
<p>Nous sommes maintenant prêt à passer en édition. :</p>
<ul>
<li>Lancer Screen4.Exe</li>
<li>Faire CTRL + O pour ouvrir votre jeu d'écrans.</li>
<li>La taille d'écran du jeu d'écrans vous est demandée. Donner la taille réelle, en vous aidant si besoin est des réglages personnalisés.</li>
<li>Si le jeu d'écrans ne tient pas dans l'écran d'édition, il va vous falloir vous débrouiller pour que cela passe, soit en changeant d'écran, ou si il ne manque pas grand chose (ex: édition d'un screenset FULL HD sur un écran full HD) en fermant les fenêtres de gauche (Workbar) , les icônes et la barre de status (en haut dans le menu view),</li>
<li>Une fois en édition, et sans jouer avec l'ascenseur horizontal de Screen4 (sinon cela bugge ! ),<ins><strong> cliquez avec le bouton de droit sur le bouton de fonction de Mach3</strong></ins> que vous voulez programmer sur la télécommande (1, ici <strong>Départ</strong>)</li>
<li>Dans la fenêtre qui s'ouvre, cliquez 2 fois sur la case à cocher "Use HotKey". Le programme vous demande de cliquez sur la touche concernée du clavier. Ici, appuyez sur le bouton de la télécommande ('Cycle Start"). Le code de la touche concernée se renseigne automatiquement (en jaune)</li>
<li>Enfin, faire OK (3)</li>
<li>Pour désactiver un raccourci, il suffit de décocher le raccourci et faire ok.</li>
</ul>
<p><a href="https://civade.com/images/Mach3/2022-05-23_19_50_04-2010__1920x1080_Jog.set_-_Screen4.png"><img src="https://civade.com/images/Mach3/2022-05-23_19_50_04-2010__1920x1080_Jog.set_-_Screen4.png" alt=""></a></p>
<ul>
<li>Refaire de même avec toutes les fonctions de la télécommande / boutons sur l'interface.</li>
<li>A noter qu'en ce qui concerne les raccourcis associés au joystick, c'est pas là que cela se passe, mais dans mach3, mais les réglages par défaut font très bien...</li>
<li>A noter également, que le raccourci de l'icone "ouvrir" (CTRL + O) entre en conflit avec le raccourci "Origine" de la télécommande. Il faut le désactiver (décocher la case raccourci) ou en mettre un autre (ex: Shift + ctrl + o?)</li>
</ul>
<p><strong>Je ne trouve pas la fonction de ma télécommande dans le jeu d'écrans!</strong>
Et si, pour certaines fonctions de la télécommande, vous ne trouvez pas le bouton qui va bien dans le jeu d'écrans??? C'est exactement ce qui m'est arrivé sur le jeu d'écrans 2010, sur les boutons Feed rate +/- et Speed rate +/-. C'est Gerry, l'auteur du jeu d'écrans 2010 qui m'a donné la solution. Si les boutons manquent, il suffit de les ajouter! Comme il n'y a pas la place de le faire, il suffit de le faire hors écran, avec un bouton transparent ("<strong>image button</strong>"):
<a href="https://civade.com/images/Mach3/2022-05-24_06_06_36-2010xJog.set_-_Screen4.png"><img src="https://civade.com/images/Mach3/.2022-05-24_06_06_36-2010xJog.set_-_Screen4_m.png" alt=""></a></p>
<p>Il faut bien sur assigner non seulement la fonction que le bouton est censée commander (ie: OEM Code Function), cocher "<strong>display on all screens</strong>" pour que la fonction soit active quel que soit l'onglet actif du jeu d'écrans 2010, et surtout le raccourci clavier associé, par apprentissage avec la télécommande comme précédemment.</p>
<p>Pour récupérer les codes de fonction OEM associés à la fonction, le plus simple est d'ouvrir le jeu d'écrans d'origine de Mach3 (1024.set) et relever les codes des boutons qui nous manquent., puisque justement la télécommande a été conçue pour lui...</p>
<p>Honnêtement j'ai du refaire la manipulation plusieurs fois lorsque j'ai modifié le jeu d'écrans de Gerry dans sa version Full HD, car Screen4.Exe n'est pas très à l'aise pour modifier un écran d'une taille supérieure ou égale à l'écran de votre ordinateur. Et quand on se rate, le jeu d'écran n'est tout simplement plus fonctionnel dans Mach3 (écran blanc).</p>
<p>Voici les Fonctions et Code OEM correspondants :</p>
<ul>
<li>Feed rate - (F10) : HotKey 121, Oem Code 109</li>
<li>Feed rate + (F11) : HotKey 122, Oem Code 108</li>
<li>Speed rate - (NUMPAD -) : Hotkey 109, Oem Code 164</li>
<li>Speed rate + (NUMPAD + ) : Hotkey 107, Oem Code 163</li>
</ul>
<h3>Conclusion</h3>
<p>Un point intéressant, c'est que si au départ, je trouvais assez "bidouille" le fait d'utiliser une télécommande qui envoie des raccourcis clavier, c'est que cela ne nécessite aucun driver,et pourrait être utilisé sur d'autres logiciels, en adaptant les raccourcis dans celui-ci.</p>
<p>Autre point intéressant et ouvrant les scénarios d'usage de la télécommande : la télémaintenance. Si comme moi vous pouvez être amenés à manipuler la machine qui a Mach3 à l'aide d'un logiciel de prise de main à distance pour pouvoir la déporter, sachez que la télécommande peut être raccordée en USB à la machine qui prend la main. En effet, comme c'est vu comme un clavier, il n'y a pas de drivers et les raccourcis transitent très bien dans un programme de prise en main à distance (ex : Teamviewer).</p>
<p>Enfin, bien que non testé, il n'y aurait théoriquement pas de problèmes pour adapter certains écrans de Mach4 à cette télécommande.</p>
<p>Un point négatif est que certains raccourcis claviers, sur certains jeu d'écrans, ne sont disponibles que sur certains écrans. Par exemple, sur le jeu d'écrans 2010, la touches départ cycle n'est disponible que dans l'écran "Marche" (F1) et les fonctions de modifications de la vitesse de Jog que dans l'écran de Jog (F3). Cela pourrait se contourner an ajoutant de nouveaux boutons cachés,visibles sur tous les écrans, avec les mêmes fonctions et raccourcis que les boutons tributaires des touches de fonction. C'est non testé, mais cela devrait marche.</p>
<p>Sur le screenset 2010, le mode de Jog est sélectionnable avec le raccourci clavier "<strong>End</strong>" (code touche 35). Cela pourrait être intéressant de changer ce raccourci pour y associer la touche "Single BLKC" de la télécommande, dont l'utilité m'échappe. J'ai testé et c'est effectivement plus pratique.</p>
<p>Autre point négatif d'une télécommande fonctionnant en mode clavier par rapport à une fonctionnant avec un pilote, c'est quelle marche dans tous les logiciels justement.. Et donc écrira ou fera des choses dans ce logiciel. Sur un traitement de texte ou Cambam, c'est pas forcément génial. mais bon...</p>
<p>Encore un autre point négatif est que sur la version française de Mach3, le raccourci clavier CTRL + O est associé à "Fichier / Ouvrir" via l'icone d'ouverture de fichier sur la barre d’icône de mach3.. Il suffit de supprimer le raccourci d'ouverture pour le remplacer par un autre (ex: Shift + ctrl +o) et de monter le raccourci d'origine machine du jeu d'écran 2010.</p>
<p>Mais à 35 euros, et même si elle n'est que filaire, il me reste que l'apport de cette télécommande est non négligeable sur une config de pilotage de CNC.</p>
<p>Il faudra pensez à appuyer sur F1 pour se mettre dans l'écran marche pour toutes les commandes liées à l'usinage, et F3 pour se mettre dans l'écran de Jog lors des manips de déplacement de fraise.</p>
<p>Voici l'intégralité des écrans 2010 de Jerry, modifiés pour fonctionner avec la manette: <a href="https://civade.com/images/Mach3/Jog2010.zip">Jog2010.zip</a></p>https://civade.com/post/2022/05/21/Utilisation-d-une-t%C3%A9l%C3%A9commande-Electronic-Handwheel-cncdiy.org-sur-logiciel-de-pilotage-CNC-Mach3#comment-formhttps://civade.com/feed/atom/comments/118Passerelle internet avec DD-WRT et iphoneurn:md5:b6527daee974f41f70d93bcd76b348642022-01-30T10:29:00+01:002024-02-24T18:14:44+01:00jphiLogiciels LibresEmbarquéFirmwareLinuxOpenSourceSysadmin<p>Un ami m'ayant donné un routeur Linksys WRT1200 'brické', je me suis attelé à lui redonner vie. Démontage, branchement de la liaison série, réinjection du firmware d'origine, et hop! Mais ce routeur supportant aussi le firmware alternatif DD-WRT, pourquoi pas lui faire une petite mise à jour? Ce fut rapidement fait et une découverte de taille m'attendait. Cela faisait un bail que je n'avais pas joué avec DD-WRT. Depuis, il a pas mal gonflé en fonctionnalité, et l'un d'entre elle est particulièrement intéressante en cas de panne d'ADSL/Fibre : l'utilisation d'un iphone sur la prise USB du routeur pour fournir une connexion Internet filaire ou Wifi via DD-WRT. Ce billet n'a d'autres ambition que de garder une trace de la config effectuée pour réemploi ultéreur. Si il peut vous servir tant mieux!</p> <h3>Débrickage du routeur WRT1200:</h3>
<p>La méthode de débrickage d'un appareil Linksys commence souvent par la même chose, le démontage du boitier pour trouver le connecteur qui porte la liaison série. Ensuite, à l'aide d'un adaptateur USB <> série 3.3V, on connecte à l'ordinateur et on vérifie en se connectant à 115200 bauds avec un émulateur série (ex: putty..) que l'on a bien un affichage. La suite est souvent fonction de l'apareil Linsys à débricker.</p>
<p>Ici nous allons d'abord faire sur un peu de réseau :</p>
<ul>
<li>Télécharger la dernière version du firmware pour ce routeur chez linksys</li>
<li>Créer un répertoire c:\ftp et y placer une copie de ce firmware que l'on aura préalablement renommée linksys.img</li>
<li>Connecter un câble réseau de l'ordinateur à l'un des ports lan du routeur,</li>
<li>Mettre une IP fixe sur ce port Ethernet sur l'ordinateur en 192.168.1.2.</li>
<li>Télécharger et installer un serveur TFTPD open source (<a href="https://bitbucket.org/phjounin/tftpd64/downloads/">par exemple TFTPD</a>),</li>
<li>Le paramètrer pour servir ses fichiers de c:\ftp sur la liaison Ethernet qui porte l'adresse 192.168.1.2</li>
<li>Et voial! L'ordinateur est prêt à envoyer le firmware en TFTP.</li>
</ul>
<p>Revenirt sur le routeur que l'on reboote, et interrompre le boot en tapant un caractère quelconque sur la console série assez rapidement après reset. Taper ensuite es commandes suivantes :</p>
<pre>
setenv ipaddr 192.168.1.1
setenv serverip 192.168.1.2
setenv firmwareName linksys.img
run update_both_images
</pre>
<p>Le routeur va lancer la procédure de mise à jour en s'adressant en serveur tftp pour télécharger l'image puis la flasher. A l'issue, le routeur reboote et devrait être accessible et fonctionnel.</p>
<p>Pensez à la fin à démonter la config réseau faite précédemment (IP fixe, serveur TFTP..) pour revenir en DHCP.</p>
<p>Pour voir la méthode en vidéo, <a href="https://www.youtube.com/watch?v=PZYXKAkuJ5w">c'est ici</a>.</p>
<h3>Installation de dd-wrt :</h3>
<p>La procédure d'installation générique est simple :</p>
<ul>
<li>On cherche son routeur dans la <a href="https://dd-wrt.com/support/router-database/">base de données DD-WRT</a> et prenant bien soin de sélectionner la version du matériel concernée (dans mon cas un V2... l'étiquette signalétique vous le dira, c'est marqué dessous).</li>
<li>Comme nous avons mis lors de l'étape précédente un firmware Linksys dont nous avons confirmé le fonctionnement, nous allons pouvoir flasher le notre avec la méthode "Web" en utilisant tout simplement l'interface de gestion linksys pour injecter notre firmware. Celui à télécharger dans ce cas est factory-to-ddwrt.bin</li>
<li>Pour les plus téméraires, il est également possible d'aller chercher la dernière version compilée dans les betas ( <a href="https://dd-wrt.com/support/other-downloads">https://dd-wrt.com/support/other-downloads</a> ). Pour ne rien vous cacher, c'est ce que j'ai fait :).</li>
<li>Aller dans la page de mise à jour du firmware sur l'interface usine linksys et envoyez votre nouveau firmware.</li>
<li>Quelques minutes plus tard votre routeur est à jour sur dd-wrt ! Vous pouvez vous y connecter en 192.168.1.1.</li>
</ul>
<h3>Paramétrage d l'iphone tethering (ou partage de connexion)</h3>
<p>La première opération à faire va être de paramétrer l'Iphone Tethering dans le basic setup. Vous pourrez également paramétrer la passerelle (Gateway) et le serveur DNS local. <strong>(cliquez sur les images pour zoomer)</strong></p>
<p><a href="https://civade.com/images/ddwrt/ddwrt-wrt1200-1.png"><img src="https://civade.com/images/ddwrt/.ddwrt-wrt1200-1_m.png" alt=""></a></p>
<p>Vérifier ensuite dans l'advanced routing que vous êtes bien en mode passerelle (Gateway). En routeur, cela ne semble pas fonctionner.</p>
<p><a href="https://civade.com/images/ddwrt/ddwrt-wrt1200-2.png"><img src="https://civade.com/images/ddwrt/.ddwrt-wrt1200-2_m.png" alt=""></a></p>
<p>Aller ensuite dans services / usb pour activer l'USB et l'USB over IP</p>
<p><a href="https://civade.com/images/ddwrt/ddwrt-wrt1200-3.png"><img src="https://civade.com/images/ddwrt/.ddwrt-wrt1200-3_m.png" alt=""></a></p>
<p>Nous allons maintenant rebooter le routeur en allant dans Administration / Management</p>
<p><a href="https://civade.com/images/ddwrt/ddwrt-wrt1200-4.png"><img src="https://civade.com/images/ddwrt/.ddwrt-wrt1200-4_m.png" alt=""></a></p>
<p>Tout en bas de page, cliquer sur Rebot router. Brancher l'iphone sur la prise USB à l'arrière à l'aide d'un cordon "DATA/Charge". Activez le partage de connexion internet dans "Réglages".</p>
<p><a href="https://civade.com/images/ddwrt/ddwrt-wrt1200-5.png"><img src="https://civade.com/images/ddwrt/.ddwrt-wrt1200-5_m.png" alt=""></a></p>
<p>Le routeur va mettre 2 minutes à rebooter. Au bout d'un certain temps vous devriez entendre le signal sonore indiquant que l'iphone est en train de charger (bonne nouvelle, c'est que l'USB est bien activé).</p>
<p><strong>Une vingtaine de secondes plus tard, en déverrouillant l'Iphone, vous devriez voir une demande d'autorisation d'accès par l'ordinateur. Répondez oui et tapez votre code pour valider la demande. Encore une vingtaine de secondes plus tard, la barre verte en haut de l'iphone s'affiche, montrant que sa connexion est partagée.</strong></p>
<p>Le demande d'autorisation de l'iphone devra être redonnée à chaque reboot du routeur.</p>
<h3>Tests:</h3>
<p>Se connecter avec l'ordinateur sur le wifi du point d'accès (défaut dd-wrt sans mot de passe). Vérifiez que vous avez bien accès à l'internet. Faire le même test en filaire après avoir coupé le wifi.</p>
<p>Vous pouvez également vérifier le status du routeur dans son interface de gestion (Status / Wan). La partie haute vous montre si vous êtes connecté :</p>
<p><a href="https://civade.com/images/ddwrt/ddwrt-wrt1200-6.png"><img src="https://civade.com/images/ddwrt/.ddwrt-wrt1200-6_m.png" alt=""></a></p>
<p>La partie basse de cette même page vous permet même d'avoir un graphe de charge de la liaison internet :</p>
<p><a href="https://civade.com/images/ddwrt/ddwrt-wrt1200-7.png"><img src="https://civade.com/images/ddwrt/.ddwrt-wrt1200-7_m.png" alt=""></a></p>
<h3>A ne pas faire :</h3>
<ul>
<li>Ne jamais faire d'appui très long sur le bouton de reset après avoir débranché puis rebranché l'alimentation (reset hardware). Cela plante complètement le routeur. Un appui de plus de 5 secondes lors qu'il est déjà lancé suffit à le faire revenir sur une config par défaut.</li>
</ul>
<h3>Conclusion :</h3>
<p>C'est une solution sympa, pour mettre en place une connexion partagée lors d'une séance de travail partagée dans une asso par exemple, ou lorsque la connexion personnelle ou professionnelle a plantée.. Il suffit de brancher son iphone sur le routeur, l'allumer, et hop un wifi de secours ! Et franchement cela fonctionne plutôt pas mal.</p>
<p>Je n'ai pas pu tester sur Android, mais paradoxalement il semblerait que cela soit plus compliqué que sur IOS car il faut un pilote noyau Linux pour le téléphone. Pour une fois qu'un truc de geek est plus simple sur IOS que sur Android..</p>
<p>Il vous faudra encore mettre en place la sécurité sur le Wifi, etc.. mais vous verrez lors de la découverte des fonctionnalités de DD-WRT qu'il permet de faire beaucoup de choses. C'est un vrai couteau suisse :</p>
<ul>
<li>Portail captif</li>
<li>Client et Serveur OpenVPN</li>
<li>Client et Serveur PPTP</li>
<li>Serveur Radius</li>
<li>Serveur NAS (d'autant qu'il reste encore une Prise SATA/USB2 pour brancher un disque externe) et gestion des utilisateurs</li>
<li>Serveur NFS</li>
<li>Serveur DLNA (multimedia)</li>
<li>Serveur d'impression USB</li>
<li>Paramétrage fin du Firewall, du routage SPI (stateful packet inspection avec Iptables), de la QOS (Qualité de Service)</li>
<li>Support de l'Upnp (universal plug and play), d'une DMZ (zone démilitarisée pour mettre un serveur par exemple)</li>
<li>... et bien d'autres trucs encore!</li>
</ul>https://civade.com/post/2022/01/30/Passerelle-internet-avec-DD-WRT-et-iphone#comment-formhttps://civade.com/feed/atom/comments/117Ballade autour des télécommandes infrarouge, linux, esp32 et node-redurn:md5:b2b744825383551fd45931ff94d7aa5e2021-05-14T07:00:00+02:002024-02-27T06:41:53+01:00jphiTechnologiesArduinoEmbarquéESP32ESP8266FirmwareLinuxOpenSourceSysadmin<p>On a tous de nombreux appareils qui fonctionnent avec des télécommandes infrarouge. Du coup, on a tous à un moment donné pensé à acheter ou acheté une télécommande dite "universelle" pour les remplacer toutes. Expérience utilisateur rarement réussie, car outre le fait qu'il suffisait de la perdre (comme les autres), la complexité de ces télécommande les rendait parfois inutilisables.</p>
<p>A part quelques rares produit comme les lignes Pronto de Philips, qui arboraient un splendide afficheur LCD et une programmabilité à toute épreuvre, l'expérience était rarement transformée.</p>
<p>A l'heure ou beaucoup de nouveaux équipements sont connectés, en Bluetooth, réseau filaire ou Wifi, a quoi cela sert t'il donc de se préoccuper de l'infra rouge? Et bien justement pour permettre à certains de ces anciens appareils de rester au sein de l’univers audio vidéo familial et de les doter d'une connectivité plus moderne.</p>
<p><a href="https://civade.com/images/ir/remotes.jpg" title="remotes.jpg, mai 2021"><img src="https://civade.com/images/ir/.remotes_m.jpg" alt="remotes.jpg, mai 2021"></a></p> <p>Le sujet est assez vaste, donc j'ai plutôt choisi de faire une suite de 4 articles sur le même sujet :</p>
<ul>
<li>Un premier article pour faire le tour des télécommandes infrarouge. Mieux comprendre les codes, les moyens de capturer ceux ci et les analyser, voir émettre des codes à partir d'un logiciel sur PC et enfin constituer un fichier de configuration avec tous les codes d'une télécommande.</li>
<li>Un second article pour apprendre à installer et configurer LIRC sur Raspberry PI ou Orange PI, afin de dealer avec la réception de codes infrarouge ou d'en émettre.</li>
<li>Un troisième article pour développer un petit périphérique embarqué à base d'ESP32 permettant d'émettre les codes IR, en recevant les ordres à partir du réseau Wifi</li>
<li>Un dernier article pour réaliser sous NodeRed un centre de contrôle, permettant de recevoir des ordres aussi bien par un récepteur IR sur la Raspberry / Orange PI ou par une télécommande sur interface web (application mobile) pour relayer ces ordres vers un émetteur à base d'ESP32 susceptible d'émettre un code infrarouge n'importe ou dans le réseau Wifi.</li>
</ul>
<p>L'objectif final étant pour moi de pouvoir placer un récepteur infrarouge susceptible de comprendre mes télécommandes, mais aussi de pouvoir ajouter le pilotage par application mobile d'appareils qui peuvent être hors de portée, soit parce que dans un placard, soit parce que les télécommandes ne peuvent les accrocher correctement. Cerise sur le gâteau, il est évidemment possible d’interfacer le tout de node red vers Google Home ou Alexa, afin de rajouter un pilotage à la voix sur un périphérique... (OK Google Allume Ampli, OK Google ampli sur DVD, OK Google éteint Télé...).</p>
<p>Au passage nous allons également voir comment utiliser la prise IR In des amplis NAD... ou de récupérer une vielle télécommande Infrarouge pour l'interfacer avec n'importe quoi.</p>
<p>Sommaire :</p>
<ul>
<li><a href="https://civade.com/post/2021/05/02/IR-remote-1/4-%3A-Comprendre-et-analyser-les-signaux-d-une-télécommande-infrarouge">IR remote 1/4 : Comprendre et analyser les signaux d'une télécommande infrarouge</a></li>
<li><a href="https://civade.com/post/2021/05/02/IR-remote-2/4-%3A-Emission-réception-infrarouge-via-LIRC-sur-Raspberry-PI-ou-Orange-Pi">IR remote 2/4 : Emission réception infrarouge via LIRC sur Raspberry PI ou Orange Pi</a></li>
<li><a href="https://civade.com/post/2021/05/02/IR-remote-3/4-%3A-Emetteur-infrarouge-/-wifi-sur-ESP32">IR remote 3/4 : Emetteur infrarouge / wifi sur ESP32</a></li>
<li><a href="https://civade.com/post/2021/05/02/IR-remote-4/4-%3A-Télécommande-Wifi-avec-Nodered-LIRC-ESP32">IR remote 4/4 : Télécommande Wifi avec Nodered + LIRC + ESP32</a></li>
</ul>
<p>Bonne lecture.</p>https://civade.com/post/2021/05/02/Ballade-autour-des-t%C3%A9l%C3%A9commandes-infrarouge%2C-linux%2C-esp32-et-node-red#comment-formhttps://civade.com/feed/atom/comments/112IR remote 4/4 : Télécommande Wifi avec Nodered + LIRC + ESP32urn:md5:9c5f1a7d41b00da6607b67eac79e85d02021-05-02T06:47:00+02:002024-02-27T06:40:37+01:00jphiTechnologiesArduinoDomotiqueEmbarquéESP32ESP8266FirmwareOpenSourceRaspberrySysadmin<p>Dernier article de la série, nous allons maintenant utiliser toute ce qui a été appris dans les 3 articles précédents et l'intégrer ans Node-red.</p> <h3>Fonctionnement final souhaité</h3>
<p>Mon ampli AV étant dans un placard généralement fermé, la télécommande infrarouge est donc inutilisable.</p>
<p>Dans les scénarios d'usage de cet ampli, je souhaiterais pouvoir l'allumer et choisir les entrées sans ouvrir le placard. Accessoirement, comme je veux l'utiliser aussi bien en config A/V avec la télévision, ou en Air Play via un point d'accès Apple dont l'audio est raccordé sur une entrée auxiliaire de l'ampli, il me faut pouvoir changer l'entrée. Évidemment le réglage du volume sonore est aussi un point important, car en A/V il peut y avoir des variations importantes selon les films. Le mode de décodage 5.1 aussi, car en fonction de la source (Airplay ou Netflix par exemple), on peut avoir à passer de 5.1 en stéréo ou vice versa.</p>
<p>Une orange PI (qui ne fait pas que cela) implémente Node Red (voir <a href="https://civade.com/?q=nodered">les articles sur NodeRed</a> sur ce blog..). Comme elle dispose d'une entrée infrarouge, je souhaiterais utiliser le capteur intégré pour comprendre les codes de la télécommande de mon ampli NAD. L'orange PI, vu sa petite taille, pourra rester exposée, derrière la télé (dans un petit boitier <a href="https://civade.com/post/2021/03/07/Boitier-d%C3%A9coupe-laser-pour-orange-Pi-PC-plus">réalisé à l a découpe laser</a>), en profitant du petit espace laissé par le pied entre le dessus du meuble télé et le bas de l'écran (2/3 cm) pour recevoir les codes infrarouge. La configuration de LIRC pour gérer la réception de codes infrarouge a été vues dans le <a href="https://civade.com/post/2021/05/02/IR-remote-2/4-%3A-Emission-r%C3%A9ception-infrarouge-via-LIRC-sur-Raspberry-PI-ou-Orange-Pi">2e article de cette série</a>. Évidemment, il faut avoir compris les codes infrarouges, ce qui est décrit dans le <a href="https://civade.com/post/2021/05/02/IR-remote-1/4-%3A-Comprendre-et-analyser-les-signaux-d-une-t%C3%A9l%C3%A9commande-infrarouge">1er article de la série</a>. Il va nous falloir doter notre réseau d'un périphérique d'émission infrarouge, qui sera connecté à l'ampli en filaire par l'entrée IR IN, et avec une led infrarouge déportée qui sera collée sur la face avant du téléviseur. Ce périphérique est décrit dans <a href="https://civade.com/post/2021/05/02/IR-remote-1/4-%3A-Comprendre-et-analyser-les-signaux-d-une-t%C3%A9l%C3%A9commande-infrarouge">le 3e article de la série</a>.</p>
<p>A avoir Node Red, je souhaite également utiliser l'interface utilisateur (UI) pour disposer d'une interface Web mobile sur les télécommandes des 2 appareils (télé + ampli). Pratique surtout pour l'ampli donc je pourrai contrôler le volume en soirée tant par le smartphone tant que celui-ci est dans le réseau Wifi, et même hors de portée des télécommandes IR.</p>
<p>Enfin, dans node red, il sera facile d'interfacer des fonctions de base avec Google Home (ex : "OK Google Allume NAD"), et donc d'implémenter aussi des commandes vocales.</p>
<p>Au final, l'ampli devra pouvoir être commandé :</p>
<ul>
<li>Avec sa télécommande d'origine dessus (normal quoi!)</li>
<li>Avec sa télécommande d'origine pointée sur l'Orange PI</li>
<li>Avec l'interface Utilisateur (Node-red UI) à partir d'un PC ou d'un Smartphone</li>
<li>En commande vocale par Google Home.</li>
</ul>
<p>Au final, pas si mal pour un ampli de 20 ans qui ne marchait qu'avec une télécommande Infrarouge!</p>
<h3>Synoptique de fonctionnement</h3>
<p><a href="https://civade.com/images/ir/synopIR.png" title="synopIR.png, mai 2021"><img src="https://civade.com/images/ir/synopIR.png" alt="synopIR.png, mai 2021"></a></p>
<h3>Plongée dans Node-Red</h3>
<h4>Recevoir des codes infrarouges venant de LIRC</h4>
<p>Voici la chaine de traitement complète :</p>
<p><a href="https://civade.com/images/ir/capture-irw.png" title="capture-irw.png, mai 2021"><img src="https://civade.com/images/ir/.capture-irw_m.png" alt="capture-irw.png, mai 2021"></a></p>
<p>Bien qu'il existe des nodes spécifiques pour Lirc, ceux ci ne sont pas activement maintenus. Et il y a une raison, c'est que c'est tellement simple de faire cela sans...</p>
<p>En effet, la commande unix '<strong>irw</strong>' permet de lire le socket lirc, et d'afficher une ligne par une ligne les commandes reçues. Les différents champs sont séparés par un espace.
Il suffit donc de trouver un moyen de lancer une commande unix, ce que permet le node "<strong>Exec</strong>". Ici, on utilise le mode "respawn" qui laisse la commande active et la relance si elle quitte.</p>
<p>Paramètres du node exec:</p>
<p><a href="https://civade.com/images/ir/irw.png" title="irw.png, mai 2021"><img src="https://civade.com/images/ir/.irw_m.png" alt="irw.png, mai 2021"></a></p>
<p>Ensuite, il va nous falloir trouver un moyen de séparer les différents champs d'une ligne. Encore une fois nodered dispose d'un node qui permet de faire le job : "<strong>CSV</strong>". La colonne 1 contiendra le code brut lu, la colonne 2 le nombre d'envoi du même code (0, premier envoi, 1, 1ère répétition, etc..), la colonne 3 le nom de la touche, et la colonne 4 le nom de l'appareil.</p>
<p>Vue brute de ce qui est renvoyé par la commande <strong>irw</strong> :</p>
<pre>00000000e13e01fe 00 RCVR_POWER NAD_AVR2-RCVR # Touche power sur le NAD, 1er appui (code = e13e 01fe)
00000000e13e01fe 01 RCVR_POWER NAD_AVR2-RCVR # 1ere répétition de ce même code
00000000e13e04fb 00 KEY_SLEEP NAD_AVR2-RCVR # 1er appui de la Touche Sleep sur le NAD (code = e13e 04fb)</pre>
<p>L'espace est le séparateur, et il y a un code par ligne. Ceci induit le paramétrage suivant :</p>
<p><a href="https://civade.com/images/ir/csv.png" title="csv.png, mai 2021"><img src="https://civade.com/images/ir/.csv_l.png" alt="csv.png, mai 2021"></a></p>
<p>Il peut être judicieux de filter en ne récupérant que les 1ers appuis de touche, afin d'éviter les répétitions. Cela se fait avec le node "<strong>Switch</strong>", et en filtrant pour ne garder que les enregistrements dont la colonne 2 est égale à 0.</p>
<p>Paramètres du node Switch :</p>
<p><a href="https://civade.com/images/ir/switch.png" title="switch.png, mai 2021"><img src="https://civade.com/images/ir/.switch_m.png" alt="switch.png, mai 2021"></a></p>
<p>Il ne nous reste plus qu'à aller chercher le code de la touche, dans la colonne 3 avec le node "<strong>change</strong>". A la sortie, nous avons dans le message "<strong>query</strong>" le code de la touche infrarouge.</p>
<p>Paramètres du node "change" :</p>
<p><a href="https://civade.com/images/ir/setquery.png" title="setquery.png, mai 2021"><img src="https://civade.com/images/ir/.setquery_m.png" alt="setquery.png, mai 2021"></a></p>
<h4>Recevoir des ordres de commande par l'interface Web (UI NodeRed)</h4>
<p>Vue générale du traitement :</p>
<p><a href="https://civade.com/images/ir/ui-capture.png" title="ui-capture.png, mai 2021"><img src="https://civade.com/images/ir/.ui-capture_m.png" alt="ui-capture.png, mai 2021"></a></p>
<p>Ici, c'est beaucoup plus simple. Il nous faut avoir installé le complément <strong>node-red-dashboard</strong>avec le gestionnaire de palette pour bénéficier des widgets de l'interface utilisateur. Le premier node est extrait de ce package, il s'agit de "<strong>button</strong>".</p>
<p>On peut préciser soit un nom (label) soit une icone ou les 2. On peut également préciser la couleur du texte ou du fond, ainsi que la taille (size). L'information la plus importante étant "Payload", qui est le mesage exte qui sera renvoyé par le bouton. A choisir parmis les codes supportés par la télécommande. Si Label n'est pas précisé, il peut être intéresant de préciser "Name" pour que le bouton ait quand même un nom sur l'interface d'édition nodered. Cela facilitera sa localisation.</p>
<p>Paramètres de "button" :</p>
<p><a href="https://civade.com/images/ir/button.png" title="button.png, mai 2021"><img src="https://civade.com/images/ir/.button_m.png" alt="button.png, mai 2021"></a></p>
<p>A noter qu'il est possible d'ajouter un node "<strong>template</strong>" dans lequel on pourra mettre des éléments de style CSS pour affiner la présentation du Dashboard.</p>
<p>Une fois les différents boutons mis en place, il ne reste comme pour l'étape précédente qu'à les raccorder à un objet "<strong>Change</strong>", pour récupérer dans msg.query le code de la télécommande infrarouge à envoyer.</p>
<h4>Emettre des codes IR par le périphérique Wifi / infrarouge développé dans le 3e article</h4>
<p><a href="https://civade.com/images/ir/http-request.png" title="http-request.png, mai 2021"><img src="https://civade.com/images/ir/http-request.png" alt="http-request.png, mai 2021"></a></p>
<p>Cette dernière étape prend en entrée les flux issus de chacune des 2 étapes précédentes (ou "query" contient le code à envoyer). Un node "http request" fait le job. A noter son paramétrage avec la syntaxe de double accolade permettant de récupérer le résultat d'une variable de node red pour l'ijectre dans la requete HTTP. Il faudra bien sur pensé à avoir mis l'adresse ip de votre périphérique d'envoi de code IR basé sur ESP 32 <a href="https://civade.com/post/2021/05/02/IR-remote-3/4-%3A-Emetteur-infrarouge-/-wifi-sur-ESP32">décrit dans le 3e volet</a> :</p>
<p><a href="https://civade.com/images/ir/http-request2.png" title="http-request2.png, mai 2021"><img src="https://civade.com/images/ir/http-request2.png" alt="http-request2.png, mai 2021"></a></p>
<h4>Option : Émettre des codes infrarouges via LIRC</h4>
<p>Cette solution ne fonctionne qu'avec le périphérique AGIRS (cf le premier article de la série) car en standard l'Orange PI n'est dotée que d'un récepteur.</p>
<p><a href="https://civade.com/images/ir/send-agirs.png" title="send-agirs.png, mai 2021"><img src="https://civade.com/images/ir/.send-agirs_m.png" alt="send-agirs.png, mai 2021"></a></p>
<p>A nouveau, un bouton est paramétré avec le nom du code à envoyer (déjà documenté). La sortie de ce bouton est dirigée vers un objet "<strong>exec</strong>", paramétré pour executer une fois une commande, qu iva prendre en paramètres "SEND_ONCE" pour n'envoyer qu'une fois le code, le nom du device, et le nom du code :</p>
<pre>/usr/bin/irsend SEND_ONCE NAD_AVR2-RCVR RCVR_POWER</pre>
<p>Voici les paramètres de l'objet :
<a href="https://civade.com/images/ir/irsend.png" title="irsend.png, mai 2021"><img src="https://civade.com/images/ir/.irsend_m.png" alt="irsend.png, mai 2021"></a></p>
<p>On peut bien sur rendre le tout paramétrable comme vu dans les exemples précédents.</p>
<h4>L'ensemble finalisé</h4>
<p>L'ensemble finalisé est un peu grand, car il y a beaucoup d'objets bouton... EN voici une vue d'ensemble :</p>
<p><a href="https://civade.com/images/ir/overall.png" title="overall.png, mai 2021"><img src="https://civade.com/images/ir/.overall_m.png" alt="overall.png, mai 2021"></a></p>
<p>Vous pouvez importer le flow complet sur une feuille avec le code json ci dessous afin de l'étudier, ce sera certainement plus parlant que des copies d'écran... POur ce faire cliquer dans le champ ci dessous, puis "ctrl +A" (select all) , puis "ctrl+c" (copier). ILL ne vous retera plus qu'à coller le tout dans la zone d'import de node red.</p>
<pre>
[{"id":"7a472838.fcd788","type":"tab","label":"Télécommandes NAD & PHILIPS","disabled":false,"info":""},{"id":"cff35ffd.4088a","type":"ui_button","z":"7a472838.fcd788","name":"¨Power","group":"e84be541.072ae","order":1,"width":2,"height":2,"passthru":true,"label":"","tooltip":"","color":"red","bgcolor":"","icon":"fa-power-off","payload":"RCVR_POWER","payloadType":"str","topic":"topic","topicType":"msg","x":280,"y":340,"wires":[["f7b04fb1.cc3298"]]},{"id":"a2a19817.ec0b6","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":340,"wires":[["cff35ffd.4088a"]]},{"id":"c6d07647.67164","type":"ui_button","z":"7a472838.fcd788","name":"Sleep","group":"e84be541.072ae","order":3,"width":2,"height":2,"passthru":true,"label":"","tooltip":"","color":"","bgcolor":"","icon":"fa-bed","payload":"KEY_SLEEP","payloadType":"str","topic":"topic","topicType":"msg","x":270,"y":420,"wires":[["f7b04fb1.cc3298"]]},{"id":"7d2ddff5.32af8","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":420,"wires":[["c6d07647.67164"]]},{"id":"aff303f2.3d689","type":"ui_button","z":"7a472838.fcd788","name":"","group":"e84be541.072ae","order":4,"width":2,"height":2,"passthru":true,"label":"DVD","tooltip":"","color":"","bgcolor":"","icon":"fa-compact-disc","payload":"KEY_DVD","payloadType":"str","topic":"topic","topicType":"msg","x":270,"y":460,"wires":[["f7b04fb1.cc3298"]]},{"id":"dc2affef.6585b","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":460,"wires":[["aff303f2.3d689"]]},{"id":"67895b2f.5868f4","type":"ui_button","z":"7a472838.fcd788","name":"","group":"e84be541.072ae","order":5,"width":2,"height":2,"passthru":true,"label":"SAT","tooltip":"","color":"","bgcolor":"","icon":"fa-satellite-dish","payload":"KEY_SAT","payloadType":"str","topic":"topic","topicType":"msg","x":270,"y":500,"wires":[["f7b04fb1.cc3298"]]},{"id":"4c93954a.911dd4","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":500,"wires":[["67895b2f.5868f4"]]},{"id":"bc800fa6.35276","type":"ui_button","z":"7a472838.fcd788","name":"","group":"e84be541.072ae","order":6,"width":2,"height":2,"passthru":true,"label":"VCR","tooltip":"","color":"","bgcolor":"","icon":"fa-voicemail","payload":"KEY_VCR","payloadType":"str","topic":"topic","topicType":"msg","x":270,"y":540,"wires":[["f7b04fb1.cc3298"]]},{"id":"1771cf24.9aed01","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":540,"wires":[["bc800fa6.35276"]]},{"id":"d01b5d5.2a6d1a","type":"ui_button","z":"7a472838.fcd788","name":"","group":"e84be541.072ae","order":7,"width":2,"height":2,"passthru":true,"label":"Vid4","tooltip":"","color":"","bgcolor":"","icon":"","payload":"KEY_VIDEO_4","payloadType":"str","topic":"topic","topicType":"msg","x":270,"y":580,"wires":[["f7b04fb1.cc3298"]]},{"id":"f78431c1.a4c86","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":580,"wires":[["d01b5d5.2a6d1a"]]},{"id":"317dc3b3.ec5a24","type":"ui_button","z":"7a472838.fcd788","name":"","group":"e84be541.072ae","order":8,"width":2,"height":2,"passthru":true,"label":"Vid5","tooltip":"","color":"","bgcolor":"","icon":"","payload":"KEY_VIDEO_5","payloadType":"str","topic":"topic","topicType":"msg","x":270,"y":620,"wires":[["f7b04fb1.cc3298"]]},{"id":"29a38789.012178","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":620,"wires":[["317dc3b3.ec5a24"]]},{"id":"eeada1d1.1dac08","type":"ui_button","z":"7a472838.fcd788","name":"","group":"e84be541.072ae","order":9,"width":2,"height":2,"passthru":true,"label":"5.1","tooltip":"","color":"","bgcolor":"","icon":"","payload":"EXT._5.1","payloadType":"str","topic":"topic","topicType":"msg","x":270,"y":660,"wires":[["f7b04fb1.cc3298"]]},{"id":"79e1c274.d34dcc","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":660,"wires":[["eeada1d1.1dac08"]]},{"id":"b7da3e73.dd7818","type":"ui_button","z":"7a472838.fcd788","name":"","group":"e84be541.072ae","order":10,"width":2,"height":2,"passthru":true,"label":"CD","tooltip":"","color":"","bgcolor":"","icon":"","payload":"KEY_CD","payloadType":"str","topic":"topic","topicType":"msg","x":270,"y":700,"wires":[["f7b04fb1.cc3298"]]},{"id":"9dd3c582.24fbb8","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":700,"wires":[["b7da3e73.dd7818"]]},{"id":"953cefd3.026f","type":"ui_button","z":"7a472838.fcd788","name":"","group":"e84be541.072ae","order":11,"width":2,"height":2,"passthru":true,"label":"Tape","tooltip":"","color":"","bgcolor":"","icon":"","payload":"KEY_TAPE","payloadType":"str","topic":"topic","topicType":"msg","x":270,"y":740,"wires":[["f7b04fb1.cc3298"]]},{"id":"fff8636c.aadda","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":740,"wires":[["953cefd3.026f"]]},{"id":"16dd81b0.a02ab6","type":"ui_button","z":"7a472838.fcd788","name":"","group":"e84be541.072ae","order":12,"width":2,"height":2,"passthru":true,"label":"FM","tooltip":"","color":"","bgcolor":"","icon":"","payload":"FM/AM","payloadType":"str","topic":"topic","topicType":"msg","x":270,"y":780,"wires":[["f7b04fb1.cc3298"]]},{"id":"12f3e1a0.6aabbe","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":780,"wires":[["16dd81b0.a02ab6"]]},{"id":"ee71a02.5706ee","type":"ui_button","z":"7a472838.fcd788","name":"","group":"e84be541.072ae","order":13,"width":2,"height":2,"passthru":true,"label":"1","tooltip":"","color":"","bgcolor":"","icon":"","payload":"RCVR_1","payloadType":"str","topic":"topic","topicType":"msg","x":270,"y":820,"wires":[["f7b04fb1.cc3298"]]},{"id":"72b7fb3f.6ecd7c","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":820,"wires":[["ee71a02.5706ee"]]},{"id":"91869a44.2c9278","type":"ui_button","z":"7a472838.fcd788","name":"","group":"e84be541.072ae","order":14,"width":2,"height":2,"passthru":true,"label":"2","tooltip":"","color":"","bgcolor":"","icon":"","payload":"RCVR_2","payloadType":"str","topic":"topic","topicType":"msg","x":270,"y":860,"wires":[["f7b04fb1.cc3298"]]},{"id":"76e1566f.2c4308","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":860,"wires":[["91869a44.2c9278"]]},{"id":"a8c48084.769c98","type":"ui_button","z":"7a472838.fcd788","name":"","group":"e84be541.072ae","order":15,"width":2,"height":2,"passthru":true,"label":"3","tooltip":"","color":"","bgcolor":"","icon":"","payload":"RCVR_3","payloadType":"str","topic":"topic","topicType":"msg","x":270,"y":900,"wires":[["f7b04fb1.cc3298"]]},{"id":"6b16749e.1ca484","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":900,"wires":[["a8c48084.769c98"]]},{"id":"cc24bbea.9635e","type":"ui_button","z":"7a472838.fcd788","name":"","group":"e84be541.072ae","order":16,"width":2,"height":2,"passthru":true,"label":"4","tooltip":"","color":"","bgcolor":"","icon":"","payload":"RCVR_4","payloadType":"str","topic":"topic","topicType":"msg","x":270,"y":940,"wires":[["f7b04fb1.cc3298"]]},{"id":"8c1753d8.c7f78","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":940,"wires":[["cc24bbea.9635e"]]},{"id":"45da5e4d.4668b8","type":"ui_button","z":"7a472838.fcd788","name":"","group":"e84be541.072ae","order":17,"width":2,"height":2,"passthru":true,"label":"5","tooltip":"","color":"","bgcolor":"","icon":"","payload":"RCVR_5","payloadType":"str","topic":"topic","topicType":"msg","x":270,"y":980,"wires":[["f7b04fb1.cc3298"]]},{"id":"9f233347.0662c8","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":980,"wires":[["45da5e4d.4668b8"]]},{"id":"c7c3f5f9.a49af8","type":"ui_button","z":"7a472838.fcd788","name":"","group":"e84be541.072ae","order":18,"width":2,"height":2,"passthru":true,"label":"6","tooltip":"","color":"","bgcolor":"","icon":"","payload":"RCVR_6","payloadType":"str","topic":"topic","topicType":"msg","x":270,"y":1020,"wires":[["f7b04fb1.cc3298"]]},{"id":"b2563862.a43bb8","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":1020,"wires":[["c7c3f5f9.a49af8"]]},{"id":"e854aeb9.0d891","type":"ui_button","z":"7a472838.fcd788","name":"","group":"e84be541.072ae","order":19,"width":2,"height":2,"passthru":true,"label":"7","tooltip":"","color":"","bgcolor":"","icon":"","payload":"RCVR_7","payloadType":"str","topic":"topic","topicType":"msg","x":270,"y":1060,"wires":[["f7b04fb1.cc3298"]]},{"id":"a1d7531f.a4364","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":1060,"wires":[["e854aeb9.0d891"]]},{"id":"2f757929.e84026","type":"ui_button","z":"7a472838.fcd788","name":"","group":"e84be541.072ae","order":20,"width":2,"height":2,"passthru":true,"label":"8","tooltip":"","color":"","bgcolor":"","icon":"","payload":"RCVR_8","payloadType":"str","topic":"topic","topicType":"msg","x":270,"y":1100,"wires":[["f7b04fb1.cc3298"]]},{"id":"847e2ea1.d6bf7","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":1100,"wires":[["2f757929.e84026"]]},{"id":"74dfda96.19d1ac","type":"ui_button","z":"7a472838.fcd788","name":"","group":"e84be541.072ae","order":21,"width":2,"height":2,"passthru":true,"label":"9","tooltip":"","color":"","bgcolor":"","icon":"","payload":"RCVR_9","payloadType":"str","topic":"topic","topicType":"msg","x":270,"y":1140,"wires":[["f7b04fb1.cc3298"]]},{"id":"da5d870f.f649f8","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":1140,"wires":[["74dfda96.19d1ac"]]},{"id":"8f360f5b.f5dad","type":"ui_button","z":"7a472838.fcd788","name":"","group":"e84be541.072ae","order":22,"width":2,"height":2,"passthru":true,"label":"Setup","tooltip":"","color":"","bgcolor":"","icon":"","payload":"RCVR_SURR","payloadType":"str","topic":"topic","topicType":"msg","x":270,"y":1180,"wires":[["f7b04fb1.cc3298"]]},{"id":"7958a904.b939a","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":1180,"wires":[["8f360f5b.f5dad"]]},{"id":"2e4c5763.3c08c8","type":"ui_button","z":"7a472838.fcd788","name":"","group":"e84be541.072ae","order":23,"width":2,"height":2,"passthru":true,"label":"0","tooltip":"","color":"","bgcolor":"","icon":"","payload":"RCVR_0","payloadType":"str","topic":"topic","topicType":"msg","x":270,"y":1220,"wires":[["f7b04fb1.cc3298"]]},{"id":"b1feeb01.2b382","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":1220,"wires":[["2e4c5763.3c08c8"]]},{"id":"11727cc.6dcad03","type":"ui_button","z":"7a472838.fcd788","name":"","group":"e84be541.072ae","order":24,"width":2,"height":2,"passthru":true,"label":"DynR","tooltip":"","color":"","bgcolor":"","icon":"","payload":"RCVR_DYN.R","payloadType":"str","topic":"topic","topicType":"msg","x":270,"y":1260,"wires":[["f7b04fb1.cc3298"]]},{"id":"b6e9c5c4.86b248","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":1260,"wires":[["11727cc.6dcad03"]]},{"id":"bbbbd531.d6bb68","type":"ui_button","z":"7a472838.fcd788","name":"","group":"e84be541.072ae","order":25,"width":2,"height":2,"passthru":true,"label":"TEST","tooltip":"","color":"","bgcolor":"","icon":"","payload":"RCVR_TEST","payloadType":"str","topic":"topic","topicType":"msg","x":270,"y":1300,"wires":[["f7b04fb1.cc3298"]]},{"id":"5eca3fbf.f68278","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":1300,"wires":[["bbbbd531.d6bb68"]]},{"id":"9e8aa8d.7c99e58","type":"ui_button","z":"7a472838.fcd788","name":"Up","group":"e84be541.072ae","order":26,"width":2,"height":2,"passthru":true,"label":"","tooltip":"","color":"","bgcolor":"","icon":"fa-chevron-up","payload":"RCVR_VOLUME_UP","payloadType":"str","topic":"topic","topicType":"msg","x":270,"y":1340,"wires":[["f7b04fb1.cc3298"]]},{"id":"9420fcc2.8e3658","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":1340,"wires":[["9e8aa8d.7c99e58"]]},{"id":"25a57ad5.00398e","type":"ui_button","z":"7a472838.fcd788","name":"","group":"e84be541.072ae","order":27,"width":2,"height":2,"passthru":true,"label":"LEVEL","tooltip":"","color":"","bgcolor":"","icon":"","payload":"RCVR_LEVEL","payloadType":"str","topic":"topic","topicType":"msg","x":270,"y":1380,"wires":[["f7b04fb1.cc3298"]]},{"id":"3fd30c0f.12f7cc","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":1380,"wires":[["25a57ad5.00398e"]]},{"id":"e80b7058.0352b8","type":"ui_button","z":"7a472838.fcd788","name":"Down","group":"e84be541.072ae","order":28,"width":2,"height":2,"passthru":true,"label":"","tooltip":"","color":"","bgcolor":"","icon":"fa-chevron-left","payload":"RCVR_TUNE_DOWN","payloadType":"str","topic":"topic","topicType":"msg","x":270,"y":1420,"wires":[["f7b04fb1.cc3298"]]},{"id":"5c5ece76.5b536","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":1420,"wires":[["e80b7058.0352b8"]]},{"id":"b02b94f6.050208","type":"ui_button","z":"7a472838.fcd788","name":"","group":"e84be541.072ae","order":29,"width":2,"height":2,"passthru":true,"label":"Mute","tooltip":"","color":"","bgcolor":"","icon":"","payload":"RCVR_MUTE_ENTER","payloadType":"str","topic":"topic","topicType":"msg","x":270,"y":1460,"wires":[["f7b04fb1.cc3298"]]},{"id":"f08b802b.8f6a58","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":1460,"wires":[["b02b94f6.050208"]]},{"id":"fe90a691.836dd8","type":"ui_button","z":"7a472838.fcd788","name":"Left","group":"e84be541.072ae","order":30,"width":2,"height":2,"passthru":true,"label":"","tooltip":"","color":"","bgcolor":"","icon":"fa-chevron-right","payload":"RCVR_TUNE_UP","payloadType":"str","topic":"topic","topicType":"msg","x":270,"y":1500,"wires":[["f7b04fb1.cc3298"]]},{"id":"a9465c5d.975fd8","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":1500,"wires":[["fe90a691.836dd8"]]},{"id":"fc4aa106.9a1c58","type":"ui_button","z":"7a472838.fcd788","name":"","group":"e84be541.072ae","order":31,"width":2,"height":2,"passthru":true,"label":"Display","tooltip":"","color":"","bgcolor":"","icon":"","payload":"RCVR_DISPLAY","payloadType":"str","topic":"topic","topicType":"msg","x":280,"y":1540,"wires":[["f7b04fb1.cc3298"]]},{"id":"ec22085d.c98a68","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":1540,"wires":[["fc4aa106.9a1c58"]]},{"id":"b66c500f.0915b","type":"ui_button","z":"7a472838.fcd788","name":"Right","group":"e84be541.072ae","order":32,"width":2,"height":2,"passthru":true,"label":"","tooltip":"","color":"","bgcolor":"","icon":"fa-chevron-down","payload":"RCVR_VOLUME_DOWN","payloadType":"str","topic":"topic","topicType":"msg","x":270,"y":1580,"wires":[["f7b04fb1.cc3298"]]},{"id":"a8a0dca6.a67f","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":1580,"wires":[["b66c500f.0915b"]]},{"id":"86f84b6b.240c8","type":"ui_button","z":"7a472838.fcd788","name":"","group":"e84be541.072ae","order":33,"width":2,"height":2,"passthru":true,"label":"Tune","tooltip":"","color":"","bgcolor":"","icon":"","payload":"RCVR_TUNE_MODE","payloadType":"str","topic":"topic","topicType":"msg","x":270,"y":1620,"wires":[["f7b04fb1.cc3298"]]},{"id":"57f4ac1a.3509f4","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":1620,"wires":[["86f84b6b.240c8"]]},{"id":"ed4c8fb.e68f1f","type":"ui_button","z":"7a472838.fcd788","d":true,"name":"Eject","group":"e84be541.072ae","order":34,"width":2,"height":2,"passthru":true,"label":"","tooltip":"","color":"","bgcolor":"","icon":"fa-eject","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":270,"y":1660,"wires":[["f7b04fb1.cc3298"]]},{"id":"f32ae1d5.35f548","type":"inject","z":"7a472838.fcd788","d":true,"name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":1660,"wires":[["ed4c8fb.e68f1f"]]},{"id":"7e263909.71baf8","type":"ui_button","z":"7a472838.fcd788","d":true,"name":"Stop","group":"e84be541.072ae","order":35,"width":2,"height":2,"passthru":true,"label":"","tooltip":"","color":"","bgcolor":"","icon":"fa-stop","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":270,"y":1700,"wires":[["f7b04fb1.cc3298"]]},{"id":"d3a824f7.6ada98","type":"inject","z":"7a472838.fcd788","d":true,"name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":1700,"wires":[["7e263909.71baf8"]]},{"id":"8fd070a9.75dd88","type":"ui_button","z":"7a472838.fcd788","d":true,"name":"Play","group":"e84be541.072ae","order":36,"width":2,"height":2,"passthru":true,"label":"","tooltip":"","color":"","bgcolor":"","icon":"fa-play","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":270,"y":1740,"wires":[["f7b04fb1.cc3298"]]},{"id":"c55adfc.c9f6ea","type":"inject","z":"7a472838.fcd788","d":true,"name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":1740,"wires":[["8fd070a9.75dd88"]]},{"id":"41f8a9c.0b32758","type":"ui_button","z":"7a472838.fcd788","d":true,"name":"Pause","group":"e84be541.072ae","order":37,"width":2,"height":2,"passthru":true,"label":"","tooltip":"","color":"","bgcolor":"","icon":"fa-pause","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":270,"y":1780,"wires":[["f7b04fb1.cc3298"]]},{"id":"3b92cee8.6f3142","type":"inject","z":"7a472838.fcd788","d":true,"name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":1780,"wires":[["41f8a9c.0b32758"]]},{"id":"792cf3f4.f4d3e4","type":"ui_button","z":"7a472838.fcd788","d":true,"name":"FBackward","group":"e84be541.072ae","order":38,"width":2,"height":2,"passthru":true,"label":"","tooltip":"","color":"","bgcolor":"","icon":"fa-fast-backward","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":290,"y":1820,"wires":[["f7b04fb1.cc3298"]]},{"id":"7ea938d8.f49e4","type":"inject","z":"7a472838.fcd788","d":true,"name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":1820,"wires":[["792cf3f4.f4d3e4"]]},{"id":"5479057.098637c","type":"ui_button","z":"7a472838.fcd788","d":true,"name":"FForward","group":"e84be541.072ae","order":39,"width":2,"height":2,"passthru":true,"label":"","tooltip":"","color":"","bgcolor":"","icon":"fa-fast-forward","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":280,"y":1860,"wires":[["f7b04fb1.cc3298"]]},{"id":"9f0465b3.995c5","type":"inject","z":"7a472838.fcd788","d":true,"name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":1860,"wires":[["5479057.098637c"]]},{"id":"5a669fa3.3032","type":"ui_button","z":"7a472838.fcd788","d":true,"name":"","group":"e84be541.072ae","order":40,"width":2,"height":2,"passthru":true,"label":"Repeat","tooltip":"","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":280,"y":1900,"wires":[["f7b04fb1.cc3298"]]},{"id":"ab88dc56.10c2f8","type":"inject","z":"7a472838.fcd788","d":true,"name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":1900,"wires":[["5a669fa3.3032"]]},{"id":"ab6e112e.1a1198","type":"ui_button","z":"7a472838.fcd788","d":true,"name":"Backward","group":"e84be541.072ae","order":41,"width":2,"height":2,"passthru":true,"label":"","tooltip":"","color":"","bgcolor":"","icon":"fa-backward","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":290,"y":1940,"wires":[["f7b04fb1.cc3298"]]},{"id":"881adcc9.ecc808","type":"inject","z":"7a472838.fcd788","d":true,"name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":1940,"wires":[["ab6e112e.1a1198"]]},{"id":"5b8798af.daa778","type":"ui_button","z":"7a472838.fcd788","d":true,"name":"Forward","group":"e84be541.072ae","order":42,"width":2,"height":2,"passthru":true,"label":"","tooltip":"","color":"","bgcolor":"","icon":"fa-forward","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":280,"y":1980,"wires":[["f7b04fb1.cc3298"]]},{"id":"9653af26.b69d3","type":"inject","z":"7a472838.fcd788","d":true,"name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":1980,"wires":[["5b8798af.daa778"]]},{"id":"5bf3e820.ba01f8","type":"ui_button","z":"7a472838.fcd788","d":true,"name":"","group":"e84be541.072ae","order":43,"width":2,"height":2,"passthru":true,"label":"PROGRAM","tooltip":"","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":290,"y":2020,"wires":[["f7b04fb1.cc3298"]]},{"id":"2c781786.f9e468","type":"inject","z":"7a472838.fcd788","d":true,"name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":2020,"wires":[["5bf3e820.ba01f8"]]},{"id":"f2096589.376d5","type":"ui_button","z":"7a472838.fcd788","d":true,"name":"","group":"e84be541.072ae","order":44,"width":2,"height":2,"passthru":true,"label":"AUDIO","tooltip":"","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":270,"y":2060,"wires":[["f7b04fb1.cc3298"]]},{"id":"11a3ac47.41a4dc","type":"inject","z":"7a472838.fcd788","d":true,"name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":2060,"wires":[["f2096589.376d5"]]},{"id":"86bf3820.bc62d","type":"ui_button","z":"7a472838.fcd788","d":true,"name":"","group":"e84be541.072ae","order":45,"width":2,"height":2,"passthru":true,"label":"SUBTITLE","tooltip":"","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":290,"y":2100,"wires":[["f7b04fb1.cc3298"]]},{"id":"ddad71f1.12aaf","type":"inject","z":"7a472838.fcd788","d":true,"name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":2100,"wires":[["86bf3820.bc62d"]]},{"id":"7a5f8442.bc7714","type":"ui_button","z":"7a472838.fcd788","d":true,"name":"","group":"e84be541.072ae","order":46,"width":4,"height":2,"passthru":true,"label":"CLEAR","tooltip":"","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":280,"y":2140,"wires":[["f7b04fb1.cc3298"]]},{"id":"7042da1a.e6a754","type":"inject","z":"7a472838.fcd788","d":true,"name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":2140,"wires":[["7a5f8442.bc7714"]]},{"id":"7eda4d33.407044","type":"ui_button","z":"7a472838.fcd788","d":true,"name":"","group":"e84be541.072ae","order":47,"width":2,"height":2,"passthru":true,"label":"ZOOM","tooltip":"","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":270,"y":2180,"wires":[["f7b04fb1.cc3298"]]},{"id":"cce49f5a.95fe08","type":"inject","z":"7a472838.fcd788","d":true,"name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":2180,"wires":[["7eda4d33.407044"]]},{"id":"bab77c85.6bfbb8","type":"comment","z":"7a472838.fcd788","name":"NAD REMOTE","info":"","x":480,"y":20,"wires":[]},{"id":"92db84b2.9bbc3","type":"exec","z":"7a472838.fcd788","command":"/usr/bin/irw","addpay":false,"append":"","useSpawn":"true","timer":"","oldrc":false,"name":"lirc - irw","x":280,"y":140,"wires":[["16ba359d.900ac2"],[],[]]},{"id":"9ef98366.aeeca8","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":true,"onceDelay":"1","topic":"","payload":"","payloadType":"date","x":130,"y":140,"wires":[["92db84b2.9bbc3"]]},{"id":"7ca5c7cb.e1038","type":"debug","z":"7a472838.fcd788","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1050,"y":360,"wires":[]},{"id":"6bbb8c21.41ae54","type":"http request","z":"7a472838.fcd788","name":"","method":"GET","ret":"txt","paytoqs":"ignore","url":"http://192.168.20.176/ir?code={{{query}}}","tls":"","persist":false,"proxy":"","authType":"","x":890,"y":360,"wires":[["7ca5c7cb.e1038"]]},{"id":"f7b04fb1.cc3298","type":"change","z":"7a472838.fcd788","name":"","rules":[{"t":"set","p":"query","pt":"msg","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":580,"y":340,"wires":[["6bbb8c21.41ae54"]]},{"id":"687e60ad.2b6e48","type":"comment","z":"7a472838.fcd788","name":"Inject to ESP32","info":"","x":940,"y":320,"wires":[]},{"id":"5528e089.94d018","type":"debug","z":"7a472838.fcd788","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1024,"y":140,"wires":[]},{"id":"16ba359d.900ac2","type":"csv","z":"7a472838.fcd788","name":"","sep":" ","hdrin":"","hdrout":"none","multi":"one","ret":"\\n","temp":"","skip":"0","strings":true,"include_empty_strings":"","include_null_values":"","x":430,"y":140,"wires":[["55a5584b.b14b88"]]},{"id":"55a5584b.b14b88","type":"switch","z":"7a472838.fcd788","name":"","property":"payload.col2","propertyType":"msg","rules":[{"t":"eq","v":"0","vt":"num"}],"checkall":"true","repair":false,"outputs":1,"x":590,"y":140,"wires":[["225a58e4.56db5"]]},{"id":"1f4e6452.b49024","type":"comment","z":"7a472838.fcd788","name":"Que les premiers appuis","info":"","x":610,"y":80,"wires":[]},{"id":"225a58e4.56db5","type":"change","z":"7a472838.fcd788","name":"","rules":[{"t":"set","p":"query","pt":"msg","to":"payload.col3","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":760,"y":140,"wires":[["6bbb8c21.41ae54","5528e089.94d018"]]},{"id":"d296a9f.61f4458","type":"comment","z":"7a472838.fcd788","name":"Lecture IR via LIRC","info":"","x":210,"y":80,"wires":[]},{"id":"95ba2365.2082f8","type":"comment","z":"7a472838.fcd788","name":"Dashboard avec télécommande virtuelle","info":"","x":200,"y":200,"wires":[]},{"id":"16d43a86.d8f7a5","type":"comment","z":"7a472838.fcd788","name":"Code de la touche dans Query http.","info":"","x":640,"y":300,"wires":[]},{"id":"1391e7aa.65dbd8","type":"comment","z":"7a472838.fcd788","name":"Code de la touche dans Query http","info":"","x":880,"y":80,"wires":[]},{"id":"1431c5f.d1b74ba","type":"ui_template","z":"7a472838.fcd788","group":"e84be541.072ae","name":"","order":49,"width":0,"height":0,"format":"<div ng-bind-html="msg.payload"></div>\n<style>\n.md-button {\n font-size: 20px !important;\n border-radius: 30px;\n}\n\n</style>","storeOutMessages":true,"fwdInMessages":true,"resendOnRefresh":true,"templateScope":"local","x":300,"y":300,"wires":[[]]},{"id":"a3ddffe2.3856e8","type":"ui_button","z":"7a472838.fcd788","name":"","group":"e84be541.072ae","order":2,"width":2,"height":2,"passthru":true,"label":"AM","tooltip":"","color":"","bgcolor":"","icon":"","payload":"AM","payloadType":"str","topic":"topic","topicType":"msg","x":270,"y":380,"wires":[["f7b04fb1.cc3298"]]},{"id":"1e519421.f9df8c","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":380,"wires":[["a3ddffe2.3856e8"]]},{"id":"9d9e9e55.93bc38","type":"ui_button","z":"7a472838.fcd788","d":true,"name":"","group":"e84be541.072ae","order":48,"width":6,"height":2,"passthru":true,"label":"Power via AGIRS","tooltip":"","color":"red","bgcolor":"","icon":"fa-power-off","payload":"RCVR_POWER","payloadType":"str","topic":"topic","topicType":"msg","x":307,"y":247,"wires":[["6cb53ccb.539b14"]]},{"id":"d8e534ce.cde15","type":"inject","z":"7a472838.fcd788","d":true,"name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":137,"y":247,"wires":[["9d9e9e55.93bc38"]]},{"id":"6cb53ccb.539b14","type":"exec","z":"7a472838.fcd788","d":true,"command":"/usr/bin/irsend SEND_ONCE NAD_AVR2-RCVR RCVR_POWER","addpay":false,"append":"","useSpawn":"false","timer":"","oldrc":false,"name":"IRsend","x":517,"y":247,"wires":[[],["f0d06a52.66f65"],[]]},{"id":"f0d06a52.66f65","type":"debug","z":"7a472838.fcd788","d":true,"name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":717,"y":247,"wires":[]},{"id":"51e8aca0.156a2c","type":"comment","z":"7a472838.fcd788","name":"NAD REMOTE","info":"","x":140,"y":300,"wires":[]},{"id":"a41f135e.f9122","type":"ui_button","z":"7a472838.fcd788","name":"Power","group":"e48b1652.82182","order":1,"width":3,"height":2,"passthru":true,"label":"","tooltip":"","color":"red","bgcolor":"","icon":"fa-power-off","payload":"RC6_POWER","payloadType":"str","topic":"topic","topicType":"msg","x":710,"y":440,"wires":[["f7b04fb1.cc3298"]]},{"id":"daf04a90.89d45","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":580,"y":440,"wires":[["a41f135e.f9122"]]},{"id":"1ea0ae1a.1d987a","type":"ui_button","z":"7a472838.fcd788","name":"","group":"e48b1652.82182","order":29,"width":2,"height":2,"passthru":true,"label":"1","tooltip":"","color":"","bgcolor":"","icon":"","payload":"RC6_1","payloadType":"str","topic":"topic","topicType":"msg","x":710,"y":480,"wires":[["f7b04fb1.cc3298"]]},{"id":"48a51d65.73a07c","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":580,"y":480,"wires":[["1ea0ae1a.1d987a"]]},{"id":"2c9b4a3c.2676fe","type":"ui_button","z":"7a472838.fcd788","name":"","group":"e48b1652.82182","order":30,"width":2,"height":2,"passthru":true,"label":"2","tooltip":"","color":"","bgcolor":"","icon":"","payload":"RC6_2","payloadType":"str","topic":"topic","topicType":"msg","x":710,"y":520,"wires":[["f7b04fb1.cc3298"]]},{"id":"12ea9b9b.5da9e4","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":580,"y":520,"wires":[["2c9b4a3c.2676fe"]]},{"id":"c40bc823.3d2fb","type":"ui_button","z":"7a472838.fcd788","name":"","group":"e48b1652.82182","order":31,"width":2,"height":2,"passthru":true,"label":"3","tooltip":"","color":"","bgcolor":"","icon":"","payload":"RC6_3","payloadType":"str","topic":"topic","topicType":"msg","x":710,"y":560,"wires":[["f7b04fb1.cc3298"]]},{"id":"dc60fbc4.57adc","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":580,"y":560,"wires":[["c40bc823.3d2fb"]]},{"id":"470b9d2f.eed974","type":"ui_button","z":"7a472838.fcd788","name":"","group":"e48b1652.82182","order":32,"width":2,"height":2,"passthru":true,"label":"4","tooltip":"","color":"","bgcolor":"","icon":"","payload":"RC6_4","payloadType":"str","topic":"topic","topicType":"msg","x":710,"y":600,"wires":[["f7b04fb1.cc3298"]]},{"id":"87b17fd4.35573","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":580,"y":600,"wires":[["470b9d2f.eed974"]]},{"id":"995c2a3a.8907e","type":"ui_button","z":"7a472838.fcd788","name":"","group":"e48b1652.82182","order":33,"width":2,"height":2,"passthru":true,"label":"5","tooltip":"","color":"","bgcolor":"","icon":"","payload":"RC6_5","payloadType":"str","topic":"topic","topicType":"msg","x":710,"y":640,"wires":[["f7b04fb1.cc3298"]]},{"id":"1760989f.61486f","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":580,"y":640,"wires":[["995c2a3a.8907e"]]},{"id":"9100f3d3.fcdb88","type":"ui_button","z":"7a472838.fcd788","name":"","group":"e48b1652.82182","order":34,"width":2,"height":2,"passthru":true,"label":"6","tooltip":"","color":"","bgcolor":"","icon":"","payload":"RC6_6","payloadType":"str","topic":"topic","topicType":"msg","x":710,"y":680,"wires":[["f7b04fb1.cc3298"]]},{"id":"2a5cf332.f0eb54","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":580,"y":680,"wires":[["9100f3d3.fcdb88"]]},{"id":"c4486dca.4736a8","type":"ui_button","z":"7a472838.fcd788","name":"","group":"e48b1652.82182","order":35,"width":2,"height":2,"passthru":true,"label":"7","tooltip":"","color":"","bgcolor":"","icon":"","payload":"RC6_7","payloadType":"str","topic":"topic","topicType":"msg","x":710,"y":720,"wires":[["f7b04fb1.cc3298"]]},{"id":"723fc1b0.db682","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":580,"y":720,"wires":[["c4486dca.4736a8"]]},{"id":"8812f68f.4eea1","type":"ui_button","z":"7a472838.fcd788","name":"","group":"e48b1652.82182","order":36,"width":2,"height":2,"passthru":true,"label":"8","tooltip":"","color":"","bgcolor":"","icon":"","payload":"RC6_8","payloadType":"str","topic":"topic","topicType":"msg","x":710,"y":760,"wires":[["f7b04fb1.cc3298"]]},{"id":"6e00af57.b162c","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":580,"y":760,"wires":[["8812f68f.4eea1"]]},{"id":"a189f710.e1ec4","type":"ui_button","z":"7a472838.fcd788","name":"","group":"e48b1652.82182","order":37,"width":2,"height":2,"passthru":true,"label":"9","tooltip":"","color":"","bgcolor":"","icon":"","payload":"RC6_9","payloadType":"str","topic":"topic","topicType":"msg","x":710,"y":800,"wires":[["f7b04fb1.cc3298"]]},{"id":"c4337671.c31d8","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":580,"y":800,"wires":[["a189f710.e1ec4"]]},{"id":"1eac4803.2da31","type":"ui_button","z":"7a472838.fcd788","name":"","group":"e48b1652.82182","order":39,"width":2,"height":2,"passthru":true,"label":"0","tooltip":"","color":"","bgcolor":"","icon":"","payload":"RC6_0","payloadType":"str","topic":"topic","topicType":"msg","x":710,"y":840,"wires":[["f7b04fb1.cc3298"]]},{"id":"65b3a829.e4f988","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":580,"y":840,"wires":[["1eac4803.2da31"]]},{"id":"5f534dae.7eb384","type":"ui_button","z":"7a472838.fcd788","name":"Up","group":"e48b1652.82182","order":13,"width":2,"height":2,"passthru":true,"label":"","tooltip":"","color":"","bgcolor":"","icon":"fa-chevron-up","payload":"RC6_UP","payloadType":"str","topic":"topic","topicType":"msg","x":710,"y":880,"wires":[["f7b04fb1.cc3298"]]},{"id":"d1ae55df.b8786","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":580,"y":880,"wires":[["5f534dae.7eb384"]]},{"id":"82b169e1.b79e18","type":"ui_button","z":"7a472838.fcd788","name":"Down","group":"e48b1652.82182","order":19,"width":2,"height":2,"passthru":true,"label":"","tooltip":"","color":"","bgcolor":"","icon":"fa-chevron-down","payload":"RC6_DOWN","payloadType":"str","topic":"topic","topicType":"msg","x":710,"y":920,"wires":[["f7b04fb1.cc3298"]]},{"id":"b03aaf82.952da","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":580,"y":920,"wires":[["82b169e1.b79e18"]]},{"id":"6c25b994.95c42","type":"ui_button","z":"7a472838.fcd788","name":"Left","group":"e48b1652.82182","order":15,"width":2,"height":2,"passthru":true,"label":"","tooltip":"","color":"","bgcolor":"","icon":"fa-chevron-left","payload":"RC6_LEFT","payloadType":"str","topic":"topic","topicType":"msg","x":710,"y":960,"wires":[["f7b04fb1.cc3298"]]},{"id":"9302cf5e.8733f8","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":580,"y":960,"wires":[["6c25b994.95c42"]]},{"id":"2caaa566.d9876a","type":"ui_button","z":"7a472838.fcd788","name":"Right","group":"e48b1652.82182","order":17,"width":2,"height":2,"passthru":true,"label":"","tooltip":"","color":"","bgcolor":"","icon":"fa-chevron-right","payload":"RC6_RIGHT","payloadType":"str","topic":"topic","topicType":"msg","x":710,"y":1000,"wires":[["f7b04fb1.cc3298"]]},{"id":"b2737269.23b4a","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":580,"y":1000,"wires":[["2caaa566.d9876a"]]},{"id":"a2301e72.81248","type":"ui_button","z":"7a472838.fcd788","name":"Volume up","group":"e48b1652.82182","order":12,"width":2,"height":2,"passthru":true,"label":"+","tooltip":"","color":"","bgcolor":"","icon":"fa-volume-up","payload":"RC6_VOLPLUS","payloadType":"str","topic":"topic","topicType":"msg","x":730,"y":1040,"wires":[["f7b04fb1.cc3298"]]},{"id":"3f741fb3.d7d9b8","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":580,"y":1040,"wires":[["a2301e72.81248"]]},{"id":"b70331.c9d704d","type":"ui_button","z":"7a472838.fcd788","name":"Volume down","group":"e48b1652.82182","order":18,"width":2,"height":2,"passthru":true,"label":"-","tooltip":"","color":"","bgcolor":"","icon":"fa-volume-down","payload":"RC6_VOLMINUS","payloadType":"str","topic":"topic","topicType":"msg","x":740,"y":1080,"wires":[["f7b04fb1.cc3298"]]},{"id":"810b53e1.c0da8","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":580,"y":1080,"wires":[["b70331.c9d704d"]]},{"id":"c872dd9a.df61c","type":"ui_button","z":"7a472838.fcd788","name":"Ambilight","group":"e48b1652.82182","order":3,"width":2,"height":1,"passthru":true,"label":"","tooltip":"","color":"","bgcolor":"","icon":"lightbulb_outline","payload":"RC6_AMBILIGHT","payloadType":"str","topic":"topic","topicType":"msg","x":720,"y":1120,"wires":[["f7b04fb1.cc3298"]]},{"id":"8b232cdd.b8a7d8","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":580,"y":1120,"wires":[["c872dd9a.df61c"]]},{"id":"8c12494b.b496b","type":"ui_button","z":"7a472838.fcd788","name":"Sources","group":"e48b1652.82182","order":4,"width":2,"height":1,"passthru":true,"label":"","tooltip":"","color":"","bgcolor":"","icon":"fa-arrow-circle-right","payload":"RC6_SOURCES","payloadType":"str","topic":"topic","topicType":"msg","x":720,"y":1160,"wires":[["f7b04fb1.cc3298"]]},{"id":"7023abd8.96bd84","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":580,"y":1160,"wires":[["8c12494b.b496b"]]},{"id":"3ee01fdf.2b8cf","type":"ui_button","z":"7a472838.fcd788","name":"Settings","group":"e48b1652.82182","order":5,"width":2,"height":1,"passthru":true,"label":"","tooltip":"","color":"","bgcolor":"","icon":"fa-cog","payload":"RC6_SETTINGS","payloadType":"str","topic":"topic","topicType":"msg","x":720,"y":1200,"wires":[["f7b04fb1.cc3298"]]},{"id":"5b715b6e.629b34","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":580,"y":1200,"wires":[["3ee01fdf.2b8cf"]]},{"id":"7123e0aa.e8b9","type":"ui_button","z":"7a472838.fcd788","name":"TopPicks","group":"e48b1652.82182","order":6,"width":2,"height":1,"passthru":true,"label":"","tooltip":"","color":"","bgcolor":"","icon":"fa-star","payload":"RC6_TOPPICKS","payloadType":"str","topic":"topic","topicType":"msg","x":720,"y":1240,"wires":[["f7b04fb1.cc3298"]]},{"id":"82ddb75c.39318","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":580,"y":1240,"wires":[["7123e0aa.e8b9"]]},{"id":"b6664dc6.fbd8d","type":"ui_button","z":"7a472838.fcd788","name":"Search","group":"e48b1652.82182","order":7,"width":2,"height":1,"passthru":true,"label":"","tooltip":"","color":"","bgcolor":"","icon":"fa-search","payload":"RC6_SEARCH","payloadType":"str","topic":"topic","topicType":"msg","x":720,"y":1280,"wires":[["f7b04fb1.cc3298"]]},{"id":"8940b88.21ad9c8","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":580,"y":1280,"wires":[["b6664dc6.fbd8d"]]},{"id":"31e49f9e.e644e","type":"ui_button","z":"7a472838.fcd788","name":"Exit/tv","group":"e48b1652.82182","order":8,"width":2,"height":1,"passthru":true,"label":"","tooltip":"","color":"","bgcolor":"","icon":"fa-tv","payload":"RC6_EXIT","payloadType":"str","topic":"topic","topicType":"msg","x":710,"y":1320,"wires":[["f7b04fb1.cc3298"]]},{"id":"e843b542.1001d","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":580,"y":1320,"wires":[["31e49f9e.e644e"]]},{"id":"240bb64a.5ab85a","type":"ui_button","z":"7a472838.fcd788","name":"TV Guide","group":"e48b1652.82182","order":9,"width":2,"height":1,"passthru":true,"label":"","tooltip":"","color":"","bgcolor":"","icon":"fa-list","payload":"RC6_TVGUIDE","payloadType":"str","topic":"topic","topicType":"msg","x":720,"y":1360,"wires":[["f7b04fb1.cc3298"]]},{"id":"de9d79dd.cf7f18","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":580,"y":1360,"wires":[["240bb64a.5ab85a"]]},{"id":"5ed14752.5f07b8","type":"ui_button","z":"7a472838.fcd788","name":"RightMenu","group":"e48b1652.82182","order":10,"width":2,"height":1,"passthru":true,"label":"","tooltip":"","color":"","bgcolor":"","icon":"fa-window-restore","payload":"RC6_RIGHTMENU","payloadType":"str","topic":"topic","topicType":"msg","x":730,"y":1400,"wires":[["f7b04fb1.cc3298"]]},{"id":"92369c77.16008","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":580,"y":1400,"wires":[["5ed14752.5f07b8"]]},{"id":"8b6ebbe7.359a68","type":"ui_button","z":"7a472838.fcd788","name":"List","group":"e48b1652.82182","order":11,"width":2,"height":1,"passthru":true,"label":"","tooltip":"","color":"","bgcolor":"","icon":"fa-bars","payload":"RC6_LIST","payloadType":"str","topic":"topic","topicType":"msg","x":710,"y":1440,"wires":[["f7b04fb1.cc3298"]]},{"id":"e2ad99fa.e6b9f","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":580,"y":1440,"wires":[["8b6ebbe7.359a68"]]},{"id":"5a210c02.cd6114","type":"ui_button","z":"7a472838.fcd788","name":"","group":"e48b1652.82182","order":16,"width":2,"height":2,"passthru":true,"label":"OK","tooltip":"","color":"","bgcolor":"","icon":"","payload":"RC6_OK","payloadType":"str","topic":"topic","topicType":"msg","x":710,"y":1480,"wires":[["f7b04fb1.cc3298"]]},{"id":"c0e2d7b6.07bc5","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":580,"y":1480,"wires":[["5a210c02.cd6114"]]},{"id":"2fb3d3bf.20ff24","type":"comment","z":"7a472838.fcd788","name":"Philips Remote","info":"","x":640,"y":400,"wires":[]},{"id":"92775fa5.41a8a","type":"ui_button","z":"7a472838.fcd788","name":"<-","group":"e48b1652.82182","order":21,"width":2,"height":2,"passthru":true,"label":"","tooltip":"","color":"","bgcolor":"","icon":"fa-arrow-left","payload":"RC6_ANDROIDRETURN","payloadType":"str","topic":"topic","topicType":"msg","x":710,"y":1520,"wires":[["f7b04fb1.cc3298"]]},{"id":"2eeeb271.fa122e","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":580,"y":1520,"wires":[["92775fa5.41a8a"]]},{"id":"e81cd3f9.e8bb18","type":"ui_button","z":"7a472838.fcd788","name":"Plus","group":"e48b1652.82182","order":22,"width":2,"height":2,"passthru":true,"label":"","tooltip":"","color":"","bgcolor":"","icon":"fa-plus","payload":"RC6_ANDROIDPLUS","payloadType":"str","topic":"topic","topicType":"msg","x":710,"y":1560,"wires":[["f7b04fb1.cc3298"]]},{"id":"edc57808.f973a8","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":580,"y":1560,"wires":[["e81cd3f9.e8bb18"]]},{"id":"1313210.173d25f","type":"ui_button","z":"7a472838.fcd788","name":"Home","group":"e48b1652.82182","order":23,"width":2,"height":2,"passthru":true,"label":"","tooltip":"","color":"","bgcolor":"","icon":"fa-home","payload":"RC6_ANDROIDHOME","payloadType":"str","topic":"topic","topicType":"msg","x":710,"y":1600,"wires":[["f7b04fb1.cc3298"]]},{"id":"97ce2cb1.f97ff8","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":580,"y":1600,"wires":[["1313210.173d25f"]]},{"id":"a30b7192.20fd5","type":"ui_button","z":"7a472838.fcd788","name":"Red","group":"e48b1652.82182","order":24,"width":1,"height":1,"passthru":true,"label":"","tooltip":"","color":"red","bgcolor":"","icon":"fa-circle","payload":"RC6_RED","payloadType":"str","topic":"topic","topicType":"msg","x":710,"y":1640,"wires":[["f7b04fb1.cc3298"]]},{"id":"f2fa173a.14a7f8","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":580,"y":1640,"wires":[["a30b7192.20fd5"]]},{"id":"cab6ddf.7d6402","type":"ui_button","z":"7a472838.fcd788","name":"Green","group":"e48b1652.82182","order":25,"width":1,"height":1,"passthru":true,"label":"","tooltip":"","color":"green","bgcolor":"","icon":"fa-circle","payload":"RC6_GREEN","payloadType":"str","topic":"topic","topicType":"msg","x":710,"y":1680,"wires":[["f7b04fb1.cc3298"]]},{"id":"77881242.1ce514","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":580,"y":1680,"wires":[["cab6ddf.7d6402"]]},{"id":"7aaff854.ea80c8","type":"ui_button","z":"7a472838.fcd788","name":"Yellow","group":"e48b1652.82182","order":27,"width":1,"height":1,"passthru":true,"label":"","tooltip":"","color":"yellow","bgcolor":"","icon":"fa-circle","payload":"RC6_YELLOW","payloadType":"str","topic":"topic","topicType":"msg","x":710,"y":1720,"wires":[["f7b04fb1.cc3298"]]},{"id":"e38c66b1.09eaf8","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":580,"y":1720,"wires":[["7aaff854.ea80c8"]]},{"id":"55a96b5c.34b704","type":"ui_button","z":"7a472838.fcd788","name":"Blue","group":"e48b1652.82182","order":28,"width":1,"height":1,"passthru":true,"label":"","tooltip":"","color":"blue","bgcolor":"","icon":"fa-circle","payload":"RC6_BLUE","payloadType":"str","topic":"topic","topicType":"msg","x":710,"y":1760,"wires":[["f7b04fb1.cc3298"]]},{"id":"eb4dd3cc.3096b8","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":580,"y":1760,"wires":[["55a96b5c.34b704"]]},{"id":"b3881d2b.3fb49","type":"ui_button","z":"7a472838.fcd788","name":"","group":"e48b1652.82182","order":2,"width":3,"height":2,"passthru":true,"label":"NETFLIX","tooltip":"","color":"red","bgcolor":"","icon":"","payload":"RC6_NETFLIX","payloadType":"str","topic":"topic","topicType":"msg","x":1040,"y":440,"wires":[["f7b04fb1.cc3298"]]},{"id":"ad6292.8f0c557","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":900,"y":440,"wires":[["b3881d2b.3fb49"]]},{"id":"c7c61bea.45a67","type":"ui_button","z":"7a472838.fcd788","name":"Prog +","group":"e48b1652.82182","order":14,"width":2,"height":2,"passthru":true,"label":"+","tooltip":"","color":"","bgcolor":"","icon":"fa-tv","payload":"RC6_PROGPLUS","payloadType":"str","topic":"topic","topicType":"msg","x":1030,"y":480,"wires":[["f7b04fb1.cc3298"]]},{"id":"e28b310.c5dffd","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":900,"y":480,"wires":[["c7c61bea.45a67"]]},{"id":"d3fbd274.0b748","type":"ui_button","z":"7a472838.fcd788","name":"Prog '","group":"e48b1652.82182","order":20,"width":2,"height":2,"passthru":true,"label":"-","tooltip":"","color":"","bgcolor":"","icon":"fa-tv","payload":"RC6_PROGMINUS","payloadType":"str","topic":"topic","topicType":"msg","x":1030,"y":520,"wires":[["f7b04fb1.cc3298"]]},{"id":"3c3a6da4.e20842","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":900,"y":520,"wires":[["d3fbd274.0b748"]]},{"id":"a088a588.611c8","type":"ui_button","z":"7a472838.fcd788","name":"Mute","group":"e48b1652.82182","order":26,"width":2,"height":1,"passthru":true,"label":"","tooltip":"","color":"","bgcolor":"","icon":"volume_off","payload":"RC6_MUTE","payloadType":"str","topic":"topic","topicType":"msg","x":1030,"y":560,"wires":[["f7b04fb1.cc3298"]]},{"id":"3a171cce.01c0bc","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":900,"y":560,"wires":[["a088a588.611c8"]]},{"id":"4ab86af5.3fc2a4","type":"ui_button","z":"7a472838.fcd788","name":"Stop","group":"e48b1652.82182","order":41,"width":2,"height":2,"passthru":true,"label":"","tooltip":"","color":"","bgcolor":"","icon":"fa-stop","payload":"RC6_STOP","payloadType":"str","topic":"topic","topicType":"msg","x":1030,"y":600,"wires":[["f7b04fb1.cc3298"]]},{"id":"618d3812.fb9d88","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":900,"y":600,"wires":[["4ab86af5.3fc2a4"]]},{"id":"2398b72a.bb7e4","type":"ui_button","z":"7a472838.fcd788","name":"Pause","group":"e48b1652.82182","order":42,"width":2,"height":2,"passthru":true,"label":"","tooltip":"","color":"","bgcolor":"","icon":"fa-pause","payload":"RC6_PAUSE","payloadType":"str","topic":"topic","topicType":"msg","x":1030,"y":640,"wires":[["f7b04fb1.cc3298"]]},{"id":"db8bc32.45cfbc","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":900,"y":640,"wires":[["2398b72a.bb7e4"]]},{"id":"abcc8ee6.b8594","type":"ui_button","z":"7a472838.fcd788","name":"Record","group":"e48b1652.82182","order":43,"width":2,"height":2,"passthru":true,"label":"","tooltip":"","color":"","bgcolor":"","icon":"fa-circle","payload":"RC6_RECORD","payloadType":"str","topic":"topic","topicType":"msg","x":1040,"y":680,"wires":[["f7b04fb1.cc3298"]]},{"id":"441c59c0.826d78","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":900,"y":680,"wires":[["abcc8ee6.b8594"]]},{"id":"ada645a0.7a3f98","type":"ui_button","z":"7a472838.fcd788","name":"Rewind","group":"e48b1652.82182","order":44,"width":2,"height":2,"passthru":true,"label":"","tooltip":"","color":"","bgcolor":"","icon":"fa-backward","payload":"RC6_REWIND","payloadType":"str","topic":"topic","topicType":"msg","x":1040,"y":720,"wires":[["f7b04fb1.cc3298"]]},{"id":"498d913a.0e668","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":900,"y":720,"wires":[["ada645a0.7a3f98"]]},{"id":"4ca6b7d3.32a27","type":"ui_button","z":"7a472838.fcd788","name":"Forward","group":"e48b1652.82182","order":46,"width":2,"height":2,"passthru":true,"label":"","tooltip":"","color":"","bgcolor":"","icon":"fa-forward","payload":"RC6_FORWARD","payloadType":"str","topic":"topic","topicType":"msg","x":1040,"y":760,"wires":[["f7b04fb1.cc3298"]]},{"id":"7183f45f.a28d2c","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":900,"y":760,"wires":[["4ca6b7d3.32a27"]]},{"id":"9d3513f9.62764","type":"ui_button","z":"7a472838.fcd788","name":"Play","group":"e48b1652.82182","order":45,"width":2,"height":2,"passthru":true,"label":"","tooltip":"","color":"","bgcolor":"","icon":"fa-play","payload":"RC6_PLAY","payloadType":"str","topic":"topic","topicType":"msg","x":1030,"y":800,"wires":[["f7b04fb1.cc3298"]]},{"id":"1c80e117.0c2c3f","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":900,"y":800,"wires":[["9d3513f9.62764"]]},{"id":"bfe2e37c.df22d8","type":"ui_button","z":"7a472838.fcd788","name":"Subtitle","group":"e48b1652.82182","order":38,"width":2,"height":2,"passthru":true,"label":"","tooltip":"","color":"","bgcolor":"","icon":"subtitles","payload":"RC6_SUBTITLE","payloadType":"str","topic":"topic","topicType":"msg","x":1040,"y":840,"wires":[["f7b04fb1.cc3298"]]},{"id":"7c3eb118.c751c8","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":900,"y":840,"wires":[["bfe2e37c.df22d8"]]},{"id":"1cb6390.b75b0c7","type":"ui_button","z":"7a472838.fcd788","name":"","group":"e48b1652.82182","order":40,"width":2,"height":2,"passthru":true,"label":"Text","tooltip":"","color":"","bgcolor":"","icon":"","payload":"RC6_TEXT","payloadType":"str","topic":"topic","topicType":"msg","x":1030,"y":880,"wires":[["f7b04fb1.cc3298"]]},{"id":"41ae80ed.bd67a","type":"inject","z":"7a472838.fcd788","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":900,"y":880,"wires":[["1cb6390.b75b0c7"]]},{"id":"e132e7a.5184818","type":"ui_template","z":"7a472838.fcd788","group":"e48b1652.82182","name":"","order":49,"width":0,"height":0,"format":"<div ng-bind-html="msg.payload"></div>\n<style>\n.md-button {\n font-size: 20px !important;\n border-radius: 20px;\n}\n\n</style>","storeOutMessages":true,"fwdInMessages":true,"resendOnRefresh":true,"templateScope":"local","x":815,"y":399,"wires":[[]]},{"id":"e84be541.072ae","type":"ui_group","name":"NAD AVR2","tab":"b704b2ac.dd10b8","order":1,"disp":false,"width":"6","collapse":false},{"id":"e48b1652.82182","type":"ui_group","name":"PHILIPS","tab":"d3aad50b.a480e","order":2,"disp":false,"width":"6","collapse":false},{"id":"b704b2ac.dd10b8","type":"ui_tab","name":"AMPLI NAD","icon":"fa-volume-up","order":1,"disabled":false,"hidden":false},{"id":"d3aad50b.a480e","type":"ui_tab","name":"TV PHILIPS","icon":"fa-tv","order":2,"disabled":false,"hidden":false}]
</pre>
<p>Voici quelques copies d'écran de l'interface utilisateur, simulant les 2 télécommandes (NAD AVR2 et TV Philips OLED dernière génération. C'est particulièrement pratique sur mobile, car cela supporte le "wipe" ou balayage latéral pour passer d'une télécommande à une autre. Ici, vu sur ordinateur. La copie d'écran centrale montre le menu de sélection sur PC.</p>
<p><a href="https://civade.com/images/ir/nodered-UI-1.png" title="nodered-UI-1.png, mai 2021"><img src="https://civade.com/images/ir/.nodered-UI-1_m.png" alt="nodered-UI-1.png, mai 2021" class="media-left" title="nodered-UI-1.png, mai 2021"></a>
<a href="https://civade.com/images/ir/nodered-UI-2.png" title="nodered-UI-2.png, mai 2021"><img src="https://civade.com/images/ir/.nodered-UI-2_m.png" alt="nodered-UI-2.png, mai 2021" class="media-left" title="nodered-UI-2.png, mai 2021"></a>
<a href="https://civade.com/images/ir/nodered-UI-3.png" title="nodered-UI-3.png, mai 2021"><img src="https://civade.com/images/ir/.nodered-UI-3_m.png" alt="nodered-UI-3.png, mai 2021"></a></p>
<p>Voici qui termine la suite des 4 articles. J'espère vous avoir donné l'envie d'aller plus loin car c'est vraimetn puisant et on peut faire plein de choses.. N'hésitez pas à me laisser un commentaire pour me décrire vos réalisations !</p>
<h3>Sommaire des articles de la série:</h3>
<ul>
<li><a href="https://civade.com/post/2021/05/02/IR-remote-1/4-%3A-Comprendre-et-analyser-les-signaux-d-une-télécommande-infrarouge">IR remote 1/4 : Comprendre et analyser les signaux d'une télécommande infrarouge</a></li>
<li><a href="https://civade.com/post/2021/05/02/IR-remote-2/4-%3A-Emission-réception-infrarouge-via-LIRC-sur-Raspberry-PI-ou-Orange-Pi">IR remote 2/4 : Emission réception infrarouge via LIRC sur Raspberry PI ou Orange Pi</a></li>
<li><a href="https://civade.com/post/2021/05/02/IR-remote-3/4-%3A-Emetteur-infrarouge-/-wifi-sur-ESP32">IR remote 3/4 : Emetteur infrarouge / wifi sur ESP32</a></li>
<li>IR remote 4/4 : Télécommande Wifi avec Nodered + LIRC + ESP32</li>
</ul>https://civade.com/post/2021/05/02/IR-remote-4/4-%3A-T%C3%A9l%C3%A9commande-Wifi-avec-Nodered-LIRC-ESP32#comment-formhttps://civade.com/feed/atom/comments/116IR remote 3/4 : Emetteur infrarouge / wifi sur ESP32urn:md5:4e182d0bff54bdb764f39d197fa93cf32021-05-02T06:45:00+02:002024-02-27T06:39:42+01:00jphiTechnologiesArduinoDomotiqueEmbarquéESP8266FirmwareOpenSourceRaspberrySysadmin<p>Avec le premier volet, nous avons appris comment fonctionnent les codes infrarouges envoyés par les télécommandes, et fabriqué un petit périphérique qui associé au logiciel IRScrutinizer, permettent des les décoder. Le 2e volet était consacré à l'émission réception de codes infrarouge sur linux (raspberry PI, Orange PI ou tout autre système linux). Dans ce troisième volet, nous allons réaliser un petit périphérique WIfi basé sur un ESP 32, capable d'envoyer des codes infrarouge en substitution de votre télécommande, à partir du réseau.</p> <h3>Généralités et cahier des charges</h3>
<p><a href="https://civade.com/images/ir/m5stick.jpg" title="m5stick.jpg, mai 2021"><img src="https://civade.com/images/ir/.m5stick_m.jpg" alt="m5stick.jpg, mai 2021"></a></p>
<p>L'idée générale, avec ce périphérique est de permettre l'envoi de codes infrarouges, à partir d'une commande reçue du réseau local. Cela permet de déporter ce périphérique là ou il y en a besoin (et même de l'intégrer dans un appareil, comme un ampli audio vidéo par exemple), tout en gardant la capacité de l'interfacer avec un système de domotique ou basé sur Node Red.</p>
<p>Ici, j'ai choisi d'utiliser un ESP32, bien qu'un ESP8266 puisse également faire le job. Une attention toute particulière a été portée sur l'émission infrarouge, afin de pouvoir piloter les leds avec un niveau de puissance suffisant pour permettre de 'tirer loin". En effet, certaines de ces leds sont pilotables avec des courants pouvant aller jusqu'à 100ma, ce qui permet d'augmenter substantiellement la portée.</p>
<p>Les sorties de l'ESP32 étant en 3.3V et sous très faible puissance, il va donc nous falloir réaliser un booster pour permettre de sortie ces courants. Ceci va être fait avec un MOSFET.</p>
<p>Par ailleurs, disposant d'un ampli NAD avec une entrée "IR In", j'ai creusé la possibilité de connecter directement le signal IR directement sur l'ampli.</p>
<p>Nad indique à propos de ce connecteur qu'il permet de raccorder un signal modulé à 38khz ou non, en logique positive, et d'une amplitude de 5v max. Il est disponible sur un connecteur 3.5mm, avec le plus sur la pointe, et le 0V sur l'anneau. Après avoir fait quelques essais,il est apparu que l'impédance de l'entrée est relativement basse et qu'on ne peut pas y mettre directement une sortie de micro contrôleur, sinon le signal s'effondre et l'ampli ne comprend qu'une commande sur 10. Il faut l'amplifier avec un transistor.</p>
<p>Voici le synoptique résultant du dispositif souhaité :</p>
<p><a href="https://civade.com/images/ir/synoptic.png" title="synoptic.png, mai 2021"><img src="https://civade.com/images/ir/.synoptic_m.png" alt="synoptic.png, mai 2021"></a></p>
<h3>Réalisation matérielle</h3>
<p>Les étages d'amplification (buffer) ont étés réalisés avec des N Channel FET 2N7000. En voici le schéma. La partie "NAD" peut être omise si vous n'en avez pas besoin.</p>
<p><a href="https://civade.com/images/ir/sch.png" title="sch.png, mai 2021"><img src="https://civade.com/images/ir/.sch_m.png" alt="sch.png, mai 2021"></a></p>
<p>La réalisation ne pose pas de problème particulier à part le brochage du 2N7000 et les tests car les leds infrarouge n'émettent pas de lumière visible. Vous pouvez utiliser une webcam ou la caméra d'un smartphone pour visualiser la lumière infrarouge. Attention, car les iphones sont munis de filtres IR qui ne permettent pas de visualiser les leds IR... Donc android ou webcam... Il suffit de mettre l'entrée à 3.3V pour que les leds s'allument. Si ce n'est pas le cas, c'est que vous avez un problème de câblage (leds à l'envers par exemple..). A noter que la résistance de R1peut être recalculée en fonction du courant souhaité avec la formule R = (5- (2x1.7) ) / I ou I est en courant souhaité. Sur certaines led IR on peut monter jusqu'à 0.1A (100ma). 0.05A peut être une valeur médiane acceptable.</p>
<h3>Le logiciel</h3>
<p>Le logiciel s'appuie en grande partie sur la bibliothèque IRremoteESP8266 qui fournit tout ce qu'il faut pour gérer de multiples formats infrarouge.</p>
<p>Après avoir inclus la bibliothèque :</p>
<pre>#include <IRremoteESP8266.h>
#include <IRsend.h></pre>
<p>Il faut initialiser l'objet irsend quelque par dans la fonction setup :</p>
<pre>irsend.begin();</pre>
<p>Ensuite on peut utiliser les fonctions d'envoi dédiées à chaque protocole. Par exemple pour envoyer une commande au format NEC</p>
<pre>irsend.sendNEC (0xE13E01FE,32,3);</pre>
<p>Ici, on envoie 3 fois le code NEC étendu (adresse sur 16 bits + données sur 8 bits + complément de données sur 8 bits) avec <a href="https://civade.com/post/2021/05/02/IR-remote-3/4-%3A-Emetteur-infrarouge-/appareil = E1, sous fonction= 3E, touche=01, complément à 1 de touche =FE" title="appareil = E1, sous fonction= 3E, touche=01, complément à 1 de touche =FE">appareil = E1, sous fonction= 3E, t...</a>. Le mot total fait donc 32 bits.</p>
<p>N'oubliez pas que dans le format NEC, on envoie le LSB en premier pour chaque octet (voir article sur le décodage).</p>
<p>Autre exemple pour un format Philips RC6</p>
<pre>irsend.sendRC6(0x000CU + 0x10000U*rc6Toggle, 20U);</pre>
<p>A noter que pour le format RC6, un bit doit changer d'état à chaque transmission (0 ou 1), ce qui justifie le "rc6Toggle" sur la ligne.
La longueur de la trame fait 20 bits.</p>
<p>Ce code est un exemple, adapté à mes périphérique et il faudra que vous l'adaptiez aux vôtres. Pour cela il vous faudra certainement consulter la documentation de IRremoteESP8266 ici: <a href="https://github.com/crankyoldgit/IRremoteESP8266/blob/master/SupportedProtocols.md">https://github.com/crankyoldgit/IRremoteESP8266/blob/master/SupportedProtocols.md</a> car la bibliothèque inclut de nombreux protocoles .</p>
<pre>
/* NADRemote32
* (c) 05/2021 JP CIVADE. Licence GPL 3.
*
* Pour ESP32, permet d'envoyer des codes de télécommande NAD AVR2 (par exemple pour ampli T742) sur appel réseau.
* Nécessite la bibliothèque IRremoteESP8266 . Utilise le format pronto pour définir les codes de la télécommande.
*
* Sur M5stick, nécessite aussi les bibliothèques M5stick et u8g2.
*
* Il suffit de lui envoyer la commande http://nad-esp32.local/ir?code=MYCODE
* MYCODE doit être remplacé par l'un des codes supportés :
*
* POUR LE NAD:
* ---------------------------------------------------------------------------------------------------------------------
* RCVR_POWER, AM, FM/AM, KEY_SLEEP, KEY_DVD, KEY_SAT, KEY_VCR, KEY_VIDEO_4, KEY_VIDEO_5, EXT._5.1, KEY_CD, KEY_TAPE, FM,
* RCVR_POWER, AM, FM/AM, KEY_SLEEP, KEY_DVD, KEY_SAT, KEY_VCR, KEY_VIDEO_4, KEY_VIDEO_5, EXT._5.1, KEY_CD, KEY_TAPE, FM,
* FM/AM, RCVR_1, RCVR_2, RCVR_3, RCVR_4, RCVR_5, RCVR_6, RCVR_7, RCVR_8, RCVR_9, RCVR_0, RCVR_SURR, RCVR_DYN.R, RCVR_TEST,
* RCVR_LEVEL, RCVR_VOLUME_UP, RCVR_VOLUME_DOWN, RCVR_TUNE_DOWN, RCVR_TUNE_UP, RCVR_MUTE_ENTER, RCVR_DISPLAY, RCVR_TUNE_MODE
*
* POUR LA TV PHILIPS
* ----------------------------------------------------------------------------------------------------------------------
* RC6_POWER RC6_VOLPLUS RC6_VOLMINUS RC6_PROGPLUS RC6_PROGMINUS RC6_OK RC6_LEFT RC6_RIGHT RC6_UP RC6_DOWN RC6_ANDROIDRETURN
* RC6_NETFLIX RC6_ANDROIDPLUS RC6_ANDROIDHOME RC6_MUTE RC6_1 RC6_2 RC6_3 RC6_4 RC6_5 RC6_6 RC6_7 RC6_8 RC6_9 RC6_0
* RC6_RED RC6_GREEN RC6_YELLOW RC6_BLUE RC6_STOP RC6_PAUSE RC6_RECORD RC6_REWIND RC6_PLAY RC6_FORWARD RC6_SUBTITLE RC6_TEXT
* RC6_AMBILIGHT RC6_SOURCES RC6_SETTINGS RC6_TOPPICKS RC6_SEARCH RC6_EXIT RC6_TVGUIDE RC6_RIGHTMENU RC6_LIST
*
* A chaque réception de trame et envoi de code, la led intégrée à l'ESP clignote. Le code IR pour NAD est envoyé 3 fois pour plus de sureté.
*
* Une LED IR doit être branchée sur la broce 4 (D2), idéalement pilotée par un ampli (FET).
* Le courant dans la led peut aller de 40 ma à 100ma sur certaines LED.
* Si mises en série et alimentées en 5V et commutées par un FET, le calcul de la résistance s'effectue comme suit ;
* R = (5 - 1.7 - 1.7) / 0.04 = 40 ohms pour 40 ma.
* R = (5 - 1.7 - 1.7) / 0.05 = 32 ohms pour 50 ma.
* R = (5 - 1.7 - 1.7) / 0.10 = 16 ohms pour 100 ma.
*
* Sur M5stick, les broches sont adaptées pour utiiser la led interne, l'émetteur IR interne, et le plus grand bouton (B1).
* Le bouton B1 permet d'envoyer la commande Power du NAD.
* L'afficheur LCD affiche l'adresse IP ainsi que chaque commande émise en IR.
*
* Pour télécommander un ampli NAD, l'entrée IR IN peut également être utilisée. Dans ce cas, il faut
* bufferiser la sortie (avec un 7407 en collecteur ouvert et pullup de 1K) avant de l'utiliser.
* En effet, l'entrée IR du NAD consomme beaucoup de courant.
*
* Peut être mis à jour à la volée soit en browsant la page http://nad-esp32.local et en sélectionnant le fichier à envoyer ou
* par le terminal avec curl -F "image=@firmware.bin" nad-esp32.local/update
*
*/
#include <Arduino.h>
#include <IRremoteESP8266.h>
#include <IRsend.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
#include <ESPmDNS.h>
#include <Update.h>
#ifdef ARDUINO_M5Stick_C
#include <M5StickC.h>
#endif
// Configure Wifi and device name here
const char *ssid = "mon-ssid";
const char *password = "mon_password";
const char* host = "nad-esp32";
static unsigned int rc6Toggle = 0;
// End config.
#ifdef ARDUINO_M5Stick_C
#warning M5 Stick version
// wiring here https://github.com/m5stack/M5StickC
const uint16_t kIrLed = 9; // M5stickC is 9
#define LEDON 0
#define LEDOFF 1
const int led = GPIO_NUM_10; // 10
#else // Standard arduino
#warning Arduino version
const uint16_t kIrLed = 4; // ESP32 GPIO pin to use. Recommended: 4 (D2).
#define LEDON 1
#define LEDOFF 0
const int led = LED_BUILTIN;
#endif
IRsend irsend(kIrLed); // Set the GPIO to be used to sending the message.
WebServer server(80);
void handleRoot() {
digitalWrite(led, LEDON);
char temp[400];
int sec = millis() / 1000;
int min = sec / 60;
int hr = min / 60;
// for automatic refresh, add on headers
// <meta http-equiv='refresh' content='5'/>\
snprintf(temp, 400,
"<html>\
<head>\
<title>ESP32 NAD Remote</title>\
<style>\
body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\
</style>\
</head>\
<body>\
<h1>Hello from ESP32!</h1>\
<p>Uptime: %02d:%02d:%02d</p>\
<form method='POST' action='/update' enctype='multipart/form-data'>\
<input type='file' name='update'><input type='submit' value='Update'>\
</form>\
</body>\
</html>",
hr, min % 60, sec % 60
);
server.send(200, "text/html", temp);
digitalWrite(led, LEDOFF);
}
void handleIR() {
digitalWrite(led, LEDON);
String message = "OK\n\n";
String command = "";
String displaymsg = "";
// Get params
for (uint8_t i = 0; i < server.args(); i++) {
if ( server.argName(i) == "code" ) {
command = server.arg(i);
message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
}
}
if (command == "RCVR_POWER") {
irsend.sendNEC (0xE13E01FE,32,3);
displaymsg = "RCVR_POWER";
}
if (command == "AM") {
irsend.sendNEC (0xE13EBB44,32,3);
displaymsg = "AM";
}
if (command == "FM/AM") {
irsend.sendNEC (0xE13EBB44,32,3);
displaymsg = "FM/AM";
}
if (command == "KEY_SLEEP") {
irsend.sendNEC (0xE13E04FB,32,3);
displaymsg = "KEY_SLEEP";
}
if (command == "KEY_DVD") {
irsend.sendNEC (0xE13E43BC,32,3);
displaymsg = "KEY_DVD";
}
if (command == "KEY_SAT") {
irsend.sendNEC (0xE13E03FC,32,3);
displaymsg = "KEY_SAT";
}
if (command == "KEY_VCR") {
irsend.sendNEC (0xE13E837C,32,3);
displaymsg = "KEY_VCR";
}
if (command == "KEY_VIDEO_4") {
irsend.sendNEC (0xE13E0CF3,32,3);
displaymsg = "KEY_VIDEO_4";
}
if (command == "KEY_VIDEO_5") {
irsend.sendNEC (0xE13E8C73,32,3);
displaymsg = "KEY_VIDEO_5";
}
if (command == "EXT._5.1") {
irsend.sendNEC (0xE13E748B,32,3);
displaymsg = "EXT._5.1";
}
if (command == "KEY_CD") {
irsend.sendNEC (0xE13EA15E,32,3);
displaymsg = "KEY_CD";
}
if (command == "KEY_TAPE") {
irsend.sendNEC (0xE13EB14E,32,3);
displaymsg = "KEY_TAPE";
}
if (command == "FM") {
irsend.sendNEC (0xE13EBB44,32,3);
displaymsg = "FM";
}
if (command == "FM/AM") {
irsend.sendNEC (0xE13EBB44,32,3);
displaymsg = "FM/AM";
}
if (command == "RCVR_1") {
irsend.sendNEC (0xE13E51AE,32,3);
displaymsg = "";
}
if (command == "RCVR_2") {
irsend.sendNEC (0xE13E718E,32,3);
displaymsg = "RCVR_2";
}
if (command == "RCVR_3") {
irsend.sendNEC (0xE13E49B6,32,3);
displaymsg = "RCVR_3";
}
if (command == "RCVR_4") {
irsend.sendNEC (0xE13E6996,32,3);
displaymsg = "";
}
if (command == "RCVR_5") {
irsend.sendNEC (0xE13ED12E,32,3);
displaymsg = "RCVR_5";
}
if (command == "RCVR_6") {
irsend.sendNEC (0xE13EF10E,32,3);
displaymsg = "RCVR_6";
}
if (command == "RCVR_7") {
irsend.sendNEC (0xE13EC936,32,3);
displaymsg = "RCVR_7";
}
if (command == "RCVR_8") {
irsend.sendNEC (0xE13EE916,32,3);
displaymsg = "RCVR_8";
}
if (command == "RCVR_9") {
irsend.sendNEC (0xE13E19E6,32,3);
displaymsg = "RCVR_9";
}
if (command == "RCVR_0") {
irsend.sendNEC (0xE13EE31C,32,3);
displaymsg = "RCVR_0";
}
if (command == "RCVR_SURR") {
irsend.sendNEC (0xE13E33CC,32,3);
displaymsg = "RCVR_SURR";
}
if (command == "RCVR_DYN.R") {
irsend.sendNEC (0xE13EF40B,32,3);
displaymsg = "RCVR_DYN.R";
}
if (command == "RCVR_TEST") {
irsend.sendNEC (0xE13EB34C,32,3);
displaymsg = "RCVR_TEST";
}
if (command == "RCVR_LEVEL") {
irsend.sendNEC (0xE13ED42B,32,3);
displaymsg = "RCVR_LEVEL";
}
if (command == "RCVR_VOLUME_UP") {
irsend.sendNEC (0xE13E11EE,32,3);
displaymsg = "RCVR_VOLUME_UP";
}
if (command == "RCVR_VOLUME_DOWN") {
irsend.sendNEC (0xE13E31CE,32,3);
displaymsg = "RCVR_VOLUME_DOWN";
}
if (command == "RCVR_TUNE_DOWN") {
irsend.sendNEC (0xE13E8B74,32,3);
displaymsg = "RCVR_TUNE_DOWN";
}
if (command == "RCVR_TUNE_UP") {
irsend.sendNEC (0xE13E4BB4,32,3);
displaymsg = "RCVR_TUNE_UP";
}
if (command == "RCVR_MUTE_ENTER") {
irsend.sendNEC (0xE13E29D6,32,3);
displaymsg = "RCVR_MUTE_ENTER";
}
if (command == "RCVR_DISPLAY") {
irsend.sendNEC (0xE13E649B,32,3);
displaymsg = "RCVR_DISPLAY";
}
if (command == "RCVR_TUNE_MODE") {
irsend.sendNEC (0xE13ECC33,32,3);
displaymsg = "RCVR_TUNE_MODE";
}
//*************************************************************
// Philips TV Commmands
if (command == "RC6_POWER") {
irsend.sendRC6(0x000CU + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_POWER";
}
if (command == "RC6_VOLPLUS") {
irsend.sendRC6(0x0010U + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_VOLPLUS";
}
if (command == "RC6_VOLMINUS") {
irsend.sendRC6(0x0011U + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_VOLMINUS";
}
if (command == "RC6_PROGPLUS") {
irsend.sendRC6(0x0020U + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_PROGPLUS";
}
if (command == "RC6_PROGMINUS") {
irsend.sendRC6(0x0021U + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_PROGMINUS";
}
if (command == "RC6_OK") {
irsend.sendRC6(0x005CU + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_OK";
}
if (command == "RC6_LEFT") {
irsend.sendRC6(0x005AU + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_LEFT";
}
if (command == "RC6_RIGHT") {
irsend.sendRC6(0x005BU + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_RIGHT";
}
if (command == "RC6_UP") {
irsend.sendRC6(0x0058U + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_UP";
}
if (command == "RC6_DOWN") {
irsend.sendRC6(0x0059U + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_DOWN";
}
if (command == "RC6_ANDROIDRETURN") {
irsend.sendRC6(0x000AU + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_ANDROIDRETURN";
}
if (command == "RC6_NETFLIX") {
irsend.sendRC6(0x0076U + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_NETFLIX";
}
if (command == "RC6_ANDROIDPLUS") {
irsend.sendRC6(0x0040U + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_ANDROIDPLUS";
}
if (command == "RC6_ANDROIDHOME") {
irsend.sendRC6(0x0054U + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_ANDROIDHOME";
}
if (command == "RC6_MUTE") {
irsend.sendRC6(0x000DU + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_MUTE";
}
if (command == "RC6_1") {
irsend.sendRC6(0x0001U + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_1";
}
if (command == "RC6_2") {
irsend.sendRC6(0x0002U + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_2";
}
if (command == "RC6_3") {
irsend.sendRC6(0x0003U + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_3";
}
if (command == "RC6_4") {
irsend.sendRC6(0x0004U + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_4";
}
if (command == "RC6_5") {
irsend.sendRC6(0x0005U + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_5";
}
if (command == "RC6_6") {
irsend.sendRC6(0x0006U + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_6";
}
if (command == "RC6_7") {
irsend.sendRC6(0x0007U + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_7";
}
if (command == "RC6_8") {
irsend.sendRC6(0x0008U + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_8";
}
if (command == "RC6_9") {
irsend.sendRC6(0x0009U + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_9";
}
if (command == "RC6_0") {
irsend.sendRC6(0x0000U + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_0";
}
if (command == "RC6_RED") {
irsend.sendRC6(0x006DU + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_RED";
}
if (command == "RC6_GREEN") {
irsend.sendRC6(0x006EU + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_GREEN";
}
if (command == "RC6_YELLOW") {
irsend.sendRC6(0x006FU + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_YELLOW";
}
if (command == "RC6_BLUE") {
irsend.sendRC6(0x0070U + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_BLUE";
}
if (command == "RC6_STOP") {
irsend.sendRC6(0x0031U + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_STOP";
}
if (command == "RC6_PAUSE") {
irsend.sendRC6(0x0030U + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_PAUSE";
}
if (command == "RC6_RECORD") {
irsend.sendRC6(0x0037U + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_RECORD";
}
if (command == "RC6_REWIND") {
irsend.sendRC6(0x002BU + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_REWIND";
}
if (command == "RC6_PLAY") {
irsend.sendRC6(0x002CU + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_PLAY";
}
if (command == "RC6_FORWARD") {
irsend.sendRC6(0x0028U + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_FORWARD";
}
if (command == "RC6_SUBTITLE") {
irsend.sendRC6(0x004BU + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_SUBTITLE";
}
if (command == "RC6_TEXT") {
irsend.sendRC6(0x003CU + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_TEXT";
}
if (command == "RC6_AMBILIGHT") {
irsend.sendRC6(0x008FU + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_AMBILIGHT";
}
if (command == "RC6_SOURCES") {
irsend.sendRC6(0x0038U + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_SOURCES";
}
if (command == "RC6_SETTINGS") {
irsend.sendRC6(0x00C0U + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_SETTINGS";
}
if (command == "RC6_TOPPICKS") {
irsend.sendRC6(0x0074U + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_TOPPICKS";
}
if (command == "RC6_SEARCH") {
irsend.sendRC6(0x00B4U + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_SEARCH";
}
if (command == "RC6_EXIT") {
irsend.sendRC6(0x009FU + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_EXIT";
}
if (command == "RC6_TVGUIDE") {
irsend.sendRC6(0x00CCU + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_TVGUIDE";
}
if (command == "RC6_RIGHTMENU") {
irsend.sendRC6(0x0057U + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_RC6_RIGHTMENU";
}
if (command == "RC6_LIST") {
irsend.sendRC6(0x00D2U + 0x10000U*rc6Toggle, 20U);
rc6Toggle = 1U - rc6Toggle;
displaymsg = "RC6_LIST";
}
if (displaymsg!=""){
#ifdef ARDUINO_M5Stick_C
M5.Lcd.println(displaymsg);
#endif
}
else {
// default message : unknown
displaymsg="Unknown command";
}
server.send(200, "text/plain", message);
digitalWrite(led, LEDOFF);
}
void handleNotFound() {
digitalWrite(led, LEDON);
String message = "File Not Found\n\n";
message += "URI: ";
message += server.uri();
message += "\nMethod: ";
message += (server.method() == HTTP_GET) ? "GET" : "POST";
message += "\nArguments: ";
message += server.args();
message += "\n";
for (uint8_t i = 0; i < server.args(); i++) {
message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
}
server.send(404, "text/plain", message);
digitalWrite(led, LEDOFF);
}
void setup() {
#ifdef ARDUINO_M5Stick_C
M5.begin();
M5.Lcd.fillScreen(BLACK);
M5.Axp.ScreenBreath(12);
#endif
irsend.begin();
Serial.begin(115200, SERIAL_8N1);
pinMode(led, OUTPUT);
digitalWrite(led, LEDOFF);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.println("");
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
#ifdef ARDUINO_M5Stick_C
M5.Lcd.println(WiFi.localIP());
#endif
if (MDNS.begin(host)) {
Serial.println("MDNS responder started");
}
// Home page
server.on("/", handleRoot);
// /inline for tests
server.on("/inline", []() {
server.send(200, "text/plain", "this works as well");
});
// manage IR codes
server.on("/ir", handleIR);
// updater : /update
server.on("/update", HTTP_POST, []() {
server.sendHeader("Connection", "close");
server.send(200, "text/plain", (Update.hasError()) ? "FAIL" : "OK");
ESP.restart();
}, []() {
HTTPUpload& upload = server.upload();
if (upload.status == UPLOAD_FILE_START) {
Serial.setDebugOutput(true);
Serial.printf("Update: %s\n", upload.filename.c_str());
if (!Update.begin()) { //start with max available size
Update.printError(Serial);
}
} else if (upload.status == UPLOAD_FILE_WRITE) {
if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) {
Update.printError(Serial);
}
} else if (upload.status == UPLOAD_FILE_END) {
if (Update.end(true)) { //true to set the size to the current progress
Serial.printf("Update Success: %u\nRebooting...\n", upload.totalSize);
} else {
Update.printError(Serial);
}
Serial.setDebugOutput(false);
} else {
Serial.printf("Update Failed Unexpectedly (likely broken connection): status=%d\n", upload.status);
}
});
server.onNotFound(handleNotFound);
server.begin();
MDNS.addService("http", "tcp", 80);
Serial.printf("Ready! Open http://%s.local in your browser\n", host);
}
void loop() {
server.handleClient();
#ifdef ARDUINO_M5Stick_C
if ( M5.BtnA.wasPressed() ){
// send power if bigest button pressed.
digitalWrite(led, LEDON);
irsend.sendPronto(NadPower, 76, 3);
M5.Lcd.println("RCVR_POWER");
digitalWrite(led, LEDOFF);
}
M5.update();
#endif
delay(1);
}
</pre>
<h3>Alternative matérielle avec un M5StickC</h3>
<p><a href="https://civade.com/images/ir/m5stick.jpg" title="m5stick.jpg, mai 2021"><img src="https://civade.com/images/ir/.m5stick_m.jpg" alt="m5stick.jpg, mai 2021"></a></p>
<p>Il y a quelques mois, j'avais fait un petit article sur un tout petit périphérique sympa : le M5StickC (<a href="https://civade.com/post/2019/12/08/M5Stick-C-Une-petite-plateforme-de-d%C3%A9veloppement-IOT-%C3%A0-10-USD">cliquer pour voir l'article</a>) . Comme celui-ci a le bon gout d'implémenter un émetteur infrarouge intégré, le programme ci dessous était facile à modifier pour :</p>
<ul>
<li>Utiliser l'émetteur infrarouge intégré</li>
<li>Utiliser a led intégrée pour acquitter une transmission infrarouge</li>
<li>Utiliser l'afficheur intégré pour afficher l'adresse ip du périphérique et le code Infrarouge recu</li>
<li>Gérer le bouton pour envoyer un code local (ici, NAD Power On/Off)</li>
</ul>
<p>La portée n'est vraiment pas terrible, il faut que cela soit à moins d'un mètre. En tout cas, cela permet de tester et débugger le code. Pratique !</p>
<h3>Sommaire des articles de la série:</h3>
<ul>
<li><a href="https://civade.com/post/2021/05/02/IR-remote-1/4-%3A-Comprendre-et-analyser-les-signaux-d-une-télécommande-infrarouge">IR remote 1/4 : Comprendre et analyser les signaux d'une télécommande infrarouge</a></li>
<li><a href="https://civade.com/post/2021/05/02/IR-remote-2/4-%3A-Emission-réception-infrarouge-via-LIRC-sur-Raspberry-PI-ou-Orange-Pi">IR remote 2/4 : Emission réception infrarouge via LIRC sur Raspberry PI ou Orange Pi</a></li>
<li>IR remote 3/4 : Emetteur infrarouge / wifi sur ESP32</li>
<li><a href="https://civade.com/post/2021/05/02/IR-remote-4/4-%3A-Télécommande-Wifi-avec-Nodered-LIRC-ESP32">IR remote 4/4 : Télécommande Wifi avec Nodered + LIRC + ESP32</a></li>
</ul>https://civade.com/post/2021/05/02/IR-remote-3/4-%3A-Emetteur-infrarouge-/-wifi-sur-ESP32#comment-formhttps://civade.com/feed/atom/comments/115IR remote 2/4 : Emission réception infrarouge via LIRC sur Raspberry PI ou Orange Piurn:md5:f439ee65e350ce1e2f88e92ff321570a2021-05-02T06:42:00+02:002024-02-27T06:40:00+01:00jphiTechnologiesArduinoDomotiqueEmbarquéESP32ESP8266FirmwareOpenSourceRaspberrySysadmin<p>Deuxième article de la série, nous allons maintenant utiliser le périphérique réalisé lors du premier article pour doter un système Linux (y compris Raspberry Pi ou Orange Pi) de capacités d'émission réception de codes infrarouge. Nous verrons également comment activer le récepteur infrarouge intégré à certaines Orange PI et configurer LIRC.</p> <h3>Installer Lirc et les outils complémentaires</h3>
<p>A noter qu'en marge de ce tuto, vous pouvez vous documenter sur LIRC et son installation, par exemple sur <a href="https://wiki.archlinux.org/title/LIRC">https://wiki.archlinux.org/title/LIRC</a> ou <a href="https://www.sigmdel.ca/michel/ha/opi/ir_02_en.html">https://www.sigmdel.ca/michel/ha/opi/ir_02_en.html</a>.</p>
<h4>Installation des paquets Debian</h4>
<ul>
<li>Installation de lirc et des outils complémentaires</li>
</ul>
<pre>sudo apt install -y lirc setserial ir-keytable</pre>
<ul>
<li>Vérification des services lirc installés et de leur état :</li>
</ul>
<pre>
root@debian10:~# sudo systemctl status lirc*
● lircd.socket
Loaded: loaded (/lib/systemd/system/lircd.socket; enabled; vendor preset: enabled)
Active: active (running) since Thu 2021-04-29 08:27:09 CEST; 3 days ago
Listen: /run/lirc/lircd (Stream)
CGroup: /system.slice/lircd.socket
Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.
● lircd.service - Flexible IR remote input/output application support
Loaded: loaded (/lib/systemd/system/lircd.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2021-04-29 08:27:11 CEST; 3 days ago
Docs: man:lircd(8)
http://lirc.org/html/configure.html
Main PID: 785 (lircd)
Tasks: 2 (limit: 2065)
Memory: 1.9M
CGroup: /system.slice/lircd.service
└─785 /usr/sbin/lircd --nodaemon
</pre>
<p>Les fichiers de configuration de lirc sont dans /etc/lirc.</p>
<ul>
<li>/etc/lirc/lirc_options.conf : configuration générale du driver et du périphérique de capture</li>
<li>/etc/lirc/lircd.conf.d/ : répertoire contenant les configurations des différentes télécommandes supportées.</li>
</ul>
<h4>Première configuration de LIRC pour périphérique de capture Agirs</h4>
<p>Il va donc nous falloir repérer la liaison série sur laquelle le périphérique Agirs est détecté, vérifier son bon fonctionnement puis l'intégrer dans les fichier de config. Il faut tout d'abord le brancher sur un port USB de disponible, puis :</p>
<ul>
<li>Détection du périphérique sur lequel est vu Agirs</li>
</ul>
<pre>dmesg | egrep --color 'serial|ttyS|ttyA'</pre>
<ul>
<li>Le périphérique détecté apparait comme suit :</li>
</ul>
<pre>
[ 5.015854] systemd[1]: Created slice system-serial\x2dgetty.slice.
[338051.139147] cdc_acm 7-1:1.0: __ttyACM0__: USB ACM device
</pre>
<ul>
<li>Ici il est donc détecté en /dev/ttyACM0</li>
<li>Ouvrir le terminal via screen</li>
</ul>
<pre>
screen /dev/ttyACM0
</pre>
<ul>
<li>Vous devriez être accueilli par la bannière de Girs</li>
</ul>
<pre>
GirsLite 1.0.3
</pre>
<ul>
<li>Vérifier la liste des modules supportés sur Agirs</li>
</ul>
<pre>modules</pre>
<ul>
<li>Agirs renvoie la liste des modules supportés</li>
</ul>
<pre>
Base Transmit Capture Receive Decoder Led Parameters Pronto
</pre>
<ul>
<li>Lancer une reconnaissance de code IR (et appuyer sur une touche de la télécommande pointée vers le dispositif de capture...)</li>
</ul>
<pre>Receive</pre>
<ul>
<li>Agirs répond avec les timings de la touche. Un + correspond à un front montant et un - à un front descendant. Le chiffre correspond au temps en microsecondes.</li>
</ul>
<pre>
+8900 -4500 +550 -1650 +550 -550 +550 -550 +600 -550 +550 -550 +550 -550 +550 -600 +500 -600 +550 -550 +550 -1700 +550 -1650 +550 -1650 +600 -1650 +550 -1700 +550 -1650 +550 -1700 +550 -550 +550 -550 +550 -600 +500 -600 +550 -550 +550 -550 +550 -550 +600 -1650 +550 -1700 +500 -1700 +550 -1700 +550 -1650 +550 -1650 +600 -1650 +550 -1700 +500 -600 +550 -39500 +8900 -2200 +600 -50100
</pre>
<ul>
<li>Quitter screen: Taper <strong>Ctr]</strong>+<strong>a</strong> puis <strong>:quit</strong> et <strong>ENTREE</strong></li>
<li>Tester la bonne réception avec le bon driver sur agirs</li>
</ul>
<pre>
mode2 --driver girs --device /dev/ttyACM0
</pre>
<ul>
<li>Doit renvoyer une liste de pulses au format LIRC:</li>
</ul>
<pre>
...
space 39500
pulse 8900
space 2250
pulse 500
space 50100
...
</pre>
<ul>
<li>Quitter mode 2 avec <strong>CTRL</strong> + <strong>C</strong></li>
</ul>
<p>A ce stade, nous avons pu vérifier qu'Agirs fonctionne convenablement et est bien vu par le système et LIRC. Il nous reste à l'intégrer dans le fichier de config de LIRC. Pour ce faire, éditer /etc/lirc/lirc_options.conf et remplacer les 2 lignes suivantes (en adaptant avec votre propre port bien sur)</p>
<pre>driver = girs
device = /dev/ttyACM0</pre>
<p>Il ne reste plus qu'à redémarrer LIRC pour prendre en compte la config :</p>
<pre>
systemctl stop lircd.service
systemctl stop lircd.socket
systemctl start lircd.socket
systemctl start lircd.service
systemctl restart lircd-uinput.service
</pre>
<h4>OU première configuration de LIRC pour récepteur IR intégré (Orange PI)</h4>
<p>Si vous disposez d'une Orange Pi avec récepteur infrarouge intégré, vous pouvez bien sur ajouter Agirs comme à l'étape précédent OU utiliser ce récepteur intégré. Vous y perdrez la capacité d'émission, mais par contre vous utiliserez un périphérique interne, donc sans ajouter de hardware... A vous de voir en fonction du scénario d'usage que vous envisagez.</p>
<p><a href="https://civade.com/images/ir/OrangePiPcPlus.jpg" title="OrangePiPcPlus.jpg, mai 2021"><img src="https://civade.com/images/ir/.OrangePiPcPlus_m.jpg" alt="OrangePiPcPlus.jpg, mai 2021"></a></p>
<p>Il faut tout d'abord activer le périphérique de capture LIRC dans le noyau. Pour ce faire, lancer la commande</p>
<pre>
armbian-config
</pre>
<p>Puis aller dans "System" / "Hardware" / "CIR" et l'activer. Quitter et rebooter l'Orange PI</p>
<p>L'activation dans la config se fait en éditant le fichier /etc/lirc/lirc_options.conf</p>
<pre>
driver = default
device = /dev/lirc0
</pre>
<p>Il ne reste plus qu'à redémarrer LIRC pour prendre en compte la config :</p>
<pre>
systemctl stop lircd.service
systemctl stop lircd.socket
systemctl start lircd.socket
systemctl start lircd.service
systemctl restart lircd-uinput.service
</pre>
<h3>Configuration de LIRC</h3>
<h4>Intégration des configurations de vos télécommandes</h4>
<p>C'est l'étape un peu critique dans LIRC. Nous avons vu dans l'article précédent comment utiliser Agirs pour reconnaitre les codes de votre télécommande.</p>
<h5>A partir d'une télécommande recensée en base de données</h5>
<p>LIRC dispose d'une base de données en ligne avec un certain nombre de télécommande. On ne va pas se mentir, la base de données n'est pas fabuleusement bien maintenue. Il n'y a pas toutes les télécommandes, et parfois les fichiers de config sont un peu fantaisistes. Nous avons vu que l'on peut générer des signaux soit en mode intelligent en précisant un protocole et les données, soit en mode 'raw' ou les signaux sont émis comme une suite de 0 et de 1, sans comprendre à quoi ils servent (comme lorsqu'une télécommande programmable fonctionne en mode apprentissage). Si vous avez la chance que votre télécommande soit supportée et que le contributeur ait fait l'effort de décrire le fichier de config de façon à utiliser le protocole, c'est clairement le mieux.</p>
<p>Pour rechercher dans la base de données, c'est assez simple, il suffit de taper irdb-get find suivi d'une chaine à chercher. Ce peut être la marque ou le modèle. Supposons que je cherche le fichier pour une télécommande NAD AVR-2 :</p>
<pre>
root@debian10:~# irdb-get find nad
morgan's_daytona/Tornado.lircd.conf
nad/451.lircd.conf
nad/AVR2.lircd.conf
nad/AVR2.lircd.conf
nad/CDP-5425.lircd.conf
nad/RC512.lircd.conf
nad/SR6.lircd.conf
nad/SR712.lircd.conf
</pre>
<p>ou</p>
<pre>
root@debian10:~# irdb-get find AVR2
harman_kardon/AVR210.irman.lircd.conf
harman_kardon/AVR240.lircd.conf
harman_kardon/AVR25.lircd.conf
nad/AVR2.lircd.conf
nad/AVR2.lircd.conf
</pre>
<p>J'ai de la chance, le modèle est supporté et est dans nad/AVR2.lircd.conf. Je vais donc pouvoir le récupérer :</p>
<pre>
irdb-get download nad/AVR2.lircd.conf
Downloaded https://sourceforge.net/p/lirc-remotes/code/ci/master/tree/remotes/nad/AVR2.lircd.conf as AVR2.lircd.conf
</pre>
<p>Je vous encourage à revoir le fichier de config, <strong>avant de le copier dans /etc/lirc/lircd.conf.d/</strong></p>
<p>Il existe d'autres bases de données de codes de télécommande en ligne, mais qui vont nécessiter un peu de travail pour créer le fichier de config LIRC. <a href="https://github.com/probonopd/irdb">https://github.com/probonopd/irdb</a> par exemple. Si je reprend mon exemple de télécommande NAD, en parcourant les répertoires par marque je trouve le fichier https://github.com/probonopd/irdb/blob/master/codes/NAD/Surround%20Processor/135%2C124.csv . Il décrit effectivement la plupart des commandes de ma télécommande en protocole NEC. Comme c'est un tableur CSV, il faut utiliser IR Scrutinizer pour créer chacun des codes (onglet generate), les copier dans l'onglet de génération de configuration ("To Param Remote"), puis lorsque la description de la télécommande est complete, l'exporter au format LIRC ("Export Param Remote" format "LIRC".</p>
<p>Remote Central (http://www.remotecentral.com) a pas mal de codes également, mais au format "pronto". IL faut ensuite les convertir dans IR Scrutinizer, puis les décoder avec Scrutinize pour en faire quelque chose...</p>
<h5>à Partir de votre propre config</h5>
<p>Vous pouvez également fabriquer votre propre fichier de configuration avec IR Scrutinizer (voir l<a href="https://civade.com/post/2021/05/02/IR-remote-1/4-%3A-Comprendre-et-analyser-les-signaux-d-une-t%C3%A9l%C3%A9commande-infrarouge">e premier article de la série</a> pour les bases de l'usage).
Tout d'abord, il peut être de bon ton d'utiliser des noms de fonctions standard dans linux. L'interfaçage avec des fonctions du système en sera simplifié. Si vous ne souhaitze pas déclencher des actions dans linux par votre télécommande, ce n'est pas indispensable, vous pouvez les nommer comme bon vous semble.</p>
<p>Pour obtenir la liste des codes standards dans LIRC, il vous suffit de faire :</p>
<pre>
irrecord --list-namespace
</pre>
<p>Une longue liste de noms s'en suivra.. Vous pouvez la copier coller dans un fichier texte pour référence lors de la constitution de votre fichier de configuration de télécommande.</p>
<p>Une fois la configuration de toutes les touches décrite dans l'onglet Scrutinize Remote, soit dans l'onglet "Parametric remote" si le protocole est connu/supporté, soit dans l'onglet "Raw remote" si le protocole est inconnu, vous allez pouvoir aller dans l'onglet d'exportation et choisir le format LIRC Raw (pour une télécommande "Raw", ou une sortie "Raw" sur une télécommande "Parametric"), soit le format LIRC (pour une télécommande "Parametric" uniquement ) puis cliquer sur le bouton correspondant à votre formar ("Export Parametric Remote" ou "Export Raw remote"). Une boite de dialogue va s'ouvrir pour vous demander de documenter votre format :</p>
<p><a href="https://civade.com/images/ir/export-name.png" title="export-name.png, mai 2021"><img src="https://civade.com/images/ir/export-name.png" alt="export-name.png, mai 2021"></a></p>
<p>A l'issue de l'export, la fenêtre de status vous indique ou le fichier a été écrit et comment ils se nomme :</p>
<pre>File C:\Users\jpcivade\Documents\IrScrutinizer\lirc_2021-05-06_07-20-01.lircd.conf was successfully written</pre>
<p>Si l'on ouvre ce fichier avec un éditeur de texte, on va pouvoir voir plusieurs sections. Le documentation est ici : https://www.lirc.org/html/lircd.conf.html . La première est une section de commentaires, basées sur les informations d’identification saisies précédemment :</p>
<pre>
# IrScrutinizer parametric export
#
# Creating tool: IrScrutinizer version 2.3.0
# Creating user: jpcivade
# Creating date: Thu May 06 07:20:01 CEST 2021
# Encoding: WINDOWS-1252
#
# Manufacturer: NONAME
# Model: IR-005
# Displayname: LED-IR-005
# Device Class:
# Remotename:
#
# Protocol name: NEC1
</pre>
<p>La seconde est une section de description du protocole. La voici agrémentée de commentaires pour vous aider à comprendre les différentes directives :</p>
<pre>
# Début de la configuration d'une télécommande
begin remote
# Nom dans LIRC
name LED-IR-005-nec1
# Le format fait 32 bits
bits 32
# L'encodage utilisé repose sur la longeur de l'espace après l'impulsion de bit.
# La trame est de longeur constante quelle que soient les données.
flags SPACE_ENC|CONST_LENGTH
# tolérance relative d'erreur en %
eps 30
# tolérance d'erreur absulue en uS
aeps 100
# Longeur de l'impulsion et de l'espace qui définissent un zéro (en microsecondes)
zero 564 564
# Idem pour un 1
one 564 1692
# Impulsion précédant les données utiles (longueur de l’impulsion puis de l'espace en microsecondes)
header 9024 4512
# Impulsion de fin, qui suit les données (longueur en us).
ptrail 564
# Format de l’impulsion qui code une répétition de code (longueur de l’impulsion puis de l'espace en microsecondes)
repeat 9024 2256
# espacement minimum entre 2 codes
gap 108000
# Fréquence d'émission. Il peut pourrait être sage de le corrige et mettre 38000 (38Khz) qui est plus standard.
frequency 38400
# Ici commencent les codes
begin codes
# Pour chaque touche, le code à transmettre.
KEY_POWER 0x00000000807F01FE
KEY_MODE 0x00000000807F41BE
KEY_VOLUMEUP 0x00000000807F21DE
KEY_BRIGHTNESSUP 0x00000000807FA15E
KEY_DELAY 0x00000000807F619E
KEY_VOLUMEDOWN 0x00000000807F11EE
KEY_BRIGHTNESSDOWN 0x00000000807F916E
KEY_CLEARDELAY 0x00000000807F51AE
KEY_REDPLUS 0x00000000807F31CE
KEY_GREENPLUS 0x00000000807FB14E
KEY_BLUEPLUS 0x00000000807F718E
KEY_REDMINUS 0x00000000807F09F6
KEY_GREENMINUS 0x00000000807F8976
KEY_BLUEMINUS 0x00000000807F49B6
KEY_CLEAR 0x00000000807F29D6
KEY_COLOR 0x00000000807FA956
KEY_SAVE 0x00000000807F6996
end codes
end remote
</pre>
<p>J'ai plusieurs remarques à faire sur le format. Ici, il s'agit d'une petite télécommande format carte de crédit qui était livrée avec des bandeaux de Led. C'est au format NEC1 (2 octets).
Chaque touche, est exprimée en 4 octets (les 2 octets et leur complément à 1, voir article précédent de la série pour un décodage NEC expliqué). Or, le code d'équipement est constant sur toutes les touches (807F). Il aurait probablement été plus simple de le matérialiser avec un entête constant de 16 bits (code équipement) pour ne garder que 16 bits sur les codes de touche.</p>
<p>Voici la configuration (sans les commentaires) remaniée pour tenir compte de ces remarques. A noter le passage en 16 bits au lieu de 32, et l'ajout d'un "pre_data" de 16 bits avec le code de l'équipement. Les codes quand à eux sont exprimés sur 16 bits également au lieu des 64 bits vus précédemment. C'est quand même plus lisible non? :</p>
<pre>
begin remote
name LED-IR-005
bits 16
flags SPACE_ENC|CONST_LENGTH
eps 30
aeps 100
zero 564 564
one 564 1692
header 9024 4512
ptrail 564
repeat 9024 2256
gap 108000
# Equipement code 0x80 0d128
pre_data_bits 16
pre_data 0x807F
frequency 38000
begin codes
KEY_POWER 0x01FE
KEY_MODE 0x41BE
KEY_VOLUMEUP 0x21DE
KEY_BRIGHTNESSUP 0xA15E
KEY_DELAY 0x619E
KEY_VOLUMEDOWN 0x11EE
KEY_BRIGHTNESSDOWN 0x916E
KEY_CLEARDELAY 0x51AE
KEY_REDPLUS 0x31CE
KEY_GREENPLUS 0xB14E
KEY_BLUEPLUS 0x718E
KEY_REDMINUS 0x09F6
KEY_GREENMINUS 0x8976
KEY_BLUEMINUS 0x49B6
KEY_CLEAR 0x29D6
KEY_COLOR 0xA956
KEY_SAVE 0x6996
end codes
end remote
</pre>
<p>Cela n'apporte rien d'un point de vue fonctionnel, à part la correction sur la fréquence de transmission que l'on a remise à 38Khz. Par contre, c'est plus facile à lire et maintenir.</p>
<p>Cette télécommande étant sérigraphiée "LED-IR-005", nous allons nommer ce fichier led-ir005.lircd.conf<strong> et le copier dans /etc/lirc/lircd.conf.d/</strong> pour l'intégrer à LIRC.</p>
<h4>Vérification des codes supportés</h4>
<p>A l'étape précédente, nous avons copié au moins un fichier dans le répertoire /etc/lirc/lircd.conf.d/ qui contient les configurations des télécommandes. Il ne reste plus qu'à redémarrer LIRC pour prendre en compte la config :</p>
<pre>
systemctl stop lircd.service
systemctl stop lircd.socket
systemctl start lircd.socket
systemctl start lircd.service
systemctl restart lircd-uinput.service
</pre>
<h4>Tests</h4>
<p>Tout d'abord, nous allons interroger la configuration mise en place pour savoir quels sont les télécommandes dont la configuration a été intégrée/comprise dans lirc aux étapes précédentes. Ici nous avons 4 télécommandes, dont 2 comprises dans un même fichier (NAD) car c'est une télécommande multifonction avec un petit interrupteur pour passer du mode DVD au mode AMPLI.</p>
<pre>
root@debian10:/etc/lirc/lircd.conf.d# irsend LIST "" ""
DENON_RC920-denon
LED-IR-005
NAD_AVR2-RCVR
NAD_AVR2-DVD
</pre>
<p>On peut descendre plus bas, en listant les codes supportés par une télécommande en particulier. Ici nous allons demander les codes de la petite télécommande format carte de crédit qui était utilisée sur le pilotage d'un bandeau de led :</p>
<pre>
root@debian10:/etc/lirc/lircd.conf.d# irsend LIST "LED-IR-005" ""
00000000807f01fe KEY_POWER
00000000807f41be KEY_MODE
00000000807f21de KEY_VOLUMEUP
00000000807fa15e KEY_BRIGHTNESSUP
00000000807f619e KEY_DELAY
00000000807f11ee KEY_VOLUMEDOWN
00000000807f916e KEY_BRIGHTNESSDOWN
00000000807f51ae KEY_CLEARDELAY
00000000807f31ce KEY_REDPLUS
00000000807fb14e KEY_GREENPLUS
00000000807f718e KEY_BLUEPLUS
00000000807f09f6 KEY_REDMINUS
00000000807f8976 KEY_GREENMINUS
00000000807f49b6 KEY_BLUEMINUS
00000000807f29d6 KEY_CLEAR
00000000807fa956 KEY_COLOR
00000000807f6996 KEY_SAVE
</pre>
<p>Si vous avez mis en périphérique réalisé dans le premier article du tuto (Agirs) et que celui-ci est bien configuré, vous pourez envoyer des codes infrarouge par la commande suivante. Cela ne sera bien sur pas supporté avec le récepteur intégré à l'orange pi, car il n'y a pas la fonction émission :</p>
<pre>
irsend SEND_ONCE NAD_AVR2-RCVR RCVR_POWER
</pre>
<p>Ici, nous allons envoyer une fois (SEND_ONCE ) un code d'allumage/extinction de l'appareil "RCVR_POWER" à l'ampli NAD "NAD_AVR2". Toutes les constantes de nom de code ou de télécommande auront bien sur été relevées par les commandes précédentes.</p>
<p>Il est également possible de tester la réception de codes infrarouge. Une commande spécifique permet de lire le socket et d'afficher les codes reçus. Il suffit de lancer "irw" et de pointer l'une des télécommandes configurées sur le récepteur. Le code est affiché à chaque réception ;</p>
<pre>
root@debian10:~# irw
00000000e13e01fe 00 RCVR_POWER NAD_AVR2-RCVR
00000000e13e01fe 01 RCVR_POWER NAD_AVR2-RCVR
00000000e13e01fe 02 RCVR_POWER NAD_AVR2-RCVR
</pre>
<p>Le premier nombre, nous donne le code recu sur la télécommande. Ici (protocole NEC2), le code Apareil est E1, le code fonction est 3E, et le code touche 01FE,.
L'octet seul ensuite, nous donne le nombre de répétition. COMme je me suis un peu endori sur la touche, il voit l'appui (00) initial et 2 répétitions (01 et 02).
Enfin, viennent en clair le nom la touche (RCVR_POWER ) et de l'appareil (NAD_AVR2-RCVR).</p>
<p>Notre LIRC recoit désormais les codes infrarouges émis par nos télécommandes!</p>
<h3>Utilisation avancée</h3>
<h4>Déclencher des actions dans l'OS par des codes infrarouges</h4>
<p>Il est possible de déclencher des actions dans le système d'exploitation via la télécommande infrarouge.
Pour ce faire, il faut créer un fichier de configuration /etc/lirc/irexec.lircrc qui va contenir autant de bloc comme celui ci que de commandes souhaitées.</p>
<pre>
begin
prog = irexec
remote = LED-IR-005
button = KEY_MODE
config = /usr/sbin/shutdown -h now
repeat = 1
end
begin
prog = irexec
remote = LED-IR-005
button = KEY_POWER
config = /usr/sbin/shutdown -r now
repeat = 1
end
</pre>
<p>Ici, j'ai assigné le bouton Power à l'arrêt du système, et le bouton mode à un reboot. En adaptant 'button' et 'config' vous pouvez pratiquement faire n'importe quoi.
Peut être pour éviter de rebooter une commande "echo KEY_POWER" pourrait être une bonne idée...</p>
<p>Pour que cela fonctione, il faut lancer irexec en mode daemon avec</p>
<pre>
irexec -d
</pre>
<p>Si tout fonctionne il ne vous reste plus qu'à rendre permanent le démarrage du service avec</p>
<pre>
systemctl inlircd-uinput.service
</pre>
<p>Maintenant, votre télécommande contrôle certaines fonctions du système et notamment permet d'arrêter ou de redémarrer une raspberry sans se logger. Pratique !</p>
<p>Cet tout pour ce 2e volet, mais vous pourrez encore creuser le sujet qui offre de nombreuses possibilités en consultant la <a href="https://www.lirc.org/html/">documentation de LIRC</a>.</p>
<h3>Sommaire des articles de la série:</h3>
<ul>
<li><a href="https://civade.com/post/2021/05/02/IR-remote-1/4-%3A-Comprendre-et-analyser-les-signaux-d-une-télécommande-infrarouge">IR remote 1/4 : Comprendre et analyser les signaux d'une télécommande infrarouge</a></li>
<li>IR remote 2/4 : Emission réception infrarouge via LIRC sur Raspberry PI ou Orange Pi</li>
<li><a href="https://civade.com/post/2021/05/02/IR-remote-3/4-%3A-Emetteur-infrarouge-/-wifi-sur-ESP32">IR remote 3/4 : Emetteur infrarouge / wifi sur ESP32</a></li>
<li><a href="https://civade.com/post/2021/05/02/IR-remote-4/4-%3A-Télécommande-Wifi-avec-Nodered-LIRC-ESP32">IR remote 4/4 : Télécommande Wifi avec Nodered + LIRC + ESP32</a></li>
</ul>https://civade.com/post/2021/05/02/IR-remote-2/4-%3A-Emission-r%C3%A9ception-infrarouge-via-LIRC-sur-Raspberry-PI-ou-Orange-Pi#comment-formhttps://civade.com/feed/atom/comments/114IR remote 1/4 : Comprendre et analyser les signaux d'une télécommande infrarougeurn:md5:eef3a65c245693faf0beaef402d067f52021-05-02T06:38:00+02:002024-02-27T06:40:21+01:00jphiTechnologiesArduinoDomotiqueEmbarquéESP32ESP8266FirmwareOpenSourceRaspberrySysadmin<p>Avant de pouvoir décoder et émettre des signaux infrarouge qui soient compris de vos appareils, il va d'abord nous falloir comprendre comment ceux ci sont générés / envoyés / décoder.</p> <h3>Un peu de théorie :</h3>
<p><a href="https://civade.com/images/ir/remotes.jpg" title="remotes.jpg, mai 2021"><img src="https://civade.com/images/ir/.remotes_m.jpg" alt="remotes.jpg, mai 2021"></a></p>
<p>L'objectif d'une télécommande Infrarouge, est de permettra la transmission de plusieurs octets vers un équipement. Sur les protocoles les plus simples, il y aura un octet d'adresse de périphérique, et un octet de données, mais certains protocoles codent l'adresse sur 2 octets, ou ajoutent un troisième octet de code de sous fonction dans l'équipement. Un octet peut prendre les valeurs 0 à 255.</p>
<p>Pour permettre l'envoi de données avec de la simple lumière, ces données doivent être sérialisées, c'est à dire transmises bit à bit dans leur représentation binaire.
Ainsi le nombre décimal 252 (0xAA en hexadécimal) se représentera 0b10101010 en binaire. En envoyant de la lumière pour un 1 et pas de lumière pour un zéro, et en transmettant les bits uns à uns, on a un moyen de faire de la transmission de données.</p>
<p>C'est d'ailleurs ce procédé qui est utilisé dans le Lifi, ou réseau informatique par la lumière ( voir <a href="https://en.wikipedia.org/wiki/Li-Fi">https://en.wikipedia.org/wiki/Li-Fi</a> ). Mais c'est une autre histoire...</p>
<h4>Bits, Bytes, Octets, MSB et LSB :</h4>
<p>Pour ceux qui ne maitrisent pas ces conversions, tous les systèmes d'exploitation modernes disposent d'une calculatrice intégrée, dont on peut changer le mode d'affichage pour faire ce type de conversions (ex sous Windows 10, en choisissant le mode "Programmeur en haut à gauche). A noter que l'on adjoint souvent un préfixe permettant de savoir dans quelle base le nombre est écrit (0x = hexadécimal, 0d = décimal, 0o = Octal, et 0b = binaire). Il est ainsi plus facile de savoir à quelle représentation on a affaire.</p>
<p>Lorsque nous notons des nombres, le chiffre qui a le plus de poids est à gauche. Il s'appelle le MSB (ou most significant Bit/Byte). Celui qui a le moins de poids s'appelle le LSB (ou Less Significant Bit/Byte). A noter que l'on peut parler de MSB pour des octets (Byte) lorsqu'il en a plusieurs, aussi bien que pour des Bits (valeur la plus élémentaire en binaire).</p>
<p>Ainsi lorsque nous notons 0xABCD, le MSB (ou octet de poids fort) est 0xAB, et 0xCD correspond à l'octet de poids faible. De la même manière, lorsque l'on note 0b10000000 le 1 correspond au MSB et le zéro le plus à droite au LSB.</p>
<p>Désolé pour ces notions, mais nous en aurons besoin plus tard...</p>
<h4>Convertir des bits en lumière et introduction de la modulation:</h4>
<p>Nous avons donc un moyen de convertir une valeur numérique en train d'impulsion lumineuses. Effectivement, on pourrait se contenter d'émettre dans l'infrarouge avec un protocole simpliste (ex : 1 = de la lumière, 0 = pas de lumière) à la façon du morse. Malheureusement, c'est une fausse bonne idée. En effet, même si l’œil n'est pas capable de détecter l'infrarouge, nous baignons dedans... Lumière solaire, etc.. seraient autant de perturbations qui rendraient le code invalide. C'est très précisément pour cela qu'a été introduite la notion de modulation.</p>
<p>Une modulation à haute fréquence est introduite sur le signal. Celle ci peut être à 30 kHz, 33 kHz, 36 kHz, 38 kHz, 40 kHz, et 56 kHz. Les plus fréquentes sont à 36 ou 38Khz. Les récepteurs infrarouge intègrent un étage de démodulation, qui permet de disposer d'une bonne immunité au bruit (lumières environnantes parasites qui elles ne sont pas modulées..).</p>
<p>Merci à SBProjects.com pour le gif et toutes les infos sur l'infrarouge :</p>
<p><a href="https://civade.com/images/ir/irmod.gif" title="irmod.gif, mai 2021"><img src="https://civade.com/images/ir/irmod.gif" alt="irmod.gif, mai 2021"></a></p>
<p>La chaine complète de traitement se comporte comme suit :</p>
<p><a href="https://civade.com/images/ir/Arduino-IR-Remote-Receiver-Tutorial-IR-Signal-Modulation.png" title="Arduino-IR-Remote-Receiver-Tutorial-IR-Signal-Modulation.png, mai 2021"><img src="https://civade.com/images/ir/.Arduino-IR-Remote-Receiver-Tutorial-IR-Signal-Modulation_m.png" alt="Arduino-IR-Remote-Receiver-Tutorial-IR-Signal-Modulation.png, mai 2021"></a></p>
<p><strong>Note importante :</strong> Il va être important de savoir a quelle fréquence de modulation une télécommande émet, car il faudra choisir le récepteur avec démodulateur intégré de la même fréquence, sous peine d'avoir une portée très limitée. A noter que même si la différence de fréquence de modulation semble faible (ex : 36 versus 38 Khz), l'étage de démodulation est suffisamment performant pour pratiquement exclure la modulation adjacente...</p>
<h4>Encodage des uns et des zéros</h4>
<p>Différents types d'encodage existent pour coder des uns et des zéros à partir d'un signal électrique ou lumineux :</p>
<p>Distance d'impulsion : une impulsion de longueur fixe, est suivie d'un espace dont la longueur est représentative d'un un ou un zéro.</p>
<p><a href="https://civade.com/images/ir/pulse-distance.png" title="pulse-distance.png, mai 2021"><img src="https://civade.com/images/ir/.pulse-distance_m.png" alt="pulse-distance.png, mai 2021"></a></p>
<p>Largeur d'impulsion : une impulsion de largeur variable est suivie d'un espace de longueur fixe. La largeur de l'impulsion représente un un ou un zéro.</p>
<p><a href="https://civade.com/images/ir/pulse-width.png" title="pulse-width.png, mai 2021"><img src="https://civade.com/images/ir/.pulse-width_m.png" alt="pulse-width.png, mai 2021"></a></p>
<p>Encodage par position d'impulsion (NRZ) : le temps est divisé en espaces de longueur fixe. La présence d'une impulsion représente un 1, tandis que son absence représente un zéro.</p>
<p><a href="https://civade.com/images/ir/pulse-position.png" title="pulse-position.png, mai 2021"><img src="https://civade.com/images/ir/.pulse-position_m.png" alt="pulse-position.png, mai 2021"></a></p>
<p>Encodage Manchester (Biphase) : Chaque bit est divisé en 2 demi bits. La transition d'un zéro à un un représente un 1 zéro logique, tandis que la transition d'un 1 à un zéro représente un 1 logique.</p>
<p><a href="https://civade.com/images/ir/manchester.png" title="manchester.png, mai 2021"><img src="https://civade.com/images/ir/.manchester_m.png" alt="manchester.png, mai 2021"></a></p>
<p>Beaucoup de codages infrarouge reposent sur le codage par largeur d'impulsion. C'est par exemple le cas de Nec, RC6, et Denon sur lesquels j'ai pu investiguer</p>
<h4>MSB et LSB dans une transmission IR</h4>
<p>Le dernier point restant à voir est l'ordre de transmission des bits. En effet, selon les protocoles, ce n'est pas constant.... Le protocole Nec, par exemple, transmet les LSB (ou bits de poids faible) d'abord... Cela oblige à une petite gymnastique pour remettre les bits dans l'ordre. C'est l'inverse pour les protocole RC6.</p>
<h3>Exemple de décodage avec le protocole NEC</h3>
<p>Le protocole de transmission Infrarouge de NEC utilise l'encodage de distance d'impulsion pour chaque bit. Chaque impulsion fait 562.5µs, à une fréquence de porteuse de 38kHz (26.3µs). Les bits sont transmis comme suit :</p>
<ul>
<li>'0' logique – une impulsion de 562.5µs suivie par un espace de 562.5µs soit un temps total de transmission de 1.125ms</li>
<li>'1' logique – une impulsion de 562.5µs suivie d'un espace de 1.6875ms soit un temps de transmission total de 2.25ms</li>
</ul>
<p>Lorsque une touche est appuyée sur la télécommande, un message est transmis avec dans l'ordre :</p>
<ul>
<li>Une impulsion de 9ms pour matérialiser le démarrage de la trame (16 X la longueur d'un bit de données)</li>
<li>Un espace de 4.5ms</li>
<li>Les 8 bits d'adresse du périphérique</li>
<li>L'inverse bit à bit de l'adresse logique</li>
<li>Les 8 bits de la commande</li>
<li>L'inverse bit à bit de la commande</li>
<li>Une impulsion finale de 562.5µs pour signifier la fin de la transmission</li>
</ul>
<p>Les 4 octets sont transmis avec le LSB (ou bit de poids le plus faible) d'abord. Le schéma ci dessous illustre le format d'une transmission NEC avec une adresse de 00h (00000000b) et une commande 0xAD (0b10101101):</p>
<p><a href="https://civade.com/images/ir/NECMessageFrame.png" title="NECMessageFrame.png, mai 2021"><img src="https://civade.com/images/ir/NECMessageFrame.png" alt="NECMessageFrame.png, mai 2021"></a></p>
<p>Les bits de la commande ou de l'adresse sont transmis dans l'ordre ( LSB ) 1 0 1 1 0 1 0 1 ( MSB ). Il faut dont les lire de droite à gauche pour reformer la commande originale ( MSB ) 1 0 1 0 1 1 0 1 ( LSB ) , soit 0xAD ou 173 en décimal.</p>
<p><strong>Code de répétition :</strong></p>
<p>Si la touche de la télécommande reste appuyée, un code de répétition est envoyé, typiquement 40ms après l'impulsion de fin de message.. Ce code de répétitionn sera envoyé à des intervalles de 108ms jusqu'à ce que la touche soit relancée. Ce code de répétition est constitué, dans l'ordre :</p>
<ul>
<li>D'une impulsion de départ de 9ms</li>
<li>D'un espace de 2.25ms</li>
<li>D'une impulsion de 562.5µs pour marquer la fin de la transmission</li>
</ul>
<p>Voici un exemple avec deux répétitions du code :</p>
<p><a href="https://civade.com/images/ir/NECRepeatCodes.png" title="NECRepeatCodes.png, mai 2021"><img src="https://civade.com/images/ir/NECRepeatCodes.png" alt="NECRepeatCodes.png, mai 2021"></a></p>
<p><strong>Protocole NEC1 ou NEC2 ?</strong></p>
<p>Une particularité du protocole NEC est que la longueur des trames est constante puisque pour chaque un transmis il y a aussi un zéro. Chaque octet étant transmis 2 fois (une fois normalement et une fois en complément à 1), cela permet de vérifier que la réception n'a pas été endommagée.</p>
<p>Toutefois, ce protocole étant très utilisé sur de nombreux périphériques, il est apparu qu'un seul octet pour l'adresse devenait insuffisant. Le complément de commande a donc été remplacé dans une évolution du protocole par un 2e octet d'adresse, en sacrifiant la redondance et la transmission de longueur fixe. Cette 2e version est souvent appelée NEC2, et la première NEC1.</p>
<p>Les 2 versions du protocole sont activement utilisées.</p>
<h3>Réalisation d'un dispositif de capture et décodage de codes infrarouges</h3>
<p>Il y a beaucoup de choses publiées sur internet concernant la capture, le décodage, l'émission de codes infrarouge. Je voulais un dispositif réutilisable avec un logiciel d'analyse qui permette de faire de l'analyse sur de multiples télécommandes. Le logiciel IR Scrutinizer (oui, non à chier..) associé au périphérique de capture DIY à base d'Arduino m'ont parus être un bon compromis. Fonctionnant en Java sur toutes les plateformes, il permet la capture, visualisation, fabrication de fichiers de config et même émission de codes.</p>
<p>Le périphérique de capture quand à lui est facile à fabriquer, utilisables sur n'importe quel ordinateur et même en périphérique externe pour LIRC sous Linux...</p>
<h4>Le matériel et le logiciel embarqué</h4>
<p>Le matériel est très facile à fabriquer. Reposant sur une Arduino Nano, il permet la réception via 2 récepteurs :</p>
<ul>
<li>L'un pour l'analyse de trames, sans démodulateur, ce qui permet d'analyser la fréquence de la porteuse.</li>
<li>L'un pour la réception de codes, avec un démodulateur 38Khz</li>
</ul>
<p>Il dispose également de leds infrarouge pour émission de signaux infrarouge, soit les signaux capturés, et même des signaux générés à l'aide du générateur intégré.</p>
<p>Enfin, plusieurs leds permettent de visualiser l'état du périphérique.</p>
<p>Sa réalisation est détaillée ICI : <a href="http://www.harctoolbox.org/arduino_nano.html">http://www.harctoolbox.org/arduino_nano.html</a>. J'ai trouvé le matériel sur le site TME.eu, à l'exception du récepteur démodulé "TSOP34438" que j'ai remplacé par un "TSOP34338" pratiquement équivalent.</p>
<p>A noter qu'il repose sur le programme AGIRS ( <a href="https://github.com/bengtmartensson/AGirs">https://github.com/bengtmartensson/AGirs</a> ) qui supporte beaucoup plus de fonctionnalités, comme Arduino Leonardo ou Pro micro, Arduino Mega avec Shield ethernet, etc.. Donc pour ceux qui veulent aller plus loin, c'est possible... et c'est prévu.</p>
<p>C'est d'ailleurs ce que j'ai fait sur arduino Pro Micro (compatible Leonardo) en ajoutant une led de status aux 3 déjà gérées, et un buffer sur les leds Infrarouge afin de leur faire cracher 100 ma. L'émetteur est désormais assez puissant pour taper à une distance de 6/7 mètres.</p>
<p>Vue de l'émeteur / récepteur Agirs à base d'Arduino pro micro:</p>
<p><a href="https://civade.com/images/ir/agirs.jpg" title="agirs.jpg, mai 2021"><img src="https://civade.com/images/ir/.agirs_m.jpg" alt="agirs.jpg, mai 2021"></a></p>
<h4>Logiciel de capture de trames et décodage : IRScrutinizer</h4>
<h5>Installation du logiciel et premiers pas</h5>
<p>Il va tout d'abord télécharger et installer le logiciel à partir du site <a href="http://www.harctoolbox.org/downloads/index.html">http://www.harctoolbox.org/downloads/index.html</a> (exemple "IrScrutinizer 1.1.3 setup.exe for Windows" ).</p>
<p>Ensuite à va vous falloir lancer le logiciel et configurer le périphérique de capture. Pour cela allez dans l'onglet "Sending Hw" (1), le sous onglet "Girs Client" (2), sélectionnez le port série ou le dispositif Agirs est raccordé (3), et cliquez sur "connect" (4). Un message avec la version d'Agirs devrait apparaitre en (5).</p>
<p><a href="https://civade.com/images/ir/irscrutinizer-config.png" title="irscrutinizer-config.png, mai 2021"><img src="https://civade.com/images/ir/.irscrutinizer-config_m.png" alt="irscrutinizer-config.png, mai 2021"></a></p>
<p>Placez la télécommande à capturer devant les capteurs :</p>
<p><a href="https://civade.com/images/ir/positionnement-telecommande.jpg" title="positionnement-telecommande.jpg, mai 2021"><img src="https://civade.com/images/ir/.positionnement-telecommande_m.jpg" alt="positionnement-telecommande.jpg, mai 2021"></a></p>
<p>Il est maintenant temps de procéder à votre première capture. Allez dans l'onglet "Scrutinize signal"(1). Appuyez ensuite sur "record" (2) puis sur une touche de la télécommande. Après capture et décodage, 'lécran se présente comme suit :</p>
<pre></pre>
<p><a href="https://civade.com/images/ir/irscrutinizer-capture.png" title="irscrutinizer-capture.png, mai 2021"><img src="https://civade.com/images/ir/.irscrutinizer-capture_m.png" alt="irscrutinizer-capture.png, mai 2021"></a></p>
<p>Le code reconnu est affiché en (3).. Ici, nous avons un protocole NEC1, avec 1 octet d'adresse et un octet de commande. Une fenêtre de visualisation montre ce qui a été reconnu (4). On voit également en (5) les longueurs en microsecondes des impulsions, ainsi que la fréquence de modulation (ici 38.461Khz).</p>
<p>Dans le graphe, on voir une impulsion à la fin qui est un "repeat code", comme expliqué dan sle décodage Nec plus haut. On le retrouve indiqué dans la valeur décodée ( NEC1: {D=1,F=128}, beg=0, end=71,<strong> reps=1</strong> )</p>
<p>A noter que dans le menu "Options", j'ai coché "Verbose", ce qui me permet d'avoir dans le champ "IRP" une version un peu plus bavarde, notamment avec la version binaire de ce qui a été récupéré :</p>
<p>{38.5k,543,msb}<1,-1|1,-3>(8901u,-8,A:32,1,-39.574m,8901u,-3,1,-65m){A=0b10000000011111110000000111111110}</p>
<p>Si nous nous attachons à cette version binaire, et extrayons 8 par 8 les bits, puis les retournons (n'oubliez pas: NEC transmet les LSB en premier..) nous avons :</p>
<ul>
<li>A=0b10000000011111110000000111111110</li>
<li>Premier octet : 10000000 . Remis avec le LSB à droite : 00000001. <strong>Valeur d'adresse = 0x01 soit 1 en décimal.</strong></li>
<li>Deuxième octet : 01111111 . C'est bien le strict complément à un du 1er octet. fin de traitement.</li>
<li>Troisième octet : 00000001 . Remis avec le LSB à droite : 10000000. <strong>Valeur de touche appuyée = 0x80 soit 128 en décimal.</strong></li>
<li>Quatrième octet : 11111110 . C'est bien le strict complément à un du 1er octet. fin de traitement.</li>
</ul>
<p>Nous retrouvons donc bien ce qui nous est indiqué comme valeur décodée ( NEC1: {D=1,F=128}, beg=0, end=71, reps=1 )</p>
<p>Voici un exemple de décodage réalisé avec le protocole NEC2, c'est à dire une une adresse d'équipement (D), une adresse de sous système (S) et un code de fonction (F), ici avec la touche Power d'une télécommande d'un Ampli AV NAD :</p>
<p><a href="https://civade.com/images/ir/nec1.png" title="nec1.png, mai 2021"><img src="https://civade.com/images/ir/.nec1_m.png" alt="nec1.png, mai 2021"></a></p>
<h5>Décodages complexes</h5>
<p>Pour d'autres protocole, c'est parfois plus difficile de comprendre. J'ai par exemple mis un moment sur le protocole Denon (variante du protocole Sharp), qui est moins bien documenté sur internet :</p>
<p><a href="https://civade.com/images/ir/denon.png" title="denon.png, mai 2021"><img src="https://civade.com/images/ir/.denon_m.png" alt="denon.png, mai 2021"></a></p>
<p>J'ai trouvé sur le net une doc qui n'est pas spécifique à mon appareil, mais donne des infos sur le protocole : <a href="https://civade.com/images/ir/AVRX1000_E300_IR_CODE_V01.pdf">AVRX1000_E300_IR_CODE_V01.pdf</a> . Le MSB serait transmis en premier, et les 15 bits utiles seraient regroupés comme suit :</p>
<pre>C1~C5 : SYSTEM ADDRESS= constante à 01000
C6~C11 : Data
C12,C13 : Extension bit : constante à 1 1
C14: constante à 0
C15 : constante à 0</pre>
<p>Autre particularité, il semblerait que la transmission se fasse en 3 fois : la première et la troisième avec le code normal, et la 2e avec les bits C6 à C15 inversés. On peut aisément le vérifier dans le flot de données récupérées décodées (en gras les bits inversés )</p>
<p>A=0b10000100011100,
B=0b1000<strong>1011100011</strong>,
C=0b10000100011100</p>
<p>Notre transmission semble ne faire que 14 bits alors que le document de décodage dit qu'il en fait 15... Si nous ajoutons un leading zero pour le décodage et nous remettons en forme les bits pour mieux le comprendre, cela donne :</p>
<p>C1 ~C5 : 01000 : System address = 8 en décimal pour un amplificateur... OK, ca tombe bien c'est la télécommande de mon ampli :).
C6 à C11 : 010001 : Power Off d'après le tableau dans le PDF (c'est bien la touche que j'ai appuyée)
C12,C13 : 11
C14 : 0
C15 : 0</p>
<p>Il s'agit donc bien d'un protocole Denon, sur un ampli, et de l'appui sur la touche power off . On voir donc bien l'intérêt de disposer d'un logiciel de décodage...</p>
<h5>Usage avancé :</h5>
<p>Lorsque vous avez bien compris le fonctionnement de votre télécommande, vous pouvez effectuer la capture de chacune des touches dans l'onglet "Scrutinize remote". Il suffit de se placer dans "Paramétric remote", cliquer sur Capture, et appuyer sur chacune des touches puis taper un nom de fonction et un commentaire pour décrire la touche.</p>
<p>A noter que l'arrêt de la capture se fait en rappuyant sur "Capture", et en refaisant une capture en appuyant sur une touche de la télécommande. Vous pouvez avec bouton de droite éditer le contenu du tableau par exemple pour supprimer des lignes surnuméraires.</p>
<p>Une fois cette capture faite, vous allez pouvoir aller dans l'onglet "Export", Choisir "L'export format", et faire "export Param Remote" pour créer un fichier de sauvegarde ou de config. Le logiciel supporte même la production directe de code Arduino... Sympa!.</p>
<p>Si votre télécommande n'est pas décodée (c'est à dire pas reconnue par l'un des décodeurs intégrés), vous pouvez passer en mode "Raw remote" dans "Scrutinize remote", et "Export raw remote" dans l'onglet export. Ceci aura pour effet de générer des timings d'impulsion au lieu du vrai protocole, mais c'est par contre très intéressant pour mimer des télécommandes inconnues.</p>
<p>L'onglet "Generate" va vous permettre de générer des codes IR pour les protocoles connus ou inconnus (mode raw). Votre périphérique de capture Agirs étant également en capacité d'envoyer des codes, cela vous permettra de vérifier que votre équipement réagit bien à ce que vous avez capturé / généré.</p>
<p>A noter que si vous désirez sauver des données capturées (par exemple dans l'onglet Scrutinize remote") il est souhaitable de choisir comme format d'export GIRR, qui vous permettra de réimporter lors d'une autre session de travail avec tous les paramètres.</p>
<h3>Conclusion</h3>
<p>C'est tout pour ce premier volet décodage et génération de codes IR. Tout n'est pas dit, mais le site de l'auteur de IR Scrutinizer fourmille d'infos que je vous recommande de consulter...</p>
<h3>Sommaire des articles de la série:</h3>
<ul>
<li>IR remote 1/4 : Comprendre et analyser les signaux d'une télécommande infrarouge</li>
<li><a href="https://civade.com/post/2021/05/02/IR-remote-2/4-%3A-Emission-réception-infrarouge-via-LIRC-sur-Raspberry-PI-ou-Orange-Pi">IR remote 2/4 : Emission réception infrarouge via LIRC sur Raspberry PI ou Orange Pi</a></li>
<li><a href="https://civade.com/post/2021/05/02/IR-remote-3/4-%3A-Emetteur-infrarouge-/-wifi-sur-ESP32">IR remote 3/4 : Emetteur infrarouge / wifi sur ESP32</a></li>
<li><a href="https://civade.com/post/2021/05/02/IR-remote-4/4-%3A-Télécommande-Wifi-avec-Nodered-LIRC-ESP32">IR remote 4/4 : Télécommande Wifi avec Nodered + LIRC + ESP32</a></li>
</ul>https://civade.com/post/2021/05/02/IR-remote-1/4-%3A-Comprendre-et-analyser-les-signaux-d-une-t%C3%A9l%C3%A9commande-infrarouge#comment-formhttps://civade.com/feed/atom/comments/113Nouveau repository avec près de 10 000 sons pour synthés collectorurn:md5:7f16a6905f3859f2cd5dd7c868dd4b632021-04-29T21:56:00+02:002024-02-23T15:56:10+01:00jphiDIY-Musique <p>Après 20 ans de bons et loyaux services, j'ai fermé le site Zicweb.com. Il a été l'un des premiers sites en Français sur l'informatique musicale sur PC et a eu des audiences de plusieurs centaines de milliers de visiteurs par mois.</p>
<p><a href="https://civade.com/images/312974657_8529f1181e.jpg" title="312974657_8529f1181e.jpg, avr. 2021"><img src="https://civade.com/images/.312974657_8529f1181e_m.jpg" alt="312974657_8529f1181e.jpg, avr. 2021"></a></p>
<p>Il y restait des ressources pour un certain nombre de synthés, depuis devenus collector. Comme beaucoup de site hébergeant les patches pour ces machines ont fermés, j'ai ouvert un repository Git pour y placer ces sons : <a href="https://gitlab.civade.com/pub/music-patches">https://gitlab.civade.com/pub/music-patches</a> .</p>
<p>Une forme de mémoire qui j'espère servira à certains.. En tout cas mon vieux DX7 est très content :)...</p>https://civade.com/post/2021/04/29/Nouveau-repository-avec-pr%C3%A8s-de-10-000-sons-pour-synth%C3%A9s-collector#comment-formhttps://civade.com/feed/atom/comments/111Boitier découpe laser pour orange Pi PC plusurn:md5:44888e1d870a6d6184d7f7cf5da4d4c62021-03-07T16:14:00+01:002024-02-23T15:44:32+01:00jphiDomotique<p>Un petit boitier réalisé rapidement pour héberger un projet domotique avec une Orange Pi PC plus..</p> <p>C'est un petit projet réalisé rapidement sous Sketchup, exporté en DXF avec le plugin de Guitar List ( <a href="https://www.guitar-list.com/download-software/convert-sketchup-skp-files-dxf-or-stl">https://www.guitar-list.com/download-software/convert-sketchup-skp-files-dxf-or-stl</a> ).</p>
<p>Le boitier dispose d'une ventilation active avec un ventilateur 12V / 50mm sous alimenté en 5V pour des raisons de bruit.</p>
<p>Un espace est aménagé pour permettre d'embarquer une petite extension à côté de l'orange PI.</p>
<p>Il est possible de laisser l'antenne wifi dans le boitier, ou la faire dépasser en perçant un trou de 6mm et en l'emanchant en force.</p>
<p>Voici quelques visuels de la CAO :</p>
<p><a href="https://civade.com/images/orangepi/OrangePI-PC-plus1.png" title="OrangePI-PC-plus1.png, mar. 2021"><img src="https://civade.com/images/orangepi/.OrangePI-PC-plus1_m.png" alt="OrangePI-PC-plus1.png, mar. 2021"></a></p>
<p><a href="https://civade.com/images/orangepi/OrangePI-PC-plus2.png" title="OrangePI-PC-plus2.png, mar. 2021"><img src="https://civade.com/images/orangepi/.OrangePI-PC-plus2_m.png" alt="OrangePI-PC-plus2.png, mar. 2021"></a></p>
<p><a href="https://civade.com/images/orangepi/OrangePI-PC-plus3.png" title="OrangePI-PC-plus3.png, mar. 2021"><img src="https://civade.com/images/orangepi/.OrangePI-PC-plus3_m.png" alt="OrangePI-PC-plus3.png, mar. 2021"></a></p>
<p>Vous trouverez l'intégralité des fichiers sur mon Gitlab: <a href="https://gitlab.civade.com/pub/small-lasercut-projects/-/tree/master/OrangePI-PC-plus">https://gitlab.civade.com/pub/small-lasercut-projects/-/tree/master/OrangePI-PC-plus</a>.</p>
<p>Bonne réalisation !</p>https://civade.com/post/2021/03/07/Boitier-d%C3%A9coupe-laser-pour-orange-Pi-PC-plus#comment-formhttps://civade.com/feed/atom/comments/110Google home + Node Red + Orange Pi PC Plusurn:md5:e94a97da0a8eb1816c2c797d2d26d8f52021-02-21T10:22:00+01:002024-02-23T15:44:51+01:00jphiDomotiqueEmbarquéFirmwareOpenSourceRaspberrySysadmin<p>Cet article fait suite à celui <a href="https://civade.com/post/2020/12/13/Google-home-Node-Red-Raspberry-pi-%3A-un-int%C3%A9ressant-cocktail-pour-la-domotique">sur NodeRed sur Raspberry</a> et est plus une prise de notes partage pour adapter la méthodologie d'installation sur une Orange Pi PC plus. Il est à lire en complément de l'article original.</p> <h3>La carte Orange PI PC plus</h3>
<p><a href="https://civade.com/images/orangepi/orangepipcplus.jpg" title="orangepipcplus.jpg, fév. 2021"><img src="https://civade.com/images/orangepi/.orangepipcplus_m.jpg" alt="orangepipcplus.jpg, fév. 2021"></a></p>
<p>Cette carte a cela de bien par rapport à une raspberry qu'elle permet pour 25 euros de disposer d'un système assez performant avec pas mal d'entrées sorties :</p>
<ul>
<li>Processeur H3 <strong>4 cœurs</strong> jusqu'à <strong>1.37 Ghz</strong></li>
<li>1 go de ram</li>
<li>3 ports USB 2 standard + un port micro OSB OTG</li>
<li>Alimentation sur connecteur spécifique 3mm (plus de micro USB!)</li>
<li>Port HDMI sur connecteur standard</li>
<li>Sortie audio et vidéo composite intégrée sur un jack 3.5mm</li>
<li>Port Ethernet intégré</li>
<li>Interface Wifi intégrée, avec antenne externe, et possibilité d'adapter des antennes à fort gain grâce au connecteur d'antenne standard.</li>
<li>Micro intégré sur la carte mère</li>
<li>Bouton intégré permettant de faire un shutdown "propre" avant de débrancher</li>
<li>Récepteur infrarouge intégré</li>
<li>Interface caméra (spécifique à Orange Pi)</li>
<li>Connecteur d'entrées sorties à 40 broches largement compatible avec celui d'une Raspberry PI</li>
<li>Interface pour UART TTL intégrée (pour debug de la carte) sur connecteur 3 broches dédié</li>
<li>Socket pour mettre des cartes TF (carte miro SD)</li>
</ul>
<p>Mais surtout, son principal atout réside dans le fait qu'elle intègre <ins><strong>8 Go de mémoire eMMC</strong></ins> (c'est le "plus" dans la référence Orange Pi PC) sur laquelle nous pourrons mettre notre système d'exploitation. Outre le fait que cela soit bien plus fiable que la classique carte SD, c'est aussi beaucoup plus rapide. La carte SD reste disponible par exemple pour booter sur un autre OS, ou pour tester d'autre configurations sans altérer la mémoire interne eMMC.</p>
<h3>Installation du système d'exploitation</h3>
<h4>Préparation de l'image</h4>
<p>J'attire votre attention sur le choix de la carte SD qui est crucial. Il faut une carte rapide (Classe A1 ou A2), de marque (Sandisk!) et méfiez vous des contrefaçon qui sont légion sur Aliexpress... Tout autre choix prendra au minimum un temps infini(carte peu performante), voir ne marchera carrément pas (carte avec des erreurs de lecture / écriture). Bien souvent si ce n'est pas stable, lent ou que le processus d'installation ne fonctionne pas comme il devrait, c'est la faute de la carte SD!</p>
<p>Nous allons ici nous baser sur la distribution Armbian ( <a href="https://www.armbian.com/">https://www.armbian.com/</a> ), ou Debian pour ARM, qui est plutôt bien supportée, et motorise un grand nombre de carte chinoises à base de processeurs divers dont notre H3. La carte Orange Pi PC plus y est bien supportée (voir <a href="https://www.armbian.com/orange-pi-pc-plus/">https://www.armbian.com/orange-pi-pc-plus/</a> ) que ce soit sous Focal (debian 11) ou Buster (Debian 10). Nous allons prendre une Buster pour l'installation.</p>
<p>Après avoir téléchargé l'image 'Desktop' ( <a href="https://redirect.armbian.com/region/EU/orangepipcplus/Buster_current_desktop">https://redirect.armbian.com/region/EU/orangepipcplus/Buster_current_desktop</a> ), l'avoir décompressée avec <a href="https://www.7-zip.org/">7Zip</a> , il va nous falloir se munir d'une carte SD de 8 Go mini, d'un logiciel pour écrire cette image sur la carte SD ( Armbian recommande <a href="https://gitlab.com/bztsrc/usbimager/">https://gitlab.com/bztsrc/usbimager/</a> ). Le process est décrit dans la doc ( <a href="https://docs.armbian.com/User-Guide_Getting-Started/#how-to-prepare-a-sd-card">https://docs.armbian.com/User-Guide_Getting-Started/#how-to-prepare-a-sd-card</a> ) et ne devrait pas vous poser de problème.</p>
<h4>First boot</h4>
<p>Après avoir inséré la carte SD fraichement installée, raccordé un écran et un clavier souris USB, et éventuellement un câble réseau, il est temps d'allumer la carte.</p>
<p>Au premier démarrage, la carte déroule le boot linux, puis affiche un message disant qu'elle est en train d'agrandir le file system pour utiliser toute la carte SD. La laisser faire.
Elle va rebooter toute seule à l'issue.</p>
<p>Lors du second boot, plusieurs questions vont vous être posées :</p>
<ul>
<li>mot de passe pour le compte root. Attention, car à ce stade, vous avez un clavier Querty.... Donc choisir un mot de passe assez simple et idéalement n’utilisant pas les lettre M, A, Q qui ne sont pas à la même place en querty et en azerty.</li>
<li>vous souhaiter utiliser bash (choix 1) ou zsh (choix 2). J'ai choisi bash, mais c'est une affaire de convenance...</li>
<li>donner le nom d'un compte utilisateur à créer. Il n'est en effet pas bon de travailler en root. Ce sera votre compte de travail.</li>
<li>Le mot de passe du compte à créer (même remarque que pour le compte root!!!)</li>
<li>Le nom réel de l'utilisateur</li>
</ul>
<p>La création du compte et les opérations qui s'ensuivent prennent plusieurs dizaines de secondes. Le système démarre ensuite dans l'environnement graphique.</p>
<h4>Paramétrage wifi</h4>
<p>Si vous avez branché un câble réseau, cette étape n'est probablement pas nécessaire.</p>
<p>Pour mémo et comme sur n'importe quelle distribution linux, il est passible de disposer de plusieurs consoles virtuelles. CTRL + ALT + F1 à F6 sont des consoles texte, tandis que CTRL + ALT + F7 revient dans l'environnement graphique.</p>
<p>Dans l'environnement graphique, en haut à droite, cliquez sur l'icone WIfi, choisissez le réseau auquel vous voulez vous connecter et introduisez le mot de passe. Attention, le clavier à ce stade est encore en Querty..
Une fois la connexion établie, le système devrait vous l'indiquer dans la zone wifi avec un splendide "connection established".</p>
<p>A noter que dans certains environnements (points d'accès) l'orange pi peut perdre le wifi. Si en lançant la commande "sudo systemctl network-manager restart", c'est réglable de façon définitive avec un petit service.</p>
<p>Créer le ficichier "/usr/local/bin/nm-watcher"</p>
<pre>
#!/bin/bash
while true; do #create a infinite loop to keep looking at your connection
NET=$(ifconfig wlan0 | grep "inet") # verify if the interface has an assigned IP
ROUTE=$(fping google.com 2>&1 | grep "alive") # try to ping google.com and verify if we have any response
WEB=$(wget --tries=10 --timeout=20 --spider http://google.com 2>&1 | grep "OK") # spiders google.com to verify if the page exists. returns error if a connections is not possible
if [ ! "$NET" != "" ] || [ ! "$ROUTE" != "" ] || [ ! "$WEB" != "" ]; then # verify if any of the above conditions aren't OK
service network-manager restart
fi
sleep 5
done
</pre>
<p>Créer et éditier le fichier nm-watcher.service</p>
<pre>
$ sudo touch /etc/systemd/system/nm-watcher.service && sudo nano /etc/systemd/system/nm-watcher.service
</pre>
<p>Placer dedans la conf suivante :</p>
<pre>
[Unit]
Description=NetworkManager Watcher
Wants=NetworkManager.service
Before=NetworkManager.service
[Service]
ExecStart=/usr/local/bin/nm-watcher
[Install]
WantedBy=multi-user.target
</pre>
<p>Démarrer le service automatiquement :</p>
<pre>
$ sudo systemctl enable nm-watcher.service
</pre>
<p>Et le lancer :</p>
<pre>
$ sudo systemctl start nm-watcher.service
</pre>
<p>Ce script va vérifier toutes les 5 seocndes la connectivité réseau et relancer si nécessaire. Il a peu d'impact en terme de CPU consommé.</p>
<h4>Configuration</h4>
<p>Dans le menu Applications, lancer un "Terminal Emulator". Attention tout ce que vous aller taper à ce stade est encore via le clavier Querty... Avec la commande "ip a" vous pouvez vérifier votre adresse ip.</p>
<p>Lancez ensuite la commande "sudo armbian-config". Les touches fleches nous permettront de changer de menu (ou page up page down pour aller plus vite), espace pour activer une case à cocher, tabulation pour changer de champ, escape pour annuler et entrée pour valider.</p>
<ul>
<li>"<strong>Personal</strong>" >"<strong>Timezone</strong>" >"<strong>Europe</strong>" > "<strong>Paris</strong>"</li>
<li>"<strong>Personal</strong>" >"<strong>locales</strong>" et choisir "<strong>fr_FR.UTF8 UTF8</strong>" puis faire suivant et choisir fr_FR.UTF8 comme langue par défaut. Cela prend un peu de temps.</li>
<li>"<strong>Personal</strong>" >"<strong>Keyboard</strong>" > "<strong>Generic 105 Keys PC Intl</strong>" >"<strong>Autre</strong>" > "<strong>French</strong>" > "<strong>French</strong>" > "<strong>Disposition par défaut pour le clavier</strong>" > "<strong>Pas de touche compose</strong>" > "<strong>Faut il utiliser control + alt + backspace pour arrêter le serveur X</strong>" > "Oui .</li>
<li>"<strong>Personal</strong>" >"<strong>Hostname</strong>" > puiss indiquez le nom que vous voulez donner à votre carte (ex : debian10)</li>
<li>"<strong>System</strong>" > "<strong>CPU</strong>" > Min speed =<strong>480mHz</strong>, Max Speed = <strong>1368mHz</strong>, profil "<strong>Performance</strong>"</li>
<li>"<strong>System</strong>" > "<strong>Avahi</strong>"</li>
<li>"<strong>System</strong>" > "<strong>Hardware</strong>" puis activer avec la barre d'espace "I2C0","Uart3". Vous pouvez également ajouter "Analog Codec" si vous désirez utiliser la sortie audio sur le Jack 3.5mm. Ce sera via l'HDMI sinon. Ne pas accepter le reboot, nous rebooterons une fois l'ensemble terminé.</li>
<li>"<strong>System</strong>" > "<strong>SSH</strong>" puis "<strong>Save</strong>". Dans un premier temps, vous pouvez laisser "permit root login" (à désactiver plus tard pour des raisons de sécu) et "Password Authentication" (à désactiver plus tard quand vous aurez mise une clé).</li>
<li>"<strong>System</strong>" > "<strong>Firmware</strong>" (ceci va faire les mises à jour). Cette opération prend du temps.. (30 minutes à 1 heure)</li>
</ul>
<p>A l'issue, l'updater va demander de redémarrer. Accepter.</p>
<p>Après redémarrage, vous allez arriver sur un écran de login, avec le nom d'utilisateur pré rempli sur le compte que vous avez créé à l'étape précédente. Plus qu'à mettre le mot de passe associé pour se logger. A noter qu'à ce stade, nous avons un clavier en français, une connexion réseau, un système à jour, et la possibilité de se connecter en SSH.</p>
<p>Pour en connaitre l'adresse ip, il suffit de taper la commande "ip a" dans un terminal:</p>
<pre>
jpcivade@debian10:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
link/ether 02:81:35:b7:24:b0 brd ff:ff:ff:ff:ff:ff
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 12:81:35:b7:24:b0 brd ff:ff:ff:ff:ff:ff
inet 192.168.20.127/24 brd 192.168.20.255 scope global dynamic noprefixroute wlan0
valid_lft 39844sec preferred_lft 39844sec
inet6 fe80::7848:fe3b:e11c:ca5e/64 scope link noprefixroute
valid_lft forever preferred_lft forever
</pre>
<p>Ici, étant en WIfi, c'est l'interface WLAN0 qui porte le réseau, en 192.168.20.127. Si vous êtes connecté en internet filaire, ce sera sur l'interface "ETH0".</p>
<p>Nous allons relancer "sudo armbian-config" d'un terminal afin de désactiver le lancement automatique de l'environnement graphique:</p>
<ul>
<li>"<strong>System</strong>" >"<strong>Desktop</strong>" > "<strong>Stop</strong>"</li>
</ul>
<p>Cette configuration sera activée immédiatement. L'objectif est d'éviter de consommer la mémoire nécessaire pour le lancement systématique d'un environnement graphique . L'environnement graphique est arrêté, et un petit bug vous laisse sur un écran noir... Pas de soucis, repasser sur une console (avec CTRL + ALT + F1), et loggez vous avec votre compte utilisateur...</p>
<h4>Installation des compléments</h4>
<p>Nous allons maintenant installer le compilateur C, xrdp et ses dépendances (pour jouer avec l'interface graphique directement avec le bureau à distance de windows) et quelques utilitaires (screen neofetch, etc..)
C'est un petit peu long ca il y a un peu de dépendances (15 minutes)</p>
<pre>
sudo apt -y install xrdp xorgxrdp neofetch libavahi-compat-libdnssd-dev python-pip python3-pip mc i2c-tools python-smbus python-psutil python-dev iftop telnet ncftp
</pre>
<p>A ce stade, nous avons la possibilité de nous connecter à notre système :</p>
<ul>
<li>Localement, via la console texte, sur écran/Clavier/souris connecté au système</li>
<li>Localement en mode graphique, en passant par la console texte, puis en lancant "startx"</li>
<li>Avec le bureau à distance de windows, en mode graphique, en précisant comme adresse de connexion, l'adresse ip de notre carte, soit celle précédemment relevée avec "ip a" en mode console.</li>
<li>Avec un terminal SSH (ex: le programme <a href="https://www.putty.org/">Putty</a> ) sur le port 22 et sur l'adresse ip</li>
</ul>
<pre></pre>
<p>C'est déjà pas mal, non?</p>
<h4>Transfert sur la mémoire interne "EMMC"</h4>
<p>A partir de ce stade, vous pouvez soit continuer sur la carte SD, soit transférer l'installation sur la mémoire interne eMMC de 8Go. Pour transférer c'est assez simple, il suffit de lancer "sudo armbian-config", et dans le menu "System" > "Install", de choisir "2 boot from emmc / system on emmc".</p>
<p>L'utilitaire faire le transfert et à l'issue vous demande de rebooter. Il suffira de virer la carte SD juste avant le reboot et vous devriez pouvoir booter normalement.</p>
<p>A noter que vous pouvez faire ceci à n'importe quel endroit de ce script d'installation, et ainsi disposer d'une carte SD de référence vous servant à réinstaller votre système sur eMMC rapidement, avec leniveau d'avancement que vous aurez choisi. Ca peut aussi service de sauvegarde pour réinstaller rapidement le système avec une carte SD complètemetn configurée... A vous de choisir.</p>
<h4>Installation de Nodered</h4>
<p>Faites ceci en mode console, mais pas identifié en root. Vous vous connecterez donc sur le compte utilisateur créé lors de l'installation.</p>
<pre>
bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
</pre>
<p>Accepter l'installation des noeuds spécifiques Raspberry et lancer l'installation. Cela va prendre une trentaine de minutes.</p>
<p>A l'issue de l'installation, rendre le service node red rémanent et le démarrer</p>
<pre>
sudo systemctl enable nodered.service
sudo systemctl start nodered.service
</pre>
<p>Enfin nous allons installer quelques paquets complémentaires pour node-red :</p>
<pre>
cd .node-red
npm install node-red-contrib-googlehome
npm install node-red-node-email
npm install node-red-dashboard
npm install node-red-contrib-ui-artless-gauge
npm install node-red-contrib-ewelink
npm install node-red-contrib-opi-gpio
npm install node-red-contrib-modbus
sudo systemctl restart nodered.service
</pre>
<p>Nous pouvons maintenant connecter un navigateur à notre fraiche installation de node red sur l'adresse IP relevée avec la commande "ip a" à la place de MON_IP. Vous pouvez le faire de n'importe quel poste connecté au même réseau que votre Orange PI.</p>
<p>http://MON_IP:1880</p>
<h4>Paramétrage de vi</h4>
<p>editer .vimrc de root et de l'utilisateur que vous avez créé et ajouter la ligne</p>
<pre>set mouse-=a</pre>
<p>editer /etc/vim/vimrc et décommenter</p>
<pre>syntax on</pre>
<p></p>
<h4>Interfaçage avec un LCD I2C</h4>
<p>A noter que cette partie est légèrement différente de l'article original afin d'être adaptée au fonctionnalités de l'Orange PI.</p>
<p>Le cablage est identique et vous le retrouverez dans l'article original ( <a href="https://civade.com/post/2020/12/13/Google-home-Node-Red-Raspberry-pi-%3A-un-int%C3%A9ressant-cocktail-pour-la-domotique">https://www.civade.com/post/2020/12/13/Google-home-Node-Red-Raspberry-pi-%3A-un-int%C3%A9ressant-cocktail-pour-la-domotique</a> )
Nous allons passer en root pour installer ces éléments :</p>
<pre>
su -
</pre>
<p>Tour d'abord il nous faut quelques librairies</p>
<pre>
pip install wheel
pip install setuptools
pip install psutil
pip install RPLCD
</pre>
<p>Vérifier qu'il y a bien un LCD en I2C à l'adresse 0X20 (sur orange pi, c'est sur le port 0)</p>
<pre>
i2cdetect -y 0
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: 20 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
</pre>
<p>Ensuite nous allons pouvoir tester l'afficheur :</p>
<pre>
rplcd-tests i2c testsuite expander=MCP23008 addr=0x20 port=0 cols=20 rows=4 charmap=A00 gpio_bank=A
</pre>
<p>Enfin nous allons tester avec un petit script en Python :</p>
<pre>
#!/usr/bin/python
# -*- coding: utf8 -*-
# Parce que les accents le valent bien...
"""
Bibliotheques à installer :
- pip install rplcd https://github.com/dbrgn/RPLCD (Doc sur https://rplcd.readthedocs.io/en/latest/ )
- pip install gpiozero
- pip install psutil
Et bien sur l'i2c doit avoir été activé sur la Rasoberry avec raspi-config.
Pour le lancer toutes le minutes, l'installer dans un crontab en root, faire crontab -e
* * * * * /root/lcd.py >> /root/log.txt 2>&1
Un journal (log.txt) portera les erreurs... si il y en a.
"""
# Affichages sur lcd
from RPLCD.i2c import CharLCD
# température processeur
def CPUTemperature():
with io.open('/sys/devices/virtual/thermal/thermal_zone0/temp', 'r') as f:
return float(f.readline().strip()) / 1000
# Pour afficher l'heure
import time
# Pour recuperer l'adresse IP
import socket
# Pour capacité disque
import psutil
# Entrées sorties
import io
# Recuprere l'adresse IP
def get_ip():
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
# n'a pas besoin d'être joignable
s.connect(('10.255.255.255', 1))
IP = s.getsockname()[0]
except Exception:
IP = '127.0.0.1'
finally:
s.close()
return IP
# Définit des caractères personnalisés
def lcd_chars():
smiley = (
0b00000,
0b01010,
0b01010,
0b00000,
0b10001,
0b10001,
0b01110,
0b00000,
)
degre = (
0b01000,
0b10100,
0b01000,
0b00011,
0b00100,
0b00100,
0b00011,
0b00000,
)
lcd.create_char(0, smiley)
lcd.create_char(1, degre)
return
# Init
# Init LCD
lcd = CharLCD(i2c_expander='MCP23008', address=0x20, port=0,
cols=20, rows=4, dotsize=8,
charmap='A00',
auto_linebreaks=True)
lcd_chars()
IP = get_ip()
cpu = CPUTemperature()
hdd = psutil.disk_usage('/')
ram = psutil.virtual_memory()
#192.168.100.100 25.9
#
#
#
lcd.clear();
# Ligne 1
lcd.cursor_pos = (0, 0)
lcd.write_string(time.strftime("%d/%m/%Y %H:%M:%S"))
#print time.strftime("%d/%m/%Y %H:%M:%S")
# Ligne 2
lcd.cursor_pos = (1, 0)
#line1 = "%s %s" % (IP, cpu)
lcd.write_string(IP)
lcd.cursor_pos = (1,14)
lcd.write_string("|%2.1f\x01" % (cpu))
#print "%s|%2.1f" % (IP, cpu)
# Ligne 3
lcd.cursor_pos = (2, 0)
lcd.write_string("T:%3.1fG U:%3.1fG F:%3.1fG" % (float(hdd.total) / (2.0**30), float(hdd.used) / (2.0**30),float(hdd.free) / (2.**30) ))
#print "T:%3.1fG U:%3.1fG F:%3.1fG" % (float(hdd.total) / (2.0**30), float(hdd.used) / (2.0**30),float(hdd.free) / (2.**30) )
# Ligne 4:w
lcd.cursor_pos = (3, 0)
lcd.write_string("T:%3.0fM U:%3.0fM F:%3.0fM" % (float(ram.total) / (2.0**20), float(ram.used) / (2.0**20),float(ram.free) / (2.**20) ))
#print "iT:%3.0fM U:%3.0fM F:%3.0fM" % (float(ram.total) / (2.0**20), float(ram.used) / (2.0**20),float(ram.free) / (2.**20) )
# Si on veut préserver le backlight et ne l'allumer que quelques secondes toutes les minutes
# décommenter les lignes suivantes
#time.sleep(5)
#lcd.backlight_enabled = False
lcd.close()
</pre>
<h3>Et la suite?</h3>
<p>La suite peut être retrouvée sur l'article initial basé sur une Raspberry Pi, mais tout le volet tutoriel pour poursuivre sur node red est totalement d'actualité, même si il est installé sur une Orange Pi.
Il est ici : <a href="https://civade.com/post/2020/12/13/Google-home-Node-Red-Raspberry-pi-%3A-un-int%C3%A9ressant-cocktail-pour-la-domotique">https://www.civade.com/post/2020/12/13/Google-home-Node-Red-Raspberry-pi-%3A-un-int%C3%A9ressant-cocktail-pour-la-domotique</a> .</p>
<p>Bonne lecture !</p>https://civade.com/post/2021/02/21/Google-home-Node-Red-Orange-Pi-PC-Plus#comment-formhttps://civade.com/feed/atom/comments/109Google home + Node Red + Raspberry pi : un intéressant cocktail pour la domotiqueurn:md5:b754134f6b158a8bd7a9a38668c7c4b02020-12-13T19:51:00+01:002024-02-23T15:45:00+01:00jphiDomotique<p><a href="https://civade.com/images/nodered/intro.png" title="intro.png, janv. 2021"><img src="https://civade.com/images/nodered/.intro_m.png" alt="intro.png, janv. 2021"></a></p>
<p><strong></strong>J'avais déjà joué il y a près de 4 ans avec Node Red. A l'époque, j'avais monté des démos simple utilisant des ESP8266, une raspberry équipée de Node Red et de Mosquitto (serveur MQTT) afin d'enseigner au Fablab de Montpellier les possibilités de ces technologies pour développer des objets connectés.</p>
<p>Le démonstrateur était une cafetière connectée qui prenait ses ordres sur Twitter. La gestion des états et des messages était confiée à un serveur MQTT. Toute l'intelligence et la logique était confiée quand à elle à NodeRed. La cafetière était rendue intelligente avec un ESP8266 qui dialoguait avec le serveur MQTT pour prendre ses ordres. NodeRed lisait un compte Twitter et si un message particulier était posté ("Je veux un café"), il envoyait au serveur MQTT l'ordre l'allumage. La cafetière s'allumait et lançait un café. La cafetière était au Fablab, la Raspberry avec NodeRed et MQTT chez moi, et le téléphone utilisait la 3/4G pour envoyer ses messages sur Twitter. L'objectif de cette démonstration était de montrer que ce type d'architecture peut fédérer des objets qui ne sont nécessairement pas tous situés sur un réseau local, et qu'il est très simple de développer un capteur ou un actionneur intelligent qui discute une MQTT et se met à disposition de NodeRED.</p>
<p>Un ami m'a branché sur le sujet d'un panneau de supervision d'une pompe à chaleur (et plus si affinité) en Modbus. En cherchant des technologies adaptées, je suis retombé sur NodeRed. Et là grosse surprise. L'outil a évolué d'une façon spectaculaire... Plus de 2000 modules et scripts sont disponibles sur leur espace 'Flows', facilitant l'intégration de technologies variées. Le changement de licence (anciennement atypique IBM interdisant les modifications, désormais Apache) n'y est peut être pas pour rien.</p>
<p>Cet article a pour objectif de faire partager un journal d'installation de NodeRed sur Raspberry, pour vous permettre de mettre en œuvre des solutions similaires. A y être nous allons également voir comment interfacer le tout avec Google Home.</p> <h3>Une Raspberry?</h3>
<p><a href="https://civade.com/images/nodered/pizero.png" title="pizero.png, déc. 2020"><img src="https://civade.com/images/nodered/.pizero_m.png" alt="pizero.png, déc. 2020"></a></p>
<p>Si l'on dispose déjà d'un appareil sous Linux (ex un NAS), qui est toujours allumé ce peut aussi un bon candidat. Il suffit donc de faire l'installation de node red dessus si celui-ci le supporte (ex : Synology ou Netgear).</p>
<p>Mais si on n'a pas cette possibilité, le choix d'une Raspberry par rapport à un ordinateur, est guidé par la consommation. En effet, une Raspberry consomme au maximum 5V X 2A = 10W. Un ordinateur portable consomme de 50 à 100W, et un fixe de 250 W à 600W (PC gamer, serveur). Avec le kw/h à 0.1557 euros, 1 Watt à l'année coute 1.364 euros.... L’hébergent annuel d'une Raspberry va donc couter 13.64 euros / an, contre 477 euros / an pour un petit serveur de 350W... No comment! La Raspberry va être vite payée par les économies d'énergie...</p>
<p>Le choix du modèle Pi Zero est un compromis coût/performances. En effet, dans la mesure ou ne fonctionneront que des services réseaux dessus, il n'est pas nécessaire de disposer d'une grande quantité de ram ou d'un processeur surpuissant avec accélération graphique. A cet titre, elle est intéressante car peu chère, et toute petite.</p>
<p>La Raspberry Pi Zero ne sera connectée à un écran que durant la phase d'installation. Ensuite, tout se fera en ligne de commande ou par interface web. Il est bien sur possible d'utiliser une Raspberry plus puissante que la zero, mais cette dernière avec un processeur à 1 Ghz et 512Mo de ram est déjà très suffisante pour faire tourner notre application.</p>
<h3>Liste de courses</h3>
<p>Nos besoins seront les suivants :</p>
<ul>
<li>L'application Google assistant ou un Google home mini (d'occasion sur le bon coin, à partir de 10 euros)</li>
<li>Une Raspberry PI Zero w (20 euros, à partir de 12 euros d'occasion sur le bon coin) ou zéro avec un dongle wifi (15 euros neuf+ le dongle)</li>
<li>Une alimentation 5V 2.5A</li>
<li>Carte micro SD, SDHC classe 10 / 8 Go mini.</li>
<li>Un adaptateur Micro HDMI pour connecter l'écran, le câble HDMI et bien sur un écran HDMI</li>
<li>Un adaptateur USB OTG (micro USB vers USB femelle)</li>
<li>Un clavier souris sans fil (à brancher sur l'unique prise de l'adaptateur OTG)</li>
<li><strong>OU</strong> un hub USB + Clavier et souris filaire.</li>
<li>Éventuellement si vous préférez connecter la Raspberry en filaire, une interface USB <> Ethernet compatible. En effet, la Zero n'est pas équipée de port Ethernet.</li>
</ul>
<p>A noter que l'on trouve des kits Raspberry Pi Zero sur Aliexpress, qui pour 25 euros fournissent une carte SD de 16 Go, l'adaptateur secteur, un boitier acrylique, l'adaptateur et le câble HDMI, le câble USB OTG et un radiateur de refroidissement pour le processeur. Il s'agit de carte officielles, fabriquées dans les lignes chinoises de la marque.</p>
<p>Exemple de kit:</p>
<p><a href="https://civade.com/images/nodered/kitzero.jpg" title="kitzero.jpg, déc. 2020"><img src="https://civade.com/images/nodered/.kitzero_m.jpg" alt="kitzero.jpg, déc. 2020"></a></p>
<h3>Installation</h3>
<h4>Pré requis :</h4>
<ul>
<li>Google home aura été installé et paramétré</li>
<li>Plusieurs capteurs ou actionneurs connectés à Google Home auront pu être ajoutées en piochant par exemple dans la gamme Ewelink, qui dispose d'une version "Sonoff DIY" disponible à partir de 4 euros pour commander un appareil à distance.</li>
<li>Télécharger le logiciel Raspberry Pi Imager à partir de <a href="https://www.raspberrypi.org/software/">https://www.raspberrypi.org/software/</a></li>
<li>Télécharger l'image "<strong>Raspberry Pi OS with desktop</strong>" : <a href="https://downloads.raspberrypi.org/raspios_armhf/images/raspios_armhf-2020-12-04/2020-12-02-raspios-buster-armhf.zip">https://downloads.raspberrypi.org/raspios_armhf/images/raspios_armhf-2020-12-04/2020-12-02-raspios-buster-armhf.zip</a></li>
</ul>
<h4>Préparation :</h4>
<ul>
<li>Décompressez le fichier ZIP de l'image téléchargée</li>
<li>Lancer l'imager, Dans "<strong>Choose OS</strong>", sélectionnez "<strong>Use Custom</strong>", et sélectionnez le fichier ".img" précédemment décompressé</li>
<li>Introduisez la carte SD dans le PC et sélectionnez là dans le PI Imager à l'aide du bouton "<strong>Choose SD Card</strong>"</li>
<li>Cliquez ensuite sur "<strong>Write</strong>". Ça prend un peu de temps... (dépend de la vitesse / performance de votre lecteur de carte SD)</li>
</ul>
<h4>Branchement de la Raspberry</h4>
<ul>
<li>Insérer la carte SD dans la Raspberry</li>
<li>La prise USB de gauche reçoit l'adaptateur OTG.</li>
<li>Si vous êtes en clavier souris sans fil, il suffit de mettre le dongle sur la prise femelle de l'USB OTG.</li>
<li>Sinon, brancher le hub USB dessus, et brancher le clavier et la souris sur le HUB. Si le hub dispose d'une alimentation c'est mieux.... Cela évitera de "tirer" sur les alimentations de la Raspberry.</li>
<li>Si vous préférez vous connecter en réseau filaire et disposez d'un kit chinois intégrant l'adaptateur USB <> Ethernet compatible, c'est le moment de le brancher sur le hub USB.</li>
<li>Brancher le câble HDMI et l’adaptateur HDMI</li>
<li>Et enfin, brancher l’alimentation sur la prise USB de droite</li>
</ul>
<h4>Premier démarrage</h4>
<p>Juste après branchement, la Raspberry indique qu'elle va étendre la taille du système de fichier et redémarrer. C'est d'ailleurs ce qu'elle fait :).. pour nous amener ensuite dans l'interface graphique.</p>
<h4>Wifi</h4>
<p><a href="https://civade.com/images/nodered/wifi.png" title="wifi.png, déc. 2020"><img src="https://civade.com/images/nodered/wifi.png" alt="wifi.png, déc. 2020"></a></p>
<p>Nous allons tout de suite nous connecter au réseau Wifi. Pour ce faire, cliquer en haut à droite sur l'icône réseau (à côté du haut parleur) et suivre les instructions pour sélectionner votre réseau et associer la clé Wifi. Si vous avez saisi vos informations sans erreurs, au bout d'une dizaine de secondes vous allez être raccordé à votre réseau. Cette étape n'est pas nécessaire si vous êtes connectés en réseau filaire.</p>
<h4>Assistant d'installation</h4>
<p>L'assistant se lance pour nous permettre de personnaliser l'installation. Renseigner avec les informations suivantes :</p>
<pre>
- Country = France
- Langage = French
- Timezone = Paris
- Valider
</pre>
<p>Vous allez également devoir mettre un nouveau mot de passe En choisir un suffisamment fort (10 caractères mini, panachage de majuscules, minuscules, chiffres et symboles), car nous allons activer l'accès à distance par SSH...</p>
<h4>Et ensuite ?</h4>
<h5>Mises à jour et paquets complémentaires</h5>
<p>Il va ensuite falloir mettre à jour le système avec les derniers correctifs et faire quelques installations complémentaires.</p>
<p><strong>Pour ce faire, il va vous falloir lancer un terminal (icône noire à gauche) et lancer les commandes suivantes :</strong></p>
<p><a href="https://civade.com/images/nodered/terminal.png" title="terminal.png, déc. 2020"><img src="https://civade.com/images/nodered/terminal.png" alt="terminal.png, déc. 2020"></a></p>
<p>- Pour les mises à jour du système :</p>
<pre>
sudo apt-get update
sudo apt-get upgrade
</pre>
<p>- Pour l'installation du bureau à distance</p>
<pre>
sudo apt-get install xrdp
</pre>
<p>- Pour les prérequis afin de compiler certains paquets de node :</p>
<pre>
sudo apt-get install -y libavahi-compat-libdnssd-dev
</pre>
<p>- Et pour l'installation quelques utilitaires complémentaires</p>
<pre>
sudo apt-get install -y mc telnet git iftop vim screen neofetch
</pre>
<h5>Configuration de Vi (optionnel)</h5>
<p>Une petite configuration de l'éditeur Vi peut s'avérer nécessaire pour ceux qui l'utilisent afin de supprimer le mode visuel qui empêche les copier coller classiques. Editer .vimrc dans /root et /home/pi et ajouter la ligne</p>
<pre>
set mouse-=a
</pre>
<p>Editer également /etc/vim/vimrc et dé-commenter :</p>
<pre>
syntax on
</pre>
<h5>Paramétrage profond de la Raspberry</h5>
<p>La Raspberry nécessite un paramétrage système. Ceci a pour effet d'activer les interfaces intégrées à la Raspberry (SPI, I2C, etc..), l'accès Shell distant, et surtout de paramétrer le nom du système de façon à éviter tout conflit avec une éventuelle autre Raspberry PI existante sur votre réseau. Nous allons également reparamétrer la Raspberry pour que par défaut elle ne lance plus un environnement graphique afin d'économiser la ram. C'est assez facile à réaliser sous shell avec le programme spécifique fourni :</p>
<pre>
sudo raspi-config
</pre>
<p><a href="https://civade.com/images/nodered/raspi-config.png" title="raspi-config.png, déc. 2020"><img src="https://civade.com/images/nodered/.raspi-config_m.png" alt="raspi-config.png, déc. 2020"></a></p>
<p>Puis en utilisant les flèches de déplacement curseur et entrée, naviguez dans le menu et paramétrez :</p>
<p>Dans "<strong>System Options</strong>"</p>
<pre>
S4 - hostname : choisir un nom d'hôte unique sur votre réseau local (exemple "ma-raspberry")
S5 - Boot / auto login
Choisir B1 - Console
</pre>
<p>Dans "<strong>Interface Options</strong>"</p>
<pre>
P2 ssh > enable
P4 spi > enable
P5 i2c > enable
P7 1wire > enable
</pre>
<p>Quitter raspi-config et ne pas accepter le reboot. Nous allons d'abord terminer le paramétrage...</p>
<h5>Geekerie : Neofetch (optionnel)</h5>
<p>Cette étape n'est pas indispensable, mais il est pratique de disposer d'une bannière en ligne de commande qui nous indique quelques paramètres vitaux sur le système (système, processeur, mémoire, température, uptime, etc..):</p>
<p><a href="https://civade.com/images/nodered/Neofetch.png" title="Neofetch.png, déc. 2020"><img src="https://civade.com/images/nodered/.Neofetch_m.png" alt="Neofetch.png, déc. 2020"></a></p>
<p>L'installation est simple :</p>
<pre>
sudo nano /etc/profile.d/motd.sh
</pre>
<p>Coller les lignes suivantes dans le fichier en cours d'édition :</p>
<pre>
#!/bin/bash
echo
neofetch --cpu_temp C
</pre>
<p>Il y a un petit bug sur neofetch sur Raspberry, nous empêchant d'afficher la température de la carte. Il est aisément corrigeable en éditant le fichier /usr/bin/neofetch (sudo nano /usr/bin/neofetch) pour remplacer :</p>
<pre>
[[ "$(< "${temp_dir}/name")" =~ (ccoretemp|fam15h_power|k10temp) ]] && \
</pre>
<p>par</p>
<pre>
[[ "$(< "${temp_dir}/name")" =~ (cpu_thermal|ccoretemp|fam15h_power|k10temp) ]] && \
</pre>
<h5>Installation de NodeRed</h5>
<p>Suivre les instructions d'installation à partir de la page officielle de NodeRed: <a href="https://nodered.org/docs/getting-started/raspberrypi">https://nodered.org/docs/getting-started/raspberrypi</a>. Dans un shell, (déjà ouvert au chapitre précédent), lancer la commande :</p>
<pre>
bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
</pre>
<p>L'opération prend un temps non négligeable (de l'ordre de la demi heure..). A l'issue de l'installation, un message indique que vous pouvez vous connecter sur http://ma-raspberry.local:1880 (ou le nom que vous avez choisi à l'étape précédente). Ce peut être une bonne idée de vous y connecter pour vérifier que tout va bien....</p>
<p>Nous allons ensuite lancer automatiquement node-red au démarrage :</p>
<pre>
sudo systemctl enable nodered.service
</pre>
<p>Il existe une très grosse bibliothèque de compléments pour NodeRed, la communauté étant très active. Le site dispose d'une rubrique dédiée au partage de flux ("Flows") et de bibliothèques ("Nodes") : https://flows.nodered.org/ . Certains proposent même des solutions complètes ("Collections"), combinant les flux et bibliothèques nécessaires pour un projet complet. Chaque module dispose de sa page d'aide. Tout ceci est bien sur open source. Nous allons lancer l'installation de quelque uns des paquets complémentaires pour Node Red.</p>
<p>Pour installer des modules en ligne de commande, il faut d'abord se placer dans le bon répertoire :</p>
<pre>
cd /home/pi/.node-red/
</pre>
<p>Pour Google Home :</p>
<pre>
npm install node-red-contrib-googlehome
</pre>
<p>Pour l'interfaçage des périphériques Ewelink (https://flows.nodered.org/node/node-red-contrib-ewelink):</p>
<pre>
npm install node-red-contrib-ewelink
</pre>
<p>Pour le support ds emails sous NodeRed (https://flows.nodered.org/node/node-red-node-email) (cela nous servira pour mettre en place une sauvegarde automatique) :</p>
<pre>
npm install node-red-node-email
</pre>
<p>Pour le support de Modbus (https://flows.nodered.org/node/node-red-contrib-modbus) (nous l'utiliserons ici pour supporter un compteur d'énergie)</p>
<pre>
npm install node-red-contrib-modbus
</pre>
<p>Et enfin pour disposer d'un panneau d'affichage graphique dans NodeRed (https://flows.nodered.org/node/node-red-dashboard) :</p>
<pre>
npm install node-red-dashboard
</pre>
<p>A noter que l'installation en ligne de commande des compléments pour Node Red n'est pas la seule méthode. Nous verrons qu'il existe aussi dans l'interface graphique de node-red de quoi le faire. Les deux méthodes sont équivalentes.</p>
<p>Il est maintenant temps de rebooter..</p>
<pre>
sudo shutdown -r now
</pre>
<h5>Se connecter à la Raspberry</h5>
<p>Après reboot, vérifiez que tout va bien et que vous pouvez vous connecter :</p>
<ul>
<li>En http sur l'interface de node-red à l'adresse http://ma-raspberry.local:1880</li>
<li>En SSH, en utilisant le programme Putty (Windows), avec l'utilisateur "pi" et le mot de passe que vous avez fixé à l'étape précédente.</li>
<li>A distance sur l'interface graphique avec le bureau à distance intégré à WIndows. Sur mac, vous pourrez installer le client Microsoft à partir d'ici: <a href="https://apps.apple.com/fr/app/microsoft-remote-desktop/id1295203466?mt=12">https://apps.apple.com/fr/app/microsoft-remote-desktop/id1295203466?mt=12</a> .</li>
</ul>
<p>Si tout va bien, vous pouvez à ce stade déconnecter clavier, souris, écran, etc.. Nous allons à partir de maintenant uniquement accéder à la Raspberry en réseau.</p>
<h5>Dépannage</h5>
<p>Si vous ne pouvez pas vous connecter (y compris par l'adresse IP), c'est que quelque chose ne va pas sur la config réseau. Vous disposez toujours de la possibilité en local (écran + clavier+souris) sur un terminal simple sans environnement graphique afin de rechercher l'origine du problème. Vous pouvez vous y logger par l'utilisateur "pi" et le mot de passe choisi à l'étape précédente.</p>
<p>De ce terminal, vous pouvez ensuite lancer un environnement graphique afin de reconfigurer le réseau avec la commande :</p>
<pre>
startx
</pre>
<h3>Premiers pas sous node-red</h3>
<h4>Découverte de l'environnement</h4>
<p>La connexion à node-red se fait via un navigateur web sur le port 1880 ( http://ma-raspberry.local:1880 ou le nom que vous avez attribué aux étapes précédentes ).</p>
<p>Vue de l'écran principal de node-red (cliquer pour zoomer) :</p>
<p><a href="https://civade.com/images/nodered/Node-RED1.png" title="Node-RED1.png, déc. 2020"><img src="https://civade.com/images/nodered/.Node-RED1_m.png" alt="Node-RED1.png, déc. 2020"></a></p>
<p>La zone centrale est l'espace de travail dans lequel on dépose et l'on câble les nodes, qui sont les fonctions élémentaires de node-red.</p>
<p>Un panneau à gauche contient les différents nodes disponibles. Les nodes sont filtrables à l'aide d'un moteur de recherche au dessus. En dessous, les différents nodes sont regroupés par catégorie :</p>
<ul>
<li>Common : Nodes utilitaires (injection, debug) , et liens interfeuilles</li>
<li>Function : Toutes les fonctions agissant sur un flux.</li>
<li>Network : Toutes les fonctions agissant sur le réseau, MQTT, http, websockets, sockets et autres..</li>
<li>Output : Sortie audio uniquement par défaut.</li>
<li>Sequence : Agit sur les séquences de messages produits par les nodes.</li>
<li>Parser : Interpréteur de pages html, fichiers csv, json, xml, etc..</li>
<li>Storage : Tout ce qui concerne le stockage ou la lecture de fichiers.</li>
<li>Social : Tout ce qui concerne la messagerie et les réseaux sociaux si les extensions ont été installées.</li>
</ul>
<p>D'autres ensembles de nodes ont été installées dans la procédure ci dessus, et notamment :</p>
<ul>
<li>eWelink : dialogue avec les périphériques Ewelink (Sonoff)</li>
<li>Google Assistant : interactions avec Google Home</li>
<li>Modbus : Entrées sorties Modbus, que ce soit en IP ou en RS485</li>
<li>Dashboard : Panneau de contrôle et d'affichage pour Nodered.</li>
</ul>
<p>La zone de droite contient les fonctions d'édition des propriétés. En haut de celle-ci, différentes icônes permettent l'accès aux infos (propriétés), aide, l'onglet de debug, et bien d'autres fonctions. Tout au dessus, à droite, le bouton "Deploy" permet de déployer toute modification faite sur l'espace de travail. C'est impératif de le faire après chaque modification à tester, sinon elles ne seront pas publiées et vous fonctionnerez sur la version précédente.</p>
<p>Je ne vais pas me lancer dans un tutoriel sur nodered, d'une part car la doc officielle en est farcie ( <a href="https://nodered.org/docs/tutorials/">https://nodered.org/docs/tutorials/</a> ) mais aussi parce que le web en fourmille...</p>
<h4>Nodered et Google Home</h4>
<p>Tout d'abord, il peut paraitre inintéressant de coupler node-red et Google Home. En effet, avec Google home et des périphériques supportés, il n'y a besoin de rien d'autre pour allumer ou éteindre des appareils à la voix.. Node Red va nous permettre de faire des choses qui ne sont pas prévus par Google Home comme :</p>
<ul>
<li>Faire des scénarios plus ou moins complexes, comme par exemple allumer un périphérique à la voix, qui s'éteindra automatiquement au bout d'un certain temps. Ceci peut permettre par exemple d'éteindre automatiquement ampli de chaine hifi ou une imprimante, que l'on pourrait oublier d'éteindre manuellement.</li>
<li>Par le même procédé, on peut aussi réaliser une commande de portail qui allume un relais uniquement 3 secondes par exemple.</li>
<li>Remplacer IFTTT, devenu payant (3 commandes max dans la version gratuite), afin de lier une commande vocale à un appel à une URL avec des paramètres. Ceci ouvre des possibilités de pilotage avec Google Home de périphériques DIY qui ne sont pas interfacables avec Google Home. Je l'utilise par exemple pour commander un émetteur infrarouge qui pilote mes clims / pompe à chaleur en commande vocale.</li>
</ul>
<p>A noter que sur ce dernier scénario d'usage, contrairement à IFTTT nous n'aurons pas la possibilité de définir un nouveau vocabulaire. Il faudra s'appuyer sur celui existant ( "OK Google, <strong>Allume</strong> le Chauffage à 19 <strong>Degrés</strong>", ou "OK Google <strong>Allume</strong> l'imprimante" ). C'est une limitation, mais c'est aussi un bénéfice, car avec IFTT à contrario, il n'était pas possible d'utiliser "allume" ou "éteint" comme mots clés, réservés pour les périphériques standards.. Ici, nous n'utiliserons donc que des commandes intégrées, évitant à l'utilisateur d'apprendre de nouvelles commandes.</p>
<p>Afin de tester nous allons créer un switch, nommé ampli, qui allumera ou éteindra l'ampli home cinema avec la commande vocale "allume/éteint l'ampli", mais en plus l'éteindra automatiquemetn au bout de 3 heures si il n'y a pas eu de commande d'extinction de prononcée dans l'intervalle. 3 heures, ca fait déjà un beau film :)..</p>
<p>Pour utiliser les nodes Google Home de Node Red( https://flows.nodered.org/search?term=node-red-contrib-googlehome ), nous allons devoir créer un compte sur <a href="https://googlehome.hardill.me.uk/register">https://googlehome.hardill.me.uk/register</a>. Une fois le compte créé et que nous sommes identifiés, il nous faut créer un périphérique dans https://googlehome.hardill.me.uk/user/devices .</p>
<p>Ici, nous allons créer un périphérique simple nommé "Ampli". A noter que lors de la création, il est possible de donner des caractéristiques ("Traits") au périphérique, qui vont déterminer quelles sont les commandes auxquelles le périphérique va répondre et les statuts qu'il est susceptible de nous retourner. Pour info, ces "traits", sont renseignés automatiquement lorsque l'on sélectionne un type, mais on peut les compléter à la demande. Pour notre ampli, nous allons sélectionner un "Switch". Par défaut le type Switch n'a que le "trait" On/Off d'activé, ce qui nous suffit.</p>
<p><a href="https://civade.com/images/nodered/create-ampli.png" title="create-ampli.png, déc. 2020"><img src="https://civade.com/images/nodered/.create-ampli_m.png" alt="create-ampli.png, déc. 2020"></a></p>
<p>Vous pouvez ou pas l'associer à une pièce en fonction de ce que vous voulez faire. Si par exemple, vous souhaitez que lorsque vous sortez vous puissez dire "OK Google, éteint Salon", cela coupe toutes les lumières et l'ampli, cela peut avoir du sens. Il faut malgré tout penser que si l'on allume le salon de la même manière, l'ampli sera aussi allumé ... pour 3 heures. Dans mon cas, j'ai choisi de le dissocier du salon.</p>
<p>A partir de ce stade, Google Home sera en mesure de comprendre les commandes d'allumage ou d'extinction d'un "switch" nommé "Ampli". Mais comme il n'est pas encore câblé, cela ne fera physiquement rien.</p>
<p>Nous allons ensuire enregistrer dans l'application Google Assistant, sur mobile, un périphérique physique, capable d'allumer ou d'éteindre l'ampli. Il va nous falloir lui donner un nom différent de "ampli", par exemple amplificateur (ou rhododendron, si ca vous amuse). Dans la mesure ou nous le piloterons jamais en direct, on se fout un peu du nom dès lors qu'il n'est pas susceptible d'entrer en conflit avec le nom que vous voulez utiliser et qu'il ne risque pas d'être actité par inadvertance. Dans mon cas, j'ai pris un Sonoff DIY à 4 euros, que j'ai d'abord enregistré dans l'application mobile Ewelink, puis je l'ai ajouté dans Google Assistant. Je l'ai nommé "Amplificateur", n'étant pas particulièrement fan de rhododendron.</p>
<p>La dernière étape consiste à "brancher" les 2 dans node red, et mettre l'intelligence pour l'extinction automatique. Comme je suis avec des produits Sonoff, il va tout d'abord falloir identifier le switch que je viens d'ajouter. Malheureusement, on doit dialoguer avec celui-ci par un numéro unique d'identification, qu'il faut d'abord relever.</p>
<p>Pour ce faire nous allons batir un premier Flow qui va permettre d'interroger la liste des périphériques supportés :</p>
<p><a href="https://civade.com/images/nodered/lister-sonoff.png" title="lister-sonoff.png, déc. 2020"><img src="https://civade.com/images/nodered/.lister-sonoff_m.png" alt="lister-sonoff.png, déc. 2020"></a></p>
<p>En voici le source qui pourra être importé dans Nodered par le menu tout en haut à droite, "Import" / "Clipboard" et en collant le code Json ci dessous.</p>
<pre>
[{"id":"3dbccd96.909d22","type":"tab","label":"Lister les périphériques Sonoff","disabled":false,"info":""},{"id":"1023c8cb.31d547","type":"debug","z":"3dbccd96.909d22","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":650,"y":60,"wires":[]},{"id":"1f4535fb.fe42d2","type":"ewelink-devices","z":"3dbccd96.909d22","name":"Compte perso","auth":"d2328f67.881f68","x":460,"y":60,"wires":[["1023c8cb.31d547"]],"info":"Ca ne se connecte pas à tout les coups."},{"id":"6a8c47e3.62ed9","type":"inject","z":"3dbccd96.909d22","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":280,"y":60,"wires":[["1f4535fb.fe42d2"]]},{"id":"465b619b.dfc7f8","type":"comment","z":"3dbccd96.909d22","name":"Lister les ewelink","info":"","x":100,"y":60,"wires":[]},{"id":"d2328f67.881f68","type":"ewelink-credentials"}]
</pre>
<p><q>A noter que le code json ci dessus est assez moche et difficile car optimizé. Si vous désirez le visualiser sous forme lisible, il suffit de le copier coller dans notepad++ et d'installer le plugin "JSON Viewer". Dans "Modules d'extension" / "JSON Viewer", vous trouverez ensuite une option "Format JSON" qui mettra les directives une par ligne et les tabulations associées pour en faciliter la lecture. </q></p>
<p>Pour des raisons de sécurité, les nodes exportés ne contiennent pas les informations de configuration (comptes, mots de passes, etc...). Il va donc vos falloir reparamétrer le node d'interrogation (en bleu) avec vos identifiants de compte Ewelink (les mêmes que ceux que vous mettez dans l'application mobile Ewelink).</p>
<p>Après publication (cliquer "Deploy"), vous allez pouvoir le déclencher en cliquant sur le bouton à gauche de "Timestamp". Si tout s'est bien passé (notamment au niveau de l'authentification), vous devriez, en cliquant sur "Debug" (1), Payload (2) et en sélectionnant le bon objet (3), trouver votre switch nommé "Amplificateur". Juste au dessus, se trouve le "deviceid" qu'il va nous falloir garder pour la suite du paramétrage.</p>
<p><a href="https://civade.com/images/nodered/amplificateur.png" title="amplificateur.png, déc. 2020"><img src="https://civade.com/images/nodered/.amplificateur_m.png" alt="amplificateur.png, déc. 2020"></a></p>
<p>Nous allons maintenant que 'id est connu pouvoir mettre en place la programmation pour l'allumage extinction du switch. Importez la feuille ci dessous avec la même méthode que celle vue précédemment :</p>
<pre>
[{"id":"54677a23.6603c4","type":"tab","label":"Ampli","disabled":false,"info":""},{"id":"32be4281.a23356","type":"comment","z":"54677a23.6603c4","name":"Gestion de l'ampli avec Google Home et un Sonof DIY à 4 USD, timer 3 heures","info":"","x":300,"y":40,"wires":[]},{"id":"af140768.365f9","type":"google-home","z":"54677a23.6603c4","conf":"144ed61b.13aaca","device":"6640","acknowledge":true,"name":"Ampli","topic":"","x":245,"y":80,"wires":[["e32913a7.610908"]]},{"id":"bd24774d.045e88","type":"google-home-response","z":"54677a23.6603c4","conf":"144ed61b.13aaca","device":"6640","name":"Ampli","x":685,"y":180,"wires":[]},{"id":"e32913a7.610908","type":"function","z":"54677a23.6603c4","name":"","func":"if (msg.payload.command == "action.devices.commands.OnOff") {\n if (msg.payload.params.on) {\n msg.payload = "on";\n } else {\n msg.payload = "off";\n }\n} \n return [msg,null];","outputs":1,"noerr":0,"initialize":"","finalize":"","x":395,"y":80,"wires":[["bf337f24.a6f4d","a1e5f2fc.66eb68"]]},{"id":"bf337f24.a6f4d","type":"trigger","z":"54677a23.6603c4","name":"","op1":"","op2":"off","op1type":"nul","op2type":"str","duration":"360","extend":true,"overrideDelay":false,"units":"min","reset":"","bytopic":"all","topic":"topic","outputs":1,"x":475,"y":140,"wires":[["bc06065.8cf8ef8","a1e5f2fc.66eb68"]]},{"id":"bc06065.8cf8ef8","type":"function","z":"54677a23.6603c4","name":"","func":"msg.payload = {\n command: "action.devices.commands.OnOff",\n params: {\n on: false ,\n online: true\n }\n};\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":555,"y":180,"wires":[["bd24774d.045e88"]]},{"id":"a1e5f2fc.66eb68","type":"ewelink-power-state-write","z":"54677a23.6603c4","name":"Ampli","deviceId":"1000f0d61a","channel":1,"auth":"d2328f67.881f68","x":625,"y":80,"wires":[[]]},{"id":"60e6f006.ab3b7","type":"comment","z":"54677a23.6603c4","name":"Update Google Homegraph state","info":"","x":895,"y":180,"wires":[]},{"id":"4231e968.4973d","type":"comment","z":"54677a23.6603c4","name":"Allume immédiatement","info":"","x":855,"y":80,"wires":[]},{"id":"dbfa2871.66531","type":"inject","z":"54677a23.6603c4","name":"On","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"on","payloadType":"str","x":245,"y":180,"wires":[["bf337f24.a6f4d","a1e5f2fc.66eb68"]]},{"id":"f029e3af.19ac88","type":"comment","z":"54677a23.6603c4","name":"Eteint au bout de 3 heures ou sur ordre","info":"","x":915,"y":140,"wires":[]},{"id":"144ed61b.13aaca","type":"google-home-conf","username":"moncompte","localControl":false},{"id":"d2328f67.881f68","type":"ewelink-credentials"}]
</pre>
<p>Ce sketch va nécessiter un peu de paramétrage. Double cliquez sur le node bleu (Ampli) et sélectionnez dans la liste déroulante les identifiants précédemment créés pour le compte Ewelink. Puis double cliquez sur les 2 nodes gris "Ampli", et y mettre les identifiants du compte créé sur le site <a href="https://googlehome.hardill.me.uk">https://googlehome.hardill.me.uk</a>.</p>
<p><a href="https://civade.com/images/nodered/node-red-ampli.png" title="node-red-ampli.png, déc. 2020"><img src="https://civade.com/images/nodered/.node-red-ampli_m.png" alt="node-red-ampli.png, déc. 2020"></a></p>
<p>Après publication, vous pourrez vérifier le bon fonctionnement de Nodered > Ewelink en cliquant sur "On". Il vous restera à terser les commandes vocales sous Google Home: "Allume" Ampli", "Eteint Ampli"
A noter que lorsque le trigger est bien déclenché (par la commande vocale ou l'appui manuel sur "on"), un petit point bleu s'affiche à côté. Il 'éteindra ici tout seul au bout de 3 heures. Le temps peut être ajusté dans le trigger (double cliquez sur le node violet..).</p>
<p><a href="https://civade.com/images/nodered/trigger-declenche.png" title="trigger-declenche.png, déc. 2020"><img src="https://civade.com/images/nodered/.trigger-declenche_m.png" alt="trigger-declenche.png, déc. 2020"></a></p>
<p>Nous venons donc d'ajouter un nouveau périphérique nommé ampli, qui s'éteint tout seul au bout de 3 heures..</p>
<h4>Nodered et Modbus</h4>
<h5>Modbus</h5>
<p>Modbus est un protocole de 1979, qui permet de discuter avec des périphériques en les adressant individuellement. Initialement développé pour des automates programmables et avec une couche transport reposant sur une liaison série RS485, permettant de raccorder plusieurs périphériques sur une même ligne de transmission, il est aujourd'hui très répandu car il est royalty-free et relativement facile à mettre en oeuvre.</p>
<p>Aujourd'hui, le protocole modbus existe en 2 variantes majeures : RTU (sur liaison série RS232, RS422, RS485) et TCP (réseau filaire et wifi). En mode RTU, nous sommes en maitre / esclave. C'est le maitre qui pose les questions aux esclaves qui répondent tour à tour si leur adresse est visée. C'est grace à cette astuce qu'il ne peut pas y avoir de collision, puisqu'un et un seul élève peut répondre à la fois à un maitre, et uniquement lorsqu'il est interrogé.</p>
<p><a href="https://civade.com/images/nodered/modbus-serial-query.png" title="modbus-serial-query.png, janv. 2021"><img src="https://civade.com/images/nodered/.modbus-serial-query_m.png" alt="modbus-serial-query.png, janv. 2021"></a></p>
<p>En mode TCP, nous sommes en client serveur, et le serveur est passif. Il attend les connexions des clients qui doivent écrire dans le serveur.</p>
<p>Nous allons plus particulièrement nous intéresser modbus RTU sur liaison RS485. En effet, de nombreux périphériques sont désormais disponibles à prix abordables pour le grand publix à ce format : micro automates programmables, modules d'entrées sorties, capteurs de pression, de température, pilotage de moteurs à fréquence variables, compteurs d'énergie, etc.. Il suffit de 2 fils pour les raccorder, de leur attribuer une adresse différente et bien sur de disposer de la documentation de référence Modbus de l'appareil pour savoir quels sont les registre disponibles. Les périphériques sont mis en parallèle sur une ligne de transmission comme suit :</p>
<p><a href="https://civade.com/images/nodered/modbus-serial.png" title="modbus-serial.png, janv. 2021"><img src="https://civade.com/images/nodered/.modbus-serial_m.png" alt="modbus-serial.png, janv. 2021"></a></p>
<p>En principe, il ne faut pas dépasser 32 périphériques modbus sur une même ligne de transmission. Au delà il faudra mettre un répéteur. Il faut également qu'une ligne de transmission modbus soit chargeé à ses 2 extrémités avec une résistance de 100 ou 120 ohms, qui soit accordée à l'impédance caractéristique du câble pour limiter les pertes de transmission. Sur de très petites distances, et avec un seul périphérique, c'est beaucoup moins critique, et nous allons pouvoir l'oublier, mais il faudra y penser si vous envisagez de placer un câble de plusieurs dizaines de mètres entre la raspberry et le module modbus. Le choix du cable devient alors important.</p>
<p>Pour l'exemple nous alllons interfacer un SDM230 (100A max) ou SDM 120 (50A max), compteur d'énergie de EASTRON. Disponible à 25 euros, ce module se met dans le tableau électrique, en tête de réseau, pour comptabiliser l'énergie consommée dans la maison. Il est capable de fournir la tension, le courant et la puissance instantanée, ainsi que le comptage d'énergie totale consommée en KW/H.</p>
<p>La Raspberry fournissant une simple liaison série 3.3V, il va nous falloir un adaptateur série <> Modbus série pour pouvoir dialoguer avec nos périphériques Modbus. On en trouve de nombreux sur Aliexpress à partir de 2 euros : https://fr.aliexpress.com/wholesale?SearchText=module+TTL+RS485</p>
<p>Voici celui que j'ai acheté, car il dispose d'une bonne protection contre les décharges électrostatiques et les surtensions ainsi que 2 leds d'activité TX/RX:</p>
<p><a href="https://civade.com/images/nodered/RS485-adapter.jpg" title="RS485-adapter.jpg, janv. 2021"><img src="https://civade.com/images/nodered/.RS485-adapter_m.jpg" alt="RS485-adapter.jpg, janv. 2021"></a></p>
<p>Côté branchements, un côté se raccorde à une alimentation (3.3V/GND) de la Raspberry et à la liaison série (TX = GPIO14, RX=GPIO15). Le TXd de la raspberry se branche sur le TXd de la carte RS485 et vice/versa.</p>
<p><a href="https://civade.com/images/nodered/Raspberry-PI-Zero-Pinout-schema.webp" title="Raspberry-PI-Zero-Pinout-schema.webp, janv. 2021"><img src="https://civade.com/images/nodered/.Raspberry-PI-Zero-Pinout-schema_m.webp" alt="Raspberry-PI-Zero-Pinout-schema.webp, janv. 2021"></a></p>
<p>L'aute côté (RS485) se raccorde en branchant le A+ de l'adaptateur sur le A+ du SDM230, et même chose pour le B-.</p>
<h5>Protocole Modbus</h5>
<p>Pour plus d'explication sur le protocole Modbus et notamment avoir les adresses des registres disponibles, vous pouvez consulter la <a href="https://civade.com/images/nodered/SDM230-PROTOCOL.pdf">Documentation du protocole SDM230</a>. J'ai également trouvée une <a href="https://civade.com/images/nodered/SDM230-MODBUS_Protocol.pdf">doc détaillée sur les registres disponibles sur le SDM230</a>.</p>
<p>A la lecure de la doc, on a l'impression que c'est compliqué mais vous allez voir que via Nodered et les modules additionnels c'est finalement assez simple.</p>
<p>Les valeurs à lire sont dans les "Input Registers". Il est dit dans la doc du SDM230 que les valeurs sont contenues dans 2 registres consécutifs de 16 bits (soit 4 octets) et qu'ils sont encodés en virgule flottante IEEE754.</p>
<p>Si nous souhaitons lire le courant (1), nous allons donc devoir lire 2 registre consécutifs à l'adresse 6 (2) comme l'indique la doc :</p>
<p><a href="https://civade.com/images/nodered/InputRegisters.png" title="InputRegisters.png, janv. 2021"><img src="https://civade.com/images/nodered/.InputRegisters_m.png" alt="InputRegisters.png, janv. 2021"></a></p>
<p>Attention, l'adresse du regitre (2) est en hexadécimal.</p>
<p>Il va également nous falloir connaitre l'adresse Modbus du périphérique. Par défaut, elle est à 1 mais je l'ai changée à 30 par le panneau avant du SDM340. Enfin, j'ai conservé la vitesse par défaut de Modbus (9600 bauds), ainsi que le format (n,8,1). Ca y es tnous avons tout ce qu'il faut pour questionner notre périphérique Modbus:</p>
<p>Nous allons donc poser la question au périphérique d'adresse 30 (1), pour lire les Inpupt Registers (2), en lui demandant 2 registres de 16 bits (4) commençant à l'adresse 6 (3), et allons dialoguer sur la liaison série /dev/serial0 paramétrée en 9600 bauds, 8 bits, no parity, 1 stop bit :</p>
<p><a href="https://civade.com/images/nodered/ModbusQuestion.png" title="ModbusQuestion.png, janv. 2021"><img src="https://civade.com/images/nodered/.ModbusQuestion_m.png" alt="ModbusQuestion.png, janv. 2021"></a></p>
<p>Nous savons maintenant comment mettre en corrélation une table décrivant les registres modbus, avec une vraie demande faite par Node-Red. Nous allons voir plus loin comment l'implémenter.</p>
<p>Le dernier point restant à régler est que ces 4 octets représentant les valeurs en virgule flottante ne sont pas faciles à comprendre. Vous trouverez en ligne bon nombre de convertisseurs susceptibles de vous aider comme par exemple <a href="https://www.h-schmidt.net/FloatConverter/IEEE754.html">https://www.h-schmidt.net/FloatConverter/IEEE754.html</a> .</p>
<p>Dans NodeRed, nous disposerons d'une fonction nommée "parsefloat" qui permettra d'effectuer cette conversion.</p>
<h5>Modbus dans Nodered</h5>
<p>Ici pour faciliter les choses, je suis parti d'un Flow venant de la bibliothèque NodeRed pour SDM120 (<a href="https://flows.nodered.org/flow/75a4715fb6a3595057343a92abc493e4">https://flows.nodered.org/flow/75a4715fb6a3595057343a92abc493e4</a> ) . Il a été à peine adapté le SDM230 étant compatible en terme de protocole.</p>
<p>En plus de node-red-contrib-modbus, ce flow utilise node-red-dashboard pour ajouter une page de supervision avec des widgets graphiques. Ceux ci seront visibles sur http://ma-raspberry.local:1880/ui</p>
<p>Voici le code modifié pour SDM230 du Flow à importer (triple cliquer pour sélectionner tout le bloc):</p>
<pre>
[{"id":"f89db908.ccfc58","type":"tab","label":"SDM230","disabled":false,"info":""},{"id":"ebbc4482.1edd58","type":"comment","z":"f89db908.ccfc58","name":"SDM230 Energy Meter","info":"","x":140,"y":40,"wires":[]},{"id":"75c0e766.f23c68","type":"modbus-read","z":"f89db908.ccfc58","name":"SDM 230 Tension","topic":"","showStatusActivities":true,"logIOActivities":false,"showErrors":true,"unitid":"30","dataType":"InputRegister","adr":"0","quantity":"2","rate":"10","rateUnit":"s","delayOnStart":false,"startDelayTime":"","server":"40f20c7f.13a934","useIOFile":false,"ioFile":"","useIOForPayload":false,"emptyMsgOnFail":false,"x":146.00001525878906,"y":156,"wires":[["49b8d724.64fea","1b079b9e.95ab2c"],[]]},{"id":"49b8d724.64fea","type":"function","z":"f89db908.ccfc58","name":"Tension","func":"var rawData = new ArrayBuffer(4);\nvar intView = new Uint16Array(rawData);\nvar fltView = new Float32Array(rawData);\n\nintView[0] = msg.payload[1]; //low\nintView[1] = msg.payload[0]; //high\n\nmsg.payload = parseFloat(fltView[0].toFixed(1));\nmsg.topic = "voltage";\n\nnode.status({fill:"blue",shape:"ring",text:msg.topic + ":" + msg.payload}); \n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":390,"y":148,"wires":[["1495c496.dd7023","36fe9de8.3ed38a"]]},{"id":"62bde4e.246551c","type":"modbus-queue-info","z":"f89db908.ccfc58","name":"SDM230_file_attente","topic":"","unitid":"30","queueReadIntervalTime":"1000","lowLowLevel":"1","lowLevel":75,"highLevel":150,"highHighLevel":300,"server":"40f20c7f.13a934","errorOnHighLevel":false,"showStatusActivities":false,"updateOnAllQueueChanges":false,"updateOnAllUnitQueues":false,"x":540,"y":520,"wires":[["5531e192.8a2948"]]},{"id":"44db4c34.a23e2c","type":"inject","z":"f89db908.ccfc58","name":"","repeat":"","crontab":"","once":false,"topic":"","payload":"","payloadType":"date","x":160,"y":520,"wires":[["e736a009.8a33a"]]},{"id":"e736a009.8a33a","type":"change","z":"f89db908.ccfc58","name":"Reset queue","rules":[{"t":"set","p":"resetQueue","pt":"msg","to":"true","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":330,"y":520,"wires":[["62bde4e.246551c"]]},{"id":"86caa608.7adf88","type":"function","z":"f89db908.ccfc58","name":"Courant","func":"var rawData = new ArrayBuffer(4);\nvar intView = new Uint16Array(rawData);\nvar fltView = new Float32Array(rawData);\n\nintView[0] = msg.payload[1]; //low\nintView[1] = msg.payload[0]; //high\n\nmsg.payload = parseFloat(fltView[0].toFixed(1));\nmsg.topic = "current";\n\nnode.status({fill:"blue",shape:"ring",text:msg.topic + ":" + msg.payload}); \n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":389,"y":206,"wires":[["a7e4a3d5.23f35","36fe9de8.3ed38a"]]},{"id":"900e06b4.93eca8","type":"function","z":"f89db908.ccfc58","name":"Puissance","func":"var rawData = new ArrayBuffer(4);\nvar intView = new Uint16Array(rawData);\nvar fltView = new Float32Array(rawData);\n\nintView[0] = msg.payload[1]; //low\nintView[1] = msg.payload[0]; //high\n\nmsg.payload = parseFloat(fltView[0].toFixed(1));\nmsg.topic = "power";\n\nnode.status({fill:"blue",shape:"ring",text:msg.topic + ":" + msg.payload}); \n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":400,"y":259,"wires":[["d92d71c3.167b9","36fe9de8.3ed38a","9837f252.bb0e"]]},{"id":"6179779.d820a08","type":"function","z":"f89db908.ccfc58","name":"Fréquence","func":"var rawData = new ArrayBuffer(4);\nvar intView = new Uint16Array(rawData);\nvar fltView = new Float32Array(rawData);\n\nintView[0] = msg.payload[1]; //low\nintView[1] = msg.payload[0]; //high\n\nmsg.payload = parseFloat(fltView[0].toFixed(1));\nmsg.topic = "frequency";\n\nnode.status({fill:"blue",shape:"ring",text:msg.topic + ":" + msg.payload}); \n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":400,"y":315,"wires":[["d76382a3.74ea78","36fe9de8.3ed38a"]]},{"id":"1c155c0e.286224","type":"function","z":"f89db908.ccfc58","name":"Consommation","func":"var rawData = new ArrayBuffer(4);\nvar intView = new Uint16Array(rawData);\nvar fltView = new Float32Array(rawData);\n\nintView[0] = msg.payload[1]; //low\nintView[1] = msg.payload[0]; //high\n\nmsg.payload = parseFloat(fltView[0].toFixed(2));\nmsg.topic = "energy";\n\nnode.status({fill:"blue",shape:"ring",text:msg.topic + ":" + msg.payload}); \n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":410,"y":375,"wires":[["9cd2baf1.c3108","36fe9de8.3ed38a"]]},{"id":"ce99604f.7fd198","type":"modbus-read","z":"f89db908.ccfc58","name":"SDM 230 Courant","topic":"","showStatusActivities":true,"logIOActivities":false,"showErrors":true,"unitid":"30","dataType":"InputRegister","adr":"6","quantity":"2","rate":"10","rateUnit":"s","delayOnStart":false,"startDelayTime":"","server":"40f20c7f.13a934","useIOFile":false,"ioFile":"","useIOForPayload":false,"emptyMsgOnFail":false,"x":154.00001525878906,"y":212,"wires":[["86caa608.7adf88"],[]]},{"id":"ac524aef.e3dc3","type":"modbus-read","z":"f89db908.ccfc58","name":"SDM 230 Puissance","topic":"","showStatusActivities":true,"logIOActivities":false,"showErrors":true,"unitid":"30","dataType":"InputRegister","adr":"12","quantity":"2","rate":"10","rateUnit":"s","delayOnStart":false,"startDelayTime":"","server":"40f20c7f.13a934","useIOFile":false,"ioFile":"","useIOForPayload":false,"emptyMsgOnFail":false,"x":156.00001525878906,"y":265,"wires":[["900e06b4.93eca8"],[]]},{"id":"bae1c9a1.1ea118","type":"modbus-read","z":"f89db908.ccfc58","name":"SDM 230 Fréquence","topic":"","showStatusActivities":true,"logIOActivities":false,"showErrors":true,"unitid":"30","dataType":"InputRegister","adr":"70","quantity":"2","rate":"10","rateUnit":"s","delayOnStart":false,"startDelayTime":"","server":"40f20c7f.13a934","useIOFile":false,"ioFile":"","useIOForPayload":false,"emptyMsgOnFail":false,"x":155.00001525878906,"y":322,"wires":[["6179779.d820a08"],[]]},{"id":"20c62d66.26be7a","type":"modbus-read","z":"f89db908.ccfc58","name":"SDM 230 Consommation","topic":"","showStatusActivities":true,"logIOActivities":false,"showErrors":true,"unitid":"30","dataType":"InputRegister","adr":"342","quantity":"2","rate":"10","rateUnit":"s","delayOnStart":false,"startDelayTime":"","server":"40f20c7f.13a934","useIOFile":false,"ioFile":"","useIOForPayload":false,"emptyMsgOnFail":false,"x":175.00001525878906,"y":381,"wires":[["1c155c0e.286224","e77afdf2.850098"],[]]},{"id":"1495c496.dd7023","type":"ui_text","z":"f89db908.ccfc58","group":"2c2fdfeb.fe41e","order":1,"width":0,"height":0,"name":"","label":"Tension","format":"{{msg.payload}} V","layout":"row-spread","x":576,"y":150,"wires":[]},{"id":"a7e4a3d5.23f35","type":"ui_text","z":"f89db908.ccfc58","group":"2c2fdfeb.fe41e","order":2,"width":0,"height":0,"name":"","label":"Courant","format":"{{msg.payload}} A","layout":"row-spread","x":577,"y":205,"wires":[]},{"id":"d92d71c3.167b9","type":"ui_text","z":"f89db908.ccfc58","group":"d9aabaeb.cf26","order":1,"width":0,"height":0,"name":"","label":"Puissance","format":"{{msg.payload}} W","layout":"row-spread","x":593,"y":260,"wires":[]},{"id":"d76382a3.74ea78","type":"ui_text","z":"f89db908.ccfc58","group":"2c2fdfeb.fe41e","order":3,"width":0,"height":0,"name":"","label":"Fréquence","format":"{{msg.payload}} Hz","layout":"row-spread","x":593,"y":316,"wires":[]},{"id":"9cd2baf1.c3108","type":"ui_text","z":"f89db908.ccfc58","group":"d9aabaeb.cf26","order":2,"width":0,"height":0,"name":"","label":"Consommation","format":"{{msg.payload}} kWh","layout":"row-spread","x":605,"y":376,"wires":[]},{"id":"36fe9de8.3ed38a","type":"function","z":"f89db908.ccfc58","name":"Build object","func":"watch_topic = "energy";\nvar output = {};\n\ncontext.set(msg.topic,msg.payload);\n\nif (context.get("voltage")!==undefined) {\n output.voltage = context.get("voltage");\n}\nif (context.get("current")!==undefined) {\n output.current = context.get("current");\n}\nif (context.get("power")!==undefined) {\n output.power = context.get("power");\n}\nif (context.get("frequency")!==undefined) {\n output.frequency = context.get("frequency");\n}\nif (context.get("energy")!==undefined) {\n output.energy = context.get("energy");\n}\nmsg.payload = output;\n\nif (msg.topic===watch_topic) {\n msg.topic = "sdm230";\n return msg;\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","x":766,"y":233,"wires":[["34123b57.819dec","a1b03462.1d9bf"]]},{"id":"34123b57.819dec","type":"debug","z":"f89db908.ccfc58","name":"","active":false,"console":"false","complete":"true","x":930,"y":233,"wires":[]},{"id":"e0b31d56.021408","type":"function","z":"f89db908.ccfc58","name":"Diagnostic input message structure","func":"// setting a global flag that the solar system is down\n\nmsg.payload = "High voltage warning: " + msg.payload.voltage +" V";\nmsg.system = 1; // System id, use 1 for Dummy\n//msg.state = 1; // specify if the message is to change system status\nmsg.severity = 1; // 0: information, 1: warning, 2: error\nmsg.email = false; // if separate email should be sent\n//msg.emailtext = "Clean up step of the SAIA log backup has failed";\nreturn msg;","outputs":1,"noerr":0,"x":1481,"y":121,"wires":[["802fdccc.5b6de8"]]},{"id":"802fdccc.5b6de8","type":"link out","z":"f89db908.ccfc58","name":"","links":["13e089a7.73cb46"],"x":1688,"y":143,"wires":[]},{"id":"f511148e.b4aec","type":"switch","z":"f89db908.ccfc58","name":"Voltage check","property":"payload.voltage_check","propertyType":"msg","rules":[{"t":"eq","v":"high","vt":"str"},{"t":"eq","v":"low","vt":"str"}],"checkall":"true","outputs":2,"x":1189,"y":145,"wires":[["e0b31d56.021408"],["4e2e71eb.c57fd"]]},{"id":"4e2e71eb.c57fd","type":"function","z":"f89db908.ccfc58","name":"Diagnostic input message structure","func":"// setting a global flag that the solar system is down\n\nmsg.payload = "Low voltage warning: " + msg.payload.voltage +" V";\nmsg.system = 1; // System id, use 1 for Dummy\n//msg.state = 1; // specify if the message is to change system status\nmsg.severity = 1; // 0: information, 1: warning, 2: error\nmsg.email = false; // if separate email should be sent\n//msg.emailtext = "Clean up step of the SAIA log backup has failed";\nreturn msg;","outputs":1,"noerr":0,"x":1481,"y":166,"wires":[["802fdccc.5b6de8"]]},{"id":"a1b03462.1d9bf","type":"function","z":"f89db908.ccfc58","name":"Voltage check","func":"var high = 250.0;\nvar low = 220.0;\n\nif (msg.payload.voltage > high) {\n msg.payload.voltage_check = "high";\n}\nif (msg.payload.voltage < low) {\n msg.payload.voltage_check = "low";\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":976,"y":146,"wires":[["f511148e.b4aec"]]},{"id":"5fc9ee63.923f1","type":"function","z":"f89db908.ccfc58","name":"reset on HighHigh","func":"if("high high level reached" === msg.state) {\n msg.resetQueue = true;\n return msg;\n}\n","outputs":1,"noerr":0,"x":416.00000762939453,"y":651.2500247955322,"wires":[["62bde4e.246551c","4edc5371.db5b5c"]]},{"id":"e91de07.8cdba2","type":"catch","z":"f89db908.ccfc58","name":"Catch queue errors","scope":["62bde4e.246551c"],"x":178.00000762939453,"y":651.2500247955322,"wires":[["5fc9ee63.923f1"]]},{"id":"5c3bd69d.46156","type":"comment","z":"f89db908.ccfc58","name":"Error handling","info":"","x":144.00000762939453,"y":606.2500247955322,"wires":[]},{"id":"4edc5371.db5b5c","type":"function","z":"f89db908.ccfc58","name":"Diagnostic input message structure","func":"// setting a global flag that the solar system is down\n\nmsg.payload = "SDM230 modbus queue reached high level, resetting. (" + msg.state + ")";\nmsg.system = 4; // System id, use 1 for Dummy\n//msg.state = 1; // specify if the message is to change system status\nmsg.severity = 1; // 0: information, 1: warning, 2: error\nmsg.email = false; // if separate email should be sent\n//msg.emailtext = "Clean up step of the SAIA log backup has failed";\nreturn msg;","outputs":1,"noerr":0,"x":716.0000076293945,"y":650.2500247955322,"wires":[["c50380ac.51ffb8"]]},{"id":"c50380ac.51ffb8","type":"link out","z":"f89db908.ccfc58","name":"","links":["13e089a7.73cb46"],"x":902.0000076293945,"y":650.2500247955322,"wires":[]},{"id":"30e686ee.3e8a42","type":"catch","z":"f89db908.ccfc58","name":"Modbus read errors","scope":["ce99604f.7fd198","20c62d66.26be7a","bae1c9a1.1ea118","ac524aef.e3dc3","75c0e766.f23c68","ebbc4482.1edd58"],"x":178.00000762939453,"y":694.2500247955322,"wires":[["d0359fe9.a43e88"]]},{"id":"d0359fe9.a43e88","type":"function","z":"f89db908.ccfc58","name":"Diagnostic input message structure","func":"// setting a global flag that the solar system is down\n\nmsg.payload = "SDM230 modbus error: " + msg.error.message;\nmsg.system = 4; // System id, use 1 for Dummy\n//msg.state = 1; // specify if the message is to change system status\nmsg.severity = 1; // 0: information, 1: warning, 2: error\nmsg.email = false; // if separate email should be sent\n//msg.emailtext = "Clean up step of the SAIA log backup has failed";\nreturn msg;","outputs":1,"noerr":0,"x":467.00000762939453,"y":694.2500247955322,"wires":[["2742f67e.2c0132"]]},{"id":"2742f67e.2c0132","type":"link out","z":"f89db908.ccfc58","name":"","links":[],"x":653.0000076293945,"y":694.2500247955322,"wires":[]},{"id":"5531e192.8a2948","type":"debug","z":"f89db908.ccfc58","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":710,"y":520,"wires":[]},{"id":"da547ef3.a86e98","type":"inject","z":"f89db908.ccfc58","name":"Check","props":[{"p":"payload","v":"","vt":"date"},{"p":"topic","v":"timecheck","vt":"string"}],"repeat":"1","crontab":"","once":false,"topic":"timecheck","payload":"","payloadType":"date","x":160,"y":440,"wires":[["e77afdf2.850098"]]},{"id":"bd6193e4.61b32","type":"switch","z":"f89db908.ccfc58","name":"Update diag?","property":"warning","propertyType":"msg","rules":[{"t":"true"}],"checkall":"true","outputs":1,"x":609,"y":440,"wires":[["6765dc93.bbff4c"]]},{"id":"6765dc93.bbff4c","type":"link out","z":"f89db908.ccfc58","name":"","links":["13e089a7.73cb46"],"x":728.3015727996826,"y":439.57140350341797,"wires":[]},{"id":"9837f252.bb0e","type":"ui_gauge","z":"f89db908.ccfc58","name":"Puissance","group":"ab711794.074a9","order":1,"width":0,"height":0,"gtype":"gage","title":"Puissance","label":"W","format":"{{value}}","min":0,"max":"13000","colors":["#00b500","#e6b100","#ca3838"],"seg1":"7000","seg2":"10000","x":590,"y":80,"wires":[]},{"id":"e77afdf2.850098","type":"function","z":"f89db908.ccfc58","name":"Health check","func":"var devicename = "sdm230"; // Device name used for context variable\nvar system_id = 4; // System id number for diagnostic update\nvar online_threshold = 10; // Seconds between updates under which the device is considered online\nvar offline_threshold = 30; // Seconds between updates above which the device is considered offline\n\nvar temp = context.get(devicename+"_update");\nvar current = new Date();\nmsg.payload = "No data";\nmsg.warning = false;\nif (msg.topic!=="timecheck") {\n // Do not update the context if it is triggered by the check inject node\n context.set(devicename+"_update",current);\n}\nif (temp===undefined) {\n // this will be the case when node-red is booting up or redeployed\n context.set(devicename+"_update",current);\n}\n\nif (temp!==undefined) {\n current = current - temp;\n current = Math.floor(current/1000);\n var minute = Math.floor(current/60);\n var hour = Math.floor(minute/60);\n var day = Math.floor(hour/24);\n if (current>24*60*60) {\n msg.payload = "Last update " + day + " days, " + hour%24 + " hours, " + minute%60 + " minutes, " + current%60 + " seconds ago";\n } else if (current>60*60) {\n msg.payload = "Last update " + hour%24 + " hours, " + minute%60 + " minutes, " + current%60 + " seconds ago";\n } else if (current>60) {\n msg.payload = "Last update " + minute%60 + " minutes, " + current%60 + " seconds ago";\n } else {\n msg.payload = "Last update " + current%60 + " seconds ago";\n }\n\n if (context.get(devicename+"_state")!==1) {\n if (current<online_threshold) {\n msg.payload = "SDM230 is now online";\n msg.system = system_id; // System id, use 1 for Dummy\n msg.state = 1; // specify if the message is to change system status\n msg.severity = 0; // 0: information, 1: warning, 2: error\n //msg.email = true; // if separate email should be sent\n //msg.emailtext = ""; this a long text which goes into the email \n msg.warning = true;\n context.set(devicename+"_state",1);\n }\n } else {\n if (current>offline_threshold) {\n msg.payload = "SDM230 is not transmitting";\n msg.system = system_id; // System id, use 1 for Dummy\n msg.state = 99; // specify if the message is to change system status\n msg.severity = 2; // 0: information, 1: warning, 2: error\n //msg.email = true; // if separate email should be sent\n //msg.emailtext = ""; this a long text which goes into the email \n msg.warning = true;\n context.set(devicename+"_state",99);\n }\n }\n \n \n}\n\nnode.status({fill:"blue",shape:"ring",text:msg.payload});\n\nreturn msg;","outputs":1,"noerr":0,"x":414,"y":440,"wires":[["bd6193e4.61b32"]]},{"id":"1b079b9e.95ab2c","type":"debug","z":"f89db908.ccfc58","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":400,"y":100,"wires":[]},{"id":"40f20c7f.13a934","type":"modbus-client","name":"Serial_9600_8_N_1","clienttype":"serial","bufferCommands":true,"stateLogEnabled":false,"queueLogEnabled":false,"tcpHost":"127.0.0.1","tcpPort":"502","tcpType":"DEFAULT","serialPort":"/dev/serial0","serialType":"RTU-BUFFERD","serialBaudrate":"9600","serialDatabits":"8","serialStopbits":"1","serialParity":"none","serialConnectionDelay":"100","unit_id":"","commandDelay":"30","clientTimeout":"2000","reconnectOnTimeout":false,"reconnectTimeout":"5000","parallelUnitIdsAllowed":false},{"id":"2c2fdfeb.fe41e","type":"ui_group","name":"UIF","tab":"72b1a4dc.4f488c","order":2,"disp":true,"width":6,"collapse":false},{"id":"d9aabaeb.cf26","type":"ui_group","name":"PC","tab":"72b1a4dc.4f488c","order":3,"disp":true,"width":6,"collapse":false},{"id":"ab711794.074a9","type":"ui_group","name":"Graphes","tab":"72b1a4dc.4f488c","order":1,"disp":true,"width":6,"collapse":false},{"id":"72b1a4dc.4f488c","type":"ui_tab","name":"Modbus","icon":"memory","order":15,"disabled":false,"hidden":false}]
</pre>
<p>Je vous encourage à double cliquer sur les noeuds pour voir comment ceux ci sont configurés, et notamment les noeuds de fonction juste derrière les noeuds d'acquisition, ceux ci contenant les fonctions de conversion des 4 octets récupérés vers un nombre flottant.</p>
<p>Ces valeurs sont ensuites affichées dans le Dashboard grâce aux noeuds en bleu, mais aussi traitées pour générer une exception si la tension d'entrée n'est pas dans une plage définie (Voltage Check).</p>
<p>Il y a encore d'autres fonctions comme une vérification de bonne santé (health Check), ou un traitement d'erreur sur la fle d'attente que je vous laisse découvrir en double cliquant sur les noeuds pour en analyser le fonctionnement.</p>
<h4>Simulation Modbus</h4>
<p>Si vous ne disposez pas du SDM 230, il est possible de simuler une communication modbus avec un logiciel adequat. Pour sa mise en oeuvre il va nous falloir relier la liason série de la Raspberry avec lePC. Pour faire ces tests j'ai utilisé le convertisseur modbus ajouté sur la Raspberry à l'étape précédente, et un convertisseur USB <> 485 à 2/3 euros. Il est aussi possible de relier le PC à la Raspberry via un convertisseur USB / Série 3.3V. A noter que si on veut faire une configuration hybride avec la Raspberry, au moins un vrai périphérique et un périphérique simulé par le PC, on ne pourra utiliser que le RS485, car seul ce protocole de transport permet de mettre plusieurs prériphériques sur la même ligne de transmission.</p>
<p>Côté PC, il va nous falloir un logiciel. On trouve sur Sourceforge ModRsim2, qui fait très bien le boulot : <a href="https://sourceforge.net/projects/modrssim2/">https://sourceforge.net/projects/modrssim2/</a>. Il est largement paramétrable et permet de fonctionner en RTU (série) ou TCP. Ici, c'est le mode RTU qui va nous intéresser. Afin que le logiciel retourne des valeurs valides à notre Raspberry, j'ai préparé un fichier de configuration qui va remonter des valeurs typiques de courant / tension, etc. pour un périquérique configuré à l'adresse 30.</p>
<p><a href="https://civade.com/images/nodered/MODDATA.zip">Vous le trouverez en téléchargement ici</a>. Après décompression et en le plaçant dans le même répertoire que le logiciel, il sera automatiquement chargé au démarrage du simulateur.</p>
<p>Vous noterez dans la fenetre principale du logiciel :</p>
<ul>
<li>L'affichage de l'adresse du registre en hexadécimal ou en décimal (1)</li>
<li>Le format d'affichage de la donnée contenu dans le registre (2)</li>
<li>Le protocole (mettre RS232) (3)</li>
<li>L'affichage des valeurs de registre qui vont être envoyées à la Raspberry (4)</li>
</ul>
<p><a href="https://civade.com/images/nodered/modbus1.png" title="modbus1.png, déc. 2020"><img src="https://civade.com/images/nodered/.modbus1_m.png" alt="modbus1.png, déc. 2020"></a></p>
<p>Pour rappel, les données que j'ai insérées dedans sont des nombres flottants encodés sur 4 octets. Voici par exemple la convestion réalisée pour une valeur de 230.1 Volts dans un convertisseur el ligne. La valeur hexadécimale résultante est 43 66 19 9A. Vous la retrouverez encodée dans le tableau précédent à l'adresse 3000000 (tension en volts).</p>
<p><a href="https://civade.com/images/nodered/modbus2.png" title="modbus2.png, déc. 2020"><img src="https://civade.com/images/nodered/.modbus2_m.png" alt="modbus2.png, déc. 2020"></a></p>
<p>A noter que j'ai ouvert un ticket auprès de l'auteur pour voir comment entrer directement des valeurs en fottant dans le simulateur. Ceclui-ci a répondu ici : <a href="https://sourceforge.net/p/modrssim2/tickets/15/">https://sourceforge.net/p/modrssim2/tickets/15/</a>, et c'est possible... Par contre, il est imératif de cocher la case "Clone" à droite pour que l'interprétation du flottant se fasse correctement. Il faut aussi que l'adresse du flottant soit un multiple de 4 ce qui n'est pas toujours le cas avec le SDM230... Du coup, sila première valeur est bien interprétée (tension), les autres ne le sont pas nécessairement, n'étant pas alignées sur un multiples de 4.</p>
<h4>Authentification sous node red</h4>
<p>L'authentification repose sur la section "adminAuth" du fichier de configuration (/home/pi/.node-red/settings.js). Elle est normalement commentée (// devant), et donc inactive. On voir ci dessous qu'on dispose d'un identfiant, d'un mot de passe chiffré, et de la définition d'un niveau de permissions. Ceci peut par exemple permettre de mettre un utilisateur en lecture seule (ici, george).</p>
<pre>
//adminAuth: {
// type: "credentials",
// users: [
// {
// username: "admin",
// password: "$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN.",
// permissions: "*"
// },
// {
// username: "george",
// password: "$2b$08$wuAqPiKJlVN27eF5qJp.RuQYuy6ZYONW7a/UWYxDTtwKFCdB8F19y",
// permissions: "read"
// }
// ]
//}
</pre>
<p>Pour activer cette section, il nous faut d'abord générer un mot de passe. Node Red dispose d'une commande pour cela, qui va vous demander un mot de passe et vous générer le hash :</p>
<pre>
pi@pizero:~/.node-red $ node-red admin hash-pw
Password:
$2b$08$PW2YaBxUoyGEi5CQ8Wef/OsUMYjukOyMGy1xbA.hX0QjsWNqE03wK
//
Il va ensuite nous suffire de décommenter la section, et d'injecter le mot de passe ainsi généré :
</pre>
<pre> adminAuth: {
type: "credentials",
users: [{
username: "admin",
password: "$2b$08$PW2YaBxUoyGEi5CQ8Wef/OsUMYjukOyMGy1xbA.hX0QjsWNqE03wK",
permissions: "*"
}]
},</pre>
<pre>
Pour activer la configuration, il suffit de redémarrer node red :
///
systemctl restart nodered.service
</pre>
<p>Ensuite, tester la configuration en se connectant sur node-red. Un bannière de login devrait apparaitre au lieu de la page d'accueil. Si cela ne fonctionne pas, il peut être intéressant de consulter les journaux de node-red à l'aide de la commande node-red-log
A noter que NodeRed dispose d'autres méthodes d'authentification comme OAUTH (Twitter, Github). Se référer à la documentation (
<a href="https://nodered.org/docs/user-guide/runtime/securing-node-red">https://nodered.org/docs/user-guide/runtime/securing-node-red</a> pour plus d'informations. Il est même possible de mettre en place ses propres méthodes d'authentification (par exemple pou rse coupler sur un annuaire LDAP... Mais c'est un bien autre sujet....</p>
<h4>Https sur node red</h4>
<p>Bien que nous disposions d'une authentification, notre installation n'est pas sécurités pour autant. En effet, il est assez facile de piéger les échanges entre un navigateur et un serveur en http, qui ont le mauvais gout d'échanger <strong>en clair</strong> le login et le mot de passe. Pas bon du tout... C'est d'ailleurs pour cela que les acteurs de l'internet, Google en tête, exigent maintenant que les sites soient sécurisés en SSL. Ceci n'a d'intérêt que si vous voulez rendre accessible votre installation NodeRed de l'extérieur de votre réseau local.</p>
<p>Il convient donc de mettre en œuvre le chiffrement SSL pour éviter que ces échanges ne soient espionnés. A ce stade, nous avons 3 possibilités :</p>
<ul>
<li>Utiliser un certificat auto signé. Gratuit, mais va générer une alerte au niveau du navigateur (que l'on peut acquitter). Cela peut être suffisant. C'est d'ailleurs la seule solution possible lorsque l'on est sur un réseau local et que le serveur node-red n'est pas joignable de l'extérieur.</li>
<li>Utiliser un certificat SSL payant, émanant d'une autorité de certification. C'est payant, avec des tarifs très variables (à partir de 70 euros par an). Plus facile à entretenir, c'est le cout qui est problématique. Il faut aussi que l'installation node-red soit associée à un nom de domaine qui portera ce certificat.</li>
<li>Utiliser un certificat SSL gratuit "Lets Encrypt". C'est aussi gratuit, mais pas très simple à installer et à tester. Il nous faudra également un nom de domaine pour porter ce certificat. Bien que ceux ci disposent d'une procédure de renouvellement qui peut être automatisée, le certificat ne durant que 3 mois.</li>
</ul>
<p>Nous allons utiliser la 3e technique. Cela suppose que vous ayez paramétré votre routeur domestique pour rediriger le port 443 (https) et le port 80 sur votre Raspberry dans l'interface de gestion de votre routeur. Ceci se trouve généralement dans la section "NAT" ou "Redirections".</p>
<p>Par ailleurs, la plupart des routeurs disposent de fonctionnalités qui permettent de rendre permanent les baux DHCP pour une adresse mac donnée. Ce sera indispensable car sinon votre Raspberry pi risque de changer d'adresse ip sur le réseau local, et donc de ne plus correspondre aux règles de redirectionsque vous aurez mises en place. Je vous recommande de suivre les tutos ou la doc correspondants à votre routeur.</p>
<p>Chez Free, par exemple, tout ceci passe par l'interface de gestion sur http://mafreebox.freebox.fr :</p>
<ul>
<li>Paramètres de la freebox / Gestion des ports pour gérer les redirections des ports 80 et 443</li>
<li>Paramètres de la freebox / DHCP / Baux statique pour gérer l'affectation permanente de l'adresse ip à la raspberry.</li>
</ul>
<p>https://discourse.nodered.org/t/node-red-ssl-using-letsencrypt-certbot/17606</p>
<h3>Bonus: installer un LCD texte (2ligne ou 4 lignes de 20 caractères) en I2C sur Raspberry</h3>
<h4>Idée générale</h4>
<p>L'intérêt de le raccorder en I2C est de limiter le nombre de broches de raccordement. En i2C, seules 2 broches (en plus des alimentations) sont nécessaires : I2C Clock et i2C Data. Il faut par conte disposer d'un adaptateur LCD <> I2C, souvent nommé "LCD I2C Backpack", comme celui d'Adafruit ( <a href="https://www.adafruit.com/product/292">https://www.adafruit.com/product/292</a> ). Sur Aliexpress (<a href="https://fr.aliexpress.com/af/i2c-lcd</del>adapter.html">https://fr.aliexpress.com/af/i2c-lcd<del>adapter.html</a>) ou Banggood ( <a href="https://www.banggood.com/fr/search/adapter-i2c.html">https://www.banggood.com/fr/search/adapter-i2c.html</a> ) on trouver ces adaptateurs en version MCP23017 ou PCF8574 pour 2/3 euros.</p>
<p>Tous reposent sur la même idée mais n'utilisent pas nécessairement le même composant pour la mise en œuvre. Il s'agit d'ajouter une extension de ports I2C, permettant d'ajouter des entrées sorties, dont celles ci sont raccordées au LCD afin d'économiser les i/o internes de la Raspberry. Trois composants différents sont fréquemment utilisés :</p>
<ul>
<li>MCP23008 (Adafruit)</li>
<li>MCP230017 (certains chinois)</li>
<li>PCF8574 (la plupart des chinois)</li>
</ul>
<h4>Câblage</h4>
<p>Pour les tests suivants, j'ai utilisé l'adaptateur d'Adafruit, basé sur un MCP 23008. Mais le programme est aisément adaptable aux autres solutions. Le raccordement de l'adaptateur I2C/LCD s'effectue comme suit :</p>
<pre>
|---------------------------------|
| LCD Adapter | PI ZERO |
|---------------------------------|
| GND | Broche 2 (5V) |
| 5V | Broche 6 (Ground) |
| DAT | Broche 3 (SDA1) |
| CLK | Broche 5 (SCL1) |
|---------------------------------|
</pre>
<p>A titre indicatif, voici les brochages du connecteur d'extension de la Raspberry :</p>
<p><a href="https://civade.com/images/nodered/pi_zero_pinout_zoom.png" title="pi_zero_pinout_zoom.png, déc. 2020"><img src="https://civade.com/images/nodered/.pi_zero_pinout_zoom_m.png" alt="pi_zero_pinout_zoom.png, déc. 2020"></a></p>
<p>Nous allons ensuite pouvoir vérifier que notre adaptateur LCD est bien détecté sur le Bus I2C à l'aide de la commande i2cdetect :</p>
<pre>
pi@pizero:~ $ i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: 20 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
</pre>
<p>Ici, nous voyons bien le contrôleur MCP23008 en 0X20.</p>
<h4>Logiciel</h4>
<p>Vient le temps d'installer des éléments logiciels pour nous faciliter la vie dans la mise en œuvre du LCD en ligne de commande. Nous allons utiliser une bibliothèque Python 3/2 qui permet le pilotage de LCD textes basés sur des contrôleurs Hitachi HD44780 (c'est le contrôleur utilisé sur ces afficheurs texte). Cette bibliothèque support à la fois le pilotage parallèle (consommant un grand nombre d'entrées sorties de la Raspberry) et aussi bien que via une extension de port I²C port (comme le PCF857, le MCP23008 ou le MCP230017 ).</p>
<p>L'installation est simple et se fait en ligne de commande:</p>
<pre>
# Voir https://github.com/dbrgn/RPLCD#documentation
sudo apt install python-smbus
sudo pip install gpiozero
sudo pip install RPLCD
sudo pip install psutil
</pre>
<p>Nous allons maintenant pouvoir tester. On doit préciser sur la lige de commande l'adresse précédemment détectée, ainsi que le type du port expander utilisé (MCP23008 / MCP23017 / PCF8574 ) :</p>
<pre>
rplcd-tests i2c testsuite expander=MCP23008 addr=0x20 port=1 cols=20 rows=4 charmap=A00 gpio_bank=A
</pre>
<p>Plusieurs message devraient d'afficher sur l'écran. Une fois le dialogue entre la pi et le LCD vérifié, il est temps de développer un programme. Pour ce faire la doc est d'un grand secours : <a href="https://rplcd.readthedocs.io/en/latest/">https://rplcd.readthedocs.io/en/latest/</a></p>
<p>Voici un petit programme de test que j'a réalisé, qui va nous afficher :</p>
<ul>
<li>La date et l'heure</li>
<li>La température du processeur</li>
<li>L'adresse ip de la carte</li>
<li>La quantité de ram totale (T), Utiisée (U) et Libre (L)</li>
<li>Même chose pour l'espace de stockage sur la carte SD</li>
</ul>
<p>Le résultat :</p>
<p><a href="https://civade.com/images/nodered/lcd.png" title="lcd.png, déc. 2020"><img src="https://civade.com/images/nodered/.lcd_m.png" alt="lcd.png, déc. 2020"></a></p>
<p>Et le source du programme de test :</p>
<pre>
#!/usr/bin/python
# -*- coding: utf8 -*-
"""
Bibliothèques à installer :
- pip install rplcd https://github.com/dbrgn/RPLCD (Doc sur https://rplcd.readthedocs.io/en/latest/ )
- pip install gpiozero
- pip install psutil
"""
# Affichages sur lcd
from RPLCD.i2c import CharLCD
# température processeur
from gpiozero import CPUTemperature
# Pour afficher l'heure
import time
# Pour recuperer l'adresse IP
import socket
# Pour capacité disque
import psutil
# Recuprere l'adresse IP
def get_ip():
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
# n'a pas besoin d'être joignable
s.connect(('10.255.255.255', 1))
IP = s.getsockname()[0]
except Exception:
IP = '127.0.0.1'
finally:
s.close()
return IP
# Définit des caractères personnalisés
def lcd_chars():
smiley = (
0b00000,
0b01010,
0b01010,
0b00000,
0b10001,
0b10001,
0b01110,
0b00000,
)
degre = (
0b01000,
0b10100,
0b01000,
0b00011,
0b00100,
0b00100,
0b00011,
0b00000,
)
lcd.create_char(0, smiley)
lcd.create_char(1, degre)
return
# Init
# Init LCD
lcd = CharLCD(i2c_expander='MCP23008', address=0x20, port=1,
cols=20, rows=4, dotsize=8,
charmap='A00',
auto_linebreaks=True)
lcd_chars()
IP = get_ip()
cpu = CPUTemperature()
hdd = psutil.disk_usage('/')
ram = psutil.virtual_memory()
lcd.clear();
# Ligne 1
lcd.cursor_pos = (0, 0)
lcd.write_string(time.strftime("%d/%m/%Y %H:%M:%S"))
# Ligne 2
lcd.cursor_pos = (1, 0)
lcd.write_string(IP)
lcd.cursor_pos = (1,14)
lcd.write_string("|%2.1f\x01" % (cpu.temperature))
# Ligne 3
lcd.cursor_pos = (2, 0)
lcd.write_string("T:%3.1fG U:%3.1fG F:%3.1fG" % (float(hdd.total) / (2.0**30), float(hdd.used) / (2.0**30),float(hdd.free) / (2.**30) ))
# Ligne 4:w
lcd.cursor_pos = (3, 0)
lcd.write_string("T:%3.0fM U:%3.0fM F:%3.0fM" % (float(ram.total) / (2.0**20), float(ram.used) / (2.0**20),float(ram.free) / (2.**20) ))
# Si on veut préserver le backlight et ne l'allumer que quelques secondes toutes les minutes
# décommenter les lignes suivantes
#time.sleep(5)
#lcd.backlight_enabled = False
lcd.close()
</pre>
<h3>Quelques commandes utilises sous SSH</h3>
<p>Arrêter le système (ne jamais débrancher!!!! arrêter proprement.) :</p>
<pre>
sudo shutdown -h now
</pre>
<p>Redémarrer le système</p>
<pre>
sudo shutdown -r now
</pre>
<p>Afficher les journaux de node-red (quitter avec CTRL+ C) :</p>
<pre>
node-red-log
</pre>
<p>Mettre à jour le système :</p>
<pre>
sudo apt-get update
sudo apt-get upgrade
</pre>
<p>Quitter ssh :</p>
<pre>
exit
</pre>
<p>Il pourra être aisément appelé toutes les minutes en l'installant dans une tache planfiée (cron) à l'aide d'un "crontab -e", et en ajoutant la ligne :</p>
<pre>
* * * * * /home/pi/lcd.py >> /home/pi/log.txt 2>&1
</pre>https://civade.com/post/2020/12/13/Google-home-Node-Red-Raspberry-pi-%3A-un-int%C3%A9ressant-cocktail-pour-la-domotique#comment-formhttps://civade.com/feed/atom/comments/108Bigtreetech SKR V1.4 Turbo sur une découpe laser K40 avec Smoothiewareurn:md5:d38662253ace8062f7e33754829f87542020-11-01T16:48:00+01:002024-02-26T17:51:06+01:00jphiMachines à commande numériquesCNCDIYEmbarquéK40OpenSource<p>Après un article sur la carte SKR V1.3 qui à débouché sur une <a href="https://civade.com/post/2019/07/10/Mise-%C3%A0-jour-d-un-clone-d-Ultimaker-1-avec-Marlin-2-SKR-1.3-TMC2130">mise à jour de mon imprimante 3D</a> j'ai acheté une SKR V1.4 Turbo de façon à profiter de la fréquence max du processeur LPC1769 (120 mhz) et voir les possibilités d'adaptation sur une découpe laser K40. Mais si le support sous Marlin est tout simplement parfait, c'est pas tout à fait la même histoire sur Smoothieware... Mais tout ceci se contourne, voyons comment...</p> <h3>Découverte de la carte :</h3>
<p><a href="https://civade.com/images/skr1.4/skr1.4.jpg" title="skr1.4.jpg, oct. 2020"><img src="https://civade.com/images/skr1.4/.skr1.4_m.jpg" alt="skr1.4.jpg, oct. 2020"></a></p>
<p>En plus de la carte SKR 1.4 Turbo, j'ai fait l'acquisition d'un LCD <strong>TFT24 V1.1</strong>, du booster d'alimentation <strong>DCDC Mode V1.0</strong> et de l’extension Wifi <strong>ESP01s</strong> pour environ 35 euros. Mais qu'est ce qu'on peut en attendre? Une petite visite s'impose...</p>
<p>En comparant les schémas et implantations, la version 1.4 n'apporte que peu de changements par rapport à la version 1.3:</p>
<ul>
<li>Processeur jusqu'à 120Mhz (version turbo)</li>
<li>support d'un booster d'alimentation additionnel pour générer du 5V pour les périphériques qui le nécessitent (Neopixel, Bltouch, TFT), et ainsi éviter de 'tirer' trop sur le convertisseur intégré.</li>
<li>Support d'un module wifi ESP01</li>
<li>Support de 2 ventilateurs fixes supplémentaires (en 24V)</li>
<li>Support de la carte UPS (protection coupures d'alimentation)</li>
<li>Support d'un BL Touch (implantation connecteur servo revu + nouveau connecteur Probe juste à côté)</li>
<li>Suppression de la diode de protection en série sur l'alimentation USB qui consommait quelques dixièmes de volts...</li>
<li>Reroutage partiel de la carte</li>
</ul>
<p>Tout d'abord, sur le plan alimentation, la carte est plutôt bien équipée :</p>
<ul>
<li>Alimentation unique jusqu'à 24V (360W max), avec une LED rouge de témoin d'alimentation. 24V c'est top pour maximiser la vitesse de déplacement des moteurs, et sur une imprimante 3D permet de limiter le courant dans le lit chauffant. Donc un bon point....</li>
<li>Protection en tête de carte, par 2 fusibles à lame 'automobile', l'un de 20A pour le lit chauffant et l'autre de 10A pour les têtes et le reste de l'électronique.</li>
<li>Multiples sous protections par fusibles sur les différents étages (sous le 10A)</li>
<li>Alimentation à découpage intégrée pour générer du 5V, avec fusible réarmable de 2.5A (T250) intégrés à la carte. Pas besoin d'une double alimentation, ou d'une alim via l'USB, la seule tension primaire suffit...</li>
<li>Alimentation linéaire intégrée pour générer du 3.3V à partir du 5V avec fusible de 750ma.</li>
<li>Alimentation à découpage optionnelle (<a href="https://www.biqu.equipment/products/bigtreetech-dcdc-mode-v1-0-power-module3d-printer-parts">DCDC Mode V1.0</a>) pour générer du 5V sous 'forte puissance' à partir du 24V. Elle complémente celle déjà présente en interne et lorsque présente alimente le port LEDS neopixels, l'écran TFT et le servo/BL Touch. Une LED verte s'allume sur le convertisseur lorsqu'il est alimenté. Un cavalier permet de configurer ces 3 alimentation sur le convertisseur si présent, ou en prélevant sur le rail 5V interne. Cette carte ne serait nécessaire que si l'on compte consommer de façon significative ( >500 mA) sur le LCD/Servo/Leds externes.</li>
<li>Cavalier pour alimenter la carte par l'USB (pour la mise au point logicielle, sans alim 24V branchée) ou par le convertisseur 24v>5V (nécessite de brancher l'alimentation de la carte)</li>
</ul>
<p>La SKR 1.4 possède un grand nombre d'entrées sorties :</p>
<ul>
<li>Processeur à 100 mhz (SKR 1.4) ou 120 mhz (SKR 1.4 Turbo)</li>
<li>Bouton de reset intégré</li>
<li>Port USB natif, avec support en tant que disque (pour les mises à jour et la config) et liaison série (pour l'envoi de gcode)</li>
<li>Carte SD intégrée, permettant de faire les mises à jour et le stockage de fichiers (c'est le disque visible de l'USB). Un LED verte s'allume lorsque la carte SD est présente.</li>
<li>2 connecteurs HE10 à 10 broches (EXP1 et EXP2) pour raccorder un afficheur LCD de type "Reprap Discount Smart LCD Controler", avec carte SD et encodeur de panneau, on un afficheur de type</li>
<li>Connecteur série dédié au support d'un afficheur TFT et son alimentation (sur le port série 0)</li>
<li>Commande de 5 moteurs pas à pas, dont l'un (le Z) en double sortie (pour les imprimantes 3D le nécessitant, comme les type Prusa I3)</li>
<li>Nombreuses options de pilotage des moteurs: Step/Dir, SPI, série, avec support contrôleurs de type "Pollolu"</li>
<li>Support des fins de course logiques "sensorless" avec les contrôleurs de moteur pas à pas adaptés (ex: TMC2130) ou matériels sur les 3 à 6 entrées prévues</li>
<li>1 sortie de puissance 20A sur MOSFET en PWM pour le lit chauffant, avec LED témoin verte.</li>
<li>2 sorties de puissances jusqu'à 10A sur MOSFET en PWM pour les deux chauffage de tête, avec LED témoin verte.</li>
<li>1 sortie ventilateur jusqu'à 1A, commandé en PWM par MOSFET (pour le refroidissement de la pièce sur une imprimante 3D), avec LED témoin verte.</li>
<li>3 sorties ventilateurs à tension fixe de 12 ou 24V (ex : pour le refroidissement des têtes sur une imprimante 3D)</li>
<li>1 sortie Servo (3 broches) commandée en PWM pour palpeur de lit chauffant, avec optionnellement alimentation boostée.</li>
<li>1 sortie pour commander une rampe de LED en Neo-pixel (3 couleurs) avec optionnellement alimentation boostée.</li>
<li>3 entrées analogiques pour thermistances de mesure de température, avec filtrage intégré</li>
<li>6 entrées digitales pour les fins de course ( sur 5 axes) et l'entrée détection de présence de tension d'alimentation (pour l'onduleur optionnel)</li>
<li>1 entrée "probe" pour capteur de longueur d'outil ou palpeur de lit chauffant.</li>
<li>Connecteur HE10 à 8 broches pour raccorder directement un ESP01S et ajouter le support du Wifi</li>
<li>Connecteurs Dupont pour port SPI, I2C, Software debugger</li>
<li>Connecteurs Dupont sur chaque axe (X-CLS, Y-CLS, etc..) pour connecter un driver pas à pas externe (avec tous les signaux y compris le 24V). Ils sont directement compatibles avec les "Closed Loop Stepper" (contrôle en boucle fermée) de la marque, mais on peut y raccorder n’importe quel contrôleur externe.</li>
</ul>
<p>A l'exception des connecteurs mentionnés ci dessus comme étant des "Dupont", tous les autres sont des connecteurs "JST". Les broches étant un peu plus petites, il n'est pas recommandé de mettre des connecteurs Dupont femelle dessus sous peine de gros faux contacts.. Mais on peut trouver des kits JST-XH sur Aliexpress avec une centaine de connecteurs mâle et femelle et les broches à sertir pour quelques euros. Ce n'est donc pas un gros soucis. Autre intérêt, les connecteurs JST ont un verrouillage, ce qui empêchera un arrachement intempestif... Par contre, si vous prévoyez d'acheter des connecteurs JST en kit, la pince à sertir n'est pas un luxe...</p>
<p>Le schéma de la SKR 1.4 est disponible <a href="https://github.com/bigtreetech/BIGTREETECH-SKR-V1.3/blob/master/BTT%20SKR%20V1.4/Hardware/BTT%20SKR%20V1.4-SCH.pdf">ICI</a> ce qui fait qu'on peut lever toute ambiguïté lorsque l'on adapte un logiciel dessus. C'est nouveau chez Bigtreetech.</p>
<p>Sur le papier, il ne manque donc pas grand chose. J'ai noté :</p>
<ul>
<li>Ce serait bien d'avoir la possiblilité de commuter les ventilateurs en 12/24V ou 5V</li>
<li>Entrées température uniquement prévues pour mettre des thermistances (résistance de tirage de 4.7K et entrée 3.3V). Ceci empêche de brancher des thermocouples, qui délivrent directement une tension et n'ont pas besoin de la résistance de tirage, mais d'une adaptation de niveau 5V>3.3V. C'est contournable, mail il fait bidouille (dessouder la résistance et mettre un pont diviseur).</li>
<li>Sorties Step ne sont pas toutes sur le même port, ce qui empêche la compilation de GRBL pour LPC1769</li>
<li>Même remarque pour les sorties Dir.</li>
<li>Pas de SPI matériel routé sur le LCD. Impossible de l'utiliser sur Smoothieware sans adaptateur à faire soi même ou modification de Smoothieware pour ajouter le support d'un SPI "logiciel". Nous verrons plus loin qu ec'est contournable.</li>
<li>Liaison série 0 sur le LCD et 3 sur le Wifi. Impossible d'utiliser la liaison série 0 sur le Wifi. Une configuration par cavalier aurait pu permettre de l'utiliser sur Smoothieware. C'est aussi contournable avec une petite bidouille.</li>
</ul>
<h3>Fonctionnement sous Marlin:</h3>
<p>J'ai fait les tests d'intégration avec succès sur la dernière version de Marlin 2 disponible sur le Git : <a href="https://github.com/MarlinFirmware/Marlin">https://github.com/MarlinFirmware/Marlin</a>. Elle intègre directement une configuration pour la SKR 1.4 / Turbo ( MOTHERBOARD BOARD_BTT_SKR_V1_4_TURBO ) . Tout fonctionne sans soucis. L'intégration du Wifi est assez facile (voir <a href="https://civade.com/post/2020/09/22/Ajouter-le-support-du-Wifi-sur-une-imprimante-3D-fonctionnant-avec-Marlin-2">https://www.civade.com/post/2020/09/22/Ajouter-le-support-du-Wifi-sur-une-imprimante-3D-fonctionnant-avec-Marlin-2</a> ).</p>
<p>L'écran fonctionne aussi bien en mode "touch" qu'en mode émulé Reprap Discount Graphic LCD Controler, ainsi que la carte SD externe. Idem avec les Neopixel ou le BL touch qui peut être raccordé sur l'entrée sonde + la sortie servo. C'est juste quand on veut le Wifi ET l'écran TFT et la liaison série USB que c'est plus sport.</p>
<p>Malheureusement, Marlin n'est pas le meilleur candidat pour une découpe laser, c'est même le pire. Il n'est en effet pas très performant en terme de vitesse de traitement de gcode, et ne gère pas la modulation de la puissance du laser pendant les accélérations / décélérations, ce qui a une fâcheuse tendance à brûler les angles lors d'une découpe. Enfin il est incapable de générer un PWM a 25Khz, ce qui est indispensable pour un K40. Ce dernier point peut encore se contourner avec un filtrage sur le PWM en vue de produire une tension analogique.</p>
<p>L'auteur du logiciel de pilotage laser Lightburn écrivait au sujet de Marlin en 2019 :</p>
<blockquote><p>I’ve tested with Marlin 1.9, I believe, and other users have reported using 2.0 without issues, but I’ll warn you that I’m not strong with Marlin and much of the Marlin support in LightBurn is a direct result of user suggestions.</p>
<p>
Most people use the first fan output for the PWM of the laser, though that can be changed in the device options in LightBurn if you need to use a different PWM index, and the baud rate is configurable as well (250,000 is favored because it’s nicely divisible by the clock rate, where 230,400 is not).</p>
<p>
If you find the configuration daunting, I’m not going to be much help there as Marlin is not my forte - I have a good amount of experience with Grbl and Smoothieware (even having delved into the code for both of those), but no real experience with Marlin.</p></blockquote>
<p>Il indique aussi :</p>
<blockquote><p>When I say “ramped power output” I mean velocity-modulated PWM, ramping the PWM up and down as the velocity increases, then decreases for corners. Smoothieware and GRBL another support this, but none of the others as far as I’m aware.</p></blockquote>
<p>C'est donc plié pour Marlin si on veut ce support de la modulation de puissance pendant les accélérations... Next!</p>
<h3>Fonctionnement sous grbl-lpc:</h3>
<p>Sur GRBL adapté pour LPC par Claudio Prezzi ( <a href="https://github.com/cprezzi/grbl-LPC/releases">https://github.com/cprezzi/grbl-LPC/releases</a> ) cela va être encore plus rapide. Les cartes SKR ne sont tout simplement pas supportées. En effet, seules sont supportées ( Smoothieboard, Cohesion3D, Azteeg X5, MKS SBASE) les cartes dont les signaux step et sont sur le même port d'entrée sortie. C'est d'ailleurs grâce à cette contrainte et à des manipulations de bits sur un même port que GRBL est si rapide...</p>
<p>Le brochage de la SKR 1.4 ne respectant pas ce standard, c'est donc aussi plié.. Next!</p>
<h3>Smoothieware :</h3>
<h4>Un petit mot sur la communauté et l'écosystème Smoothie</h4>
<p>Les concepteurs de Smoothieware on fait un choix, celui de ne pas utiliser de liaison émulée (à l'exception de celle qui pilote une broche de CNC en RS485), principalement car il n'y en a pas besoin sur une carte Smoothieware, mais peut être aussi pour des raisons de performance. Du coup, ce qui pourrait marcher avec un SPI 'software' ou un port série 'software' ne fonctionne pas :</p>
<ul>
<li>Écran LCD Reprap discount Smart LCD controler (SKR 1.3 et 1.4).</li>
<li>Contrôleurs pas à pas en mode 'SPI' (SKR 1.3 et 1.4)</li>
<li>Contrôleurs pas à pas en mode 'série' (SKR 1.3 et 1.4)</li>
</ul>
<p>En fait, tout est prévu pour supporter les Smoothieboard. Si ça marche pour d'autre cartes, tant mieux pour vous... mais si il faut supporter des cartes avec des fonctionnalités spécifiques (ex : SKR et le support d'un grand nombre de drivers de moteurs pas à pas), on se heurte à un quasi mur de la part des 2 mainteneurs principaux.</p>
<p>Ils argumentent sur le fait qu'il n'y ait plus de place dans la mémoire du micro contrôleur (admettons.. mais les compilations conditionnelles ça existe.. et sont déjà utilisées pour distinguer la version CNC de la version imprimante 3D) et qu'ils ne veulent pas faire de support pour des cartes chinoises... Sous entendu vous n'avez qu'à acheter une Smoothieware. C'est déjà limite limite de coupler le hard au soft...</p>
<p>Cette haine des autres cartes (chinoises notamment) en est au point ou ils les appellent 'contrefaçons', n'intègrent pas les patch request que les gentils développeurs leurs proposent, ou alors dans des branches annexes. C'est dommage et ce n'est clairement pas l'esprit du logiciel libre, dont il s'agit plus de fabriquer un bien commun avec des contribution communes que de servir des intérêts particuliers, tout en respectant a propriété intellectuelle.</p>
<p>Cette notion de contrefaçon est d'ailleurs très discutable, car si au départ elle était alimentée par le fait que les premières cartes conçues pour faire fonctionner Smoothieware (MKS) ne publiaient pas les schémas, cela a un peu changé, et certaines - comme les SKR - publient les leurs et amènent des innovations (ex : support de pléthore de contrôleurs moteur pas à pas, d'afficheurs supplémentaires, leds, etc..) sur un reroutage complet du circuit imprimé (optimisations??). Est on encore face à une contrefaçon dans ce cas? Il me semble que non, c'est d'ailleurs l'esprit du libre que d'améliorer à chaque itération.</p>
<p>Si Smoothie considère comme contrefaçon une carte comme la SKR 1.4 (dont le schéma est publié...) on peut aussi considérer que Smoothieware est une contrefaçon :</p>
<ul>
<li>de LAOS, qui a utilisé pour la première fois de processeurs LPC176x et Mbed sur une carte de pilotage de machine à commande numérique (dédiée laser). C'était en 2010.</li>
<li>de RAMPS (Reprap Arduino Mega Pollolu Shield) pour l'architecture, tous les étages de puissance, les méthodes de mesure de température</li>
<li>de Pollolu, pour choix de contrôleurs pas à pas basés sur des composants d'Allegro Semiconductors</li>
<li>etc...</li>
</ul>
<p>Et sur le fond, l'open hardware et les logiciels libres n'inventent que très rarement tout, mais procèdent par itérations successives, dont Smoothie (et spécialement Smoothieware) n'est qu'une itération. Je me demande si il n'y a pas un sérieux manque de culture Libre de la part des développeurs. En effet, s'arque-bouter sur un développement fait il y a près de 7 ans, qui n'a pratiquement pas bougé depuis, et qui n'annonce rien de révolutionnaire, c'est presque le début de la fin.</p>
<p>OK, c'est un troll, mais pour vous faire réfléchir sur le sujet, quand Arthur Wolf, son concepteur, écrit lui: <a href="http://smoothieware.org/troubleshooting#what-is-wrong-with-mks">http://smoothieware.org/troubleshooting#what-is-wrong-with-mks</a>, en mettant tout le monde dans le même panier, on peut légitimement se demander si il n'est pas à côté de la plaque, même avec sa licence GPL V3 et son logo OSHW. Qu'est ce qui empêche de fabriquer une carte OSHW à l'identique? Ou de prendre le schéma et le rerouter? D'un point de vue légal, pas grand chose....</p>
<p>De plus il y a quelques incohérences dans le modèle. Par exemple, le fait que Cohesion3D ne publie pas ses schémas n'a pas l'air de le déranger. Contribuent t'ils financièrement à Smoothie? C'est donc de l'open source à 2 vitesse, ceux qui payent une licence et les autres? D'ou ça sort cette licence? Dans ce cas, les contributeurs sont ils rémunérés et comment? Je vous laisse méditer là dessus, mais il est clair qu'on est dans les limites du modèle. Si les cartes Smoothieware ne valaient pas 200 euros, cela ne laisserait pas un boulevard aux solutions alternatives... Autant directement mettre le tout sous licence MIT ou creative common CCBYSA (partage à l'identique, mais pas d'exploitation commerciale), cela serait plus clair...</p>
<p>J'ai creusé par exemple l'amélioration proposée par Cohésion3D/LightBurn sur Smoothieware, visant à intégrer des commandes Gcode spéciales pour traiter les variations rapides de puissance d'un laser pour faire de la gravure en nuance de gris avec le logiciel Lightburn. Leurs modifications sur le code sont assez difficile à trouver ( chercher "SmooChanges.zip" dans https://forum.cohesion3d.com/t/improved-raster-speed-firmware-update-for-cohesion3d-boards/850/12 ). Ceci a été publié le 16 Juillet 2019 .</p>
<p>Le développeur (LightBurn) a tenté de réinjecter les modifications sur Smoothieware, ce que l'on retrouve dans un échange sur le Github de Smoothieware ( <a href="https://github.com/Smoothieware/Smoothieware/issues/1446">https://github.com/Smoothieware/Smoothieware/issues/1446</a> ). Je vous la fait courte et en français, mais en gros les développeurs de Smoothie disent qu'il ne l'intégreront pas car cela viole les standards du Gcode. Plus loin ils disent aussi que pour demander l'intégration du code il faut faire un Pull Request (NDLR: méthode pour proposer une amélioration de code dans Git), ce à quoi l'auteur de la modification répond "pourquoi faire Pull Request si vous ne l'intégrerez pas?"... Dialogue de sourds... Du coup, pas de pull request, et du code source uniquement disponible sous forme de quelques fichiers modifiés sur une Dropbox, sans savoir à partir de quelle version cela part. Pas très simple à manipuler. Mais je ne jetterai pas la pierre au concepteur de Lightburn, il s'est fait jeter avant même de pouvoir proposer quoi que ce soit...</p>
<p>Partant du principe que la méthode de demande d'une amélioration conditionnera le fait qu'elle soit considérée, je me fade la doc pour voir comment intégrer un PR et j'en propose un avec une amélioration visant à ajouter le support d'un SPI logiciel pour les LCD ( <a href="https://github.com/Smoothieware/Smoothieware/pull/1494">https://github.com/Smoothieware/Smoothieware/pull/1494</a> ). En tout la totalité de a manip m'a pris 3 heures.</p>
<p>Le PR a été totalement clos en moins de 15 minutes (et le tout à 23h00...) , sans laisser la possibilité de poser par exemple des questions sur comment contourner la contrainte exprimée, probablement très légitime (no wait() ). C'est très violent, et très loin du "Code of conduct" ( <a href="https://github.com/Smoothieware/Smoothieware/blob/edge/CODE_OF_CONDUCT.md">https://github.com/Smoothieware/Smoothieware/blob/edge/CODE_OF_CONDUCT.md</a> ) fixé par les deux développeurs eux même. Ou se trouve la bienveillance et le respect attendus?</p>
<p>Arthur (Wolf), une solution aurait pu être de laisser ouvert le PR, d'exprimer vos désidératas et pourquoi pas des pistes pour les modifs de code de façon à ne plus avoir ces <em>wait()</em> qui vous gênent tant, et attendre que je propose un PR modifié tenant compte de vos remarques... De la même manière, la modif "Smoothie Clustering" aurait pu être intégrée avec une compilation conditionnelle.. (CNC=1 CLUSTERING=1), avec les réserves sur son usage? Ca donne pas très envie de faire des efforts pour vous. Heureusement que Linus et les contributeurs historiques de Linux ou de la FSF n'étaient pas aussi sévères, on n'aurait surement pas le GNU/Linux que l'on connait aujourd'hui et qui a juste changé le monde de l'informatique...</p>
<p>Peut être que le fait que ce PR soit pour les cartes SKR/Bigtreetech, rappelle que les schémas soient dispos (c'est pas closed source...) les a énervés??? Chatouilleux les types. Voila ce a quoi peut mener l'open source quand managé par des intégristes, les intérêts personnels ou une combinaison des 2 . C'est lamentable. Et sur le sujet, j'en connais un rayon, puisque j'ai opéré une SSLL (Société de Services en Logiciels Libres) pendant près de 20 ans, monté un Fablab, et fait un paquet de contributions en hard et en soft, sous différentes licences..</p>
<p>Donc bien qu'un assez beau logiciel, je ne parierai pas sur le fait que Smoothie soit la solution pour les 10 ans à venir. Alors que pour Marlin, qui a su passer en 32 bits, adapter on support à des dizaines de processeurs différents (contre 1 sur Smoothie), et près d'une centaine de cartes, oui... Et même si la Smoothie V2 arrive, il n'est pas sur qu'elle remporte le succès attendu. Entre son prix, et le fait que le processeur ne tourne qu'à 200Mhz, il n'est pas sur que la présence d'un FPGA suffise à elle seule à justifier un emploi généralisé de la version pro. Une erreur de casting?</p>
<p>Néanmoins, je vais poursuivre, car une fois l'intégration réalisée sur ma découpe laser K40, je ne vais pas y toucher pendant un moment.. et il sera toujours temps de revenir sur marlin ou un autre firmware si d'ici là la situation change. De plus, le cout et la notoriété des cartes SKR fait que d'autres pourraient être intéressés par ma modification.</p>
<h4>Mise en œuvre</h4>
<p>C'était ma première expérience de Smoothieware, et j'ai pas forcément trouvé le démarrage simple. Après avoir flashé le firmware, on ne sait pas du tout si cela fonctionne ou pas.. En effet, même les éventuels messages d'erreur liés à la lecture / compréhension du fichier de config ne s'affichent que sur le port série matériel 0 (UART0). De plus, certains configuration font carrément planter le firmware, comme par exemple de laisser activé l’Ethernet sur une carte qui n'en dispose pas.. Mais nous allons voir que rien de tout ceci n'est insurmontable..</p>
<p><strong>Programmation de la carte</strong></p>
<p>La programmation de la carte est assez simple puisqu'il suffit de copier le fichier "firmware.bin" sur le lecteur disque ou est monté la carte SD. Un simple reboot provoque le flashage. Des version pré-compilées sont disponibles <a href="https://github.com/Smoothieware/Smoothieware/tree/edge/FirmwareBin">ICI</a>. Pour une découpe laser, et pour les premiers essais, il faut prendre la version firmware-cnc.bin ou firmware-cnc-latest.bin , et la renommer en firmware.bin avant de la copier sur le disque USB et d'appuyer sur le bouton reset. Le boot du processeur se charge du reste, en détectant la présence du fichier et en flashant la mise à jour. Il sauve également l'ancien firmware sur la carte SD au cas ou l'on ait besoin de revenir en arrière.</p>
<p><strong>Configuration du firmware</strong></p>
<p>Sur Smoothiware, une caractéristique unique est que la configuration du firmware se fait par un simple fichier texte, nommé config ou config.txt et placé dans la racine de la carte SD. Les modifications sont donc possible par le PC en éditant le fichier directement sur le lecteur monté par la carte et en redémarrant la carte pour qu'elles soient prises en compte. On peut aussi tout à fait extraire la carte SD et la lire directement sur un ordinateur.</p>
<p>Lors des éditions sur le fichier de config, il faut faire très attention à ce que les lignes dépassent pas 132 caractères, et on y est vite avec des commentaires.. J'en ai fais les frais lors des premiers essais, mon fichier de config n'était pas pris en compte... Une astuce consiste à utiliser un éditeur de texte moderne (ex notepad++) et à utiliser les tabulations pour aligner les commentaires sans exploser le nombre de caractères. (une tabulation = 4 espace...). Pour plus de clarté, les tabulations peuvent être affichées avec "Affichage / Symboles Spéciaux / Afficher les blancs et les tabulations". Cela aide pour nettoyer le fichier et donne ceci (cliquer pour zoomer):</p>
<p><a href="https://civade.com/images/skr1.4/visualtabs.png" title="visualtabs.png, oct. 2020"><img src="https://civade.com/images/skr1.4/.visualtabs_m.png" alt="visualtabs.png, oct. 2020"></a></p>
<p>La fabrication du fichier de configuration est une opération longue et fastidieuse. Il faut en effet reprendre les entrées / sorties du schéma et reconfigurer chaque fonction supportée par Smoothie.</p>
<p>Cliquez sur le schéma pour l'agrandir :</p>
<p><a href="https://civade.com/images/skr1.4/pinout1.4.png" title="pinout1.4.png, oct. 2020"><img src="https://civade.com/images/skr1.4/.pinout1.4_m.png" alt="pinout1.4.png, oct. 2020"></a></p>
<p>La première chose à faire dans le fichier de config est de désactiver l'ethernet pour éviter le plantage de la carte :</p>
<pre>
network.enable false # Enable the ethernet network services
</pre>
<p>Ensuite on peut commencer à configurer....</p>
<p><a href="https://civade.com/images/skr1.4/configV1.4pourK40.txt">Voici le fichier config.txt</a> résultant pour une K40. Il est abondamment commenté pour permettre de comprendre ce qui a été fait. Il faudra bien sur le renommer en config.txt avant de le copier sur la carte SD. A noter qu'il ne se présentera pas bien dans un navigateur web, car les tabulations sont traitées comme faisant 8 caractères, contre 4 dans un éditeur de code moderne (ex: notepad++).</p>
<p><strong>Une liaison série additionnelle pour comprendre ce qui se passe</strong></p>
<p>Mettre un adaptateur USB / Série 3.3V sur la sortie écran (UART0) peut être une très bonne idée, car ce port résistera au reboot, et permettra d'afficher les éventuelles erreurs détectées dans le fichier de config dès le tout début du démarrage, contrairement au port série émulé sur USB de la carte .</p>
<p>Comme indiqué ci dessus, L'uart 0 (TX0, RX0) sort sur le port destiné au branchement du TFT. Un simple adaptateur FTDI232 ( ex : https://fr.banggood.com/3pcs-FT232RL-FTDI-3_3V-5_5V-USB-to-TTL-Serial-Adapter-Module-Converter-Geekcreit-for-Arduino-products-that-work-with-official-Arduino-boards-p-1633685.html ) suffit pour disposer de cette liaison de debug. Penser à le mettre en 3.3V à l'aide du cavalier, avant de le raccorder à la SKR... Tx sur RX et RX sur TX, et un fil de masse et le tour est joué.</p>
<p>L'autre solution est de mettre en place un module wifi. Cette solution est détaillée ci dessous.</p>
<h3>Ce qui marche en standard, et ce qui ne marche pas.</h3>
<p>Nous avons vu précédemment pourquoi Smoothieware est à la traine pour supporter des cartes comme la SKR 1.4. Le bilan à priori ne sera pas très bon :</p>
<ul>
<li>Bien que le hardware supporte pléthore de drivers, il n'est possible de mettre que ceux qui sont en Step/Dir (A4988, DRV8825, LV8729, ST820, etc..)</li>
<li>Aucun afficheur LCD ne fonctionnera sans recâblage ou logiciel modifié. Le broches du SPI de l'écran ne sont en effet pas câblées sur un SPI matériel du LPC176x.</li>
<li>Le connecteur Neopixel ne servira à rien, ou en tout cas pas pour des leds neopixel (pas de driver).</li>
<li>Toutes les autres entrées sorties sont fonctionnelles.</li>
<li>Et bonne nouvelle, la carte SD externe, peut marcher en même temps que celle interne, n'étant pas sur le même port SPI.</li>
</ul>
<p><strong>Pas d'écran: on est dans le noir...</strong></p>
<p>Comme vu précédemment, l'écran avec Smoothieware ne peut fonctionner que lorsqu'il est câblé à un SPI matériel. Or sur la SKR 1.4, les broches MOSI et SCK de l'écran sont branchée à des entrées sorties générales.</p>
<p>Il y a 2 solutions pour le faire fonctionner :</p>
<ul>
<li>Faire un adaptateur qui va utiliser le même SPI que la carte SD. Cela sera compatible avec un firmware standard. La différentiation entre l'écran et la carte SD se fera pas le Chip Select, câblé à une broche différente.</li>
<li>Modifier smoothie pour ajouter le support d'un SPI logiciel. Dans ce cas pas de recâblage, toute l’adaptation est faite par logiciel, qu'il faudra modifier.</li>
</ul>
<p>En ce qui concerne la première solution, en voici le schéma (cliquer pour agrandir). Cela consiste à utiliser le SPI0 (utilisé par la SD) aussi pour le LCD. C'est grâce au chip select (LCD_CS / SD_CSEL) que smoothie pourra écrire sur l'un ou l'autre des périphériques.</p>
<p><a href="https://civade.com/images/skr1.4/adaptateurLCD.png" title="adaptateurLCD.png, oct. 2020"><img src="https://civade.com/images/skr1.4/.adaptateurLCD_m.png" alt="adaptateurLCD.png, oct. 2020"></a></p>
<p>Une fois câblé cela donne ceci:</p>
<p><a href="https://civade.com/images/skr1.4/adaptateurLCDsmoothie.jpg" title="adaptateurLCDsmoothie.jpg, oct. 2020"><img src="https://civade.com/images/skr1.4/.adaptateurLCDsmoothie_m.jpg" alt="adaptateurLCDsmoothie.jpg, oct. 2020"></a></p>
<p>Et l'adaptateur en situation, avec la carte, et l'écran fonctionnel (ainsi que la carte SD, le buzzer et l'encodeur de panneau) sur une version officielle de Smoothieware :</p>
<p><a href="https://civade.com/images/skr1.4/SKR1.4-adaptateur.jpg" title="SKR1.4-adaptateur.jpg, oct. 2020"><img src="https://civade.com/images/skr1.4/.SKR1.4-adaptateur_m.jpg" alt="SKR1.4-adaptateur.jpg, oct. 2020"></a></p>
<p>Bien sur il faut adapter la configuration (dans config.txt), pour refléter le câblage de l'adaptateur. A noter que sur mon écran j'ai du réduire la fréquence de pilotage du LCD (panel.spi_frequency) à 100 khz au lieu de 1 mhz, sinon il y avait des erreurs de transmission. C'est probablement lié à la longeur des nappes 10 broches qui relient la carte au LCD.</p>
<pre>
############################################
# For SPI0 hardwired to lcd via a custom adapter
panel.spi_channel 0 # Spi on Hardware channel 0
panel.spi_cs_pin 1.19 # SPI chip select ; GLCD EXP1 Pin 4
panel.spi_frequency 100000 # Needs to reduce spi frequency for emulated rrdglcd
# default : 1 000 000 Hz
panel.encoder_a_pin 3.25!^ # Encoder pin ; GLCD EXP2 Pin 3
panel.encoder_b_pin 3.26!^ # Encoder pin ; GLCD EXP2 Pin 5
panel.click_button_pin 0.28!^ # Click button ; GLCD EXP1 Pin 2
panel.buzz_pin 1.30 # Pin for buzzer ; GLCD EXP1 Pin 1
#panel.back_button_pin 0.28!^ # Back button ; GLCD EXP2 Pin 8
panel.encoder_resolution 4
panel.external_sd true # set to true if there is an extrernal sdcard on the panel
panel.external_sd.spi_channel 0 # On SKR 1.4, wired to spi0 (free).
panel.external_sd.spi_cs_pin 0.16 # set spi chip select for the sdcard (or any spare pin)
panel.external_sd.sdcd_pin 1.31!^ # sd detect signal (set to nc if no sdcard detect)
panel.menu_offset 1 # Some panels will need 1 here
panel.alpha_jog_feedrate 6000 # X jogging feedrate in mm/min
panel.beta_jog_feedrate 6000 # Y jogging feedrate in mm/min
panel.gamma_jog_feedrate 3000 # Z jogging feedrate in mm/min
panel.hotend_temperature 185 # Temp to set hotend when preheat is selected
panel.bed_temperature 60 # Temp to set bed when preheat is selected
</pre>
<p>La seconde solution est de faire une modification dans Smoothieware afin d'ajouter le support d'un SPI logiciel. C'est certes moins performant qu'un SPI matériel, mais suffit amplement pour l'affichage.
Voici la modification, basée sur les sources du 23/10/2020 (dernier commit = "Added support for ABC (and E) axis for G2 and G3 "): <a href="https://civade.com/images/skr1.4/rrdglcd.zip">rrdglcd.zip</a>.</p>
<p>Il suffit de décompresser ce fichier et le placer dans Smoothieware\src\modules\utils\panel\panels\rrdglcd. Il ajoute une bibliothèque logicielle "SWSPI.cpp/h" , fork de celle de Ella Robotics (https://os.mbed.com/teams/ELLA-Robotics-Inc/code/SWSPI/ ) et modifie les fichiers RrdGlcd.cpp/.h pour ajouter le support du SPI logiciel.</p>
<p>Les broches de configuration du SPI logiciel sont encodées en dur ligne 155 de RRDGlcd.cpp (mosi = P1_18; miso = P1_21; sclk = P1_20;). Cette configuration est celle convenant à une SKR 1.3 ou 1.4. Ici aussi, réduction de la fréquence du SPI pour éviter les erreurs d'affichage.</p>
<p>Voici la solution en fonctionnement avec le logiciel modifié :</p>
<p><a href="https://civade.com/images/skr1.4/SKR1.4-sans-adaptateur.jpg" title="SKR1.4-sans-adaptateur.jpg, oct. 2020"><img src="https://civade.com/images/skr1.4/.SKR1.4-sans-adaptateur_m.jpg" alt="SKR1.4-sans-adaptateur.jpg, oct. 2020"></a></p>
<p>L'appel du SPI logiciel dans le fichier de configuration, se fait tout simplement en nommant le numéro de canal SPI "-1" (SPI logiciel) au lieu de "0" ou "1" (Numéro de canal spi matériel) :</p>
<pre>
############################################
# For Software SPI (unsupported hack on smoothieware)
panel.spi_channel -1 # Software spi mosi = P1_18; miso = P1_21; sclk = P1_20;
panel.spi_cs_pin 1.19 # CS on SKR 1.4
panel.spi_frequency 100000 # Needs to reduce spi frequency for emulated rrdglcd
# default : 1 000 000 Hz
panel.encoder_a_pin 3.25!^ # Encoder pin ; GLCD EXP2 Pin 3
panel.encoder_b_pin 3.26!^ # Encoder pin ; GLCD EXP2 Pin 5
panel.click_button_pin 0.28!^ # Click button ; GLCD EXP1 Pin 2
panel.buzz_pin 1.30 # Pin for buzzer ; GLCD EXP1 Pin 1
#panel.back_button_pin 0.28!^ # Back button ; GLCD EXP2 Pin 8
panel.encoder_resolution 4
panel.external_sd true # set to true if there is an extrernal sdcard on the panel
panel.external_sd.spi_channel 0 # On SKR 1.4, wired to spi0 (free).
panel.external_sd.spi_cs_pin 0.16 # set spi chip select for the sdcard (or any spare pin)
panel.external_sd.sdcd_pin 1.31!^ # sd detect signal (set to nc if no sdcard detect)
panel.menu_offset 1 # Some panels will need 1 here
panel.alpha_jog_feedrate 6000 # X jogging feedrate in mm/min
panel.beta_jog_feedrate 6000 # Y jogging feedrate in mm/min
panel.gamma_jog_feedrate 3000 # Z jogging feedrate in mm/min
panel.hotend_temperature 185 # Temp to set hotend when preheat is selected
panel.bed_temperature 60 # Temp to set bed when preheat is selected
</pre>
<p>Ce micro logiciel reste bien sur compatible avec le support du SPI matériel, et pourra aussi faire fonctionnner le LCD avec l'adaptateur décrit ci dessus. Pour recompiler le logiciel, le plus simple est de suivre le tuto : <a href="http://smoothieware.org/compiling-smoothie">http://smoothieware.org/compiling-smoothie</a></p>
<p>La support de la carte SD, du buzzer, de l'encodeur de panneau est ok pour les 2 configurations, que j'ai testées.</p>
<p><strong>Le module wifi ne fonctionne pas...</strong></p>
<p>Le connecteur du module wifi utilise la liaison UART 3, et il nous faut l'UART 0... Ça peut se régler avec un petit hack matériel simple à réaliser. Il faut dessouder les broches TX et RX du module (les retirer complètement), et souder 2 fils se terminant par une boche femelle Dupont ou un connecteur JST 6 broches qui seront à brancher sur le connecteur du TFT.</p>
<p>Voici ce que cela donne :</p>
<p><a href="https://civade.com/images/skr1.4/wifi-module.jpg" title="wifi-module.jpg, nov. 2020"><img src="https://civade.com/images/skr1.4/.wifi-module_m.jpg" alt="wifi-module.jpg, nov. 2020"></a></p>
<p>Sur la programmation du module Wifi et sa configuration se reporter à mon post sur l'<a href="https://civade.com/post/2020/09/22/Ajouter-le-support-du-Wifi-sur-une-imprimante-3D-fonctionnant-avec-Marlin-2">ajout de wifi sur une imprimante 3D</a>. Il faut bien sur penser à choisir le bon protocole (Smoothieware au lieu de Marlin) dans le module wifi et la vitesse adaptée (d'après le fichier de config. Dans le mien, 250 000 bauds) pour que la communication se fasse avec le module wifi.</p>
<p>A noter que la broche Reset n'est pas cablée sur le support du module Wifi. C'est pas mal, car cela nous permettra de voir les messages de boot de la carte après un reset, dans l'interface web, le wifi n'étant lui pas rebooté. Voici ce que l'on voir après un reboot de Smoothieware dans l'interface web du module wifi. On voit notamment très bien la console avec les premiers messages envoyés par Smoothieware :</p>
<p><a href="https://civade.com/images/skr1.4/bootwifi.png" title="bootwifi.png, nov. 2020"><img src="https://civade.com/images/skr1.4/.bootwifi_m.png" alt="bootwifi.png, nov. 2020"></a></p>
<h3>Smoothieware et une découpe laser K40</h3>
<h4>D'un point de vue logiciel</h4>
<p><strong>Logiciel de pilotage :</strong></p>
<p>Le logiciel idéal pour piloter une découpe laser est LightBurn. Il est très complet et fonctionne avec Marlin, Smoothie et GRBL. Il n'est pas libre, et est commercialisé 40USD (35 euros), ce qui en fait une dépense acceptable.</p>
<p><strong>Smoothieware</strong></p>
<p>Il y a 3 options possibles pour Smoothieware :</p>
<ul>
<li>Utiliser la version CNC standard de Smoothieware</li>
<li>Utiliser une version spécifique "Smoothie Clustering" adaptée à la découpe laser (développée par Cohesion3D / LightBurn)</li>
<li>Utiliser ma version avec support du Smoothie Clustering ET software SPI.</li>
</ul>
<p>La version standard est tout à fait adaptée à la découpe, et peut faire de la gravure, mais relativement lentement. En effet il faut beaucoup de commandes GCODE pour moduler la puissance du laser pendant la découpe, ce qui 'plombe' un peu la vitesse. "Enable Smoothie Clustering" doit être impérativement désactivé dans Lightburn pour utiliser ce firmware.</p>
<p>La version "Smoothie Clustering" ( téléchargeable ici: <a href="https://forum.cohesion3d.com/t/improved-raster-speed-firmware-update-for-cohesion3d-boards/850">https://forum.cohesion3d.com/t/improved-raster-speed-firmware-update-for-cohesion3d-boards/850</a> ) qui ajoute une optimisation pour la gravure à haute vitesse. <strong>"Enable Smoothie Clustering" doit être activé dans Lightburn pour utiliser ce firmware.</strong>
Elle a une petite particularité: La carte SD n'est pas montée automatiquement sur le PC. Je n'ai pas tenté, mais il est probable qu'en mettant "msd_disable false" cela rétablisse l'accès.</p>
<p>Enfin sur ma version j'ai repris celle de Smoothie, et à défaut d'avoir une contribution acceptée, j'ai intégré le correctif pour supporter le software SPI (support du LCD graphique de Reprap Discount) et celui de Cohesion3D/LightBurn en ce qui concerne le Smoothie Clustering. Ici, pas besoin d'adaptateur matériel pour le LCD, <strong>"Enable Smoothie Clustering" doit être activé dans Lightburn pour utiliser ce firmware.</strong> Il est disponible sur <a href="https://gitlab.civade.com/pub/Smoothieware">https://gitlab.civade.com/pub/Smoothieware</a> sous forme de source. Une version précompilée est disponible ICI : <a href="https://gitlab.civade.com/pub/Smoothieware/-/tree/edge/FirmwareBin">https://gitlab.civade.com/pub/Smoothieware/-/tree/edge/FirmwareBin</a>.</p>
<h4>D'un point de vue matériel</h4>
<p>D'un point de vue matériel, le pilotage d'une K40 nécessite 2 signaux :
- Un signal PWM (modulation de largeur d'impulsion) pour régler la puissance du laser par logiciel. Avec 0V, le laser est à puisance 0, à 5V/100% de PWM il est allumé au maximum.
- Un signal LO (Laser On) pour allumer ou éteindre le laser. Ce signal doit être à zéro pour allumer le laser, et 5V pour l'éteindre.</p>
<p>Comme la SKR 1.4 ne délivre que du 3.3V sur ses sorties, il va nous falloir adapter les signaux pour sortir en 5V. Ici j'ai fait ceci avec le "Level Translator". Cela s'alimente d'un coté en 3.3V (d'ou le régulateur), de l'autre coté en 5V. L'alimentation 5V est prélevée du connecteur "servo" sur lequel il y a l'une des rares sorties PWM disponibles sur la SKR 1.4. En ce qui concerne l'autre sortie, j'ai utilisé le connecteur adjacent, c'est à dire le "Probe".</p>
<p>Level translator unidirectionnel à 4 voies (<a href="https://fr.aliexpress.com/premium/5V-level-translator.html?d=y&origin=y&catId=0&SearchText=5V%20level%20translator">provenance aliexpress</a>) :</p>
<p><a href="https://civade.com/images/skr1.4/leveltranslator1.jpg" title="leveltranslator1.jpg, oct. 2020"><img src="https://civade.com/images/skr1.4/.leveltranslator1_m.jpg" alt="leveltranslator1.jpg, oct. 2020"></a></p>
<p>Par ailleurs, nous allons aussi avoir besoin de l'alimentation 24V fournie par l'alimentation du Laser. Cette alimentation étant à peine assez dimentionnée, la prudence recommanderait de mettre une alimentation 24V externe et ne pas utiliser celle fournie par l'alimentation du laser. C'est comme vous voulez...</p>
<p>Afin de récupérer la nappe d'origine de la K40 qui amène les fins de courses et le moteur du X, j'ai intercalé une carte "K40 Middle Man" qui fait l'adaptation de la connectique. Je n'ai utilisé que les sorties fin de course, moteur pas à pas et l'entrée alimentation 24V qui sert à alimenter les fins de course optique. Le connecteur qui se branche sur la nape venant du moteur X et des fins de courses (<a href="https://www.digikey.fr/product-detail/fr/te-connectivity-amp-connectors/1-84534-2/A100331-ND/1893453">CONN FFC VERT 12POS 1.25MM</a> ) n'est pas super simple à trouver à l'unité et pas cher.</p>
<p>Voici une vue de la carte Middle Man K40 (trouvée sur Ebay à 10 euros):</p>
<p><a href="https://civade.com/images/skr1.4/k40middle.png" title="k40middle.png, oct. 2020"><img src="https://civade.com/images/skr1.4/.k40middle_m.png" alt="k40middle.png, oct. 2020"></a></p>
<p>A noter que cette carte peut être parfois un peu dure à trouver. On peut bien sur aussi acheter juste le connecteur et faire <a href="https://oshpark.com/shared_projects/3W1BpcNl">fabriquer les circuits imprimés chez OSHPark</a>, mais ceci n'est rentable que pour faire un lot de 10 cartes minimum.</p>
<p>Avec ce cablage, les commandes du panneau avant resteront fonctionnelles :</p>
<ul>
<li>Potentiomètre de réglage du courant</li>
<li>Bouton de test laser</li>
<li>Bouton de M/A laser</li>
<li>Vumètre de mesure de puissance du laser.</li>
</ul>
<p>Ceci permettra notamment de régler le potentiomètre de façon presque définitive à la valeur max de pilotage du laser (14 à 18 ma sur le vu mètre de mesure de puissance, en appuyant sur le bouton test), et moduler ensuite la puissance par logiciel de 0 à 100% en PWM. Je trouve cette solution de limitation matérielle plus sécurisante pour le laser que de le faire par logiciel.</p>
<p>Voici le schéma de la modification :</p>
<p><a href="https://civade.com/images/skr1.4/export.png" title="export.png, oct. 2020"><img src="https://civade.com/images/skr1.4/.export_m.png" alt="export.png, oct. 2020"></a></p>
<p>Afin de faciliter le cablage, j'ai fait une petite carte qui prend toutes les commandes, héberge la Middle Man et sort sur des connecteurs JST. Le bornier à vis noir en haut de la carte héberge les sorties PWM, Laser On et une masse qui vont aller vers la carte alimentation. Un fois raccordé la nappe enlevée dans l'ancienne carte sur la K40 middle man et l'alimentation, la solution est opérationnelle. Voici l'ensemble câblé sur table :</p>
<p><a href="https://civade.com/images/skr1.4/ensemble.jpg" title="<mark>Mettre ici photo de la carte d'adaptation en situation</mark>"><img src="https://civade.com/images/skr1.4/.ensemble_m.jpg" alt="""Mettre ici photo de la carte d'adaptation en situation"""></a></p>
<h3>Mise en oeuvre avec une découpe laser K40</h3>
<h4>Avant toute chose ...</h4>
<p>Manipuler une carte électronique avec des "fils volants" est souvent dangereux (pour la carte). Aussi il est préférable de sécuriser le tout pour éviter qu'un fil se promène et ne fasse de court-circuit intempesif. Qu'à cela ne tienne, un petit coup de découpe laser et hop, une platine pour fixer le tout! J'ai au passage adjoint une alimentation externe et un voltmètre pour surveiler la tension d'alimentation.</p>
<p><a href="https://civade.com/images/skr1.4/prototype.jpg" title="prototype.jpg, nov. 2020"><img src="https://civade.com/images/skr1.4/.prototype_m.jpg" alt="prototype.jpg, nov. 2020"></a></p>
<p>Avant de monter la carte, il va falloir régler le courant sur les drivers moteurs. La méthode dépend bien sur des drivers choisis. Les moteurs nécessitent 800mA. Pour info, dans un premier temps j'avais mis des DRV8825. Malheureusement, sur ces moteurs beaucoup de sifflements étaient à déplorer, même au courant nominal. Je suis donc revenu sur des classiques Pollolu A4988, un peu moins bruyants. Je les ais configurés en 1/16e de pas (les 4 cavaliers de configuration sous le driver moteur positionnés à droite). J'ai commandé deux TMC2130 pour essayer. Je pense y gagner en bruit et en souplesse, et ceux ci se pilotent possiblement en Step/Dir (prendre la version 'DIY' et la configurer). Je rajouterai une note là dessus plus tard.</p>
<h4>Installation et configuration de LightBurn</h4>
<p>Il faut ensuite installer Lightburn ( <a href="https://lightburnsoftware.com/">https://lightburnsoftware.com/</a> ) . Le logiciel est payant (35 euros), mais bien développé et supporté. Lorsqu'il est installé pour la première fois, il est en version d'évaluation complète, pendant 30 jours. Ceci vous permettra de faire tous les essais avant de décider si c'est l'outil pour vous ou pas.</p>
<p>Une fois installé, il faut le configurer pour une K40. Pour cela utiliser l'assistant de nouvel appareil (il se lance tout seul au premier lancement, ou sinon en bas à droite, appuyer sur "Appareils".</p>
<ul>
<li>Choisissez Smoothieware dans la liste des contrôleurs, puis Next</li>
<li>Choisissez Serial / USB puis Next</li>
<li>Nommer la machine (ex : "Smoothieware K40" ) et préciser ses dimentions (pour moi, X=330, Y=210, mais cela peut être plus petit pour vous si vous n'avez pas modifié le cadre pour augmenter les courses).</li>
</ul>
<p>Ces réglages de base vont permettre d'exploiter Smoothie, mais sans le firmware "Cluster", ou le mien modifier pour supporter le "Cluster mode".</p>
<p>Pour accéder aux réglages avancés, Allez sur l'icone "clé à molette+tournevis" sur la barre d'icones de Lightburn. Voici les réglages que j'ai changés :</p>
<p><a href="https://civade.com/images/skr1.4/Config-SmoothiewareK40-LightBurn_0.9.18.png" title="Config-SmoothiewareK40-LightBurn 0.9.18.png, nov. 2020"><img src="https://civade.com/images/skr1.4/.Config-SmoothiewareK40-LightBurn_0.9.18_m.png" alt="Config-SmoothiewareK40-LightBurn 0.9.18.png, nov. 2020"></a></p>
<ul>
<li>(1) : Dimensions de la table (déjà vu dans l'assistant) et <strong>origine en bas à droite</strong></li>
<li>(2) : Homing automatique lors de la connexion de la prise USB / Allumage machine</li>
<li>(3) : Activer le Clustering Smoothie : pour tirer partie du firmware "Cluster". Ne pas mettre 'on' si firmware standard Smoothieware.</li>
<li>(4) : Reduce Smoothieware pause Delay: Smoothie ne supporte pas la mise en pause automatique dans un mouvement en cours. Permet de diviser les grands mouvements en plusieurs petits pour que l'utilisateur puisse mettre en pause plus facilement.</li>
</ul>
<h4>Tests de déplacement et vitesses moteurs</h4>
<p>Ensuite, on peut raccorer la nappe portant le moteur X et les fins de courses, et le moteur Y (seulement 2 connecteurs à cabler...). <strong>Le laser doit être impérativement coupé en le mettant sur 'Off' sur le panneau avant.</strong></p>
<p>Les essais moteurs peuvent maintenant démarrer avec le laser coupé. Si vous avez raccordé la carte par votre propre alim 24V, vous n'êtes d'ailleurs même pas obligé d'allumé la machine, seulement l'alim de la carte Bigtreetech... encore plus sûr..</p>
<p>Une fois compris que l'origine est en haut à gauche, et qu'il faut faire la recherche d'origine dans le sens négatif sur l'axe X et positif sur l'axe Y (c'est bien sur lié à la position physique des capteurs optiques sur la K40), ca commence à se comporter normalement lors du homing. La tête doit se déplacer vers le haut gauche. Le homing peut être demandé dans Smoothieware en allant dans le menu "Prepare / Homing all axes".</p>
<pre>
alpha_min_endstop 1.29^ # Connecteur homing X-
alpha_homing_direction home_to_min # Recherche le home en décrémentant (X--)
alpha_min 0
alpha_max 330 # largeur = 330 mm sur une K40 modifiée
beta_max_endstop 1.28^ # Connecteur homing Y-
beta_homing_direction home_to_max # Recherche le home en incrémentant (Y++)
beta_min 0
beta_max 210 # hauteur = 220 mm sur une K40 modifiée
</pre>
<p>Les mouvements, au courant nominal (0.8A), marchent pas mal jusqu'à 25 000 mm/min (soit 417 mm/s). J'ai même pu aller au delà mais après ce sont les moteurs/mécanique qui ne suivent plus...</p>
<p>Les moteurs étant en <strong>400 pas/tour</strong>, en<strong> 1/16e de pas</strong> (6400 pas par tour), avec une<strong> courroie au pas de 2mm</strong> sur la <strong>poulie de 20 dents</strong> (40mm / tour), il faut (6400 pas / 40 mm ) = 160 pas pour faire 1mm.</p>
<p>A 417mm/s (soit 25 000 mm/minute) cela nous donne donc une fréquence de pase de (417mm/s X 160 pas) = <strong>66.72 kHz</strong>. Pas mal ! On bien au delà des 25 kHz max d'un Grbl sur arduino Uno...</p>
<p>Au passage, c'est aussi pour cela qu'il ne me semble pas une bonne idée de mettre un GRBL/Uno sur une K40, car cela ira 2.5 fois moins vite sur les déplacements rapides. Avec GRBL sur STM32 ou ESP32 (voir sur ce même blog 2 articles sur le sujet) cela passerait sans problème. Donc oubliez l'Arduino de base à 16Mhz pour ce genre de projet...</p>
<p>A noter que Lightburn utilise la vitesse de jog par défaut qui est réglée dans Smoothieware pour se déplacer à vitesse rapide (default_seek_rate) . Il faut donc positionner celle-ci en fonction des caractéristiques machine. Bien que cela était fonctionnel à 24000 mm/mn, j'ai pris une marge de sécurité pour ne pas travailler toujours au max, en réduisant la vitesse de jog de 25% par rapport aux tests faits ci dessus (18000 mm/min, soit <strong>300 mm/s</strong>):</p>
<pre>
default_seek_rate 18000 # Default speed (mm/minute) for G0 moves
</pre>
<p>J'ai néanmoins laissé à 24000 les déplacements des moteurs, pour les rares fois ou je souhaiterais graver à très haute vitesse en mode "raster". Ca a du sens...</p>
<p>J'ai relancé la découpe du fichier qui m'a servi à faire la platine dans Lightburn (toujours sans laser!!!), et tout avait l'air de se comporter normalement, avec d'assez jolis bruits mécaniques et sur les moteurs. C'est un peu plus bruyant qu'avec l'électronique d'origine, mais cela évoluera lors de la mise en place de drivers Trinamic (plus tard...). Au moins, "it works (tm)". Il est donc temps de raccorder le laser...</p>
<h4>K40 + Lightburn avec pilotage du laser</h4>
<p>Le raccordement du laser nécessite 3 fils, une masse, le LO (Laser On) totalement à droite sur l'alimentation, et le PWM. Ce dernier est pris en débrancheant la cosse raccordée sur le 5V de l'alimentation, et qui va à droite du portentiomètre de réglage de puissance. Ainsi le motentiomètre reste actif... et permet de mettre un talon sur la puissance Max admissible (18ma est une valeur qui semble faire l'unanimité sur une K40).</p>
<p>Pas de soucis particulier lors de la découpe. J'ai du adapter la hauteur de trait en mode raster à la largeur de mon faisceau, et activer le surbalayage :</p>
<p><a href="https://civade.com/images/skr1.4/EspacementLignesRaster-LightBurn_0.9.18.png" title="EspacementLignesRaster-LightBurn 0.9.18.png, nov. 2020"><img src="https://civade.com/images/skr1.4/.EspacementLignesRaster-LightBurn_0.9.18_m.png" alt="EspacementLignesRaster-LightBurn 0.9.18.png, nov. 2020"></a></p>
<p>Le surbalayage a pour intérêt de dépasser légèrement en mode raster de part et d'autre de la pièce de façon à laisser du temps à la mécanique de se stabiliser. En effet, j'ai noté que lors d'allers retours, une oscillation pouvait être visible à la loupe sur les traits au début. Celle ci disparait totalement en surbalayage. Voici ce que donne une prévisualisation d'un surbalayage. En rose, les déplacements sans laser et en gris avec. Si les dimensions de la zone rose changent, c'est pour s'adapter à la vitesse... Ceci est fait automatiquemetn par Lightburn :</p>
<p><a href="https://civade.com/images/skr1.4/Apercu-LightBurn_0.9.18.png" title="Apercu-LightBurn 0.9.18.png, nov. 2020"><img src="https://civade.com/images/skr1.4/.Apercu-LightBurn_0.9.18_m.png" alt="Apercu-LightBurn 0.9.18.png, nov. 2020"></a></p>
<h3>Conclusion :</h3>
<p>Du coup, j'ai passé la carte en prod, en démontant l'ancienne et en fixant la nouvelle via la plaque métallique verticale de fixation. Pour le moment, je n'ai pas encore modifié la face avant, car je ne suis pas sur que le LCD de Smoothie soit intéressant pour une découpe laser, lorsque l'on est connecté à Lightburn.</p>
<p>Il a fallu faire un petit cable USB type B male, vers embase type B femelle et un adaptateur en impression 3D pour fixer le type B femelle dans le trou ou il y avait l'entrée USB de la précédente carte. Rien de bien méchant. Ceci dit, pour les feignants (et patients...) cela existe tout fait que Aliexpress à moins de 1 euro :</p>
<p><a href="https://civade.com/images/skr1.4/typeb.jpg" title="typeb.jpg, nov. 2020"><img src="https://civade.com/images/skr1.4/.typeb_m.jpg" alt="typeb.jpg, nov. 2020"></a></p>
<p>Voici une vue d'ensemble montée :</p>
<p><a href="https://civade.com/images/skr1.4/ensemble-monte.jpg" title="ensemble-monte.jpg, nov. 2020"><img src="https://civade.com/images/skr1.4/.ensemble-monte_m.jpg" alt="ensemble-monte.jpg, nov. 2020"></a></p>
<p>Le couple Lightburn + Smoothieware, c'est très spectaculaire.... Rien à voir avec le logiciel d'origine. Avec la Bigtreetech SKR 1.4, il est possible de faire cette upgrade pour moins de 100 euros tout compris (logiciel aussi), ce qui en fait une modification imbattable. De toute façon je n'aurais pas mis les 250 USD de la carte Cohesion, ou les 250 euros de la Smoothieboard + accessoires auxquels il fallait encore ajouter le logiciel.
C'est peut être pas très fair play pour les développeurs de Smoothieware, mais vu les rapports que j'ai eu avec eux, j'ai vraiment pas eu l'envie d'alimenter leur business.</p>https://civade.com/post/2020/10/20/Bigtreetech-SKR-V1.4-Turbo-sur-une-d%C3%A9coupe-laser-K40-avec-Smoothieware#comment-formhttps://civade.com/feed/atom/comments/107Manuel alternatif complet pour synthétiseur Analogique Roland / Studio Electronics SE-02urn:md5:46d66b171aee7815c2bd2a2bd2c73cfd2020-10-01T08:46:00+02:002024-02-23T15:45:18+01:00jphiDIY-Musique<p>Le manuel du SE02 n'a pas été mis à jour par Roland. Il faut donc jongler avec plusieurs documents (manuel Roland, Missing Manual, Added Func 1.10, Synshine Jones Manual) pour avoir une vision à peu près complète du sujet....</p> <p>Vue de mon SE-02, avec 2 flancs en châtaignier au lieu des flancs acier. Nettement pus "vintage", non?</p>
<p><a href="https://civade.com/images/SE02/IMG_2317.JPG" title="IMG_2317.JPG, déc. 2018"><img src="https://civade.com/images/SE02/.IMG_2317_m.jpg" alt="IMG_2317.JPG, déc. 2018"></a></p>
<p>Sunchine Jones, a développé un manuel alternatif beaucoup plus complet que la simple feuille de Roland (http://sunshine-jones.com/roland-boutiquestudio-electronics-se-02-the-missing-manual/). Malheureusement, il n'intègre pas (tout comme celui de Roland) les particularités des firmware 1.04, 1.10 et 1.11...</p>
<p>Je n'ai pas réussi à contacter l'auteur, et le format diffusé est uniquement en PDF, ce qui n'est pas très "communautaire". On est donc face à un document qui aussi génial soit il, est fermé aux évolutions...</p>
<p>Je me suis donc permis de faire du reverse à partir du PDF afin de :</p>
<ul>
<li>Fabriquer ce manuel à partir d'un format de document ouvert (LibreOffice)</li>
<li>Homogénéiser les références aux touches (en gras)</li>
<li>Corriger les coquilles</li>
<li>Compléter certaines sections,</li>
<li>Ajouter toutes les fonctionnalités des différentes updates de firmware, en identifiant à partir de quelle version la fonction est disponible.</li>
<li>Intégrant les astuces diffusées sur AF, et sur le site de Studio Electronics</li>
<li>Reprendre l'implémentation midi, qui était intégrée en format image et ne passait pas sur tous les viewer PDF, et la compléter avec les derniers contrôleur supportés</li>
<li>Supprimer certaines curiosités (le commodore 64, le chapitre sur l'interface cassette.. etc..).</li>
<li>Optimiser la mise en page pour du A4, et tenter de réduire le nombre de page (34 au lieu de 40...)</li>
<li>Explications sur le fonctionnement du LFO sur les oscillateurs dans la section LFO</li>
<li>Ajout d'une page à la fin sur l'accès rapide aux fonctions (clear patch, tune, etc..)</li>
<li>Modification des tableaux de patch/Pattern/Song setup pour ajouter la fonction clear.</li>
<li>Ajout des settings pour la bonne communication avec l'éditeur SE02 dans l'accès rapide aux fonctions. ("Quick memento")</li>
<li>Ajout d'Audio Fanzine dans les contributeurs</li>
<li>Et enfin produire le résultat sous forme de PDF intégrant le format ODT (Libre Office) de façon à le rendre éditable. Il suffit d'installer Libre Office (open source) et de faire un fichier / ouvrir sur le PDF...</li>
</ul>
<p>C'est un travail en cours, que je soumet à votre sagacité, et voir si certains d'entre vous seraient intéressés pour le compléter avec leurs astuces, voir en faire une traduction française.</p>
<p>Il est téléchargeable ICI : <a href="https://civade.com/images/SE02/Roland-SE-02_V1.11_User_Guide.pdf">Roland-SE-02 V1.11 User Guide.pdf</a></p>https://civade.com/post/2020/10/01/Manuel-alternatif-complet-pour-synth%C3%A9tiseur-Analogique-Roland-/-Studio-Electronics-SE-02#comment-formhttps://civade.com/feed/atom/comments/106Ajouter le support du Wifi sur une imprimante 3D fonctionnant avec Marlin 2urn:md5:cedbeb5dfaf82a851236eb90288b2bf32020-09-22T07:25:00+02:002024-02-23T15:45:28+01:00jphiMachines à commande numériques3DPrintArduinoEmbarquéESP8266<p>Marlin version 2 peut gérer 2 liaisons séries pour communiquer avec l'extérieur. Traditionnellement on n'en utilise qu'une pour brancher le PC en USB, mais cette seconde liaison série peut permettre d'ajouter le support du Wifi. Chargement à distance de la carte SD, recherche d'origine machine, lancement d'une impression, sont autant de fonctionnalités qui seront ajoutées à l'imprimante. Voyons comment...</p> <p><a href="https://civade.com/images/MarlinWifi/ESP3D_pour_Marlin.png" title="ESP3D pour Marlin.png, sept. 2020"><img src="https://civade.com/images/MarlinWifi/.ESP3D_pour_Marlin_m.png" alt="ESP3D pour Marlin.png, sept. 2020"></a></p>
<h3>Architecture</h3>
<p>Les liaisons séries disponibles dépendent en grande partie du microcontrôleur utilisé et de l'affectation des broches. Ce peut être en USB Natif avec une émulation de port série (<code>SERIAL_PORT -1</code> dans configuration.h) , ou en sériel natif avec un adaptateur série usb sur la carte (<code>SERIAL_PORT 0</code> dans configuration.h).</p>
<p>Mais a quoi donc peut bien servir la 2e liaison série ( <code>SERIAL_PORT_2</code> dans configuration.h ) ?</p>
<p>On trouve sur le marché des afficheurs couleurs graphiques avec écran tactiles, qui disposent d'une interface bien plus élaborée que sur les afficheurs graphiques monochromes. Pour éviter d'embarquer le code de gestion graphique, les concepteurs ont utilisé une astuce intéressante : mettre un microcontrôleur sur l'afficheur et qui fait gérer tous les menus, et interfacer avec la carte contrôleur par une simple liaison série qui envoie du Gcode, le même que celui qui transite du PC vers l'imprimante 3D par l'USB. Du coup pas besoin de programmation spécifique dans Marlin, seulement une 2e liaison série qui se gère comme la première.</p>
<p>Exemple d'afficheur, gérant à la fois un mode touch screen natif, ou une émulation d'afficheur Reprap Discount Graphic Lcd Controler.. Le changement de mode s'effectue ar une pression longue sur l'encodeur. EN mode natif touch seule une liaison série est nécessaire (cable noir). En mode émulation, les 2 cables gris sont nécessaires.</p>
<p><a href="https://civade.com/images/MarlinWifi/BIGTREETECH-TFT35.jpg" title="BIGTREETECH-TFT35.jpg, sept. 2020"><img src="https://civade.com/images/MarlinWifi/.BIGTREETECH-TFT35_m.jpg" alt="BIGTREETECH-TFT35.jpg, sept. 2020"></a></p>
<p>On trouve également un firmware pour ESP8266 ou ESP32 qui le dote d'une interface web assez complète pour gérer une imprimante 3D (ou une CNC) : ESP3D WebUI ( <a href="https://github.com/luc-github/ESP3D-WEBUI">https://github.com/luc-github/ESP3D-WEBUI</a> ). Et devinez comment l'ESP échange des données avec Marlin? Par une liaison série qui envoie également du Gcode, tout comme le LCD...</p>
<p>ESP01s, montée sur une carte SKR v1.4:</p>
<p><a href="https://civade.com/images/MarlinWifi/ESP-01-Wifi-module.jpg" title="ESP-01-Wifi-module.jpg, sept. 2020"><img src="https://civade.com/images/MarlinWifi/.ESP-01-Wifi-module_m.jpg" alt="ESP-01-Wifi-module.jpg, sept. 2020"></a></p>
<p>Mais si l'on veut connecter un afficheur graphique TFT, le Wifi ET disposer de la connexion avec le PC, le tout raccordé directement à la carte de pilotage, comment peut on faire? C'est là qu'il faut bien comprendre les possibilités... Comme il n'y a que 2 liaisons sur marlin et que l'on souhaite connecter 3 périphériques qui discutent via la liaison série (PC/Wifi/Ecran). Il va donc falloir faire des choix...</p>
<h3>Trouver une liaison série de libre</h3>
<p>Comme notre modification nécessite une liaison série supplémentaire dédiée à cet usage, il va nous falloir trouver une de libre.</p>
<p>Il faut d'abord comprendre comment votre carte de commande dialogue avec l'ordinateur quand raccordée en USB.</p>
<p>Par exemple, si votre imprimante est pilotée par une carte Arduino Mega2560, il n'y a pas de support USB Natif. En lieu et place, un composant réalise une conversion USB vers série et la liaison série utilisée est la 1ere liaison série disponible sur la Mega 2560 (<code>Serial 0</code>). Malheureusement, au moment de la conception de ces cartes, il n'avait pas été envisagé qu'une seconde liaison série puisse être nécessaire sur une RAMPS. On a quand même un peu de chance puisque la plupart des liaisons séries sont routées sur les connecteurs de fin de course. Avec un peu de réorganisation des entrées sorties il est possible de récupérer une liaison série supplémentaire. Un papier intéressant sur le sujet montre des pistes sur comment faire : <a href="https://revilor.github.io/MMU2-Marlin/RAMPSserial.html">https://revilor.github.io/MMU2-Marlin/RAMPSserial.html</a>. Je ne détaillerai pas la méthodologie complète, n'étant plus équipé d'une RAMPS. C'est clairement pas plug and play, et il faut adapter la configuration des entrées sorties et le cablage pour faire fonctionner la solution. De plus, les interface wifi esp8266 étant en sortie série 3.3V, il va aussi falloir adapter les niveaux 3.3V > 5V.</p>
<p>Sur les cartes modernes à base de processeurs 32 bits, ces derniers supportent l'USB nativement. La première liaison série est donc fournie directement par ce biais (<code>SERIAL_PORT -1</code> dans configuration.h). Très souvent une seconde liaison série (et souvent beaucoup plus) est disponible sur un connecteur dédié. Et parfois, ce connecteur est directement prévu pour brancher l'interface wifi. Dans ce dernier cas, c'est nettement plus simple.</p>
<p>Au passage, la configuration des affectations des liaisons série se fait dans le fichier configuration.h de Marlin 2 :</p>
<pre>//
#define SERIAL_PORT -1 // for usb support
//
/**
* Select a secondary serial port on the board to use for communication with the host.
* :<a href="https://civade.com/post/2020/09/22/-1, 0, 1, 2, 3, 4, 5, 6, 7" title="-1, 0, 1, 2, 3, 4, 5, 6, 7">-1, 0, 1, 2, 3, 4, 5, 6, 7</a>
*/
#define SERIAL_PORT_2 0 // for tft24 or 32 graphic lcd support
//
/**
* This setting determines the communication speed of the printer.
*
* 250000 works in most cases, but you might try a lower speed if
* you commonly experience drop-outs during host printing.
* You may try up to 1000000 to speed up SD file transfer.
*
* :<a href="https://civade.com/post/2020/09/22/2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000" title="2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000">2400, 9600, 19200, 38400, 57600, 11...</a>
*/
#define BAUDRATE 250000</pre>
<p>Je prendrai 2 exemples</p>
<ul>
<li>la Bigtreetech SKR 1.3 (17 euros!) , qui dispose d'un connecteur avec une liaison série disponible sur le connecteur AUX 1, mais ne permet pas le branchement direct de l'interface wifi car le connecteur n'est pas adapté</li>
<li>la Bigtreetech SKR 1.4 turbo (22 euros!) qui elle dispose directement d'un connecteur pour brancher la carte wifi.</li>
</ul>
<p>Sur la SKR 1.3 un connecteur auxiliaire (AUX1) fournit cette liaison série. Quelques recherches sur le schéma ( <a href="https://github.com/bigtreetech/BIGTREETECH-SKR-V1.3/blob/master/BTT%20SKR%20V1.3/hardware/SKR-V1.3-SCH.pdf">https://github.com/bigtreetech/BIGTREETECH-SKR-V1.3/blob/master/BTT%20SKR%20V1.3/hardware/SKR-V1.3-SCH.pdf</a> ) montrent qu'il s'agit de la liaison série zéro (TX0=P0.2 , RX0=P0.3 ), et qu'elle est partagée avec le connecteur adjacent qui va vers l'écran TFT.</p>
<p>Sur la SKR 1.4, le connecteur wifi reçoit une autre liaison série, la série 3 (TXD3=P4.28 , RXD3=P4.29) comme l'indique le schéma ( <a href="https://github.com/bigtreetech/BIGTREETECH-SKR-V1.3/blob/master/BTT%20SKR%20V1.4/Hardware/BTT%20SKR%20V1.4-SCH.pdf">https://github.com/bigtreetech/BIGTREETECH-SKR-V1.3/blob/master/BTT%20SKR%20V1.4/Hardware/BTT%20SKR%20V1.4-SCH.pdf</a> ). Le TFT est toujours branché sur la liaison série 0, comme sur la SKR 1.3.</p>
<h3>Choix d'usage de l'imprimante.</h3>
<h4>Solution 1 :</h4>
<p>Si on dispose d'un écran graphique (Reprap Discount Graphic LCD controler) ou non graphique (reprap discout lcd controler), pas de problème. Ces 2 écrans se raccordant via les connecteurs EXP1 et EXP2 ils ne consomment pas de liaison série. On peut donc utiliser sur la SKR <code>SERIAL_PORT -1</code> pour la communication USB et <code>SERIAL_PORT_2</code> à 0 (SKR 1.3) ou à 3 (SKR 1.4) pour avoir le wifi.</p>
<p><strong>Les plus :</strong> On a bien l'écran, la liaison PC, et le WIfi. L'adresse IP s'affiche sur l'écran, facilitant la recherche de l'imprimante.</p>
<p><strong>Les moins :</strong> Ca ne fonctionne directement sur la SKR 1.4 qui est équipée du connecteur pour l'ESP01. Sur la SKR 1.3, il va falloir faire du câblage... (nous verrons plus loin). Rien de bien méchant toutefois.</p>
<h4>Solution 2:</h4>
<p>Si on dispose d'un TFT24, on peut le repasser en émulation "Reprap Discount graphic LCD controler". Toute la communication passant par les connecteurs EXP1 et 2, la 2e liaison série est libre pour y raccorder le module WIfi. L'affichage sera donc beaucoup moins joli, mais au moins on aura l'affichage LCD local, le support de l'USB pour raccorder l'ordi ET le support du Wifi. On peut donc utiliser sur la SKR<code> SERIAL_PORT -1</code> pour la communication USB et et <code>SERIAL_PORT_2</code> à 0 (SKR 1.3) ou à 3 (SKR 1.4) pour avoir le wifi, comme dans la solution précédente.</p>
<p><strong>Les plus :</strong> On a le LCD, la connection PC et le WIfi en même temps. L'adresse IP s'affiche sur l'écran, facilitant la recherche de l'imprimante.</p>
<p><strong>Les moins:</strong> Le TFT24 est en mode émulé, plus de belle interface graphique et d'écran tactile. Ca ne fonctionne que sur la SKR 1.4 qui est équipée du connecteur pour l'ESP01.Sur la SKR 1.3, il va falloir faire du câblage... (nous verrons plus loin).</p>
<h4>Solution 3:</h4>
<p>Si on veut absolument tirer parti de l'affichage très graphique du TFT et de l'écran tactile ("Touch mode") sur un TFT24, il faudra sacrifier la communication USB avec le PC. Dans ce cas sur la SKR <code>SERIAL_PORT 3</code> pour la communication Wifi et <code>SERIAL_PORT_2 0</code> pour la communication avec le LCD. A noter que cette solution ne fonctionnera pas sur SKR 1.3, puisque le TFT et le connecteur AUX sont sur la même liaison série....</p>
<p>A noter également, que la vitesse de communication avec le TFT (à régler dans le TFT) et avec l'interface Wifi (à régler dans l'interface Web de l'ESP3D ) devront être identiques à celle choisie dans le fichier configuration.h de Marlin (dans ce billet, 250000 bauds).</p>
<p><strong>Les plus :</strong> On est en mode graphique avec écran tactile et on a le wifi.</p>
<p><strong>Les moins:</strong> Plus de communication avec le PC via l'USB. De plus, cela ne fonctionne que sur la SKR 1.4 qui est équipée du connecteur pour l'ESP01 avec sa propre liaison série (3). L'adresse ip de l'imprimante ne s'affichera pas sur l'écran.</p>
<h4>Solution 4:</h4>
<p>Si on dispose d'un TFT35, de nouvelles possibilités sont ouvertes. En effet, l'écran dispose d'un connecteur sur lequel on peut raccorder directement le module Wifi ESP01.
C'est l'écran qui, grâce à un processeur plus puissant, qui "fusionne" les commandes reçues/envoyées par l'interface wifi avec son propre flux de commandes dans la liaison série qui le relie à la SKR.
Dans ce cas, la configuration de la SKR sera SKR SERIAL_PORT -1 pour la communication USB et SERIAL_PORT_2 0 pour la communication avec l'écran. Le wifi ne sera donc pas déclaré dans Marlin, c'est l'écran qui s'occupera de la gestion transparente de l'interface wifi.</p>
<p><strong>Les plus :</strong> L'écran TFT fonctionne en touch mode, avec le wifi, et la laison USB vers le PC. Cette solution sera également compatible SKR 1.3 et 1.4 puisque la carte wifi sera connectée sur l'écran. L'adresse IP s'affiche sur l'écran, facilitant la recherche de l'imprimante.</p>
<p><strong>Les moins :</strong> Le cout de l'écran qui vaut 24 euros à lui seul contre 12 euros pour le TFT24. Ce cout est justifié par un écran plus grand et un microcontrôleur plus puissant pour gérer les multiples liaisons série.</p>
<p><strong>Conclusion :</strong></p>
<ul>
<li>Seul le TFT35 permet d'avoir Wifi, écran graphique tactile et communication USB avec le PC sans perte de fonctionnalité. Il permet en outre d'ajouter la fonction Wifi aussi bien aux SKR 1.3 qu'aux SKR1.4/1/4Turbo.</li>
<li>Avec le TFT24, il faudra soit se passer de la communication avec le PC ou passer en mode émulation 12864 (reprap full graphic lcd controler) pour avoir le wifi, et encore, que sur la SKR 1.4/ 1.4/Turbo.</li>
</ul>
<h3>Préparation / programmation de l'esp8266</h3>
<p>La plus petite carte ESP8266, la moins chère mais également la plus difficile à mettre en œuvre est l'ESP01. Il est TRES recommandé de prendre la version ESP01s qui dispose de suffisamment de mémoire pour faire tourner le firmware ESP3D complet.</p>
<h4>Pré requis :</h4>
<ul>
<li>Un programmateur</li>
<li>Le flash Download tool ( <a href="https://www.espressif.com/en/support/download/other-tools">https://www.espressif.com/en/support/download/other-tools</a> et télécharger Flash Download Tools (ESP8266 & ESP32 & ESP32-S2))</li>
<li>Ou avoir installé Visual Studio Code avec le plugin Platformio.</li>
<li>A titre indicatif un guide avec la méthodo (<a href="https://github.com/bigtreetech/BTT-WRITER-V1.0/blob/master/BTT%20ESP-01S%20basic%20guide-20200225.pdf">https://github.com/bigtreetech/BTT-WRITER-V1.0/blob/master/BTT%20ESP-01S%20basic%20guide-20200225.pdf</a>) et éventuellement un tuto video (https://www.youtube.com/watch?v=AGTF-JEUHNA)</li>
<li>Le firmware esp3d (<a href="https://github.com/luc-github/ESP3D">https://github.com/luc-github/ESP3D</a> )</li>
<li>Les éléments complémentaires qui seront uploadés dans la flash ( <a href="https://github.com/luc-github/ESP3D-WEBUI">https://github.com/luc-github/ESP3D-WEBUI</a> ) et notamment<a href="https://github.com/luc-github/ESP3D-WEBUI/blob/2.1/index.html.gz"> https://github.com/luc-github/ESP3D-WEBUI/blob/2.1/index.html.gz</a> , un favicon <a href="https://github.com/luc-github/ESP3D-WEBUI/blob/2.1/favicon.ico">https://github.com/luc-github/ESP3D-WEBUI/blob/2.1/favicon.ico</a> .</li>
</ul>
<h4>L'interface de programmation :</h4>
<p>Il existe plusieurs solutions pour programmer l'ESP01. On peut utiliser une interface série 3.3V vers USB (ex : ftdi232), ou des interface plus spécialisées. Je ne détaillerai pas l'usage d'une interface série USB qui nécessite un peu plus de bidouille, mais resterai sur des interfaces dédiées à la programmation des ESP01.</p>
<p><strong>L'esp01 Flasher </strong></p>
<p>A 2 euros, cette interface fait une grand partie du boulot, mais pas tout :</p>
<p><a href="https://civade.com/images/MarlinWifi/esp01-flasher.jpg" title="esp01-flasher.jpg, sept. 2020"><img src="https://civade.com/images/MarlinWifi/.esp01-flasher_m.jpg" alt="esp01-flasher.jpg, sept. 2020"></a></p>
<p>Elle adapte la liaison série sur l'USB, mais ne passe pas automatiquement l'esp01 en mode programmation. La solution la plus simple, est de souder un bouton poussoir entre la masse (GND) et IO0 (cf <a href="https://www.diyhobi.com/flash-program-esp-01-using-usb-serial-adapter/">https://www.diyhobi.com/flash-program-esp-01-using-usb-serial-adapter/</a>). Il faudra appuyer sur le bouton lors du branchement de l'interface sur l'USB, avant de lancer la programmation. Il peut être relâche dès que l'ESP est alimentée. Après la programmation, il faudra débrancher et rebrancher l'adaptateur pour remettre l'ESP01 en fonctionnement normal.</p>
<p>Vue de l'interface avec le bouton :</p>
<p><a href="https://civade.com/images/MarlinWifi/push1.jpg" title="push1.jpg, sept. 2020"><img src="https://civade.com/images/MarlinWifi/.push1_m.jpg" alt="push1.jpg, sept. 2020"></a></p>
<p>Il en existe maintenant une version avec un interrupteur à basculer, qui permet de passer en mode programmation sans avoir à souder un bouton. C'est mieux, mais nécessite toujours de faire une manipulation pour la programmation.</p>
<p><a href="https://civade.com/images/MarlinWifi/open-smart.jpg" title="open-smart.jpg, sept. 2020"><img src="https://civade.com/images/MarlinWifi/.open-smart_m.jpg" alt="open-smart.jpg, sept. 2020"></a></p>
<p>Ma méthode préférée, est de modifier l'ESP01 Flasher en ajoutant 2 fils. Il faut câbler le DTR (broche 14 du CH340) sur IO0 et le RTS (broche 14 du ch340) le RST du connecteur accueillant l'ESP01. Le passage en mode flash et reboot seront automatiquement gérés par le logiciel de flashage, cela deviendra transparent. Plus de bouton à appuyer! Dommage qu'ils n'aient pas pensé à le faire directement sur l'interface lors de la conception...</p>
<p>Version modifiée :</p>
<p><a href="https://civade.com/images/MarlinWifi/top.jpg" title="top.jpg, sept. 2020"><img src="https://civade.com/images/MarlinWifi/.top_m.jpg" alt="top.jpg, sept. 2020"></a></p>
<p><a href="https://civade.com/images/MarlinWifi/bottom.jpg" title="bottom.jpg, sept. 2020"><img src="https://civade.com/images/MarlinWifi/.bottom_m.jpg" alt="bottom.jpg, sept. 2020"></a></p>
<p><strong>Bigtreetech BTT Writer :</strong></p>
<p>Sur cette interface de programmation, le redémarrage et le passage en mode programmation est transparent. Il faut par contre câbler des fils (fournis) entre le flasher et l'ESP01. La manipulation est bien décrite dans le manuel : <a href="https://github.com/bigtreetech/BTT-WRITER-V1.0/blob/master/BTT%20Writer%20V1.0%20manual.pdf"> https://github.com/bigtreetech/BTT-WRITER-V1.0/blob/master/BTT%20Writer%20V1.0%20manual.pdf</a></p>
<h4>La programmation du firmware</h4>
<p><strong>Programmation directe d'un binaire :</strong></p>
<p>La façon la plus simple de programmer le firmware est de le télécharger compilé (format .bin) et de le programmer avec le Flash Download tool. C'est la méthode proposée par les fabricants chinois (comme Bigtreetech sur leur git https://github.com/bigtreetech/BIGTREETECH-SKR-PRO-V1.1/tree/master/firmware/esp-01s pour le firmware et https://github.com/bigtreetech/BTT-WRITER-V1.0/blob/master/BTT%20Writer%20V1.0%20manual.pdf + https://github.com/bigtreetech/BTT-WRITER-V1.0/blob/master/BTT%20ESP-01S%20basic%20guide-20200225.pdf pour les instructions).</p>
<p>Je l'ai testée, cela fonctionne, bien que cela ne soit clairement pas ma méthode préférée, car on n'a jamais la certitude de programmer la dernière version. Je met néanmoins les instructions d'utilisation du logiciel de programmation du firmware pour garder une trace et aider ceux qui souhaiteraient procéder ainsi :</p>
<ul>
<li>Brancher le programmeur</li>
<li>Lancer le FDT</li>
<li>Cliquer sur "developer mode"</li>
<li>Cliquer sur "esp8266 download tool"</li>
<li>Dans l'onglet SPI Download, sélectionnez :
<ul>
<li>Crystal freq : 26M (defaut)</li>
<li>Spi Speed 40 Mhz (defaut)</li>
<li>SPI MODE: Dout</li>
<li>Flash Size 8Mbit for ESP01s (attention, ESP01 n'a pas 4Mbit)</li>
<li>Sélectionnez le com ou est branché l'adaptateur</li>
<li>Baudrate = 115200 (defaut)</li>
<li>Dans la liste de fichier, dans le 1er, mettre aller chercher esp3d.bin</li>
</ul></li>
<li>Flashing</li>
</ul>
<p><strong>Compilation et programmation à partir de Visual studio Code :</strong></p>
<p>La meilleure façon pour disposer de la dernière version du firmware est d'installer Visual Studio Code, l'extension Platformio, et de télécharger ou cloner (git clone https://github.com/luc-github/ESP3D/ ) le projet <a href="https://github.com/luc-github/ESP3D/">https://github.com/luc-github/ESP3D/</a>. J'ai expliqué la manip d'installation de platformio sur un autre article de ce même blog.</p>
<p>Ensuite dans l'explorateur windows, sélectionnez le dossier "ESP3D" ainsi récupéré avec le bouton de droite et faire "Open With Code".</p>
<p>Dans Visual studio code, il va vous falloir ouvrir le fichier "platformio.ini", afin de préciser que vous voulez compiler pour un ESP01 (voir 1). Il suffit pour cela de mettre :</p>
<pre>default_envs = esp01s_80mhz</pre>
<p>Branchez votre programmateur en USB avec l'ESP01s raccordée dessus (après avoir appuyé sur le bouton poussoir pour le passer en mode programmation si ce n'est pas automatique), et cliquez sur le menu platformio (2). Dans les taches, cliquez sur "Upload All" (3) qui va compiler et programmer l'ESP01.</p>
<p><a href="https://civade.com/images/MarlinWifi/2020-09-25_11_26_09-platformio.ini_-_ESP3D_-_Visual_Studio_Code.png" title="2020-09-25 11_26_09-platformio.ini - ESP3D - Visual Studio Code.png, sept. 2020"><img src="https://civade.com/images/MarlinWifi/.2020-09-25_11_26_09-platformio.ini_-_ESP3D_-_Visual_Studio_Code_m.png" alt="2020-09-25 11_26_09-platformio.ini - ESP3D - Visual Studio Code.png, sept. 2020"></a></p>
<p>En moins d'une minute, votre ESP8266 est programmée !</p>
<h4>La configuration du firmware</h4>
<p>A ce stade, le firmware est programmé et vous devriez vous dans votre voisinage Wifi un nouveau point d'accès nommé "ESP3D". Connectez vous dessus avec le mot de pase "12345678". Vous devriez être redirigé sur une page web du portail captif. Si ce n'est pas le cas, ouvrez une page web sur <a href="http://192.168.0.1">http://192.168.0.1</a>.</p>
<p>Il vous faudra envoyer sur le firmware avec l'interface web fournie les éléments du sous répertoire data de ESP3D (si vous l'avez compilé) ou récupérés de <a href="https://github.com/luc-github/ESP3D/tree/2.1.x/esp3d/data">https://github.com/luc-github/ESP3D/tree/2.1.x/esp3d/data</a> si vous l'avez flashé à l'aide d'un binaire récupéré déjà compilé.</p>
<p>L'élément le plus important des trois est <strong>index.html.gz</strong>. C'est ce fichier qui contient toute l'interface. <strong>favicon.ico</strong> et <strong>404.htm</strong> sont optionnels mais ne prennent que peu de place.</p>
<p>Au passage, c'est la même interface qui est utilisée sur GRBL sur Esp32, décrit dans un autre article de ce blog.</p>
<p>A ce stade, vous pourrez également passer dans les settings pour paramétrer le Wifi sur votre point d'accès personnel (SSID, mot de passe et si possible une adresse ip fixe), paramétrer la langue et surtout le firmware de base de l'imprimante pour dire qu'on souhaite travailler avec Marlin et sa vitesse (250000).</p>
<p>Après redémarrage(débranchez et rebranchez l'usb...) vous devriez pouvoir vous connecter à l'adresse ip que vous avez paramétré sur votre réseau local. Le point d'accès " ESP3D" ne devrait plus être visible, tant que l'ESP8266 arrive à se connecter dans votre réseau local en Wifi. Dans le cas ou la connexion échouerait, il redeviendrait actif (comportement par défaut).</p>
<p>Rappel: Pour le moment, nous sommes toujours branchés sur l'interface de programmation, qui fournit l'alimentation et la conversion série, mais ne permet que de dialoguer avec le PC. Maintenant que le wifi est prêt, il va nous falloir préparer la carte de pilotage de l'imprimante et son firmware pour recevoir le Wifi...</p>
<h4>Paramétrage de Marlin</h4>
<p>Le paramétrage de Marlin s'effectue dans le fichier configuration.h. Comme le paramétrage général a déjà été abordé dans un autre article pou rune SKR 1.3 (<a href="https://civade.com/post/2019/07/10/Mise-%C3%A0-jour-d-un-clone-d-Ultimaker-1-avec-Marlin-2-SKR-1.3-TMC2130">https://www.civade.com/post/2019/07/10/Mise-%C3%A0-jour-d-un-clone-d-Ultimaker-1-avec-Marlin-2-SKR-1.3-TMC2130</a> ), il ne sera pas détaillé ici.</p>
<p>Les 2 directives concernées sont <code>SERIAL_PORT</code> et <code>SERIAL_PORT_2</code>. Il est conseillé de mettre la vitesse du port à 250000 bauds avec <code>#define BAUDRATE 250000</code> .</p>
<p>En fonction de la carte choisie, le nombre de ports série peut changer. Sur les SKR 1.3 ou 1.4, qui disposent d'un processeur LPC1768 ou LPC1769, il peut y avoir jusqu'à 3 liaisons série. Aux chapitres précédents nous avons appris à comprendre comment choisir une configuration qui satisfasse les caractéristiques matérielles et les attendus.</p>
<h5>Sur SKR 1.4</h5>
<p>Je vais partir sur un cas ou je veux le Wifi, la série USB pour brancher sur l'ordinateur et un afficheur LCD en mode émulation. Ceci nous donnera donc :</p>
<pre>
#define SERIAL_PORT -1 // support du port série sur l'USB
#define SERIAL_PORT_2 3 // support du wifi sur le connecteur spécifique de la carte.
#define BAUDRATE 250000
#define MOTHERBOARD BOARD_BTT_SKR_V1_4_TURBO
..
#define EEPROM_SETTINGS
#define SDSUPPORT
#define INDIVIDUAL_AXIS_HOMING_MENU
#define SPEAKER
#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER
</pre>
<p>Malheureusement, il y un bug dans le framework Arduino sur LPC qui empêche d’utiliser le port série 3 sur les bonnes broches. Pour le corriger, je vous recommande de faire une première compilation, qui va télécharger tous les éléments requis du framework, puis ensuite d'éditer les fichiers suivants (coller le chemin avec la variable %homepath% dans la barre d'adresse de l'explorateur de fichiers...) :</p>
<ul>
<li>%HOMEPATH%\.platformio\packages\framework-arduino-lpc176x\cores\arduino/HardwareSerial.h</li>
<li>%HOMEPATH%\.platformio\packages\framework-arduino-lpc176x@0.1.3\cores\arduino/HardwareSerial.h</li>
</ul>
<p>Dans ces deux fichiers, il faut rechercher le texte <code>else if (UARTx == LPC_UART3)</code> et modifier en dessous comme suit:</p>
<pre>
} else if (UARTx == LPC_UART3) {
// Initialize UART2 pin connect
PinCfg.Funcnum = 3; //was 1
PinCfg.OpenDrain = 0;
PinCfg.Pinmode = 0;
PinCfg.Pinnum = 28; //was 0
PinCfg.Portnum = 4; //was 0
PINSEL_ConfigPin(&PinCfg);
PinCfg.Pinnum = 29; // was 1
PINSEL_ConfigPin(&PinCfg);
}
</pre>
<p>A noter que cette manipulation est nécessaire à l'heure de l'écriture de cet article. Toutefois, il semblerait que le bug ait été pris en compte par les développeurs et que les futures versions de l'environnement de compilation Arduino pour LPC176x prévoient que l'affectation du port série 3 soit configurable. La directive qui sera à ajouter dans Platformio.ini sera <code>-DLPC_PINCFG_UART3_P4_28</code> dans les <code>build_flags</code> de <code><a href="https://civade.com/post/2020/09/22/common_LPC" title="common_LPC">common_LPC</a></code> .</p>
<p>Bien sur il faudra préciser le processeur à utliser dans le fichier plaformio.ini (default_envs = LPC1769 pour SKR 1.4 Turbo, et default_envs = LPC1768 pour SKR 1.4). Après recompilation et flashage du programme, Marlin devrait communiquer avec l'interface Wifi. Il est temps de la monter dans le connecteur réservé à cet effet !</p>
<h5>Sur SKR 1.3</h5>
<p>Ici, nous allons choisir d'avoir le série sur le port USB actif, un afficheur LCD en mode émulé (ou un reprap discount graphic lcd controler), et la liaison wifi branchée à la place de l'écran TFT, puisque je le rappelle il n'y a pas d'autre liaison disponible que la Serial 0 sur cette carte.</p>
<pre>
#define SERIAL_PORT -1 // support du port série sur l'USB
#define SERIAL_PORT_2 0 // support du wifi sur le connecteur du lcd tft ou AUX 1.
#define BAUDRATE 250000
#define MOTHERBOARD BOARD_BTT_SKR_V1_3
..
#define EEPROM_SETTINGS
#define SDSUPPORT
#define INDIVIDUAL_AXIS_HOMING_MENU
#define SPEAKER
#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER
</pre>
<p>Ici, pas besoin de modifier l'environnement Arduino, puisque la liaison série zéro est parfaitement supportée. Par contre, il va falloir faire un peu de cablage pour raccorder l'ESP01s à la SKR 1.3.</p>
<p>Bien qu'en russe, un tuto avec des belles images explique bien la manip : <a href="https://3dtoday.ru/blogs/bublegum/bigtreetech-skr-v13-esp-01s-prostoy-sposob-podklyuchit-wifi">https://3dtoday.ru/blogs/bublegum/bigtreetech-skr-v13-esp-01s-prostoy-sposob-podklyuchit-wifi</a> .</p>
<p>Il faudra préciser le processeur à utiliser dans le fichier plaformio.ini (default_envs = LPC1768 pour SKR 1.3) avant de recompiler le projet et de l'envoyer sur la carte.</p>
<h5>Tests</h5>
<p>Il y a plusieurs moyens de vérifier que la communication avec la carte Wifi est fonctionnelle. Lorsque l'on est en affichage émulé ou connecté à un reprap discount graphic lcd controler, dès la communication wifi établie, l'afficheur montre l'adresse ip associée à la carte :</p>
<p><a href="https://civade.com/images/MarlinWifi/IMG_2706.JPG" title="IMG_2706.JPG, sept. 2020"><img src="https://civade.com/images/MarlinWifi/.IMG_2706_m.jpg" alt="IMG_2706.JPG, sept. 2020"></a></p>
<p>Une autre façon de le vérifier, ou si on est en mode tft, est de passer par l'interface wifi elle même. Comme nous l'avons testée avant, associée dans notre réseau, nous en connaissons l'adresse.</p>
<p>Il suffit donc de se connecter dessu avec un navigateur web, cliquer sur "imprimante" (1), l’icône de rechargement des valeurs de configuration (2) et ces valeurs devraient s'afficher en dessous (3).</p>
<p><a href="https://civade.com/images/MarlinWifi/2020-09-26_05_35_11-Marlin2skr1.4turbo_-<strong>C</strong>Users_jpcivade_Documents_PlatformIO_Projects_Marlin2skr.png" title="2020-09-26 05_35_11-Marlin2skr1.4turbo - [C__Users_jpcivade_Documents_PlatformIO_Projects_Marlin2skr.png, sept. 2020"><img src="https://civade.com/images/MarlinWifi/.2020-09-26_05_35_11-Marlin2skr1.4turbo_-__C__Users_jpcivade_Documents_PlatformIO_Projects_Marlin2skr_m.png" alt="2020-09-26 05_35_11-Marlin2skr1.4turbo - [C__Users_jpcivade_Documents_PlatformIO_Projects_Marlin2skr.png, sept. 2020"></a></p>
<h3>Conclusion</h3>
<p>L'article est long car je ne voulais pas faire un simple tuto, ou on execute pas à pas, on ne comprend pas ce qu'on fait, et si cela marche, on ne sait pas vraiment pourquoi. J'espère que la méthodo complète permettra à d'autres d'adapter à leur propres cartes ou besoins.</p>
<p>A noter que ESP3D supportant aussi d'autres firmwares comme Smoothieware, GRBL ou Repetier (en le configurant dans "Enregistrez le firmware de base de l'imprimante"), il devrait être facile d'adapter à votre propre besoin.</p>
<h3>Fixups</h3>
<p>Si sur le LCD de l'imprimante l'adresse de l'imprimante n'apparait pas, c'est peut être que l'ESP met moins de temps à se resetter que Marlin, surtout sur les cartes à bases de LPC176x. En effet, le microcontrôleur vérifie sur la car SD si il n'y a pas de mise à jour, ce qui peut prendre du temps..</p>
<p>C'est assez facile à corriger sur le firmware ESP3D, en ajoutant un délai avant connexion du port série. Cela se fait dans esp3d.ino, il faut remplacer</p>
<pre>
void setup()
{
myesp3d.begin();
}
</pre>
<p>Par</p>
<pre>
void setup()
{
myesp3d.begin(15000); // jpc wait 15 seconds
}
</pre>https://civade.com/post/2020/09/22/Ajouter-le-support-du-Wifi-sur-une-imprimante-3D-fonctionnant-avec-Marlin-2#comment-formhttps://civade.com/feed/atom/comments/105Découpe laser CO2 K40 : Réalisation d'un lit motoriséurn:md5:609a182cf62aff05c7ff2815164904282020-08-23T22:09:00+02:002024-02-28T16:04:47+01:00jphiMachines à commande numériquesDIYGeekK40Laser<p>Ce billet fait suite au premier dans lequel j'ai passé en revue les modifications possibles et celles que j'ai réalisées sur une machine de découpe laser très populaire : la K40.
Il passe en revue la conception d'un nouveau lit motorisé original, avec son panneau de commande.</p> <p><a href="https://civade.com/images/k40/k40_bed1.png" title="k40 bed1.png, août 2020"><img src="https://civade.com/images/k40/.k40_bed1_m.png" alt="k40 bed1.png, août 2020"></a></p>
<p>On commence par une présentation du proto?</p>
<iframe width="800" height="550" src="https://www.youtube.com/embed/w87eyRmCawQ" title="Réalisation d'un lit piloté pour découpe laser K40 (A4 / 40W CO2)" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
<h3>Cahier des charges</h3>
<p><strong>L'existant :</strong></p>
<p>Le lit d'origine de la K40 a tous les défauts du monde. En effet il est à focale fixe et conçu pour graver. Dès que l'on découpe, ce n'est pas focalisé au mieux. De plus, le dispositif de bridage de brut que l'on trouve dessus (l'espèce de poignée en tôle a des ressorts pour bloquer une pièce) est bien trop petit au regard des capacités de la machine. Du coup, on ne peut mettre des pièces épaisses que dans ce trou de 8X15cm, et pas sur toute la surface de travail.</p>
<p>Une vue du lit d'origine de la K40 :</p>
<p><a href="https://civade.com/images/k40/bedk40.jpg" title="bedk40.jpg, août 2020"><img src="https://civade.com/images/k40/.bedk40_m.jpg" alt="bedk40.jpg, août 2020"></a></p>
<p>Cette simple plaque en tôle maintenue à hauteur par des colonnettes par rapport au fond. Ces dernières ne sont pas placées au bon endroit par rapport au châssis X/Y et sont montées de travers pour que cela puisse tenir... C'est très moche.</p>
<p><strong>Les addons commerciaux?</strong></p>
<p>Bien sur il est toujours possible d'acheter la table réglable de Lightobject (https://www.lightobject.com/K40-Upgrade-Parts/Power-Z-Table-Bed-Kit-for-K40-Small-Laser-Machine) qui est superbe et semble bien fabriquée, mais coute 200 USD. Il en existe d'autres dans le même genre et dans les mêmes fourchettes de prix. Or comme dit dans mon précédent billet, il ne me semble pas logique d'investir 2 ou 3X le prix de la machine pour la mettre à jour. Autant acheter une machine beaucoup plus grande à 1000 ou 1500 euros directement...</p>
<p><strong>Les réalisations des Makers?</strong></p>
<p>Lorsque j'ai regardé ce que les makers avaient fait sur leur K40, j'ai pu noter que certains découpaient le fond de leur machine afin que le lit puisse descendre très en dessous. Bien que ceci permette de graver des pièces existantes beaucoup plus hautes, ce n'est pas ce que je souhaitais faire et ce pour 2 raisons :</p>
<ul>
<li>Cela fait une modification importante de la machine qui oblige à modifier le boitier (défonce du fond, fabrication d'une allonge du caisson, etc..).</li>
<li>Je l'utiliserai le plus fréquemment en découpe et gravure sur des matériaux classiques (contreplaqué, balsa, plexi...) et non sur des pièces existantes. Si le cas se présentais, j'irai dans l'un des fablabs amis autour de mon domicile pour trouver une machine de plus grande envergure.</li>
</ul>
<p>Par ailleurs, certains ont réalisé les leurs avec des solutions très simples (manuelles) grâce à de simples tiges filetées indépendantes aux 4 coins. Pas cher, c'est certes fonctionnel, mais nécessite une calibration manuelle des 4 axes à chaque fois que l'on change d'épaisseur de matériau. D'autres encore on fait en sorte (avec une courroie) de lier ces 4 axes pour qu'ils montent en même temps, à la main en tournant l'un des axes. C'est beaucoup mieux, mais à nouveau c'est à régler à chaque fois avec les risques d'erreurs qui vont avec.... Bien qu'il y ait des solutions plutôt sympa, elle ne cadraient pas tout à fait avec ce que je voyais. J'ai donc décidé de développer la mienne.</p>
<p><strong>A propos de ces histoires de focale...</strong></p>
<p>La K40 est munie d'origine d'une lentille de 2 pouces (2''), soit un plan focal à 50.8mm de la lentille. Mais qu'est ce qu'il faut comprendre?</p>
<p>Si l'on est bien focalisé, c'est à dire avec la surface de la pièce à d=distance focale de la lentile, plus la focale est longue :</p>
<ul>
<li>Plus le spot est gros,</li>
<li>En conséquence, la gravure manquera de détail</li>
<li>En contrepartie la profondeur de champ sera plus grande</li>
<li>L'angle incident sur la découpe sera faible</li>
<li>Les découpes auront des flancs plus perpendiculaires à la surface du matériau.</li>
</ul>
<p>Plus la focale est petite :</p>
<ul>
<li>Plus le spot est petit / précis</li>
<li>En conséquence meilleure sera la finesse de gravure</li>
<li>En contrepartie, la profondeur de champ sera plus faible</li>
<li>L'angle incident sur le bord de la découpe sera plus grand</li>
<li>En conséquence les découpes auront des flancs coniques (si focalisé sur la surface), ou en forme de diabolo (si focalisé dans le matériau)</li>
</ul>
<p>On peut voir sur le schéma suivant, l'explication de la distance focale et de la profondeur de champs.</p>
<p><a href="https://civade.com/images/k40/focale.png" title="focale.png, août 2020"><img src="https://civade.com/images/k40/.focale_m.png" alt="focale.png, août 2020"></a></p>
<p>Un autre petit schéma explique l'angle de coupe en fonction de la focale. On voit bien que plus la focale est longue et plus le trait de coupe sera perpendiculaire au plan :</p>
<p><a href="https://civade.com/images/k40/angle.png" title="angle.png, août 2020"><img src="https://civade.com/images/k40/.angle_m.png" alt="angle.png, août 2020"></a></p>
<p>Avec une optique de 1.5'', on dispose d'une profondeur de champ très faible, mais une meilleure définition du spot, qui va permettre de faire des gravure beaucoup plus fines. Parfait pour la gravure, ce sera pratiquement inutilisable en découpe pour des épaisseurs supérieures à 2/3 mm.</p>
<p>Avec une optique de 4'', on disposera d'un spot plus gros, mais d'une profondeur de champ plus grande qui permettra de couper sans effet de cône sur le bord de la coupe. Parfait pour la découpe, les gravures seront pratiquement inexploitables...</p>
<p>2<em> est un compromis qui permettra de faire des gravures correctes. Même chose pour la découpe tant que l'on restera sur des épaisseurs relativement faibles (5/6mm). Ça tombe bien car on ne pourra pas aller beaucoup plus loin avec 40W laser... et c'est avec une 2</em> que la K40 est livrée...</p>
<p>Si l'on découpe en focalisant à la surface du matériau, on aura néanmoins une coupe avec un léger angle (de l'ordre de 1 à 1.5 degrés) qui sera bien visible à l'oeuil nu. Même avec du 2'', et malgré la profondeur de champ, il reste souhaitable en découpe de décaler le point focal à 1/2 l'épaisseur du matériau. Ceci permettra de minimiser l'effet de 'cône' en le transformant en un 'diabolo' moitié moins large :</p>
<p><a href="https://civade.com/images/k40/milieu.png" title="milieu.png, août 2020"><img src="https://civade.com/images/k40/.milieu_m.png" alt="milieu.png, août 2020"></a></p>
<p><strong>Mes exigences :</strong></p>
<p>Il me semblait donc plus intéressant de faire un bed motorisé et d'y adjoindre une prise d'origine mécanique ou électronique, avec un afficheur et un encodeur de panneau pour avoir une interface utilisateur très simple permettant de définir :</p>
<ul>
<li>L'épaisseur du matériau en mm jusqu'au dixième (ex: 5.1mm).</li>
<li>Le mode de réglage (découpe / gravure) qui agira sur la focalisation à la surface du matériau (gravure) ou à mi chemin dans le matériau (découpe).</li>
<li>L'offset éventuel par rapport à la surface de la table, pour graver/redécouper une pièce déjà existante, d'une épaisseur supérieure à celle du matériau (ex : boite).</li>
<li>Et surtout la distance entre le fin de course d'origine et le zéro focal, et qu'elle soit mémorisable.</li>
</ul>
<p>L'idée est de prérégler le lit (position retrouvable grâce à un fin de course) de façon à ce que le zéro soit à la distance focale, et ensuite de jouer uniquement le mode (découpe / gravure), l'épaisseur du matériau, et l'éventuel décalage de la surface à couper/graver par rapport au lit par une interface utilisateur simple. Terminé les cales d'épaisseur et autres pieds à coulisses....</p>
<p>Autres contraintes :</p>
<ul>
<li>Une Arduino, un afficheur OLED (128X32 pixels) et un encodeur de panneau feront très bien le job...</li>
<li>Je veux pouvoir changer l'optique pour passer à 1.5'' si je veux faire des gravures fines.</li>
<li>Je ne souhaitais pas que la courroie ou le moteur puissent être dans le champ du laser, même très en dessous. j'ai en effet vu plusieurs tables artisanales ou le tendeur de courroie faisait revenir la courroie à l'intérieur de la zone touchable par le laser. Certes, étant très en dessous, il est défocalisé et n'a plus beaucoup de puissance, mais je ne souhaitais pas tenter le diable et risquer de blesser la courroie.</li>
</ul>
<p>Même remarque avec les pièces imprimées en 3D, qui devraient être en dehors de la portée du laser.</p>
<ul>
<li>Les 4 axes aux 4 angles devront bouger d'un mouvement synchrone grâce à une courroie crantée</li>
<li>Un tendeur de courroie simple devra être présent.</li>
<li>L'ensemble lit devrait être le moins épais possible afin de garder la plus grande course utile en Z.</li>
<li>Je dois pouvoir monter n'importe quel matériau de support sur le lite, et notamment du nid d'abeille si j'arrive à en trouver (évolution future)</li>
<li>La réalisation devra utiliser le max de pièces standard, de façon à éviter les usinages particuliers.</li>
<li>Il devra être possible de faire évoluer l'électronique pour remplacer le fin de course + réglages, avec un capteur LIDAR (light detection and ranging) / TOF (time of flight) pour mesurer à partir de la tête directement la distance de la pièce. Bien que mes premiers essais avec du VL6180X ne soient pas super concluants ( tolérance de mesure +- 1mm à cause d'une dérive dans le temps), je ne désespère pas d'arriver à le faire marcher. En terme d'usage ce serai vraiment un plus puisqu'il suffirait de préciser le mode (découpe / gravure) et l'épaisseur du matériau, le reste se faisant automatiquement grâce au capteur...</li>
<li>L'électronique devra consommer le moins possible, de façon à pouvoir être raccordée sur l'alimentation interne de la K40 qui fournit du 5 et du 12V.</li>
</ul>
<h3>Conception</h3>
<p>La conception a été faite sur Sketchup. Voici le fichier Sketchup et des exports STL des pièces : <a href="https://civade.com/images/k40/SketchupEtPiecesSTL.zip">SketchupEtPiecesSTL.zip</a></p>
<p>Voici une vue d'ensemble :</p>
<p><a href="https://civade.com/images/k40/k40_bed1.png" title="k40 bed1.png, août 2020"><img src="https://civade.com/images/k40/.k40_bed1_m.png" alt="k40 bed1.png, août 2020"></a></p>
<p>L'ensemble est réalisé sur la base d'un profilé aluminium carré 16X16 trouvé chez Leroy merlin. Des pièces imprimées en 3D viennent s'emboiter dessus et assurer pour les pièces du dessus la fixation de l'écrou noyé, et pour les pièces du dessous la liaison pivot.</p>
<p>Le support moteur est lui même emboitable sur le profilé. 2 poulies lisses sur roulement permettent d'enrouler au maximum la courroie autour de la poulie crantée GT2 qui assure la transmission. Le moteur est monté dans des trous oblongs qui permettent de gérer la tension de courroie. Une vis de blocage empêche l'ensemble moteur de se translater sur la barre en aluminium à cause du couple. Tout est démontable.</p>
<p><a href="https://civade.com/images/k40/k40_bed2.png" title="k40 bed2.png, août 2020"><img src="https://civade.com/images/k40/.k40_bed2_m.png" alt="k40 bed2.png, août 2020"></a></p>
<p>La transmission du mouvement vertical est assurée par des tiges filetées de 5 au pas de 0.8mm. Cette vis est montée dans les coins inférieurs en sandwich avec 2 roulements MR105ZZ, et 2 écrous bas profil M5 montés au frein filet pour éviter leur rotation intempestive par rapport à la vis. Un écrou M5 standard est monté dans les cois supérieurs pour assurer la montée / descente du lit. Un poulie GT2 20 dents axe de 5mm assure la transmission du mouvement. Voici une vue par transparence :</p>
<p><a href="https://civade.com/images/k40/k40_bed3.png" title="k40 bed3.png, août 2020"><img src="https://civade.com/images/k40/.k40_bed3_m.png" alt="k40 bed3.png, août 2020"></a></p>
<p>Le fin de course (ici non représenté) est monté à la colle chaude sur le coté du support moteur. En effet, vu la multiplicité des formes, il ne m'a pas semblé utile de prévoir des trous de fixation, mais plutôt de garder un système de fixation souple et démontable, et pour cela la colle chaude c'est bien...</p>
<p><strong>Nomenclature des composants :</strong></p>
<ul>
<li>4 vis M3X8 (fixation moteur)</li>
<li>1 vis auto-foreuse 3X10 (fixation ensemble moteur sur profilé alu)</li>
<li>8 roulements MR105ZZ (5X10X4)</li>
<li>1 moteur pas à pas Nema 17 (ex: Wantai 42BYGHW609 de 1.7A disponible chez Aliexpress https://fr.aliexpress.com/premium/42BYGHW609.html)</li>
<li>1 barre de profilé carré 16X16 (ex: Leroy Merlin https://www.leroymerlin.fr/v3/p/produits/tube-carre-aluminium-brut-argent-l-2-6-m-x-l-1-6-cm-x-h-1-6-cm-e1501604693 )</li>
<li>Plaque d'acier déployé 50X25 maille de 10mm (ex: leroy Merlin https://www.leroymerlin.fr/v3/p/produits/tole-acier-metal-deploye-brut-gris-l-25-x-l-50-cm-ep-2-2-mm-e19281)</li>
<li>4 longueurs de 100 mm de tige filetée 5mm</li>
<li>8 écrous HM5 (M5 bas profil)</li>
<li>4 écrous M5 (standard)</li>
<li>Courroie GT2 1240mm en 6mm de large (ex : https://fr.aliexpress.com/item/4000230359952.html )</li>
<li>5 Poulies GT2 20 dents, diamètre intérieur 5mm (standard pour les imprimantes 3D)</li>
<li>Contrôleur pas à pas TB600 ( ex : https://www.banggood.com/TB6600-Upgraded-Stepper-Motor-Driver-Controller-for-4A-940V-TTL-32-Micro-Step-2-or-4-Phase-of-4257-Stepper-Motor-3D-Printer-CNC-Part-p-1453122.html )</li>
<li>Arduino Pro micro (à base d'ATMEGA 32U4, ex : https://fr.aliexpress.com/item/32865147071.html ) ou Leonardo, ou Arduino Micro</li>
<li>Écran Oled 128X32 (ex : https://fr.aliexpress.com/premium/oled-128x32.html )</li>
<li>Encodeur de panneau (ex: https://fr.aliexpress.com/item/32873198060.html )</li>
<li>Switch de fin de course (ex : https://fr.aliexpress.com/premium/limit-switch.html )</li>
<li>Frein filet ou colle cyanoacrylate.</li>
</ul>
<p><strong>Cout total : 60 euros max</strong></p>
<h3>Électronique</h3>
<p>L'électronique est assez simple puisqu'il n'y a à raccorder que :</p>
<ul>
<li>Le contrôleur moteur pas à pas (3 sorties)</li>
<li>L'encodeur de panneau (2 entrées)</li>
<li>Le poussoir de l'encodeur de panneau (1 entrée)</li>
<li>Le fin de course (1 entrée)</li>
<li>L'écran (2 sorties)</li>
</ul>
<p>Le contrôleur pas à pas nécessite 3 sorties: Step (avance d'un pas), Dir (direction CW ou CCW) et Ena (Enable). Cette dernière sortie est optionnelle, mais j'ai souhaité implémenter la désactivation du moteur dès lors que l'on ne commande pas le lit. Ceci a pour objectif de minimiser la consommation du dispositif, car je compte le raccorder sur l'alimentation de la K40 qui fournit un 5V et un 12V. Elle est dimensionnée pour l'électronique interne et ne supportera peut être pa un autre moteur. Or au moment ou l'on règle le lit, les autres moteurs ne sont pas commandés. SI le lit est coupé lorsque l'on découpe, il n'y aura pas de surconsommation.</p>
<p>L'encodeur de panneau a 5 broches. Les 2 séparées sont pour l'interrupteur à pourssoirr. Les 3 autres sont pour les 2 sorties A et B avec un point milieu qui devra être raccordé à la masse. A noter que la bibliothèque utilisée pour gérer l'encodeur nécessite des entrées sorties qui acceptent des interruptions. Sur les Arduino Pro Micro / Micro ou Leonardo, seules les broches 0, 1, 2 et 3 possèdent ces caractéristiques. Les 2 & 3 étant aussi le bus I2C qui sera utilisé pour communiquer avec l'écran, il ne nous reste que 0(RX) et 1(TX) , qui sont aussi la liaison série. Ce n'est pas très grave car nous n'allons pas en avoir besoin. A noter que si sur le proto que vous câblerez, l'encodeur semble tourner à l'envers, c'est qu'il faut permuter les entrées A et B.</p>
<p>L'écran est connecté en I2C sur les broches 2 (SDA) et 3 (CLK).</p>
<p>En voici le schéma :</p>
<p><a href="https://civade.com/images/k40/k40_bb.png" title="k40_bb.png, août 2020"><img src="https://civade.com/images/k40/.k40_bb_m.png" alt="k40_bb.png, août 2020"></a></p>
<p>Le contrôleur pas à pas n'est pas représenté, mais il est facile de le raccorder:</p>
<ul>
<li>Step, Direction et Ena sur les entrées '-' éponymes, les entrées + au 5V,</li>
<li>Un enroulement du moteur pas à pas sur A-/A+, l'autre sur B-/B+</li>
<li>Et enfin l'alimentation 12V sur GND/VCC</li>
</ul>
<p><a href="https://civade.com/images/k40/tb6600.jpg" title="tb6600.jpg, août 2020"><img src="https://civade.com/images/k40/.tb6600_m.jpg" alt="tb6600.jpg, août 2020"></a></p>
<h3>Logiciel</h3>
<p>Le logiciel a été développé autour de plusieurs bibliothèques Arduino afin de gagner du temps de développement :</p>
<ul>
<li>Accelstepper pour la gestion du moteur pas à pas avec accélération</li>
<li>ssd1306 d'Adafruit pour la gestion de l'afficheur</li>
<li>AdagruitGFX, nécessaire également pour l'afficheur graphique</li>
<li>Encoder library : gère un encodeur de panneau sous interruptions</li>
<li>Ezbutton : gère des boutons, également sous interruptions.</li>
</ul>
<p>Au boot, un écran de démarrage affiche la version du logiciel pendant 2 secondes, puis.</p>
<ul>
<li>Le firmware fait la recherche d'orgine en déplaçant le lit vers le bas tant que le switch de fin de course(Home) n'est pas activé. Pendant cette phase, l'écran affiche "Origine".</li>
<li>Une fois l'origine prise, le lit se déplace de setting.fBedOffset vers le haut, puis affiche "Machine a zero" pour 1 seconde, efface l'écran et coupe le moteur.</li>
</ul>
<pre></pre>
<p>L'écran suivant est l'écran principal. Il affiche 2 lignes. Un appui court sur l'encodeur permet de changer de paramètre actif. La valeur du paramètre peut être changée en tournant l'encodeur. Décrémenter en tournant dans le sens inverse des aiguilles d'une montre, et incrémenter dans le sens des aiguilles d'une montre.</p>
<ul>
<li>Le paramètre "Cut" est pour déterminer si les réglages sont pour la découpe (Oui) ou la gravure (Non)</li>
<li>Le paramètre "Epais" est pour déterminer l'épaisseur du matériau. Un pas d'encodeur = 0.1mm.</li>
</ul>
<pre>
-------------
| Cut: Oui |
| Epais:05.0 |
-------------
</pre>
<p>Une pression longue sur l'encodeur permet d'aller au menu de paramétrage.</p>
<p>Il est constitué de 2 lignes, chacune avec un a paramètre différent. Une pression courte permet de passer de l'un à l'autre. La valeur du paramètre se change en tournant l'encodeur.</p>
<ul>
<li>Le paramètre "Decal" permet de régler un décalage entre la surface du lit et le bas de la pièce à couper. C'est pratique par exemple pour recouper ou graver une boite en contreplaqué déjà assemblée pour y faire une gravure ou un trou supplémentaire par exemple.</li>
<li>Le paramètre "ZeroB" est pour ajouter la distance entre le fin de course d'origine et le zéro focal (2'' = 50.8mm entre la lentille et la surface du lit)</li>
</ul>
<pre>
-------------
| Decal:00.0 |
| ZeroB:08.0 |
-------------
</pre>
<p>Une pression longue sur l'encodeur permet de quitter l'écran de paramétrage, en sauvant tous les réglages dans la mémoire flash, et ramène l'utilisateur dans l'écran principal.</p>
<p>Merci de noter que les 4 paramètres sont sauvés quand on quitte l'écran d'accueil, mais seulement à ce moment afin de limiter le nombre d'écriture dans l'e2prom.</p>
<p><ins><strong>Point important!!!!</strong></ins></p>
<p>Lors du premier lancement du soft, il attend une eeprom vide avec que des zero, ce qui n'est pas toujours le cas même sur une arduino flambant neuve. Avant de flasher le code ci dessous, je vous recommande de flasher et lancer un programme d'effacement de l'Eeprom (ex : https://www.arduino.cc/en/Tutorial/LibraryExamples/EEPROMClear ) qui va vous mettre la mémoire dans l'état attendu.</p>
<p>Voici le logiciel que j'ai développé pour piloter le lit, pour environnement Arduino : <a href="https://civade.com/images/k40/_bedK40.zip">_bedK40.zip</a>. Il suffit de le décompresser dans votre dossier "Arduino" et le téléverser.</p>
<p><strong>Nota: si lors du lancement, le programme fait bien la recherche d'origine puis affiche "Rising up -1073741.8" et actionne indéfiniment le moteur, c'est que vous n'êtes pas passé par la phase de mise à zero de l'eeprom décrite ci dessus!</strong></p>
<h3>Montage et réglages</h3>
<p><strong>Assemblage:</strong></p>
<p>Rien de particulier à dire sur l'assemblage, si ce n'est qu'il vaut mieux mesurer au pied à coulisse entre les profilés alu du haut et du bas, sur les quatre côtés, et retoucher le réglage de chaque vis avant de serrer les 4 poulies crantées. Ainsi le dessus sera parfaitement parallèle au dessous.</p>
<p><strong>Montage dans la laser:</strong></p>
<p>Pour monter le lit il faut le descendre à mi course sinon ça coince quand on le présente. Le moteur doit être au fond à droite, il y a la place. Ensuite, le mettre à égale distance des profilés gauche et droite, lui faire touche le moteur pas à pas à l'avant.</p>
<p>J'ai choisi de ne pas faire de trous en plus dans le châssis, mais de fixer le lit avec des pads autocollants de 25X25. Ces pads, munis d'adhésifs 3M, collent très bien et assurent une fixation durable mais démontable (en sacrifiant les pads). Ils font 3mm d'épaisseur, ce qui fait qu'en les fixant sur les barres aluminium, les pièces plastiques ne sont pas en contact et la référence est sur les barres aluminium.</p>
<p>Les câbles peuvent être passé à l'arrière droit de la machine vers le compartiment électronique.</p>
<p>Exemple de pads : <a href="https://www.banggood.com/fr/10Pcs-Remote-Control-Helicopter-Spare-Parts-Sponge-Double-Sided-3m-Tape-p-1403006.html">https://www.banggood.com/fr/10Pcs-Remote-Control-Helicopter-Spare-Parts-Sponge-Double-Sided-3m-Tape-p-1403006.html</a></p>
<p><strong>Réglage:</strong></p>
<p>Il n'est pas aisé de mesurer exactement la distance attendue de 50.8mm entre la surface du lit et la lentille, cette dernière étant noyée dans le porte lentille en aluminium.
L'expérimentation reste la façon la plus facile pour trouver ce réglage. Pour ce faire:</p>
<ul>
<li>Mettre "Cut" à "Non et "Decal" à zero.</li>
<li>Prendre un matériau quelconque (ex : contreplaqué), mesurer son épaisseur au pied à coulisse et le reporter dans le réglage "Epais".</li>
<li>Régler ZeroB pour avoir une distance approximative de 45mm entre la position théorique de la lentille et le lit (avec un réglet)</li>
<li>Tracer une ligne verticale avec le laser, décaler le brut pour refaire une gravure (ex : vers la droite) et mettez le lit 1mm plus bas en réglant zeroB</li>
<li>.. et répéter l'opération 10 fois.</li>
</ul>
<p>Vous obtiendrez un motif constitué de lignes verticales plus ou moins larges. La plus fine désigne la bonne altitude de la tête, que vous n'aurez plus qu'à reporter dans le réglage ZeroB correspondant.</p>
<p>Ceci n'est à faire qu'une fois à moins que vous ne changiez la tête laser, la focale de la lentille (par exemple pour mettre une lentille de 1.5'') ou que vous ne changiez complètement la calibration optique.</p>
<h3>En ensuite?</h3>
<p>Il peut être judicieux de refaire une face avant à la découpe laser afin d'intégrer le nouvel écran, l'encodeur, mais aussi le M/A de l'assistance d'air, de l'éclairage intérieur et pourquoi pas aussi une visu de la température d'eau.
A titre d'exemple, voici un visuel de ce que j'ai réalisé :</p>
<p><a href="https://civade.com/images/k40/NewPanel.JPG" title="NewPanel.JPG, août 2020"><img src="https://civade.com/images/k40/.NewPanel_m.jpg" alt="NewPanel.JPG, août 2020"></a></p>
<p>Et voici le ficher SVG qui a servi à la découpe (<a href="https://civade.com/images/k40/panel_jpc.zip">téléchargeable ici</a>) :</p>
<p><a href="https://civade.com/images/k40/panel_jpc.svg" title="panel jpc.svg, août 2020"><img src="https://civade.com/images/k40/panel_jpc.svg" alt="panel jpc.svg, août 2020"></a></p>Découpe laser CO2 K40 - Améliorations / hacking de la machineurn:md5:6700817d9c53c23ea2108da2d24e3ea32020-08-23T07:47:00+02:002024-02-26T17:50:43+01:00jphiMachines à commande numériquesK40<p><strong></strong>Ayant fait l'acquisition d'occasion d'une petite découpe laser chinoise de 40W au format A4, traditionnellement appelée "K40", un rapide tour du propriétaire a montré que cette machine représente un bon potentiel, mais nécessite quelques améliorations pour être parfaitement fonctionnelle. Une grosse communauté existe sur cette machine, aussi pas mal de modifications ont été testées. Profitons de cette aubaine pour faire le tour de ce qui peut être fait.</p> <p><a href="https://civade.com/images/k40/Modified_K40.JPG" title="Modified K40.JPG, août 2020"><img src="https://civade.com/images/k40/.Modified_K40_m.jpg" alt="Modified K40.JPG, août 2020"></a></p>
<h3>Introduction :</h3>
<p>Disponible sur Aliexpress et Ebay a des tarifs variables (à partir de 250 euros hors livraison), la machine de découpe laser K40 est une machine à très bas cout munie d'un tube laser de 40W, d'un lit fixe et d'un contrôleur non vectoriel.</p>
<p>Sa conception est simple, et n'a pas été modifiée depuis près d'une décennie. Les pièces détachées sensibles (tube, alimentation du laser) sont disponible à bas coût ce qui en fait une machine maintenable, tout à fait utilisable dans le monde des makers.</p>
<p>Bart Baker, que j'avais eu l'occasion de rencontrer à Toulouse dans le cadre du Fablab Festival ne s'y est d'ailleurs pas trompé puisqu'il préconisait cette machine pour les microfablabs dans une conférence à laquelle j'avais eu d'assister en 2012 et que j'avais enregistrée et publiée sur Youtube:</p>
<div class="external-media" style="margin: 1em auto; text-align: center;">
<iframe width=" 480" height="270" src="https://www.youtube.com/embed/rT_rWH6jDOA?feature=oembed" frameborder="0" allowfullscreen="allowfullscreen"></iframe>
<br /><a href="https://www.youtube.com/watch?v=rT_rWH6jDOA">Microfablabs by Bart Bakker</a>
</div>
<p>Mais cette machine a autant de défauts que de qualités. Car à ce prix, et sans avoir été revue en terme de conception depuis près d'une décennie, ses défauts la rende presque inutilisable telle que livrée:</p>
<ul>
<li><strong>DANGEREUX!!!!</strong> Aucune sécurité sur le laser qui peut être allumé, alors que le capot est ouvert (!!!)</li>
<li><strong>DANGEREUX!!!!</strong> Mécanisme d'extraction d'air catastrophique, peu puissant et pas étanche, laissant fuiter les fumées de découpe dans le local ou est installé la machine.</li>
<li>Logiciel à peine utilisable</li>
<li>Électronique ne supportant pas la modulation de la puissance du laser par logiciel, limitant les opérations de gravure (on ne peut commander le laser qu'en tout ou rien), et obligeant à séparer les opérations de gravure et de découpe en plusieurs phases séparées.</li>
<li>Lit non réglable, réservant l’utilisation de la machine à de la gravure ou découpe de matériaux peu épais</li>
<li>Pas d'assistance d'air sur la découpe</li>
<li>Supports miroirs et tête très cheap.</li>
</ul>
<p>Mais tout ceci peut se corriger assez facilement. J'ai tenté de faire un tout d'horizon des différentes modifications possibles, en quantifiant l'intérêt par rapport au cout et en expliquant mes choix.</p>
<p>Par ailleurs, j'ai tenté de rester cohérent sur la nature et le cout des modifications faites sur la machine. Il ne me semble en effet pas très logique d'acheter une machine à 250/350 euros, et d'investir 1000 euros pour la rétrofitter. J'ai en effet vu sur internet des solutions de lit réglables à 200 USD toutes faites, des gens qui refaisaient complètement la partie guidage de la machine pour la passer en A3 (à grand coup de profilés alus et de glissières à billes), voire qui reconstruisaient complètement la machine pour en faire une de beaucoup plus grande dimension en gardant juste le laser. A mon sens, cela ne présente pas d'intérêt. Il faut mieux acheter une machine à 1300 euros directement, ou tout sera prévu pour cette plus grand dimensions et la plupart des défauts auront étés corrigés. J'ai donc toujours gardé en tête le cout des modifications pour ne pas tripler le prix de la machine.</p>
<h3>Sécurité capot ouvert</h3>
<p>Sur la K40, il y a 2 boutons carrés rouge en face avant.</p>
<ul>
<li>Le premier autorise l'allumage du laser. Tant qu'il n'est pas enclenché, le laser ne s'allumera pas, même si le logiciel le demande. Nous l'appellerons marche/arrêt laser.</li>
<li>Le second sert a allumer ponctuellement le laser à la main, par exemple pour voir ou est le spot sur une pièce. Il va donc la marquer. Il dépend toutefois du bouton précédent, qui si non activé, ne permettra pas l'allumage même à la main. Nous l’appellerons test.</li>
</ul>
<p>Le problème est que lorsque le marche/arrêt est activé, le laser peut être allumé par le poussoir test ou par le logiciel que le capot soit ouvert ou fermé. S'agissant d'un laser de 40W (pour rappel, c'est dangereux pour les yeux au delà de 5 milliwatts!!), c'est une pure folie de laisser cela ainsi.</p>
<p>Il est toutefois aisé d'y remédier. Il suffit d'ajouter un interrupteur de fin de course sur le bord du capot, et de le raccorder en série avec le poussoir carré de marche/arrêt laser. Il faut câbler le fin de course pour que celui ci soit actionné (circuit fermé) lorsque le capot est fermé. Ainsi même si le marche/arrêt laser est sur marche, le laser ne s'allumera pas tant que le capot est ouvert. Les interrupteurs de fins de course ne coutent que quelques euros : <a href="https://fr.aliexpress.com/premium/limit-switch.html">https://fr.aliexpress.com/premium/limit-switch.html</a>. L'interrupteur put être collé à la colle chaude, au double face, ou même vissé après avoir pratiqué 2 trous. Un trou permet supplémentaire de passer le fil dans le compartiment électronique pour câblage.</p>
<p>Voici un exemple de montage. Ici, les 2 fils visibles en l'air ne sont pas encore raccordés, mais le seront sur un futur bandeau de leds à l'intérieur de la machine.</p>
<p><a href="https://civade.com/images/k40/securite.jpg" title="securite.jpg, août 2020"><img src="https://civade.com/images/k40/.securite_m.jpg" alt="securite.jpg, août 2020"></a></p>
<ul>
<li><strong>Intérêt</strong> : +++</li>
<li>Facilité : très facile</li>
<li><strong>Cout</strong> : Quelques euros.</li>
</ul>
<h3>Logiciel :</h3>
<p>La K40 est livrée avec un logiciel qui n'est vraiment pas terrible. Malheureusement, la carte contrôleur intégrée à la K40 a un protocole propriétaire qui ne permet pas d’utiliser des logiciels alternatifs comme Lightburn ( <a href="https://lightburnsoftware.com/">https://lightburnsoftware.com/</a> ) sans changer la carte contrôleur.</p>
<p>Un développeur indépendant a toutefois fait un super travail en investiguant sur le protocole de la machine (non documenté..) et en redéveloppant un logiciel simple nommé <strong>K40 Whisperer</strong> ( <a href="http://www.scorchworks.com/K40whisperer/k40whisperer.html">http://www.scorchworks.com/K40whisperer/k40whisperer.html</a> ), qui fonctionne très bien en compagnon avec le logiciel libre de dessin vectoriel Inkscape. Il est Open Source sous GPL V3. De nombreux tutoriels ont étés écrits sur le sujet notamment par l'auteur (ex: <a href="http://www.scorchworks.com/Blog/">http://www.scorchworks.com/Blog/</a> ). Le seul inconvénient réel de ce logiciel est de fonctionner avec un pilote basé sur LIBUSB qui rend inopérant le pilote d'origine de la machine et donc le logiciel livré avec. Pour rendre le logiciel d'origine à nouveau opérationnel, il faudra désinstaller le pilote de K40 Whisperer avant de relancer le logiciel d'origine. la procédure est décrite dans la doc. Il peut être aussi judicieux d'avoir 2 machines, l'un installée avec un logiciel et l'autre avec l'autre... ou une VM sous Linux pour Whisperer, le logiciel natif restant installé sous Windows. Cat oui, le logiciel peut aussi être installé sur Linux ou Mac OS, étant écrit en Python.</p>
<ul>
<li><strong>Intérêt</strong> : +++</li>
<li>Facilité : très facile</li>
<li><strong>Cout</strong> : 0</li>
</ul>
<h3>Optiques :</h3>
<p>Les optiques sont constituées de 3 miroirs de 20mm de diamètre et d'une lentille de 12mm de diamètre.</p>
<p>Les miroirs peuvent utiliser différentes technologies (classées du meilleur au moins bon en terme de réflectivité):</p>
<ul>
<li>Silicium plaqué or (ou Si) : Les meilleurs au niveau de la quantité de lumière réfléchie, il s'avèrent plus fragiles lors de la découpe de matériaux qui ont des régalements de fumées corrosives. Également fragiles lors du nettoyage à cause du traitement de surface et de plus doivent être nettoyés fréquemment. Utilisables jusqu'à 50W</li>
<li>Cuivre (ou miroirs Cu) : Un tout petit peu moins bon que les SI, mais plus faciles à entretenir. Bien plus chers par contre.</li>
<li>Molybdène (ou miroirs Mo) : très résistants et faciles à nettoyer, et acceptent des puissances jusqu'à 100W.</li>
<li>K9 glass: Fragiles et peu performants, c'est ce qui est livré avec la machine.</li>
</ul>
<p>Les lentilles de 12mm installées sur la K40 sont à une focale de 2<em> (50.8mm). Cela veut dire qu'il faut 50.8mm entre le plan du miroir et la pièce pour avoir un faisceau parfaitement focalisé (petit et net). C'est par défaut la seule focale montable sur la K40, le lit livré n'étant pas réglable en hauteur. Il est toutefois possible de trouver des lentilles en focale 1.5</em> (38.1mm). Je ne connais pas la technologie des lentilles livrées, mais cela ressemble à du ZnSe (Séléniure de Zinc). La lentille est dite "meniscus" à cause de sa forme qui ressemble à celle d'un ménisque, c'est à dire convexe (bombée) sur la partie supérieure, et concave (creuse) sur la partie inférieure. Il ne faut pas se tromper de sens lors du montage, faute de quoi le laser ne risquerait pas d'être focalisé. Au passage, sur ma machine, achetée d'occasion, la lentille était justement montée à l'envers. Était-ce lié au dernier démontage/nettoyage, ou l'ancien propriétaire l'utilisait réellement comme cela?</p>
<p>J'ai fait l'acquisition de 2 jeux de miroirs, l'un en Si et l'autre en Mo pour faire des tests, et de 2 lentilles ZnSe, l'une en 38.1mm et l'autre en 50.8mm. Je suis allé chez Cloudray ( <a href="https://www.cloudraylaser.com">https://www.cloudraylaser.com</a> ) qui vend également sur Ebay et Aliexpress et dispose d'une assez bonne notoriété sur les accessoires laser.</p>
<p>Attention lors du remontage à bien mettre les joints silicones coté bague de serrage et à ne pas trop serrer... sous peine de casser lentille ou miroir. Après changement des miroirs, il vaut mieux réaligner le laser, car les miroirs ne font pas tous la même épaisseur...</p>
<ul>
<li><strong>Intérêt</strong> : +++</li>
<li><strong>Facilité</strong> : très facile</li>
<li><strong>Cout</strong> : 15 à 30 euros</li>
</ul>
<h3>Tête laser / support miroirs :</h3>
<p>La tête livrée avec la K40 est assez 'cheap'. Il existe plusieurs têtes adaptables qui peuvent venir en remplacement. On peut notamment équiper d'une tête acceptant des lentilles et miroirs de plus grand diamètre. Par contre, plus la tête s'écarte en terme mécanique de celle livrée, et plus les adaptations mécaniques à faire pour le montage seront nombreuses. Il peut y avoir plusieurs intérêts à changer la tête :</p>
<ul>
<li>Disposer d'un système de réglage du miroir de la tête (fixe sur la tête d'origine du K40)</li>
<li>Disposer d'une prise pour l'assistance d'air (qu'on peut corriger sur la tête d'origine de la K40 en imprimante une simple pièce en 3D)</li>
<li>Pour certaines têtes, disposer d'une focale réglable (on déplace l'ensemble lentille verticalement), ce qui peut éviter d'avoir un lit réglable. Par contre, difficile de faire des mesure précises lors de l’ajustement de focale avec la tête.</li>
<li>Changer le diamètre de la lentille (12mm, 18mm ou 20mm), mais dans ce cas il faut pratiquement toujours refaire un support de tête pour qu'elle reste alignée avec le laser.</li>
</ul>
<p>On peut aussi changer les supports des miroirs. Cela permet de disposer de réglages plus fins sur leur orientation. Il existe d'ailleurs des kits qui combinent la tête et les 3 supports pour la K40, mais dont le prix peut allègrement dépasser les 80/100 euros.</p>
<p>A noter que les seules parties 'active" dans la tête sont la lentille et le miroir. En changeant ces derniers, on agit donc directement sur la qualité de la découpe. Le reste n'est que de la mécanique supportant ces éléments... Garder la tête d'origine est donc une option, puisque ce n'est qu'un bout d'aluminium..</p>
<p>Le changement de la tête et des supports miroirs représente un investissement non négligeable (de 30 à 100 euros selon l'option choisie). J'ai fait le choix de ne rien changer dans un premier temps (sauf lentille et miroirs, cf paragraphe précédent), car même si c'est un peu plus compliqué de régler les miroirs avec les supports d'origine (manque de précision des vis), c'est une opération que l'on ne fait pas tous les jours, et les lentilles en 12mm sont bien suffisantes pour une puissance de 40W. De plus, le changement total coutant 100 euros, c'est à mon avis hors budget d'une simple optimisation.</p>
<ul>
<li><strong>Intérêt</strong> : +</li>
<li><strong>Facilité</strong> : Moyennement facile (si montage en lieu et place) à dur (si nécessité d'adapter la mécanique)</li>
<li><strong>Cout</strong> : 30 à 100 euros selon l'option choisie.</li>
</ul>
<h3>Assistance d'air :</h3>
<p>Sur la plupart des découpes laser, la tête dispose d'un conduit permettant d'injecter de l'air, qui va venir "arroser" la zone en cours de découpe. Ceci a plusieurs bénéfices :</p>
<ul>
<li>Protéger la lentille de la pollution due aux fumées, grâce à la surpression dans la buse</li>
<li>Souffler les fumées de la zone de découpe, et ainsi permettre à toute la puissance de la lumière du laser d'être sur la pièce sans diffraction</li>
<li>Et enfin, minimiser les départs de flamme sur les matériaux sui on tendance à s'enflammer facilement (ex : balsa, carton plume, carton, etc..)</li>
<li>Limiter les effets de brulé autour d'une découpe.</li>
</ul>
<p>Malheureusement la K40 n'en est pas équipée, et la tête ne permet pas d'en mettre une. Heureusement c'est facile à régler.</p>
<p>On trouve de nombreuses buses à imprimer en 3D, qui se fixent par simple emboitement sur la tête. Il faut ensuite un tuyau de 8mm de diamètre extérieur et un petit compresseur pour faire le job. Si le tuyau ne coute pas cher (qq euros sur Ebay ou au magasin d'aquariophilie le plus proche), c'est pas toujours le cas du compresseur. Plusieurs options existent :</p>
<ul>
<li>Les pompes d'aquarium à membrane : pas trop chère (de 5 à 30 euros selon les sites), relativement silencieuse, mais n'a pas un gros débit d'air.</li>
<li>Les pompes magnétiques qui sont utilisées sur les plus grandes laser ( ex : <a href="https://fr.aliexpress.com/premium/aco328.html">https://fr.aliexpress.com/premium/aco328.html</a>). Elles sont beaucoup plus chère (de 50 à 100 euros en fonction des frais de port), ne sont pas trop bruyantes et on un bon débit. C'est cette solution que j'ai choisie avec un pompe CAV328 trouvée à 40 euros sur Amazon.</li>
<li>Les pompes 'alternatives', comme les compresseurs 12V de voiture, etc..</li>
</ul>
<p>Si le compresseur n'a pas un débit suffisant (pompe d'aquarium), il vaut mieux privilégier un dépôt d'air direct sur la zone, avec par exemple ce type de buse :</p>
<p>Source : <a href="https://www.thingiverse.com/thing:2421971">https://www.thingiverse.com/thing:2421971</a></p>
<p><a href="https://civade.com/images/k40/AirAssist1.png" title="AirAssist1.png, août 2020"><img src="https://civade.com/images/k40/.AirAssist1_m.png" alt="AirAssist1.png, août 2020"></a></p>
<p>Pour les 2 autres solutions, une buse intégrale sera préférable, car elle protégera mieux la lentille :</p>
<p>Source : <a href="https://www.youmagine.com/designs/k40-air-assist-nozzle">https://www.youmagine.com/designs/k40-air-assist-nozzle</a></p>
<p><a href="https://civade.com/images/k40/AirAssist2.png" title="AirAssist2.png, août 2020"><img src="https://civade.com/images/k40/.AirAssist2_m.png" alt="AirAssist2.png, août 2020"></a></p>
<ul>
<li><strong>Intérêt</strong>: +++</li>
<li><strong>Facilité</strong> : Très facile</li>
<li><strong>Cout</strong> : qq euros pour le tuyau, 40 euros pour la pompe, et quelques centimes pour la pièce imprimée en 3D.</li>
</ul>
<h3>Chaine guide câble :</h3>
<p>Lors de la mise en place d'une assistance d'air on se retrouve avec un tuyau en plastique qui est libre dans la machine. Il est très intéressant de mettre en place une chaine guide câble, qui évitera que le tuyau ne se balade. De plus, le guide est auto-porté et si on le place bien il ne frottera avec rien.</p>
<p>Le cout est minime (ex : <a href="https://fr.aliexpress.com/premium/drag-chain.html">https://fr.aliexpress.com/premium/drag-chain.html</a> puisqu'une 10X20 en 1 mètre ne coute que 4 euros. Une simple patte à 90 degrés en métal ou imprimée en 3D permet de la fixer sur la tête sur l'une des vis disponibles. L'autre extrémité rentre dans le compartiment électronique par le fond / droit de la machine, et peut être fixée à la paroi par 2 trous de 3mm. Il peut être nécessaire d'agrandir la déoupe déjà présente si la chaine est trop grosse. C'est ce que j'ai du faire à la dremel avec des petits disques à découper.</p>
<p>Les maillons sont dégondables, ce qui fait que l'on peut facilement adapter la longueur de la chaine à ce qui est requis. Attention a bien vérifier, lorsque la tête est en haut à gauche, que la chaine ne vienne pas obturer le trajet du laser. Autre intérêt, c'est que si par la suite on souhaite amener du câblage jusqu'à la tête, par exemple pour mettre en capteur autofocus, ou des lasers d'aide au positionnement, le trajet des câbles sera facilité, et cela fera "propre".</p>
<p>Voici ce que cela donne sur ma machine :</p>
<p><a href="https://civade.com/images/k40/dragchain.jpg" title="dragchain.jpg, août 2020"><img src="https://civade.com/images/k40/.dragchain_m.jpg" alt="dragchain.jpg, août 2020"></a></p>
<p><a href="https://civade.com/images/k40/dragchain2.jpg" title="dragchain2.jpg, août 2020"><img src="https://civade.com/images/k40/.dragchain2_m.jpg" alt="dragchain2.jpg, août 2020"></a></p>
<ul>
<li><strong>Intérêt</strong>: +++</li>
<li><strong>Facilité</strong> : Très facile</li>
<li><strong>Cout</strong> : 4 euros</li>
</ul>
<h3>Guide d'aspiration :</h3>
<p>Le guide d'aspiration est trop long de 2cm et peu gêner lors de la mise en place de l'assistance d'air. Il est presque indispensable de le recouper. Il n'est pas facile d'intervenir dessus, car il faut à minima démonter le chassis X/Y voir le guide d'aspiration lui même si l'on ne veut pas polluer la machine avec la poussière de découpe.</p>
<p>Bien que la manipulation ne soit pas technique à proprement parler, la difficulté réside dans le fait qu'ensuite à va falloir réaligner le châssis X/Y au remontage, puis le faisceau laser.. C'est loin d'être anodin, et si le chassis est mal monté il sera presque impossible de réaligner le laser. L'ensemble m'a pris près d'une journée.</p>
<p>Je n'ai pas fait de vidéo au moment ou je l'ai fait, mais plusieurs personnes l'ont documenté sur Youtube comme ici :</p>
<div class="external-media" style="margin: 1em auto; text-align: center;">
<iframe width=" 480" height="270" src="https://www.youtube.com/embed/NKoJ3D0ZVSM?feature=oembed" frameborder="0" allowfullscreen="allowfullscreen"></iframe>
</div>
<ul>
<li><strong>Intérêt</strong>: +++</li>
<li><strong>Facilité</strong> : Compliqué à cause du réalignement total du trajet du requis lors du démontage du châssis X/Y.</li>
<li><strong>Cout</strong> : 0 euros</li>
</ul>
<h3>Taille de découpe :</h3>
<p>Lors de la réalisation de la modification précédente, on se retrouve avec le châssis X/Y complètement démonté. Il devient possible d'intervenir dessus. En actionnant chaque axe, on se rend compte qu'il est possible de gagner un peu sur les courses. Le Y notamment peut être agrandi d'une vingtaine de mm, en recoupant la butée en plastique blanc qui limite la couse. Sur le x, en repensant la façon don la pièce métallique qui vient obturer le capteur optique à fourche de fin de course, il est encore possible de gagner 10 à 15mm. C'est peu mais c'est toujours cela de pris...</p>
<p>En tout cas, si on a choisi de recouper le guide d'aspiration, autant le faire en même temps... Mais quand à démonter tout pour faire spécifiquement cette opération, ce ne serait pas rentable (rappel ... une journée!) .</p>
<p>Et a y être, vérifier la tension des courroies, qui doivent produire un son grave lorsque l'on les tire. Si elles sont trop lâches, à haute vitesse des marques se produiront lors des découpes ou gravages vectoriels.</p>
<ul>
<li><strong>Intérêt</strong>: +</li>
<li><strong>Facilité</strong> : Compliqué à cause du réalignement total du trajet du laser requis lors du démontage du châssis X/Y.</li>
<li><strong>Cout</strong> : 0 euros</li>
</ul>
<h3>Aspiration des fumées :</h3>
<p>C'est un peu plus compliqué de changer le système d'adaptation des fumées livré. En effet, la machine possède une découpe rectangulaire à l'arrière dans laquelle il n'est pas possible de monter grand chose...
J'ai donc pris le parti d'imprimer une pièce en 3D qui se boulonne à l'arrière de la machine et permet de convertir une ouverture rectangulaire en une ouverture circulaire de diamètre 100mm, beaucoup plus standard. C'est une pièce trouvée sur Thingiverse qui va finalement faire le job.</p>
<p>Source : https://www.thingiverse.com/thing:3096069</p>
<p><a href="https://civade.com/images/k40/exhaust.png" title="exhaust.png, août 2020"><img src="https://civade.com/images/k40/.exhaust_m.png" alt="exhaust.png, août 2020"></a></p>
<p>Mais ceci ne règle qu'une partie du problème. Il faut encore fixer un ventilateur digne de ce nom pour extraire les fumées. J'ai tenté une première version, basée sur un design également trouvé sur Thingiverse, qui consiste à conserver le moteur du ventilateur d'origine et refaire une turbine avec des diamètres d'entrée et de sortie de 100 mm: <a href="https://www.thingiverse.com/thing:3772080">https://www.thingiverse.com/thing:3772080</a>. Le résultat est plutôt pas mal.</p>
<p><a href="https://civade.com/images/k40/fan1.jpg" title="fan1.jpg, août 2020"><img src="https://civade.com/images/k40/.fan1_m.jpg" alt="fan1.jpg, août 2020"></a></p>
<p><a href="https://civade.com/images/k40/fan2.jpg" title="fan2.jpg, août 2020"><img src="https://civade.com/images/k40/.fan2_m.jpg" alt="fan2.jpg, août 2020"></a></p>
<p>Mais la pièce avec les pales est complexe à imprimer, fragile, et surtout difficile à nettoyer car elle a tendance à fixer la poussière. De plus, je n'ai pas réussi à faire des pales parfaitement centrées, et le ventilateur ne tournait pas "rond" ce qui engendrait des vibrations. A ce stade, il peut être intéressant d'utiliser les pales d'origine, qui elles tournent rond, dans un boitier imprimé. C'est un bon compromis, qu ine nécessite que du temps d'impression 3D et un peu de plastique.</p>
<p>Je suis finalement parti sur une autre version basée sur un extracteur d'air chaud récupéré sur une machine de soudure CMS. C'est très proche des extracteurs que l'on trouve sur les chaudières (ex: extracteur de fumées Saunier Duval). C'est assez cher (80 à 150 euros), mais peut se trouver à partir de 30 euros d'occasion ou à récupérer sur une chaudière en déchetterie. Les caractéristiques d'aspiration son très bonnes (40 à 60W, et 300M3 / h), et c'est tout métal, donc facile à brosser pour nettoyage.</p>
<p>Voici ce à quoi ressemble l'extracteur nu :</p>
<p><a href="https://civade.com/images/k40/turbine.jpg" title="turbine.jpg, août 2020"><img src="https://civade.com/images/k40/.turbine_m.jpg" alt="turbine.jpg, août 2020"></a></p>
<p>Il faut fabriquer une pièce d'adaptation à l'imprimante 3 qui se fixe à l'entrée diamètre 100 du ventilateur, et fasse un diamètre intérieur de 100mm pour s'emboiter sur la pièce imprimée de Thingiverse. Sur la mienne, j'ai également créé une pièce pour une sortie diamètre 100mm, et un capot de protection qui évite de se prendre les doigts dans les pales du ventilateur auxiliaire de refroidissement moteur et de toucher les cosses 220V.</p>
<p>En voici le résultat :</p>
<p><a href="https://civade.com/images/k40/fan3.jpg" title="fan3.jpg, août 2020"><img src="https://civade.com/images/k40/.fan3_m.jpg" alt="fan3.jpg, août 2020"></a></p>
<p><a href="https://civade.com/images/k40/fan4.jpg" title="fan4.jpg, août 2020"><img src="https://civade.com/images/k40/.fan4_m.jpg" alt="fan4.jpg, août 2020"></a></p>
<p>Le tube en plastique livré avec la machine a été remplacé par un tube aluminium diamètre 100 (4 pouces), télescopique et allant jusqu'à de 2 mètres pour la modique somme de 5 euros ( voir <a href="https://fr.aliexpress.com/premium/tuyau-ventilation-aluminium-100mm.html">https://fr.aliexpress.com/premium/tuyau-ventilation-aluminium-100mm.html</a>.</p>
<p>Voici également l'archive contenant les pièces au format Sketchup et exports STL qui ont été conçues pour mettre en situation le ventilateur de chaudière: <a href="https://civade.com/images/k40/PiecesDeJonction.zip">PiècesDeJonction.zip</a></p>
<ul>
<li><strong>Intérêt</strong>: +++</li>
<li><strong>Facilité</strong> : Assez facile</li>
<li><strong>Cout</strong> : de 0 à 100 euros en fonction de la solution de ventilateur choisie (dans mon cas zéro, car récup...).</li>
</ul>
<h3>Carte électronique :</h3>
<p>La carte électronique intégrée fonctionne bien, mais à mon avis, a une limitation majeure : Il n'est pas possible de contrôler la puissance du laser par programme.</p>
<p>Ceci empêche :</p>
<ul>
<li>La réalisation d'une gravure et d'une découpe dans un seul et même fichier</li>
<li>Les gravures de type photographiques.</li>
</ul>
<p>Ce n'est pas un soucis tant que l'on fait de la découpe ou de la gravure de polices pour des faces avant par exemple, mais cela devient limitatif si on veut faire une gravure en nuances de gris (ex: photo). SI K40 Whisperer est capable de contourner ceci en faisant des nuages de points de plus ou moins grande densité, le résultat n'est pas trop à la hauteur. Pour ceux qui font principalement de la découpe et un peu de gravage raster sans nuance de gris (pour légender des faces avant par exemple) ce n'est pas un problème.</p>
<p>Il existe plusieurs possibilités :</p>
<ul>
<li>GRBL sur arduino, stm32 ou ESP32 avec logiciel pour GRBL ou le logiciel Lightburn .</li>
<li>Marlin 2 sur carte STM32 ou LPC1769 avec Lightburn</li>
<li>Contrôleur Cohesion 3D ( <a href="https://cohesion3d.com/shop/controllers/cohesion3d-laserboard/">https://cohesion3d.com/shop/controllers/cohesion3d-laserboard/</a> ) + Lightburn</li>
<li>Contrôleurs Vectoriels Ruida, Trocen, etc.. + Logiciel livré ou Lightburn</li>
<li>SKR 1.3 avec Smoothie+ Logiciel Lightburn</li>
</ul>
<p><strong>Marlin2 sur STM32 ou LPC1769</strong></p>
<p>Un logiciel d'impression 3D sur une découpe laser? Pas si bête.. On peut paramétrer Marlin en mode laser, et des cartes comme la SKR 1.3/1.4 ou 1.3 Turbo peuvent être très peu chères (de 15 à 30 euros + 15 euros d'afficheur). Elles sont également compatibles Lightburn, mais ne seraient pas aussi performances en gravure qu'une solution vectorielles.</p>
<p><strong>GRBL:</strong></p>
<p>Abondamment abordé sur ce site, ce n'est pas moi qui dirait que c'est une mauvaise solution. Convenablement paramétré il devrait être possible de graver avec des nuances de gris. De plus, il serait possible d'utiliser le logiciel Lightburn (payant, 40 Euros) qui est une pure merveille. Le cout de ce type d'upgrade pourrait être léger (4 euros pour une carte STM32, une dizaine d'euros pour une carte permettant de brancher le connecteur en nappe portant l'axe Y et les fins de course et 16 euros pour 2 drivers de type TB6600) pour peu qu'on utilise un logiciel classique de pilotage GRBL. En ajoutant le prix de Lightburn, cela portait le cout de l'ensemble à 80 euros.</p>
<p><strong>Cohesion 3D</strong></p>
<p>Développé spécifiquement pour la K40, le contrôleur Cohesion 3D repose sur un LPC1769 (ARM) et intègre les drivers moteur pas à pas. Chose intéressante, il permet de raccorder toutes les nappes de la K40 directement dessus, ce qui en fait une mise à jour facile pour les newbies. Par contre, à 200 USD, il est vendu sans écran qu'il faut ajouter en sus (40 USD), auquel il faut également ajouter Lightburn (40 USD) ... Un total de 280 USD pour une solution parfaitement intégrée, mais qui double le prix de la machine. Pour moi sans intérêt car bien trop cher. Accessoirement, je pense que l'auteur de Cohesion vend son produit beaucoup trop cher.</p>
<p><strong>Controleurs vectoriels Ruida, Trocen, etc..</strong></p>
<p>Ruida équipe la plupart des machines chinoises sérieuses de gravure laser. Le logiciel est plutot bien fait et équipe la plupart des découpes laser du marché chinois, mais on peut aussi mettre la version vectorielle de Lightburn (80 USD). Seule ombre au tableau, c'est pas donné : à partir de 200 euros. J'ai donc écartée cette solution.</p>
<p>Trocen produit des contrôleurs un peu moins chers que Ruida, et une version low cost existe avec seulement 2 axes autour de 100 Euros. Le logiciel n'est pas folichon et il faut adjoindre Lightburn en vectoriel (80 USD) à pour de bons résultats. L'ensemble coutant près de 200 euros, j'ai également écartée cette solution.</p>
<p><strong>SKR 1.3/1.4 ou 1.4 turbo avec Smoothie:</strong></p>
<p>J'ai déjà mis à jour mon imprimante 3D avec une carte SKR 1.3 et suis très satisfait. Du coup je retenterais bien l'expérience avec la dernière sortie : la SKR 1.4 Turbo. Avec un processeur à 120 Mhz, et les capacités en découpe laser de Smoothie, elle serait apparemment performance en gravure / nuances de gris. A 30/35 euros avec 2 drivers, écran graphique auxquels il faut ajouter 40 USD pour Lightburn,
l'upgrade me semble concurrentielle et permet de passer la communication entre la machine et le logiciel en Wifi (total 70/80 euros).</p>
<p>C'est sur cette dernière solution que j'ai jeté mon dévolu mais je n'ai pas encore reçue la carte. Un article spécifique sera fait sur ce sujet spécifique ultérieurement pour documenter le tout.</p>
<h3>Lit réglable :</h3>
<p>J'ai pas mal bossé sur ce dernier point et complètement développé une nouvelle solution motorisée, avec sa propre interface avec écran OLED et encodeur de panneau. Le projet est terminé et fonctionnel et fait l'objet d'un article séparé : <a href="https://civade.com/post/2020/08/23/D%C3%A9coupe-laser-CO2-K40-%3A-R%C3%A9alisation-d-un-lit-motoris%C3%A9">https://www.civade.com/post/2020/08/23/D%C3%A9coupe-laser-CO2-K40-%3A-R%C3%A9alisation-d-un-lit-motoris%C3%A9</a></p>
<h3>Éclairage</h3>
<p>C'est plus du domaine du gadget, mais c'est quand même pratique d'avoir une machine bien éclairée dedans. Cela permet de mieux suivre la gravure / découpe par la vitre et intervenir au plus vite, et également bien voir que les fumées sont convenablement aspirées.</p>
<p><a href="https://civade.com/images/k40/IMG_2691.JPG"><img src="https://civade.com/images/k40/.IMG_2691_m.jpg" alt=""></a></p>
<p>La solution est de mettre des bandeaux de leds autocollantes. Dans mon cas j'ai fait sur 3 cotés afin de bien déboucher les ombres. Et oui, il faut ajouter une alimentation 12V.. Ceci dit il est toujours possible de récupérer une alimentation à découpage de 12V / 2A mini, de la démonter et de l'intégrer dans la machine. La déchetterie en regorge (alimentation d'écrans LCD, de routeurs, etc..). C'est ce que j'ai fait. J'ai récupéré le bandeau de leds, mais on en trouve au mètre à 10 euros pour 5 mètres. Il en faudra 2X30cm pour les cotés, et 50cm de plus pour faire le fond.</p>
<p>J'utilise le passage de câble du fin de course pour amener l'alimentation 12V.</p>
<p><a href="https://civade.com/images/k40/IMG_2692.JPG"><img src="https://civade.com/images/k40/.IMG_2692_m.jpg" alt=""></a></p>
<p>Au final, cela éclaire bien :</p>
<p><a href="https://civade.com/images/k40/IMG_2693.JPG"><img src="https://civade.com/images/k40/.IMG_2693_m.jpg" alt=""></a></p>
<ul>
<li><strong>Intérêt</strong>: +</li>
<li><strong>Facilité</strong> : Facile</li>
<li><strong>Cout</strong> : 10 euros pour les led et une alim 12V de recup.</li>
</ul>
<h3>Conclusion :</h3>
<p>Il reste des sujets à traiter, et notamment la partie refroidissement du laser. Actuellement je travaille avec 15 litres d'eau distillée, mais c'est directement dépendant de la température ambiante et ne permet pas de travailler longtemps. Je souhaiterais développer une régulation température à base de module à effet pelletier qui permette de faire travailler le tube effectivement à 25 degrés avec une véritable régulation de température. En effet les performances du laser peuvent vite se dégrader (moins de puissance, usure prématurée) au delà de 25 degrés...</p>
<p>Cela fera certainement l'objet d'un article séparé..</p>Deux nouveaux repository avec des projets Open Sourceurn:md5:7414bc093e64873bacf016dda791e39d2020-04-18T07:56:00+02:002024-02-23T15:54:22+01:00jphiLogiciels Libres<p>Je viens d'ouvrir 2 nouveaux repository sur le Gitlab avec des projets open source sous licence Creative Common (CC y CA 3.0) qui viennent compléter celui ouvert la semaine dernière.</p> <p>L'un sur les projets pour impression 3D et l'autre sur des projets plus à teneur mécanique ou décoration.</p>
<p>La partie impression 3D n'est que peu développée car beaucoup des pièces que j'ai développées rentraient dans un projet plus grand, ponctuel, une réparation, ou faisaient appel à des bibliothèques ou des bases empruntées pour les besoins de la cause. Leur intérêt était parfois restreint ou les licences n'étaient pas faciles à manipuler; J'ai donc choisi de ne publier que ce qui était finalisé ou sans problème latent de licence.</p>
<p>Focus sur l'un des projets : la table de soudeur
<a href="https://civade.com/images/rendu.jpg" title="rendu.jpg, avr. 2020"><img src="https://civade.com/images/.rendu_m.jpg" alt="rendu.jpg, avr. 2020"></a></p>
<p>L'idée sur cette table était de disposer d'un espace de travail pour soudeur, qui ne soit pas trop grand, quitte à disposer de rallonge télescopiques (X2 à 90 degrés), ne serve pas qu'au soudage, mais permette aussi de monter des accessoires de mécaniques (ici, étau et touret à poncer / meuler), de façon à profiter du poids pour assurer une stabilité.</p>
<p>Un support pour le pistolet de soudure est également intégré.</p>
<p>Étant grand, j'ai également souhaité que les pieds soient réglables et me permettent de travailler debout, sans avoir à me courber comme c'est le cas sur beaucoup de tables...</p>
<p>Un fichier ODS avec le débit des profilés est fourni ainsi que 2 versions de la tables, la seconde étant une évolution mineure avec système de fixation du pistolet un peu différent, et de bocage des rallonges.</p>
<p>Pour tous ces projets, j'ai essayé d'intégrer un fichier STL qui peut peut être directement visible sous Girlab (cliquer dessus) et sur la plupart des projets un README.</p>
<p>Rappel du lien du Gitlab : <a href="https://gitlab.civade.com/">https://gitlab.civade.com/</a></p>
<p>Bonne découverte!</p>https://civade.com/post/2020/04/18/Deux-nouveaux-repository-avec-des-projets-Open-Source#comment-formhttps://civade.com/feed/atom/comments/102Communication citoyenne et Covid 19urn:md5:917006ae5f6c88e011dfb5b8f6277e6a2020-04-13T08:51:00+02:002020-04-13T10:41:54+02:00jphiDivers<p><a href="https://civade.com/images/Covid19/covid_19.png" title="covid 19.png, avr. 2020"><img src="https://civade.com/images/Covid19/covid_19.png" alt="covid 19.png, avr. 2020" /></a></p>
<p>En période de confinement, les directives gouvernementales étaient claires pour les mairies : A défaut d'avoir eu le premier conseil municipal et l'élection du Maire, ce sont les élus de la précédente mandature qui restent en poste. Une circulaire gouvernementale en précise le fonctionnement et recommande chaudement aux maires de se rapprocher des associations pour toutes les actions de terrain.</p>
<p>Dans les faits, l'interprétation de ce message est très différente selon les communes.</p>
<p>Certaines brillent par leur immobilisme, s'appuyant sur leur communauté de communes pour les actions de terrain, alors que d'autres relayent les actions citoyennes, les épaulent, voir même arrivent à travailler main dans la main liste sortante / nouvelle liste.</p>
<p>Cette différence de traitement peut être évaluée en analysant les sites des communes alentour pour voir quelles actions étaient mises en place et relayées par leurs moyens de communication. Les résultats sont étonnants...</p> <h3>Analyse :</h3>
<p>Dans ce tableau ont étés reportés différents critères, comme les technologies utilisées sur les sites (Gestionnaire de contenus) la présence de flux RSS, d'une rubrique dédiée COVID et la cadence de publication des informations sur les 4 semaines de confinement.</p>
<p><a href="https://civade.com/images/Covid19/communication-sites.png" title="communication-sites.png, avr. 2020"><img src="https://civade.com/images/Covid19/.communication-sites_m.png" alt="communication-sites.png, avr. 2020" /></a></p>
<p>Le tableau a été classé sur 2 critères :</p>
<ul>
<li>Présence d'une rubrique dédiée</li>
<li>Nombre d'actualités publiées et pertinence de ces infos.</li>
</ul>
<h3>Résultats :</h3>
<p>La palme en matière de communication revient à la ville du Crès (plus de 9000 habitants). Très vite, ils ont mis en place une rubrique dédiée, avec des informations pratiques sur le Covid (près d'une vingtaine de pages au 13/04), d'une rubrique d'actualité bien alimentée (plus d'une vingtaine d'actus en 4 semaines) en plus d'une newsletter dédiée Covid à laquelle on peut aisément s'inscrire. Les infos sont mises en ligne très rapidement.</p>
<p>Saint Brès, petite commune de moins de 3000 habitants s'en tire également très bien, avec également une rubrique dédiée Covid, et plus d'une vingtaine d'actus.</p>
<p>Vendargues, bien que ne disposant pas de rubrique dédiée est très active au niveau communication, relaye les actions citoyennes et mobilise des moyens municipaux en ce sens (ex : la police municipale collecte les masques réalisés par les citoyens).</p>
<p>Castries s'en sort également très bien avec une rubrique d'actus bien alimentée, des informations pratiques aux nouvelles des EHPAD, et même des informations pour aider les chefs d'entreprise (mesures de soutien).</p>
<p>Pas grand chose à dire sur les 3 autres communes qui n'ont pas ou très peu communiqué et en tout cas avec très peu de sens, voire très en retard par rapport au planning des évènements (20 jours de silence à Saint Aunès, et quasi mutisme de Mauguio et Baillargues). Quatre semaine après le début du confinement, on aurait pu s'attendre à ce que cela bouge plus vite, et surtout avec beaucoup plus de sens. L'écueil n'est pas technique, car tous les sites examinés reposent sur des gestionnaires de contenus très simples à utiliser.</p>
<h3>Conclusions :</h3>
<p>Si en matière d'économie il faudra certainement tirer des conclusions (désindustrialisation de la France, etc..), il faudra également en tirer sur le plan de la gouvernance locale, qui pour partie repose encore sur des principes du siècle dernier ou les 'sachants' / 'notables' dirigeaient localement de façon paternaliste et sans avoir de comptes à rendre.</p>
<p>De nouvelles façon de faire sont à l’œuvre, que ce soit dans les tiers lieux, les associations, etc.. Les bonnes volontés et les actions sont nombreuses, et il va falloir en tenir compte dans les gouvernances locales.</p>
<p>En effet, les nouvelles idées et les bonnes vibrations souvent d'en bas (bottom up), là ou ceux d'en haut manquent du plus en plus d'idées novatrices et de créativité. Il reste à certaines communes à le comprendre et l'appliquer.</p>
<p>Tout le monde aurait à y gagner...</p>Mise à jour d'un clone d'Ultimaker 1+ avec Marlin 2 + SKR 1.3 + TMC2130 ... suiteurn:md5:c515f713d2082df88b0d417f0c23b26f2020-04-12T19:08:00+02:002024-02-23T15:54:52+01:00jphiMachines à commande numériquesArduinoCNCEmbarquéOpenSource<p>Après 200 heures d'impression 3D de masques pour le COVID 19, que donne cette update?</p> <p><a href="https://civade.com/images/skr1.3/IMG_2617.JPG" title="IMG_2617.JPG, avr. 2020"><img src="https://civade.com/images/skr1.3/.IMG_2617_m.jpg" alt="IMG_2617.JPG, avr. 2020"></a>
Comme beaucoup de Makers, j'ai mis mon imprimante 3D à contribution pour imprimer des visières de protection pendant la période de confinement afin d'aider le petit groupe qui s'est monté sur mon village pour fournir sur blouses, masques, et bien sur visières.</p>
<p>Sur une centaine d'heures d'impression, à 2 reprises j'ai eu un phénomène étrange. Marlin n'était pas planté, les régulation de température fonctionnaient, mais les moteurs s'étaient juste arrêtés. Est-ce un pb sur le SPI de pilotage des TMC2130? Je n'ai pas recherché la panne, mais Marlin 2 continue à subir de nombreuses améliorations. Les forums relatent des pb similaires, réglés depuis par des versions récentes (la mienne est une version de Juillet 2019).</p>
<p>Pour le reste, rien à déplorer, et la qualité d'impression toujours au rendez vous.</p>
<p>Je reste donc sur la première impression après avoir installé la carte : C'est un super plan...</p>https://civade.com/post/2020/04/12/Mise-%C3%A0-jour-d-un-clone-d-Ultimaker-1-avec-Marlin-2-SKR-1.3-TMC2130-...-suite#comment-formhttps://civade.com/feed/atom/comments/100Mise en place d'un Gitlab et publication de projets open hardwareurn:md5:9ca6c89cd01f64223dae9cfeab20cf1b2020-04-03T18:01:00+02:002024-02-23T16:07:59+01:00jphiLogiciels Libres<p>A force de faire des trucs et des machins, j'avais pas mal de plans de réalisations qui n'avaient pas étés publiés... Réparons cet oubli!</p> <p>Illustration tirée du repository : le pôele de camping pliable "Rocket Stove".
<br>
<a href="https://civade.com/images/lasercut_rocket_stove4.png" title="lasercut rocket stove4.png, avr. 2020"><img src="https://civade.com/images/.lasercut_rocket_stove4_m.png" alt="lasercut rocket stove4.png, avr. 2020"></a>
<br>
Voici donc une première salve de publication de projets, avec 15 projets développés pour être réalisés avec une découpe laser. Un nouveau menu (Repo Git) a pour cette occasion été ajouté à ce blog pour permettre un accès direct.</p>
<p>Ils ont étés publiés sur un repository "Small Lasercut Project" : <a href="https://gitlab.civade.com/pub">https://gitlab.civade.com/pub</a></p>
<p>Chaque projet dispose d'un Readme (cliquez dessus) avec diverses indications... Un fichier stl a également été publié afin de permettre la prévisualisation. Cliquez dessus, Gitlab permet de le visualiser en 3D !</p>
<p>D'autres Repository suivront prochainement, car j'ai encore pas mal de choses à publier, que ce soit en impression 3D ou en métal.</p>M5Stick-C - Une petite plateforme de développement IOT à 10 USDurn:md5:67d8590d8c100a01aad6017dab9b6be82019-12-08T12:01:00+01:002024-02-23T15:55:24+01:00jphiDomotique<p>Ce post est une prise de notes partagée concernant le M5Stick-C - Une petite plateforme de développement IOT. Elle sera enrichie au fur et à mesure des découvertes...</p> <p><a href="https://civade.com/images/M5stick/M5stick-c-1.jpg" title="M5stick-c-1.jpg, déc. 2019"><img src="https://civade.com/images/M5stick/.M5stick-c-1_m.jpg" alt="M5stick-c-1.jpg, déc. 2019"></a></p>
<h3>Généralités :</h3>
<p>Le M5 Stick C ("C" pour Couleur), est construit autour d'un cœur ESP32 Pico avec 4Mo de Flash. Il hérite des focntionnalités de cette plateforme :</p>
<ul>
<li>Double cœur à 240 Mhz / 600 Mips, 520 Ko de SRAM.</li>
<li>Wifi 802.11 b/g/n</li>
<li>Bluetooth 4.2</li>
<li>Nombreuses entrées sorties (I2C/Spi/Serial, etc..)</li>
</ul>
<p>L'intérêt de ce petit device est que le processeur est enrichi de nombreuses fonctionnalités :</p>
<ul>
<li>1 connecteur à 4 broches pour périphériques Grove (I2C)</li>
<li>Connecteur d'extension</li>
<li>Batterie Lipo intégrée de 80mA/h</li>
<li>Ecran LCD couleur de 0.9'' de 80X160 pixels</li>
<li>Contrôleur de charge et d'alimentation AXP192,</li>
<li>Un bouton d'alimentation (>6s pour éteindre, pression brève pour allumer)</li>
<li>2 boutons poussoirs dont un en face avant (Bouton A et bouton B)</li>
<li>Microphone I2C SPM1423</li>
<li>Transmetteur Infra rouge.</li>
<li>Led rouge</li>
<li>Centrale inertielle à 6 axes (3 accéléro, 3 gyro) : IMU SH200Q / MPU6886</li>
</ul>
<p><a href="https://civade.com/images/M5stick/M5stick-c-2.png" title="M5stick-c-2.png, déc. 2019"><img src="https://civade.com/images/M5stick/.M5stick-c-2_m.png" alt="M5stick-c-2.png, déc. 2019"></a></p>
<h4>Dans le détail :</h4>
<h3>Entées sorties</h3>
<p>Toutes les entrées sorties sont manipulaple par une API généraliste, quand elles ne sont pas gérées par une Api spécialisée. Voir https://github.com/m5stack/m5-docs/blob/master/docs/en/api/gpio.md</p>
<h3>Connecteur Grove</h3>
<p>Le connecteur Grove est raccordé à G32, G33 et fournit également le Vout du DAC. Il est contrôlable par une API: https://github.com/m5stack/m5-docs/blob/master/docs/en/api/commutil.md</p>
<h3>Connecteur d'extension</h3>
<p>Sont disponibles sur le connecteur d'extension G26, G36, G0, la tension de batterie, une entrée 5V, une sortie 5V, une sortie 3V3 et une masse.</p>
<h3>Contrôleur de Charge AXP 192</h3>
<pre>(cf https://github.com/m5stack/M5-Schematic/blob/master/Core/AXP192%20Datasheet_v1.1_en_draft_2211.pdf )</pre>
<p>Pilotable en I2C à l'adresse 0x68 via les broches G21 (SDA) et G22 (SCL) ce composant permet de :</p>
<ul>
<li>charger une batterie mono-cellule au Lithium</li>
<li>Superviser les tension/courant et température sur ladite batterie</li>
<li>Contrôler l'alimentation de 3 circuits de sortie séparés afin de limiter la consommation de l'ensemble sur des périphériques inutilisés</li>
<li>Réguler l’alimentation de 4 circuits séparés (1 toujours on, et 3 contrôlés par le contrôleur d’alimentation)</li>
<li>Fabriquer des tensions d’alimentations spécifique à l'aide de 3 convertisseurs step down intégrés.</li>
<li>Gestion d'une batterie de sauvegarde optionnelle pour une horloge temps réel.</li>
<li>Soft start</li>
<li>Protection sur ou sous courant, température, tension, etc..</li>
</ul>
<p>il est utilisé dans le M5 Stick C pour charger la batterie, permettre de voir l'état de charge, regardé le courant consommé sur l'USB, sur la batterie, mettre en veille (sommeil léger ou profond) la carte, contrôler le niveau de brillance sur le LCD (cf https://github.com/m5stack/m5-docs/blob/master/docs/en/api/axp192_m5stickc.md )</p>
<p>Attention, il doit être initialisé pour que le M5stick fonctionne correctement (cf https://github.com/m5stack/m5-docs/blob/master/docs/en/api/system_m5stickc.md)</p>
<h3>Écran LCD</h3>
<p>L'écran LCD de 0.9'' est basé sur un contrôleur très classique ST7735s. Ils est raccordé aux broches G15, G13, G23, G18 et G15.</p>
<h3>Boutons</h3>
<p>L'api permet de lire facilement l'état des boutons (CF : https://github.com/m5stack/m5-docs/blob/master/docs/en/api/button.md )
Les boutons sont cablés en G39 et G37.</p>
<h3>Microphone SPM1423</h3>
<p>Le SPM1423 est raccordé sur les broches G34 (Data), et G0 (Clock).</p>
<h3>Transmetteur infrarouge</h3>
<p>Une led IR est connectée sur le port G9.</p>
<h3>Led rouge</h3>
<p>Une led rouge est connectée sur le port G10.</p>https://civade.com/post/2019/12/08/M5Stick-C-Une-petite-plateforme-de-d%C3%A9veloppement-IOT-%C3%A0-10-USD#comment-formhttps://civade.com/feed/atom/comments/98Mise à jour Debian 10 (buster) sur WSL (Windows Subsystem for Linux)urn:md5:7685c26e64d22dd698a9a1f1a92fa4292019-12-05T14:54:00+01:002020-04-03T18:48:30+02:00jphiLogiciels LibresLinuxOpenSourceSysadmin<p>Petite prise de note, comment mettre à jour WSL avec Debian 10. En effet, seul Debian 9 est installable pour le moment à partir de la store Microsoft. Mais l'update est simplifiée. avec les instructions ci dessous...</p> <p><a href="https://civade.com/images/0.png" title="0.png, déc. 2019"><img src="https://civade.com/images/.0_m.png" alt="0.png, déc. 2019" /></a></p>
<h3>Préalable</h3>
<ul>
<li>Faites une sauvegarde :</li>
</ul>
<pre>
wsl --export Debian debian9.tar
</pre>
<h3>Préparation</h3>
<ul>
<li>Mettez à jour votre installation</li>
</ul>
<pre>
sudo apt -y update && sudo apt -y upgrade
</pre>
<pre>* Modifiez vos sources de données de paquet</pre>
<p>Editez le fichier /etc/apt/sources.list, et remplacez toutes les occurence de 'stretch' par 'buster' avec l'éditeur de votre choix</p>
<h3>Installation</h3>
<ul>
<li>mettez à jour les paquets durant la première phase de l'installation. Un message vous demandera si vous souhaitez redémarrer les services durant l'installation, vous pouvez répondre par l'affirmative.</li>
</ul>
<pre>
sudo apt -y update && sudo apt -y upgrade
</pre>
<ul>
<li>Si tout s'est bien passé, lancez la 2e phase de l'installation</li>
</ul>
<pre>
sudo apt -y full-upgrade
</pre>
<ul>
<li>Fermez la fenêtre Debian et réouvrez la: Ca y est vous êtes sous Buster.</li>
</ul>GRBL sur Arduino: Compilation sous Visual Studio Code et Platformiourn:md5:a51f4256bf3b725474e7f938c7f65b1b2019-11-01T09:19:00+01:002019-11-01T15:43:18+01:00jphiLogiciels LibresArduinoCNCDIYEmbarquéOpenSource<p><a href="https://civade.com/images/pio-arduino-grbl/arduino-uno-smd.jpg" title="arduino-uno-smd.jpg, nov. 2019"><img src="https://civade.com/images/pio-arduino-grbl/.arduino-uno-smd_m.jpg" alt="arduino-uno-smd.jpg, nov. 2019" style="float:left; margin: 0 1em 1em 0;" /></a>Grbl, et notamment sa version originale pour Arduino a déjà fait l'objet de plusieurs articles sur ce blog. Grbl n'est pas un projet Arduino à proprement parler. Il a été conçu pour être compilé avec "Make". Dans le précédents articles, j'abordais la compilation de GRBL en "volant" le compilateur installé par l'environnement Arduino. Malheureusement, depuis la version 1.5, l'environnement de développement Arduino ne fournit plus la commande Make. Il n'est donc plus possible de compiler GRBL avec cette technique.
Bien sur en suivant la méthode préconisée par l'auteur ( <a href="https://github.com/gnea/grbl/wiki/Compiling-Grbl">https://github.com/gnea/grbl/wiki/Compiling-Grbl</a> ) il est aisé de compiler et flasher GRBL sur une Arduino Uno. Toutefois, l'environnement de développement Arduino n'est pas capable de détecter les changements de code dans les bibliothèques, et justement GRBL est compilé comme une bibliothèque. Il faut donc quitter l'environnement Arduino à chaque changement fait dans le logiciel. Et justement, pour adapter GRBL à son projet, il faut en faire des changements. Voyons comment contourner cette limitation en utilisant l'environnement de développement Visual Studio Code et le plugin Platformio.</p> <h3>Pré requis:</h3>
<ul>
<li>Installer et lancer Visual Studio Code ( <a href="https://code.visualstudio.com/">https://code.visualstudio.com/</a> )</li>
<li>Faire SHIFT+ CTRL + X pour accéder (ou menu View / Extensions) pour accéder au menu d'installation / gestion des extensions</li>
<li>Rechercher Platformio IDE, et l'installer</li>
<li>Installer un client GIT (exemple de client graphique pour Windows :<a href="https://tortoisegit.org/"> https://tortoisegit.org/</a> ou de client en ligne de commande: <a href="https://git-scm.com/download/win">https://git-scm.com/download/win</a> )</li>
</ul>
<h3>Récupération de GRBL:</h3>
<ul>
<li>Le dépôt git de GRBL a déménagé. Il est désormais sur https://github.com/gnea/grbl</li>
<li>Lancer un explorateur de fichiers et coller "%UserProfile%\Documents\PlatformIO\Projects" dans l'URL. C'est l'adresse ou Plaformio range par défaut ses projets</li>
<li>Faire bouton de droite dans ce répertoire et sélectionner "Git Clone" en indiquant l'adresse https://github.com/gnea/grbl.git ou cloner le projet en ligne de commande.</li>
<li>Au bout de quelques secondes les sources sont rapatriées et sont rangées dans "%UserProfile%\Documents\PlatformIO\Projects\grbl"</li>
</ul>
<h3>Explication sur la structure de GRBL:</h3>
<p>Grbl n'est pas un projet Arduino à proprement parler. Il a été conçu pour être compilé avec "make". Toutefois il a été modifié pour être intégré en tant que bibliothèque Arduino.
C'est ce qui donne au projet Git cette organisation si particulière. En voici une explication ( en partant de "%UserProfile%\Documents\PlatformIO\Projects\grbl" comme racine) :</p>
<ul>
<li>\build : Répertoire dans lequel sera compilé le programme si fabriqué avec la commande "make"</li>
<li>\doc : Répertoire contenant quelques documentations au format Markdown</li>
<li>\grbl : Les sources de GRBL à proprement parler</li>
<li>\grbl\examples : Fichier d'exemples permettant d'utiliser \grbl en librairie arduino, et notamment \grbl\examples\grblUpload</li>
<li>\Makefile : fichier permettant de compiler GRBL à l'aide de la commande "make"</li>
</ul>
<p>Pour compiler le projet GRBL dans l'environnement Platformio, nous aurons donc besoin de :</p>
<ul>
<li>\grbl\examples\grblUpload\grblUpload.ino</li>
<li>\grbl en tant que bibliothèque</li>
</ul>
<h3>Création du projet sur Platformio</h3>
<ul>
<li>Nous allons partir d'un projet neuf et y coller les éléments dont nous allons avoir besoin . Pour ce faire, aller dans l'onglet platformio et faire "New Project"</li>
<li>Renseigner la fenêtre comme suit, en prenant soin<strong> de ne pas cocher la case</strong> "use libraries installed by arduino IDE":</li>
</ul>
<p><a href="https://civade.com/images/pio-arduino-grbl/platformio-arduino-grbl1.png" title="platformio-arduino-grbl1.png, nov. 2019"><img src="https://civade.com/images/pio-arduino-grbl/.platformio-arduino-grbl1_m.png" alt="platformio-arduino-grbl1.png, nov. 2019" /></a></p>
<ul>
<li>Le projet Platformio sera créé dans le répertoire %UserProfile%\Documents\PlatformIO\Projects\grbl-arduino</li>
<li>Supprimer "main.cpp" de %UserProfile%\Documents\PlatformIO\Projects\grbl-arduino\src</li>
<li>Copier le fichier %UserProfile%\Documents\PlatformIO\Projects\grbl\examples\grblUpload\grblUpload.ino dans %UserProfile%\Documents\PlatformIO\Projects\grbl-arduino\src</li>
<li>Copier le répertoire %UserProfile%\Documents\PlatformIO\Projects\grbl dans %UserProfile%\Documents\PlatformIO\Projects\grbl-arduino\libs</li>
<li>A l'issue, le projet se présente comme suit :</li>
</ul>
<p><a href="https://civade.com/images/pio-arduino-grbl/platformio-arduino-grbl2.png" title="platformio-arduino-grbl2.png, nov. 2019"><img src="https://civade.com/images/pio-arduino-grbl/.platformio-arduino-grbl2_m.png" alt="platformio-arduino-grbl2.png, nov. 2019" /></a></p>
<ul>
<li>Lancer la compilation en cliquant sur l'icone "Platformio" (1) et en sélectionnant "build" (2):</li>
</ul>
<p><a href="https://civade.com/images/pio-arduino-grbl/platformio-arduino-grbl3.png" title="platformio-arduino-grbl3.png, nov. 2019"><img src="https://civade.com/images/pio-arduino-grbl/.platformio-arduino-grbl3_m.png" alt="platformio-arduino-grbl3.png, nov. 2019" /></a></p>
<ul>
<li>Au 1er lancement, Platformio doit télécharger quelques dépendances sur internet (le compilateur notamment). Cela peut prendre un peu de temps, mais ne sera plus nécessaire ensuite.</li>
<li>A l'issue de la compilation, la fenêtre de status (en bas à gauche) doit indiquer un succès, par la présence du fichier tant convoité 'firmware.elf' qui est le résultat de la compilation:</li>
</ul>
<p><a href="https://civade.com/images/pio-arduino-grbl/platformio-arduino-grbl4.png" title="platformio-arduino-grbl4.png, nov. 2019"><img src="https://civade.com/images/pio-arduino-grbl/.platformio-arduino-grbl4_m.png" alt="platformio-arduino-grbl4.png, nov. 2019" /></a></p>
<p>Pour programmer l'Arduino Uno, il suffit de la raccorder et de cliquer sur "Upload", qui recompilera et téléversera GRBL sur la carte. Le port série sera déterminé automatiquement.</p>
<pre>
...
Checking size .pio\build\uno\firmware.elf
Memory Usage -> http://bit.ly/pio-memory-usage
DATA: [======== ] 79.7% (used 1633 bytes from 2048 bytes)
PROGRAM: [========= ] 92.8% (used 29930 bytes from 32256 bytes)
Configuring upload protocol...
AVAILABLE: arduino
CURRENT: upload_protocol = arduino
Looking for upload port...
Auto-detected: COM17
Uploading .pio\build\uno\firmware.hex
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: reading input file ".pio\build\uno\firmware.hex"
avrdude: writing flash (29930 bytes):
Writing | ################################################## | 100% 5.47s
avrdude: 29930 bytes of flash written
avrdude: verifying flash memory against .pio\build\uno\firmware.hex:
avrdude: load data flash data from input file .pio\build\uno\firmware.hex:
avrdude: input file .pio\build\uno\firmware.hex contains 29930 bytes
avrdude: reading on-chip flash data:
Reading | ################################################## | 100% 4.24s
avrdude: verifying ...
avrdude: 29930 bytes of flash verified
avrdude: safemode: Fuses OK (E:00, H:00, L:00)
avrdude done. Thank you.
[SUCCESS] Took 16.19 seconds
</pre>
<p>Pour ouvrir une console série, il va d'abord falloir programmer sa vitesse en ajoutant la ligne suivante au fichier "platformio.ini" dans la racine du projet :</p>
<pre>
monitor_speed = 115200
</pre>
<p>Il suffit ensuite de cliquer sur l'icone ressemblant à une prise électrique tout en bas de la fenêtre pour ouvrir le terminal série.
<a href="https://civade.com/images/pio-arduino-grbl/platformio-arduino-grbl5.png" title="platformio-arduino-grbl5.png, nov. 2019"><img src="https://civade.com/images/pio-arduino-grbl/.platformio-arduino-grbl5_m.png" alt="platformio-arduino-grbl5.png, nov. 2019" /></a></p>
<pre>
--- Available ports:
--- 1: COM1 'Port de communication (COM1)'
--- 2: COM4 'Silicon Labs CP210x USB to UART Bridge (COM4)'
--- 3: COM17 'Arduino Uno (COM17)'
--- Enter port index or full name: 3
--- Miniterm on COM17 115200,8,N,1 ---
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
Grbl 1.1h ['$' for help]
ok
</pre>
<h3>Conclusion</h3>
<p>Vous voila opérationnels sur platformio avec GRL. Vous pouvez ensuite modifier tous les réglages dans "default.h" et config.h" directement depuis l'environnement graphique de développement et reprogrammer la carte facilement...</p>https://civade.com/post/2019/11/01/GRBL-sur-Arduino%3A-Compilation-sous-Visual-Studio-Code-et-Platformio#comment-formhttps://civade.com/feed/atom/comments/96CNC: GRBL sur ESP32 serait l'arme absolue pour piloter des machines à commande numérique?urn:md5:176169b7450758ac81c87d9e0105e2ca2019-09-29T09:35:00+02:002024-02-28T16:02:06+01:00jphiMachines à commande numériquesArduinoCNCEmbarquéESP32Firmware<p>GRBL est un logiciel de pilotage de CNC, développé initialement sur Arduino Uno. Récemment, Barton Ding (qui sévit depuis de nombreuses années dans le monde Maker avec son site buildlog.net ) s'est attaqué au portage de GRBL sur ESP32. Avec une connexion Wifi et Bluetooth embarquée, un serveur web embarqué pour contrôler la machine et envoyer des fichiers, et le support d'une carte SD, GRBL sur ESP32 serait il l'arme absolue pour piloter une petite machine?</p> <h3>GRBL Encore???</h3>
<p>Cet article clot une série visant à faire un petit tour d'horizon des solutions de pilotage de machine à commande numérique en 32 bits. Après Marlin 2 sur LPC, GRBL sur STM32, c'est au tour de GRBL sur ESP32. C'est promis après j'arrête. Ou pas :)...</p>
<h3>ESP32? C'est quoi?</h3>
<p>L'ESP32 est un SOC (System on Chip) embarquant 2 processeurs Tensilica Xtensa LX6 fonctionnant jusqu'à 160 Mhz. L'un est dédié aux télécommunications (Wifi), l'autre à l'utilisateur, bien que l'on puisse tout à fait utiliser les 2 cœurs dans une application.</p>
<p>Le LX6 est en fait un SIP (Semiconductor Interllectual Property core), c'est à dire le "code source silicium" permettant de fabriquer un processeur. Il est commercialisé sous licence par Cadence. Tout comme l'ESP8266 (son prédécesseur et petit frère monocœur), Il repose sur une architecture Harvard ( <a href="https://fr.wikipedia.org/wiki/Architecture_Harvard">https://fr.wikipedia.org/wiki/Architecture_Harvard</a> ).</p>
<p>Les 2 processeurs peuvent chacun accéder à la mémoire et au périphériques sur un bus partagé. La plupart des périphériques ont eux même un accès direct à la mémoire par DMA (Direct memory Access) ce qui en fait une architecture très performante.</p>
<p>Avec une fréquence de 160Mhz (240 sur certains produits), du Wifi et du Bluetooth 4LE intégré, cela fait une solution idéale pour motoriser bon nombre de projets DIY et même pro. Une récente annonce de recrutement sur LinkedIn de la société Awox, également propriétaire de Cabasse montre que leur enceintes connectées et produits intelligents ne vont pas tarder à se mettre à l'ESP32 :)..</p>
<h3>Choisir un module ESP32</h3>
<p>Pour en simplifier l'usage, il existe des modules de développement intégrant le processeur, une mémoire e2prom, un port USB avec convertisseur USB/série permettant la programmation et l'alimentation du module, l'antenne Wifi et des connecteurs d'entrées sorties. L'esp32s en est un exemple:</p>
<p><a href="https://civade.com/images/esp32/esp32s.jpg" title="esp32s.jpg, sept. 2019"><img src="https://civade.com/images/esp32/.esp32s_m.jpg" alt="esp32s.jpg, sept. 2019"></a></p>
<p>Ces modules ont considérablement évolués ces derniers mois, et il devient difficile de s'y retrouver. Si vous êtes perfectionniste, vous pouvez défricher les caractéristiques de ces nouveaux modules dans cet excellent article de ProjetsDIY.fr: <a href="https://projetsdiy.fr/quelle-carte-esp32-choisir-developper-projets-diy-objets-connectes/">https://projetsdiy.fr/quelle-carte-esp32-choisir-developper-projets-diy-objets-connectes/</a></p>
<p>Néanmoins pas de panique, le module de base à 5 euros à 30 broches (ESP32s et similaire) fera très bien le job pour notre application de CNC (ex <a href="https://www.banggood.com/search/esp-32s-30-pin.html">chez Banggood</a>). Il dispose en effet, comme tous les plus petits modules de suffisamment de mémoire pour GRBL.</p>
<h3>Pré requis</h3>
<p>Comme on ne change pas une équipe qui gagne (cf articles précédents...), le couple Visual Studio Code / Platformio sera utilisé pour compiler GRBL/ESP32.</p>
<ul>
<li>Installer et lancer Visual Studio Code ( https://code.visualstudio.com/ )</li>
<li>Faire SHIFT+ CTRL + X pour accéder (ou menu View / Extensions) pour accéder au menu d'installation / gestion des extensions</li>
<li>Rechercher Platformio IDE, et l'installer</li>
<li>Installer un client GIT (exemple de client graphique pour Windows : https://tortoisegit.org/ ou de client en ligne de commande: https://git-scm.com/download/win )</li>
</ul>
<h3>Récupération des sources</h3>
<ul>
<li>Lancer un explorateur de fichiers et coller "%UserProfile%\Documents\PlatformIO\Projects" dans l'URL. C'est l'adresse ou Plaformio range par défaut ses projets</li>
</ul>
<p><a href="https://civade.com/images/esp32/grbl-esp32-2.png" title="grbl-esp32-2.png, nov. 2019"><img src="https://civade.com/images/esp32/.grbl-esp32-2_m.png" alt="grbl-esp32-2.png, nov. 2019"></a></p>
<ul>
<li>Faire bouton de droite dans ce répertoire et sélectionner "Git Clone" en indiquant l'adresse https://github.com/bdring/Grbl_Esp32 ou cloner le projet en ligne de commande.</li>
</ul>
<p><a href="https://civade.com/images/esp32/grbl-esp32-3.png" title="grbl-esp32-3.png, nov. 2019"><img src="https://civade.com/images/esp32/.grbl-esp32-3_m.png" alt="grbl-esp32-3.png, nov. 2019"></a></p>
<ul>
<li>Au bout de quelques secondes les sources sont rapatriées et sont rangées dans "%UserProfile%\Documents\PlatformIO\Projects\grbl_esp32"</li>
</ul>
<p><a href="https://civade.com/images/esp32/grbl-esp32-4.png" title="grbl-esp32-4.png, nov. 2019"><img src="https://civade.com/images/esp32/.grbl-esp32-4_m.png" alt="grbl-esp32-4.png, nov. 2019"></a></p>
<h3>Structure de GRBL_ESP32:</h3>
<p>Pour en examiner sa structure, nous allons ouvrir le projet dans Visual Studio Code. Ouvrir Visual Studio Code, attendre que l'extension Platformio se charge, et dans l'onglet PIO Home faire "Open Project".</p>
<p><a href="https://civade.com/images/esp32/grbl-esp32-5.png" title="grbl-esp32-5.png, nov. 2019"><img src="https://civade.com/images/esp32/.grbl-esp32-5_m.png" alt="grbl-esp32-5.png, nov. 2019"></a></p>
<p>Dans "Documents\Platformio\projects\grbl_esp32", faire "open folder".
<a href="https://civade.com/images/esp32/grbl-esp32-6.png" title="grbl-esp32-6.png, nov. 2019"><img src="https://civade.com/images/esp32/.grbl-esp32-6_m.png" alt="grbl-esp32-6.png, nov. 2019"></a></p>
<p>La partie gauche de la fenêtre matérialise l'organisation du projet :</p>
<p><a href="https://civade.com/images/esp32/grbl-esp32-7.png" title="grbl-esp32-7.png, nov. 2019"><img src="https://civade.com/images/esp32/.grbl-esp32-7_m.png" alt="grbl-esp32-7.png, nov. 2019"></a></p>
<ul>
<li>.github\ : répertoire interne à Git, qui sert à garder trace des différentes versions. Ne sera pas utilisé par VS Code / Platformio. Ne pas supprimer.</li>
<li>.pio\ : répertoire qui servira à platformio à compiler le projet et contiendra le binaire compilé. EN cas de suppression sera automatiquement recréé lors de la compilation.</li>
<li>.vscode\ : répertoire interne à Visual Studio Code. Ne pas supprimer.</li>
<li>doc\ : Répertoire contenant les codes d'alarme, d'erreur, les options de build, et surtout les différents codes de contrôles qui sont étendus sur ESP32 par rapport à la version standard.</li>
<li>embedded\ : répertoire contenant l'interface web minimaliste (celle qui sera embarquée dans la rom), ses sources et de quoi la fabriquer.</li>
<li>grbl_esp32\ : Les sources de GRBL à proprement parler. C'est dans ce répertoire que se trouvent les fichiers à configurer avant de compiler et d'envoyer à la carte.</li>
<li>libraries\ : Répertoire qui contiendra les bibliothèques requises pour la compilation (téléchargées automatiquement lors de la 1ère compilation)</li>
<li>.gitattributes : utilisé en interne par Git. Ne pas supprimer.</li>
<li>.gitignore : utilisé en interne par Git. Ne pas supprimer.</li>
<li>.travis.yml : fichier de configuration de l'outil d'intégration continue TravisCI. Ne pas supprimer.</li>
<li>commands.sh : fichier bash de compilation (linux ou OSX) en utilisant l'environnement arduino. Ne sera pas utilisé dans notre méthode de compilation.</li>
<li>LICENCE : Copie de la license du logiciel (GNU GPL V3.0)</li>
<li>platformio.ini : Fichier contenant le projet platformio</li>
<li>README.md : Documentation générale. Une fois ouvert, peut être visualisé avec CTRL+K puis v</li>
</ul>
<h3>Choix d'un brochage</h3>
<p>Le choix du brochage ne doit pas être fait par hasard. La complexité interne de l'ESP32 et les nombreux modes de fonctionnement font que certaines broches ont plusieurs fonctions, et notamment au boot de la carte. Ceci conduit à éviter certaines utilisations de certaines broches, ainsi paramétrées elles peuvent soit empêcher le boot, voir la programmation de la carte.</p>
<p>Un chapitre de la documentation y est dédié : <a href="https://github.com/bdring/Grbl_Esp32/wiki/Setting-Up-the-I-O-Pins">https://github.com/bdring/Grbl_Esp32/wiki/Setting-Up-the-I-O-Pins</a></p>
<p>Le répertoire <q>Grbl_Esp32\Machines</q> contient différents brochages mis en œuvre par Bart Ding. J'ai choisi le brochage <q>mpcnc_v1.2.h</q> .</p>
<p>J'en ai découvert quelques limitations que je vais tenter d'expliquer :</p>
<ul>
<li>GPIO2 doit être une sortie ou rester inutilisé : Pas de soucis, il est connecté sur "Spindle" c'est à dire une broche qui est une sortie.</li>
<li>GPIO12: Au boot doit être impérativement maintenu à l'état bas. Il est utilisé en "XStep" (pas de l'axe X). Le composant ESP32 dispose d'un pulldown interne de 51K. Lorsque non branché pas de soucis, la carte boote. Par contre selon ce que l'on raccorde comme driver, cela peut ne plus booter. Il faut s'intéresser au schéma interne ce que que l'on raccorde. Avec un driver Pollolu DRV8825 par exemple, les entrées STEP et DIR sont munies d'un pulldown interne de 100K. Pas de soucis. Si par contre on met un driver externe de type TB6600, il y a un pullup de 10K... Dans ce cas, l'effet du pullup de 10K peut être contré en ajoutant un pulldown de 1K directement sur la broche GPIO12. C'est facile à diagnostiquer : si après avoir terminé votre câblage, cela ne boote plus, il faut déconnecter GPIO12. Si cela refonctionne, il faut mettre le pulldown...</li>
<li>GPIO15: munie d'un pullup, mais si mise à l'état bas pendant le boote, rend muet le boot (plus de messages). Dans ce brochage il est utilisé en limite Z. Il vaut donc mieux y raccorder des fins de coures qui envoient un 0V lorsque actionnés....</li>
<li>GPIO34/35/36/39 : utilisées en entrées, ces broches devront être équipées d'un pullup de 10K</li>
</ul>
<p>Je vous recommanderais plutot le brochage <q>3axis_v4.h</q>, mieux documenté. Un prototype peut être câblé selon le schéma suivant : <a href="https://github.com/bdring/Grbl_ESP32_Development_Controller/blob/master/docs/V4p1/esp32_cnc_test_v4.1_schm.pdf">https://github.com/bdring/Grbl_ESP32_Development_Controller/blob/master/docs/V4p1/esp32_cnc_test_v4.1_schm.pdf</a> ou cette carte peut être achetée en ligne sur la boutique Tindie de Bart: <a href="https://www.tindie.com/stores/33366583/">https://www.tindie.com/stores/33366583/</a> . Il n'y a pas souvent du stock... donc à suivre.</p>
<p>Dans mon cas, j'ai câblé une carte d'adaptation qui accepte un ESP32, un socket carte SD, une carte fille Arduino CNC Shield de Protoneer et une carte Relais. Cela a permis de réduire drastiquement le câblage (notamment pas l'emploi de la Shield Protoneer...). N'oublions pas qu'il s'agit d'un simple proto de validation du code.. OK, c'est moche, mais ca marche et cela supporte :</p>
<ul>
<li>3 moteurs pas à pas 2.5A max aux 1/32e de pas.</li>
<li>Le chargement et le streaming des fichiers à partir de la carte SD</li>
<li>La commande d'une broche avec un relais 220V / 4A</li>
<li>Alimentation 19V (via une alimentation de PC)</li>
<li>3 fins de courses</li>
<li>Un détecteur de longeur d'outil</li>
<li>Une sortie PWM pour faire des essais avec un laser</li>
</ul>
<p><a href="https://civade.com/images/esp32/IMG_0089.JPG" title="IMG_0089.JPG, avr. 2020"><img src="https://civade.com/images/esp32/.IMG_0089_m.jpg" alt="IMG_0089.JPG, avr. 2020"></a>
<a href="https://civade.com/images/esp32/IMG_0090.JPG" title="IMG_0090.JPG, avr. 2020"><img src="https://civade.com/images/esp32/.IMG_0090_m.jpg" alt="IMG_0090.JPG, avr. 2020"></a>
<a href="https://civade.com/images/esp32/IMG_0091.JPG" title="IMG_0091.JPG, avr. 2020"><img src="https://civade.com/images/esp32/.IMG_0091_m.jpg" alt="IMG_0091.JPG, avr. 2020"></a></p>
<h3>Paramétrage des sources pour le proto</h3>
<p>Énormément de choses sont paramétrables avant compilation. Les réglages par défaut ne sont pas idiots, mais je vous encourage vivement à lire attentivement le fichier config.h qui regorge de commentaires..</p>
<h4>Brochages</h4>
<p>Comme vu précédemment, j'ai choisi le brochage "3axis_V4.h" qui est identique à celui utilisé sur la carte prototype de Bart Ding.</p>
<p>Son activation se fait dans le fichier "machine.h" :</p>
<pre>
//#include "Machines/test_drive.h"
#include "Machines/3axis_v4.h"
</pre>
<p>Dans le cas ou vous auriez besoin de personnalisation avancée, le plus sage est de copier ce fichier et de mettre un nom à votre sauce, ou mieux de prendre <q>custom_machine_template.h</q> comme modèle. Il est possible de piloter des lasers, d'utiliser des cinématiques particulières (ex : corexy), donc il y a de quoi faire :). S'inspirer des autres fichiers de config également.</p>
<p>Différents choix s’offrent ensuite à vous en fonction de l'utilisation qui sera faite du contrôleur.</p>
<h4>Cycle d'initialisation (Homing Cycle) :</h4>
<p>Le fichier confiih.h vous permet de configurer cette fonctionnalité. Par défaut, c'est Z qui est homé d'abord puis X, puis Y.0</p>
<pre>
#define HOMING_CYCLE_0 (1<<Z_AXIS) // TYPICALLY REQUIRED: First move Z to clear workspace.
#define HOMING_CYCLE_1 (1<<X_AXIS)
#define HOMING_CYCLE_2 (1<<Y_AXIS)
</pre>
<p>Il peut être possible de homer X et Y simultanément :</p>
<pre>
#define HOMING_CYCLE_0 (1<<Z_AXIS) // REQUIRED: First move Z to clear workspace.
#define HOMING_CYCLE_1 ((1<<X_AXIS)|(1<<Y_AXIS)) // OPTIONAL: Then move X,Y at the same time.
</pre>
<p>Ou pour une laser, de homer X puis Y sans toucher à Z :</p>
<pre>
// For Laser
// #define HOMING_CYCLE_0 (1<<X_AXIS) // COREXY COMPATIBLE: First home X
// #define HOMING_CYCLE_1 (1<<Y_AXIS) // COREXY COMPATIBLE: Then home Y
</pre>
<p>Petite astuce... Si comme moi vous préférez travailler dans un espace orthonormé avec des valeurs positives (par défaut, les déplacement se font en mouvement négatif, comme sur les machines professionnelles), il fait décommenter ceci dans config.h :</p>
<pre>
#define HOMING_FORCE_SET_ORIGIN // Uncomment to enable.
</pre>
<p>Par ailleurs, pour un laser, il peut être indispensable de commenter la ligne suivante pour désactiver le laser avec SPINDLE ENABLE:</p>
<pre>
//#define SPINDLE_ENABLE_OFF_WITH_ZERO_SPEED
</pre>
<h3>Compilation et envoi à la carte de développement</h3>
<p>L'environnement de développement ayant déjà été paramétré, la compilation se fait simplement par le menu PlatformIO > Build.
Lors de la première compilation, il n'est pas impossible qu'un certain nombre de dépendances doivent se télécharger.</p>
<p>A l'issue, la fenetre du terminal de Code / Plaformio devrait afficher :</p>
<pre>
Compiling .pio\build\nodemcu-32s\FrameworkArduino\main.cpp.o
Compiling .pio\build\nodemcu-32s\FrameworkArduino\stdlib_noniso.c.o
Compiling .pio\build\nodemcu-32s\FrameworkArduino\wiring_pulse.c.o
Compiling .pio\build\nodemcu-32s\FrameworkArduino\wiring_shift.c.o
Archiving .pio\build\nodemcu-32s\libFrameworkArduino.a
Linking .pio\build\nodemcu-32s\firmware.elf
Retrieving maximum program size .pio\build\nodemcu-32s\firmware.elf
Building .pio\build\nodemcu-32s\firmware.bin
Checking size .pio\build\nodemcu-32s\firmware.elf
Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
RAM: [== ] 21.5% (used 70348 bytes from 327680 bytes)
Flash: [========= ] 91.1% (used 1791034 bytes from 1966080 bytes)
esptool.py v2.6
==================================================================================== [SUCCESS] Took 113.25 seconds ====================================================================================
Terminal will be reused by tasks, press any key to close it.
</pre>
<p>Vous devriez maintenant pouvoir envoyer à la carte avec PlatformIO / Upload. A noter lors de vos prochaines compilations, que vous pouvez directement utiliser ce dernier menu pour compiler et envoyer à la cible.</p>
<h3>Première mise en service</h3>
<h4>Setup du Wifi ... par Wifi.</h4>
<p>Il y a plusieurs méthodes pour mettre en service la carte. Lors de sa première programmation, aucun paramètres réseau n'étant présent, elle se met en point d'accès.
La méthode de base est donc de connecter votre ordinateur au point d'accès <q>GRBL_ESP</q>, et d'ouvrir une page web sur la config...</p>
<p>Je ne suis pas fan de la méthode, même si cela dépanne. En effet, si l'ordinateur avec lequel vous faites cela n'a pas de wifi, c'est mort...</p>
<h4>Ou setup du wifi par commandes série</h4>
<p>Par contre, la carte est toujours connectée à l'ordinateur par le câble USB.. et on va pouvoir s'y connecter par le port série virtuel...</p>
<p>Pour ce faire, il existe un moniteur série dans PlatformIO. Il est accessible dans la barre d'outils tout en bas. Cliquez sur (1) pour le lancer. En (2) vous devriez vous la bannière de GRBL :
<a href="https://civade.com/images/esp32/serial-monitor.png" title="serial-monitor.png, avr. 2020"><img src="https://civade.com/images/esp32/.serial-monitor_m.png" alt="serial-monitor.png, avr. 2020"></a></p>
<p>Nous allons utiliser des commandes spéciales documentées dans <a href="https://github.com/bdring/Grbl_Esp32/blob/master/doc/Commands.txt">https://github.com/bdring/Grbl_Esp32/blob/master/doc/Commands.txt</a> afin de configurer le wifi.</p>
<pre></pre>
<p>Setup Wifi en mode client et DHCP</p>
<pre>
[ESP110]STA
[ESP100]MON_SSID_PERSO
[ESP101]MON_DE_PASSE_PERSO
[ESP102]DHCP
</pre>
<p>Ou si vous le souhaitez setup du Wifi en mode IP Fixe</p>
<pre>
[ESP110]STA
[ESP100]MON_SSID_PERSO
[ESP101]MON_DE_PASSE_PERSO
[ESP102]STATIC
[ESP103] IP=192.168.20.21 MSK=255.255.255.0 GW=192.168.20.254
</pre>
<p>Vous pouvez ensuite vérifier vos paramètres réseau</p>
<pre>
[ESP103]
[ESP111]
</pre>
<p>Lors d'une première utilisation, ou si vous avez fait une mise à jour majeure il peut être nécessaire de reformater la flash :</p>
<pre>
[ESP710]FORMAT
</pre>
<p>Et redémarrer l'ESP :</p>
<pre>
[ESP444]RESTART
</pre>
<h4>Première connexion au WIfi</h4>
<p>Maintenant que votre carte est associée au réseau Wifi, vous pouvez vous y connecter ( <a href="http://grblsesp.local">http://grblsesp.local</a> ou http://ip_mise_dans_votre_esp ).
La page d'accueil vous indique que l'interface n'est pas chargée :
<a href="https://civade.com/images/esp32/index-is-missing.png" title="index-is-missing.png, avr. 2020"><img src="https://civade.com/images/esp32/.index-is-missing_m.png" alt="index-is-missing.png, avr. 2020"></a></p>
<p>Le fichier est fourni avec GRBL ESP32 dans le répertoire <q>grbl_esp32\data</q>. Il suffit de l'uploader avec l'interface web. Le fichier favicon peut être uploadé également.
Une fois ces 2 fichiers présents, un nouveau bouton "Go to ESP3D Interface" apparait. CLiquez dessus pour basculer sur l'interface graphique.</p>
<p>Voici ce que vous devriez obtenir (ici après un appui sur refrech sur la carte SD, qui montre les fichiers installés dessus)
<a href="https://civade.com/images/esp32/interface-complete.png" title="interface-complete.png, avr. 2020"><img src="https://civade.com/images/esp32/.interface-complete_m.png" alt="interface-complete.png, avr. 2020"></a></p>
<h4>Fonctionnement normal</h4>
<p>Par défaut, la carte attend un homing des axes. Tant que ce n'est pas fait, la machine est stoppée en "erreur" (icône rouge en forme de cloche). Il est possible d'acquitter cette "erreur" en cliquant sur la cloche afin de poursuivre les tests sans activer les fins de couses. Il est également possible de le couper dans la configuration par la commande $22 ($22=0). Plus d'infos sur les commandes de GRBL dans<a href="https://github.com/gnea/grbl/wiki/Grbl-v1.1-Configuration#grbl-settings"> https://github.com/gnea/grbl/wiki/Grbl-v1.1-Configuration#grbl-settings</a>.</p>
<p>A ce stade il va vous falloir paramétrer GRBL sur votre machine et vos moteurs (nombre de pas par mm, etc..), avant de pouvoir jouer avec. Sur ce blog et sur d'autres beaucoup d'informations sont données sur la logique de paramétrage. A ce stade, c'est du GRBL "classique", donc je vous laisse vous documenter.</p>
<p>Ce qui l'est moins est l'interface Web et la carte SD. Vous allez pouvoir mettre des fichiers Gcode sur la carte SD en les copiant sur PC ou mac par exemple, mais aussi en les uploadant à partir de l'interface.</p>
<p>Ensuite vous pourrez les exécuter en affichant le contenu de la carte SD et en appuyant sur play en face du fichier considéré. Magique!!!! Une machine en Wifi!!!</p>
<h3>Limites et notes importantes</h3>
<p>Je n'ai pas tout testé car honnêtement, c'est énorme ce que GRBL ESP32 peut faire. Streaming bluetooth à partir d'un téléphone, support des drivers Trinamic en mode SPI chainés... Pour ce que j'ai testé, c'est très largement suffisant pur faire fonctionner une petite machine de CNC.</p>
<p>Coté limitations c'est assez light :</p>
<ul>
<li>La carte est en 3.3V, il faut donc passer par une logique d’adaptation pour connecter des sorties 5V sur les entrées sous peine de destruction.</li>
<li>Pas de https. On aurait pu imaginer, vu qu'il y a possibilité de mettre nu mot de passe, que celui-ci soit chiffré. C'est une remarque assez globale sur les ESP (8266 ou 32).</li>
<li>Impossibilité de préciser la polarité de la commande de relais de Spindle, qui est toujours en logique positive (1=3.3V=On). Il faut donc mettre un petit transistor externe si on veut en inverser le sens.</li>
</ul>
<h3>Le futur de GRBL sur ESP32</h3>
<p>Bart Ding s'est fait un planning de fonctionnalité (Road Map) de malade. Pour suivre le projet je peux vous dire qu'il avance brillamment le bougre.. Visible ici : <a href="https://github.com/bdring/Grbl_Esp32/wiki/Development-Roadmap">https://github.com/bdring/Grbl_Esp32/wiki/Development-Roadmap</a>.</p>
<h3>Pour le fun</h3>
<p>La marche de l'empereur sur ESP32...</p>
<iframe width="1232" height="693" src="https://www.youtube.com/embed/MWjhAyf7d4c" title="1 novembre 2019" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>