まこと の ブログ - Mot-clé - ArduinoMaKoTo no burogu — Journal de bord…2024-03-17T18:52:27+01:00MaKoTourn:md5:c74815e3268f2d506228368f0d9c6d01DotclearTempéroClockurn:md5:95123e94e1eb3982e644fa92556ef40a2022-07-30T17:32:00+02:002022-07-30T16:45:29+02:00makoto doushiteArduinoDIYVidéosÉlectronique <p><a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03666.jpg" title="dsc03666.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03666_s.jpg" alt="dsc03666.jpg" style="float:right; margin: 0 0 1em 1em;" /></a></p>
<blockquote><p>Étant donné que je m'amuse bien avec les capteurs de températures/humidités en ce moment, j'ai eu envie d'en ajouter un dans le salon/salle à manger/atelier/salle de jeu/dortoire à ratoux/chambre d'amis/biliothéque…<br /></p></blockquote>
<ul>
<li>Et plutôt que d'entreprendre un nouvel afficheur, j'ai préféré utiliser celui que j'avais déjà, l'<a href="http://burogu.makotoworkshop.org/index.php?post/2018/03/04/horloge">horloge de salon</a>, elle même dérivée de l'horloge du <a href="http://burogu.makotoworkshop.org/index.php?post/2018/11/01/wrrw8">WebRadioRéveilWifi</a>, donc de conserver la même carte électronique, et simplement la modifier pour ajouter un capteur <em>DHT11</em>.<br /></li>
</ul>
<ul>
<li>J'ai donc édité le schéma (projet kicad en annexe<sup>[<a href="http://burogu.makotoworkshop.org/index.php?post/2022/07/30/horloge2#wiki-footnote-1" id="rev-wiki-footnote-1">1</a>]</sup>) afin de documenter les modifications faites à la volée (comprendre charcutage de pistes au cutter, soudage de composants à la sauvage).<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/horloge/HorlogeBleue_Tempero_Structurel.png"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.HorlogeBleue_Tempero_Structurel_m.png" alt="" /></a><br />
Ont donc été supprimé les leds alarmes et le buzzer, car finalement ça ne m'est pas utile, afin de disposer d'une sortie <em>PWM</em> de l<em>'Arduino</em> pour séparer la commande des deux leds constituant le « deux points » scindant heure et minutes.<br />
Je n'ai pas de photos à montrer, j'ai refermé l'appareil là… flemme.<br /><br /></p>
<h3><ins>Le programme</ins> :<br /></h3>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc06037.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc06037_t.jpg" alt="" style="float:right; margin: 0 0 1em 1em;" /></a></p>
<ul>
<li><a href="https://github.com/makotoworkshop/HorlogeBleue_Tempero/blob/main/HorlogeBleue_Tempero.ino">Le code est ici</a> ou en annexe du billet<sup>[<a href="http://burogu.makotoworkshop.org/index.php?post/2022/07/30/horloge2#wiki-footnote-2" id="rev-wiki-footnote-2">2</a>]</sup>, corrigé de quelques erreurs de jeunesse, mais je n'ai pas pris le temps de nettoyer le code et de commenter correctement, désolé…<br /><br /></li>
<li>Les boutons Alarmes ont donc été remplacées par :<br /></li>
</ul>
<p>- Un bouton « Temp/Humido » permettant de choisir d'afficher en permanence la température ou bien l'humidité (mise à jours toutes les 2 secondes).<br />
- Un bouton « Caroussel » permettant d'afficher l'heure durant 8 secondes, puis de basculer 2 secondes sur la température, puis 2 secondes sur l'humidité.<br />
- Le bouton « Horloge » permet comme auparavant de mettre à l'heure l'horloge en le combinant aux boutons « heures » ou « minutes », mais aussi de demander d'afficher uniquement l'heure.<br /></p>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc06034.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc06034_s.jpg" alt="" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc06035.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc06035_s.jpg" alt="" /></a><br />
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc06036.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc06036_s.jpg" alt="" style="float:left; margin: 0 1em 1em 0;" /></a><br />
- Pour le reste, les leds de l'horloge s'allument lorsque le capteur <em>PIR</em> détecte un mouvement, et ceci pour 3 heures durant, avant de s'éteindre.<br />
- Pendant ce temps la photorésistance se charge d'ajuster l'intensité lumineuse des leds, plus forte s'il capte beaucoup de lumière et moins forte dans le cas contraire.<br />
<br /><br /><br /></p>
<ul>
<li>Une petite vidéo :</li>
</ul>
<iframe title="TempéroClock démo" src="https://peertube.makotoworkshop.org/videos/embed/c554198b-e4fd-4411-b681-6d2195e67e5e?warningTitle=0" allowfullscreen="" sandbox="allow-same-origin allow-scripts allow-popups" width="640" height="360" frameborder="0"></iframe>
<div class="footnotes"><h4>Notes</h4>
<p>[<a href="http://burogu.makotoworkshop.org/index.php?post/2022/07/30/horloge2#rev-wiki-footnote-1" id="wiki-footnote-1">1</a>] À voir ci-dessous… Attention, je n'ai pas mis à jour le PCB, il n'y a que le structurel qui contient les modifications</p>
<p>[<a href="http://burogu.makotoworkshop.org/index.php?post/2022/07/30/horloge2#rev-wiki-footnote-2" id="wiki-footnote-2">2</a>] ci-dessous</p></div>
http://burogu.makotoworkshop.org/index.php?post/2022/07/30/horloge2#comment-formhttp://burogu.makotoworkshop.org/index.php?feed/atom/comments/729Tempéro, thermomètres connectés -02-urn:md5:1d75b6e54c522158af4aa7e6d9807b822022-07-03T20:01:00+02:002022-07-05T18:44:04+02:00makoto doushiteÉlectroniqueArduinoDIYESP8266NodeMCU <p><a href="http://burogu.makotoworkshop.org/index.php?post/2022/06/25/tempero1">Précédemment sur makotoworkshop.org…</a> :<br /></p>
<blockquote><p>À priori, non, tu ne met pas ton capteur de <em>DHT22</em> dehors « comme ça », et encore moins accroché au mur de ta fenêtre.<br /></p></blockquote>
<p>C'est ce que j'ai assez vite déduit aux vues des résultats de recherche sur <em>Thingiverse</em>, en quête d'inspiration pour un modèle de boîtier.<br />
En effet, il semble finalement assez logique de se tenir aussi éloigné que possible des murs du bâtiment, au risque sinon de se retrouver à mesurer la T° résiduelle emmagasinée par celui-ci, et malgré ça, on ne peut pas non plus imaginer laisser le capteur cuire en plein soleil…<br /></p>
<blockquote><p>Une fois de plus ce fût l'occasion d'apprendre de nouvelle choses, et en cela, l’existence du « Stevenson shelter », un abris ventilé dans lequel on place les instruments de mesure pour les protéger du soleil tout en les laissant prendre le vent.<br /></p></blockquote>
<p>J'ai pu trouver le modèle qui me convenait et de l'adapter à mon besoin en le « remixant » en <em><a href="https://www.thingiverse.com/thing:5424654">Stevenson shelter pour balcon</a></em>.<br /></p>
<ul>
<li>Arès avoir imprimé toutes les pièces déterminantes en blanc, évidemment ici pour profiter de l'effet albédo, j'ai fait un essai d'assemblage de la soucoupe du bas avec la glissières.</li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/tempero/dsc06013.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/tempero/.dsc06013_m.jpg" alt="" /></a><br />
<a href="http://burogu.makotoworkshop.org/public/electronique/tempero/dsc05980.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/tempero/.dsc05980_s.jpg" alt="" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/tempero/dsc05981.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/tempero/.dsc05981_s.jpg" alt="" /></a><br />
Grâce aux tête fraisées des vis la glissière fait son office correctement.<br /></p>
<ul>
<li>Les trous de cette soucoupe sont plus petits et destinés à être taraudés donc, pour accueillir les vis de ⌀4 mm.<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/tempero/dsc05984.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/tempero/.dsc05984_s.jpg" alt="" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/tempero/dsc05982.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/tempero/.dsc05982_s.jpg" alt="" /></a><br /></p>
<ul>
<li>Ensuite collage du mille-feuille en m'aidant des trous prévus à l'origine pour des tiges filetées afin de bien aligner les pièces. Le capteur <em>DHT22</em> ainsi fixé à son support vient se loger au centre :<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/tempero/dsc06015.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/tempero/.dsc06015_s.jpg" alt="" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/tempero/dsc06018.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/tempero/.dsc06018_s.jpg" alt="" /></a><br /></p>
<ul>
<li>Reste à visser la glissière en place.<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/tempero/dsc06019.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/tempero/.dsc06019_t.jpg" alt="" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/tempero/dsc06023.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/tempero/.dsc06023_t.jpg" alt="" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/tempero/dsc06021.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/tempero/.dsc06021_t.jpg" alt="" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/tempero/dsc06020.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/tempero/.dsc06020_t.jpg" alt="" /></a><br /></p>
<ul>
<li>Une fois la seconde partie de la glissière fixée à la rambarde du balcon à l'aide de serre-câbles, il suffit de glisser notre <em>stevenson shelter</em> en place et de ligaturer une attache dans la boucle prévue pour éviter qu'il ne bouge.<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/tempero/dsc06025.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/tempero/.dsc06025_s.jpg" alt="" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/tempero/dsc06024.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/tempero/.dsc06024_s.jpg" alt="" /></a><br /><br /></p>
<h3>À suivre…</h3>http://burogu.makotoworkshop.org/index.php?post/2022/07/03/tempero2#comment-formhttp://burogu.makotoworkshop.org/index.php?feed/atom/comments/727Tempéro, thermomètres connectés -01-urn:md5:20df9bde2d329fe6a02d270f8be9ad8a2022-06-26T21:18:00+02:002022-07-05T18:44:36+02:00makoto doushiteÉlectroniqueArduinoDIYESP8266NodeMCU <blockquote><p>Ayant pu expérimenter les capteurs de température dans le but de réguler la température interne des bornes <em><a href="http://burogu.makotoworkshop.org/index.php?post/2021/09/23/jubeat06">jubeat</a></em> et <em><a href="http://burogu.makotoworkshop.org/index.php?post/2022/05/18/sdvx5">Sound Voltex</a></em>, la thématique estivale des températures records aidant, j'ai eu envie de m'essayer à bricoler une petite station météo partielle, sachant que le boulot serait pas mal inspiré de mes précédents travaux sur l'<a href="http://burogu.makotoworkshop.org/index.php?post/2018/11/12/anemometre">anémomètre</a> (la version <em>WiFi</em>)</p></blockquote>
<p>Partielle car il manquerait un pluviomètre et l'absence d'anémomètre va permettre je pense l'utilisation d'une alimentation sur batterie solaire, mais nous étudierons cela plus tard, commençons déjà par expérimenter.<br /><br /></p>
<h3><ins>Câblage</ins> :<br /></h3>
<blockquote><p>Un capteur <em>DHT22</em> est situé à l'intérieur de l'habitat.<br />
Un autre capteur <em>DHT22</em> est placé à l'extérieur de l'habitat.<br />
Tous deux connectés sur un <em>NodeMCU</em> (plaquette à base d<em>'esp8266</em>) chargé d'envoyer les valeurs de températures et d'humidité sur un afficheur <em>LCD</em> connecté en <em>I²C</em>, et également sur un serveur web <em>influxDB</em> + <em>Grafana</em> pour tracer des courbes dans le temps.<br /></p></blockquote>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/tempero/Tempero_schema_AlimSecteur.png"><img src="http://burogu.makotoworkshop.org/public/electronique/tempero/.Tempero_schema_AlimSecteur_m.png" alt="" style="display:table; margin:0 auto;" /></a><br /></p>
<ul>
<li>Voici la maquette câblée, avec le module <em>I²C</em> bien pratique, soudé au dos de l'afficheur <em>LCD</em> :</li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/tempero/20220626_123212.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/tempero/.20220626_123212_s.jpg" alt="" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/tempero/20220626_123309.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/tempero/.20220626_123309_s.jpg" alt="" /></a><br /><br /></p>
<h3><ins>Programme</ins> :<br /></h3>
<ul>
<li>Le code utilisé est disponible en annexe du billet<sup>[<a href="http://burogu.makotoworkshop.org/index.php?post/2022/06/25/tempero1#wiki-footnote-1" id="rev-wiki-footnote-1">1</a>]</sup> et sur mon <em>github</em>.<br /></li>
</ul>
<p><a href="https://github.com/makotoworkshop/nodeMCU_tempero_AlimSecteur">https://github.com/makotoworkshop/nodeMCU_tempero_AlimSecteur</a>.<br /></p>
<ul>
<li>J'attire cependant l'attention du bidouilleur attentif.<br /></li>
</ul>
<blockquote><p>En effet le code utilisé dans le fichier <em>ESPinfluxdb.cpp</em> n'est plus compatible avec la librairie de carte disponibles dans l<em>'Arduino IDE</em> que j'utilise pour programmer le <em>nodeMCU</em>.<br />
Pour disposer de la carte <em>NodeMCU 1.0 (ESP-12E Module)</em> dans l<em>'IDE</em> il faut avoir au préalable chargé la carte, ce qui se fait en deux temps :</p></blockquote>
<p>1 - Ajouter l'adresse <em>https://arduino.esp8266.com/stable/package_esp8266com_index.json</em> à la case <em>URL de gestionnaire de cartes supplémentaires</em> depuis le menu <em>Fichier</em> > <em>Préférences</em> > onglet <em>Paramètres</em>.<br />
2 - Ajouter la carte depuis le menu <em>Outil</em> > <em>Type de carte</em> > <em>Gestionnaire de Carte</em>, puis<br /></p>
<blockquote><p>rechercher <em>esp8268</em> et on trouve <em>esp8268 by ESP8266 Community</em> dont la dernière version est la 3.0.1, et qui refuse de compiler le code dudit fichier avec des erreurs à base de machin « deprecated blablabla use WiFiClient… ».<br />
J'ai eu beau modifier le code, je ne suis pas parvenu à circonscrire les erreurs de compilation, aussi j'ai rétrogradé à la version 2.4.2, celle-là même qui fonctionnait à l'époque de mes bricoles avec l'anémomètre<em>WiFi</em>.<br /></p></blockquote>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/tempero/Tempero02.png"><img src="http://burogu.makotoworkshop.org/public/electronique/tempero/.Tempero02_m.png" alt="" /></a><br />
Au démarrage du programme, différents messages s'affichent pour indiquer la connexion au <em>WiFi</em>, puis la connexion à la base de donnée <em>influxDB</em>, ainsi qu'un avertissement en cas de problème avec les capteurs.<br /></p>
<ul>
<li>Ensuite on devrait obtenir ceci :<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/tempero/20220626_124108.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/tempero/.20220626_124108_m.jpg" alt="" /></a><br /><br /></p>
<h3><ins>Traceur de courbe</ins> :<br /></h3>
<ul>
<li>Synoptique de principe :<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/tempero/Tempero_synoptic.png"><img src="http://burogu.makotoworkshop.org/public/electronique/tempero/.Tempero_synoptic_m.png" alt="" /></a>
<a href="http://burogu.makotoworkshop.org/index.php?post/2019/08/05/anemometre3">Mon tuto de l'époque</a> reste relativement adéquat, aussi je vous renvoie aux sections <em><strong>Configuration de la Base de données</strong></em> et <em><strong>Configuration de la Grafana</strong></em> de celui-ci.<br />
<em>Grafana</em> a quelque peu évolué depuis, et certaines captures d'écrans ne sont plus bonnes, mais l'essentiel y est, flemme d'en refaire de nouvelles.<br /></p>
<ul>
<li>Voici ce qu'on peut obtenir avec un peu de temps à configurer les graphes :<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/tempero/Tempero01.png"><img src="http://burogu.makotoworkshop.org/public/electronique/tempero/.Tempero01_m.png" alt="" /></a><br /><br /></p>
<h3><a href="http://burogu.makotoworkshop.org/index.php?post/2022/07/03/tempero2">À suivre…</a></h3>
<div class="footnotes"><h4>Note</h4>
<p>[<a href="http://burogu.makotoworkshop.org/index.php?post/2022/06/25/tempero1#rev-wiki-footnote-1" id="wiki-footnote-1">1</a>] Voir ci-dessous</p></div>
http://burogu.makotoworkshop.org/index.php?post/2022/06/25/tempero1#comment-formhttp://burogu.makotoworkshop.org/index.php?feed/atom/comments/726Sound Voltex -2-urn:md5:d925905ccb6f5748fc58cea2c8052c982022-01-09T19:10:00+01:002022-05-14T13:12:50+02:00makoto doushiteArcadeArduinoBricolageDIYJeux videoManette-Joypad-JoystickVidéos<p><a href="http://burogu.makotoworkshop.org/index.php?post/2021/11/06/sdvx1">Suite de la bidouille précédente</a> :<br /></p>
<blockquote><p>Je disais donc, « construire quelques chose de plus sérieux », mais qui reste peu encombrant, à l'image du stick arcade qu'on peut sortir du placard pour « se faire un p'ti street ».<br />
Et c'est sur cette même idée que je vais procéder. En effet la technique de fabrication sera quasi identique à celle de mon <a href="http://burogu.makotoworkshop.org/index.php?post/2011/03/20/joystick-arcade-usb-1-">joystick</a>, « celui-là même par quoi tout à commencé », réalisé il y a maintenant 10 ans. (Merde ! Déjà… Comme on dit…)<br />
Je ne vais rien inventer, pas mal d'amateurs·ices ont déjà bricolés ce genre de choses, et on trouve quelques tutos bien fichu sur le net.<br />
Comme celui-ci <a href="https://sdvx-diy.github.io/">https://sdvx-diy.github.io/</a>, dont je vais utiliser le firmware électronique un poil modifié pour mon usage (le soft à coller dans l<em>'Arduino</em>), ou celui-là <a href="https://consandstuff.github.io/rhythmcons/sound-voltex/sdvx-normal/">https://consandstuff.github.io/rhythmcons/sound-voltex/sdvx-normal/</a>, qui s'attarde à détailler sa manière de faire.<br />
J'ambitionne juste de faire plus élégant, sachant bien entendu que chacun ses goûts, y'a pas trop à discuter, tout ça quoi…<br /></p></blockquote>
<p><br /></p>
<h3><ins>Fournitures</ins> :<br /></h3>
<p>Désolé, je n'ai pas pas pensé prendre de photos avec tous le matos arcade réunis, et j'ai la flemme de tout démonter pour le faire, donc vous découvrirez ça en allant.<br /></p>
<ul>
<li>Les prix sont frais de port et <em>TVA</em> comprise :<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/20211103_185841.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/.20211103_185841_t.jpg" alt="" style="float:right; margin: 0 0 1em 1em;" /></a></p>
<blockquote><p>- 25 Cosses à sertir 6.3 mm : <a href="https://fr.aliexpress.com/item/32786820964.html">3€71</a><br />
- 50 Cosses à sertir 4.8 mm : <a href="https://fr.aliexpress.com/item/32755341225.html">4€15</a><br />
- 1 Bouton carré de 33 mm : <a href="https://fr.aliexpress.com/item/32804514696.html">3€</a><br />
- 4 Boutons carrés de 60 mm : <a href="https://fr.aliexpress.com/item/4001356296596.html">18€62</a><br />
- 5 Boutons rectangulaires de 50x30 mm : <a href="https://fr.aliexpress.com/item/32765559236.html">11€15</a><br />
- 2 Encodeur 600 P / R 5V-24V, axe 6 mm : <a href="https://fr.aliexpress.com/item/32669741048.html">24€30</a><br />
- 2 Bouton en aluminium (Diamètre 30 mm, hauteur 25 mm, trou 6 mm) : <a href="https://fr.aliexpress.com/item/32912485815.html">7€70</a><br /></p></blockquote>
<p>Total = 72€63<br /><br /></p>
<h3><ins>Découpe du panel</ins> :<br /></h3>
<p><a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/dj-dao.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/.dj-dao_t.jpg" alt="" style="float:left; margin: 0 1em 1em 0;" /></a>
La première question que je me suis posé, outre le fait de commander des fournitures arcade adéquates, est de savoir à quelles dimensions découper le boîtier du contrôleur, que les gens réalisent souvent assez gros, à l'image du <a href="https://www.gamo2.com/jp/products/detail.php?product_id=65">contrôleur officiel</a> qui reprend le design biseauté de la borne d'arcade (quelques photos sur le <a href="https://blog.flipflop-jp.com/archives/3020/post-3020/">blog.flipflop-jp</a>).<br /><br /></p>
<ul>
<li>Mais c'est en voyant les <a href="https://gamo2.com/en/product/faucetwo/specs.html">dimensions très réduites du modèle faucetwo</a> dessiné par <a href="https://www.youtube.com/watch?v=ZGUSWQXGf6Y">Tokaku</a> que j'ai décidé de m'en rapprocher.<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/SDVX_measures_Makoto.png"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/.SDVX_measures_Makoto_m.png" alt="" /></a><br /></p> <p>Ce qui donc a permis de résoudre la première étape : Choisir le panneau de bois dans lequel découper le panel.<br /></p>
<blockquote><p>J'avais depuis 20 ans en stock du contre-plaqué de récupération de 6 mm d'épaisseur pas mal rigide, et justement un morceau d'à peu prés la bonne dimension.<br /></p></blockquote>
<ul>
<li>J'ai donc reporté le patron<sup>[<a href="http://burogu.makotoworkshop.org/index.php?post/2022/01/08/sdvx2#wiki-footnote-1" id="rev-wiki-footnote-1">1</a>]</sup> de l'emplacement des boutons, avec une technique un peu particulière.<br /></li>
</ul>
<blockquote><p>En 10 ans, j'ai eu le temps de mater quelques vidéos de menuisier sur <em>tutube</em> et d'emprunter leur manière de tracer, non pas avec un crayon, mais avec une lame de cutter.<br />
Non seulement c'est plus précis, l'épaisseur du trait ne laissant plus aucun doute sur le fait de couper dessus, à droite ou à gauche de celui-ci, ça ne s'estompe pas à force de manipulations, et fraise sur le gâteau, j'ai constaté que si l'on a pris soin d'enfoncer la lame jusqu'à la première couche de bois, les éclats de bois produit par la scie sauteuse sont instantanément neutralisés à cette frontière, laissant une arrête bien nette !<br />
Voilà donc pour le « level up » par rapport au panel de mon joystick tout éclaté à l'époque…<br /></p></blockquote>
<ul>
<li>Du coup, cliquez bien sur les vignettes pour voir ce tracé en grand :<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/dsc05507.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/.dsc05507_s.jpg" alt="" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/dsc05508.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/.dsc05508_s.jpg" alt="" /></a><br /></p>
<ul>
<li>Pour la découpe des emplacements des boutons, ça se passe simplement en perçant deux trous et en y insérant la lame de scie sauteuse, avant de terminer à la lime.</li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/20211109_153220.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/.20211109_153220_s.jpg" alt="" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/20211109_162659.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/.20211109_162659_s.jpg" alt="" /></a><br /></p>
<ul>
<li>La tige des encodeurs étant très courte, j'ai décidé d'utiliser la défonceuse afin de gagner 3 mm de profondeur en y logeant le corps des encodeurs.<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/20211115_123356.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/.20211115_123356_s.jpg" alt="" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/20211109_153232.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/.20211109_153232_s.jpg" alt="" /></a><br />
Première fois pour moi avec cet outil utilisé à main levée, c'est vraiment intéressant ce qu'on peut faire avec…<br /></p>
<ul>
<li>Voici l'ouvrage terminé et les fournitures en place, fixées dans leurs emplacements.<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/20211111_172328.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/.20211111_172328_s.jpg" alt="" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/20211111_172659.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/.20211111_172659_s.jpg" alt="" /></a><br />
Comme vous le voyez, le bloc micro-switch qui comporte la led s'insère et se verrouille dans le bouton.<br /><br /></p>
<h3><ins>Le câblage</ins> :<br /></h3>
<p>On va pouvoir procéder tranquillement au câblage, directement sur site, ainsi les câbles seront optimisés en longueur.<br /></p>
<ul>
<li>On commence par le chemin de masse, puis le raccordement de chaque boutons et leds à l<em>'Arduino Pro Micro</em> :<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/20211111_200841.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/.20211111_200841_s.jpg" alt="" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/20211111_214401.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/.20211111_214401_s.jpg" alt="" /></a><br />
Le fil souple multi-brun de récupération que j'utilise étant relativement fin, et ne disposant pas de pince à sertir adéquate, je me suis contenté de souder chaque fil sur les cosses, puis de rabattre les ergots. Le petit capuchon de silicone est vraiment pratique et sera très utile pour isoler les contacts et éviter tout accident de court-circuit qui pourrait survenir à la manipulation.<br /></p>
<ul>
<li>Une petite vidéo, désolé pour le cadrage tremblant :<br /></li>
</ul>
<iframe title="panelSDVX_test" src="https://peertube.makotoworkshop.org/videos/embed/6a12ea98-d076-4c48-858f-c9463d6c8918?warningTitle=0" allowfullscreen="" sandbox="allow-same-origin allow-scripts allow-popups" width="640" height="360" frameborder="0"></iframe>
<ul>
<li>Voilà une fois le chemin de câble attaché :<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/20211120_210402.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/.20211120_210402_s.jpg" alt="" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/20211120_210323.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/.20211120_210323_s.jpg" alt="" /></a><br />
Après avoir testé le panel, j'ai eu la mauvaise surprise de voir la prise <em>microUSB</em> de l<em>'arduino</em> s'arracher de la plaquette, alors que je branchai simplement le câble <em>USB</em> dessus. J'ai bien entendu ressoudé ça en place, et ceci m'a fait prendre conscience au passage qu'il vaudrait mieux permettre le remplacement de l<em>'arduino</em> facile.<br />
J'ai donc dé-soudé tous les fils et utilisé une plaquette à trous avec ce qu'il faut pour insérer l<em>'arduino</em> dessus. Par la même occasion, ça permet de fixer tout ça avec une vis au panel.<br /></p>
<ul>
<li>Et aussi d'en profiter pour raccourcir les câbles des encodeurs et vu qu'ils ne disposent pas de système de cosses, leur confectionner des connecteurs sur mesure à raccorder sur la plaquette à trous.<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/20211120_212259.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/.20211120_212259_s.jpg" alt="" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/20211120_212747.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/.20211120_212747_s.jpg" alt="" /></a><br /></p>
<p><a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/20211120_212934.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/.20211120_212934_s.jpg" alt="" style="float:right; margin: 0 0 1em 1em;" /></a></p>
<ul>
<li>Contrairement à mon joystick, le panel sera maintenu en place avec des aimants, c'est pour ça que j'ai fixé sur les rebords, des plaquettes en métal d'aimants à placard, avec de la colle <em>araldite</em>.<br /></li>
</ul>
<p>On s'arrête ici pour le moment.<br />
Nous avons donc un panel fonctionnel, câblé proprement qu'il suffira de coller dans un boîtier.<br />
Enfin ça, c'est ce que pensais, puis j'ai changé mes plans…<br />
Affaire à suivre <img src="http://burogu.makotoworkshop.org/index.php?pf=smile.svg" alt=":)" class="smiley" /><br />
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/dsc05605.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/.dsc05605_s.jpg" alt="" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/dsc05608.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/.dsc05608_s.jpg" alt="" /></a><br /><br /></p>
<h3><ins>Programmation</ins> :<br /></h3>
<p>Avant de téléverser <a href="https://github.com/Reyn-Mukai/SDVX-DIY/tree/Standard">le firmware</a> dans l<em>'Arduino</em>, j'ai dû modifier le sketch <em>SDVX-SIY.ino</em> afin de réorganiser l'assignation des pins en fonction de ce que j'ai câblé.<br />
Là vous me diriez à juste titre que j'aurais dû regarder le code et câbler en fonction, sauf qu'à priori le code est prévu pour un <em>Arduino Leonardo</em>, et donc une assignation différente.<br />
Par chance l<em>'Arduino Pro Micro</em> dispose de « pile-poil » le nombre de pins nécessaires aux boutons et aux leds… ouf !<br /></p>
<pre class="brush: cpp">/* Button Input Pins */
#define BTA_PIN A2
#define BTB_PIN A3
#define BTC_PIN A0
#define BTD_PIN A1
#define FxL_PIN 4
#define FxR_PIN 5
#define START_PIN 8
/* LED Output Pins */
#define BTA_LED 9
#define BTB_LED 10
#define BTC_LED 14
#define BTD_LED 15
#define FxL_LED 6
#define FxR_LED 7
#define START_LED 16
/* Software Debounce Interval */
#define DEBOUNCE 10
/* Encoder */
#define ENC_1_PIN_A 0
#define ENC_1_PIN_B 1
#define ENC_2_PIN_A 2
#define ENC_2_PIN_B 3</pre>
<p><br /></p>
<h3><a href="http://burogu.makotoworkshop.org/index.php?post/2022/01/11/sdvx3">À suivre…</a></h3>
<div class="footnotes"><h4>Note</h4>
<p>[<a href="http://burogu.makotoworkshop.org/index.php?post/2022/01/08/sdvx2#rev-wiki-footnote-1" id="wiki-footnote-1">1</a>] Fichier pour GIMP en annexe ci-dessous</p></div>
http://burogu.makotoworkshop.org/index.php?post/2022/01/08/sdvx2#comment-formhttp://burogu.makotoworkshop.org/index.php?feed/atom/comments/713Sound Voltex -1-urn:md5:4a97fe1743a5e247de483a7491a2acaf2022-01-08T15:02:00+01:002022-01-09T19:18:09+01:00makoto doushiteArcadeArduinoBricolageDIYImpression3DJeux videoManette-Joypad-JoystickVidéosÉlectronique<p><a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/SDVX_EXCEEDGEAR.png"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/SDVX_EXCEEDGEAR.png" alt="" style="float:left; margin: 0 1em 1em 0;" /></a><br />
<em>Sound Voltex</em>… Qu'est-ce que c'est encore ça donc ?<br />
Ben un autre jeu de rythme de <em>Konami</em>, que vous pourrez découvrir plus en détail sur le site <a href="https://bemani.fr/game/sdvx/">https://bemani.fr/game/sdvx/</a>.<br />
Mais surtout une énorme borne d'Arcade, comme on peut l'admirer ci-contre… (non, calme-toi, je vais pas la fabriquer…)<br /><br /></p>
<p>Il semble en effet que je fasse partie des ces personnes qui aime ce type de jeu, et jusqu'ici je ne m'en étais pas vraiment rendu compte…<br />
Je pensais jouer à « un peu tout », mais en fait le temps passant, certains genres ressortent bien plus maintenant qu'auparavant.<br />
Et si je regarde ce que j'ai tâté pour 5 minutes, ou des centaines d'heures, nous avons tout de même <em>DDR, Guitar Heroe, Oendan, Taiko no Tatsujin, jubeat, Beat Mania, Technika2</em>, et <em>Pop'n music</em>.<br /></p>
<p>Ainsi je suis un joueur de <em>Shmup</em> et chose pas si rare pour cette catégorie, aussi de jeux de rythmes. Il y a un lien entre ces deux genres, et celleux qui ont déjà entendu parler du concept de « zone » ou de « flow » comprendront je pense ce qu'il peut bien y avoir en commun entre un <em>Shmup</em> et un <em> rhythm game</em>.<br /><br /><br /><br /></p>
<ul>
<li>Bref, séduit par l'originalité du contrôleur du jeu, j'ai voulu m'y essayer, en commençant doucement par quelque chose d'accessible pour moi, « sans dépenser un rond » ni traverser la moitié du pays pour trouver une borne jouable.<br /><br /></li>
</ul>
<h3><ins>Un contrôleur fait maison</ins> :<br /></h3>
<p>J'ai donc repéré l’existence d'un mini-contrôleur, alias le « Pocket-SDVX », partagé sur le <em><a href="https://github.com/speedypotato/Pocket-SDVX">github de speedypotato</a></em>.<br />
Ni une ni deux, j'ai fouillé mes tiroirs à la recherche des composants nécessaires, et oui, j'avais souvenir de tout avoir sous la main, on va pouvoir le construire tout de suite !<br /></p>
<ul>
<li><em>Arduino Pro Micro</em>, encodeurs, touches de clavier mécanique de récup, restait à imprimer les pièces de plastiques :<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/20210928_190233.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/.20210928_190233_s.jpg" alt="" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/dsc05480.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/.dsc05480_s.jpg" alt="" /></a><br /></p> <ul>
<li>Cependant, si tout est prévu pour s’en-clipser, il restait un soucis avec ces encodeurs au corps dépourvu de filetage et j'ai donc improvisé en le passant dans une filière <em>M8</em>, pour un résultat satisfaisant :<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/dsc05481.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/.dsc05481_s.jpg" alt="" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/dsc05482.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/.dsc05482_s.jpg" alt="" /></a><br /></p>
<ul>
<li>Les pièces en présences…<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/dsc05485.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/.dsc05485_s.jpg" alt="" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/dsc05487.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/.dsc05487_s.jpg" alt="" /></a><br /></p>
<ul>
<li>Le câblage n'a rien de compliqué, et le système de passage du câble micro-usb plutôt bien pensé :<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/dsc05492.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/.dsc05492_s.jpg" alt="" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/dsc05493.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/.dsc05493_s.jpg" alt="" /></a><br /></p>
<ul>
<li>Le <em>knob</em><sup>[<a href="http://burogu.makotoworkshop.org/index.php?post/2021/11/06/sdvx1#wiki-footnote-1" id="rev-wiki-footnote-1">1</a>]</sup> viens se ficher sur la tige de l'encodeur… Et voilà !<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/20211001_200839.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/.20211001_200839_s.jpg" alt="" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/20211001_200817.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/.20211001_200817_s.jpg" alt="" /></a><br /></p>
<ul>
<li>Dessous j'ai collé des pieds de caoutchouc de récup, et j'ai fini par imprimer la déco sur un film plastique autocolant :<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/dsc05495.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/.dsc05495_s.jpg" alt="" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/dsc05503.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/sdvx/.dsc05503_s.jpg" alt="" /></a><br /></p>
<p>Le choix par défaut du jaune c'est ainsi révélé pas si mal <img src="http://burogu.makotoworkshop.org/index.php?pf=smile.svg" alt=":)" class="smiley" /><br />
Bon ensuite faut programmer l<em>'Arduino</em>, rien de compliqué si vous êtes familier avec ça, tout est indiqué par <em><a href="https://www.youtube.com/watch?v=lBxHQ7Z72sY&list=PLSlCMOwxujV7-DYrM4eC2Sb4_rMR5udEE">speedypotato</a></em>, y compris pour la partie câblage.<br /><br /></p>
<h3><ins>Et le jeu alors ?</ins> :<br /></h3>
<blockquote><p>Vous serez heureus·e·s d'apprendre qu'il existe un clone du jeu d<em>'Arcade</em> qui ne porte pas son nom, <em><a href="https://github.com/Drewol/unnamed-sdvx-clone">unnamed-sdvx-clone</a></em>.<br /></p></blockquote>
<p>Via le <em>github</em> on va donc pourvoir se l'installer via quelques commandes :<br /></p>
<ul>
<li>Clonage du projet en local puis récupération des dépendances grâce à <em>submodule recursive</em> :<br /></li>
</ul>
<pre class="brush: bash">git clone https://github.com/Drewol/unnamed-sdvx-clone.git
cd unnamed-sdvx-clone/
git submodule update --init --recursive</pre>
<ul>
<li>Installation du compilateur <em>CMake</em> et les librairies requises :<br /></li>
</ul>
<pre class="brush: bash">sudo apt install cmake libfreetype-dev libogg-dev libvorbis-dev libsdl2-dev zlib1g-dev libpng-dev libjpeg-dev libarchive-dev libgl1-mesa-dev openssl libssl-dev libiconv-hook-dev</pre>
<ul>
<li>Configuration du logiciel :<br /></li>
</ul>
<pre class="brush: bash">cmake -DCMAKE_BUILD_TYPE=Release .</pre>
<p>Si des erreurs sont indiquées, il faut les corriger avant de passer à l'étape suivante !<br /></p>
<p>Et enfin, compilation du logiciel :<br /></p>
<pre class="brush: bash">make</pre>
<ul>
<li>Avant de pouvoir jouer, il faut créer le dossier suivant :</li>
</ul>
<pre class="brush: bash">mkdir bin/songs</pre>
<p>Et déposer les chansons dedans (accepte les arborescences en sous-dossier).<br />
Pour dégotter les chansons, ces mots clefs seront utiles : <em>ksh songs sdvx</em><br />
Il est également possible de télécharger des titres directement depuis le jeu, via le menu « Get Songs » sur la page d'accueil :)<br /></p>
<ul>
<li>L'exécutable se trouve dans le dossier <em>bin</em> :</li>
</ul>
<pre class="brush: bash">unnamed-sdvx-clone/bin/usc-game</pre>
<p>Ça fonctionne parfaitement sur mon Ubuntu 20.04LTS !
<br /><br /></p>
<h3><ins>Maintenant on joue !</ins> :<br /></h3>
<p>Le jeu a le gros avantage de changer d'aspect selon que l'écran est disposé horizontalement ou verticalement, et c'est cette dernière disposition qui sera bien sûr la plus adaptée, faisant apparaître le poste de pilotage du véhicule qui parcoure les « rails ».<br /></p>
<ul>
<li>Une petite vidéo :<br /></li>
</ul>
<iframe width="640" height="360" sandbox="allow-same-origin allow-scripts allow-popups" title="miniSDVX_demo" src="https://peertube.makotoworkshop.org/videos/embed/0b641c43-d394-42f8-b87a-43402b31a06d?warningTitle=0" frameborder="0" allowfullscreen></iframe>
<p>Oui, alors on dirait qu'on est en train de taper au clavier du coup :P<br /></p>
<ul>
<li>Un petit contrôleur de voyage bien sympatosh, le jeu est plaisant… hum, je pense qu'on va construire quelque chose de plus sérieux. (Non pas la borne j'ai dis !!)<br /><br /></li>
</ul>
<h3><a href="http://burogu.makotoworkshop.org/index.php?post/2022/01/08/sdvx2">À suivre…</a></h3>
<div class="footnotes"><h4>Note</h4>
<p>[<a href="http://burogu.makotoworkshop.org/index.php?post/2021/11/06/sdvx1#rev-wiki-footnote-1" id="wiki-footnote-1">1</a>] En annexe vous trouverez le fichier 3D pour le <em>knob</em> que j'ai dû dessiner moi-même.</p></div>
http://burogu.makotoworkshop.org/index.php?post/2021/11/06/sdvx1#comment-formhttp://burogu.makotoworkshop.org/index.php?feed/atom/comments/712jubeat -1-urn:md5:e9fa4f464fa12a688f5c695b433444702021-04-05T17:52:00+02:002022-05-26T18:25:17+02:00makoto doushiteArcadeArduinoBricolageDIYJeux videoManette-Joypad-JoystickVidéosÉlectronique<p><a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/IMG_0238.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/.IMG_0238_s.jpg" alt="" style="float:right; margin: 0 0 1em 1em;" /></a></p>
<blockquote><p>Cela fait un peu plus de 6 ans maintenant, en décembre 2014, que j'ai découvert <em><a href="https://en.wikipedia.org/wiki/Jubeat">Jubeat</a></em> en salle d'Arcade, et que j'ai été rapidement séduit par la rapidité de prise en main de ce jeu de rythme de <em>Bemani</em> (la branche Rhythm game de <em>Konami</em>).<br /></p></blockquote>
<p>Photo d'époque avec mon <em><a href="http://burogu.makotoworkshop.org/index.php?post/2014/09/03/firefoxos">FirefoxOS</a></em> sur <em>OpenC</em> (que j'utilise toujours…) qui galère sévère en basse lumière.<br /></p>
<blockquote><p>Et depuis que la salle a fermé, j'<a href="http://burogu.makotoworkshop.org/index.php?post/2015/09/23/liste-travaux-projets2">envisageais</a> de me fabriquer une version portable de la borne, mais sans jamais lancer les choses sérieusement. J'avais quelques idées de façons de faire et elles nécessitaient l'emploi d'une découpeuse laser, j'avais d'ailleurs commencé à me renseigner sur l'engin en FabLab…<br />
Mais bon, je pense que j'étais freiné par la complexité mécanique du panel 16 boutons à concevoir, on est ici pas face à la trivialité de confection d'un stick arcade.<br /></p></blockquote>
<ul>
<li>J'avais tout de même trouvé pas mal de documentation sur des panels <em>DIY</em>, et on en trouve encore plus aujourd'hui, mais globalement la recette reste la même, à base de microswitch :<br /></li>
</ul>
<p>À l'époque, c'est sur <em>NezBlog</em> que j'ai eu l'inspiration, site Japonais malheureusement disparu, mais qui ne meurt pas complètement grâce à <em><a href="https://archive.org/">archive.org</a></em>, voici donc, via <em>archive.org</em> les 4 pages du contrôleur aboutit en 2011 :<br /></p>
<blockquote><p>- <a href="https://web.archive.org/web/20161215125251/http://blog.nezweb.net/archives/572">jubeatコントローラ自作計画まとめ</a><br />
- <a href="https://web.archive.org/web/20161215125311/http://blog.nezweb.net/archives/624">jubeatコントローラ自作計画まとめ(2)</a><br />
- <a href="https://web.archive.org/web/20161215125430/http://blog.nezweb.net/archives/652">jubeatコントローラ自作計画まとめ(3)</a><br />
- <a href="https://web.archive.org/web/20161215125543/http://blog.nezweb.net/archives/778">自作jubeat用PIC回路図&ファームウェア</a><br />
- La vidéo qui montre la progression de la construction, sur <em><a href="https://www.nicovideo.jp/watch/sm16300086">NicoNico Douga</a></em><br /></p></blockquote>
<ul>
<li>Au même moment, je découvrais le panel <em><a href="https://www.gamo2.com/en/index.php?dispatch=products.view&product_id=310">DAO FB9</a></em>, un clone du panel de la borne originale, pour ainsi dire, une copie parfaite, qui avait le mérite d'être portable, permettant d'y glisser un écran, malheureusement plus distribué depuis.<br /></li>
</ul>
<p>Séduit par ces solutions, je me disais que plutôt que de concevoir une borne encombrante, autant avoir un panel à plaquer sur mon écran d'ordi 24 pouces, orientable grâce à un bras <em>ergotron</em>, et le tour serait joué…<br /></p>
<ul>
<li>Faut dire aussi qu'à l'époque j'étais tombé sur <a href="https://bemani.fr/forums/sujet/homemade-jubeat-controller/">pas mal d'informations erronées</a> à propos de l'écran de la borne !<br /></li>
</ul>
<p>On pouvait lire par-ci par-la qu'il faisait 22 pouces, réglé en 1280x720 et que les touches du panel mesuraient 65 mm de côtés.<br /></p>
<ul>
<li>Grâce aux photos du <em><a href="https://blog.flipflop-jp.com/archives/2711/post-2711/">FB9</a></em> sur le blog FlipFlop, j'ai pu comprendre que c'était sans doute du flan, et puis intrigué j'ai voulu vérifier, en mesurant comme j'ai pu à la salle, et j'avais noté des touches de 67 mm écartée de 13 mm, calculant alors un écran 26 pouces. (j'étais pas loin !)<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/IMG_0243.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/.IMG_0243_s.jpg" alt="" style="float:right; margin: 0 0 1em 1em;" /></a></p>
<ul>
<li>En parallèle de ça, j'avais aussi expérimenté le logiciel, en découvrant des clones du jeu :</li>
</ul>
<p>- Comme <em><a href="https://www.qwant.com/?client=brz-moz&q=Youbeat38FullDownload&t=web">Youbeat</a></em> (<em>Jubeat</em> se prononçant en fait <em>Youbeat</em>)<br />
- Ainsi que <em><a href="http://yosh52.web.fc2.com/">Jubeat Analyser</a></em>, qui permet carrément de créer ses propres <em>pattern</em> de jeux à plaquer sur des chansons. Je ne suis pas sûr d'ailleurs, mais je pense que <em>Youbeat</em> a été crée à partir de <em>Jubeat analyser</em>… À vérifier.<br />
- Voici d'ailleurs un peu plus d'info sur l'état actuel de l'émulation <a href="https://davidobot.net/2020/05/03/jubeat-pc">via ce site</a>.<br /></p>
<ul>
<li>Cependant j'avais pu dégotter une archive du jeu original — et qui fonctionnait — dans sa version « <em>Knit</em> », permettant alors de confirmer que le jeu tournait plutôt en 1360x768.<br /></li>
</ul>
<p>Souhaitant coller le plus à l'original, et pollué par ces info contradictoires, je ne comprenais plus rien, et ça a contribué à enterrer un peu plus l'étude qui partait mal…<br /><br /></p> <h3><ins>Retour à aujourd'hui</ins> :<br /></h3>
<ul>
<li>Après cette longue introduction, il y a quelques semaines donc, je ne me souviens plus trop pourquoi, le niveau de motivation est remonté et j'ai annoncé la chose publiquement via <em><a href="https://twitter.com/Makoto_Doushite/status/1361390301357694979">twitter</a></em> sachant que quelques personnes aiment à voir ce genre de bricoles.<br /></li>
</ul>
<p>Magie twitesque, <em>@catzou</em> me mis en relation avec la commu <em>Discord: Make Some Noise</em>, où j'ai découvert que mes travaux autour de l'arcade, décrit dans ce blog sont relativement connu par d'autres bricoleurs, puis j'ai été accompagné par <a href="https://www.instagram.com/crazyredmachine/">CrazyRedMachine</a> pour faire avancer mon entreprise à grand pas !<br />
D'abord intimidé par le fait d'être influencé dans mes idées, que la ligne directrice n'aille pas dans le sens obtus que j'ai pu imaginer, j'ai su me laisser entraîner petit à petit vers des solutions concrètes et plus simples, que nous verrons après.<br />
En effet, 6 ans plus tard j'ai acquis pas mal de nouvelles compétences, et certaines choses me paraissent plus facilement envisageable.<br />
- Notamment pour la fabrication des touches que j'imaginais tailler à la défonceuse, en ayant conçu des gabarit à l'imprimante3D.<br />
- Et comme on trouve des <em>rubbers</em> <a href="https://www.arcadespareparts.com/arcade_parts/konami_parts/jubeat_rubber_switch/13748.html">ici</a> ou <a href="https://www.yubiparts.com/product/jubeat-rubbers">là</a>, j'envisageais de fabriquer une plaquette électronique comme sur le panel original, avant de me rendre compte que <em><a href="https://github.com/veroxzik/jubeat-boards/tree/main/jubeat-button-pcb">veroxzik</a></em> avait déja fort bien fait le boulot.<br />
Encouragé donc, je comptais me faire découper la structure du panel au laser via <a href="https://easymetal.fr/">easymetal</a> dans <a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/Frame_metal.dxf">une plaque</a> de 5 mm d'épais, afin d'avoir une structure de base bien rigide, et ensuite d'imaginer comment assembler tout ça…<br /></p>
<ul>
<li>Car cette fois, on me tuyautait à partir d'informations fiables mesurées sur des pièces d'arcade originales, que voici :<br /></li>
</ul>
<blockquote><p>- Taille des touches, surface visible, 66,4x66,4 mm.<br />
- Grille avec des trous de 70x70 mm espacés de 11,67 mm.<br />
- Écran original de 25,5 pouces. Ça ne se trouve plus, donc on peut utiliser un moniteur de 27 pouces et on ajustera les bords de l'image dans les réglages de la carte graphique, ou alors un écran de TV 26 pouces qui sera le plus approchant.<br /></p></blockquote>
<p>Cependant, travailler à partir de photo sans avoir jamais touché les entrailles de l'objet reste un exercice difficile, et j'avais du mal à formaliser l'assemblage de cette solution hybride.<br />
S'est alors présenté une opportunité…<br /><br /></p>
<h3><ins>Ça devient concret</ins> :<br /></h3>
<ul>
<li><em>CrazyRedMachine</em> me fit part de la possibilité d'acheter des pièces de la borne d'origine, ou de son clone exploité en Chine (<em>Magic Box</em>).<br /></li>
</ul>
<p>Pas facile à trouver, mais faisable, via des sites comme <em>Yahoo Auction</em>, ou <em>Taobao</em>.<br />
Pour le premier, j'ai laissé passer l'enchère car le <em>proxy</em> (site web intermédiaire qui commande pour vous, car on ne peut pas acheter directement depuis la <em>France</em>) refusait d'enchérir un vendeur qui avait une note pas très bonne (comme sur <em>ebay</em> quoi), et pas de regret car le panel est finalement parti autour de 300€, puis bon, j'aime pas trop les enchères…<br />
Pour le second, nous avons vu « poper » <a href="https://item.taobao.com/item.htm?id=635571209771">cette annonce fort intéressante en achat immédiat,</a><sup>[<a href="http://burogu.makotoworkshop.org/index.php?post/2021/04/04/Jubeat#wiki-footnote-1" id="rev-wiki-footnote-1">1</a>]</sup> et le temps de trouver un <em>proxy</em> (<em>Superbuy</em>), de comprendre comment il fonctionne, de me décider, et j'avais acheté l'item, avec à chaque étapes du processus, l'inquiétude du débutant… Et puis 34 jours plus tard, il est arrivé !<br /></p>
<ul>
<li>Et surprise, il s'agit d'un panel officiel <em>Jubeat</em> alors qu'on s'attendait à son clone !!<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/dsc04868.jpg" title="dsc04868.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/.dsc04868_m.jpg" alt="dsc04868.jpg" /></a><br />
Avec les 50€ frais de ports (ça pèse quand même 2,5 kg, et avec le carton au total 3,2 kg), donc pour 100€ au total, c'est vraiment bien, et je suis quasi certain que j'aurais dépensé autant voir plus en le fabriquant moi même.<br /><br /></p>
<h3><ins>En attendant le colis</ins> :<br /></h3>
<p>Mais laissons un peu ça de côté, et voyons ce qu'on a pu faire en attendant que le paquet arrive.<br /></p>
<ul>
<li>J'allais donc recevoir un panel de jeu prêt à l'emploi, sauf qu'il manquait évidemment l'électronique pour interagir avec sur l'ordinateur.<br /></li>
</ul>
<blockquote><p>J'étais parti dans l'idée de bricoler l'électronique d'un clavier azerty de récupération donc, avant de me rendre compte qu'au delà de 3 ou 4 touches appuyées simultanément (et encore, ça dépend desquelles) la détection des touches supplémentaires ne fonctionne pas, ce qui peut-être pourrait se révéler gênant en cour de jeu.<br /></p></blockquote>
<ul>
<li>Cependant <em>CrazyRedMachine</em> avait déjà travaillé le sujet et publié sur son <em><a href="https://github.com/CrazyRedMachine/jubeatIO">github</a></em> de quoi se bricoler l'électronique d'un contrôleur de jeu disposant de 19 boutons, bien assez donc, à base d<em>'Arduino Leonardo</em>.<br /></li>
</ul>
<p>Comme je ne disposais que du modèle <em>Arduino pro Micro</em>, plus petit mais équivalent (moyennant moins d'in/out), je me suis donc attelé à sa programmation via cette modification du code, destinée à adapter les entrées utilisées sur le <em>pro Micro</em> :<br /></p>
<pre class="brush: cpp">// Arduino Leonardo
//uint8_t buttonPin[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,A5,A4,A3,A2,A1};
// Arduino Pro Micro
uint8_t buttonPin[] = {1,0,2,3,4,5,6,7,8,9,10,16,14,15,18,19,20,21};</pre>
<ul>
<li>Et pour compiler le programme sans encombre, il faudra avoir installé la librairie <em>ArduinoJoystickLibrary</em> de <em><a href="https://github.com/MHeironimus/ArduinoJoystickLibrary">MHeironimus</a></em>.<br /></li>
</ul>
<p>Super, ça marche, sur mon ordi <em>nunux</em> avec la commande pour tester les joysticks.<br /></p>
<pre class="brush: bash">jstest /dev/input/js0</pre>
<p><a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/20210320_161620.jpg" title="20210320_161620.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/.20210320_161620_t.jpg" alt="20210320_161620.jpg" style="float:right; margin: 0 0 1em 1em;" /></a></p>
<ul>
<li>La connexion de l<em>'Arduino</em> aux plaques du contrôleur <em>Jubeat</em> va donc s'effectuer via des connecteurs <em>JST</em>, et j'ai pu en trouver des pré-câblés sur <em><a href="https://www.ebay.fr/itm/10-Sets-JST-PH2-0mm-Right-Angle-2-3-4-5-10Pin-Cord-Wire-To-Board-Connector-Cable/114689270129?var=414849075046">ebay</a></em>, au pas de 2 mm, avec 9 broches (<em>JST PH2.0mm 9 pin</em>).<br /><br /></li>
<li>Une fois reçu, et quelques heures de câblages plus tard en suivant bien le <a href="http://burogu.makotoworkshop.org/index.php?post/2021/04/04/public/bricolage/arcade/jubeat/pinout.png">schéma</a> (oui c'est toujours très long à bricoler des câbles), voilà donc mon dispositif paré, plus qu'à attendre l'arrivée du panel :<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/dsc04913.jpg" title="dsc04913.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/.dsc04913_s.jpg" alt="dsc04913.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/dsc04911.jpg" title="dsc04911.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/.dsc04911_s.jpg" alt="dsc04911.jpg" /></a><br /><br /></p>
<h3><ins>Premier essai</ins> :<br /></h3>
<blockquote><p>Comme dirait l'autre, « j'adore qu'un plan se déroule sans accrocs », j'ai donc le panel devant moi, et pas d'erreurs dans la commande, ce sont les bons connecteurs <em>JST</em>, je connecte, branche l'ordinateur sur le test de joystick, et… Ho bah, ça marche pô, pas un seul des 16 boutons (càd 64 contacts) ne réponds :(<br /></p></blockquote>
<p>Un soucis dans le câblage, je me serais trompé… Hum ?<br />
Pas vraiment d’inquiétude en fait, j'ai bien conscience d'être face à un matériel qui a pas mal vécu, et qui présente des traces de corrosions.<br /></p>
<ul>
<li>Autrement dit, avant de conclure quoique ce soit il va me falloir tout démonter, nettoyer, et remonter avant de tester à nouveau.<br /></li>
</ul>
<p>L'occasion de voir comment c'est fait, et de peut-être comme c'était mon idée au départ, de pouvoir formaliser l'assemblage, sous forme de ressource en 3D qu'il suffirait de donner, au mieux, à une machine CNC. Sorte de rattrapage, l'achat du panel ayant fait perdre la reproductibilité du projet que je vous présente ici, ce qui m'a quelque peu chiffonné au départ. Mais bon ça se trouve je serais happé par un autre sujet et je ne produirais jamais ces ressources ? Bref, n'attendez pas après, ce sera une surprise… ou pas !<br /></p>
<ul>
<li>Observons donc ce que nous avons là…<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/dsc04875.jpg" title="dsc04875.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/.dsc04875_s.jpg" alt="dsc04875.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/dsc04876.jpg" title="dsc04876.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/.dsc04876_s.jpg" alt="dsc04876.jpg" /></a><br />
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/dsc04874.jpg" title="dsc04874.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/.dsc04874_s.jpg" alt="dsc04874.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/dsc04873.jpg" title="dsc04873.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/.dsc04873_s.jpg" alt="dsc04873.jpg" /></a><br />
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/dsc04877.jpg" title="dsc04877.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/.dsc04877_s.jpg" alt="dsc04877.jpg" style="float:right; margin: 0 0 1em 1em;" /></a></p>
<ul>
<li>Dans l'ensemble, pas mal de traces de début de rouille sur le métal, la peinture s'est écaillée au niveau de l'encadrement des touches, et durant le transport il y a eu de la casse sur un pied (recollé à la colle époxy) et la barre de fixation supérieure a été tordue (redressée à coups de marteau).<br /></li>
</ul>
<p>D'ailleurs, il est a noter qu'un morceau de la vis de fixation du pied est encore dans son filetage, et qu'un autre morceau de vis, bien saillant et tordu, est encore en place sur la barre de fixation, ce qui tend à me faire penser que le vendeur <em>taobao</em> serait en fait un récupérateur, désossant les carcasses à l'arrache pour tirer quelqu'argent des pièces détachées. Je ne critiquerais pas la méthode, si celle-ci permet de sauver quelques pièces sur des bornes en fin de vie.<br /></p>
<ul>
<li>Procédons au démontage, on retourne le panel, et en constate que la barre centrale qui maintient le bout des plaquettes électronique (<em>PCB</em>) en place est à l'envers, puisque les petits caoutchoucs noirs sont justement là pour venir en contact des coins des <em>PCB</em>. Il faudra que je retourne correctement cette barre au remontage :<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/dsc04879.jpg" title="dsc04879.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/.dsc04879_s.jpg" alt="dsc04879.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/dsc04881.jpg" title="dsc04881.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/.dsc04881_s.jpg" alt="dsc04881.jpg" /></a><br /></p>
<ul>
<li>Une fois les vis retirées, on peut extraire les <em>PCB</em> une à une, et oui, les contacts sont très sales, pas étonnant donc que ça ne fonctionne pas…<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/dsc04882.jpg" title="dsc04882.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/.dsc04882_s.jpg" alt="dsc04882.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/dsc04884.jpg" title="dsc04884.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/.dsc04884_s.jpg" alt="dsc04884.jpg" /></a><br /></p>
<ul>
<li>On continue, avec les <em>rubbers</em>, ces petits tampons en caoutchouc, du même type qu'on trouve dans les manettes de jeux pour faire contact avec les <em>PCB</em>, aux 4 coins de chaque touches, qu'on met soigneusement de côté pour ne pas en perdre, ils sont vraiment très petits.<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/dsc04886.jpg" title="dsc04886.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/.dsc04886_s.jpg" alt="dsc04886.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/dsc04887.jpg" title="dsc04887.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/.dsc04887_s.jpg" alt="dsc04887.jpg" /></a><br />
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/dsc04888.jpg" title="dsc04888.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/.dsc04888_s.jpg" alt="dsc04888.jpg" style="float:right; margin: 0 0 1em 1em;" /></a>
Ensuite on peut retirer les touches, qui ont l'air pas mal rayées…<br /></p>
<ul>
<li>Donc pour le nettoyage, on va d'abord finir le démontage et tout laver au savon ou liquide vaisselle, à l'aide d'une brosse à dent quand nécessaire. Les <em>PCB</em> seront terminées à l'alcool, en insistant bien au niveaux des points de contacts. Par contre, les <em>rubbers</em> ne seront PAS nettoyé à l'alcool, car le produit déterriore les contacts. Donc simplement de l'eau à l'aide de coton tige. Surtout PAS d'alcool non plus sur les touches, car celà aurait pour effet de blanchir et accentuer l'apparition de rayures sur la matière transparente, je l'ai expérimenté par le passé. Donc liquide vaisselle et séchage/lustrage avec un chiffon à lunette pour ne pas ajouter de rayures.<br /></li>
</ul>
<ul>
<li>Une fois toutes les vis retirées, on peut séparer le squelette en plastique de la frame en métal :<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/dsc04896.jpg" title="dsc04896.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/.dsc04896_s.jpg" alt="dsc04896.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/dsc04889.jpg" title="dsc04889.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/.dsc04889_s.jpg" alt="dsc04889.jpg" /></a><br />
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/dsc04891.jpg" title="dsc04891.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/.dsc04891_t.jpg" alt="dsc04891.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/dsc04892.jpg" title="dsc04892.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/.dsc04892_t.jpg" alt="dsc04892.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/dsc04893.jpg" title="dsc04893.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/.dsc04893_t.jpg" alt="dsc04893.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/dsc04894.jpg" title="dsc04894.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/.dsc04894_t.jpg" alt="dsc04894.jpg" /></a><br /></p>
<ul>
<li>En retournant le squelette, on découvre un joint de caoutchouc :<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/dsc04900.jpg" title="dsc04900.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/.dsc04900_s.jpg" alt="dsc04900.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/dsc04898.jpg" title="dsc04898.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/.dsc04898_s.jpg" alt="dsc04898.jpg" /></a><br />
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/dsc04899.jpg" title="dsc04899.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/.dsc04899_t.jpg" alt="dsc04899.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/dsc04901.jpg" title="dsc04901.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/.dsc04901_t.jpg" alt="dsc04901.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/dsc04902.jpg" title="dsc04902.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/.dsc04902_t.jpg" alt="dsc04902.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/dsc04903.jpg" title="dsc04903.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/.dsc04903_t.jpg" alt="dsc04903.jpg" /></a><br />
Aller ! Au lavage !<br /><br /></p>
<h3><ins>Second essai</ins> :<br /></h3>
<p>Et bien je n'ai pas d'image à montrer en détails du panel propre, je pense qu'on l'a assez vu, et on va plutôt faire un essai en situation réelle ce sera plus parlant !<br /></p>
<ul>
<li>J'ai donc couché ma <em>TV</em> à plat sur une table, et posé le panel <em>Jubeat</em> dessus, en m'assurant que le bout des vis de celui-ci ne viennent pas en contact avec l'écran, grace aux épais rebords de la <em>TV</em>.<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/dsc04909.jpg" title="dsc04909.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/.dsc04909_t.jpg" alt="dsc04909.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/dsc04908.jpg" title="dsc04908.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/.dsc04908_t.jpg" alt="dsc04908.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/dsc04907.jpg" title="dsc04907.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/.dsc04907_t.jpg" alt="dsc04907.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/dsc04910.jpg" title="dsc04910.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/jubeat/.dsc04910_t.jpg" alt="dsc04910.jpg" /></a></p>
<ul>
<li>Une petite vidéo… 6 ans donc que je n'avais pu toucher à ce jeu :<br /></li>
</ul>
<iframe width="640" height="360" sandbox="allow-same-origin allow-scripts allow-popups" src="https://peertube.makotoworkshop.org/videos/embed/e4d091ea-9aef-4975-9d13-d5f63ae4357c?warningTitle=0" frameborder="0" allowfullscreen></iframe>
<ul>
<li>On verra la suite de la construction plus tard, mais côté rénovation, je pense qu'il faudra prévoir un décapage avant une nouvelle couche de peinture, ainsi que le polissage des touches pour tenter d'améliorer l'aspect de tout ça.<br /><br /></li>
</ul>
<h3><a href="http://burogu.makotoworkshop.org/index.php?post/2021/04/18/jubeat02">À suivre…</a><br /><br /></h3>
<p><strong><ins>Ressources</ins> :</strong><br />
- <a href="https://blog.flipflop-jp.com/archives/4146/%e3%83%af%e3%83%b3%e3%83%ab%e3%83%bc%e3%83%a0jubeat%e3%80%80ac%e7%ad%90%e4%bd%93%e6%90%ac%e5%85%a5%e3%81%ae%e6%a7%98%e5%ad%90/">https://blog.flipflop-jp.com/archives/4146/ワンルームjubeat ~AC筐体搬入の様子~</a><br />
- <a href="https://blog.flipflop-jp.com/archives/4324/jubeat%e7%ad%90%e4%bd%93%e3%81%ae%e3%81%8a%e6%8e%83%e9%99%a4%ef%bd%9e%e3%83%a2%e3%83%8b%e3%82%bf%e3%83%bc%e8%a3%8f%e7%b7%a8%ef%bd%9e/">https://blog.flipflop-jp.com/archives/4324/jubeat筐体のお掃除~モニター裏編~</a><br />
- <a href="http://tools.bemaniso.ws/">http://tools.bemaniso.ws/</a><br />
- <a href="https://bemani.guide/games/jubeatclan/setup/">https://bemani.guide/games/jubeatclan/setup/</a><br />
- <a href="http://www.emuline.org/topic/605-arcade-pc-jubeat-misc-dumps-konami/">http://www.emuline.org/topic/605-arcade-pc-jubeat-misc-dumps-konami/</a><br />
- <a href="https://www.instructables.com/Arduino-LeonardoMicro-as-Game-ControllerJoystick/">https://www.instructables.com/Arduino-LeonardoMicro-as-Game-ControllerJoystick/</a></p>
<div class="footnotes"><h4>Note</h4>
<p>[<a href="http://burogu.makotoworkshop.org/index.php?post/2021/04/04/Jubeat#rev-wiki-footnote-1" id="wiki-footnote-1">1</a>] Profitez-en, le vendeur en a d'autres en stock !</p></div>
http://burogu.makotoworkshop.org/index.php?post/2021/04/04/Jubeat#comment-formhttp://burogu.makotoworkshop.org/index.php?feed/atom/comments/702Double variateur de vitesse pour Train Électrique HOurn:md5:c7596ba72479e873fbc1affb55dec8e32019-12-29T10:07:00+01:002019-12-29T10:07:00+01:00makoto doushiteÉlectroniqueArduinoDIYImpression3DModélisation3DVidéosÉlectronique<p><a href="http://burogu.makotoworkshop.org/public/electronique/VariateurTrain/20190521_105133.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/VariateurTrain/.20190521_105133_s.jpg" alt="" style="float:right; margin: 0 0 1em 1em;" /></a></p>
<ul>
<li>Il y a quelques mois j'ai retrouvé mon vieux train électrique et j'ai eu envie de le dépoussiérer un peu…<br /></li>
</ul>
<p>Ne disposant alors que d'un vieux variateur <em>Jouef</em> 3 positions, je me suis dit qu'avec les compétences d'aujourd'hui il serait aisé d'en construire un, et de remettre en état les rails et roues des machines oxydées, voire parfois rouillées.<br /></p>
<blockquote><p>Quand j'étais ado donc, j'ignorais un tas de choses, et sans modélistes dans mon entourage j'étais alors sans ressources devant un train électrique qui ne roulait pas bien, avec ses voies qui s'oxydaient avec le temps…<br />
Personne pour me dire qu'il existait des « gommes » à frotter, des produits pour nettoyer les voies, et autre trucs « marketés » pour modéliste fortunés.<br />
Pas de boutiques de modélisme, tout au mieux un magasin de jouet qui n'y connaissait rien, le genre de type qui te répond sans sourciller que celui-là est mieux car il est écrit « super » sur l'emballage, alors que tu demandais la différence entre deux produits similaires.<br />
J'ignorais même qu'il puisse exister des livres sur le sujet, sauf à être tombé sur un magasine une fois au <em>CDI</em> du lycée.<br />
Bref, l'accès à l'information faisait défaut, et n'ayant pas la possibilité de vadrouiller en ville, difficile d'en apprendre plus, surtout quand on ne sait pas quoi rechercher.<br />
Alors dans la morosité ambiante de fin du monde « as we know it », j'ai envie de dire que nous vivons l'époque formidable où internet est né, (et qu'il faudrait veiller à préserver sans corrompre) avec un accès à l'information phénoménal, tel que j'aurais pu en rêver…<br />
Les gens qui savent l'utiliser au mieux se voient ainsi « augmentés » d'un tas de connaissances, et c'est à travers ma propre expérience et le recoupement d'informations que j'ai pu confirmer que le modéliste sait entretenir un train électrique alors même que ces jouets étaient vendu sans aucunes explications !<br />
Je n'ose même pas imaginer le nombre de trains jetés par une famille dans le même cas que moi, mais un peu moins regardante, pensant que « le truc est cassé, hob, poubelle ».<br />
À l'époque mon père avait bien pensé à utiliser de l'alcool à brûler à passer sur les voies et du papier abrasif à frotter sur roues, mais on voyait ça comme une solution de secours assez sale, pour sauver le coup sans fierté, on y allait doucement par peur d'abîmer.<br /></p></blockquote>
<ul>
<li>Trente ans plus tard et internet te confirmes que c'est bien comme ça qu'il faut faire, et que tu peux t'en donner à cœur joie !<br /></li>
</ul>
<p>- Papier abrasif à l'eau pour carrosserie grain 800 puis 1000, pour récupérer rails et roues.<br />
- Et entretiens avec ton hydrocarbure préféré, de l'essence F, je trouve que ça marche bien.<br /></p>
<p>Un peu longue l'intro <sup></sup>; oups, alors pour faire un varariateur c'est simple, il faut une <em>PWM</em>.<br /></p>
<ul>
<li>Après quelques tests sur plaquette d'essais, une petite vidéo :<br /></li>
</ul>
<center>
<iframe width="640" height="360" sandbox="allow-same-origin allow-scripts" src="https://peertube.makotoworkshop.org/videos/embed/9fb5777f-df60-48d1-8e5d-7720f0d88501?warningTitle=0" frameborder="0" allowfullscreen></iframe>
</center>
<p><br /></p>
<h3><ins>Le schéma électronique </ins> :<br /></h3>
<ul>
<li>Bon c'est un peu chargé, mais on s'en sort…<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/VariateurTrain/VariateurTrain_bb.png"><img src="http://burogu.makotoworkshop.org/public/electronique/VariateurTrain/.VariateurTrain_bb_m.png" alt="" style="display:table; margin:0 auto;" /></a><br /></p> <p><strong>Matériel requis :</strong></p>
<blockquote><p>- 1 <em>Arduino Pro Mini 5V</em>.<br />
- Un ordi avec port USB et le soft Arduino IDE.<br />
- 1 module Pont en H à base de L298N.<br />
- 1 potentiométre de 10kΩ ou une résistance de 220Ω.<br />
- 2 potentiométres (la valeur n'a aucune importance).<br />
- 1 Prise jack 3.5 mm d'alimentation .<br />
- 1 afficheur LCD type HD44780 16 ou 20 x 2.<br />
- 4 boutons poussoirs.<br />
- 4 vis M3x12 mm.<br /></p></blockquote>
<ul>
<li>J'ai câblé les boutons sur une plaque à trous et intégré le tout dans un boîtier sur mesure, <a href="https://www.thingiverse.com/thing:3727150">dispo sur Thingiverse</a><br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/VariateurTrain/20190825_124945.jpg" title="20190825_124945.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/VariateurTrain/.20190825_124945_s.jpg" alt="20190825_124945.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/VariateurTrain/20190825_125058.jpg" title="20190825_125058.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/VariateurTrain/.20190825_125058_s.jpg" alt="20190825_125058.jpg" /></a><br /></p>
<ul>
<li>L<em>'Arduino</em> est protégé des courts-circuits avec un sac plastique.<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/VariateurTrain/20190825_125113.jpg" title="20190825_125113.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/VariateurTrain/.20190825_125113_s.jpg" alt="20190825_125113.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/VariateurTrain/20190825_125330.jpg" title="20190825_125330.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/VariateurTrain/.20190825_125330_s.jpg" alt="20190825_125330.jpg" /></a><br /></p>
<ul>
<li>On referme avec les vis.<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/VariateurTrain/20190825_125122.jpg" title="20190825_125122.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/VariateurTrain/.20190825_125122_s.jpg" alt="20190825_125122.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/VariateurTrain/20190825_125512.jpg" title="20190825_125512.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/VariateurTrain/.20190825_125512_s.jpg" alt="20190825_125512.jpg" /></a><br /></p>
<ul>
<li>Voilà pour la démo, à l'allumage :<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/VariateurTrain/20190825_130219.jpg" title="20190825_130219.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/VariateurTrain/.20190825_130219_s.jpg" alt="20190825_130219.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/VariateurTrain/20190825_130223.jpg" title="20190825_130223.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/VariateurTrain/.20190825_130223_s.jpg" alt="20190825_130223.jpg" /></a><br /></p>
<ul>
<li>En marche arrière, vitesse 86/100, puis marche avant, vitesse 42/100 :<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/VariateurTrain/20190825_130232.jpg" title="20190825_130232.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/VariateurTrain/.20190825_130232_s.jpg" alt="20190825_130232.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/VariateurTrain/20190825_130239.jpg" title="20190825_130239.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/VariateurTrain/.20190825_130239_s.jpg" alt="20190825_130239.jpg" /></a><br /></p>
<ul>
<li><strong>Programme pour l’<em>Arduino Pro Mini</em> :</strong><br /></li>
</ul>
<pre class="brush: cpp">#include <LiquidCrystal.h>
// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
// https://maxpromer.github.io/LCD-Character-Creator/
byte barre1[] = {
B00001,
B00001,
B00001,
B00001,
B00001,
B00001,
B00001,
B00001
};
byte barre2[] = {
B10000,
B10000,
B10000,
B10000,
B10000,
B10000,
B10000,
B10000
};
byte bulle[] = {
B11100,
B10100,
B11100,
B00000,
B00000,
B00000,
B00000,
B00000
};
/* Variateur N°1 */
const int enable1 = 9; // L298N Driver la PWM
const int input1 = 8; // L298N Driver les broches de signal
const int input2 = 13; // L298N Driver les broches de signal
const int faderVitesse01 = A0; // la broche pour régler la vitesse
const int buttonStartStopPin01 = A5; // the number of the pushbutton pin
int valeurBoutonStartStop01; // variable for reading the pushbutton status
int valBoutonStartStop_prec01 = LOW;
volatile int etatStop01 = LOW;
const int buttonInvertPin01 = A4; // the number of the pushbutton pin
int valeurBoutonInvert01; // variable for reading the pushbutton status
int valBoutonInvert_prec01 = LOW;
int etatInvert01 = LOW;
/* Variateur N°2 */
const int enable2 = 10; // L298N Driver la PWM
const int input3 = 7; // L298N Driver les broches de signal
const int input4 = 6; // L298N Driver les broches de signal
const int faderVitesse02 = A1; // la broche pour régler la vitesse
const int buttonStartStopPin02 = A2; // the number of the pushbutton pin
int valeurBoutonStartStop02; // variable for reading the pushbutton status
int valBoutonStartStop_prec02 = LOW;
volatile int etatStop02 = LOW;
const int buttonInvertPin02 = A3; // the number of the pushbutton pin
int valeurBoutonInvert02; // variable for reading the pushbutton status
int valBoutonInvert_prec02 = LOW;
int etatInvert02 = LOW;
//#########
//# Setup #
//#########
void setup() {
// put your setup code here, to run once:
// set up the LCD's number of columns and rows:
lcd.begin(20, 2);
lcd.setCursor(0, 0);
// Print a message to the LCD.
lcd.print(" Double Variateur");
lcd.setCursor(0, 1);
lcd.print(" Train Electrique");
lcd.createChar(0, barre1);
lcd.createChar(1, barre2);
lcd.createChar(3, bulle);
delay(5000);
affiche();
pinMode(input1, OUTPUT);
pinMode(input2, OUTPUT);
pinMode(buttonStartStopPin01, INPUT_PULLUP);
pinMode(buttonInvertPin01, INPUT_PULLUP);
// attachInterrupt(0, BoutonStopGo, FALLING); // attache l'interruption externe n°0 (pin2 soit bouton Stop) à la fonction BoutonStopGo
pinMode(input3, OUTPUT);
pinMode(input4, OUTPUT);
pinMode(buttonStartStopPin02, INPUT_PULLUP);
pinMode(buttonInvertPin02, INPUT_PULLUP);
// Serial.begin(9600);
analogWrite(enable1, 0); //on démarre moteur en avant et en roue libre
digitalWrite(input1, LOW);
digitalWrite(input2, HIGH); // enable pullup resistor
analogWrite(enable2, 0); //on démarre moteur en avant et en roue libre
digitalWrite(input3, HIGH);
digitalWrite(input4, LOW); // enable pullup resistor
}
//#############
//# Programme #
//#############
void loop() {
BoutonSens01();
BoutonStopGo01();
BoutonSens02();
BoutonStopGo02();
if (etatStop01 == HIGH) {
Vitesse01();
}
else {
analogWrite(enable1, 0); // envoie la vitesse, doit recevoir valeurs de 0 à 255
}
if (etatStop02 == HIGH) {
Vitesse02();
}
else {
analogWrite(enable2, 0); // envoie la vitesse, doit recevoir valeurs de 0 à 255
}
}
//###################################
//# affiche : Train N°1 ||Train N°2 #
//###################################
void affiche() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Train N");
lcd.setCursor(7, 0);
lcd.write(byte(3)); // bulle
lcd.setCursor(8, 0);
lcd.print("1");
lcd.setCursor(9, 0);
lcd.write(byte(0)); // barre1
lcd.setCursor(10, 0);
lcd.write(byte(1)); // barre2
lcd.setCursor(11, 0);
lcd.print("Train N");
lcd.setCursor(18, 0);
lcd.write(byte(3)); // bulle
lcd.setCursor(19, 0);
lcd.print("2");
}
//##################################################
//# Mode Vitesse + inverser le sens de rotation 01 #
//##################################################
void Vitesse01()
{
int valfaderVitesse01 = analogRead(faderVitesse01); // valeurs de 0 à 1023
int vitesse = map(valfaderVitesse01, 0, 1023, 0, 255); // Discrétise la valeur du potentiomètre, 0 à 0 (0 à 75 pour vitesse très lente) et 1023 à 255
// int vitesse = map(valfaderVitesse01, 0, 1023, 75, 255); // Discrétise la valeur du potentiomètre, 0 à 0 (0 à 75 pour vitesse très lente) et 1023 à 255
int vitesseLCD = map(valfaderVitesse01, 0, 1023, 0, 99);
if (etatInvert01 == LOW) { // si le bouton est appuiyé
digitalWrite(input1, LOW); //le moteur va dans un sens
digitalWrite(input2, HIGH);
// Serial.print("+");
lcd.setCursor(0, 1); // début du texte à la colonne 0, ligne 1
lcd.print(" >> ");
}
else {
digitalWrite(input1, HIGH); //le moteur va dans l'autre sens
digitalWrite(input2, LOW);
// Serial.print("-");
lcd.setCursor(0, 1);
lcd.print(" << ");
}
analogWrite(enable1, vitesse); // envoie la vitesse, doit recevoir valeurs de 0 à 255
// Serial.println(vitesse);
lcd.setCursor(7, 1);
lcd.print(vitesseLCD);
lcd.setCursor(9, 1);
lcd.write(byte(0)); // barre1
lcd.setCursor(10, 1);
lcd.write(byte(1)); // barre2
delay(50);
}
//###########################
//# Bouton poussoir sens 01 #
//###########################
void BoutonSens01() {
valeurBoutonInvert01 = digitalRead(buttonInvertPin01); // lit l'état du bouton
if ((valeurBoutonInvert01 == LOW) && (valBoutonInvert_prec01 == LOW)) {
if (etatInvert01 == HIGH) {
etatInvert01 = LOW;
digitalWrite(input1, LOW); //Freiner
digitalWrite(input2, LOW);
delay(300);
}
else {
etatInvert01 = HIGH;
digitalWrite(input1, LOW); //Freiner
digitalWrite(input2, LOW);
delay(300);
}
// Serial.print("etat Rotation: ");
// Serial.println(etatInvert01);
valBoutonInvert_prec01 == valeurBoutonInvert01;
delay(50);
}
}
//##################
//# Bouton Stop 01 #
//##################
void BoutonStopGo01() {
valeurBoutonStartStop01 = digitalRead(buttonStartStopPin01); // lit l'état du bouton
if ((valeurBoutonStartStop01 == LOW) && (valBoutonStartStop_prec01 == LOW)) {
if (etatStop01 == HIGH) {
etatStop01 = LOW;
}
else {
etatStop01 = HIGH;
}
// Serial.print("etat STOP : ");
// Serial.println(etatStop01);
lcd.setCursor(0, 1);
if (etatStop01 == HIGH & etatInvert01 == LOW) {
lcd.print(" >> ");
}
else if (etatStop01 == HIGH & etatInvert01 == HIGH) {
lcd.print(" << ");
}
else {
lcd.print("STOP ");
lcd.setCursor(9, 1);
lcd.write(byte(0)); // barre1
lcd.setCursor(10, 1);
lcd.write(byte(1)); // barre2
}
valBoutonStartStop_prec01 == valeurBoutonStartStop01;
delay(300);
}
}
//##################################################
//# Mode Vitesse + inverser le sens de rotation 02 #
//##################################################
void Vitesse02()
{
int valfaderVitesse02 = analogRead(faderVitesse02); // valeurs de 0 à 1023
int vitesse = map(valfaderVitesse02, 0, 1023, 0, 255); // Discrétise la valeur du potentiomètre, 0 à 0 (0 à 75 pour vitesse très lente) et 1023 à 255
// int vitesse = map(valfaderVitesse02, 0, 1023, 75, 255); // Discrétise la valeur du potentiomètre, 0 à 0 (0 à 75 pour vitesse très lente) et 1023 à 255
int vitesseLCD = map(valfaderVitesse02, 0, 1023, 0, 99);
if (etatInvert02 == LOW) { // si le bouton est appuiyé
digitalWrite(input3, LOW); //le moteur va dans un sens
digitalWrite(input4, HIGH);
// Serial.print("+");
lcd.setCursor(11, 1);
lcd.print(" >> ");
}
else {
digitalWrite(input3, HIGH); //le moteur va dans l'autre sens
digitalWrite(input4, LOW);
// Serial.print("-");
lcd.setCursor(11, 1);
lcd.print(" << ");
}
analogWrite(enable2, vitesse); // envoie la vitesse, doit recevoir valeurs de 0 à 255
// Serial.println(vitesse);
lcd.setCursor(18, 1);
lcd.print(vitesseLCD);
lcd.setCursor(9, 1);
lcd.write(byte(0)); // barre1
lcd.setCursor(10, 1);
lcd.write(byte(1)); // barre2
delay(50);
}
//###########################
//# Bouton poussoir sens 02 #
//###########################
void BoutonSens02() {
valeurBoutonInvert02 = digitalRead(buttonInvertPin02); // lit l'état du bouton
if ((valeurBoutonInvert02 == LOW) && (valBoutonInvert_prec02 == LOW)) {
if (etatInvert02 == HIGH) {
etatInvert02 = LOW;
digitalWrite(input3, LOW); //Freiner
digitalWrite(input4, LOW);
delay(300);
}
else {
etatInvert02 = HIGH;
digitalWrite(input3, LOW); //Freiner
digitalWrite(input4, LOW);
delay(300);
}
// Serial.print("etat Rotation: ");
// Serial.println(etatInvert02);
valBoutonInvert_prec02 == valeurBoutonInvert02;
delay(50);
}
}
//##################
//# Bouton Stop 02 #
//##################
void BoutonStopGo02() {
valeurBoutonStartStop02 = digitalRead(buttonStartStopPin02); // lit l'état du bouton
if ((valeurBoutonStartStop02 == LOW) && (valBoutonStartStop_prec02 == LOW)) {
if (etatStop02 == HIGH) {
etatStop02 = LOW;
}
else {
etatStop02 = HIGH;
}
// Serial.print("etat STOP : ");
// Serial.println(etatStop02);
lcd.setCursor(11, 1);
if (etatStop02 == HIGH & etatInvert02 == LOW) {
lcd.print(" >> ");
}
else if (etatStop02 == HIGH & etatInvert02 == HIGH) {
lcd.print(" << ");
}
else {
lcd.print("STOP ");
lcd.setCursor(9, 1);
lcd.write(byte(0)); // barre1
lcd.setCursor(10, 1);
lcd.write(byte(1)); // barre2
}
valBoutonStartStop_prec02 == valeurBoutonStartStop02;
delay(300);
}
}</pre>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/VariateurTrain/20190706_165408.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/VariateurTrain/.20190706_165408_m.jpg" alt="" style="display:table; margin:0 auto;" /></a><br /></p>
<p>Le code est aussi <a href="https://github.com/makotoworkshop/Variateur-Vitesse-Train">documenté ici</a>.<br /></p>
<p><ins>Ressources</ins> :<br />
<a href="https://howtomechatronics.com/tutorials/arduino/arduino-dc-motor-control-tutorial-l298n-pwm-h-bridge/">https://howtomechatronics.com/tutorials/arduino/arduino-dc-motor-control-tutorial-l298n-pwm-h-bridge/</a><br />
<a href="https://www.locoduino.org/">https://www.locoduino.org/</a></p>http://burogu.makotoworkshop.org/index.php?post/2019/12/28/variateur-train#comment-formhttp://burogu.makotoworkshop.org/index.php?feed/atom/comments/681Un Anémomètre Radio Multifonction -4-urn:md5:11950f749200a0a014f584f8e153c52d2019-12-28T12:46:00+01:002020-05-15T09:29:09+02:00makoto doushiteEnergies RenouvelablesArduinoBricolageDIYESP8266Impression3DModélisation3DNodeMCUÉlectroniqueÉolienne<p><strong>Edition du 23 Fevrier 2020, code <em>Arduino</em> et <em>esp8266</em> mis à jour.</strong><br />
Suite des études précédentes : <a href="http://burogu.makotoworkshop.org/index.php?post/2019/08/05/anemometre3">Anémomètre</a> et <a href="http://burogu.makotoworkshop.org/index.php?post/2019/12/27/monitoring_generateur-batterie">Monitoring</a>.<br /></p>
<blockquote><p>À ce stade, vu tous mes bidules radio, il serait légitime de se demander pourquoi avoir 2 ou 3 appareils différents (l'un pour surveiller le vent, un pour la rotation de l'éolienne et un autre pour la charge de la batterie).<br />
En fait lors du développement il est naturel d'avancer par étape en ajoutant peu à peu des fonctions, cette suite de billet n'en est finalement que le reflet.<br /></p></blockquote>
<p>Il est maintenant temps de fusionner tout ça !<br /></p>
<ul>
<li>Cette fois donc, l'appareil sera chargé de récupérer les 4 informations que sont la vitesse du vent, la rotation de l'éolienne, l'énergie produite par la génératrice, et l'état de charge de la batterie; afin de les transmettre à des afficheurs et à une base de donnée pour être tracé.<br /><br /></li>
</ul>
<h3><ins>La partie émetteur</ins> :<br /></h3>
<ul>
<li>J'ai donc câblé un nouveau circuit :<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/Anemometre_multifonctions_bb.png"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.Anemometre_multifonctions_bb_m.png" alt="" style="display:table; margin:0 auto;" /></a><br /></p>
<p><strong>Matériel requis :</strong></p>
<blockquote><p>- 1 <em>Arduino Pro Mini 5V</em>.<br />
- Un ordi avec port USB et le soft Arduino IDE.<br />
- 1 plaquette <em>HC-12</em> et son antenne.<br />
- 1 diode 1N4007.<br />
- 2 résistances 10kΩ.<br />
- 1 Capteur à effet Hall US1881 (anémo).<br />
- 1 Capteur à effet Hall 3144 (éolienne).<br />
- 1 Régulateur Négatif 9V L7909CV.<br />
- 1 condensateur électrochimique polarisé de 220µF.<br />
- 1 condensateur électrochimique polarisé de 2,2µF.<br />
- 1 condensateur électrochimique polarisé de 1µF.<br />
- 1 module ACS712 (20A) (<a href="https://www.youtube.com/watch?v=HimRh-kzkpE">Attention cependant !!</a> > Je sais que mon générateur ne dépassera pas 5A, à moins d'une tempête de vent de fin du monde…).<br /></p></blockquote>
<p><ins>Principe de fonctionnement</ins> :<br />
- À intervalle régulier, l<em>'Arduino</em> va envoyer les valeurs lues sur les entrées analogiques <em>A0</em> et <em>A1</em>, sur le port série du <em>HC-12</em>.<br />
- <em>A0</em> pour mesurer la valeur de la tension aux bornes de la batterie ( On a fabriqué un <a href="http://www.mon-club-elec.fr/pmwiki_mon_club_elec/pmwiki.php?n=MAIN.ProjetBatterieMesureTension">voltmètre très précis</a> câblé en parallèle ).<br />
- <em>A1</em> pour mesurer le courant sortant du générateur ( Un Ampèremètre câblé en série ).<br />
- Dés que le vent fera tourner l'anémomètre, l'interruption déclenche l'envoie des valeurs lues sur l'entrée numérique 2 (int0).<br />
- Dés que le vent fera tourner l'éolienne, l'interruption déclenche l'envoie des valeurs lues sur l'entrée numérique 3 (int1).<br /></p> <ul>
<li><strong>Programme pour l’<em>Arduino Pro Mini</em> de transmission :</strong><br /></li>
</ul>
<p><strong>Édit du 15 mai 2020 !</strong><br />
<a href="https://youtu.be/ArAcRfPpIYI?t=802">Électro-Bidouilleur a enfin sorti une vidéo sur le module <em>HC-12</em></a> et nous informe que la librairie <em><SoftwareSerial.h></em> est à éviter, ce que j'aurais bien voulu savoir à l'époque étant donné que j'ai effectivement rencontré des problèmes de réception. Il faut donc lui préférer la librairie <em><strong><AltSoftSerial.h></strong></em>. Je n'ai pas le temps de me pencher dessus, donc j'ai laissé tel quel le code suivant, sur <em>github</em> et en annexe du billet, à vous de changer la librairie.<br /></p>
<pre class="brush: cpp">/* Arduino Anemometer and Tachometer Éolienne
IN : capteur à effet Hall Anémomètre est connecté à la pin 2 = int0
IN : capteur à effet Hall Éolienne est connecté à la pin 3 = int1
OUT : HC-12 Radio Default Mode 9600bps
*/
#include <Arduino_CRC16.h> // Librairie à ajouter via le gestionnaire de lib de l'appli arduino
#include <SoftwareSerial.h>
#include <avr/sleep.h>
/****************/
/* DÉCLARATIONS */
/****************/
// Partie ANEMO
SoftwareSerial HC12(10, 11); // HC-12 TX Pin, HC-12 RX Pin
unsigned long rpmVent = 0;
unsigned long rpmEol = 0;
unsigned long vitVentKMH = 0;
unsigned long vitEolRPM = 0;
unsigned long dateDernierChangementVent = 0;
unsigned long dateDernierChangementEol = 0;
unsigned long dateDernierChangementRPM = 0;
unsigned long dateDernierChangementKMH = 0;
unsigned long vitVentCourante = 0;
unsigned long vitVentDernierChangement = 0;
float intervalleKMH = 0;
float intervalleRPM = 0;
const char char_VT = 124; // vertical tab (VT)
const char char_LF = 10; // charactère saut de ligne ascii
const char char_SPACE = 32; // charactère ESPACE ascii, le meilleur caractère pour la détection de string de sscanf !
String chaine;
String message;
int rotaAnemo = 0;
int rotaEol = 0;
#define ATpin 7 // used to switch HC-12 to AT mode
// Partie MONITORING
float Courant=0;
float SupplyVoltage=12;
const int Voie_0=0; // declaration constante de broche analogique
int mesure_brute=0; // Variable pour acquisition résultat brut de conversion analogique numérique
float mesuref=0.0; // Variable pour calcul résultat décimal de conversion analogique numérique
float tension=0.0; // Variable tension mesurée
float tension_batterie=0.0; // Variable tension batterie calculée
float tension_regulateur=8925.0; // Variable tension réelle aux bornes du régulateur -9V (en mV)
int PIN_ACS712 = A1;
double Voltage = 0;
double Current = 0;
char MessageTensionBatterie[] = " VOL / "; // message to be sent; '\n' is a forced terminator char
char MessageCourant[] = " AMP"; // message to be sent; '\n' is a forced terminator char
Arduino_CRC16 crc16;
/*********/
/* SETUP */
/*********/
void setup() {
HC12.begin(9600); // Serial port to HC12
// debug uniquement, penser à commenter toutes les lignes «Serial…» pour éviter les erreurs de valeur (calcul trop long pour l'interruption)
Serial.begin(9600); // Serial port to computer
// Pin capteurs
attachInterrupt(digitalPinToInterrupt(2), rpm_vent, FALLING); // le capteur à effet Hall Anémomètre est connecté à la pin 2 = int0
attachInterrupt(digitalPinToInterrupt(3), rpm_eol, FALLING); // le capteur à effet Hall Éolienne est connecté à la pin 3 = int1
pinMode(PIN_ACS712, INPUT);
pinMode(ATpin, OUTPUT);
digitalWrite(ATpin, LOW); // Set HC-12 into AT Command mode
delay(500);
HC12.print("AT+C010"); // passer sur le canal 036 (433.4Mhz + 36x400KHz)
delay(500);
digitalWrite(ATpin, HIGH); // HC-12 en normal mode
}
/*************/
/* PROGRAMME */
/*************/
void loop() {
MesureCourant();
MesureBrute();
TensionMesuree();
TensionBatterie();
RemiseZeroVitVentKMHnew2 ();
RemiseZeroVitEolRPMnew2 ();
// Construction de la chaine
chaine = char_VT + String(vitVentKMH)+ char_SPACE + String(vitEolRPM) + char_SPACE + String(tension_batterie,3) + char_SPACE + String(Current,3); // construction du message
Serial.println ( "chaine String :" +chaine );
// Message de la forme suivante : 49 338 11.405 -12.500
// Calcul du Checksum
uint16_t const crc16_res = crc16.calc((uint8_t const *)chaine.c_str(), strlen(chaine.c_str()));
Serial.print("CRC16 = 0x");
Serial.println(crc16_res, HEX);
// Checksum joint au message
message = chaine + char_SPACE + String(crc16_res, HEX) + char_SPACE + char_LF;
Serial.println ( "message :" +message );
// send radio data
// HC12.print(chaine);
HC12.print(message);
// Message de la forme suivante : 49 338 11.405 -12.500 3cfe1c9
delay(100);
}
/*************/
/* FONCTIONS */
/*************/
void rpm_vent() // appelée par l'interruption, Anémomètre vitesse du vent.
{
unsigned long dateCourante = millis();
intervalleKMH = (dateCourante - dateDernierChangementVent);
// Serial.print ( "intervalle en s : " );
// Serial.println (intervalleKMH/1000); // affiche l'intervalle de temps entre deux passages
if (intervalleKMH != 0) // attention si intervalle = 0, division par zero -> erreur
{
rpmVent = 60 / (intervalleKMH /1000);
}
vitVentKMH = ( rpmVent + 6.174 ) / 8.367;
Serial.print ( "vitVentKMH : " );
Serial.println ( vitVentKMH ); // affiche les rpm
Serial.println ( "" );
dateDernierChangementVent = dateCourante;
rotaAnemo = 1;
}
void rpm_eol() // appelée par l'interruption, Tachymétre rotation éolienne.
{
unsigned long dateCourante = millis();
intervalleRPM = (dateCourante - dateDernierChangementEol);
// Serial.print ( "intervalle en s : " );
// Serial.println (intervalleRPM/1000); // affiche l'intervalle de temps entre deux passages
if (intervalleRPM != 0) // attention si intervalle = 0, division par zero -> erreur
{
vitEolRPM = 60 / (intervalleRPM /1000);
}
Serial.print ( "rpm : " );
Serial.println ( vitEolRPM ); // affiche les rpm
Serial.println ( "" );
dateDernierChangementEol = dateCourante;
rotaEol = 1;
}
void RemiseZeroVitVentKMHnew2 ()
{
unsigned long dateCouranteKMH = millis();
if (rotaAnemo == 1 ){ // teste si l'Anémomètre tourne
// Serial.println ( "Anémo tourne ");
float dureeKMH = (dateCouranteKMH - dateDernierChangementKMH);
if (dureeKMH > 10000) {
rotaAnemo = 0;
dateDernierChangementKMH = dateCouranteKMH;
}
}
else // Si ça ne tourne plus (valeur plus mise à jour)
{
float dureeKMH = (dateCouranteKMH - dateDernierChangementKMH);
if (dureeKMH > 6000) // Si ça ne tourne plus depuis 16 secondes, délai un peu augmenté vis à vis du mode veille.
{
// Serial.print ( "dureeKMH : " );
// Serial.println ( dureeKMH ); // affiche les rpm
vitVentKMH = 0; // Remsise à zero !
dateDernierChangementKMH = dateCouranteKMH;
}
}
}
void RemiseZeroVitEolRPMnew2 ()
{
unsigned long dateCouranteRPM = millis();
if (rotaEol == 1 ){ // teste si l'éolienne tourne
// Serial.println ( "Éolienne tourne ");
float dureeRPM = (dateCouranteRPM - dateDernierChangementRPM);
if (dureeRPM > 10000) {
rotaEol = 0;
dateDernierChangementRPM = dateCouranteRPM;
}
}
else // Si ça ne tourne plus (valeur plus mise à jour)
{
float dureeRPM = (dateCouranteRPM - dateDernierChangementRPM);
if (dureeRPM > 6000) // Si ça ne tourne plus depuis 65 secondes (soit moins de 1 rpm), changé pour 8 sec en charge
{
// Serial.print ( "dureeRPM : " );
// Serial.println ( dureeRPM ); // affiche les rpm
vitEolRPM = 0; // Remsise à zero !
dateDernierChangementRPM = dateCouranteRPM;
}
}
}
// Partie MONITORING
void MesureCourant() {
// Serial.print("Courant : ");
// Serial.print(Courant);
// Serial.print(" A | Puissance : ");
// Serial.print(Courant*SupplyVoltage);
// Serial.println(" Watt");
// Voltage is Sensed 1000 Times for precision
for(int i = 0; i < 1000; i++) { // ça ralentis tout, mais c'est indispensable !
Voltage = (Voltage + (0.004882812 * analogRead(PIN_ACS712))); // (5 V / 1024 (Analog) = 0.0049) which converter Measured analog input voltage to 5 V Range
delay(1);
}
Voltage = Voltage /1000;
Current = (Voltage -2.5)/ 0.100; // Sensed voltage is converter to current (0.100 pour modèle 20A)
//Serial.print("\n Voltage Sensed (V) = "); // shows the measured voltage
//Serial.print(Voltage,3); // the ‘2’ after voltage allows you to display 2 digits after decimal point
//Serial.print("\t Current (A) = "); // shows the voltage measured
//Serial.println(Current,3); // the ‘2’ after voltage allows you to display 2 digits after decimal point
}
void MesureBrute() {
//-------- mesure brute --------
mesure_brute=analogRead(Voie_0);
// Serial.print ("Valeur brute = ");
// Serial.print (mesure_brute);
// Serial.println (" "); // espace de propreté
}
void TensionMesuree() {
//---------- tension mesurée ---------
mesuref=float(mesure_brute)*5000.0/1024.0;
tension=mesuref/1000.0; // en Volts
// Serial.print ("Tension = ");
// Serial.print(tension,3); // float avec 2 décimales
// Serial.println(" V "); // unité et espace de propreté
}
void TensionBatterie() {
//---------- tension batterie ---------
tension_batterie=mesuref+tension_regulateur;
tension_batterie=tension_batterie/1000.0; // en Volts
// lcd.setCursor(0,1) ; // positionne le curseur à l'endroit voulu (colonne, ligne)
// lcd.print ("Batt:");
// lcd.print (tension_batterie,2); // float avec 2 décimales
// lcd.print ("V "); // unité et espace de propreté
// Serial.print ("Batterie = ");
// Serial.print(tension_batterie,3); // float avec 2 décimales
// Serial.println(" V ");
// Serial.println(" ");
}</pre>
<p><br /></p>
<h3><ins>Le boîtier client, partie récepteur avec affichage</ins> :<br /></h3>
<ul>
<li>J'ai conservé mes deux systèmes d'affichage distinct (et donc deux <em>Arduino</em> à programmer), mais rien n'empêcherait d'utiliser un seul afficheur LCD à 4 lignes !<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/ClientAfficheur_Anemometre_multifonctions_bb.png"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.ClientAfficheur_Anemometre_multifonctions_bb_m.png" alt="" style="display:table; margin:0 auto;" /></a><br /></p>
<p><strong>Matériel requis :</strong></p>
<blockquote><p>- 2 <em>Arduino Pro Mini 5V</em>.<br />
- Un ordi avec port USB et le soft Arduino IDE.<br />
- 1 plaquette <em>HC-12</em> et son antenne.<br />
- 1 diode 1N4007.<br />
- 1 afficheur LCD type HD44780 16 ou 20 x 2.<br />
- 1 <em>NodeMCUv3 LoLin</em>.<br />
- 1 condensateur électrochimique polarisé de 220µF.<br />
- 12 afficheurs DLG7137.<br /></p></blockquote>
<p><br /></p>
<p><ins>Principe de fonctionnement</ins> :<br />
- Les deux <em>Arduino</em> reçoivent les valeurs transmises par le port série du <em>HC-12</em> et les affichent instantanément sur l'écran LCD (courant et tension) et les afficheurs DLG (vent et éolienne).<br />
- Le <em>NodeMCU</em> reçoit les valeurs transmises par le port série du <em>HC-12</em> et les transmet à la Base de données <em>InfluxDB</em>.<br />
- <em>Grafana</em> s'occupera de tracer les graphiques à partir des données.<br /></p>
<ul>
<li><strong>Programme pour l’Arduino Pro Mini de réception LCD :</strong> Voir en annexe du billet<sup>[<a href="http://burogu.makotoworkshop.org/index.php?post/2019/08/30/anemometre4#wiki-footnote-1" id="rev-wiki-footnote-1">1</a>]</sup>.<br /></li>
</ul>
<ul>
<li><strong>Programme pour l’Arduino Pro Mini de réception DLG7137 :</strong> Voir en annexe du billet<sup>[<a href="http://burogu.makotoworkshop.org/index.php?post/2019/08/30/anemometre4#wiki-footnote-2" id="rev-wiki-footnote-2">2</a>]</sup>.<br /></li>
</ul>
<ul>
<li><strong>Programme pour le <em>NodeMCU</em> de réception :</strong> Voir en annexe du billet<sup>[<a href="http://burogu.makotoworkshop.org/index.php?post/2019/08/30/anemometre4#wiki-footnote-3" id="rev-wiki-footnote-3">3</a>]</sup>.<br /><br /></li>
</ul>
<p><strong><ins>Configuration de la <em>Grafana</em></ins> :</strong><br /></p>
<ul>
<li>Concernant cette partie, je vous laisse voir la fin de ce <a href="http://burogu.makotoworkshop.org/index.php?post/2019/08/05/anemometre3">billet</a>, vu que c'est la même chose !<br /></li>
</ul>
<blockquote><p>Vous pourriez obtenir ce genre de chose :<br /></p></blockquote>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/grafana_anemometre_multifonctions.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.grafana_anemometre_multifonctions_m.jpg" alt="" style="display:table; margin:0 auto;" /></a><br />
L'observateur attentif aura remarqué que la vitesse du vent n'est ici pas logique avec la rotation de l'éolienne… Normal, je faisais des tests en rotation manuelle afin de pouvoir tracer ces graphiques.<br /></p>
<p>Le code est aussi <a href="https://github.com/makotoworkshop/Anemometre_multifonctions">documenté ici</a>, et en annexe du billet.<br /></p>
<div class="footnotes"><h4>Notes</h4>
<p>[<a href="http://burogu.makotoworkshop.org/index.php?post/2019/08/30/anemometre4#rev-wiki-footnote-1" id="wiki-footnote-1">1</a>] ci-dessous</p>
<p>[<a href="http://burogu.makotoworkshop.org/index.php?post/2019/08/30/anemometre4#rev-wiki-footnote-2" id="wiki-footnote-2">2</a>] ci-dessous</p>
<p>[<a href="http://burogu.makotoworkshop.org/index.php?post/2019/08/30/anemometre4#rev-wiki-footnote-3" id="wiki-footnote-3">3</a>] ci-dessous</p></div>
http://burogu.makotoworkshop.org/index.php?post/2019/08/30/anemometre4#comment-formhttp://burogu.makotoworkshop.org/index.php?feed/atom/comments/674Surveiller l'état et la charge d'une batterie 12 Voltsurn:md5:51cd7ac70dfaadea50cececcd8aa8c402019-12-27T19:53:00+01:002020-05-15T09:28:55+02:00makoto doushiteEnergies RenouvelablesArduinoBricolageDIYESP8266Impression3DModélisation3DNodeMCUÉlectroniqueÉolienne<ul>
<li>Monitorer la vitesse du vent et la rotation de l'éolienne, <a href="http://burogu.makotoworkshop.org/index.php?post/2019/08/05/anemometre3">c'est fait !!</a><br /></li>
</ul>
<blockquote><p>Cependant quid de l'état de la batterie ?<br />
Combien d'énergie la génératrice produit-elle ?<br />
Cela est-il suffisant pour recharger la batterie ?<br /></p></blockquote>
<p>J'avais acheté un appareil pour mesurer ça en local, mais en définitive je ne m'en sert pas… Pas utile à moins d'aller au fond du jardin pour le consulter…<br /></p>
<ul>
<li>J'ai donc entrepris de construire un nouvel appareil de mesure, sur la même idée que l'Anémomètre Radio (<em>Arduino + HC-12</em>), avec transmission des données pour statistiques sur <em>Grafana</em> via <em>InfluxDB</em> (<em>NodeMCU</em>).<br /></li>
</ul>
<p><strong>Attention cependant</strong>, Si on souhaite faire fonctionner l'Anémomètre et le Monitoring en même temps, il faudra prendre soin de différencier les canaux de fonctionnement des modules <em>HC-12</em> (Voir la section <em>Setup</em> de chaque programmes)<br /><br /></p>
<h3><ins>Le monitoring Batterie, partie émetteur</ins> :<br /></h3>
<p>J'ai donc câblé un nouveau circuit :<br />
<a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/Capteur_Courant_Tension_bb.png"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.Capteur_Courant_Tension_bb_m.png" alt="" style="display:table; margin:0 auto;" /></a><br /></p>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/dsc04270.jpg" title="dsc04270.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.dsc04270_s.jpg" alt="dsc04270.jpg" style="float:right; margin: 0 0 1em 1em;" /></a>
<strong>Matériel requis :</strong></p>
<blockquote><p>- 1 <em>Arduino Pro Mini 5V</em>.<br />
- Un ordi avec port USB et le soft Arduino IDE.<br />
- 1 plaquette <em>HC-12</em> et son antenne.<br />
- 1 diode 1N4007.<br />
- 1 Régulateur Négatif 9V L7909CV.<br />
- 1 condensateur électrochimique polarisé de 220µF.<br />
- 1 condensateur électrochimique polarisé de 2,2µF.<br />
- 1 condensateur électrochimique polarisé de 1µF.<br />
- 1 module ACS712 (20A) (<a href="https://www.youtube.com/watch?v=HimRh-kzkpE">Attention cependant !!</a> > Je sais que mon générateur ne dépassera pas 5A, à moins d'une tempête de vent de fin du monde…).<br /></p></blockquote>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/dsc04272.jpg" title="dsc04272.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.dsc04272_s.jpg" alt="dsc04272.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/dsc04273.jpg" title="dsc04273.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.dsc04273_s.jpg" alt="dsc04273.jpg" /></a><br /></p>
<p><ins>Principe de fonctionnement</ins> :<br />
- À intervalle régulier, l<em>'Arduino</em> va envoyer les valeurs lues sur les entrées analogiques <em>A0</em> et <em>A1</em>, sur le port série du <em>HC-12</em>.<br />
- <em>A0</em> pour mesurer la valeur de la tension aux bornes de la batterie ( On a fabriqué un <a href="http://www.mon-club-elec.fr/pmwiki_mon_club_elec/pmwiki.php?n=MAIN.ProjetBatterieMesureTension">voltmètre très précis</a> câblé en parallèle ).<br />
- <em>A1</em> pour mesurer le courant sortant du générateur ( Un Ampèremètre câblé en série ).<br /></p> <ul>
<li><strong>Programme pour l’<em>Arduino Pro Mini</em> de transmission :</strong><br /></li>
</ul>
<p><strong>Édit du 15 mai 2020 !</strong><br />
<a href="https://youtu.be/ArAcRfPpIYI?t=802">Électro-Bidouilleur a enfin sorti une vidéo sur le module <em>HC-12</em></a> et nous informe que la librairie <em><SoftwareSerial.h></em> est à éviter, ce que j'aurais bien voulu savoir à l'époque étant donné que j'ai effectivement rencontré des problèmes de réception. Il faut donc lui préférer la librairie <em><strong><AltSoftSerial.h></strong></em>. Je n'ai pas le temps de me pencher dessus, donc j'ai laissé tel quel le code suivant, sur <em>github</em> et en annexe du billet, à vous de changer la librairie.<br /></p>
<pre class="brush: cpp">#include <SoftwareSerial.h>
/****************/
/* DÉCLARATIONS */
/****************/
SoftwareSerial HC12(10, 11); // HC-12 TX Pin, HC-12 RX Pin
char MessageTensionBatterie[] = " VOL / "; // message to be sent; '\n' is a forced terminator char
char MessageCourant[] = " AMP\n"; // message to be sent; '\n' is a forced terminator char
String chaine;
#define ATpin 7 // used to switch HC-12 to AT mode
float Courant=0;
float SupplyVoltage=12;
const int Voie_0=0; // declaration constante de broche analogique
int mesure_brute=0; // Variable pour acquisition résultat brut de conversion analogique numérique
float mesuref=0.0; // Variable pour calcul résultat décimal de conversion analogique numérique
float tension=0.0; // Variable tension mesurée
float tension_batterie=0.0; // Variable tension batterie calculée
float tension_regulateur=8925.0; // Variable tension réelle aux bornes du régulateur -9V (en mV)
int PIN_ACS712 = A1;
double Voltage = 0;
double Current = 0;
/*********/
/* SETUP */
/*********/
void setup() {
// Serial.begin(9600); // Debug
HC12.begin(9600); // Serial port to HC12
// Pin capteurs
pinMode(PIN_ACS712, INPUT);
pinMode(ATpin, OUTPUT);
digitalWrite(ATpin, LOW); // Set HC-12 into AT Command mode
delay(500);
HC12.print("AT+C056"); // passer sur le canal 006 (433.4Mhz + 56x400KHz)
delay(500);
digitalWrite(ATpin, HIGH); // HC-12 en normal mode
}
/*************/
/* PROGRAMME */
/*************/
void loop() {
MesureCourant();
MesureBrute();
TensionMesuree();
TensionBatterie();
chaine = String(tension_batterie,3) + MessageTensionBatterie + String(Current,3) + MessageCourant; // construction du message
Serial.println ( "chaine String : " +chaine );
HC12.print(chaine); // send radio data
delay(100);
}
/*************/
/* FONCTIONS */
/*************/
void MesureCourant() {
// Serial.print("Courant : ");
// Serial.print(Courant);
// Serial.print(" A | Puissance : ");
// Serial.print(Courant*SupplyVoltage);
// Serial.println(" Watt");
// Voltage is Sensed 1000 Times for precision
for(int i = 0; i < 1000; i++) { // ça ralentis tout, mais c'est indispensable !
Voltage = (Voltage + (0.004882812 * analogRead(PIN_ACS712))); // (5 V / 1024 (Analog) = 0.0049) which converter Measured analog input voltage to 5 V Range
delay(1);
}
Voltage = Voltage /1000;
Current = (Voltage -2.5)/ 0.100; // Sensed voltage is converter to current (0.100 pour modèle 20A)
Serial.print("\n Voltage Sensed (V) = "); // shows the measured voltage
Serial.print(Voltage,3); // the ‘2’ after voltage allows you to display 2 digits after decimal point
Serial.print("\t Current (A) = "); // shows the voltage measured
Serial.println(Current,3); // the ‘2’ after voltage allows you to display 2 digits after decimal point
}
void MesureBrute() {
//-------- mesure brute --------
mesure_brute=analogRead(Voie_0);
// Serial.print ("Valeur brute = ");
// Serial.print (mesure_brute);
// Serial.println (" "); // espace de propreté
}
void TensionMesuree() {
//---------- tension mesurée ---------
mesuref=float(mesure_brute)*5000.0/1024.0;
tension=mesuref/1000.0; // en Volts
// Serial.print ("Tension = ");
// Serial.print(tension,3); // float avec 2 décimales
// Serial.println(" V "); // unité et espace de propreté
}
void TensionBatterie() {
//---------- tension batterie ---------
tension_batterie=mesuref+tension_regulateur;
tension_batterie=tension_batterie/1000.0; // en Volts
// lcd.setCursor(0,1) ; // positionne le curseur à l'endroit voulu (colonne, ligne)
// lcd.print ("Batt:");
// lcd.print (tension_batterie,2); // float avec 2 décimales
// lcd.print ("V "); // unité et espace de propreté
Serial.print ("Batterie = ");
Serial.print(tension_batterie,3); // float avec 2 décimales
Serial.println(" V ");
// Serial.println(" ");
}</pre>
<p><br /></p>
<h3><ins>Le boîtier client, partie récepteur avec affichage</ins> :<br /></h3>
<p>Voici le montage avec un afficheur LCD standard :<br />
<a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/ClientAfficheurLCD_nodemcu_bb.png" title="ClientAfficheurLCD_nodemcu_bb.png"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.ClientAfficheurLCD_nodemcu_bb_m.png" alt="ClientAfficheurLCD_nodemcu_bb.png" style="display:table; margin:0 auto;" /></a><br />
<a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/dsc04268.jpg" title="dsc04268.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.dsc04268_s.jpg" alt="dsc04268.jpg" style="float:right; margin: 0 0 1em 1em;" /></a>
<strong>Matériel requis :</strong></p>
<blockquote><p>- 1 <em>Arduino Pro Mini 5V</em>.<br />
- Un ordi avec port USB et le soft Arduino IDE.<br />
- 1 plaquette <em>HC-12</em> et son antenne.<br />
- 1 diode 1N4007.<br />
- 1 afficheur LCD type HD44780 16 ou 20 x 2.<br />
- 1 <em>NodeMCUv3 LoLin</em>.<br />
- 1 condensateur électrochimique polarisé de 220µF.<br /></p></blockquote>
<p><br />
<a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/dsc04266.jpg" title="dsc04266.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.dsc04266_s.jpg" alt="dsc04266.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/dsc04274.jpg" title="dsc04274.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.dsc04274_s.jpg" alt="dsc04274.jpg" /></a><br />
<a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/dsc04275.jpg" title="dsc04275.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.dsc04275_s.jpg" alt="dsc04275.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/dsc04278.jpg" title="dsc04278.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.dsc04278_s.jpg" alt="dsc04278.jpg" /></a><br /></p>
<ul>
<li>J'ai simulé le générateur avec une alimentation 12V et la batterie par une ampoule :<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/dsc04278-79.gif"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/dsc04278-79.gif" alt="" style="display:table; margin:0 auto;" /></a><br /></p>
<p><ins>Principe de fonctionnement</ins> :<br />
- L<em>'Arduino</em> reçoit les valeurs transmises par le port série du <em>HC-12</em> et les affiche instantanément sur l'écran LCD.<br />
- Le <em>NodeMCU</em> reçoit les valeurs transmises par le port série du <em>HC-12</em> et les transmet à la Base de données <em>InfluxDB</em>.<br />
- <em>Grafana</em> s'occupera de tracer les graphiques à partir des données.<br /></p>
<ul>
<li><strong>Programme pour l’Arduino Pro Mini de réception :</strong><br /></li>
</ul>
<p><strong>Édit du 15 mai 2020 !</strong><br />
<a href="https://youtu.be/ArAcRfPpIYI?t=802">Électro-Bidouilleur a enfin sorti une vidéo sur le module <em>HC-12</em></a> et nous informe que la librairie <em><SoftwareSerial.h></em> est à éviter, ce que j'aurais bien voulu savoir à l'époque étant donné que j'ai effectivement rencontré des problèmes de réception. Il faut donc lui préférer la librairie <em><strong><AltSoftSerial.h></strong></em>. Je n'ai pas le temps de me pencher dessus, donc j'ai laissé tel quel le code suivant, sur <em>github</em> et en annexe du billet, à vous de changer la librairie.<br /></p>
<pre class="brush: cpp">//———— Que fait ce programme ? ————
// ---> Récupére les données transmise par un module HC-12,
// ---> Affichage la mesure de la tension d'une batterie au plomb 12V sur un écran LCD.
// ---> Affichage l'intensité et la puissance fournie à la batterie par une génératrice 12V.
//———— Fonctionnalités utilisées ————
// Utilise un afficheur LCD alphanumérique2x20 en mode 4 bits
//———— Circuit à réaliser ————
// Broche 12 sur la broche RS du LCD
// Broche 11 sur la broche E du LCD
// Broche 5 sur la broche D4 du LCD
// Broche 4 sur la broche D5 du LCD
// Broche 3 sur la broche D6 du LCD
// Broche 2 sur la broche D7 du LCD
// Broche 7 sur HC-12 to AT mode
// Broche 8 HC-12 TX Pin
// Broche 9 HC-12 RX Pin
//———— Réglages possibles ————
// Canal de réception (voir setup)
// Voltage : Utilisé pour le calcul de la puissance en Watt.
// MiniC : pour régler le courant minimum mesuré en dessous duquel la valeur est forcée à 0, pour prendre
// en compte le fait que la mesure du zero ne tombe jamais pile.
#include <LiquidCrystal.h> // lib LCD
#include <SoftwareSerial.h> // lib Transmission série
//################
//# DÉCLARATIONS #
//################
//——— Radio HC-12 ———//
SoftwareSerial HC12(8, 9); // HC-12 TX Pin, HC-12 RX Pin
#define ATpin 7 // poir passer le HC-12 en AT mode
char acquis_data;
String chaine;
float Voltage=12;
float MiniC=0.08; // courant minimum mesuré en dessous duquel la valeur est forcée à 0.
float tension_batterie_float;
float Courant_float;
//——— Écran LCD ———//
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2; // Déclaration LCD
LiquidCrystal lcd(rs, en, d4, d5, d6, d7); // Pins LCD en mode 4 bits
byte carre00[8] = { // caractères personnalisés
B11111,
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B11111
};
byte carre01[8] = {
B11111,
B00000,
B10000,
B10000,
B10000,
B10000,
B00000,
B11111
};
byte carre02[8] = {
B11111,
B00000,
B11000,
B11000,
B11000,
B11000,
B00000,
B11111
};
byte carre03[8] = {
B11111,
B00000,
B11100,
B11100,
B11100,
B11100,
B00000,
B11111
};
byte carre04[8] = {
B11111,
B00000,
B11110,
B11110,
B11110,
B11110,
B00000,
B11111
};
byte carre05[8] = {
B11111,
B00000,
B11111,
B11111,
B11111,
B11111,
B00000,
B11111
};
byte crochetouvrant[8] = {
B00011,
B00010,
B00010,
B00010,
B00010,
B00010,
B00010,
B00011
};
byte crochetfermant[8] = {
B11000,
B01000,
B01110,
B01110,
B01110,
B01110,
B01000,
B11000
};
//——— Fonction pour pemettre le map avec variable float ———
float mapfloat(float x, float in_min, float in_max, float out_min, float out_max) {
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
//#########
//# SETUP #
//#########
void setup() {
// Serial.begin(9600); // Debug
//——— HC12 ———//
HC12.begin(9600); // Serial port to HC12
pinMode(ATpin, OUTPUT);
digitalWrite(ATpin, LOW); // HC-12 en mode commande AT
delay(500);
HC12.print("AT+C056"); // passer sur le canal 056 (433.4Mhz + 56x400KHz)
delay(500);
digitalWrite(ATpin, HIGH); // HC-12 en normal mode
//——— LCD ———//
lcd.begin(20,2); // Initialise le LCD avec 20 colonnes x 2 lignes
delay(10);
lcd.print("LCD OK"); // affiche LCD OK
delay(2000);
lcd.clear();
delay(10);
lcd.createChar(0, carre00); // Les 8 caractères personnalisés
lcd.createChar(1, carre01);
lcd.createChar(2, carre02);
lcd.createChar(3, carre03);
lcd.createChar(4, carre04);
lcd.createChar(5, carre05);
lcd.createChar(6, crochetouvrant);
lcd.createChar(7, crochetfermant);
}
//#############
//# PROGRAMME #
//#############
void loop() {
Reception();
Jauge();
delay(200);
}
//#############
//# FONCTIONS #
//#############
void Reception() {
// surtout pas de delay dans cette boucle, sinon les data reçues sont erronnées.
while (HC12.available()) { // If HC-12 has data
acquis_data = HC12.read();
chaine = chaine + acquis_data;
// Serial.println (chaine); // Attention, chaine est donc une String
/* message reçu de la forme
12.665 VOL / 0.045 AMP
pour chaque ligne on fait :*/
if (chaine.endsWith("\n")) { //détection de fin de ligne : méthodes String
// Serial.println ("fin de ligne"); // debug
// String phrase = "12.665 VOL / 0.045 AMP"; //debug
char tension_batterie[5]; // chaine de 6 caractères pour stocker le texte avant le mot VOL
char Courant[3]; // chaine de 4 caractères pour stocker le texte avant le mot AMP
// sscanf(phrase.c_str(), "%s VOL / %s AMP", tension_batterie, &Courant); //debug
sscanf(chaine.c_str(), "%s VOL / %s AMP", tension_batterie, &Courant); // la chaine à parser est dans une String, avec la méthode c_str()
tension_batterie_float = atof(tension_batterie),3; // char convertie en Float, avec 3 décimales
Courant_float = atof(Courant),2; // char convertie en Float, avec 2 décimales
Serial.print("VOLTS: ");
Serial.println(tension_batterie_float,3); // float avec 3 décimales
Serial.print("AMPERES: ");
Serial.println(Courant_float,3);
Serial.print("Watt: ");
Serial.println(Courant_float*Voltage,0); // float avec 0 décimales
Serial.println(' ');
// Affichage LCD courant et Puissance
if ( Courant_float < MiniC ){ // remise à zero forcée si valeur mesurée très petite
Courant_float = 0;
}
lcd.setCursor(0,0);
lcd.print ("Power:");
lcd.print (Courant_float,2); // float avec 2 décimales
lcd.print ("A "); // unité et espace
lcd.setCursor(12,0);
lcd.write(0b01111110); // caractère : fleche, depuis le Standard Character Pattern du LCD
lcd.print (" ");
lcd.print (Courant_float*Voltage,0);
lcd.print ("Watt ");
// Affichage LCD Batterie
lcd.setCursor(0,1);
lcd.print ("Batt:");
lcd.print (tension_batterie_float,3);
lcd.print ("V ");
chaine = ""; // vide la String chaine
}
}
}
void Jauge() { // Jauge de charge batterie
lcd.setCursor(12, 1);
lcd.write(byte(6)); // crochet ouvrant
lcd.setCursor(19, 1);
lcd.write(byte(7)); // crochet fermant
float NiveauBatterie = mapfloat(tension_batterie_float, 11.4, 12.73, 0, 30); // Discrétise la valeur de la tension batterie
int NiveauBatterieBarre = (int)NiveauBatterie; // conversion en entier
if (NiveauBatterie > 30) { // en cas de dépassement des limites haute et basse et permettre l'affichage non-erroné
NiveauBatterieBarre = 30;
lcd.setCursor(13, 1);
lcd.print ("Pleine");
delay (1000);
}
else if (NiveauBatterie < 0) {
NiveauBatterieBarre = 0;
lcd.setCursor(13, 1);
lcd.print ("Erreur");
delay (1000);
}
// Serial.print ("NiveauBatterieBarre = ");
// Serial.print(NiveauBatterieBarre);
// Serial.println(" ");
switch (NiveauBatterieBarre) {
case 0:
lcd.setCursor(13, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(14, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(15, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(16, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(17, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(18, 1);
lcd.write(byte(0)); // carre00
break;
case 1:
lcd.setCursor(13, 1);
lcd.write(byte(1)); // carre01
lcd.setCursor(14, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(15, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(16, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(17, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(18, 1);
lcd.write(byte(0)); // carre00
break;
case 2:
lcd.setCursor(13, 1);
lcd.write(byte(2)); // carre02
lcd.setCursor(14, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(15, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(16, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(17, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(18, 1);
lcd.write(byte(0)); // carre00
break;
case 3:
lcd.setCursor(13, 1);
lcd.write(byte(3)); // carre03
lcd.setCursor(14, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(15, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(16, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(17, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(18, 1);
lcd.write(byte(0)); // carre00
break;
case 4:
lcd.setCursor(13, 1);
lcd.write(byte(4)); // carre04
lcd.setCursor(14, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(15, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(16, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(17, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(18, 1);
lcd.write(byte(0)); // carre00
break;
case 5:
lcd.setCursor(13, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(14, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(15, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(16, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(17, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(18, 1);
lcd.write(byte(0)); // carre00
break;
case 6:
lcd.setCursor(13, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(14, 1);
lcd.write(byte(1)); // carre01
lcd.setCursor(15, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(16, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(17, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(18, 1);
lcd.write(byte(0)); // carre00
break;
case 7:
lcd.setCursor(13, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(14, 1);
lcd.write(byte(2)); // carre02
lcd.setCursor(15, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(16, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(17, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(18, 1);
lcd.write(byte(0)); // carre00
break;
case 8:
lcd.setCursor(13, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(14, 1);
lcd.write(byte(3)); // carre03
lcd.setCursor(15, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(16, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(17, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(18, 1);
lcd.write(byte(0)); // carre00
break;
case 9:
lcd.setCursor(13, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(14, 1);
lcd.write(byte(4)); // carre04
lcd.setCursor(15, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(16, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(17, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(18, 1);
lcd.write(byte(0)); // carre00
break;
case 10:
lcd.setCursor(13, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(14, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(15, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(16, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(17, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(18, 1);
lcd.write(byte(0)); // carre00
break;
case 11:
lcd.setCursor(13, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(14, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(15, 1);
lcd.write(byte(1)); // carre01
lcd.setCursor(16, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(17, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(18, 1);
lcd.write(byte(0)); // carre00
break;
case 12:
lcd.setCursor(13, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(14, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(15, 1);
lcd.write(byte(2)); // carre02
lcd.setCursor(16, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(17, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(18, 1);
lcd.write(byte(0)); // carre00
break;
case 13:
lcd.setCursor(13, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(14, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(15, 1);
lcd.write(byte(3)); // carre03
lcd.setCursor(16, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(17, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(18, 1);
lcd.write(byte(0)); // carre00
break;
case 14:
lcd.setCursor(13, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(14, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(15, 1);
lcd.write(byte(4)); // carre04
lcd.setCursor(16, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(17, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(18, 1);
lcd.write(byte(0)); // carre00
break;
case 15:
lcd.setCursor(13, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(14, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(15, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(16, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(17, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(18, 1);
lcd.write(byte(0)); // carre00
break;
case 16:
lcd.setCursor(13, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(14, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(15, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(16, 1);
lcd.write(byte(1)); // carre01
lcd.setCursor(17, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(18, 1);
lcd.write(byte(0)); // carre00
break;
case 17:
lcd.setCursor(13, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(14, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(15, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(16, 1);
lcd.write(byte(2)); // carre02
lcd.setCursor(17, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(18, 1);
lcd.write(byte(0)); // carre00
break;
case 18:
lcd.setCursor(13, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(14, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(15, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(16, 1);
lcd.write(byte(3)); // carre03
lcd.setCursor(17, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(18, 1);
lcd.write(byte(0)); // carre00
break;
case 19:
lcd.setCursor(13, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(14, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(15, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(16, 1);
lcd.write(byte(4)); // carre04
lcd.setCursor(17, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(18, 1);
lcd.write(byte(0)); // carre00
break;
case 20:
lcd.setCursor(13, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(14, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(15, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(16, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(17, 1);
lcd.write(byte(0)); // carre00
lcd.setCursor(18, 1);
lcd.write(byte(0)); // carre00
break;
case 21:
lcd.setCursor(13, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(14, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(15, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(16, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(17, 1);
lcd.write(byte(1)); // carre01
lcd.setCursor(18, 1);
lcd.write(byte(0)); // carre00
break;
case 22:
lcd.setCursor(13, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(14, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(15, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(16, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(17, 1);
lcd.write(byte(2)); // carre02
lcd.setCursor(18, 1);
lcd.write(byte(0)); // carre00
break;
case 23:
lcd.setCursor(13, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(14, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(15, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(16, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(17, 1);
lcd.write(byte(3)); // carre03
lcd.setCursor(18, 1);
lcd.write(byte(0)); // carre00
break;
case 24:
lcd.setCursor(13, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(14, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(15, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(16, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(17, 1);
lcd.write(byte(4)); // carre04
lcd.setCursor(18, 1);
lcd.write(byte(0)); // carre00
break;
case 25:
lcd.setCursor(13, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(14, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(15, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(16, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(17, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(18, 1);
lcd.write(byte(0)); // carre00
break;
case 26:
lcd.setCursor(13, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(14, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(15, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(16, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(17, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(18, 1);
lcd.write(byte(1)); // carre01
break;
case 27:
lcd.setCursor(13, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(14, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(15, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(16, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(17, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(18, 1);
lcd.write(byte(2)); // carre02
break;
case 28:
lcd.setCursor(13, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(14, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(15, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(16, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(17, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(18, 1);
lcd.write(byte(3)); // carre03
break;
case 29:
lcd.setCursor(13, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(14, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(15, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(16, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(17, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(18, 1);
lcd.write(byte(4)); // carre04
break;
case 30:
lcd.setCursor(13, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(14, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(15, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(16, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(17, 1);
lcd.write(byte(5)); // carre05
lcd.setCursor(18, 1);
lcd.write(byte(5)); // carre05
break;
default:
// statements
break;
}
}</pre>
<ul>
<li><strong>Programme pour le <em>NodeMCU</em> de réception :</strong><br /></li>
</ul>
<p><strong>Édit du 15 mai 2020 !</strong><br />
<a href="https://youtu.be/ArAcRfPpIYI?t=802">Électro-Bidouilleur a enfin sorti une vidéo sur le module <em>HC-12</em></a> et nous informe que la librairie <em><SoftwareSerial.h></em> est à éviter, ce que j'aurais bien voulu savoir à l'époque étant donné que j'ai effectivement rencontré des problèmes de réception. Il faut donc lui préférer la librairie <em><strong><AltSoftSerial.h></strong></em>. Je n'ai pas le temps de me pencher dessus, donc j'ai laissé tel quel le code suivant, sur <em>github</em> et en annexe du billet, à vous de changer la librairie.<br /></p>
<pre class="brush: cpp">// Ressources :
//https://forum.arduino.cc/index.php?topic=553743.0
//https://plaisirarduino.fr/moniteur-serie/
#include "ESPinfluxdb.h" // lib ESP InfluxDB
#include <SoftwareSerial.h> // lib Transmission série
#include <ESP8266WiFi.h> // lib ESP Wifi
#include <ESP8266WiFiMulti.h>
//################
//# DÉCLARATIONS #
//################
//——— Radio HC-12 ———//
SoftwareSerial HC12(D5, D6); // HC-12 TX Pin et RX Pin
char acquis_data;
String chaine;
float Voltage=12;
float MiniC=0.08; // courant minimum mesuré en dessous duquel la valeur est forcée à 0.
float tension_batterie_float;
float Courant_float;
//——— InfluxDB ———//
const char *INFLUXDB_HOST = "xx.org";
const uint16_t INFLUXDB_PORT = xx;
const char *DATABASE = "xx";
const char *DB_USER = "xx";
const char *DB_PASSWORD = "xxxx";
Influxdb influxdb(INFLUXDB_HOST, INFLUXDB_PORT); //https://github.com/projetsdiy/grafana-dashboard-influxdb-exp8266-ina219-solar-panel-monitoring/tree/master/solar_panel_monitoring
int compteur = 1;
//——— WiFi ———//
char ssid[] = "xx";
char password[] = "xxxxx";
ESP8266WiFiMulti WiFiMulti;
//#########
//# SETUP #
//#########
void setup() {
Serial.begin(9600); // Debug
//——— HC12 ———//
HC12.begin(9600); // Serial port to HC12
//——— WiFi ———//
WiFiMulti.addAP(ssid, password); // Connection au réseau WiFi
while (WiFiMulti.run() != WL_CONNECTED) {
delay(100);
}
Serial.println ("WiFi Connecté");
//——— InfluxDB ———//
while (influxdb.opendb(DATABASE, DB_USER, DB_PASSWORD)!=DB_SUCCESS) { // Connexion à la base InfluxDB
delay(10000);
}
Serial.println ("Connexion DataBase OK");
}
//#############
//# PROGRAMME #
//#############
void loop() {
Reception();
if (compteur > 100) { // envoie la data toutes les 6 secondes (delay 10 x 100 = 1000 ms, et l'opération prend 5 secondes à transférer/écrire en base)
SendDataToInfluxdbServer();
compteur = 1;
}
else {
compteur++;
}
delay(10); // refresh la data sur l'afficheur toutes les 10 ms
}
//#############
//# FONCTIONS #
//#############
void Reception() {
// surtout pas de delay dans cette boucle, sinon les data reçues sont erronnées.
while (HC12.available()) { // If HC-12 has data
acquis_data = HC12.read();
chaine = chaine + acquis_data;
// Serial.println (chaine); // Attention, chaine est donc une String
/* message reçu de la forme
12.665 VOL / 0.045 AMP
pour chaque ligne on fait :*/
if (chaine.endsWith("\n")) { //détection de fin de ligne : méthodes String
// Serial.println ("fin de ligne"); // debug
// String phrase = "12.665 VOL / 0.045 AMP"; //debug
char tension_batterie[5]; // chaine de 6 caractères pour stocker le texte avant le mot VOL
char Courant[3]; // chaine de 4 caractères pour stocker le texte avant le mot AMP
// sscanf(phrase.c_str(), "%s VOL / %s AMP", tension_batterie, &Courant); //debug
sscanf(chaine.c_str(), "%s VOL / %s AMP", tension_batterie, &Courant); // la chaine à parser est dans une String, avec la méthode c_str()
tension_batterie_float = atof(tension_batterie),3; // char convertie en Float, avec 3 décimales
Courant_float = atof(Courant),2; // char convertie en Float, avec 2 décimales
Serial.print("VOLTS: ");
Serial.println(tension_batterie_float,3); // float avec 3 décimales
Serial.print("AMPERES: ");
Serial.println(Courant_float,3);
Serial.print("Watt: ");
Serial.println(Courant_float*Voltage,0); // float avec 0 décimales
Serial.println(' ');
// Affichage LCD courant et Puissance
if ( Courant_float < MiniC ){ // remise à zero forcée si valeur mesurée très petite
Courant_float = 0;
}
chaine = ""; // vide la String chaine
}
}
}
void SendDataToInfluxdbServer() { //Writing data with influxdb HTTP API: https://docs.influxdata.com/influxdb/v1.5/guides/writing_data/
//Querying Data: https://docs.influxdata.com/influxdb/v1.5/query_language/
dbMeasurement rowDATA("Data");
rowDATA.addField("tension_batterie", tension_batterie_float);
rowDATA.addField("Courant", Courant_float);
// Serial.println(influxdb.write(rowDATA) == DB_SUCCESS ? " - rowDATA write success" : " - Writing failed");
influxdb.write(rowDATA);
// Vide les données - Empty field object.
rowDATA.empty();
}</pre>
<p><strong><ins>Configuration de la <em>Grafana</em></ins> :</strong><br /></p>
<ul>
<li>Concernant cette partie, je vous laisse voir la fin de ce <a href="http://burogu.makotoworkshop.org/index.php?post/2019/08/05/anemometre3">billet</a>, vu que c'est la même chose !<br /></li>
</ul>
<blockquote><p>Vous pourriez obtenir ce genre de chose :<br /></p></blockquote>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/grafana_monitoring_batterie.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.grafana_monitoring_batterie_m.jpg" alt="" style="display:table; margin:0 auto;" /></a><br /></p>
<p>Le code est aussi <a href="https://github.com/makotoworkshop/Monitoring_Generateur-Batterie">documenté ici</a>, et en annexe du billet.<br />
Boîtiers 3D <a href="https://www.thingiverse.com/thing:3956430">dispos sur Thingiverse</a><br /></p>
<p><ins>Ressources</ins> :<br />
<a href="https://wiki.mchobby.be/index.php?title=SENSEUR-COURANT-ACS712">https://wiki.mchobby.be/index.php?title=SENSEUR-COURANT-ACS712</a><br />
<a href="https://www.sparkfun.com/datasheets/BreakoutBoards/0712.pdf">https://www.sparkfun.com/datasheets/BreakoutBoards/0712.pdf</a><br />
<a href="http://www.mon-club-elec.fr/pmwiki_mon_club_elec/pmwiki.php?n=MAIN.ProjetBatterieMesureTension">http://www.mon-club-elec.fr/pmwiki_mon_club_elec/pmwiki.php?n=MAIN.ProjetBatterieMesureTension</a><br /><br /></p>
<h3><a href="http://burogu.makotoworkshop.org/index.php?post/2019/08/30/anemometre4">À Suivre…</a></h3>http://burogu.makotoworkshop.org/index.php?post/2019/12/27/monitoring_generateur-batterie#comment-formhttp://burogu.makotoworkshop.org/index.php?feed/atom/comments/680Un anémomètre WiFi -3- … ha bah non, Radio !urn:md5:ad03d71345b766eac5387a5948ff51712019-08-30T16:40:00+02:002020-05-15T09:28:50+02:00makoto doushiteEnergies RenouvelablesArduinoBricolageDIYESP8266Impression3DModélisation3DMécaniqueNodeMCUVidéosÉlectroniqueÉolienne<p><a href="http://burogu.makotoworkshop.org/index.php?post/2018/11/12/anemometre">Suite de l'étude précédente</a> :<br /></p>
<p>Retour sur l'usage de l'anémomètre à base de <em>NodeMCUv3 LoLin</em> (puce ESP8266).<br />
Après quelques mois d'utilisation que peut-on conclure ?<br />
Et bien il fonctionne bien, mais… Il présente plusieurs défauts :<br /></p>
<blockquote><p>- Problème de portée, de temps en temps on perd la connexion avec le routeur <em>WiFi</em>.<br />
- Je n'ai pas beaucoup creusé, mais à priori le code que j'ai écrit finit par planter.<br />
- Il consomme beaucoup d'énergie si on envisage de rendre son alimentation autonome (batterie).<br />
- Une seule connexion est possible. C'est à dire que c'est soit <a href="http://burogu.makotoworkshop.org/index.php?post/2019/01/01/anemometre2">le module récepteur</a> qui affiche les données, soit la page web avec le manomètre.<br />
- J'aurais voulu « grapher » des statistiques, et je me voyais embarqué dans du développement complexe et laborieux pour mes maigres compétences.<br /></p></blockquote>
<p>Sur une suggestion de <em><a href="http://burogu.makotoworkshop.org/index.php?post/2018/11/12/anemometre#c18899">Chrismart</a></em>, j'ai donc décidé de revoir le projet dans une version plus fiable et proche de mes attentes.<br /><br /></p>
<h3><ins>Fonctionnalités revues et corrigées </ins> :<br /></h3>
<p>- Exit l<em>'ESP8266</em> pour la transmission de data, ça va se passer en <strong>Radio 433Mhz</strong> grâce à un module <em>HC-12</em> afin de gagner en portée.<br />
- Sans le <em>WiFi</em> qui réclamait une connexion permanente, on va pouvoir mettre les appareils en économie d'énergie lorsqu’il n'y a pas de vent.<br />
- La réception des data, va donc aussi se passer en Radio, pour se voir affichée sur le module d'affichage client avec un rafraîchissement temps réel.<br />
- Dans le boîtier Client, on garde l<em>'ESP8266</em>, qui sera chargé d'envoyer les data à un serveur Web afin de « grapher » des statistiques à l'aide d'une <em>BDD</em> InfluxDB et du grapheur <em>Grafana</em>.<br />
- Ce qui ne change pas, c'est la partie mécanique, vue dans <a href="http://burogu.makotoworkshop.org/index.php?post/2018/11/12/anemometre">le premier billet</a>.<br /></p>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/Anemo_synoptic.svg.png" title="Anemo_synoptic.svg.png"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.Anemo_synoptic.svg_m.png" alt="Anemo_synoptic.svg.png" style="display:table; margin:0 auto;" /></a><br />
Nous allons voir tout ça étape par étape.<br /><br /></p>
<h3><ins>L'anémomètre, partie émetteur</ins> :<br /></h3>
<p>J'ai donc câblé un nouveau circuit :<br />
<a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/Anemometre02.png" title="Anemometre02.png"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.Anemometre02_m.png" alt="Anemometre02.png" /></a><br />
<a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/20190802_211343.jpg" title="20190802_211343.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.20190802_211343_s.jpg" alt="20190802_211343.jpg" style="float:right; margin: 0 0 1em 1em;" /></a>
<strong>Matériel requis :</strong></p>
<blockquote><p>- 1 <em>Arduino Pro Mini 5V</em>.<br />
- 1 plaquette <em>HC-12</em> et son antenne.<br />
- 1 condensateur électrochimique polarisé de 220µF.<br />
- 1 diode 1N4007.<br />
- 1 résistance 10kΩ.<br />
- 1 Capteur à effet Hall US1881.<br />
- Un ordi avec port USB et le soft Arduino IDE.</p></blockquote>
<p>Pour permettre au montage de s'intégrer en lieu et place du <em>NodeMCUv3 LoLin</em> , j'ai tout fixé sur un morceau d'époxy.<br /></p> <p><strong>Édit du 15 mai 2020 !</strong><br />
<a href="https://youtu.be/ArAcRfPpIYI?t=802">Électro-Bidouilleur a enfin sorti une vidéo sur le module <em>HC-12</em></a> et nous informe que la librairie <em><SoftwareSerial.h></em> est à éviter, ce que j'aurais bien voulu savoir à l'époque étant donné que j'ai effectivement rencontré des problèmes de réception. Il faut donc lui préférer la librairie <em><strong><AltSoftSerial.h></strong></em>. Je n'ai pas le temps de me pencher dessus, donc j'ai laissé tel quel le code suivant, sur <em>github</em> et en annexe du billet, à vous de changer la librairie.<br /></p>
<p>Le code est aussi <a href="https://github.com/makotoworkshop/Anemometre_Arduino_Radio-HC-12_LCD/blob/master/Anemometre_Arduino_Radio-HC-12_Transmitter.ino">documenté ici</a>, et en annexe du billet :<br /></p>
<ul>
<li><strong>Programme pour l’<em>Arduino Pro Mini</em> de transmission :</strong><br /></li>
</ul>
<pre class="brush: cpp">/* Arduino Anemometer Radio Transmitter using HC-12 */
#include <SoftwareSerial.h>
/****************/
/* DÉCLARATIONS */
/****************/
SoftwareSerial HC12(10, 11); // HC-12 TX Pin, HC-12 RX Pin
// le capteur à effet Hall est connecté à la pin 2 = int0
unsigned long rpmVent = 0;
unsigned long vitVentKMH = 0;
unsigned long dateDernierChangementVent = 0;
unsigned long dateDernierChangementKMH = 0;
float intervalleKMH = 0;
/*********/
/* SETUP */
/*********/
void setup() {
Serial.begin(9600); // Serial port to computer
HC12.begin(9600); // Serial port to HC12
// Pin capteurs
attachInterrupt(0, rpm_vent, FALLING);
}
/*************/
/* PROGRAMME */
/*************/
void loop() {
RemiseZeroVitVentKMH ();
delay(500);
}
/*************/
/* FONCTIONS */
/*************/
void rpm_vent() // appelée par l'interruption, Anémomètre vitesse du vent.
{
unsigned long dateCourante = millis();
intervalleKMH = (dateCourante - dateDernierChangementVent);
Serial.print ( "intervalle en s : " );
Serial.println (intervalleKMH/1000); // affiche l'intervalle de temps entre deux passages
if (intervalleKMH != 0) // attention si intervalle = 0, division par zero -> erreur
{
rpmVent = 60 / (intervalleKMH /1000);
}
vitVentKMH = ( rpmVent + 6.174 ) / 8.367;
Serial.print ( "vitVentKMH : " );
Serial.println ( vitVentKMH ); // affiche les rpm
Serial.println ( "" );
HC12.print(char(vitVentKMH));
dateDernierChangementVent = dateCourante;
}
void RemiseZeroVitVentKMH ()
{
unsigned long dateCouranteKMH = millis();
if (intervalleKMH == intervalleKMH) // Si ça ne tourne plus (valeur plus mise à jour)
{
float dureeKMH = (dateCouranteKMH - dateDernierChangementKMH);
if (dureeKMH > 10000) // Si ça ne tourne plus depuis 10 secondes
{
Serial.print ( "dureeKMH : " );
Serial.println ( dureeKMH ); // affiche les rpm
vitVentKMH = 0; // Remsise à zero !
dateDernierChangementKMH = dateCouranteKMH;
}
}
}</pre>
<p>J'ai donc repris la partie <em>rpm_vent()</em> et <em>RemiseZeroVitVentKMH()</em> que j'avais élaboré dans la version <em>WiFi</em>, en ajoutant simplement l'instruction <em>HC12.print(char(vitVentKMH))</em> afin de transmettre la donnée par le module <em>HC-12</em>.<br />
Et c'est tout !<br /><br /></p>
<h3><ins>Le boîtier client, partie récepteur avec affichage</ins> :<br /></h3>
<p>Voici le montage avec un afficheur LCD standard, plus simple que mon boîtier à base d'afficheurs <em>DLG7137</em>, et qui vous permettra une réalisation aisée et rapide, mais cependant moins classe que l’usine à gaz que j’avais donc monté…<br />
<a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/ClientAfficheurLCD_bb.png" title="ClientAfficheurLCD_bb.png"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.ClientAfficheurLCD_bb_m.png" alt="ClientAfficheurLCD_bb.png" style="display:table; margin:0 auto;" /></a>
<strong>Matériel requis :</strong></p>
<blockquote><p>- 1 <em>Arduino Pro Mini 5V</em>.<br />
- 1 plaquette <em>HC-12</em> et son antenne.<br />
- 1 condensateur électrochimique polarisé de 220µF.<br />
- 1 diode 1N4007.<br />
- 1 afficheur LCD type HD44780 16 ou 20 x 2.<br />
- Un ordi avec port USB et le soft Arduino IDE.<br /></p></blockquote>
<p>Le code est aussi <a href="https://github.com/makotoworkshop/Anemometre_Arduino_Radio-HC-12_LCD/blob/master/Anemometre_Arduino_Radio-HC-12_Receiver.ino">documenté ici</a>, et en annexe du billet :<br /></p>
<ul>
<li><strong>Programme pour l’Arduino Pro Mini de réception :</strong><br /></li>
</ul>
<p><strong>Édit du 15 mai 2020 !</strong><br />
<a href="https://youtu.be/ArAcRfPpIYI?t=802">Électro-Bidouilleur a enfin sorti une vidéo sur le module <em>HC-12</em></a> et nous informe que la librairie <em><SoftwareSerial.h></em> est à éviter, ce que j'aurais bien voulu savoir à l'époque étant donné que j'ai effectivement rencontré des problèmes de réception. Il faut donc lui préférer la librairie <em><strong><AltSoftSerial.h></strong></em>. Je n'ai pas le temps de me pencher dessus, donc j'ai laissé tel quel le code suivant, sur <em>github</em> et en annexe du billet, à vous de changer la librairie.<br /></p>
<pre class="brush: cpp">/* Arduino Anemometer Radio Receiver using HC-12 and LCD Module */
/* The circuit:
* LCD RS pin to digital pin 12
* LCD Enable pin to digital pin 11
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4
* LCD D6 pin to digital pin 3
* LCD D7 pin to digital pin 2
* LCD R/W pin to ground
* LCD VSS pin to ground
* LCD VCC pin to 5V
* 10K resistor:
* ends to +5V and ground
* wiper to LCD VO pin (pin 3)*/
#include <LiquidCrystal.h>
#include <SoftwareSerial.h>
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
SoftwareSerial HC12(8, 9); // HC-12 TX Pin, HC-12 RX Pin
/*********/
/* SETUP */
/*********/
void setup() {
Serial.begin(9600); // Serial port to computer
HC12.begin(9600); // Serial port to HC12
lcd.begin(20, 2);
lcd.setCursor(0, 0);
// Print a message to the LCD.
lcd.print(" Anemometer");
lcd.setCursor(0, 1);
lcd.print(" Test");
delay(1000);
lcd.clear();
}
/*************/
/* PROGRAMME */
/*************/
void loop() {
while (HC12.available()) { // If HC-12 has data
int incomingChar = HC12.read();
Serial.print ( "buffer : " );
Serial.println (incomingChar);
lcd.setCursor(0, 0);
lcd.print(incomingChar);
lcd.setCursor(4, 0);
lcd.print("Km/h");
}
}</pre>
<p>Pour la réception des données on récupère les caractères avec la variable <em>incomingChar</em> et on l'envoie sur l'écran avec <em>lcd.print</em>.<br /><br /></p>
<h3><ins>Le boîtier client, partie récepteur, avec statistiques graphiques</ins> :<br /></h3>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/ClientAfficheurLCD_nodemcu_bb.png" title="ClientAfficheurLCD_nodemcu_bb.png"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.ClientAfficheurLCD_nodemcu_bb_m.png" alt="ClientAfficheurLCD_nodemcu_bb.png" style="display:table; margin:0 auto;" /></a>
<strong>Matériel requis :</strong></p>
<blockquote><p>- 1 <em>NodeMCUv3 LoLin</em>.<br />
- Un ordi avec port USB et le soft Arduino IDE.</p></blockquote>
<ul>
<li>On conserve ici le même design que précédemment, et on ajoute simplement un <em>NodeMCU</em> (ESP8266) qui va permettre la transmission de donnée via <em>WiFi</em>.<br /></li>
</ul>
<p>Il est donc chargé d'envoyer les data à un serveur Web afin de « grapher » des statistiques à l'aide d'une base de donnée <em>InfluxDB</em> et du grapheur <em>Grafana</em>.<br /></p>
<p><em>Grafana</em> est une sorte de CMS web qui permet la visualisation et la mise en forme de données métriques. Il permet de réaliser des graphiques depuis plusieurs sources dont des bases de données de série temporelle <em>(Time Series Database</em>), et c'est <em>InfluxDB</em> qu'on va ici utiliser.<br />
Pour cette partie, il faut disposer d'un serveur web, sur lequel on va installer <em>Grafana</em> et la base de donnée 'InfluxDB''.<br />
Grâce à <a href="https://github.com/projetsdiy/grafana-dashboard-influxdb-exp8266-ina219-solar-panel-monitoring/tree/master/solar_panel_monitoring">ce projet</a>, j'ai pu récupérer le bout de code simple qui va permettre à l’<em>ESP8266</em> d'écrire en base de donnée <em>InfluxDB</em>.<br />
Il faudra donc ajouter ces deux fichiers <em>ESPinfluxdb.cpp</em> et <em>ESPinfluxdb.h</em> au sketch <em>Arduino</em> pour programmer l<em>'ESP8266</em> du <em>NodeMCU</em>.<br /></p>
<ul>
<li>On donne au programme les paramètres de connexion au <em>WiFi</em> local, les paramètres de connexion à la base de donnée, qu'elle soit dans un réseau privé ou sur une adresse publique avec un nom de domaine associé.<br /></li>
</ul>
<p>Le code est aussi <a href="https://github.com/makotoworkshop/Anemometre_Arduino_esp8266_Radio-HC-12_Grafana/tree/master/Anemometre_Arduino_Radio-HC-12_Receiver_Grafana">documenté ici</a>, et en annexe du billet :<br /></p>
<ul>
<li><strong>Programme pour le <em>NodeMCU</em> de réception :</strong><br /></li>
</ul>
<p><strong>Édit du 15 mai 2020 !</strong><br />
<a href="https://youtu.be/ArAcRfPpIYI?t=802">Électro-Bidouilleur a enfin sorti une vidéo sur le module <em>HC-12</em></a> et nous informe que la librairie <em><SoftwareSerial.h></em> est à éviter, ce que j'aurais bien voulu savoir à l'époque étant donné que j'ai effectivement rencontré des problèmes de réception. Il faut donc lui préférer la librairie <em><strong><AltSoftSerial.h></strong></em>. Je n'ai pas le temps de me pencher dessus, donc j'ai laissé tel quel le code suivant, sur <em>github</em> et en annexe du billet, à vous de changer la librairie.<br /></p>
<pre class="brush: cpp">#include "ESPinfluxdb.h"
#include <SoftwareSerial.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
/****************/
/* DÉCLARATIONS */
/****************/
const char *INFLUXDB_HOST = "domain.org"; // ou ip locale du serveur
const uint16_t INFLUXDB_PORT = 8086;
const char *DATABASE = "AnemoBDD";
const char *DB_USER = "login";
const char *DB_PASSWORD = "motdepasse";
int incomingChar;
int compteur = 1;
SoftwareSerial HC12(D5, D6); // HC-12 TX Pin, HC-12 RX Pin
ESP8266WiFiMulti WiFiMulti;
Influxdb influxdb(INFLUXDB_HOST, INFLUXDB_PORT);
/*********/
/* SETUP */
/*********/
void setup() {
Serial.begin(115200);
HC12.begin(9600); // Serial port to HC12
WiFiMulti.addAP("ssid", "password"); // indiquer ici vos paramètres WiFi
while (WiFiMulti.run() != WL_CONNECTED) {
delay(100);
}
Serial.println("Ready");
//influxdb.opendb(DATABASE, DB_USER, DB_PASSWORD);
// Connexion à la base InfluxDB - Connect to InfluxDB database
while (influxdb.opendb(DATABASE, DB_USER, DB_PASSWORD)!=DB_SUCCESS) {
Serial.println("Open database failed");
delay(10000);
}
}
/*************/
/* FONCTIONS */
/*************/
void ReceiveDataFromRadio() {
while (HC12.available()) { // If HC-12 has data
incomingChar = HC12.read();
// Serial.print ( "buffer : " );
// Serial.println (incomingChar);
}
}
void SendDataToInfluxdbServer() {
//Writing data with influxdb HTTP API: https://docs.influxdata.com/influxdb/v1.5/guides/writing_data/
//Querying Data: https://docs.influxdata.com/influxdb/v1.5/query_language/
// Envoi la vitesse du vent
dbMeasurement rowAnemo("VitesseVent");
rowAnemo.addField("VitesseVent", incomingChar);
Serial.println(influxdb.write(rowAnemo) == DB_SUCCESS ? " - Object write success" : " - Writing failed");
// Vide les données - Empty field object.
rowAnemo.empty();
}
/*************/
/* PROGRAMME */
/*************/
void loop() {
ReceiveDataFromRadio();
if (compteur > 500) { // envoie la data toutes les 5 secondes (10 ms + 500)
SendDataToInfluxdbServer();
compteur = 1;
}
else {
compteur++;
}
delay(10); // refresh la data sur l'afficheur toutes les 10 ms
// Serial.print ( "compteur = " );
// Serial.println(compteur);
}</pre>
<p>Toujours pareil, c'est la variable <em>incomingChar</em> reçue par le <em>HC-12</em> qui est envoyé périodiquement à la base de données.<br /></p>
<p><strong><ins>Configuration de la Base de données</ins> :</strong><br />
Coté serveur web donc, une fois les logiciels <em>Grafana</em> et <em>InfluxDB</em> installés, on va commencer par créer la base de donnée avec les commandes suivantes.<br /></p>
<ul>
<li>Lancer l’interpréteur de commande d’<em>InfluxDB</em> :<br /></li>
</ul>
<pre>influx</pre>
<ul>
<li>Créer la base de donnée <em>AnemoBDD</em> :<br /></li>
</ul>
<pre>create database AnemoBDD</pre>
<ul>
<li>Indiquer qu’on veut utiliser cette base :<br /></li>
</ul>
<pre>use AnemoBDD</pre>
<ul>
<li>Créer l’utilisateur de la base en spécifiant son mot de passe :<br /></li>
</ul>
<pre>create user login with password 'motdepasse'</pre>
<ul>
<li>Donner les droits d’accès complet à l’utilisateur :<br /></li>
</ul>
<pre>grant all on AnemoBDD to login</pre>
<ul>
<li>On peut vérifier avec ces commandes, puis quitter :<br /></li>
</ul>
<pre>show databases
show users
quit</pre>
<p><br /></p>
<p><strong><ins>Configuration de la <em>Grafana</em></ins> :</strong><br />
Reste à paramétrer <em>Grafana</em> avec la base <em>InfluxDB</em> en source et un tableau de bord qui récupére la donnée <em>rowAnemo</em>, sous la forme qu'on souhaitera voir afficher.<br /></p>
<ul>
<li>Ajouter une source de donnée, choisir la source de type <em>InfluxDB</em> :<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/grafana01.png" title="grafana01.png"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.grafana01_s.png" alt="grafana01.png" style="float:right; margin: 0 0 1em 1em;" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/grafana02.png" title="grafana02.png"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.grafana02_s.png" alt="grafana02.png" style="float:right; margin: 0 0 1em 1em;" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/grafana14.png" title="grafana14.png"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.grafana14_s.png" alt="grafana14.png" /></a></p>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/grafana03.png" title="grafana03.png"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.grafana03_t.png" alt="grafana03.png" style="float:right; margin: 0 0 1em 1em;" /></a><br /></p>
<ul>
<li>Puis paramétrer les accès à la base <em>InfluxDB</em> :<br /></li>
</ul>
<p>On indique donc un nom de source, l’URL et le port du serveur <em>InfluxDB</em>, puis les identifiants de la base qu’on a crée auparavant.<br /><br /><br /></p>
<ul>
<li>Ensuite, créer un « tableau de bord » et ajouter une requête « Add Query » :<br /></li>
</ul>
<p>Choisir la source de donnée qu’on vient de faire, et renseigner les champs avec les valeurs du programme de l’<em>ESP8266</em>.<br />
<a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/grafana15.png" title="grafana15.png"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.grafana15_s.png" alt="grafana15.png" style="float:right; margin: 0 0 1em 1em;" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/grafana04.png" title="grafana04.png"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.grafana04_s.png" alt="grafana04.png" style="float:right; margin: 0 0 1em 1em;" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/grafana13.png" title="grafana13.png"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.grafana13_s.png" alt="grafana13.png" /></a>
<br />
Notez que si le NodeMCU est en marche et bien connecté à la base InfluxDB, ces champs proposeront les valeurs automatiquement quand on clique dessus, preuve que tout fonctionne comme prévu.<br /></p>
<ul>
<li>On passe à la partie « Visualization » ou l’on choisis le type « Graph », et on paramètre le graphique comme ceci :<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/grafana12.png" title="grafana12.png"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.grafana12_s.png" alt="grafana12.png" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/grafana05.png" title="grafana05.png"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.grafana05_s.png" alt="grafana05.png" style="float:right; margin: 0 0 1em 1em;" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/grafana06.png" title="grafana06.png"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.grafana06_s.png" alt="grafana06.png" style="float:left; margin: 0 1em 1em 0;" /></a></p>
<ul>
<li>La partie « General » permet notamment de donner un nom au graphique.<br /><br /></li>
</ul>
<ul>
<li>De la même manière, j’ai ajouté une « Visualization » de type « Gauge » :<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/grafana07.png" title="grafana07.png"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.grafana07_t.png" alt="grafana07.png" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/grafana08.png" title="grafana08.png"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.grafana08_t.png" alt="grafana08.png" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/grafana09.png" title="grafana09.png"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.grafana09_t.png" alt="grafana09.png" /></a><br /></p>
<ul>
<li>Il faut bien penser à utiliser l’icône en forme de disquette pour sauvegarder à chaque étapes…<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/grafana10.png" title="grafana10.png"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.grafana10_m.png" alt="grafana10.png" /></a><br /></p>
<h3><ins>Pour finir</ins> :<br /></h3>
<p>Nous avons donc vu une base de travail que vous pourrez adapter facilement si besoin.<br /></p>
<ul>
<li>Cependant comme j'avais ajouté une fonctionnalité supplémentaire, à savoir :</li>
</ul>
<blockquote><p>Un <strong>tachymètre</strong> qui mesure la vitesse de rotation de l'éolienne, j'ai pas mal dû modifier le code notamment pour envoyer les données en une phrase de data et ensuite bien différencier qu'elle donnée va où…<br />
Ajouté aussi la gestion d'économie d'énergie, qui, dés que l’anémomètre s'arrête de tourner, met en veille le module <em>HC-12</em>, puis l<em>'Arduino</em>, pour être réveillé dés que la rotation reprend sous le vent.<br /></p></blockquote>
<ul>
<li>Pour cette version donc, je me contente juste de poser le <a href="https://github.com/makotoworkshop/Anemometre_esp8266_Radio-HC-12_Receiver_2Hall_Grafana"><strong>>> code ici <<</strong></a> et aussi en annexe du billet.<br /></li>
</ul>
<p>Ainsi qu'une petite vidéo pour illustrer. J'y tourne mon appareil de test à la main :<br /></p>
<iframe width="640" height="360" sandbox="allow-same-origin allow-scripts" src="https://peertube.makotoworkshop.org/videos/embed/eb76a519-59c5-49d6-a0f3-125f9f6b8fbc?warningTitle=0" frameborder="0" allowfullscreen></iframe>
<p><ins>Voici les mesures de consommation</ins> : Anémomètre/Tachymètre (1 module radio + 2 capteur Hall)<br />
- 45 mA, qui tombent à 9 mA en mode veille.<br />
- <strong>5 mA en veille</strong> en dessoudant la <em>LED</em> Power de l<em>'Arduino</em>.<br />
(Déssouder le régulateur ne change pas grand chose).</p>
<h3><a href="http://burogu.makotoworkshop.org/index.php?post/2019/12/27/monitoring_generateur-batterie">À suivre…</a></h3>http://burogu.makotoworkshop.org/index.php?post/2019/08/05/anemometre3#comment-formhttp://burogu.makotoworkshop.org/index.php?feed/atom/comments/672Un anémomètre WiFi -2-urn:md5:875fe9c1d2261cc7b73799cdee7959e72019-01-05T18:56:00+01:002020-02-23T19:45:22+01:00makoto doushiteEnergies RenouvelablesArduinoBricolageDIYESP8266Impression3DModélisation3DMécaniqueNodeMCUVidéosÉlectroniqueÉolienne<p><a href="http://burogu.makotoworkshop.org/index.php?post/2018/11/12/anemometre">Suite de l'étude précédente</a> :<br /></p>
<ul>
<li>Avoir un affichage sur le web c'est bien…<br /></li>
</ul>
<p>Une petite vidéo :<br /></p>
<iframe width="640" height="360" sandbox="allow-same-origin allow-scripts" src="https://peertube.makotoworkshop.org/videos/embed/bacf06e4-83c0-4b41-aff3-085ba182338e?warningTitle=0" frameborder="0" allowfullscreen></iframe>
<ul>
<li>Mais un module d'affichage physique c'est quand même plus pratique !<br /></li>
</ul>
<p>Une petite vidéo :<br /></p>
<iframe width="640" height="360" sandbox="allow-same-origin allow-scripts" src="https://peertube.makotoworkshop.org/videos/embed/84ae22c8-7e48-434c-9324-f4d6b438e10e?warningTitle=0" frameborder="0" allowfullscreen></iframe>
<ul>
<li>Une seconde démo en vidéo, avec le programme de l'anémomètre revu et corrigé. Le rafraîchissement des valeurs se fait toutes les demi-secondes :</li>
</ul>
<iframe width="640" height="360" sandbox="allow-same-origin allow-scripts" src="https://peertube.makotoworkshop.org/videos/embed/1fe7051c-dc25-465b-8d6c-287a5d3d9d7b?warningTitle=0" frameborder="0" allowfullscreen></iframe>
<ul>
<li>J'ai donc passé quelques jours à concevoir ce boîtier client qui fonctionne à base lui aussi d'un <em>NodeMCU</em> connecté au réseau WiFi de la maison, et qui récupère les infos de vitesse transmise par l'anémomètre.<br /><br /></li>
</ul>
<h3><ins>Principe</ins> :<br /></h3>
<blockquote><p>Ce client se connecte à l'anémomètre et récupère le fichier <em>JSON</em> ( <em>http://192.168.0.34:8080/mesures.json</em>) afin de le <em>parser</em> toutes les secondes, reste alors à afficher l'information.<br /></p></blockquote>
<p>Ce sont donc des vieux afficheurs matriciel <em>DLG7137</em> qui vont faire le travail.<br />
Pour chaque afficheurs il aurait fallu employer un registre à décalage, afin de pouvoir adresser les données à afficher sur chaque matrices, comme cela à été fait sur le <em><a href="http://burogu.makotoworkshop.org/index.php?post/2018/01/16/wrrw04">WebRadioReveilWiFi</a></em>, mais ne disposant pas de suffisamment de <em>74HC595</em>, j'ai dû procéder autrement.<br />
Les <em>DLG7137</em> disposent en effet d'une pin <em>Write</em> (<em>WR/</em>) qui n'autorise l'affichage de la donnée qu'au moment où elle passe à l'état bas.<br />
Du coup en reliant tous les afficheurs entre eux et en faisant circuler l'information, il restait au programme de valider la pin <em>Write</em> du bon afficheur au bon moment pour afficher le caractère attendu sur chacun des afficheurs.<br />
Et comme le <em>NodeMCU</em> ne dispose pas de suffisamment de papattes pour pouvoir brancher les 12 pins <em>Write</em> des 12 afficheurs, j'ai donné ce travail à faire à deux registres <em>74HC595</em>, permettant ainsi d'adresser 16 pins <em>Write</em>.<br /></p>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/ClientAfficheur_bb.png" title="ClientAfficheur_bb.png"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.ClientAfficheur_bb_m.png" alt="ClientAfficheur_bb.png" style="display:table; margin:0 auto;" /></a><br />
<strong><ins>Note</ins> :</strong> J'ai oublié de câbler les deux condensateurs de découplage utiles aux registres <em>74HC595</em> !!<br />
Ne les oubliez-pas ! (100nF directement entres les pattes d'alimentation 8 et 16)<br /><br /></p> <h3><ins>Réalisation</ins> :<br /></h3>
<p>Pas de plaquette de circuit imprimé réalisée cette fois, par manque de temps et aussi car le boîtier serait unique, j'ai donc soudé le tout un quatre ou six heures sur une plaquette à trous, puis j'ai <a href="https://www.thingiverse.com/thing:3335805">dessiné le boîtier en 3D</a> pour impression.<br /></p>
<ul>
<li>La plaquette à trous :<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/dsc03958.jpg" title="dsc03958.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.dsc03958_s.jpg" alt="dsc03958.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/dsc03960.jpg" title="dsc03960.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.dsc03960_s.jpg" alt="dsc03960.jpg" /></a><br /></p>
<ul>
<li>Le boîtier imprimé, avec un petit bouton pour appuyer sur le <em>reset</em> du <em>NodeMCU</em>.<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/dsc03956.jpg" title="dsc03956.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.dsc03956_s.jpg" alt="dsc03956.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/dsc03957.jpg" title="dsc03957.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.dsc03957_s.jpg" alt="dsc03957.jpg" /></a><br /></p>
<ul>
<li>J'ai trouvé un morceau de plexis de 2mm d'épaisseur, que j'ai peint sur l'envers à l'aérographe au <em>Tamiya smoke X-19</em> afin de donner un côté fumé à ce vitrage, ensuite collé à l'intérieur du boîtier :<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/dsc03961.jpg" title="dsc03961.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.dsc03961_s.jpg" alt="dsc03961.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/dsc03962.jpg" title="dsc03962.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.dsc03962_s.jpg" alt="dsc03962.jpg" /></a><br /></p>
<ul>
<li>La plaquette est mise en place en la glissant dans la rainure prévue, puis c'est au tour du couvercle :<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/dsc03964.jpg" title="dsc03964.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.dsc03964_s.jpg" alt="dsc03964.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/dsc03965.jpg" title="dsc03965.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.dsc03965_s.jpg" alt="dsc03965.jpg" /></a><br /></p>
<ul>
<li>Voilà…<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/dsc03966.jpg" title="dsc03966.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.dsc03966_s.jpg" alt="dsc03966.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/dsc03969.jpg" title="dsc03969.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.dsc03969_s.jpg" alt="dsc03969.jpg" /></a>]<br /></p>
<ul>
<li>C'est classe moi j'dis :D :<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/dsc03967.jpg" title="dsc03967.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.dsc03967_s.jpg" alt="dsc03967.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/dsc03971.jpg" title="dsc03971.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.dsc03971_s.jpg" alt="dsc03971.jpg" /></a><br />
Le module affiche <em>NoData</em> lorsque la transmission de donnée se passe mal, comme par exemple lorsque l'anémomètre est éteint.<br /><br /></p>
<h3><ins>Programme</ins> :<br /></h3>
<ul>
<li>Le code du <em>NodeMCU</em> est trop imposant pour être présenté correctement dans cette page, il est téléchargeable en pièce jointe ou <a href="https://github.com/makotoworkshop/01-ClientAnemometre_esp8266_Afficheurs_2ShiftRegister_01/blob/master/01-ClientAnemometre_esp8266_Afficheurs_2ShiftRegister_01.ino">consultable ici</a>.<br /><br /></li>
</ul>
<ul>
<li>Vous aurez remarqué au passage que j'ai donc connecté un second capteur à effet <em>Hall</em> pour mesurer la vitesse de rotation de l'éolienne, <a href="https://github.com/makotoworkshop/08-Anemometre_esp8266_WifiSVR_SPIFFS_2Hall_WifiUdp_V2">le code est dispo ici</a>.</li>
</ul>
<h3><a href="http://burogu.makotoworkshop.org/index.php?post/2019/08/05/anemometre3">À suivre…</a></h3>http://burogu.makotoworkshop.org/index.php?post/2019/01/01/anemometre2#comment-formhttp://burogu.makotoworkshop.org/index.php?feed/atom/comments/664Un anémomètre WiFi -1-urn:md5:45608fe5f374e514486debef5f494a402018-11-19T21:18:00+01:002019-02-23T15:21:45+01:00makoto doushiteEnergies RenouvelablesArduinoBricolageDIYESP8266Impression3DModélisation3DMécaniqueNodeMCUÉlectroniqueÉolienne<p><a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/dsc03927.jpg" title="dsc03927.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.dsc03927_s.jpg" alt="dsc03927.jpg" style="float:right; margin: 0 0 1em 1em;" /></a></p>
<blockquote><p>Récemment on m'a indiqué l'existence d'une plaquette électronique du genre <em>Arduino</em>, mais qui a la particularité de pouvoir « faire du <em>WiFi</em> ».<br />
D'abord dubitatif quant à l'utilité du truc, étant donné que je m'étais très bien passé de la chose jusqu'à présent, le truc est resté en <em>idle</em> dans un coin de mon esprit malade, jusqu'à ressurgir suite à mes derniers travaux sur l'<a href="http://burogu.makotoworkshop.org/index.php?post/2018/09/28/eolienne-axe-vertical-11">Éolienne du jardin</a>…<br />
Hé oui ! Je me suis dit que ce serait pas mal de savoir quelle vitesse de vent serait nécessaire pour pousser sur les ailes et la faire tourner, de savoir à quelle vitesse elle tournait aussi, et de pouvoir ainsi régler la tension du ressort de vitesse de rotation constante, un peu mieux qu'au… pif.<br /></p></blockquote>
<ul>
<li>J'avais donc une plaquette <em>NodeMCUv3 LoLin</em> (à base de puce <em>ESP8266</em>) sous la main et après quelques tests j'ai constaté que bah c'est comme <em>Arduino</em>, rien de compliqué.<br /></li>
<li>Et puis pour faire client ou serveur Web, bah c'était pas comme <em>Arduino</em>… et qu'il faudrait se sortir les doigts…<br /></li>
</ul>
<p>Oui car on peut servir des pages web, alors on pense assez vite à ordi-phone et une jauge de visualisation.<br />
Enfin en vrai, réflexe électronicien, j'ai tout de suite pensé afficheur à leds, mais récupérer les données via du web… wé, je garde l'idée… Alors :<br /></p>
<blockquote><p>Pour mon projet final j'aurais besoin d'une plaquette <em>NodeMCU</em> en mode serveur web, perchée sur l'éolienne, pour remonter les mesures de rotation de l’anémomètre (vent) et de l'éolienne (rpm).<br />
Les data seraient consultables via un navigateur sur un ordi ou un ordi-phone, sous forme de jauge de vitesse instantanée.<br />
Elles seraient aussi récupérable pour former des graphiques de statistiques.<br />
Un second <em>NodeMCU</em> avec des afficheurs à leds serait utilisé pour s'affranchir d'un ordi.<br /></p></blockquote>
<ul>
<li>Bon c'est pas forcément facile à suivre, alors voici un dessin :<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/anemometre3.png" title="anemometre3.png"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.anemometre3_m.png" alt="anemometre3.png" style="display:table; margin:0 auto;" /></a><br /></p>
<h3><ins>Simple anémomètre</ins> :</h3>
<ul>
<li>Bref, pour le moment on va juste fabriquer un anémomètre simple, avec une jauge sur ordi.<br /></li>
</ul>
<p>(voir même sur internet si on fait le nécessaire pour faire « sortir » les pages web).<br /><br /></p>
<p><strong>Matériel requis :</strong><br />
<a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/dsc03947.jpg" title="dsc03947.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.dsc03947_m.jpg" alt="dsc03947.jpg" /></a><br /></p>
<blockquote><p>- La mécanique <a href="https://www.thingiverse.com/thing:3222801">imprimée en 3D disponible ici</a>.<br />
- 1 Capteur à effet Hall <em>US1881</em> (absent de cette photo).<br />
- 2 aimants permanents au néodyme ∅6 mm x 3 mm (absent de cette photo).<br />
- 1 plaquette <em>NodeMCUv3 LoLin</em>.<br />
- 1 résistance 10kΩ.<br />
- 2 roulements à billes : ∅5 int x ∅10 ext x 4 mm.<br />
- 1 tige filetées : ∅5 mm de 10 mm de long.<br />
- 5 écrous de ∅5 mm.<br />
- 3 vis : ∅3 mm de 10 mm de long (tête fraisée).<br />
- 3 vis : ∅4 mm de 12-15 mm de long (tête poêlée).<br />
- Un ordi avec port USB et le soft <em>Arduino IDE</em>.<br /></p></blockquote>
<p><br /></p> <p><strong>Compétences requises :</strong><br /></p>
<blockquote><p>- Électronique.<br />
- Web design (html, css, JavaScript, Json).<br />
Où sinon t'as du temps et l'âme d'un bidouilleur et t'y arriveras !… du coup j'ai appris plein de trucs.<br /></p></blockquote>
<p><br /></p>
<p><strong>Le montage :</strong><br /></p>
<ul>
<li>Commençons par insérer les écrous dans les logements prévu après avoir percé les opercules (permettant l'impression au dessus des trous sans supports), puis à fermer la structure avec les vis de ∅3 mm.<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/dsc03944.jpg" title="dsc03944.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.dsc03944_s.jpg" alt="dsc03944.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/dsc03946.jpg" title="dsc03946.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.dsc03946_s.jpg" alt="dsc03946.jpg" /></a><br /></p>
<ul>
<li>Insérer un roulement dans son support, puis insérer le support dans le fond.<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/dsc03935.jpg" title="dsc03935.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.dsc03935_s.jpg" alt="dsc03935.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/dsc03934.jpg" title="dsc03934.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.dsc03934_s.jpg" alt="dsc03934.jpg" /></a><br /></p>
<ul>
<li>Préparer la tige filetée avec deux écrous bloqués à 3 mm du bord de la tige. L'idée c'est qu'une fois en place sur le roulement la tige puisse tourner librement.<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/dsc03936.jpg" title="dsc03936.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.dsc03936_s.jpg" alt="dsc03936.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/dsc03937.jpg" title="dsc03937.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.dsc03937_s.jpg" alt="dsc03937.jpg" /></a><br /></p>
<ul>
<li>Ensuite, régler la hauteur du support d'aimants (en gris, aimants pas encore dispo sur la photo) pour qu'il soit à hauteur du logement du capteur Hall (une des petites fentes, capteur pas encore dispo sur la photo). Le <em>NodeMCU</em> se loge simplement à l'endroit prévu.<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/dsc03940.jpg" title="dsc03940.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.dsc03940_s.jpg" alt="dsc03940.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/dsc03941.jpg" title="dsc03941.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.dsc03941_s.jpg" alt="dsc03941.jpg" /></a><br /></p>
<ul>
<li>Voilà, on peut mettre le roulement du haut et fermer le bas avec les vis de ∅4 mm après avoir taraudé les trous de vis. Le socle est donc ici adapté pour s'enficher sur le mât de l'éolienne, en lieu et place du cône que j'avais imprimé alors.<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/dsc03943.jpg" title="dsc03943.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.dsc03943_s.jpg" alt="dsc03943.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/dsc03932.jpg" title="dsc03932.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.dsc03932_s.jpg" alt="dsc03932.jpg" /></a><br /></p>
<ul>
<li>Coller le chapeau à la cyanoacrylate par dessus (après avoir percé l'opercule) puis placer un écrou pas trop bas, et visser le col par dessus après l'avoir taraudé au ∅5 mm, voire même ajouté du vernis/résine de blocage au filetage. Ceci devrait permettre de protéger le boîtier et le roulement de la pluie.<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/dsc03931.jpg" title="dsc03931.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.dsc03931_s.jpg" alt="dsc03931.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/dsc03930.jpg" title="dsc03930.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.dsc03930_s.jpg" alt="dsc03930.jpg" /></a><br /></p>
<ul>
<li>Reste à visser les hélices, et serrer le tout avec un écrou. (Photo en début de billet)<br /></li>
</ul>
<p><br /><br /></p>
<p><strong>Le schéma :</strong><br /></p>
<ul>
<li>Pas trop compliqué…<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/Anemometre01_bb.png" title="Anemometre01_bb.png"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.Anemometre01_bb_m.png" alt="Anemometre01_bb.png" style="display:table; margin:0 auto;" /></a><br /><br /></p>
<p><strong>Le câblage :</strong><br /></p>
<ul>
<li>C'est facile à câbler… Et il suffit de glisser le capteur à effet <em>Hall</em> dans une des deux fentes prévues. Avec le capteur <em>US1881</em> il faut placer deux aimants sur le support, un orienté pôle nord, et l'autre pôle sud (cf.<a href="https://www.sparkfun.com/datasheets/Components/General/Hall-US1881EUA.pdf">datasheet</a>).<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/dsc03949.jpg" title="dsc03949.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.dsc03949_s.jpg" alt="dsc03949.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/dsc03952.jpg" title="dsc03952.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.dsc03952_s.jpg" alt="dsc03952.jpg" /></a><br /><br /></p>
<p><strong>Programmation du <em>NodeMCU</em> :</strong><br /></p>
<ul>
<li>Pour programmer un <em>NodeMCU</em> avec l<em>'Arduino IDE</em> il faudra rajouter le support du module esp8266, voici 3 pages qui vous expliqueront comment faire : Via <a href="https://www.fais-le-toi-meme.fr/fr/electronique/tutoriel/programmes-arduino-executes-sur-esp8266-arduino-ide">fais-le-toi-meme.fr</a> ou <a href="http://henrysbench.capnfatz.com/henrys-bench/arduino-projects-tips-and-more/arduino-esp8266-lolin-nodemcu-getting-started/">henrys-bench</a>.<br /></li>
</ul>
<p>Tout le code de l'anémomètre est <a href="https://github.com/makotoworkshop/09-Anemometre_esp8266_WifiSVR_SPIFFS_Hall_WifiUdpV2">téléchargeable ici</a> ou en annexe à ce billet.<br />
Créer un dossier qui contiendra cette arborescence :<br /></p>
<pre class="brush: bash">Anemometre_esp8266_WifiSVR_SPIFFS_Hall/Anemometre_esp8266_WifiSVR_SPIFFS_Hall.ino
Anemometre_esp8266_WifiSVR_SPIFFS_Hall/data/index.html
Anemometre_esp8266_WifiSVR_SPIFFS_Hall/data/css/style.css
Anemometre_esp8266_WifiSVR_SPIFFS_Hall/data/js/java_vent.js
Anemometre_esp8266_WifiSVR_SPIFFS_Hall/data/js/jquery.min.js
Anemometre_esp8266_WifiSVR_SPIFFS_Hall/data/js/loader.js</pre>
<ul>
<li>Ainsi pour programmer la plaquette, il suffira de procéder au téléversement du projet <em>Arduino</em>, ça c'est comme d'habitude avec l<em>'Arduino IDE</em>.<br /></li>
</ul>
<blockquote><p>Contrairement à un <em>Arduino</em> classique, l'upload peut s'avèrer être très long, on peut donc augmenter la vitesse via le menu <em>Outils</em> et sélectionner <em>Upload Speed : 921600</em><br /></p></blockquote>
<ul>
<li>Et pour téléverser les fichiers <em>html</em>, <em>css</em> et <em>JavaScript</em>, il faudra cliquer <em>Outils</em> et cliquer <em>ESP8266 Sketch Data Upload</em>, ce qui aura pour effet d'immédiatement copier les fichiers contenu dans le dossier <em>data</em> sur la plaquette.<br /></li>
</ul>
<blockquote><p>Sauf que ce menu n'est pas disponible par défaut !<br />
Il faut en effet télécharger <a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/esp8266fs.jar">un fichier</a> à déposer dans le dossier du « carnet de croquis », sous une arborescence spécifique, ce qui donne chez moi : <em>/home/user/Arduino/tools/ESP8266FS/tool/esp8266fs.jar</em><br />
Tout est expliqué ici : <a href="https://github.com/esp8266/arduino-esp8266fs-plugin">https://github.com/esp8266/arduino-esp8266fs-plugin</a><br /></p></blockquote>
<p><br /></p>
<p><strong>Fonctionnement :</strong><br />
Ensuite ouvrir <em>Outils</em> > <em>Moniteur série </em>, qui devrait afficher l'adresse IP de la plaquette (sinon appuyer sur le bouton <em>Reset</em>), et rendez-vous sur un navigateur avec cette IP en <em>URL</em> et voila !<br />
<a href="http://burogu.makotoworkshop.org/public/electronique/anemometre/anemometre.png" title="anemometre.png"><img src="http://burogu.makotoworkshop.org/public/electronique/anemometre/.anemometre_s.png" alt="anemometre.png" style="display:table; margin:0 auto;" /></a><br />
C'est une petite entrée en matière intéressante de la conception d'un « appareil connecté », j'ai découvert comment tout ça s'articule…<br />
Plus à l'aise avec l'électronique, je touche mes limites techniques concernant la partie développement web, avec pas mal de méconnaissances du sujet qu'il faut que je travaille (wé j'en suis resté au web 1.0…), en vue dans de prochains billets, d'aborder les divers éléments liés à mes besoins plus spécifiques.<br /><br /></p>
<p><strong>Principe :</strong><br />
L'aimant passe devant le capteur à effet Hall à chaque rotation de l'axe de l'anémomètre, ce qui envoie une impulsion qui est alors réccupérée par le <em>NodeMCU</em> pour être traitée afin de mesurer la vitesse de rotation, puis de la convertir en Km/h.
Cette mesure est envoyée au serveur Web sous la forme d'un fichier <em>JSON</em> écrit en zone <em>SPIFFS</em>, qui est mis à jour toutes les secondes (valeur réglable au début du code <em>Arduino</em>)<br /><br /></p>
<p><strong>Présentation du contenu des fichiers :</strong><br />
J'ai commenté assez largement le code, mais n'espérez pas tout comprendre si un des langages vous échappe…<br /></p>
<p>Le fichier <em>JSON</em> ressemble à ceci :<br /></p>
<pre class="brush: js">{
"VitesseVent":"25"
}</pre>
<p>Lorsqu'on consulte la page Web, le JavaScript contenant la jauge est appelé et celui-ci récupére la valeur du <em>JSON</em> pour animer l'aiguille et afficher la valeur, toutes les secondes (en adéquation avec le réglage du code <em>Arduino</em>)<br /></p>
<ul>
<li>Le fichier <em>data/js/jquery.min.js</em> est une libraire standard (ou un truc du genre) qui se télécharge <a href="https://code.jquery.com/jquery/">sur internet</a>.<br /></li>
<li>Le fichier <em>data/js/loader.js</em> est une libraire google (ou un truc du genre) qui se télécharge chez <em><a href="https://developers.google.com/chart/">google chart</a></em>.<br /></li>
</ul>
<ul>
<li>Le fichier <em>data/js/java_vent.js</em>, qu'on aura écrit en adaptant <a href="https://developers.google.com/chart/interactive/docs/gallery/gauge">la librairie graphique <em>gauge</em></a> de <em>google chart</em>.<br /></li>
</ul>
<pre class="brush: js">google.charts.load('current', {
'packages': ['gauge']
});
google.charts.setOnLoadCallback(drawChart); // https://developers.google.com/chart/interactive/docs/gallery/gauge
function drawChart() { // Fonction principale :
// Create and populate the data table.
var dataGaugeVent = google.visualization.arrayToDataTable([
['Label', 'Value'],
['Vent', 0],
]);
// formatage avec un suffixe et # pour arrondir
var formatter = new google.visualization.NumberFormat({
suffix: ' Km/h',
pattern: '#'
});
// définition des options documentée ici https://developers.google.com/chart/interactive/docs/gallery/gauge
var options = {
width: 800, height: 720,
greenFrom:0, greenTo: 60, // zones de couleurs
yellowFrom:60, yellowTo: 80,
redFrom: 80, redTo: 100,
majorTicks: ['0', 10, 20, 0, 0, 50, 0, 0, 80, 90, 100], // graduations
minorTicks: 5, // graduations
max: 100, min: 0,
animation: {
duration: 100, // vitesse de l'aiguille
easing: 'linear', // comportement de l'aiguille
}
};
// init du graphisme
var GaugeVent = new google.visualization.Gauge(document.getElementById('chart_div_vent'));
// tracé du graphisme
GaugeVent.draw(dataGaugeVent, options);
updateGauge(); // exécute la fontion
setInterval(updateGauge, 100); // appelle les données de la fonction et définit la vitesse de rafraichissement
function updateGauge() { // fonction de mise raffraichissement des données réccupérée dans le fichier json https://www.w3schools.com/jquery/ajax_getjson.asp
$.getJSON('/mesures.json',
function(data) {
$.each(data,
function(nom, valeur) {
dataGaugeVent.setValue(0, 1, valeur); // premier nb pour le N° de la gauge si plusieurs, puis 0 pour modifier le champ label (sinon:1 pour le champ Value), puis la valeur extraite du json
GaugeVent.draw(dataGaugeVent, options); // tracé du graphisme
formatter.format(dataGaugeVent, 1); // applique le formattage à la seconde collonne du tableau (1) qui correspond à la valeur
});
});
}
}</pre>
<ul>
<li>Le fichier <em>data/css/style.css</em> pour la mise en page :</li>
</ul>
<pre class="brush: css">.container_inner {
background-color: #555555;
width: 450px;
margin-left: -165px;
padding-left: 60px;
padding-top: 160px;
padding-bottom: 160px;
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}</pre>
<ul>
<li>Le fichier <em>data/index.html</em>, où l'on charge les 3 <em>JavaScripts</em> et la feuille de style <em>css</em>. Puis on y appelle le graphisme de la gauge.</li>
</ul>
<pre class="brush: xml"><!DOCTYPE html>
<html>
<head>
<title>Eolienne</title>
<link rel="stylesheet" type="text/css" href="css/style.css">
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/loader.js"></script>
<script type="text/javascript" src="js/java_vent.js"></script>
</head>
<body>
<div class="container_inner">
<div id="chart_div_vent"></div>
</div>
</body>
</html></pre>
<ul>
<li>Le fichier <em>Anemometre_esp8266_WifiSVR_SPIFFS_Hall.ino</em>, qui contient le code C++ type « <em>Arduino</em> », pour mesurer la vitesse de rotation et envoyer les données au serveur Web.</li>
</ul>
<pre class="brush: cpp">#include <ESP8266WebServer.h>
#include <FS.h>
#include <WiFiUdp.h> //pour upload de pgm Arduino via wifi
#include <ArduinoOTA.h> //pour upload de pgm Arduino via wifi
/****************/
/* DÉCLARATIONS */
/****************/
ESP8266WebServer server ( 8080 ); // on instancie un serveur ecoutant sur le port 80
#define pinHallAnemo D2 // le capteur à effet Hall est connecté à la pin D2
#define ssid "xxxx" // WiFi SSID
#define password "****" // WiFi password
unsigned long rpmVent = 0;
unsigned long vitVentKMH = 0;
unsigned long dateDernierChangementVent = 0;
unsigned long dateDernierChangementKMH = 0;
float intervalleKMH = 0;
/*********/
/* SETUP */
/*********/
void setup() {
Serial.begin ( 115200 ); // init du mode débug
// Connexion au WiFi
WiFi.begin ( ssid, password );
// Attente de la connexion au réseau WiFi / Wait for connection
while ( WiFi.status() != WL_CONNECTED ) {
delay ( 500 );
Serial.print ( "." );
}
// Connexion WiFi établie
Serial.println ( "" );
Serial.print ( "Connected to " ); Serial.println ( ssid );
Serial.print ( "IP address: " ); Serial.println ( WiFi.localIP() );
// Montage de la zone mémoire SPIFFS
if (!SPIFFS.begin()) {
Serial.println("SPIFFS Mount failed");
}
else {
Serial.println("SPIFFS Mount succesfull");
}
delay(50);
// Pin capteurs
attachInterrupt(pinHallAnemo, rpm_vent, FALLING);
// Pages web du serveur
server.serveStatic("/js", SPIFFS, "/js"); // dossier js qui contient les fichiers JavaScripts
server.serveStatic("/css", SPIFFS, "/css"); // dossier css qui contient les fichiers css
server.serveStatic("/", SPIFFS, "/index.html"); // racine du serveur, pointe l'index.html
server.on("/mesures.json", sendMesures); // écrit le fichier json à l'appel de la fonction
server.begin(); // démarre le serveur
Serial.println ( "HTTP server started" );
ArduinoOTA.setHostname("AnemometreWiFi"); // on donne une petit nom a notre module, pour upload de pgm Arduino via wifi
// ArduinoOTA.setPassword((const char *)"1357");
ArduinoOTA.begin(); // initialisation de l'OTA, pour upload de pgm Arduino via wifi
}
/*************/
/* FONCTIONS */
/*************/
void rpm_vent() // appelée par l'interruption, Anémomètre vitesse du vent.
{
unsigned long dateCourante = millis();
intervalleKMH = (dateCourante - dateDernierChangementVent);
Serial.print ( "intervalle en s : " );
Serial.println (intervalleKMH/1000); // affiche l'intervalle de temps entre deux passages
if (intervalleKMH != 0) // attention si intervalle = 0, division par zero -> erreur
{
rpmVent = 60 / (intervalleKMH /1000);
}
vitVentKMH = ( rpmVent / 12 );
Serial.print ( "vitVentKMH : " );
Serial.println ( vitVentKMH ); // affiche les rpm
Serial.println ( "" );
dateDernierChangementVent = dateCourante;
}
void sendMesures() // appelée par le serveur web
{
String json = "{"rpm":"" + String(vitVentKMH) + ""}";
// prépare et formate la valeur pour le fichier json sous la forme : {"VitesseVent":"0.00"}
// {
// "VitesseVent":"25"
// }
server.send(200, "application/json", json); // envoie dans le valeur dans le fichier json qui tourne en mémoire
// Serial.println("Mesures envoyees");
}
void RemiseZeroVitVentKMH ()
{
unsigned long dateCouranteKMH = millis();
if (intervalleKMH == intervalleKMH) // Si ça ne tourne plus (valeur plus mise à jour)
{
float dureeKMH = (dateCouranteKMH - dateDernierChangementKMH);
if (dureeKMH > 10000) // Si ça ne tourne plus depuis 10 secondes
{
Serial.print ( "dureeKMH : " );
Serial.println ( dureeKMH ); // affiche les rpm
vitVentKMH = 0; // Remsise à zero !
dateDernierChangementKMH = dateCouranteKMH;
}
}
}
/*************/
/* PROGRAMME */
/*************/
void loop()
{
server.handleClient(); // à chaque iteration, on appelle handleClient pour que les requetes soient traitees
RemiseZeroVitVentKMH ();
delay(100); // la boucle fait tourner sendMesures(), via handleClient, régler delais si besoin de mettre à jour le JSON qu'à une fréquence voulue plutôt qu'instantanément
ArduinoOTA.handle(); // régler upload speed à 9600 : verifie si un upload de programme Arduino est envoyé sur l'ESP8266
}</pre>
<p>Projet inspiré de celui-ci :<br />
<a href="https://projetsdiy.fr/projet-diy-anemometre-girouette-objet-connecte-esp8266/">https://projetsdiy.fr/projet-diy-anemometre-girouette-objet-connecte-esp8266/</a><br />
<a href="https://projetsdiy.fr/esp8266-web-serveur-partie5-gauges-graphiques-google-charts/#top_ankor">https://projetsdiy.fr/esp8266-web-serveur-partie5-gauges-graphiques-google-charts/#top_ankor</a><br /><br /></p>
<h3><a href="http://burogu.makotoworkshop.org/index.php?post/2019/01/01/anemometre2">À Suivre…</a></h3>http://burogu.makotoworkshop.org/index.php?post/2018/11/12/anemometre#comment-formhttp://burogu.makotoworkshop.org/index.php?feed/atom/comments/660Horloge de salonurn:md5:3cebd3158cb017bd7750ee9e1b2eebf92018-06-04T20:57:00+02:002018-09-29T19:24:04+02:00makoto doushiteÉlectroniqueArduinoBricolageDIYHackingÉlectronique<p>Je ne sais plus si je l'ai évoqué ici, mais j'avais envie d'une horloge avec ces afficheurs bleu qui me plaisaient bien, repérés lors des essais sur le projet <em><a href="http://burogu.makotoworkshop.org/index.php?post/2018/01/16/wrrw04">WebRadioReveilWifi</a></em>, et j'avais donc procédé au tirage d'une seconde carte imprimée dans ce but.<br /></p>
<ul>
<li>Le circuit est donc identique, à ceci prés que la valeur des résistances associées aux afficheurs est ajustée à 100Ω, qu'un buzzer remplace l'ampli et son haut-parleur, et que cette fois est utilisé le capteur de mouvement <em>PIR</em>.</li>
<li>Voici la carte et ses périphériques, une fois le tout percés/soudés : Une plaquette translucide fumée, un <em>Arduino mini 5V</em>, les modules <em>RTC</em> et <em>PIR</em>, le buzzer, la plaquette des boutons de commande et sa nappe associée, et enfin un connecteur jack pour l'alimentation.<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03602.jpg" title="dsc03602.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03602_s.jpg" alt="dsc03602.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03601.jpg" title="dsc03601.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03601_s.jpg" alt="dsc03601.jpg" /></a><br /></p>
<ul>
<li>En fonctionnement, sur <em>dix dix</em>, évidemment ! (comprenne qui pourra <sup></sup>)</li>
</ul>
<p>Les leds des alarmes sont cette fois soudées à l'arrière, pour un usage très occasionnel.<br />
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03596.jpg" title="dsc03596.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03596_s.jpg" alt="dsc03596.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03614.jpg" title="dsc03614.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03614_s.jpg" alt="dsc03614.jpg" /></a><br /><br /></p> <h3><ins>Un boîtier</ins> ?<br /></h3>
<p>Même si le réflexe impression 3D commence à devenir naturel, je n'ai pas perdu mon habitude à conserver tout un tas de merdier pour ce genre d'occasion, et c'est ici un vieux boîtier externe de disque dur qui va servir… il était temps, j'ai failli me décider à le jeter… Où alors c'est justement pour ça que je me suis souvenu de lui… bref !<br /></p>
<ul>
<li>Le logo, j'en veux pas, une partie sera coupée par l'emplacement des afficheurs, mais en plus il est en creux et la surface du boîtier texturée… hum que faire ?<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03594.jpg" title="dsc03594.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03594_s.jpg" alt="dsc03594.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03595.jpg" title="dsc03595.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03595_s.jpg" alt="dsc03595.jpg" /></a><br /></p>
<ul>
<li>Et bah, tout poncer !!</li>
</ul>
<p>Bon j'y suis allé un peu trop fort, et j'ai eu plus de travail que prévu pour rattraper le coup, avec un petit polish au dentifrice.<br />
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03605.jpg" title="dsc03605.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03605_s.jpg" alt="dsc03605.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03606.jpg" title="dsc03606.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03606_s.jpg" alt="dsc03606.jpg" /></a><br /></p>
<p>Le plus difficile lorsqu'on intègre une carte dans un boîtier, c'est de disposer le tout le plus précisément possible alors qu'on-y voit rien, le boîtier n'est pas transparent, ça aide pô…<br /></p>
<ul>
<li>Alors on y passe du temps, et on fini par y arriver, ici avec les vis de support dans la face arrière du boîtier afin de fixer la carte, pouvoir régler sa hauteur et donc l'affleurement des afficheurs.<br /></li>
</ul>
<p>Puis les trous des Leds d'alarmes et celui pour sortir le son du buzzer.<br />
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03609.jpg" title="dsc03609.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03609_s.jpg" alt="dsc03609.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03613.jpg" title="dsc03613.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03613_s.jpg" alt="dsc03613.jpg" /></a><br /></p>
<ul>
<li>Technique du gabarit de perçage pour disposer les trous le plus correctement possible.<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03612.jpg" title="dsc03612.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03612_s.jpg" alt="dsc03612.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03616.jpg" title="dsc03616.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03616_s.jpg" alt="dsc03616.jpg" /></a><br /></p>
<ul>
<li>Des boutons imprimés 3D verts sont en places, avec les vis de support pour accueillir la plaquette de commande. Idem ici, on peut régler la hauteur de la plaquette pour ajuster la course des boutons.<br /></li>
</ul>
<p>La plaquette fumée est collée à la cyano, tandis que le connecteur jack est collé sur le côté, à l'endroit originel du jack de ce boîtier à disque dur.<br />
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03615.jpg" title="dsc03615.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03615_s.jpg" alt="dsc03615.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03617.jpg" title="dsc03617.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03617_s.jpg" alt="dsc03617.jpg" /></a><br /></p>
<ul>
<li>Un trou pour le capteur <em>PIR</em> et un autre pour la photorésistance, qui sont alors collés à l'aide de colle chaude :<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03618.jpg" title="dsc03618.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03618_t.jpg" alt="dsc03618.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03619.jpg" title="dsc03619.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03619_t.jpg" alt="dsc03619.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03678.jpg" title="dsc03678.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03678_t.jpg" alt="dsc03678.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03677.jpg" title="dsc03677.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03677_t.jpg" alt="dsc03677.jpg" /></a><br /></p>
<ul>
<li>Le buzzer est lui aussi collé en face de son trou sur la face arrière.<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03675.jpg" title="dsc03675.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03675_s.jpg" alt="dsc03675.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03674.jpg" title="dsc03674.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03674_s.jpg" alt="dsc03674.jpg" /></a><br /></p>
<ul>
<li>Yapuka refermer !<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03671.jpg" title="dsc03671.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03671_s.jpg" alt="dsc03671.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03657.jpg" title="dsc03657.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03657_s.jpg" alt="dsc03657.jpg" /></a><br /><br /></p>
<h3>Biennnn !<br /></h3>
<p>Bon alors pour résumer, l'horloge fonctionne tout à fait pareil que le <em>WebRadioReveilWifi</em> pour ce qui est de la mise à l'heure et du réglage des alarmes.<br /></p>
<blockquote><p>Les sonneries sont identiques aussi, quelques morceaux la chiptune aléatoires.<br />
Lorsque l'ambiance lumineuse de la pièce s'assombrit, la luminosité des afficheurs baisse, grâce à la photorésistance.<br />
Et enfin les afficheurs s'éteignent tout seul au bout de 3h environ, ce n'est que lorsqu'un mouvement est détecté par le capteur <em>PIR</em> que l'affichage se remet en marche !!<br /></p></blockquote>
<p>Le code est cependant un poil différent pour prendre en charge ce capteur. Dispo en annexe du billet.<br />
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03658.jpg" title="dsc03658.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03658_t.jpg" alt="dsc03658.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03662.jpg" title="dsc03662.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03662_t.jpg" alt="dsc03662.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03663.jpg" title="dsc03663.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03663_t.jpg" alt="dsc03663.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03664.jpg" title="dsc03664.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03664_t.jpg" alt="dsc03664.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03666.jpg" title="dsc03666.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03666_t.jpg" alt="dsc03666.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03667.jpg" title="dsc03667.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03667_t.jpg" alt="dsc03667.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03668.jpg" title="dsc03668.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03668_t.jpg" alt="dsc03668.jpg" /></a></p>
<ul>
<li>L'appareil consomme assez peu d'énergie, entre 25 mA et 146 mA, et quasi rien lorsque l'affichage est éteint :<br /></li>
</ul>
<p>- Horloge : luminosité à fond (<em>PWM 128</em>) = 0,146A<br />
- Horloge : luminosité au minimun (<em>PWM 5</em>) = 0,025 A<br /><br /></p>http://burogu.makotoworkshop.org/index.php?post/2018/03/04/horloge#comment-formhttp://burogu.makotoworkshop.org/index.php?feed/atom/comments/645WebRadioRéveilWifi -4-urn:md5:f39e33c500726451842ad66c3fbf572b2018-02-06T15:42:00+01:002019-11-12T20:58:12+01:00makoto doushiteÉlectroniqueArduinoDIYVidéosWebRadioRéveilWifiÉlectronique<p><a href="http://burogu.makotoworkshop.org/index.php?post/2014/11/30/wrrw03">Suite de l'étude précédente</a> :<br /></p>
<blockquote><p>Je vais (enfin !!) reprendre la conception de mon WebRadioReveilWifi, après que tant de temps ait passé…<br />
Il est désormais fonctionnel et me réveille correctement tous les matins, et c'est dans une suite de plusieurs billets que je vais détailler la réalisation étape par étape.<br /></p></blockquote>
<p><br /></p>
<h3><ins>L'horloge</ins> :</h3>
<ul>
<li>Pour rappel, j'avais câblé un prototype de <a href="http://burogu.makotoworkshop.org/index.php?post/2014/07/26/wrrw02">l'horloge sur une carte à trou</a>, elle même branchée sur un <em>Arduino</em>.<br /></li>
</ul>
<p>Cette maquette m'a pas mal servi à apprendre <em>Arduino</em> et voir où les expérimentations me menaient, afin de bien dimensionner la suite.<br />
C'est ainsi que j'ai pu router un circuit imprimé, puis graver percer et souder la plaque…<br />
Cependant même si on croit avoir toujours tout prévu, j'ai tout de même dû modifier certaines choses sur mon circuit, une erreur fâcheuse et des modifications de dernières minutes.<br />
C'est donc le circuit final réalisé sur <em>Kicad</em> que je vais livrer ici (en annexe du billet), il ne correspondra pas aux photos, sur lesquelles apparaissent donc les modifications et bricolage de rattrapages.<br /></p>
<ul>
<li>Le Schéma structurel de la carte principale :<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/horloge/horlogeStructurel.png" title="horlogeStructurel.png"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.horlogeStructurel_m.png" alt="horlogeStructurel.png" style="display:table; margin:0 auto;" /></a><br /></p>
<ul>
<li>Le circuit de la carte principale : <br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/horloge/horloge.png" title="horloge.png"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.horloge_m.png" alt="horloge.png" style="display:table; margin:0 auto;" /></a><br /></p> <p><a href="http://burogu.makotoworkshop.org/public/electronique/horloge/horlogeSerigraphie.png" title="horlogeSerigraphie.png"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.horlogeSerigraphie_t.png" alt="horlogeSerigraphie.png" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/horlogeCuivreDessous.png" title="horlogeCuivreDessous.png"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.horlogeCuivreDessous_t.png" alt="horlogeCuivreDessous.png" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/horlogeCuivreDessus.png" title="horlogeCuivreDessus.png"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.horlogeCuivreDessus_t.png" alt="horlogeCuivreDessus.png" /></a><br /></p>
<ul>
<li>Liste des composants:<br /></li>
</ul>
<pre>
Nom Type et valeur
Shield1 Arduino Pro Mini 5V
P1, P6 Pin header x3
P2 Pin header x6
P5 Pin header x2
P3 Pin header HE10-10
P4 Bornier 2 vis
D1, D2 Led Verte
D3, D4 Led Rouge
D5 Photodiode LSL100 ou Photorésistance 5516
R6, R7 Résistances 1kΩ
R11 Résistances 2,2kΩ
R12 à R18 Résistances 39Ω
R19 Résistances 150Ω
R20 à R26 Résistances 39Ω
R27 Résistances 150Ω
R28 à R34 Résistances 39Ω
R35 Résistances 150Ω
R36 à R42 Résistances 39Ω
R43 Résistances 150Ω
Afficheur1, 2, 3, 4 Afficheur 7 segments SA10-21GWA-Kingbright 25,4 mm Vert
Q1, Q2, Q3, Q4, Q5 BC547
C7, C8, C9,C10 Condensateur 100nF
U1, U2, U3, U4 74HC595
</pre>
<p><br /></p>
<ul>
<li>Le Schéma structurel de la carte des boutons :<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/horloge/boutons_horlogeStructurel.png" title="boutons_horlogeStructurel.png"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.boutons_horlogeStructurel_m.png" alt="boutons_horlogeStructurel.png" style="display:table; margin:0 auto;" /></a><br /></p>
<ul>
<li>Le circuit de la carte des boutons : <br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/horloge/boutons_horloge.png" title="boutons_horloge.png"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.boutons_horloge_m.png" alt="boutons_horloge.png" style="display:table; margin:0 auto;" /></a><br />
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/boutons_horlogeSerigraphie.png" title="boutons_horlogeSerigraphie.png"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.boutons_horlogeSerigraphie_s.png" alt="boutons_horlogeSerigraphie.png" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/boutons_horlogeCuivreDessous.png" title="boutons_horlogeCuivreDessous.png"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.boutons_horlogeCuivreDessous_s.png" alt="boutons_horlogeCuivreDessous.png" /></a><br /></p>
<ul>
<li>Liste des composants:<br /></li>
</ul>
<pre>
Nom Type et valeur
C1, C2, C3, C4, C5, C6 Condensateur 100nF
SW1, SW2, SW3, SW4, SW5, SW6 Petit bouton poussoir
R1, R2, R3, R4, R5, R6 Résistances 10kΩ
P1 Pin header HE10-10
</pre>
<p><br /></p>
<ul>
<li>Une fois les plaques gravées, il restait à percer tous les trous, à 0,8 mm et 1 mm de diamètre avec ma <a href="http://burogu.makotoworkshop.org/index.php?post/2014/08/16/objets3d01">perceuse à colonne imprimée3D</a> .<br /></li>
</ul>
<p>Une petit video !</p>
<iframe width="640" height="360" sandbox="allow-same-origin allow-scripts" src="https://peertube.makotoworkshop.org/videos/embed/506a5433-eec8-4b41-99a5-cbb48bee3438?warningTitle=0" frameborder="0" allowfullscreen></iframe>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03253.jpg" title="dsc03253.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03253_s.jpg" alt="dsc03253.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03257.jpg" title="dsc03257.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03257_s.jpg" alt="dsc03257.jpg" /></a><br /></p>
<ul>
<li>Voici les cartes et les composants parés pour la soudure.<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03266.jpg" title="dsc03266.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03266_s.jpg" alt="dsc03266.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03271.jpg" title="dsc03271.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03271_s.jpg" alt="dsc03271.jpg" /></a><br /></p>
<ul>
<li>Mais avant, car réalisé en simple face, je n'ai pu faire autrement que de passer quelques liaisons sur l'autre face, et donc ici de devoir souder quelques fils en lieu et place.<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03268.jpg" title="dsc03268.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03268_s.jpg" alt="dsc03268.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03273.jpg" title="dsc03273.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03273_s.jpg" alt="dsc03273.jpg" /></a><br /></p>
<ul>
<li>Pour plier les pattes des résistances, je me suis aidé d'un <a href="http://burogu.makotoworkshop.org/index.php?post/2017/04/11/objets3d07">plioir imprimé3D</a>… Étant donné le grand nombre de résistances, c'était pas du luxe !<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03275.jpg" title="dsc03275.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03275_s.jpg" alt="dsc03275.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03278.jpg" title="dsc03278.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03278_s.jpg" alt="dsc03278.jpg" /></a></p>
<ul>
<li>Je pense que la suite se passe de trop de commentaire, avec la soudure progressive les composants, des plus maigres aux plus épais.<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03276.jpg" title="dsc03276.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03276_t.jpg" alt="dsc03276.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03277.jpg" title="dsc03277.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03277_t.jpg" alt="dsc03277.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03279.jpg" title="dsc03279.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03279_t.jpg" alt="dsc03279.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03280.jpg" title="dsc03280.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03280_t.jpg" alt="dsc03280.jpg" /></a><br /></p>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc02385b.jpg" title="dsc02385b.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc02385b_s.jpg" alt="dsc02385b.jpg" style="float:right; margin: 0 0 1em 1em;" /></a></p>
<ul>
<li>Le module RTC (Real Time Clock) à base de DS3231 peut se trouver tout fait, mais ici je disposait seulement du composant, voulant rester compatible avec le concept du module enfichable, j'ai tout simplement réalisé une petite carte qui fait le même job, avec sa pile de sauvegarde !<br /><br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03282.jpg" title="dsc03282.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03282_t.jpg" alt="dsc03282.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03283.jpg" title="dsc03283.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03283_t.jpg" alt="dsc03283.jpg" /></a><br /><br />
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/ChronodotStructurel.png" title="ChronodotStructurel.png"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.ChronodotStructurel_t.png" alt="ChronodotStructurel.png" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/Chronodot.png" title="Chronodot.png"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.Chronodot_t.png" alt="Chronodot.png" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/ChronodotSerigraphie.png" title="ChronodotSerigraphie.png"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.ChronodotSerigraphie_t.png" alt="ChronodotSerigraphie.png" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/ChronodotCuivreDessus.png" title="ChronodotCuivreDessus.png"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.ChronodotCuivreDessus_t.png" alt="ChronodotCuivreDessus.png" /></a><br /></p>
<ul>
<li>Liste des composants:<br /></li>
</ul>
<pre>
Nom Type et valeur
C6 Condensateur 100nF
R9, R10 Résistances 10kΩ
U5 DS3231N
BT1 Support de pile Bouton 3V (CR2032)
P1 Pin header x6
</pre>
<ul>
<li>Voilà donc tout est prêt, avec la carte principale qui accueillera (en haut) les 4 afficheurs 7 segments, les quatre 74HC595, (à droite) l<em>'Arduino</em>, (à gauche) la plaquette de boutons reliée au centre de la carte principale par une nappe de connecteur, (en bas) le capteur de mouvement (PIR) et le module RTC.</li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/horloge/dsc03285.jpg" title="dsc03285.jpg"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.dsc03285_m.jpg" alt="dsc03285.jpg" /></a><br /><br /></p>
<h3><ins>L'ampli audio</ins> :<br /></h3>
<ul>
<li>Dans <a href="http://burogu.makotoworkshop.org/index.php?post/2014/11/30/wrrw03">l'épisode précédent</a>, j'avais donc câblé un petit ampli à base de LM386 sur une plaquette labo afin d'en valider le fonctionnement, puis j'en ai dessiné un circuit sur <em>Kicad</em> qui a été réalisé en simple face et que l'on va voir ci-après.<br /></li>
</ul>
<p>Cependant, comme pour l'horloge, j'ai un moment perdu de vue mes desiderata, et en rajoutant une source audio, je me suis plus tard rendu compte que j'avais oublié une partie du circuit pour le mélange des signaux entrants.<br />
Et ce n'est pas tout… En intégrant l'ampli dans le boîtier du WebRadioRéveil que nous verrons dans un autre billet, j'ai vite compris que j'allais devoir retirer un certains nombre de connecteurs.
Le circuit final réalisé sur <em>Kicad</em> (en annexe du billet), contient donc toutes les modifications et ne correspondra donc pas tout à fait aux photos.<br /></p>
<ul>
<li>Le schéma structurel de l'ampli :</li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/horloge/AmpliAudioStructurel.png" title="AmpliAudioStructurel.png"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.AmpliAudioStructurel_m.png" alt="AmpliAudioStructurel.png" style="display:table; margin:0 auto;" /></a><br /></p>
<ul>
<li>Le circuit de l'ampli :</li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/electronique/horloge/AmpliAudio.png" title="AmpliAudio.png"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.AmpliAudio_m.png" alt="AmpliAudio.png" style="display:table; margin:0 auto;" /></a><br />
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/AmpliAudioSerigraphie.png" title="AmpliAudioSerigraphie.png"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.AmpliAudioSerigraphie_s.png" alt="AmpliAudioSerigraphie.png" /></a>
<a href="http://burogu.makotoworkshop.org/public/electronique/horloge/AmpliAudioCuivreDessous.png" title="AmpliAudioCuivreDessous.png"><img src="http://burogu.makotoworkshop.org/public/electronique/horloge/.AmpliAudioCuivreDessous_s.png" alt="AmpliAudioCuivreDessous.png" /></a><br /></p>
<ul>
<li>Liste des composants:<br /></li>
</ul>
<pre>
Nom Type et valeur
C13, C14, C15, C16 Condensateur électrochimique polarisé 47µF 16V
C2, C5, C8, C11 Condensateur électrochimique polarisé 10µF 16V
C3, C9 Condensateur électrochimique polarisé 470µF 16V
C4, C10 Condensateur 33nF
C6, C12 Condensateur 100nF
C1, C7 Condensateur 1µF
R4, R5, R6, R7 Résistances 2,2kΩ
R8, R9 Résistance 100Ω
R1, R3 Résistances 1,2kΩ
R2 Résistances 1,5kΩ
RV1, RV2 Potentiomètre Double 10kΩ
U1, U2 LM386N-3
D1 Led Jaune 3 mm
SP1, SP2 Petit Haut Parleur
</pre>
<ul>
<li>Une petit video !</li>
</ul>
<iframe width="640" height="360" sandbox="allow-same-origin allow-scripts" src="https://peertube.makotoworkshop.org/videos/embed/40212a36-8086-4ce2-93e3-7ecbefbbda3a?warningTitle=0" frameborder="0" allowfullscreen></iframe>
<p><a href="http://burogu.makotoworkshop.org/public/ordi/WebRadioReveilWifi/dsc03262.jpg" title="dsc03262.jpg"><img src="http://burogu.makotoworkshop.org/public/ordi/WebRadioReveilWifi/.dsc03262_s.jpg" alt="dsc03262.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/ordi/WebRadioReveilWifi/dsc03264.jpg" title="dsc03264.jpg"><img src="http://burogu.makotoworkshop.org/public/ordi/WebRadioReveilWifi/.dsc03264_s.jpg" alt="dsc03264.jpg" /></a><br /></p>
<ul>
<li>Tous les composants parés pour la soudure !</li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/ordi/WebRadioReveilWifi/dsc03287.jpg" title="dsc03287.jpg"><img src="http://burogu.makotoworkshop.org/public/ordi/WebRadioReveilWifi/.dsc03287_m.jpg" alt="dsc03287.jpg" /></a><br />
On verra donc plus tard que ce sont les deux jacks audio, le jack alim et le bornier que j'ai dû retirer. Et de rajouter une petite carte intégrant le mélangeur audio.<br /><br /></p>
<h3><ins>Le code</ins> :<br /></h3>
<ul>
<li>Une fois le hardware terminé, il reste à revoir et améliorer <a href="http://burogu.makotoworkshop.org/index.php?post/2014/07/26/wrrw02">le code commencé</a> la dernière fois.</li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/ordi/WebRadioReveilWifi/dsc03289.jpg" title="dsc03289.jpg"><img src="http://burogu.makotoworkshop.org/public/ordi/WebRadioReveilWifi/.dsc03289_m.jpg" alt="dsc03289.jpg" /></a><br />
Tout le système assemblé proprement sur table pour coder sereinement.<br />
À gauche de <em>Raspberry Pi</em> et sa carte de boutons pour piloter manuellement la radio, au dessus l'ampli audio relié au <em>Raspberry Pi</em> , et donc à droite l'horloge avec son <em>Arduino</em>, son module RTC et sa carte de boutons.<br /></p>
<ul>
<li>Le code et les deux librairies nécessaire pour Arduino sont disponible en annexe du billet.<br /></li>
</ul>
<p><a href="https://www.arduino.cc/en/Main/OldSoftwareReleases">Ce code est à utiliser avec Arduino 1.5.5</a></p>
<pre class="brush: cpp">/****** Domaine publique, youpi ! ******/
/****** Ce code est à utiliser avec Arduino 1.5.5 *****/
#include <Wire.h> // Communication avec le RTC
#include <Tone.h> // Sonnerie ChipTune, voir Librairie
#include "Chronodot.h" // Fonctions du Chronodot, voir Librairie modifiée
/****************/
/* Déclarations */
/****************/
#define CHRONODOT_ADDRESS 0x68
/****** Signaux ******/
#define datapin 10 // pin 10 pour les données vers les registres à décallages 74HC595
#define clockpin 11 // pin 11 pour l'horloge qui coordonne les registres à décallages
#define latchpin 8 // pin 8 pour le déclencheur des registres à décallages
/****** Boutons poussoir ******/
#define BoutonMinutes 12 // pin 12 pour le bouton poussoir d'incrément des minutes
#define BoutonHeures 13 // pin 13 pour le bouton poussoir d'incrément des heures
#define BoutonAlarme1 6 // pin 6 pour le bouton poussoir Alarme1
#define BoutonAlarme2 2 // pin 2 pour le bouton poussoir Alarme2, alias « interruption 0 »
#define BoutonHorloge 7 // pin 7 pour le bouton poussoir Horloge
#define BoutonSupp 1 // pin TX1 pour le bouton supplémentaire
#define relais A2 // pin analogique 2 pour le pilotage du relais ON/OFF AmpliAudio
#define Radio A3 // pin analogique 3 pour le déclenchement de la radio (relié par la carte d'interface 5V -> 3V) à l'un des GPIO du Rpi
/****** LED ******/
#define LedAlarm1 4 // pin 4 pour la led de l'alarme1
#define LedAlarm2 3 // pin 3 pour la led de l'alarme2
/****** Alimentation des 7 segments en PWM ******/
#define ledPin 9 // pin 9 pour le signal PWM de cadencement des afficheurs et leds
#define photodiodepin A0 // pin A0 pour la photodiode
/****** Variables d'état ******/
int EtatBoutonMinutes = 1; // pour stocker l'état du bouton aprés sa lecture
int EtatBoutonHeures = 1; // idem
int EtatBoutonAlarme1 = 1; // idem
int EtatBoutonAlarme2 = 1; // idem
int EtatBoutonHorloge = 1; // idem
int EtatBoutonSupp = 1; // idem
unsigned int ValeurPhotoDiode = 0; // pour stocker l'état de la photodiode aprés sa lecture
volatile int change = 0; // pour mémoriser l'état de l'interruption 0
/****** Variables temporelles ******/
unsigned int heuresHorloge; // pour stocker les heures
unsigned int heuresHorlogeINC; // pour stocker l'incrément des heures
unsigned int minutesHorloge; // pour stocker les minutes
unsigned int minutesHorlogeINC;// pour stocker l'incrément des minutes
unsigned int secondes; // pour stocker les secondes
unsigned int annee; // pour stocker l'annee
unsigned int mois; // pour stocker le mois
unsigned int jour; // pour stocker le jour
unsigned int heuresAlarme; // pour stocker les heures
unsigned int heuresAlarmeINC; // pour stocker l'incrément des heures
unsigned int minutesAlarme; // pour stocker les minutes
unsigned int minutesAlarmeINC;// pour stocker l'incrément des minutes
/****** Variables d'affichage ******/
int dizH = 0; // pour stocker les dizaine des heures
int unitH = 0; // pour stocker les unités des heures
int dizM = 0; // pour stocker les dizaine des minutes
int unitM = 0; // pour stocker les unités des minutes
byte AfficheurUN; // données binaire pour l'afficheur UN, situé le plus à droite
byte AfficheurDEUX; // données binaire pour l'afficheur DEUX
byte AfficheurTROIS; // données binaire pour l'afficheur TROIS
byte AfficheurQUATRE; // données binaire pour l'afficheur QUATRE, situé le plus à gauche
byte dataArray[10]; // Tableau de données
/****** Référenciel librairies ******/
Chronodot HORLOGE; // HORLOGE, nom choisi arbitrairement, référence à la librairie Chronodot
ChronodotAlarm1 RADIO;
ChronodotAlarm2 REVEIL;
/**** Variable de construction des sonneries *****/
Tone tone1;
#define OCTAVE_OFFSET 0
#define isdigit(n) (n >= '0' && n <= '9')
int notes[] = { 0,
NOTE_C4, NOTE_CS4, NOTE_D4, NOTE_DS4, NOTE_E4, NOTE_F4, NOTE_FS4, NOTE_G4, NOTE_GS4, NOTE_A4, NOTE_AS4, NOTE_B4,
NOTE_C5, NOTE_CS5, NOTE_D5, NOTE_DS5, NOTE_E5, NOTE_F5, NOTE_FS5, NOTE_G5, NOTE_GS5, NOTE_A5, NOTE_AS5, NOTE_B5,
NOTE_C6, NOTE_CS6, NOTE_D6, NOTE_DS6, NOTE_E6, NOTE_F6, NOTE_FS6, NOTE_G6, NOTE_GS6, NOTE_A6, NOTE_AS6, NOTE_B6,
NOTE_C7, NOTE_CS7, NOTE_D7, NOTE_DS7, NOTE_E7, NOTE_F7, NOTE_FS7, NOTE_G7, NOTE_GS7, NOTE_A7, NOTE_AS7, NOTE_B7
};
char *songA = "A-Team:d=8,o=5,b=125:4d#6,a#,2d#6,16p,g#,4a#,4d#.,p,16g,16a#,d#6,a#,f6,2d#6,16p,c#.6,16c6,16a#,g#.,2a#";
char *songB = "Hallowee:d=4,o=5,b=140:32p,8d6,8g,8g,8d6,8g,8g,8d6,8g,8d#6,8g,8d6,8g,8g,8d6,8g,8g,8d6,8g,8d#6,8g,8c#6,8f#,8f#,8c#6,8f#,8f#,8c#6,8f#,8d6,8f#,8c#6,8f#,8f#,8c#6,8f#,8f#,8c#6,8f#,8d6,8f#";
char *songC = "Muppets:d=4,o=5,b=250:c6,c6,a,b,8a,b,g,p,c6,c6,a,8b,8a,8p,g.,p,e,e,g,f,8e,f,8c6,8c,8d,e,8e,8e,8p,8e,g,2p,c6,c6,a,b,8a,b,g,p,c6,c6,a,8b,a,g.,p,e,e,g,f,8e,f,8c6,8c,8d,e,8e,d,8d,c";
char *songD = "TakeOnMe:d=4,o=4,b=160:8f#5,8f#5,8f#5,8d5,8p,8b,8p,8e5,8p,8e5,8p,8e5,8g#5,8g#5,8a5,8b5,8a5,8a5,8a5,8e5,8p,8d5,8p,8f#5,8p,8f#5,8p,8f#5,8e5,8e5,8f#5,8e5,8f#5,8f#5,8f#5,8d5,8p,8b,8p,8e5,8p,8e5,8p,8e5,8g#5,8g#5,8a5,8b5,8a5,8a5,8a5,8e5,8p,8d5,8p,8f#5,8p,8f#5,8p,8f#5,8e5,8e5";
char *songE = "Gadget:d=16,o=5,b=50:32d#,32f,32f#,32g#,a#,f#,a,f,g#,f#,32d#,32f,32f#,32g#,a#,d#6,4d6,32d#,32f,32f#,32g#,a#,f#,a,f,g#,f#,8d#";
char *songF = "MahnaMahna:d=16,o=6,b=125:c#,c.,b5,8a#.5,8f.,4g#,a#,g.,4d#,8p,c#,c.,b5,8a#.5,8f.,g#.,8a#.,4g,8p,c#,c.,b5,8a#.5,8f.,4g#,f,g.,8d#.,f,g.,8d#.,f,8g,8d#.,f,8g,d#,8c,a#5,8d#.,8d#.,4d#,8d#.";
int song = 1; // variable pour changer de sonnerie aprés chaque utilisation de la sonnerie
/*******************/
/* Initialisations */
/*******************/
void setup () // Fonction d'initialisation obligatoire
{
// Serial.begin(9600); // uncomment to debug
// Serial.println("Initializing Chronodot."); // uncomment to debug
dataArray[0] = B00000011; // Case du tableau qui contient la valeur binaire pour afficher zero sur un afficheur 7 segments
dataArray[1] = B10011111; // Case du tableau qui contient la valeur binaire pour afficher un sur un afficheur 7 segments
dataArray[2] = B00100101; // Case du tableau qui contient la valeur binaire pour afficher deux sur un afficheur 7 segments
dataArray[3] = B00001101; // Case du tableau qui contient la valeur binaire pour afficher trois sur un afficheur 7 segments
dataArray[4] = B10011001; // Case du tableau qui contient la valeur binaire pour afficher quatre sur un afficheur 7 segments
dataArray[5] = B01001001; // Case du tableau qui contient la valeur binaire pour afficher cinq sur un afficheur 7 segments
dataArray[6] = B01000001; // Case du tableau qui contient la valeur binaire pour afficher six sur un afficheur 7 segments
dataArray[7] = B00011111; // Case du tableau qui contient la valeur binaire pour afficher sept sur un afficheur 7 segments
dataArray[8] = B00000001; // Case du tableau qui contient la valeur binaire pour afficher huit sur un afficheur 7 segments
dataArray[9] = B00001001; // Case du tableau qui contient la valeur binaire pour afficher neuf sur un afficheur 7 segments
pinMode(clockpin, OUTPUT); // pin correspondant à "clockpin" initialisée en sortie
pinMode(datapin, OUTPUT); // pin correspondant à "datakpin" initialisée en sortie
pinMode(latchpin, OUTPUT); // pin correspondant à "latchpin" initialisée en sortie
pinMode(BoutonMinutes, INPUT); // pin correspondant à "BoutonMinutes" initialisée en entrée
pinMode(BoutonHeures, INPUT); // pin correspondant à "BoutonHeures" initialisée en entrée
pinMode(BoutonAlarme1, INPUT); // pin correspondant à "BoutonHeures" initialisée en entrée
pinMode(BoutonAlarme2, INPUT); // pin correspondant à "BoutonHeures" initialisée en entrée
pinMode(BoutonHorloge, INPUT); // pin correspondant à "BoutonHeures" initialisée en entrée
pinMode(BoutonSupp, INPUT); // pin correspondant à "BoutonSupp" initialisée en entrée
pinMode(LedAlarm1, OUTPUT); // pin correspondant à "LedAlarm1" initialisée en sortie
pinMode(LedAlarm2, OUTPUT); // pin correspondant à "LedAlarm2" initialisée en sortie
pinMode(relais, OUTPUT); // pin correspondant à "relais" initialisée en sortie
pinMode(Radio, OUTPUT); // pin correspondant à "Radio" initialisée en sortie
tone1.begin(A1); // pin A1 pour le jack sonnerie
Wire.begin(); // initialisation du chronodot, référence à la librairie wire
HORLOGE.begin(); // initialisation du chronodot, référence à la librairie Chronodot
//************ MISE à L'heure manuelle du module RTC DS3231 ************
// HORLOGE.adjust(DateTime(2014,12,25,10,30,12)); // années, mois, jour, heures, minutes, secondes
// RADIO.adjust(AlarmTime1(6,30,0));
// REVEIL.adjust(AlarmTime2(7,30));
attachInterrupt(0, stop2, FALLING); // attache l'interruption externe n°0 (pin2 soit bouton Alarm2) à la fonction stop2
digitalWrite(Radio, HIGH); // Coupe la radio au démarrage
RADIO.Alarm1SetON(); // au démarrage, l'alarme Radio est forcée ON (en cas de coupure de courant)
digitalWrite (LedAlarm1, HIGH);
REVEIL.Alarm2SetON(); // au démarrage, l'alarme Réveil est forcée ON (en cas de coupure de courant)
digitalWrite (LedAlarm2, HIGH);
}
/*************/
/* Programme */
/*************/
void loop () // boucle du programme !
{
horloge (); // appelle la fct "horloge", récupération des données temporelles
AfficheHorloge (); // appelle la fct "affiche", transfert des données temporelles sur les afficheurs 7 segments
AjusteLuminosite(); // appelle la fct "AjusteLuminosite", plus il fait sombre, plus la lumière des afficheurs baisse
SurveilleBouton_Horloge_Heures_Minutes (); // Pour permettre de mettre l'horloge à l'heure
// SurveilleBouton_Supp ();
RadioON(); // envoie d'ordre au rpi
FaireSonnerSonnerie();
EtatBoutonAlarme1 = digitalRead(BoutonAlarme1); // Lit l'état du bouton (appuyé ou relaché) et stocke la valeur dans la variable "EtatBoutonAlarme1"
EtatBoutonAlarme2 = digitalRead(BoutonAlarme2); // Lit l'état du bouton (appuyé ou relaché) et stocke la valeur dans la variable "EtatBoutonAlarme2"
if (EtatBoutonAlarme1 == LOW) // sinon, si bouton alarme 1 appuyé
{
for (int i=0; i <= 800; i++) // faire durant 3 sec
{
alarme1();
AfficheAlarme(); // affiche l'alarme
SurveilleBouton_Alarme1_Heures_Minutes (); // régler l'alarme
SurveilleBouton_Alarme1_Horloge ();
}
}
if (EtatBoutonAlarme2 == LOW) // sinon, si bouton alarme 2 appuyé
{
// Stopper();
for (int j=0; j <= 800; j++) // faire durant 3 sec
{
alarme2();
AfficheAlarme(); // affiche l'alarme
SurveilleBouton_Alarme2_Heures_Minutes (); // régler l'alarme
SurveilleBouton_Alarme2_Horloge ();
}
}
if(change == 1) { // Si change = 1, stopper la sonnerie
change = 0;
// Serial.print(change); //
RADIO.Alarm1Stop();
REVEIL.Alarm2Stop();
song = song + 1; // pour une sonnerie différente la prochaine fois
if(song == 7) {
song = 1;
}
// Serial.print(", song:"); //
// Serial.print(song); //
// Serial.println();
}
}
/****************************************/
/***** Les Fonctions du programme *******/
/****************************************/
/***** Fonction d'horloge *******/
void horloge ()
{
DateTime now = HORLOGE.now(); // lecture de l'heure en cours dans la puce DS3231, référence à la librairie Chronodot
heuresHorloge = now.hour(), DEC; // stocke l'heure en décimale dans la variable "heures" grace à la fct "hour" de la lib chronodot
minutesHorloge = now.minute(), DEC; // stocke les minutes en décimale dans la variable "minutes" grace à la fct "minute" de la lib chronodot
secondes = now.second(), DEC; // stocke les secondes en décimale dans la variable "secondes" grace à la fct "second" de la lib chronodot
annee = now.year(), DEC; // stocke l'année en décimale dans la variable "annee" grace à la fct "year" de la lib chronodot
mois = now.month(), DEC; // stocke le mois en décimale dans la variable "mois" grace à la fct "month" de la lib chronodot
jour = now.day(), DEC; // stocke le jour en décimale dans la variable "jour" grace à la fct "day" de la lib chronodot
// Serial.print(annee); //
// Serial.print(':'); //
// Serial.print(mois); //
// Serial.print(':'); //
// Serial.print(jour); //
// Serial.print(':'); //
// Serial.print(heures); //décommenter pour débug
// Serial.print(':'); //
// Serial.print(minutes); //
// Serial.println(); //
}
/***** Fonction d'alarme 1 *******/
void alarme1 ()
{
AlarmTime1 now = RADIO.now(); // lecture de l'heure en cours dans la puce DS3231, référence à la librairie Chronodot
heuresAlarme = now.hourA1(), DEC; // stocke l'heure en décimale dans la variable "heures" grace à la fct "hour" de la lib chronodot
minutesAlarme = now.minuteA1(), DEC; // stocke les minutes en décimale dans la variable "minutes" grace à la fct "minute" de la lib chronodot
// Serial.print(heuresAlarme); //décommenter pour débug
// Serial.print(':'); //
// Serial.print(minutesAlarme); //
// Serial.println(); //
}
/***** Fonction d'alarme 2 *******/
void alarme2 ()
{
AlarmTime2 now = REVEIL.now(); // lecture de l'heure en cours dans la puce DS3231, référence à la librairie Chronodot
heuresAlarme = now.hourA2(), DEC; // stocke l'heure en décimale dans la variable "heures" grace à la fct "hour" de la lib chronodot
minutesAlarme = now.minuteA2(), DEC; // stocke les minutes en décimale dans la variable "minutes" grace à la fct "minute" de la lib chronodot
// Serial.print(heuresAlarme); //décommenter pour débug
// Serial.print(':'); //
// Serial.print(minutesAlarme); //
// Serial.println(); //
}
/***** Fonction d'affichage horloge sur les 7 segments *******/
void AfficheHorloge ()
{
dizH = heuresHorloge / 10; // par calcul, extrait la dizaine de "heures" et stocke le résultat dans "dizH"
unitH = heuresHorloge % 10; // par calcul, extrait l'unités de "heures" et stocke le résultat dans "unitH"
dizM = minutesHorloge / 10; // par calcul, extrait la dizaine de "minutes" et stocke le résultat dans "dizM"
unitM = minutesHorloge % 10; // par calcul, extrait l'unité de "minutes" et stocke le résultat dans "dizM"
AfficheurUN = dataArray[unitM]; // stocke la valeur binaire 7 segments de l'unité de minutes dans "AfficheurUN"
// AfficheurUN &= ~(1<<1);
AfficheurDEUX = dataArray[dizM]; // stocke la valeur binaire 7 segments de la dizaine de minutes dans "AfficheurDEUX"
AfficheurTROIS = dataArray[unitH]; // stocke la valeur binaire 7 segments de l'unité d'heures dans "AfficheurTROIS"
AfficheurQUATRE = dataArray[dizH]; // stocke la valeur binaire 7 segments de la dizaine d'heures dans "AfficheurQUATRE"
// AfficheurQUATRE &= ~(1<<1);
digitalWrite(latchpin, 1); // latch à l'état HAUT pour autoriser le transfert des données série
shiftOut(datapin, clockpin, LSBFIRST, AfficheurUN); // envoi l'unités minute au registre à décallage
shiftOut(datapin, clockpin, LSBFIRST, AfficheurDEUX); // envoi la dizaine minute au registre à décallage
shiftOut(datapin, clockpin, LSBFIRST, AfficheurTROIS); // envoi l'unités heure au registre à décallage
shiftOut(datapin, clockpin, LSBFIRST, AfficheurQUATRE); // envoi la dizaine heure au registre à décallage
digitalWrite(latchpin, 0); // latch à l'état BAS pour arreter le transfert des données série
}
/***** Fonction d'affichage alarmes sur les 7 segments *******/
void AfficheAlarme ()
{
dizH = heuresAlarme / 10; // par calcul, extrait la dizaine de "heures" et stocke le résultat dans "dizH"
unitH = heuresAlarme % 10; // par calcul, extrait l'unités de "heures" et stocke le résultat dans "unitH"
dizM = minutesAlarme / 10; // par calcul, extrait la dizaine de "minutes" et stocke le résultat dans "dizM"
unitM = minutesAlarme % 10; // par calcul, extrait l'unité de "minutes" et stocke le résultat dans "dizM"
AfficheurUN = dataArray[unitM]; // stocke la valeur binaire 7 segments de l'unité de minutes dans "AfficheurUN"
AfficheurDEUX = dataArray[dizM]; // stocke la valeur binaire 7 segments de la dizaine de minutes dans "AfficheurDEUX"
AfficheurTROIS = dataArray[unitH]; // stocke la valeur binaire 7 segments de l'unité d'heures dans "AfficheurTROIS"
AfficheurQUATRE = dataArray[dizH]; // stocke la valeur binaire 7 segments de la dizaine d'heures dans "AfficheurQUATRE"
digitalWrite(latchpin, 1); // latch à l'état HAUT pour autoriser le transfert des données série
shiftOut(datapin, clockpin, LSBFIRST, AfficheurUN); // envoi l'unités minute au registre à décallage
shiftOut(datapin, clockpin, LSBFIRST, AfficheurDEUX); // envoi la dizaine minute au registre à décallage
shiftOut(datapin, clockpin, LSBFIRST, AfficheurTROIS); // envoi l'unités heure au registre à décallage
shiftOut(datapin, clockpin, LSBFIRST, AfficheurQUATRE); // envoi la dizaine heure au registre à décallage
digitalWrite(latchpin, 0); // latch à l'état BAS pour arreter le transfert des données série
}
/***** Régler l'Horloge : Fonction Surveillance des BoutonHorloge, BoutonMinutes et BoutonHeures *******/
void SurveilleBouton_Horloge_Heures_Minutes ()
{
EtatBoutonHorloge = digitalRead(BoutonHorloge); // Lit l'état du bouton (appuyé ou relaché) et stocke la valeur dans la variable "EtatBoutonHorloge"
EtatBoutonHeures = digitalRead(BoutonHeures); // Lit l'état du bouton (appuyé ou relaché) et stocke la valeur dans la variable "EtatBoutonHeures"
EtatBoutonMinutes = digitalRead(BoutonMinutes); // Lit l'état du bouton (appuyé ou relaché) et stocke la valeur dans la variable "EtatBoutonMinutes"
if ((EtatBoutonHorloge == LOW) && (EtatBoutonHeures == LOW)) // si le bouton est appuyé
{
delay(170); // alors, attendre 170 ms, permet un appuie bref pour incrémenter de 1, et un appuie long pour incrémenter rapidement d'autant qu'on veut
RegleHorlogeHeures (); // et appeller la fonction "RegleHeures"
}
if ((EtatBoutonHorloge == LOW) && (EtatBoutonMinutes == LOW)) // si le bouton est appuyé
{
delay(170); // alors, attendre 170 ms, permet un appuie bref pour incrémenter de 1, et un appuie long pour incrémenter rapidement d'autant qu'on veut
RegleHorlogeMinutes (); // et appeller la fonction "RegleMinutes"
}
}
/***** Fonction d'incrément Heures *******/
void RegleHorlogeHeures ()
{
heuresHorlogeINC = heuresHorloge + 1; // additionne 1 à la valeur contenue dans la variable "heures" et stocke le résultat dans la variable "heuresHorlogeINC"
if (heuresHorlogeINC > 23) // si la valeur de "heuresHorlogeINC" dépasse 23 (23h)
{
heuresHorlogeINC = 0; // alors, et la variable "heuresHorlogeINC" à zero (minuit)
}
// Serial.print(heuresHorlogeINC);
// Serial.println();
HORLOGE.adjust(DateTime(annee,mois,jour,heuresHorlogeINC,minutesHorloge,0)); // récup des données temporelles depuis les différentes variables pour mise à l'heure la puce DS3231, secondes à zero
}
/***** Fonction d'incrément minutes *******/
void RegleHorlogeMinutes ()
{
minutesHorlogeINC = minutesHorloge + 1; // additionne 1 à la valeur contenue dans la variable "minutes" et stocke le résultat dans la variable "minutesHorlogeINC"
if (minutesHorlogeINC > 59) // si la valeur de "minutesHorlogeINC" dépasse 59 (59min)
{
minutesHorlogeINC = 0; // alors, met la variable "minutesHorlogeINC" à zero
}
// Serial.print(minutesHorlogeINC);
// Serial.println();
HORLOGE.adjust(DateTime(annee,mois,jour,heuresHorloge,minutesHorlogeINC,0)); // récup des données temporelles depuis les différentes variables pour mise à l'heure la puce DS3231, secondes à zero
}
/***** Régler l'Alarme 1 : Fonction Surveillance des BoutonAlarme1, BoutonMinutes et BoutonHeures *******/
void SurveilleBouton_Alarme1_Heures_Minutes ()
{
EtatBoutonHeures = digitalRead(BoutonHeures); // Lit l'état du bouton (appuyé ou relaché) et stocke la valeur dans la variable "EtatBoutonHeures"
EtatBoutonMinutes = digitalRead(BoutonMinutes); // Lit l'état du bouton (appuyé ou relaché) et stocke la valeur dans la variable "EtatBoutonMinutes"
EtatBoutonAlarme1 = digitalRead(BoutonAlarme1); // Lit l'état du bouton (appuyé ou relaché) et stocke la valeur dans la variable "EtatBoutonMinutes"
if ((EtatBoutonAlarme1 == LOW) && (EtatBoutonHeures == LOW)) // si le bouton est appuyé
{
delay(170); // alors, attendre 170 ms, permet un appuie bref pour incrémenter de 1, et un appuie long pour incrémenter rapidement d'autant qu'on veut
RegleAlarm1Heures (); // et appeller la fonction "RegleMinutes"
}
if ((EtatBoutonAlarme1 == LOW) && (EtatBoutonMinutes == LOW)) // si le bouton est appuyé
{
delay(170); // alors, attendre 170 ms, permet un appuie bref pour incrémenter de 1, et un appuie long pour incrémenter rapidement d'autant qu'on veut
RegleAlarm1Minutes (); // et appeller la fonction "RegleMinutes"
}
}
/***** Fonction d'incrément Alarme 1, Heures *******/
void RegleAlarm1Heures ()
{
heuresAlarmeINC = heuresAlarme + 1; // additionne 1 à la valeur contenue dans la variable "heures" et stocke le résultat dans la variable "heuresHorlogeINC"
if (heuresAlarmeINC > 23) // si la valeur de "heuresHorlogeINC" dépasse 23 (23h)
{
heuresAlarmeINC = 0; // alors, et la variable "heuresHorlogeINC" à zero (minuit)
}
// Serial.print(minutesHorlogeINC);
// Serial.println();
RADIO.adjust(AlarmTime1(heuresAlarmeINC,minutesAlarme,0)); // récup des données temporelles depuis les différentes variables pour mise à l'heure la puce DS3231, secondes à zero
}
/***** Fonction d'incrément Alarme 1, Minutes *******/
void RegleAlarm1Minutes ()
{
minutesAlarmeINC = minutesAlarme + 1; // additionne 1 à la valeur contenue dans la variable "minutes" et stocke le résultat dans la variable "minutesHorlogeINC"
if (minutesAlarmeINC > 59) // si la valeur de "minutesHorlogeINC" dépasse 59 (59min)
{
minutesAlarmeINC = 0; // alors, met la variable "minutesHorlogeINC" à zero
}
// Serial.print(minutesHorlogeINC);
// Serial.println();
RADIO.adjust(AlarmTime1(heuresAlarme,minutesAlarmeINC,0)); // récup des données temporelles depuis les différentes variables pour mise à l'heure la puce DS3231, secondes à zero
}
/***** Régler l'Alarme 2 : Fonction Surveillance des BoutonAlarme2, BoutonMinutes et BoutonHeures *******/
void SurveilleBouton_Alarme2_Heures_Minutes ()
{
EtatBoutonHeures = digitalRead(BoutonHeures); // Lit l'état du bouton (appuyé ou relaché) et stocke la valeur dans la variable "EtatBoutonHeures"
EtatBoutonMinutes = digitalRead(BoutonMinutes); // Lit l'état du bouton (appuyé ou relaché) et stocke la valeur dans la variable "EtatBoutonMinutes"
EtatBoutonAlarme2 = digitalRead(BoutonAlarme2); // Lit l'état du bouton (appuyé ou relaché) et stocke la valeur dans la variable "EtatBoutonMinutes"
if ((EtatBoutonAlarme2 == LOW) && (EtatBoutonHeures == LOW)) // si le bouton est appuyé
{
delay(170); // alors, attendre 170 ms, permet un appuie bref pour incrémenter de 1, et un appuie long pour incrémenter rapidement d'autant qu'on veut
RegleAlarm2Heures (); // et appeller la fonction "RegleMinutes"
}
if ((EtatBoutonAlarme2 == LOW) && (EtatBoutonMinutes == LOW)) // si le bouton est appuyé
{
delay(170); // alors, attendre 170 ms, permet un appuie bref pour incrémenter de 1, et un appuie long pour incrémenter rapidement d'autant qu'on veut
RegleAlarm2Minutes (); // et appeller la fonction "RegleMinutes"
}
}
/***** Fonction d'incrément Alarme 2, Heures *******/
void RegleAlarm2Heures ()
{
heuresAlarmeINC = heuresAlarme + 1; // additionne 1 à la valeur contenue dans la variable "heures" et stocke le résultat dans la variable "heuresHorlogeINC"
if (heuresAlarmeINC > 23) // si la valeur de "heuresHorlogeINC" dépasse 23 (23h)
{
heuresAlarmeINC = 0; // alors, et la variable "heuresHorlogeINC" à zero (minuit)
}
// Serial.print(minutesHorlogeINC);
// Serial.println();
REVEIL.adjust(AlarmTime2(heuresAlarmeINC,minutesAlarme)); // récup des données temporelles depuis les différentes variables pour mise à l'heure la puce DS3231, secondes à zero
}
/***** Fonction d'incrément Alarme 2, Minutes *******/
void RegleAlarm2Minutes ()
{
minutesAlarmeINC = minutesAlarme + 1; // additionne 1 à la valeur contenue dans la variable "minutes" et stocke le résultat dans la variable "minutesHorlogeINC"
if (minutesAlarmeINC > 59) // si la valeur de "minutesHorlogeINC" dépasse 59 (59min)
{
minutesAlarmeINC = 0; // alors, met la variable "minutesHorlogeINC" à zero
}
// Serial.print(minutesHorlogeINC);
// Serial.println();
REVEIL.adjust(AlarmTime2(heuresAlarme,minutesAlarmeINC)); // récup des données temporelles depuis les différentes variables pour mise à l'heure la puce DS3231, secondes à zero
}
/***** Fonction Surveillance des BoutonAlarme1 et Horloge *******/
void SurveilleBouton_Alarme1_Horloge ()
{
EtatBoutonAlarme1 = digitalRead(BoutonAlarme1); // Lit l'état du bouton (appuyé ou relaché) et stocke la valeur dans la variable "EtatBoutonAlarme1"
EtatBoutonHorloge = digitalRead(BoutonHorloge); // Lit l'état du bouton (appuyé ou relaché) et stocke la valeur dans la variable "EtatBoutonHorloge"
if ((EtatBoutonAlarme1 == LOW) && (EtatBoutonHorloge == LOW)) // si les boutons sont appuyé
{
delay(600); // alors, attendre 600 ms, permet un appuie bref pour activer ou désactiver l'alarme1 (radio)
switch (RADIO.Alarm1Flag())
{
case 0: // désactivée // 0AH = 0xxxxxxx
RADIO.Alarm1SetON();
digitalWrite (LedAlarm1, HIGH);
break;
case 1: // alarme activée
RADIO.Alarm1SetOFF();
digitalWrite (LedAlarm1, LOW); // 0AH = 1xxxxxxx
break;
}
}
}
/***** Fonction Surveillance des BoutonAlarme2 et Horloge *******/
void SurveilleBouton_Alarme2_Horloge ()
{
EtatBoutonAlarme2 = digitalRead(BoutonAlarme2); // Lit l'état du bouton (appuyé ou relaché) et stocke la valeur dans la variable "EtatBoutonAlarme2"
EtatBoutonHorloge = digitalRead(BoutonHorloge); // Lit l'état du bouton (appuyé ou relaché) et stocke la valeur dans la variable "EtatBoutonHorloge"
if ((EtatBoutonAlarme2 == LOW) && (EtatBoutonHorloge == LOW)) // si le bouton est appuyé
{
delay(600); // alors, attendre 600 ms, permet un appuie bref pour activer ou désactiver l'alarme2 (sonnerie)
switch (REVEIL.Alarm2Flag())
{
case 0: // alarme désactivée // 0AH = 0xxxxxxx
REVEIL.Alarm2SetON();
digitalWrite (LedAlarm2, HIGH);
break;
case 1: // alarme activée
REVEIL.Alarm2SetOFF();
digitalWrite (LedAlarm2, LOW); // 0AH = 1xxxxxxx
break;
}
}
}
/***** Fonction d'envoie d'ordre au GPIO du Rpi *******/
void RadioON()
{
if (RADIO.Alarm1Status()==1)
{
// digitalWrite(relais, HIGH); # fait now par le RPI lui meme
digitalWrite(Radio, LOW);
delay(300); // appuie bref
digitalWrite(Radio, HIGH);
// delay(10000);
change = 1;
}
}
/***** Fonction d'activation de la sonnerie ChipTune *******/
void FaireSonnerSonnerie()
{
if (REVEIL.Alarm2Status()==1)
{
digitalWrite(relais, HIGH); // AmpliAudio alimenté
delay(500); // attendre quelques millisec entre chaque bouctle de sonnerie
switch (song) {
case 1: // A-Team
sonnerie(songA);
// song = song + 1;
break;
case 2: // Hallowee
sonnerie(songB);
// song = song + 1;
break;
case 3: // Muppets
sonnerie(songC);
// song = song + 1;
break;
case 4: // TakeOnMe
sonnerie(songD);
// song = song + 1;
break;
case 5: // Gadget
sonnerie(songE);
// song = song + 1;
break;
case 6: // MahnaMahna
sonnerie(songF);
// song = 1;
break;
default: // cas par défaut
sonnerie(songA);
break; */
}
}
}
/***** Fonction pour stopper la sonneie *******/
void stop2 () //appelée directement via l'interruption 0 lorsqu'on appuie sur le bouton alarm2
{
change = 1;
digitalWrite(relais, LOW); // coupe l'alimentation de l'AmpliAudio
// Serial.print(change); //
}
/***** Fonction d'ajustement de la luminosité via la photodiode *******/
void AjusteLuminosite()
{
ValeurPhotoDiode = analogRead(photodiodepin); // Lit la valeur renvoyée par la photodiode, et stocke la valeur dans la variable "ValeurPhotoDiode"
if (ValeurPhotoDiode > 495) // si la valeur est supérieure à 495 (beaucoup de lumière reçue, genre en plein jour)
{
analogWrite(ledPin, 255); // alors, illumination des afficheurs et leds à 100% (PWM de 0 à 255)
}
else if (ValeurPhotoDiode > 462) // sinon, si la valeur est supérieure à 462
{
analogWrite(ledPin, 238); // alors, illumination des afficheurs et leds moins forte
}
else if (ValeurPhotoDiode > 429)
{
analogWrite(ledPin, 221);
}
else if (ValeurPhotoDiode > 396)
{
analogWrite(ledPin, 204);
}
else if (ValeurPhotoDiode > 363)
{
analogWrite(ledPin, 187);
}
else if (ValeurPhotoDiode > 330)
{
analogWrite(ledPin, 170);
}
else if (ValeurPhotoDiode > 297)
{
analogWrite(ledPin, 153);
}
else if (ValeurPhotoDiode > 264)
{
analogWrite(ledPin, 136);
}
else if (ValeurPhotoDiode > 231)
{
analogWrite(ledPin, 119);
}
else if (ValeurPhotoDiode > 198)
{
analogWrite(ledPin, 102);
}
else if (ValeurPhotoDiode > 165)
{
analogWrite(ledPin, 85);
}
else if (ValeurPhotoDiode > 132)
{
analogWrite(ledPin, 68);
}
else if (ValeurPhotoDiode > 99)
{
analogWrite(ledPin, 51);
}
else if (ValeurPhotoDiode > 66)
{
analogWrite(ledPin, 34);
}
else if (ValeurPhotoDiode > 33)
{
analogWrite(ledPin, 17);
}
else // sinon, (très peu voire pas du tout de lumière reçue, genre dans la nuit)
{
analogWrite(ledPin, 8); // alors, illumination des afficheurs et leds aux minimum 8
}
}
/***** Fonction Sonnerie *****/
void sonnerie(char *p)
{
// Absolutely no error checking in here
byte default_dur = 4;
byte default_oct = 6;
int bpm = 63;
int num;
long wholenote;
long duration;
byte note;
byte scale;
// format: d=N,o=N,b=NNN:
// find the start (skip name, etc)
while(*p != ':') p++; // ignore name
p++; // skip ':'
// get default duration
if(*p == 'd')
{
p++; p++; // skip "d="
num = 0;
while(isdigit(*p))
{
num = (num * 10) + (*p++ - '0');
}
if(num > 0) default_dur = num;
p++; // skip comma
}
// Serial.print("ddur: "); Serial.println(default_dur, 10);
// get default octave
if(*p == 'o')
{
p++; p++; // skip "o="
num = *p++ - '0';
if(num >= 3 && num <=7) default_oct = num;
p++; // skip comma
}
// Serial.print("doct: "); Serial.println(default_oct, 10);
// get BPM
if(*p == 'b')
{
p++; p++; // skip "b="
num = 0;
while(isdigit(*p))
{
num = (num * 10) + (*p++ - '0');
}
bpm = num;
p++; // skip colon
}
// Serial.print("bpm: "); Serial.println(bpm, 10);
// BPM usually expresses the number of quarter notes per minute
wholenote = (60 * 1000L / bpm) * 4; // this is the time for whole note (in milliseconds)
// Serial.print("wn: "); Serial.println(wholenote, 10);
// now begin note loop
while(*p)
{
// first, get note duration, if available
num = 0;
while(isdigit(*p))
{
num = (num * 10) + (*p++ - '0');
}
if(num) duration = wholenote / num;
else duration = wholenote / default_dur; // we will need to check if we are a dotted note after
// now get the note
note = 0;
switch(*p)
{
case 'c':
note = 1;
break;
case 'd':
note = 3;
break;
case 'e':
note = 5;
break;
case 'f':
note = 6;
break;
case 'g':
note = 8;
break;
case 'a':
note = 10;
break;
case 'b':
note = 12;
break;
case 'p':
default:
note = 0;
}
p++;
// now, get optional '#' sharp
if(*p == '#')
{
note++;
p++;
}
// now, get optional '.' dotted note
if(*p == '.')
{
duration += duration/2;
p++;
}
// now, get scale
if(isdigit(*p))
{
scale = *p - '0';
p++;
}
else
{
scale = default_oct;
}
scale += OCTAVE_OFFSET;
if(*p == ',')
p++; // skip comma for next note (or we may be at the end)
// now play the note
if(note)
{
// Serial.print("Playing: ");
// Serial.print(scale, 10); Serial.print(' ');
// Serial.print(note, 10); Serial.print(" (");
// Serial.print(notes[(scale - 4) * 12 + note], 10);
// Serial.print(") ");
// Serial.println(duration, 10);
tone1.play(notes[(scale - 4) * 12 + note]);
delay(duration);
tone1.stop();
}
else
{
// Serial.print("Pausing: ");
// Serial.println(duration, 10);
delay(duration);
}
}
}</pre>
<ul>
<li>Pour faire l'interface entre l'horloge et la radio, les signaux de commande de l<em>'Arduino</em> opérants en 5 Volts et ceux du <em>Raspberry</em> en 3 Volts, il manque ici une carte d'interface. Elle sera étudié au prochain billet sur le sujet.<br /><br /></li>
</ul>
<h3><ins>Mode l'emploi de l'horloge</ins> :</h3>
<p>De gauche à droite, les boutons : [Alarme 2] [Alarme 1] [Horloge] [Heures] [Minutes]<br /></p>
<ul>
<li>Pour régler l'heure :<br /></li>
</ul>
<blockquote><p>Appuyer (bref ou long) sur [Horloge] + [Heures] , et sur [Horloge] + [Minutes]<br /></p></blockquote>
<ul>
<li>Pour régler l'alarme 1 :<br /></li>
</ul>
<blockquote><p>Appuyer (bref ou long) sur [Alarme 1] + [Heures] , et sur [Alarme 1] + [Minutes]<br /></p></blockquote>
<ul>
<li>Pour régler l'alarme 2 :<br /></li>
</ul>
<blockquote><p>Appuyer (bref ou long) sur [Alarme 2] + [Heures] , et sur [Alarme 2] + [Minutes]<br /></p></blockquote>
<ul>
<li>Pour afficher l'alarme 1 :<br /></li>
</ul>
<blockquote><p>Appuyer (bref) sur [Alarme 1]<br /></p></blockquote>
<ul>
<li>Pour afficher l'alarme 2 :<br /></li>
</ul>
<blockquote><p>Appuyer (bref) sur [Alarme 2]<br /></p></blockquote>
<ul>
<li>Pour stopper la sonnerie :<br /></li>
</ul>
<blockquote><p>Appuyer (bref) sur [Alarme 2]<br /></p></blockquote>
<p><br /></p>
<h4><a href="http://burogu.makotoworkshop.org/index.php?post/2017/12/10/wrrw05">À suivre…</a><br /></h4>http://burogu.makotoworkshop.org/index.php?post/2018/01/16/wrrw04#comment-formhttp://burogu.makotoworkshop.org/index.php?feed/atom/comments/643Le bartop, la borne d'arcade pour demi-portions ! -03-urn:md5:c6c914394ecfa8855891cafdf81d574a2016-04-28T15:32:00+02:002021-08-01T20:25:10+02:00makoto doushiteArcadeArduinoBricolageDIYImpression3DJeux videoMame-cabRétrogaming<p><a href="http://burogu.makotoworkshop.org/index.php?post/2016/02/14/bartop02">Suite de l'étude précédente</a> :<br />
Après l'assemblage de la borne et quelques essais, nous allons maintenant parler hardware !<br /></p>
<h3><ins>Les fournitures arcade</ins> :<br /></h3>
<p>Cette fois j'ai changé de boutique de fourniture arcade.<br /></p>
<ul>
<li>Je voulais les boutons translucide de la marque <em>Seimitsu</em> et le site Chinois <em><a href="http://www.arcadespareparts.com">Arcade Spare Parts</a></em> n'en vendant tout simplement pas, j'ai donc opté pour les Japonais d<em>'<a href="http://akishop.jp/">Akishop</a></em>.<br /></li>
</ul>
<p>Ne sachant que choisir parmi les couleurs disponibles, je les ai toutes prise en double…<br />
Attention, sur les photos ce sont des sticks <em>Seimitsu LS32</em> qui ne seront pas utilisés dans le bartop, mais pour un autre projet.<br />
De toute manière le <em>LS32</em> voit sa tige trop courte pour être utilisé sur un panel en bois, alors que le <strong><em>Sanwa JLF-TP-8Y</em></strong> que j'utilise ici est parfait pour traverser le contre-plaqué de 9 mm, avec sa tige de 32mm, ce qui laisse dépasser les 23 mm réglementaires <img src="http://burogu.makotoworkshop.org/index.php?pf=smile.svg" alt=":)" class="smiley" /><br />
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01205.jpg" title="dsc01205.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01205_s.jpg" alt="dsc01205.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01212.jpg" title="dsc01212.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01212_s.jpg" alt="dsc01212.jpg" /></a><br />
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01229.jpg" title="dsc01229.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01229_s.jpg" alt="dsc01229.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01231.jpg" title="dsc01231.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01231_s.jpg" alt="dsc01231.jpg" /></a><br />
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01227.jpg" title="dsc01227.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01227_s.jpg" alt="dsc01227.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01247.jpg" title="dsc01247.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01247_s.jpg" alt="dsc01247.jpg" /></a><br /></p> <p><a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01244.jpg" title="dsc01244.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01244_t.jpg" alt="dsc01244.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01241.jpg" title="dsc01241.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01241_t.jpg" alt="dsc01241.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01242.jpg" title="dsc01242.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01242_t.jpg" alt="dsc01242.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01248.jpg" title="dsc01248.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01248_t.jpg" alt="dsc01248.jpg" /></a><br />
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01250.jpg" title="dsc01250.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01250_t.jpg" alt="dsc01250.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01252.jpg" title="dsc01252.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01252_t.jpg" alt="dsc01252.jpg" /></a><br /><br /></p>
<h3><ins>Ordinateur</ins> :<br /></h3>
<p>Comme prévu, le PC de test est trop peu puissant pour mes jeux préférés (Pentiun4@2Ghz), mais bien suffisant pour jouer 80% des roms <em>Mame</em> (estimation au doigt mouillé compte tenu de mon expérience).<br /></p>
<ul>
<li>Afin de pouvoir faire tourner du <em>Shmup CAVE</em>, il faut une machine au moins aussi puissante qu'un <em>Intel Core 2 Duo E7300@2,66Ghz</em><br /></li>
</ul>
<p>Mais le choix de l'ordinateur s'est révélé un poil délicat.<br />
À la base donc je ciblais une machine aussi puissante qu'un <em>Intel Core 2 Duo E7300@2,66Ghz</em> et j'ai donc farfouillé sur les site de benchmark pour comparer avec les processeurs actuels…<br />
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/benchmark.png" title="benchmark.png"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.benchmark_m.png" alt="benchmark.png" /></a><br />
Et quand on réfléchis pas trop, on se dit que l<em>'AMD A4-5000</em> bah y ferait bien l'affaire !<br />
Mais en fait, et bah nan, c'est une daube, car le score <em>CPU Mark</em> est donné pour la totalité des cœurs, alors que <em>Mame</em> n'exploite correctement qu'un seul cœur à la fois, et ce malgré l'option <em>multi thread</em> activée, qui ne fait gagner que quelques maigres performances.<br />
Donc ce qu'il faut regarder c'est le score de <em>Single Thread Rating</em>, et là on comprend bien qu'un unique cœur de l<em>'AMD A4-5000</em> est deux fois moins puissant que ce bon vieux <em>Intel Core 2 Duo E7300@2,66Ghz</em>… Et merde, trop tard <img src="http://burogu.makotoworkshop.org/index.php?pf=smile.svg" alt=":)" class="smiley" /><br />
J'avais donc déjà acheté la carte mère <em><a href="http://www.ldlc.com/fiche/PB00192685.html">ASRock QC5000M-ITX/PH</a></em> <sup></sup>;<br />
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01260.jpg" title="dsc01260.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01260_s.jpg" alt="dsc01260.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01224.jpg" title="dsc01224.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01224_s.jpg" alt="dsc01224.jpg" /></a><br />
J'ai pas mal hésité à conserver ou renvoyer cet ordinateur mini-itx…<br /></p>
<blockquote><p>Et puis comme j'ai bien mesuré 12 Watt de consommation (à vide, Processeur + Chipset; 15 Watt promis), je me suis dit que bon, j'ai déjà une borne, celle-ci est donc une seconde, je ne vais pas y jouer tant que ça, et mis à part quelques jeux <em>CAVE</em><sup>[<a href="http://burogu.makotoworkshop.org/index.php?post/2016/02/18/bartop03#wiki-footnote-1" id="rev-wiki-footnote-1">1</a>]</sup>, tout le reste (jeux 3D mis à part) tourne bien, et qu'à terme cet ordi pourrait bien venir remplacer le serveur web sur lequel tu consultes cette page, et au passage permettre de dimunuer sa consommation électrique (30 W actuellement).<br />
En effet le serveur <a href="http://burogu.makotoworkshop.org/index.php?post/2009/09/15/auto-heberger-3">Atom 330</a> était donné pour un tpd de 8 Watt, mais en vrai il consomme 22 Watt à vide, preuve que le Chipset Intel est gourmand… Choisir un PC basse consommation c'est donc un peu la roulette, et comme j'ai pu ici vérifier les caractéristiques par moi-même…<br /></p></blockquote>
<ul>
<li>Pour alimenter ça, sachant qu'il n'y a pas la place pour loger une alimentation <em>ATX</em> standard dans le bartop, c'est un module <em>PicoPSU</em> 20 pins et un bloc secteur 12V qui alimente l'ordi.<br /></li>
</ul>
<p>Étant donné la très faible consommation du CPU, un <em>PicoPSU</em> de 90 Watts suffit amplement.<br /></p>
<p>Il est clair, test à l’appui qu'un <em>Intel Core i3 @3Ghz</em> se révélerait suffisamment puissant pour faire tourner tous les jeux sans sourciller, mais ça coûte carrément plus cher, sans compter qu'il aurait fallut utiliser une alimentation de type <a href="http://www.ldlc.com/fiche/PB00052307.html">Flex-ATX</a> suffisamment puissante qui puisse être casée dans la borne.<br /><br /></p>
<h3><ins>Câblage</ins> :<br /></h3>
<ul>
<li>J'ai dessiné et imprimé de nouvelles <a href="http://www.thingiverse.com/thing:1363725">plaques de restriction</a> pour les joystick <em>Sanwa</em> car après essais, il s'avère que la prise en main du stick est plus agréable ainsi.<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01291.jpg" title="dsc01291.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01291_s.jpg" alt="dsc01291.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01293.jpg" title="dsc01293.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01293_t.jpg" alt="dsc01293.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01295.jpg" title="dsc01295.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01295_t.jpg" alt="dsc01295.jpg" /></a><br /></p>
<ul>
<li>Les circuits de joystick sont toujours <a href="http://burogu.makotoworkshop.org/index.php?post/2011/10/18/joystick-arcade-usb-10">du même modèle</a> que je fabrique et utilise depuis que je bidouille ces machin là.<br /></li>
</ul>
<p>Ils sont maintenu en place avec des pinces à linge au fond du panel et les câbles sont soigneusement noués ensemble pour faire bloc avec le panel.<br />
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01296.jpg" title="dsc01296.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01296_s.jpg" alt="dsc01296.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01297.jpg" title="dsc01297.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01297_t.jpg" alt="dsc01297.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01298.jpg" title="dsc01298.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01298_t.jpg" alt="dsc01298.jpg" /></a><br /></p>
<ul>
<li>Deux ventilateurs de récup sont couplés ensemble via une petite bidouille de connectique.<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01262.jpg" title="dsc01262.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01262_t.jpg" alt="dsc01262.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01263.jpg" title="dsc01263.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01263_t.jpg" alt="dsc01263.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01264.jpg" title="dsc01264.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01264_t.jpg" alt="dsc01264.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01266.jpg" title="dsc01266.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01266_t.jpg" alt="dsc01266.jpg" /></a><br /></p>
<ul>
<li>Comme pour la <em><a href="http://burogu.makotoworkshop.org/index.php?post/2013/01/11/borne-arcade-35">RotaCity</a></em>, j'ai raccordé deux cordons secteur sur une façade IEC 220V avec interrupteur 16A récupérée sur un bloc d'alimentation industriel.<br /></li>
</ul>
<p>J'ai fixé une boite en plastique afin d'éviter tout risque de choc électrique avec ma personne.<br />
Le bouton vert sert de bouton power à l'ordinateur. Il est donc raccordé avec deux fils au bornier correspondant de la carte-mère, et deux fils supplémentaire pour la Led power contenue dans ce bouton vert translucide.<br />
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01243.jpg" title="dsc01243.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01243_s.jpg" alt="dsc01243.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01268.jpg" title="dsc01268.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01268_s.jpg" alt="dsc01268.jpg" /></a><br />
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01270.jpg" title="dsc01270.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01270_t.jpg" alt="dsc01270.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01271.jpg" title="dsc01271.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01271_t.jpg" alt="dsc01271.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01272.jpg" title="dsc01272.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01272_t.jpg" alt="dsc01272.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01267.jpg" title="dsc01267.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01267_t.jpg" alt="dsc01267.jpg" /></a><br /></p>
<ul>
<li>Voici la carte mère en place, simplement vissée au fond de la borne, et quelques gros plans des chemins de câble.<br /></li>
</ul>
<p><a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01301.jpg" title="dsc01301.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01301_s.jpg" alt="dsc01301.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01302.jpg" title="dsc01302.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01302_s.jpg" alt="dsc01302.jpg" /></a><br />
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01280.jpg" title="dsc01280.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01280_t.jpg" alt="dsc01280.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01281.jpg" title="dsc01281.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01281_t.jpg" alt="dsc01281.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01283.jpg" title="dsc01283.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01283_t.jpg" alt="dsc01283.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01284.jpg" title="dsc01284.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01284_t.jpg" alt="dsc01284.jpg" /></a><br />
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01300.jpg" title="dsc01300.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01300_s.jpg" alt="dsc01300.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01286.jpg" title="dsc01286.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01286_s.jpg" alt="dsc01286.jpg" /></a><br /><br /></p>
<h3><ins>Test de déco…</ins> :<br /></h3>
<ul>
<li>Je ne suis pas graphiste… Alors j'éprouve de grande difficultés à concevoir une déco originale et cohérente.<br /></li>
</ul>
<p>Après pas mal d'essais, je suis arrivé à ça, à partir d'image tirée de l'artbook Mushihimesama.<br />
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01287.jpg" title="dsc01287.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01287_s.jpg" alt="dsc01287.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01288.jpg" title="dsc01288.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01288_s.jpg" alt="dsc01288.jpg" /></a><br />
J'ai encore du travail à fournir pour la déco du panel et du top qui sera illuminé.<br /><br /></p>
<h3><ins>Premiers essais : Problème de ventilateur :</ins><br /></h3>
<ul>
<li>J'ai eu beau régler au minimum de la vitesse le ventilateur de châssis, via le bios de la carte mère, ceux-ci (puisqu'ils sont câblés en parallèles), tournent encore trop vite et surtout en émettant beaucoup de bruit.<br /></li>
</ul>
<p>Test de température satisfaisant de la carte mère à l'appui (environ 43°C avec un jeu exploitant toutes les ressources machine), j'ai pu déterminer une vitesse assez faible sans trop de bruit.
Pour atteindre cette vitesse, j'ai bien tenté de baisser l'intensité du 12V avec une résistance de 56 Ohm, mais évidemment, elle devient brûlante… Et puis on perd tout l'intérêt de ces ventilateurs à commande impulsionnelle <em>PWM</em> (pwm sur le fil bleu, jaune 12V et noir Masse).<br />
C'est donc d'une PWM dont j'avais besoin…<br />
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01306.jpg" title="dsc01306.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01306_s.jpg" alt="dsc01306.jpg" style="float:right; margin: 0 0 1em 1em;" /></a></p>
<ul>
<li>C'est un peu sortir l'artillerie lourde pour pas grand chose, mais c'est si facile à faire avec un µContrôleur, où si on ne veut pas s'embêter, avec un <em>Arduino</em>.<br /></li>
</ul>
<p>Le schéma suivant et ce petit bout de code C++ suffit avec un <em><a href="https://www.arduino.cc/en/Main/ArduinoBoardProMini">Arduino Pro Mini</a></em> qu'on trouve pour moins de 3€ sur le 'ternet !<br />
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/VentiloPWM_bb.png" title="VentiloPWM_bb.png"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.VentiloPWM_bb_m.png" alt="VentiloPWM_bb.png" style="display:table; margin:0 auto;" /></a></p>
<pre class="brush: cpp">int inputPin = A0; // set input pin for the potentiometer
int inputValue = 0; // potentiometer input variable
int fanPin = 9; // set output pin for the FAN
void setup() {
// declare the fanPin as an OUTPUT:
pinMode(fanPin, OUTPUT);
}
void loop() {
// read the value from the potentiometer:
inputValue = analogRead(inputPin);
// send the square wave signal to the FAN:
analogWrite(fanPin, inputValue/4);
}</pre>
<p>Je connecte donc les ventilateurs directement sur la prise mâle de ce montage (et non plus sur la carte mère) qui est alimenté par une prise molex ATX. Le potentiomètre qu'importe sa valeur, permettant alors de régler la vitesse de rotation à sa convenance.<br /><br /></p>
<h3><ins>Premiers essais : Un problème avec l'audio :</ins><br /></h3>
<ul>
<li>Pour alimenter l'amplificateur audio, j'ai choisis d'utiliser le 12 Volts de l'alimentation ATX. En effet ce serait dommage de se priver et d'utiliser une alimentation supplémentaire juste pour si peu.<br /></li>
</ul>
<p>J'ai donc soudé un adaptateur, en câblant le côté 12V d'une prise <em>molex</em> mâle sur une fiche jack.<br />
Dés l'allumage de la machine, un gros bruit de fond se fait entendre. En étant attentif, on se rend compte que les variations dans ces <em>pchhhhittttts</em> suivent l'activité de l'ordinateur (le disque qui gratte, l'affichage, les ventilateurs, …).<br /></p>
<ul>
<li>Bref, l'alimentation ATX <em>re-pisse</em> dans l'ampli audio, un filtrage s'avère donc nécessaire.<br /></li>
</ul>
<p>On peut faire cela avec ce simple filtre LC, qui nécessite un condensateur d'au moins 100µF polarisé et une self, simple bobine doté d'une ferrite. Si nécessaire on peut améliorer le filtrage en ajoutant un second étage LC.<br />
J'ai donc soudé le circuit sur une plaque à trous en avec ces composants et ces connecteurs de récupération.<br />
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/filtrelc.jpg" title="filtrelc.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/filtrelc.jpg" alt="filtrelc.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/img_0203.jpg" title="img_0203.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.img_0203_s.jpg" alt="img_0203.jpg" /></a><br />
Mais le résultat était insignifiant, au mieux le <em><a href="http://totovai.e-monsite.com/pages/mes-articles/les-alimentations-hum-et-parasites.html">hum</a></em> (oui on dit comme ça, ou ronflette aussi) s'entendait dans les tons plus grave.<br /></p>
<ul>
<li>En y regardant de plus près on s’aperçoit que nous sommes en présence d'un bouclage de masse :<br /></li>
</ul>
<p>Ce qui se passe, c'est que le 12V alimente l'ampli, et voit donc sa masse connectée à la masse ampli, normal.<br />
Et puis on raccorde le cordon audio, qui comporte lui aussi sa masse, qui passe par la carte mère, qui passe par l'alim atx, et qui fournit donc le 12v de l'ampli… Ce second cheminement forme une boucle et produit le <em>hum</em> !<br />
Il faudrait donc isoler la masse…<br />
J'ai donc déconnecté la masse pour tester, soit celle du cordon audio, soit celle de l'ampli, mais je m'en doutais, le <em>hum</em> est pire !<br /></p>
<p><a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01307.jpg" title="dsc01307.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01307_s.jpg" alt="dsc01307.jpg" style="float:right; margin: 0 0 1em 1em;" /></a></p>
<ul>
<li>Ensuite j'ai tenté d'alimenter l'ampli avec un régulateur 12V-5V (LM7508) que j'avais sous la main (oui l'ampli tolère une alim à 5V).<br /></li>
</ul>
<p>Cette fois c'est mieux, le <em>hum</em> est très amoindris, inaudible lorsque d'ampli (sans musique) est volume à fond, mais dés qu'on baisse au max, <em>hum</em>… plus ténu, mais présent.<br /></p>
<p><a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/dsc01308.jpg" title="dsc01308.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.dsc01308_s.jpg" alt="dsc01308.jpg" style="float:right; margin: 0 0 1em 1em;" /></a></p>
<ul>
<li>Alors on m'a parlé des convertisseurs <em>DC-DC</em> isolés, et on m'en a prêté un, d'assez faible puissance, mais suffisant pour le cas présent, un <em><a href="http://www.mouser.fr/ProductDetail/TRACO-Power/TEM-3-1212/?qs=ckJk83FOD0URe%2fcyC4D%2fOw%3d%3d">TRACO Power TEM 3-1212</a></em> qui traînait dans un tiroir depuis 12 ans.<br /></li>
</ul>
<p>Une fois câblé entre la prise molex de l'alim ATX et l'ampli audio, on rentre donc le 12V et on ressort du… 12V, mais la masse est isolée, plus de hum, nada, queue dalle, volume au minimum ou au max, avec ou sans musique, aussi parfait que si j'avais dédiée un bloc alim à l'ampli !<br />
Cependant cette solution, bien que satisfaisante peu se révéler assez onéreuse en plus d'être inadaptée pour des ampli de forte puissance.<br />
En effet, difficile de trouver un convertisseur de ce type qui délivre plus de 800mA (environ 10W pour 12V), alors que mon ampli volume à fond (et volume du PC aussi) flirte avec le 1A.<br />
Et puis <a href="http://www.mouser.fr/Power/DC-DC-Converters/Isolated-DC-DC-Converters/_/N-brwkv/">ça coute au minimum 30€…</a><br /></p>
<p><a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/img_0244.jpg" title="img_0244.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.img_0244_s.jpg" alt="img_0244.jpg" style="float:right; margin: 0 0 1em 1em;" /></a></p>
<ul>
<li>Plutôt que d'isoler la masse de l'alimentation, s'occuper de l'audio serait peut-être moins coûteux, le monde de la sonorisation de spectacle semble bien au fait du probléme et utilise dans ce cas un <a href="http://www.sonorisation-spectacle.org/boucle-de-masse-et-problemes-de-ronflette.html">transformateur d’isolation de ligne</a> sur le câble audio.<br /><br /></li>
</ul>
<p>Histoire de tester la faisabilité, j'ai dépouillé deux vieux modem 56K de leurs transfo audio <em><a href="http://pdf1.alldatasheet.fr/datasheet-pdf/view/159481/BEL/2811B.html">2811B</a></em>.<br /></p>
<p>Et j'ai câblé ceci :<br />
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/img_0246.jpg" title="img_0246.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.img_0246_s.jpg" alt="img_0246.jpg" /></a>
<a href="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/img_0247.jpg" title="img_0247.jpg"><img src="http://burogu.makotoworkshop.org/public/bricolage/arcade/bartop/.img_0247_s.jpg" alt="img_0247.jpg" /></a><br /></p>
<p>Ça fonctionne très bien, et l'avantage de cette solution, c'est qu'on a pas à se soucier de la puissance de l'ampli.<br />
Après quelques recherches, j'ai trouvé un montage tout fait du même acabit, dans la rubrique<a href="http://www.monacor.com/en-gb/monacor/products/pa-technology/signal-processing/signal-optimisation/"> Transformateurs d'isolation</a> chez <em>Monacor</em>.<br />
Un <em>ground isolator</em> du modèle <em><a href="http://www.monacor.com/en-gb/monacor/products/pa-technology/signal-processing/signal-optimisation/fga-30m/">FGA</a></em> devrait faire l'affaire, le schéma de la datasheet correspond à ce que j'ai câblé précédemment…<br /><br /></p>
<p><ins>Ressources</ins> :<br />
- <a href="http://www.arduino-tutorials.com/arduino-pwm/">http://www.arduino-tutorials.com/arduino-pwm/</a><br /><br /></p>
<h3><a href="http://burogu.makotoworkshop.org/index.php?post/2016/06/04/bartop04">À suivre…</a></h3>
<div class="footnotes"><h4>Note</h4>
<p>[<a href="http://burogu.makotoworkshop.org/index.php?post/2016/02/18/bartop03#rev-wiki-footnote-1" id="wiki-footnote-1">1</a>] Mushihimesama, Futari1.5, Espgaluda2, Ibara, Mushimushi Pork, Pinksweats, Deathmiles, Dodonpachi Dai Fukatsu</p></div>
http://burogu.makotoworkshop.org/index.php?post/2016/02/18/bartop03#comment-formhttp://burogu.makotoworkshop.org/index.php?feed/atom/comments/603