{"id":4019,"date":"2019-09-26T16:39:18","date_gmt":"2019-09-26T21:39:18","guid":{"rendered":"https:\/\/espacerm.com\/webgen\/?page_id=4019"},"modified":"2022-07-24T10:09:04","modified_gmt":"2022-07-24T15:09:04","slug":"tondeuse-teleguidee","status":"publish","type":"page","link":"https:\/\/espacerm.com\/webgen\/tondeuse-teleguidee\/","title":{"rendered":"Tondeuse t\u00e9l\u00e9guid\u00e9e"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\">Mise en garde<\/h3>\n\n\n\n<p>Ce montage n&rsquo;est pas un produit fini \u00e0 toute \u00e9preuve. J&rsquo;op\u00e8re dans un environnement contr\u00f4ler o\u00f9 les risques sont minimis\u00e9s. Vous pouvez vous en inspirer, mais la s\u00e9curit\u00e9 est sous votre seule responsabilit\u00e9.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">But<\/h3>\n\n\n\n<p>Le but est de contr\u00f4ler le d\u00e9placement d&rsquo;une tondeuse avec une manette   de jeux sans fil PS4. \u00c9ventuellement, j&rsquo;aimerais qu&rsquo;elle tonde une partie de la pelouse de fa\u00e7on autonome. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/09\/IMG_6177c.jpg\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"570\" src=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/09\/IMG_6177c-1024x570.jpg\" alt=\"\" class=\"wp-image-4020\" srcset=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/09\/IMG_6177c-1024x570.jpg 1024w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/09\/IMG_6177c-300x167.jpg 300w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/09\/IMG_6177c-768x428.jpg 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p><a rel=\"noreferrer noopener\" aria-label=\"D\u00e9mo vid\u00e9o (ouverture dans un nouvel onglet)\" href=\"https:\/\/www.youtube.com\/watch?v=DtedEgZPj5E\" target=\"_blank\">D\u00e9mo vid\u00e9o<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/www.youtube.com\/watch?v=J3OsMrTnNHM\" target=\"_blank\" rel=\"noreferrer noopener\">D\u00e9mo version 2021<\/a><\/p>\n\n\n\n<p>La tondeuse est pilot\u00e9e par un ESP32. Une communication ma\u00eetre-esclave est \u00e9tablie automatiquement entre le ESP32 et un Arduino UNO surmont\u00e9 d\u2019un USB Host Shield 2.0. Le HC05 reli\u00e9 sur le ESP32 est configur\u00e9 en mode esclave [AT+ROLE = 0 ]. Le HC-05 reli\u00e9 sur l\u2019Arduino est configur\u00e9 en mode ma\u00eetre [AT+ROLE = 1 ]. Le HC-05 ma\u00eetre est param\u00e9tr\u00e9 pour se connecter directement \u00e0 l\u2019adresse Bluetooth du circuit esclave [ AT+CMODE( set address pairing)].<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/10\/Circuit_ESP32-Bluetooth-HC05-CTRL-motor-BTS7960_tondeuse_00_bb.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"759\" src=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/10\/Circuit_ESP32-Bluetooth-HC05-CTRL-motor-BTS7960_tondeuse_00_bb-1024x759.png\" alt=\"\" class=\"wp-image-4137\" srcset=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/10\/Circuit_ESP32-Bluetooth-HC05-CTRL-motor-BTS7960_tondeuse_00_bb-1024x759.png 1024w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/10\/Circuit_ESP32-Bluetooth-HC05-CTRL-motor-BTS7960_tondeuse_00_bb-300x222.png 300w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/10\/Circuit_ESP32-Bluetooth-HC05-CTRL-motor-BTS7960_tondeuse_00_bb-768x569.png 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>2 pilotes moteur  H-Bridge haut courant 43A BTS7960<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/09\/t\u00e9l\u00e9commande-PS4-et-Arduino-Uno_2048.jpg\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"789\" src=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/09\/t\u00e9l\u00e9commande-PS4-et-Arduino-Uno_2048-1024x789.jpg\" alt=\"\" class=\"wp-image-4022\" srcset=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/09\/t\u00e9l\u00e9commande-PS4-et-Arduino-Uno_2048-1024x789.jpg 1024w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/09\/t\u00e9l\u00e9commande-PS4-et-Arduino-Uno_2048-300x231.jpg 300w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/09\/t\u00e9l\u00e9commande-PS4-et-Arduino-Uno_2048-768x592.jpg 768w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/09\/t\u00e9l\u00e9commande-PS4-et-Arduino-Uno_2048.jpg 2048w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Arduino + USB Host Shield 2.0 + HC05 + DUALSHOCK\u21224 wireless controller<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Composants et fournitures<\/h3>\n\n\n\n<p><a rel=\"noreferrer noopener\" aria-label=\"USB Host Shield Compatible For Google Android ADK Support U NO MEGA Module (ouverture dans un nouvel onglet)\" href=\"https:\/\/www.banggood.com\/USB-Host-Shield-Compatible-For-Google-Android-ADK-Support-U-NO-MEGA-Module-p-1384907.html?cur_warehouse=CN\" target=\"_blank\">USB Host Shield Compatible For Google Android ADK Support U NO MEGA Module<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/www.amazon.ca\/gp\/product\/B00E38N7QE\/ref=ppx_yo_dt_b_asin_title_o05_s00?ie=UTF8&amp;psc=1\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"USB Bluetooth V4.0.3. Mini adaptateur Dongle sans fil (ouverture dans un nouvel onglet)\">USB Bluetooth V4.0.3. Mini adaptateur Dongle sans fil<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/www.banggood.com\/350W-24V-2750-RPM-ZY1016-Electric-Motor-E-bike-Brushed-Scooter-Electric-Motor-p-1213254.html?cur_warehouse=CN\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"350W 24V 2750 RPM ZY1016 Electric Motor E-bike Brushed Scooter Electric Motor (ouverture dans un nouvel onglet)\">350W 24V 2750 RPM ZY1016 Electric Motor E-bike Brushed Scooter Electric Motor<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/www.banggood.com\/ESP32-Development-Board-WiFibluetooth-Ultra-Low-Power-Consumption-Dual-Cores-ESP-32-ESP-32S-Board-p-1109512.html?cur_warehouse=CN\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"Geekcreit\u00ae ESP32 Development Board WiFi+bluetooth Ultra Low Power Consumption Dual Cores ESP-32 ESP-32S Board (ouverture dans un nouvel onglet)\">Geekcreit\u00ae ESP32 Development Board WiFi+bluetooth Ultra Low Power Consumption Dual Cores ESP-32 ESP-32S Board<\/a><\/p>\n\n\n\n<p><strong><a href=\"https:\/\/www.ebay.ca\/itm\/Double-BTS7960B-DC-43A-Stepper-Motor-Driver-H-Bridge-PWM-For-Arduino-Smart-Car\/200950936475?hash=item2ec99bf39b:g:xE8AAOSwWDNZlB6H\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"Double BTS7960B DC 43A Stepper Motor Driver H-Bridge PWM For Arduino Smart Car (ouverture dans un nouvel onglet)\">Double BTS7960B DC 43A Stepper Motor Driver H-Bridge PWM For Arduino Smart Car<\/a><\/strong><\/p>\n\n\n\n<p><strong><a href=\"https:\/\/www.ebay.ca\/itm\/25H-78-TEETH-CHAIN-SPROCKET-FITS-47-49cc-BIKE-ATV-QUAD-DIRT-MINI-POCKET-ROCKET\/233127600655?hash=item36477ce20f&amp;enc=AQADAAADQFjVrDbVsZ8oH%2F8PNHtt9VX4%2Fw7FZcmMuqsX8uaFEduVVCwS3Hf5UNilLoZg4JIrh6WdSKPDldsB1tMoEsmfq7aHkccAPNF3O%2F4GynpcpsFu%2BfZ2sUGJqUduEbAgbRbhpbUGZUCGc0yMCjTVEVYKiPKfqKdDbZn8%2F7Vfxq80Vjxclp032%2F6NBmbObrmaLlm6FaHIiAw7MzgyxdI4npXoTpbqA3G6oRNrrApkJ3YmfIfbwWTIDQ%2FDe1ZEC7iFv%2B6dznCj5AzEnELXItWzgvX8Tzd2q5Mp0Wi%2BECdUQOMQ0uKA2GaC9fjDm7NWJOsnK0687M9HsXFbuT4FU3ABX12vpSHQdWWpY%2BU%2Ba1Hi7DJLuk9pDs3tmzshWPYMhER9Hgi3%2BF0x29iabQkN6ctl80leUxLC1roj2dbrrGBOwAmc75X%2FSFEgAY0pbIJFSvRPDc5uumBAeKSTmDKNNDwV9z1uhhXZGE9l%2FwXgWTmvVVsRLkI4a56L1mfnzLVG2lNtvP%2BfJ4WxCD8qy0BNHsV%2BNLUOTUrM5Ah10i3WQqRbrtAfQs8MnD%2FU%2Bvj9pUyfrIrxhrKr6LGHJdZLqUjfj9xjhzhapQkIn3CZCpIqHuIQ2OoKJIAE6f9QulVH5DO5quSpMH1Vw8gEulSpwhLFPZFauKpDwYPZchQQ1ueTmhr8qUevNFDo4PS8Tg4w4PoDTUZKeUNb00BYBOOALoV6j4cOx81AG%2BSWYEcQFYJDjo%2Bk57ZbZ0HLDF%2F6bGESKvq8Xt3jtyYvijWnnEwPvK9FXKdjTgXDmKbFqyRmPxCh%2FpICpCEWfhgykT9tmsBFbELAYNRAGPRVhV7w%2FWjYvV3%2BahiUXiHbHn11XLZBI3aRzyk%2BmOwMLZl%2BM9vN%2BTKv4t0mRwXNyO2b1DhI4KEFUmmnMXPIK5yAZlQOSkxXkgsaY5HLDM1rWMPdJ2hP%2FQSHNGmf6I%2FESVEvxpYB8FkSLY7%2BezsXR7UijmOxw7GW4%2BX2IVXjUcvmAo29jHrHVEq9l9boKpj80y2Fd%2FSfWSQrM0CKEx7QBkDtlnonV9bXz%2BGTIluQY8nOkddhwLWJINFlXPWIXsEGZ67cmFxd1gU4ekW0k6cCCAVvhQI%3D&amp;checksum=233127600655e2f3c64a6c724301a978114d2262e325\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"25H 78 TEETH CHAIN SPROCKET FITS 47 49cc BIKE ATV QUAD DIRT MINI POCKET ROCKET (ouverture dans un nouvel onglet)\">25H 78 TEETH CHAIN SPROCKET FITS 47 49cc BIKE ATV QUAD DIRT MINI POCKET ROCKET<\/a><\/strong><\/p>\n\n\n\n<p><strong><a href=\"https:\/\/www.ebay.ca\/itm\/1pcs-HC-05-Wireless-Bluetooth-RF-Transceiver-Module-serial-RS232-TTL-for-arduino\/293018425278?hash=item44394257be:g:qv8AAOSw0dFclX1A\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"HC-05 Wireless Bluetooth RF Transceiver Module serial RS232 TTL for arduino (ouverture dans un nouvel onglet)\">HC-05 Wireless Bluetooth RF Transceiver Module serial RS232 TTL for arduino<\/a><\/strong><\/p>\n\n\n\n<p><a href=\"https:\/\/www.banggood.com\/UNO-R3-ATmega328P-Development-Board-For-Arduino-No-Cable-p-964163.html?rmmds=search&amp;cur_warehouse=CN\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"Geekcreit\u00ae UNO R3 ATmega328P Development Board For Arduino No Cable (ouverture dans un nouvel onglet)\">Geekcreit\u00ae UNO R3 ATmega328P Development Board For Arduino No Cable<\/a> <\/p>\n\n\n\n<p><a href=\"https:\/\/www.homedepot.ca\/produit\/everbilt-roulette-pivotante-moyenne-de-203-mm-a-roue-pneumatique\/1001031345\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"Everbilt Roulette pivotante moyenne de 203 mm \u00e0 roue pneumatique (ouverture dans un nouvel onglet)\">Everbilt Roulette pivotante moyenne de 203 mm \u00e0 roue pneumatique<\/a><\/p>\n\n\n\n<p> Plaquette de montage pour le ESP32 DEVKIT V1 DOIT <a rel=\"noreferrer noopener\" href=\"https:\/\/www.pcbway.com\/project\/shareproject\/ESP32_DEVKIT_V1_DOIT_Expansion_shield.html?fbclid=IwAR29K1V-tU9nnLwwxz1P_D5GeSwvf6X0C9N5PcE9yuwMWcwtVj4wdAnuZoA\" target=\"_blank\">ici <\/a><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/10\/IMG_6503-Modifier.jpg\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"793\" src=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/10\/IMG_6503-Modifier-1024x793.jpg\" alt=\"\" class=\"wp-image-4178\" srcset=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/10\/IMG_6503-Modifier-1024x793.jpg 1024w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/10\/IMG_6503-Modifier-300x232.jpg 300w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/10\/IMG_6503-Modifier-768x594.jpg 768w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/10\/IMG_6503-Modifier.jpg 1292w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Fonctionnement global<\/h3>\n\n\n\n<p>La manette PS4 transmet les commandes au USB HOST. <\/p>\n\n\n\n<p>Le logiciel dans l&rsquo;ARDUINO UNO fait un pr\u00e9traitement des commandes et les envoie au ESP32 par l&rsquo;entremise du circuit Bluetooth HC-05. Ce circuit est configur\u00e9 en mode Maitre et l&rsquo;adresse de la carte HC-05 Esclave est programm\u00e9e dans la carte Maitre. Le circuit HC-05 Esclave est reli\u00e9 sur le ESP32.<\/p>\n\n\n\n<p>La communication Maitre-Esclave s&rsquo;\u00e9tablit instantan\u00e9ment, lors de la mise sous tension.<\/p>\n\n\n\n<p>La manette est connect\u00e9e au  \u00abUSB HOST-ARDUINO\u00bb  en appuyant sur le bouton PS de la manette.  Ils doivent avoir \u00e9t\u00e9 jumel\u00e9s  pr\u00e9alablement (voir la proc\u00e9dure dans le programme du \u00abUSB HOST-ARDUINO\u00bb).<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/09\/shema_tondeuse_tlcmd_00.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"791\" src=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/09\/shema_tondeuse_tlcmd_00-1024x791.png\" alt=\"\" class=\"wp-image-4031\" srcset=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/09\/shema_tondeuse_tlcmd_00-1024x791.png 1024w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/09\/shema_tondeuse_tlcmd_00-300x232.png 300w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/09\/shema_tondeuse_tlcmd_00-768x593.png 768w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/09\/shema_tondeuse_tlcmd_00.png 1056w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Les commandes sont :<\/p>\n\n\n\n<ul><li>Avance -&gt; Joystick droit pouss\u00e9 vers l&rsquo;avant<\/li><li>Recule   -&gt; Joystick droit pouss\u00e9 vers l&rsquo;arri\u00e8re <\/li><li>Tourne \u00e0 droite   -&gt; Joystick droit pouss\u00e9 du c\u00f4t\u00e9 droit <\/li><li>Tourne \u00e0 gauche   -&gt; Joystick droit pouss\u00e9 du c\u00f4t\u00e9 gauche  <\/li><li>Stop   -&gt; Joystick droit libre  <\/li><li>Augmente la vitesse   -&gt; Bouton Triangle<\/li><li>Diminue la vitesse   -&gt; Bouton Croix <\/li><li>Moteur de la roue \u00e0 l&rsquo;int\u00e9rieur du virage inactif : roue libre   -&gt; Bouton Cercle<\/li><li>Moteur de la roue  \u00e0 l&rsquo;int\u00e9rieur du virage actif : Rotation inverse de la roue \u00e0 l&rsquo;ext\u00e9rieur du virage et \u00e0 vitesse moindre   -&gt; Bouton Carr\u00e9<\/li><\/ul>\n\n\n\n<p>Les roues avant ne sont pas motoris\u00e9es. Ce sont des roues pivotantes.<\/p>\n\n\n\n<p>La motricit\u00e9 et la direction sont accomplies par les roues arri\u00e8re.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">S\u00e9curit\u00e9<\/h4>\n\n\n\n<p>Si la manette n&rsquo;est pas en connect\u00e9e avec l&rsquo;Arduino, celui-ci envoie la commande \u00abSTOP\u00bb au ESP32.<\/p>\n\n\n\n<p>Si aucune commande n&rsquo;est ex\u00e9cut\u00e9e par l&rsquo;op\u00e9rateur depuis 200ms, le programme dans l&rsquo;Arduino transmet  la commande \u00abSTOP\u00bb au ESP32. <\/p>\n\n\n\n<p>Si le ESP32 n&rsquo;a rien re\u00e7u de l&rsquo;Arduino depuis 300ms, la commande \u00abSTOP\u00bb est ex\u00e9cut\u00e9e<\/p>\n\n\n\n<p>Un \u00abchien de garde\u00bb est programm\u00e9 dans le ESP32. Un r\u00e9amor\u00e7age est forc\u00e9 automatiquement si le programme ne revient pas au d\u00e9but du \u00abLoop\u00bb apr\u00e8s un certain d\u00e9lai programmable ( 2 secondes ). <\/p>\n\n\n\n<p>Les moteurs ont une source d&rsquo;alimentation diff\u00e9rente du ESP32. Si les deux avaient la m\u00eame source d&rsquo;alimentation, un dysfonctionnement du programme pourrait se produire lors d&rsquo;une baisse de tension. Ceci pourrait occasionner une perte de contr\u00f4le de la tondeuse. <\/p>\n\n\n\n<p>Un interrupteur de s\u00e9curit\u00e9 est install\u00e9 pour couper l&rsquo;alimentation des moteurs CC au besoin.<\/p>\n\n\n\n<p>La tondeuse est \u00e0 essence. Une tringle sur le manche doit \u00eatre tenue par l&rsquo;op\u00e9rateur pour garder le moteur actif. Pour remplacer l&rsquo;op\u00e9rateur, une corde est <strong>boucl\u00e9e<\/strong> pour tenir la tringle \u00e0 la bonne position afin de garder le moteur de la tondeuse actif. Un grand bout de la corde pend, il suffit de tirer d&rsquo;un coup sec pour arr\u00eater le moteur.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/09\/IMG_6186r.jpg\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/09\/IMG_6186r-768x1024.jpg\" alt=\"\" class=\"wp-image-4044\" width=\"384\" height=\"512\" srcset=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/09\/IMG_6186r-768x1024.jpg 768w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/09\/IMG_6186r-225x300.jpg 225w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/09\/IMG_6186r.jpg 1024w\" sizes=\"(max-width: 384px) 100vw, 384px\" \/><\/a><\/figure>\n\n\n\n<p>Pour \u00e9viter les probl\u00e8mes de communication, je porte \u00e0 la ceinture l&rsquo;ensemble \u00abUSB-host, Arduino\u00bb et je ne suis jamais tr\u00e8s loin de la tondeuse. <\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">D\u00e9tails d&rsquo;assemblage<\/h3>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/09\/IMG_5866d.jpg\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/09\/IMG_5866d-1024x853.jpg\" alt=\"\" class=\"wp-image-4058\" width=\"512\" height=\"427\" srcset=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/09\/IMG_5866d-1024x853.jpg 1024w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/09\/IMG_5866d-300x250.jpg 300w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/09\/IMG_5866d-768x639.jpg 768w\" sizes=\"(max-width: 512px) 100vw, 512px\" \/><\/a><\/figure>\n\n\n\n<br>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/10\/IMG_6500-1.jpg\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/10\/IMG_6500-1.jpg\" alt=\"\" class=\"wp-image-4172\" width=\"563\" height=\"750\" srcset=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/10\/IMG_6500-1.jpg 750w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2019\/10\/IMG_6500-1-225x300.jpg 225w\" sizes=\"(max-width: 563px) 100vw, 563px\" \/><\/a><\/figure>\n\n\n\n<p>L&rsquo;antid\u00e9railleur-tenseur de cha\u00eene est un assemblage de tige filet\u00e9 , d&rsquo;\u00e9crous, de rondelles de m\u00e9tal, de rondelles de blocage et de roulement \u00e0 billes.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"649\" src=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/07\/version-sans-chaine_00-1024x649.jpg\" alt=\"\" class=\"wp-image-4852\" srcset=\"https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/07\/version-sans-chaine_00-1024x649.jpg 1024w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/07\/version-sans-chaine_00-300x190.jpg 300w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/07\/version-sans-chaine_00-768x487.jpg 768w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/07\/version-sans-chaine_00-1536x973.jpg 1536w, https:\/\/espacerm.com\/webgen\/wp-content\/uploads\/2022\/07\/version-sans-chaine_00-2048x1297.jpg 2048w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption>Version 2021 sans chaines<\/figcaption><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Extrait d&rsquo;un \u00e9change vers le ESP32 et interpr\u00e9tation<\/h3>\n\n\n\n<p>Comme le \u00abUSB HOST-ARDUINO\u00bb doit pouvoir servir au contr\u00f4le de divers syst\u00e8mes, le code employ\u00e9 est neutre. L&rsquo;association \u00e0 des actions particuli\u00e8res se configure dans le syst\u00e8me \u00e0 contr\u00f4ler. <\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>[ |DATA|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;S| ] &lt;- demande d&rsquo;arr\u00eat des moteurs<\/p>\n\n\n\n<p>[ |DATA|U&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;| ] &lt;- Demande d&rsquo;avancer<\/p>\n\n\n\n<p>[ |DATA|D&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;| ] &lt;- Demande de reculer<\/p>\n\n\n\n<p>[ |DATA|-R&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;| ] &lt;- Demande de tourner \u00e0 droite<\/p>\n\n\n\n<p>[ |DATA|-L&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;| ] &lt;- Demande de tourner \u00e0 gauche<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Programmation<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Le programme du v\u00e9hicule<\/h4>\n\n\n\n<p>Le programme est divis\u00e9 en deux fichiers. Ils doivent \u00eatre plac\u00e9s dans le m\u00eame r\u00e9pertoire nomm\u00e9 \u00ab<strong>Tondeuse_teleguidee_CMD_PS4_ESP32_V16_B<\/strong>\u00bb <\/p>\n\n\n\n<p><strong>Tondeuse_teleguidee_CMD_PS4_ESP32_V16_B.ino<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/*\n * \n *  Cr\u00e9ation : 2018-03-22\n *  Auteur : Richard Morel \n * \n * \n * Modifications\n *  2019-06-20\n *    - Lors des virages le moteur \u00e0 l'int\u00e9rieur du virage est non aliment\u00e9\n *    \n *  2019-06-21\n *    - Lors des virages les moteurs tournent dans le sens oppos\u00e9 l'un de l'autre\n *    \n *  2019-06-22  \n *    - Le mode de fonctionnement de la roue int\u00e9rieur lors d'un virage est optionnelle\n *      Un clic de la touche Cercle  vitesse = 0\n *      Un clic de la touche Carr\u00e9   vitesse = 100\n *      \n *  2019-07-30\n *    Ajout de validation des \u00e9changes\n *    Si il n'y a aucune communication depuis plus de 300ms\n *    l'ordre est envoy\u00e9 d'arr\u00eater les moteurs\n *  \n *  2019-07-30\n *    Ajout d'un chien de garde en cas de blocage de programme\n *    \n *  2019-08-12\n *    Ajout de la variable boSensAvance pour d\u00e9terminer le sens de d\u00e9placement\n *    Le contr\u00f4le des moteurs lors des changements de direction d\u00e9pend du sens de d\u00e9placement\n *    juste avant le changement de direction\n *    \n *  2019-10-04\n *    Adapter \u00e0 la nouvelle configuration du r\u00e9cepteur de la manette USBHOST-ARDUINO\n *    \n *    \n *  *      ADRESSE BLUETOOTH VOITURETTE : 211345651\n *  *                   HC05 51\n *  \n * *** There are three serial ports on the ESP known as U0UXD, U1UXD and U2UXD.\n * \n * U0UXD is used to communicate with the ESP32 for programming and during reset\/boot.\n * U1UXD is unused and can be used for your projects. Some boards use this port for SPI Flash access though\n * U2UXD is unused and can be used for your projects.\n * \n*\/\n\n\n#include \"configuration.h\"\n#include \"esp_system.h\"   \/\/ Pour le watch Dog\n\n#define RXD2 16\n#define TXD2 17\n\n    \n\/\/HardwareSerial Serial2(2);\n\n\n\/\/************************************************************************\n\/\/\n\/\/ FONCTION FONCTION FONCTION FONCTION FONCTION FONCTION FONCTION FONCTION\n\/\/\n\/\/************************************************************************\n\n\/\/  ledcAttachPin(FwrdSpeedMotRight, pwmChannel_0);\n\/\/  ledcAttachPin(RvrsSpeedMotRight, pwmChannel_1); \n\/\/  ledcAttachPin(FwrdSpeedMotLeft,  pwmChannel_2);\n\/\/  ledcAttachPin(RvrsSpeedMotLeft,  pwmChannel_3);\n\n\/*motor control*\/\nvoid go_Advance(void)  \/\/Forward\n{\n  \/\/ Pour faire avancer le v\u00e9hicule le moteur de gauche\n  \/\/ doit tourner dans le sens anti-horaire\n  \/\/ Pour simplifier la programmation, le moteur est relier \n  \/\/ en polarit\u00e9 inverse sur le contr\u00f4leur BTS7960\n  \n  digitalWrite(FwrdEnMotRight, HIGH); \n  digitalWrite(RvrsEnMotRight, HIGH); \n  digitalWrite(FwrdEnMotLeft,  HIGH);\n  digitalWrite(RvrsEnMotLeft,  HIGH); \n  ledcWrite(pwmChannel_0, vitesse);  \/\/ FwrdSpeedMotRight\n  ledcWrite(pwmChannel_2, vitesse);  \/\/ FwrdSpeedMotLeft    \n  ledcWrite(pwmChannel_1, 000);      \/\/ RvrsSpeedMotRight \n  ledcWrite(pwmChannel_3, 000);      \/\/ RvrsSpeedMotLeft\n}\n\nvoid go_Right(void)  \/\/Turn right\n{\n  digitalWrite(FwrdEnMotRight, HIGH);\n  digitalWrite(RvrsEnMotRight, HIGH);\n  digitalWrite(FwrdEnMotLeft,  HIGH);\n  digitalWrite(RvrsEnMotLeft,  HIGH); \n  if (boSensAvance){\n  ledcWrite(pwmChannel_0, 000);          \/\/ FwrdSpeedMotRight\n  ledcWrite(pwmChannel_2, 255);          \/\/ FwrdSpeedMotLeft\n  ledcWrite(pwmChannel_1, vitesseRInt);  \/\/ RvrsSpeedMotRight\n  ledcWrite(pwmChannel_3, 000);          \/\/ RvrsSpeedMotLeft\n  } \n  else{\n  ledcWrite(pwmChannel_0, 000);          \/\/ FwrdSpeedMotRight\n  ledcWrite(pwmChannel_2, vitesseRInt);  \/\/ FwrdSpeedMotLeft\n  ledcWrite(pwmChannel_1, 255);          \/\/ RvrsSpeedMotRight\n  ledcWrite(pwmChannel_3, 000);          \/\/ RvrsSpeedMotLeft \n  }\n}\n\nvoid go_Left(void)  \/\/Turn left\n{\n  digitalWrite(FwrdEnMotRight, HIGH);\n  digitalWrite(RvrsEnMotRight, HIGH); \n  digitalWrite(FwrdEnMotLeft,  HIGH);\n  digitalWrite(RvrsEnMotLeft,  HIGH); \n  if (boSensAvance){\n    ledcWrite(pwmChannel_0, 255);          \/\/ FwrdSpeedMotRight\n    ledcWrite(pwmChannel_2, 000);          \/\/ FwrdSpeedMotLeft\n    ledcWrite(pwmChannel_1, 000);          \/\/ RvrsSpeedMotRight\n    ledcWrite(pwmChannel_3, vitesseRInt);  \/\/ RvrsSpeedMotLeft\n  }  \n  else{\n    ledcWrite(pwmChannel_0, vitesseRInt);  \/\/ FwrdSpeedMotRight\n    ledcWrite(pwmChannel_2, 000);          \/\/ FwrdSpeedMotLeft\n    ledcWrite(pwmChannel_1, 000);          \/\/ RvrsSpeedMotRight\n    ledcWrite(pwmChannel_3, 255);          \/\/ RvrsSpeedMotLeft  \n  }\n}\n\nvoid go_Back(void)  \/\/Reverse\n{\n  digitalWrite(FwrdEnMotRight, HIGH);\n  digitalWrite(RvrsEnMotRight, HIGH);\n  digitalWrite(FwrdEnMotLeft,  HIGH);\n  digitalWrite(RvrsEnMotLeft,  HIGH); \n  ledcWrite(pwmChannel_0, 000);      \/\/ FwrdSpeedMotRight\n  ledcWrite(pwmChannel_2, 000);      \/\/ FwrdSpeedMotLeft\n  ledcWrite(pwmChannel_1, vitesse);  \/\/ RvrsSpeedMotRight\n  ledcWrite(pwmChannel_3, vitesse);  \/\/ RvrsSpeedMotLeft\n}\nvoid stop_Stop()    \/\/Stop\n{\n  digitalWrite(FwrdEnMotRight, LOW);\n  digitalWrite(RvrsEnMotRight, LOW);\n  digitalWrite(FwrdEnMotLeft,  LOW);\n  digitalWrite(RvrsEnMotLeft,  LOW); \n}\n\n\n\nvoid augmente_Vitesse()\n{\n  vitesse = vitesse + 10;\n  if (vitesse > 255){ vitesse = 255;}\n  \/\/Serial.print(\"Vitesse : \");\n  \/\/Serial.println(vitesse);\n}\n\n\nvoid diminue_Vitesse()\n{\n  vitesse = vitesse - 10;\n  if (vitesse > 255){ vitesse = 0;} \/\/ vitesse est unsigned int  \n  \/\/Serial.print(\"Vitesse : \");\n  \/\/Serial.println(vitesse);\n}\n\nvoid annuleDataLu()  \/\/ annule le dataLu et FORCE UN ARR\u00caT\n{       \n  actionRightHatY = 0;\n  actionRightHatX = 0;\n  actionLeftHatY  = 0;\n  actionLeftHatX  = 0;\n  actionBoutonR2  = 0; \/\/ AnalogButton(R2)\n  actionBoutonL2  = 0; \/\/ AnalogButton(L2)\n  boutonTriangle  = 0; \/\/ boutonTriangle\n  boutonCircle    = 0; \/\/ boutonCircle\n  boutonCross     = 0; \/\/ boutonCross\n  boutonSquare    = 0; \/\/ boutonSquare\n  boutonUp        = 0; \/\/ boutonUp\n  boutonRight     = 0; \/\/ boutonRight\n  boutonDown      = 0; \/\/ boutonDown\n  boutonLeft      = 0; \/\/ boutonLeft\n  boutonL1        = 0; \/\/ boutonL1\n  boutonL3        = 0; \/\/ boutonL3\n  boutonR1        = 0; \/\/ boutonR1\n  boutonR3        = 0; \/\/ boutonR3\n  boutonShare     = 0; \/\/ boutonShare\n  boutonOptions   = 0; \/\/ boutonOptions\n  boutonTouchpad  = 0; \/\/ boutonTouchpad\n  actionJsStop    = 83; \/\/ Joystick Right au centre S STOP  \n}\n\nvoid IRAM_ATTR resetModule() {\n  ets_printf(\"reboot\\n\");\n  esp_restart();\n}\n\n\/\/************************************************************************\n\/\/\n\/\/ SETUP   SETUP   SETUP   SETUP   SETUP   SETUP   SETUP  SETUP  SETUP\n\/\/\n\/\/************************************************************************\n\nvoid setup() {\n  startCmptDelaiSansCOMM = millis();\n  \/\/ Note the format for setting a serial port is as follows: Serial2.begin(baud-rate, protocol, RX pin, TX pin);\n  Serial.begin(115200);\n  Serial.println(\"Programme : Tondeuse_teleguidee_CMD_PS4_ESP32_V16_B\");\n  Serial2.begin(115200, SERIAL_8N1, RXD2, TXD2);\n  Serial.println(\"Serial Rxd2 is on pin: \"+String(RXD2));\n  Serial.println(\"Serial Txd2 is on pin: \"+String(TXD2));\n\n\n  pinMode(FwrdEnMotRight ,   OUTPUT); \n  pinMode(FwrdSpeedMotRight, OUTPUT); \n  pinMode(RvrsSpeedMotRight, OUTPUT);  \n  pinMode(RvrsEnMotRight,    OUTPUT);\n\n  pinMode(FwrdEnMotLeft   ,  OUTPUT); \n  pinMode(FwrdSpeedMotLeft,  OUTPUT); \n  pinMode(RvrsSpeedMotLeft,  OUTPUT);  \n  pinMode(RvrsEnMotLeft ,    OUTPUT);\n\n\n\n  stop_Stop();\n\n  \/\/ configure LED PWM functionalitites\n  ledcSetup(pwmChannel_0, freq, resolution);\n  ledcSetup(pwmChannel_1, freq, resolution);\n  ledcSetup(pwmChannel_2, freq, resolution);\n  ledcSetup(pwmChannel_3, freq, resolution);\n  \n  \/\/ attach the channel to the GPIO to be controlled\n  ledcAttachPin(FwrdSpeedMotRight, pwmChannel_0);\n  ledcAttachPin(RvrsSpeedMotRight, pwmChannel_1); \n  ledcAttachPin(FwrdSpeedMotLeft,  pwmChannel_2);\n  ledcAttachPin(RvrsSpeedMotLeft,  pwmChannel_3);\n\n  \/** Pour le chien de garde **\/\n  timer = timerBegin(0, 80, true);                  \/\/timer 0, div 80\n  timerAttachInterrupt(timer, &amp;resetModule, true);  \/\/attach callback\n  timerAlarmWrite(timer, wdtTimeout * 1000, false); \/\/set time in us\n  timerAlarmEnable(timer);                          \/\/enable interrupt\n}\n\n\n\/\/************************************************************************\n\/\/\n\/\/ LOOP   LOOP   LOOP   LOOP   LOOP   LOOP   LOOP  LOOP  LOOP\n\/\/\n\/\/************************************************************************\n\n\nvoid loop() { \/\/Choose Serial1 or Serial2 as required\n    timerWrite(timer, 0); \/\/reset timer (feed watchdog)\n\n   \/\/ Timer pour le KEEP-ALIVE\n   diffMillisecondeCOMM = millis() - startCmptDelaiSansCOMM;\n   \/\/Serial.println(diffMillisecondeCOMM);\n   if (diffMillisecondeCOMM > 300){ \/\/ Au moins une r\u00e9ception valide au 300 ms\n       stop_Stop();  \/\/ ARR\u00caTE TOUT\n       boAnnuleDataLu = true;\n       Serial.println(\"Pas de communication valide avec le contr\u00f4leur\");\n       startCmptDelaiSansCOMM = millis(); \n   }\n   \n   if(Serial2.available()) {\n      \/\/Serial.print(char(Serial2.read()));\n      boAnnuleDataLu = false;  \n      \n      unsigned int dataLu = Serial2.read();\n      \/\/Serial.print(dataLu);\n      \/\/Serial.print(\" \");\n      if ((dataLu) == 91){  \/\/ 91 = [\n        \/\/****** D\u00e9but de trame *****\n         i = 0;\n         boTrameValide = true;\n      }\n      if (boTrameValide){\n         CmdPS4[i]= dataLu;\n\n         Serial.print(char(CmdPS4[i])); \/\/ POUR SUIVRE LA TRAME RE\u00c7UE\n         i++;\n         if ((dataLu) == 93){  \/\/ = ]\n            \/\/****** Fin de trame *****\n            startCmptDelaiSansCOMM = millis(); \/\/ R\u00e9initialise le compteur de d\u00e9lai de non communication\n            boTrameValide = false;\n            \/\/Serial.println(\"\");\n            Serial.println(i);\n            i = 0;\n         }\n       }\n  } \/\/ fin du if(Serial2.available()) \n\n  if (boAnnuleDataLu) {  \/\/ annule le dataLu et FORCE UN ARR\u00caT\n     annuleDataLu();\n  }\n  \n  actionRightHatY = CmdPS4[8];\n  actionRightHatX = CmdPS4[9];\n  actionLeftHatY  = CmdPS4[10];\n  actionLeftHatX  = CmdPS4[11];\n  actionBoutonL2  = CmdPS4[12]; \/\/ AnalogButton(L2)\n  actionBoutonR2  = CmdPS4[13]; \/\/ AnalogButton(R2)\n  boutonTriangle  = CmdPS4[14]; \/\/ boutonTriangle\n  boutonCircle    = CmdPS4[15]; \/\/ boutonCircle\n  boutonCross     = CmdPS4[16]; \/\/ boutonCross\n  boutonSquare    = CmdPS4[17]; \/\/ boutonSquare\n  boutonUp        = CmdPS4[18]; \/\/ boutonUp\n  boutonRight     = CmdPS4[19]; \/\/ boutonRight\n  boutonDown      = CmdPS4[20]; \/\/ boutonDown\n  boutonLeft      = CmdPS4[21]; \/\/ boutonLeft\n  boutonL1        = CmdPS4[22]; \/\/ boutonL1\n  boutonL3        = CmdPS4[23]; \/\/ boutonL3\n  boutonR1        = CmdPS4[24]; \/\/ boutonR1\n  boutonR3        = CmdPS4[25]; \/\/ boutonR3\n  boutonShare     = CmdPS4[26]; \/\/ boutonShare\n  boutonOptions   = CmdPS4[27]; \/\/ boutonOptions\n  boutonTouchpad  = CmdPS4[28]; \/\/ boutonTouchpad \n  actionJsStop    = CmdPS4[29]; \/\/ Joystick Right au centre\n\n    \n  \/\/Serial.println(char(CmdPS4[29]));\n\n \/\/ vitesse    = 127;\n  vitesseL   = vitesse;\n  vitesseR   = vitesse;\n\n  if (actionJsStop == 83) {         \/\/ S ---> Stop\n     \/\/Serial.println(\"JoyStick Stop\");\n      stop_Stop();\n  }\n  \n  if (actionRightHatY == 85) {      \/\/ U ---> Avance\n      \/\/Serial.println(\"Avance\");\n      boSensAvance = true;\n      go_Advance();\n  }\n\n  if (actionRightHatY == 68) {      \/\/ D ---> Recule\n    \/\/ Serial.println(\"Recule\");\n      boSensAvance = false;\n      go_Back();\n  }\n  \n  if (actionRightHatX == 82) {      \/\/ R ---> Tourne \u00e0 DROITE\n    \/\/ Serial.println(\"Tourne \u00e0 DROITE\");\n      go_Right();\n  }\n  \n  if (actionRightHatX == 76) {      \/\/ L ---> Tourne \u00e0 GAUCHE\n    \/\/ Serial.println(\"Tourne \u00e0 GAUCHE\");\n      go_Left();\n  }\n  \n  if (boutonTriangle == 84) {       \/\/ T ---> Augmente la vitesse\n    \/\/Serial.println(\"Augmente la vitesse\");\n    augmente_Vitesse();\n    CmdPS4[14] = 0;\n  }\n\n  if (boutonCross   == 88) {       \/\/ X ---> Diminue la vitesse\n    \/\/Serial.println(\"Diminue la vitesse\");\n    diminue_Vitesse();\n    CmdPS4[16] = 0;\n  }\n  \n  if (boutonCircle  == 67) {      \/\/ C ---> vitesse roue\n      vitesseRInt = 0;            \/\/   \u00e0 l'int\u00e9rieur du virage = 0\n  }\n  \n  if (boutonSquare  == 83) {      \/\/ S ---> vitesse roue\n      vitesseRInt = 100;          \/\/   \u00e0 l'int\u00e9rieur du virage = 100\n  }\n  \n}  \/\/ Fin du loop()<\/pre>\n\n\n\n<p><strong>configuration.h<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/*\n              BRANCHEMENT POUR ESP32\n*\/\n\/\/Define BTS7960 (IBT-2) H-Bridge Motor Controller Pins\n\n#define FwrdEnMotRight    33         \/\/ (BLEU) - R_EN - FORWARD enable  motor Right\n#define FwrdSpeedMotRight 25         \/\/ (JAUNE)- RPWM - FORWARD speed   motor Right\n#define RvrsSpeedMotRight 26         \/\/ (VERT) - LPWM - REVERSE speed   motor Right\n#define RvrsEnMotRight    27         \/\/ (GRIS) - L_EN - REVERSE enable  motor Right\n\n#define FwrdEnMotLeft     14         \/\/ (BLEU) - R_EN - FORWARD enable  motor Left\n#define FwrdSpeedMotLeft  04         \/\/ (JAUNE)- RPWM - FORWARD speed   motor Left\n#define RvrsSpeedMotLeft  15         \/\/ (VERT) - LPWM - REVERSE speed   motor Left\n#define RvrsEnMotLeft     00         \/\/ (GRIS) - L_EN - REVERSE enable  motor Left\n\n\/\/ Setting PWM properties\nconst int freq                = 500;\nconst int pwmChannel_0        = 0;\nconst int pwmChannel_1        = 1;\nconst int pwmChannel_2        = 2;\nconst int pwmChannel_3        = 3;\nconst int resolution          = 8; \/\/(8 bits -> 0-255)\n\nunsigned int vitesse          = 255;\nunsigned int vitesseL         = 0;\nunsigned int vitesseR         = 0;\nunsigned int vitesseRInt      = 0;\nbool boSensAvance             = true;\n\nunsigned int actionRightHatY  = 0; \nunsigned int actionRightHatX  = 0;\nunsigned int actionLeftHatY   = 0; \nunsigned int actionLeftHatX   = 0;\n\nunsigned int leftHatX         = 0;\nunsigned int leftHatY         = 0;  \nunsigned int rightHatX        = 0;\nunsigned int rightHatY        = 0;\nunsigned int actionBoutonR2   = 0;\nunsigned int actionBoutonL2   = 0;\n\nunsigned int boutonTriangle   = 0;\nunsigned int boutonCircle     = 0;\nunsigned int boutonCross      = 0;\nunsigned int boutonSquare     = 0;\nunsigned int boutonUp         = 0;\nunsigned int boutonRight      = 0;\nunsigned int boutonDown       = 0;\nunsigned int boutonLeft       = 0;\nunsigned int boutonL1         = 0;\nunsigned int boutonL3         = 0;\nunsigned int boutonR1         = 0;\nunsigned int boutonR3         = 0;\nunsigned int boutonShare      = 0;\nunsigned int boutonOptions    = 0;\nunsigned int boutonTouchpad   = 0;\n\nunsigned int actionJsStop     = 0;\n\nint i                         = 0;\nunsigned char CmdPS4[60]      = \"\";\nbool boTrameValide            = false;\nbool boAnnuleDataLu           = false;\n\nuint64_t startCmptDelaiSansCOMM = 0;\nuint32_t diffMillisecondeCOMM   = 0;\n\nconst int wdtTimeout = 2000;  \/\/time in ms to trigger the watchdog\nhw_timer_t *timer    = NULL;<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Le programme  du \u00abUSB HOST-ARDUINO\u00bb. Contr\u00f4leur jumel\u00e9 \u00e0 la manette. <\/h4>\n\n\n\n<p>Le programme est compos\u00e9 d\u2019un fichier. Il doit \u00eatre plac\u00e9 dans le r\u00e9pertoire nomm\u00e9 \u00ab<strong>Manette_PS4_CTRL_CAR_BT-HC05_MASTER_SC_2<\/strong>4\u00bb <\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/*\n *        Contr\u00f4leur associ\u00e9 avec une manette PS4\n *    PS4 + USB Host shield 2 + Bluetooth HC-05 MAITRE \n *    \n *  2019-06-02  \n *  Cr\u00e9ation: Richard Morel\n *  \n * Adapt\u00e9 de : \n * Example sketch for the PS4 Bluetooth library - developed by Kristian Lauszus\n * For more information visit my blog: http:\/\/blog.tkjelectronics.dk\/ or\n * http:\/\/blog.tkjelectronics.dk\/2014\/01\/ps4-controller-now-supported-by-the-usb-host-library\/#comment-85113\n * or send me an e-mail:  kristianl@tkjelectronics.com\n * \n * Info boutons manette PS4\n * https:\/\/manuals.playstation.net\/document\/gb\/ps4\/basic\/pn_controller.html\n *\/\n\n#include &lt;PS4BT.h>\n#include &lt;usbhub.h>\n\n\/\/ Satisfy the IDE, which needs to see the include statment in the ino too.\n#ifdef dobogusinclude\n#include &lt;spi4teensy3.h>\n#endif\n#include &lt;SPI.h>\n\nbool boCmdTransmit    = false;\n\nint actionRightHatY   = 0; \nint actionRightHatX   = 0;\nint oldRightHatY      = 0; \nint oldRightHatX      = 0;\n\nint actionLeftHatY    = 0; \nint actionLeftHatX    = 0;\nint oldLeftHatY       = 0; \nint oldLeftHatX       = 0;\n\nint actionBoutonL2    = 0; \nint actionBoutonR2    = 0;\nint oldBoutonL2       = 0; \nint oldBoutonR2       = 0;\n\nint boutonTriangle    = 0;\nint boutonCircle      = 0;\nint boutonCross       = 0;\nint boutonSquare      = 0;\nint boutonUp          = 0;\nint boutonRight       = 0;\nint boutonDown        = 0;\nint boutonLeft        = 0;\nint boutonL1          = 0;\nint boutonL3          = 0;\nint boutonR1          = 0;\nint boutonR3          = 0;\nint boutonShare       = 0;\nint boutonOptions     = 0;\nint boutonTouchpad    = 0;\n\nint actionJsStop      = 0;\nint oldJsStop         = 0;\n\n\nuint64_t startCmptDelaiSansCOMM = 0;\nuint64_t diffMillisecondeCOMM   = 0;\n\nUSB Usb;\n\/\/USBHub Hub1(&amp;Usb); \/\/ Some dongles have a hub inside\nBTD Btd(&amp;Usb); \/\/ You have to create the Bluetooth Dongle instance like so\n\n\/* You can create the instance of the PS4BT class in two ways *\/\n\/\/ This will start an inquiry and then pair with the PS4 controller - you only have to do this once\n\/\/ You will need to hold down the PS and Share button at the same time, \n\/\/ the PS4 controller will then start to blink rapidly indicating that it is in pairing mode\n\n\/* Vous pouvez cr\u00e9er l'instance de la classe PS4BT de deux mani\u00e8res *\/\n\/\/ Cela lancera une requ\u00eate, puis jumelera le USB HOSt avec le contr\u00f4leur PS4 - vous ne devez le faire qu'une fois\n\/\/ Vous devrez maintenir simultan\u00e9ment les boutons PS et Share enfonc\u00e9s, \n\/\/ le contr\u00f4leur PS4 se mettra alors \u00e0 clignoter rapidement pour indiquer qu'il est en mode de couplage.\n\n\/\/PS4BT PS4(&amp;Btd, PAIR);\n\n\/\/ PS s'affiche lorsque le jumelage est compl\u00e9t\u00e9. Mettre (PS4BT PS4(&amp;Btd, PAIR);) en commentaire\n\/\/ et enlever \u00ab\/\/\u00bb \u00e0 (PS4BT PS4(&amp;Btd);) puis retransf\u00e9rer le programme dans l'Arduino\n\n\/\/ After that you can simply create the instance like so and then press the PS button on the device\n\/\/ Apr\u00e8s cela, vous pouvez simplement cr\u00e9er l\u2019instance comme suit, puis appuyer sur le bouton PS de l\u2019appareil.\n\/\/ PS4BT PS4(&amp;Btd);\n\nPS4BT PS4(&amp;Btd);\n\nint state = 0;\n\n\n\/\/************************************************************************\n\/\/\n\/\/ FONCTION FONCTION FONCTION FONCTION FONCTION FONCTION FONCTION FONCTION\n\/\/\n\/\/************************************************************************\n\n\nvoid transmetCommandes()\n{\n int inPauseDeTransmission = 1;  \/\/ Si requis, temporisation pour \u00e9viter les engorgements   \n      Serial.write(\"[ |\");                           delay(inPauseDeTransmission);\n      Serial.write(\"DATA|\");                         delay(inPauseDeTransmission);\n      Serial.write(actionRightHatY);                 delay(inPauseDeTransmission);\n      Serial.write(actionRightHatX);                 delay(inPauseDeTransmission);\n      Serial.write(actionLeftHatY);                  delay(inPauseDeTransmission);\n      Serial.write(actionLeftHatX);                  delay(inPauseDeTransmission);\n      Serial.write(actionBoutonL2);                  delay(inPauseDeTransmission);\n      Serial.write(actionBoutonR2);                  delay(inPauseDeTransmission);\n      Serial.write(boutonTriangle);                  delay(inPauseDeTransmission);\n      Serial.write(boutonCircle);                    delay(inPauseDeTransmission);\n      Serial.write(boutonCross);                     delay(inPauseDeTransmission);\n      Serial.write(boutonSquare);                    delay(inPauseDeTransmission);\n      Serial.write(boutonUp);                        delay(inPauseDeTransmission);\n      Serial.write(boutonRight);                     delay(inPauseDeTransmission);\n      Serial.write(boutonDown);                      delay(inPauseDeTransmission);\n      Serial.write(boutonLeft);                      delay(inPauseDeTransmission);\n      Serial.write(boutonL1);                        delay(inPauseDeTransmission);\n      Serial.write(boutonL3);                        delay(inPauseDeTransmission);\n      Serial.write(boutonR1);                        delay(inPauseDeTransmission);\n      Serial.write(boutonR3);                        delay(inPauseDeTransmission);\n      Serial.write(boutonShare);                     delay(inPauseDeTransmission);\n      Serial.write(boutonOptions);                   delay(inPauseDeTransmission);\n      Serial.write(boutonTouchpad);                  delay(inPauseDeTransmission);\n      Serial.write(actionJsStop);                    delay(inPauseDeTransmission);      \n      Serial.write(\"| ]\");                           delay(inPauseDeTransmission);\n      Serial.println(); \n} \n\nvoid  cmdStop()\n{\n      actionJsStop    = 83; \/\/ S STOP LA MACHINE\n}     \n\nvoid  initCmd()\n{\n      actionRightHatY = 45; \/\/ code ASCII pour -\n      actionRightHatX = 45;\n      actionLeftHatY  = 45;\n      actionLeftHatX  = 45;\n      actionBoutonL2  = 45;\n      actionBoutonR2  = 45;\n      boutonTriangle  = 45;\n      boutonCircle    = 45;\n      boutonCross     = 45;\n      boutonSquare    = 45;\n      boutonUp        = 45;\n      boutonRight     = 45;\n      boutonDown      = 45;  \n      boutonLeft      = 45;\n      boutonL1        = 45;\n      boutonL3        = 45;\n      boutonR1        = 45;\n      boutonR3        = 45;\n      boutonShare     = 45;\n      boutonOptions   = 45;\n      boutonTouchpad  = 45;\n      actionJsStop    = 45;\n}  \n\n      \n\/\/************************************************************************\n\/\/\n\/\/ SETUP   SETUP   SETUP   SETUP   SETUP   SETUP   SETUP  SETUP  SETUP\n\/\/\n\/\/************************************************************************\n\n      \nvoid setup() {\n  Serial.begin(115200);\n  Serial.println(\"Programme : Manette_PS4_CTRL_CAR_BT-HC05_MASTER_SC_24\"); \n#if !defined(__MIPSEL__)\n  while (!Serial); \/\/ Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection\n#endif\n  if (Usb.Init() == -1) {\n    Serial.print(F(\"\\r\\nOSC did not start\"));\n    while (1); \/\/ Halt\n  }\n  Serial.print(F(\"\\r\\nPS4 Bluetooth Library Started\"));\n\n  startCmptDelaiSansCOMM = millis();\n}\n\n\n\/\/************************************************************************\n\/\/\n\/\/ LOOP   LOOP   LOOP   LOOP   LOOP   LOOP   LOOP  LOOP  LOOP\n\/\/\n\/\/************************************************************************\n\nvoid loop() {\n  if (boCmdTransmit){   \n     transmetCommandes();\n     startCmptDelaiSansCOMM = millis();\n     boCmdTransmit = false;\n  } \/\/ Fin du if ( boCmdTransmit){\n\n  \/\/ Timer pour le KEEP-ALIVE\n  \/\/ Si aucune commande requise par l'op\u00e9rateur depuis 200ms envoie la commande STOP\n  diffMillisecondeCOMM = millis() - startCmptDelaiSansCOMM;\n  if (diffMillisecondeCOMM > 200){ \/\/ Au moins une transmission au 200 ms  \n      initCmd();                   \/\/ Remet les commandes \u00e0 - par d\u00e9faut\n      actionJsStop    = 83;        \/\/ S STOP\n      boCmdTransmit = true;\n      \/\/Serial.print(\"KA \" );  \n  }\n  \n   if(Serial.available() > 0){ \/\/ Checks whether data is comming from the serial port\n    state = Serial.read();     \/\/ Reads the data from the serial port\n  }\n\n  Usb.Task();\n  if (PS4.connected()) {\n       initCmd();\n\n      \/\/ --  La manette PS4 envoie en continue les valeurs analogiques\n      \/\/ --  La manette PS4 envoie l'\u00e9tat du bouton seulement au moment du click\n\n      \/\/*********** JOYSTICK DE DROITE *************\n      if (PS4.getAnalogHat(RightHatY) &lt; 25) {\n          actionRightHatY   = 85;  \/\/ U\n          oldJsStop         = 0;\n          \/\/ Logique pour limiter la transmission sur le changement analogique\n          \/\/ et indirectement au Keep-Alive si la condition est maintenue\n          if (oldRightHatY != actionRightHatY){\n             boCmdTransmit = true;\n             oldRightHatY = actionRightHatY;\n          }    \n      }\n      \n      if (PS4.getAnalogHat(RightHatY) > 200) {\n          actionRightHatY   = 68;  \/\/ D\n          oldJsStop = 0;\n          if (oldRightHatY != actionRightHatY){\n              boCmdTransmit = true;\n              oldRightHatY = actionRightHatY; \n          }               \n      }\n            \n      if (PS4.getAnalogHat(RightHatX) > 200) {\n           actionRightHatX   = 82;  \/\/ R\n           oldJsStop = 0;\n           if (oldRightHatX != actionRightHatX){\n              boCmdTransmit = true;\n              oldRightHatX = actionRightHatX; \n          } \n      }\n\n      if (PS4.getAnalogHat(RightHatX) &lt; 25) {\n           actionRightHatX   = 76;  \/\/ L\n           oldJsStop = 0;\n           if (oldRightHatX != actionRightHatX){\n              boCmdTransmit = true;\n              oldRightHatX = actionRightHatX;   \n          } \n      }\n\n      if (PS4.getAnalogHat(RightHatY) >= 25 &amp;&amp; PS4.getAnalogHat(RightHatY) &lt;= 200 &amp;&amp; PS4.getAnalogHat(RightHatX) >= 25 &amp;&amp; PS4.getAnalogHat(RightHatX) &lt;= 200) {\n           actionJsStop   = 83;  \/\/ S\n           oldRightHatY = 0;\n           oldRightHatX = 0;  \n           if (oldJsStop != actionJsStop){\n              boCmdTransmit = true;\n              oldJsStop = actionJsStop;\n          } \n      }\n\n      \/\/************ JOYSTICK DE GAUCHE *****************\n      if (PS4.getAnalogHat(LeftHatY) &lt; 25) {\n          actionLeftHatY   = 85;  \/\/ U\n          if (oldLeftHatY != actionLeftHatY){\n             boCmdTransmit = true;\n             oldLeftHatY   = actionLeftHatY;\n             oldJsStop = 0;\n          }    \n      }\n      \n      if (PS4.getAnalogHat(LeftHatY) > 200) {\n          actionLeftHatY   = 68;  \/\/ D\n          if (oldLeftHatY != actionLeftHatY){\n              boCmdTransmit = true;\n              oldLeftHatY = actionLeftHatY;\n              oldJsStop = 0;\n          }               \n      }\n            \n      if (PS4.getAnalogHat(LeftHatX) > 200) {\n           actionLeftHatX   = 76;  \/\/ L\n           if (oldLeftHatX != actionLeftHatX){\n              boCmdTransmit = true;\n              oldLeftHatX = actionLeftHatX;\n              oldJsStop = 0; \n          } \n      }\n\n      if (PS4.getAnalogHat(LeftHatX) &lt; 25) {\n           actionLeftHatX   = 82;  \/\/ R\n           if (oldLeftHatX != actionLeftHatX){\n             boCmdTransmit = true;\n             oldLeftHatX = actionLeftHatX;\n             oldJsStop = 0;   \n          } \n      }\n\n      if (PS4.getAnalogHat(LeftHatY) >= 25 &amp;&amp; PS4.getAnalogHat(LeftHatY) &lt;= 200 &amp;&amp; PS4.getAnalogHat(LeftHatX) >= 25 &amp;&amp; PS4.getAnalogHat(LeftHatX) &lt;= 200) {\n           oldLeftHatY = 0;\n           oldLeftHatX = 0;  \n      }\n\n     if (PS4.getAnalogButton(L2) || PS4.getAnalogButton(R2)) {\n     }\n\n    \/\/ VALIDATION DES BOUTONS\n     if (PS4.getButtonClick(PS)) {\n         Serial.print(F(\"\\r\\nPS Disconnect\"));\n         PS4.disconnect();\n       }\n       else {\n         if (PS4.getButtonClick(TRIANGLE)) {\n            boutonTriangle = 84;  \/\/ T\n            boCmdTransmit  = true;\n         }\n         if (PS4.getButtonClick(CIRCLE)) {\n            boutonCircle   = 67;  \/\/ C\n            boCmdTransmit  = true;\n         }\n         if (PS4.getButtonClick(CROSS)) {\n            boutonCross    = 88;  \/\/ X\n            boCmdTransmit  = true;\n         }\n         if (PS4.getButtonClick(SQUARE)) {\n            boutonSquare   = 83;  \/\/ S\n            boCmdTransmit  = true;\n         }\n      \n         if (PS4.getButtonClick(UP)) {\n            boutonUp       = 85;  \/\/ U\n            boCmdTransmit = true;\n         } \n         if (PS4.getButtonClick(RIGHT)) {\n            boutonRight    = 82;  \/\/ R\n            boCmdTransmit  = true;\n         } \n         if (PS4.getButtonClick(DOWN)) {\n            boutonDown     = 68;  \/\/ D\n            boCmdTransmit = true;\n         }\n         if (PS4.getButtonClick(LEFT)) {\n            boutonLeft     = 76;  \/\/ L\n            boCmdTransmit  = true;\n         }\n\n         if (PS4.getButtonClick(L1)){\n            boutonL1       = 108;  \/\/ l\n            boCmdTransmit  = true;\n         }   \n         if (PS4.getButtonClick(L3)){\n            boutonL3       = 76; \/\/ L\n            boCmdTransmit = true;\n         }\n         if (PS4.getButtonClick(R1)){\n            boutonR1       = 114; \/\/ r\n            boCmdTransmit = true;\n         }\n         if (PS4.getButtonClick(R3)){\n            boutonR3       = 82; \/\/ R\n            boCmdTransmit  = true;\n         }\n         if (PS4.getButtonClick(SHARE)){\n            boutonShare    = 83; \/\/ S\n            boCmdTransmit  = true;\n         }\n         if (PS4.getButtonClick(OPTIONS)) {\n            boutonOptions  = 79; \/\/ O \n            boCmdTransmit = true; \n         }\n         \n        if (PS4.getButtonClick(TOUCHPAD)) {\n            boutonTouchpad = 84; \/\/ T \n            boCmdTransmit  = true; \n        }\n      }\n        \n  }   \/\/ Fin du if (PS4.connected()) { \n  \n  else { \/\/ LA MANETTE PS4 N'EST PAS CONNECT\u00c9E\n      initCmd();                   \/\/ Remet les commandes \u00e0 - par d\u00e9faut\n      actionJsStop    = 83;        \/\/ S STOP\n      boCmdTransmit = true;\n      Serial.println(\"Manette PS4 non connect\u00e9e\"); \n  }\n}     \/\/ Fin du Loop<\/pre>\n\n\n\n<p><\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">R\u00e9f\u00e9rences<\/h3>\n\n\n\n<p><strong><a rel=\"noreferrer noopener\" aria-label=\"Arduino et la manette PS4 (ouverture dans un nouvel onglet)\" href=\"https:\/\/espacerm.com\/webgen\/arduino-et-la-manette-ps4\/\" target=\"_blank\">Arduino et la manette PS4<\/a><\/strong><\/p>\n\n\n\n<p><strong><a rel=\"noreferrer noopener\" aria-label=\"Bluetooth et le circuit HC05 (ouverture dans un nouvel onglet)\" href=\"https:\/\/espacerm.com\/webgen\/bluetooth-et-le-circuit-hc05\/\" target=\"_blank\">Bluetooth et le circuit HC-05<\/a><\/strong><\/p>\n\n\n\n<p><a href=\"https:\/\/espacerm.com\/webgen\/moteur-a-courant-continu\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\" (ouverture dans un nouvel onglet)\">Moteur \u00e0 courant continu<\/a><\/p>\n\n\n\n<p><a rel=\"noreferrer noopener\" aria-label=\"ESP32 et le module Bluetooth HC5 (ouverture dans un nouvel onglet)\" href=\"https:\/\/espacerm.com\/webgen\/esp32-et-le-module-bluetooth-hc5\/\" target=\"_blank\">ESP32 et le module Bluetooth HC-05<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mise en garde Ce montage n&rsquo;est pas un produit fini \u00e0 toute \u00e9preuve. J&rsquo;op\u00e8re dans un environnement contr\u00f4ler o\u00f9 les risques sont minimis\u00e9s. Vous pouvez vous en inspirer, mais la s\u00e9curit\u00e9 est sous votre seule responsabilit\u00e9. But Le but est de contr\u00f4ler le d\u00e9placement d&rsquo;une tondeuse avec une manette de jeux sans fil PS4. \u00c9ventuellement, [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"_links":{"self":[{"href":"https:\/\/espacerm.com\/webgen\/wp-json\/wp\/v2\/pages\/4019"}],"collection":[{"href":"https:\/\/espacerm.com\/webgen\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/espacerm.com\/webgen\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/espacerm.com\/webgen\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/espacerm.com\/webgen\/wp-json\/wp\/v2\/comments?post=4019"}],"version-history":[{"count":84,"href":"https:\/\/espacerm.com\/webgen\/wp-json\/wp\/v2\/pages\/4019\/revisions"}],"predecessor-version":[{"id":4853,"href":"https:\/\/espacerm.com\/webgen\/wp-json\/wp\/v2\/pages\/4019\/revisions\/4853"}],"wp:attachment":[{"href":"https:\/\/espacerm.com\/webgen\/wp-json\/wp\/v2\/media?parent=4019"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}