Outils pour utilisateurs

Outils du site


esp8266:wagons

Différences

Ci-dessous, les différences entre deux révisions de la page.


esp8266:wagons [2024/02/09 17:10] (Version actuelle) – créée - modification externe 127.0.0.1
Ligne 1: Ligne 1:
 +====== Wagons ESP8266 ======
 +Commandes de wagons par un ESP8266, marche/arrêt/avant/arrière/vitesse dans un premier temps.
  
 +C'est une installation faite avec Dominique Leroy
 +http://www.lightzoomlumiere.fr/realisation/circuit-de-david-rolland/
 +
 +Le wagon reçois ses ordres en WIFI/OSC et émet la lecture de balise de positionnement présentes sur les voies.
 +
 +**Le matériel choisi:**
 +  - [[https://www.olimex.com/Products/IoT/ESP8266-EVB/open-source-hardware | Olimex ESP8266-EVB ]]
 +    - [[https://github.com/OLIMEX/ESP8266/blob/master/HARDWARE/MOD-WIFI-ESP8266-DEV/MOD-WIFI-ESP8266-DEV_schematic.pdf|MOD-WIFI-ESP8266-DEV_schematic.pdf]]
 +    - https://github.com/OLIMEX/ESP8266/blob/master/HARDWARE/ESP8266-EVB/ESP8266-EVB_Rev_A.pdf
 +  - [[https://www.olimex.com/Products/RobotParts/MotorDrivers/BB-L298/open-source-hardware| Olimex BB-L298 ]] commande de moteur
 +
 +===== <del>Préparation</del> =====
 +  - Commencer par enlever le strap IO0JP sur la platine ESP pour pouvoir flasher à volonté la bêbête. 
 +    - cf [[https://www.olimex.com/Products/IoT/MOD-WIFI-ESP8266-DEV/resources/MOD-WIFI-ESP8266-DEV_jumper_reference.pdf]], (c'est celui de gauche des 3 strap quand l'antenne est vers le bas)
 +    - pour flasher il faut allumer la platine en maintenant le bouton enfoncé
 +  - avoir une chaine de compilation, je prends celle d'arduino qui fonctionne pour moi cf autres pages la dessus ( https://github.com/esp8266/Arduino )
 +  - librairies à utiliser
 +    - http://cnmat.berkeley.edu/oscuino ou https://github.com/CNMAT/OSC ??
 +    - https://github.com/sandeepmistry/esp8266-OSC
 +    - info la dessus http://trippylighting.com/teensy-arduino-ect/touchosc-and-arduino-oscuino/
 +
 +===== Code de test =====
 +Attention ce n'est pas un arduino, le PWM évolue entre 0 et 1023, c'est sur 10bits ;-)
 +moteur à 40%
 +
 +===== Projet LOCO-DOM =====
 +  * TP-link sur 192.168.0.80
 +  * SSID = LOCOMO
 +  * loco-1
 +    * ip=192.168.0.81
 +    * port=9081
 +  * loco-2
 +    * ip-192.168.0.82
 +    * port=9081
 +  * etc
 +  * test oscsend 192.168.0.81 9081 /moteur ii 500 30
 +
 +===== Connexions =====
 +en travoooo
 +
 +==== Mesure ADC tension batterie 12V ====
 +
 +avec un pont diviseur de tension pour coller entre 1.3V et 3.2V sur 1024, grosso modo
 +  __Vin
 +    |
 +    R1=31k ( orange brun orange )
 +    +---->ADC-ESP
 +    |
 +    R2=10k ( orange noir orange )
 +    |
 +  __GND
 +
 +source calcul du pont http://www.electronique-radioamateur.fr/elec/schema/calcul-diviseur-tension.php
 +, analogRead(A0) me donne 745 avec une batterie chargée...
 +==== Batterie plomb 12V ====
 +les lithium sont trop fragiles pour garantir un bon fonctionnement sur plusieurs années , avec les montages/démontages de l'installation. Nous passons sur de 'bonnes vieilles' plomb en tampon, toujours avec un circuit de maintient de charge. Leur capacité sera en gros d 1Ah, le circuit des rails fournissant suffisamment bien la charge en temps normal. A priori ce sont des vitesses lentes qui seront utilisées donc des consommations de 300 à 400 mA.
 +
 +  * le meme circuit de diode Schottky isolant le chargeur et la batterie des retours
 +  * un booster qui monte le 12v a 16V pour une base de charge du plomb
 +    * http://www.ebay.fr/itm/XL6009-LM2596S-DC-DC-Step-Up-Down-Boost-Buck-Voltage-Power-Converter-Module/262467051468?hash=item3d1c415fcc:g:4gcAAOSwNSxVRlyx
 +  * un régulateur de charge 12V  alimenté par le booster http://www.e44.com/rechercher/?q=m083
 +    * https://www.kemo-electronic.de/en/Transformer-Dimmer/Controller/Modules/M083-Battery-charging-regulator-12-V-DC.php
 +
 +===== Connexions =====
 +|Olimex-ESP8266 | BBL-298| Signal |
 +|con3 | | |
 +|1 | 1| +5 |
 +|2 | 8| GND |
 +
 +
 +Si exploitation de 2 moteurs
 +| Olimex UEXT pad | pin | BBL-298| Signal |
 +| 1 | 3.3V| | nc  |
 +| 2 | GND | | console debug GND |
 +| 3 | gpio 1 | TXD | console debug rx |
 +| 4 | gpio 3 | RXD | console debug tx |
 +| 5 | gpio 4 | 6 | in 3 |
 +| 6 | gpio 2 | 7 | in 4|
 +| 7 | gpio 12 |4 | in 2 |
 +| 8 | gpio 13 |3 | in 1 |
 +| 9 | gpio 14 |2 | enable A |
 +| 10 | gpio 15 |5 | enable B |
 +
 +Si un moteur et une entree serie (rfid)sur UEXT Olimex ESP-DEV
 +| 1 | 3.3V| | nc  |
 +| 2 | GND | | console debug GND |
 +| 3 | gpio 1 | TXD | console debug rx |
 +| 4 | gpio 3 | RXD | console debug tx |
 +| 5 | gpio 4 | 6 | nc |
 +| 6 | gpio 2 | 7 | nc |
 +| 7 | gpio 12 |4 | in 2 |
 +| 8 | gpio 13 |3 | in 1 |
 +| 9 | gpio 14 |2 | enable A |
 +| 10 | gpio 15 |5 | rfid tx | ( marche pas...)
 +
 +1 moteur sur ESP-12
 +
 +Connexions ESP-12 BBL-298
 +|-                |   ESP-12            |        -|
 +|-                |      RST         TXD|        -|
 +|   LDR            ADC             RXD|       - |
 +|-                |  CH_P      |    GPIO4 |  1 RFID |
 +|  4 BBL          |   GPIO16      GPIO5 |        -|
 +|  3 BBL          |   GPIO14      GPIO0 |        -|
 +|led bleu2 BBL-298|   GPIO12      GPIO2 |        -|
 +|led verte        |   GPIO13     GPIO15 |led rouge|
 +|-                |   VCC 3V         GND|        -|
 +
 +ok pour 
 +  * http://www.seeedstudio.com/wiki/index.php?title=125Khz_RFID_module_-_UART
 +lecture rfid par [[esp8266:uart]] ok vitesse de lecture suffisante
 +  * http://www.seeedstudio.com/depot/125khz-rfid-module-uart-p-171.html?cPath=84_85 
 +  * {{:esp8266:rdm630.gif?200|}}
 +<code>
 + P1
 +PIN 1 TX 
 +PIN 2 RX 
 +PIN 3 - nc
 +PIN 4 - Ground
 +PIN 5 - 5 V
 +
 +P2
 +PIN1 - antenne
 +PIN1 - antenne
 +
 +P3 - led option
 +</code>
 +https://github.com/OLIMEX/ESP8266/blob/master/HARDWARE/ESP8266-EVB/ESP8266-EVB_Rev_A.pdf
 +
 +
 +Avec NodeCU : {{ :esp8266:nodemcu_pinout.png?200|}}
 +| DRIVER| | NodeCU |GPIO¦
 +| E1-2 | 2 | D4 | GPIO 02 |
 +| I2 | 3 | D5 | GPIO 14 |
 +| I1 | 4 | D6 | GPIO 12 |
 +| RFID TX | |
 +|  | D7 |  GPIO 13 |
 +
 +| mesure batterie | A0 | Entrée Analogique |
 +
 +===== préparation =====
 +le nommage des loco est fait par leur adresse IP. Donc il est nécessaire de paramétrer le dhcp de l'AP pour que celle-ci affecte les bonnes IP à chaque adresse MAC.
 +
 +IP => LOCO-No ou No = IP4-80, 192.168.0.81 -80 => LOCO-1
 +
 +**coder**
 +  * ordre **/ALLER ii position temps** , aller au tag no position en tant de seconde
 +    * prevoir acceleration/deceleration
 +    * prévoir si vitesse négative la marche arrière
 +    * renvoi à cricket les tag lu au passage /LOCO-x i tag 
 +  * ordre **/INIT** se positionne sur le tag 0, fait le tour vitesse 1000 
 +    * liste tous les tag qui sont normalement séparés régulièrement dans un tableau (no tag, identité du tag)
 +    * retient le temps totale pour une boucle
 +  * ordre /OU renvoi le dernier tag lu, donne une position approximative
 +  * 
 +
 +<code>
 +      msgIN.dispatch("/stop", ArretMoteur);     // stop le moteur immediatement commande=0
 +      msgIN.dispatch("/moteur", MoteurControl); // moteur vitesse 0-1000 acceleration commande=1
 +      // acceleration
 +      // si <0: marche arriere
 +      //  > 500 , par defaut rampe_moyenne
 +      // 20 rampe moyenne
 +      // 0 brutal
 +
 +      // /init fait un tour pour decouvrir les puces, inittableau nbr_de_puce
 +      // /inittableau i nbr_de_puce
 +      msgIN.dispatch("/inittableau", Initialisation_Tableau);  // commande=2
 +
 +      // /init fait un tour pour apprendre les temps de parcours
 +      msgIN.dispatch("/initvitesse", Initialisation_Vitesse);  // commande=19 /initvitesse i 0-5
 +      // 1 = vitesse 1000
 +      // 2 = 800
 +      // 3 = 500 4 = -1000 5 =-800 6 =-500
 +      // 99 = init des tableaux a 0
 +
 +      // /goto iii puce temps(ms) +/-rampe (av/arr) va à la puce dans le temps donne milliseconde
 +      msgIN.dispatch("/goto", Rendezvous);      // commande=3
 +
 +      // /aller iii puce vitesse rampe
 +      msgIN.dispatch("/aller", SeRendre);       // commande=4
 +
 +      // /lit renvoi le code de la derniere puce lue
 +      msgIN.dispatch("/lit", LitPuce);          //   commande=6
 +
 +      // /puces rempli le tableau avec les puce presentees devant la boucle a larret
 +      msgIN.dispatch("/puces", InitTableauPuces1par1);  // commande=7
 +
 +      // /sauvepuces enregistre le tableau dans la flash
 +      msgIN.dispatch("/sauveflash", SauveFlash); // commande=8
 +      // /donnepuces renvoi les données de la flash
 +      msgIN.dispatch("/donneflash", DonneFlash); // commande=13
 +
 +      // /ou renvoi la derniere puce lu
 +      msgIN.dispatch("/ou", Ou);                //  commande=9
 +      // /zou renvoi perdiodiquement des info (toggle) commande = 10
 +      msgIN.dispatch("/zou", Zou);
 +
 +      // /sauveip i IPD change IPD, enregistre la flash et reboot  commande= 14 // marche pas trop !
 +      msgIN.dispatch("/sauveip", SauveIPD); // commande=14
 +
 +      // /sauvevitessemini i vitesse_mini enregistre la vitesse_mini
 +      msgIN.dispatch("/sauvevitessemini", SauveVitessemini); // commande=15
 +
 +      // /sauvenbrpuce i nbr_de_puce, enregistre
 +      msgIN.dispatch("/sauvenbrpuce", SauveNbrPuce); // commande=17
 +
 +      // /vbatterie // renvoi le temoin batterie
 +      msgIN.dispatch("/batterie", Recup_Tension); // commande=18
 +      
 +      
 +</code>
 +
 +==== Usage habituel ====
 +  * il faut toujours commencer par placer la loco sur une puce après l'allumage
 +  * **/aller iii 1 1000 1**   est donc obligatoire pour qu'elle se situe , ensuite
 +  * /goto iii no_puce temps_s accel + ou -
 +    * si le temps est trop long, elle se met en pause et par a la vitesse mini
 +  * /aller iii no_puce vitesse accel + ou -
 +  * /stop
 +
 +==== Mise en route ====
 +__Reconnaissance de toutes les puces présentes sur le circuit__
 +  - **/inittableau i nbr_total_de_puce** 
 +    - /inittableau i 99  = RAZ total de tous les tableaux puces et vitesses  
 +    - ex /inittableau i 8  = fait le tour pour enregistrer 8 puces
 +    - max 15 puces
 +    - l'inittableau fait un tour pour apprendre la présence des puces, 
 +    - il flash le tableau principal, sur lequel on ne revient plus, donc pas de modif de l'ordre des puces ensuite ! ( la distance elle peut etre modifiée).
 +
 +__Apprentissage des temps de déplacement entre chaque puce__
 +  - **/initvitesse i 99**   RAZ tableau vitesse ( option puisque inittableau 99 deja fait )
 +  - **/aller iii 1 500 -10**    pour se positionner juste sur la 1
 +  - **/initvitesse i 1**   rempli le tableau de la vitesse rapide (1000) en avant
 +  - **/aller iii 1 500 -10**   revient juste sur la 1
 +  - **/initvitesse i 2**   rempli le tableau de la vitesse rapide (1000) en arrière
 +  - **/aller iii 1 500 -10**
 +
 +ancient : puisque il ne reste plus que 2 tableaux a 500
 +  - **/initvitesse i 3**   rempli le tableau de la vitesse moyenne (800) en avant
 +  - **/initvitesse i 4**
 +  - **/initvitesse i 5**   rempli le tableau de la vitesse moyenne-lente (500) en avan
 +  - **/initvitesse i 6**
 +
 +Il est possible d'arreter une initialisation en cours et de la recommencer ( /stop ), il suffit de se re positionner  sur la puce 1. 
 +
 +Il est donc possible de reprendre un tableau sans changer les autres.
 +
 +  * Ensuite faire des tests avec **/moteur ii 300 10** et **/moteur ii 250 10**  pour voir si la loco peut faire un tour complet à vitesse lente sans trop brouter
 +    * mini 200 par défaut
 +  * La vitesse la plus lente sera aussi celle qui sert à recalculer les temps nécessaires pour atteindre des puces. Une fois la vitesse la plus lente trouvée, : **/sauvevitessemini i vitesse_mini** 
 +
 +==== Autres commandes ====
 +  * **/stop** stop une commande en cours
 +    * remet tous les compteurs en cours à 0
 +    * ne change rien aux tableaux flashés
 +  * **/donneflash** renvoi les info flashées
 +  * **/sauveflash** reflash ( à priori pas nécessaire )
 +
 +  * **/aller iii no_de_puce vitesse rampe_direction**
 +    * vitesse entre vitesse_mini et 1000
 +    * rampe : si 0 => avant rapide
 +      * <20 pas de rampe
 +      * >20 et <100 effectif
 +      * <0 en arrière
 +    * si la commande est envoyée 2 fois , la loco fait un tour de plus
 +      * ex, on est deja sur la puce 2, 
 +        * ///aller 2 500 10// fait 1 tour complet
 +          * /encore ///aller 2 500 10// fait 2 tours complet
 +
 +  * **/goto iii no-puce temps_en_seconde rampe_direction** 
 +    * ex ///goto iii 5 20 10// => met la loco sur la puce 5 en 20 s en avant avec un démarrage rapide
 +    * ex// /goto iii 5 20 -1// => met la loco sur la 5 en 20 s dans l'autre sens (arrière)
 +  * **/goto iii no-puce temps_plus_long dir** : si le temps est plus grand que celui permit par la vitesse_mini alors la loco attend 1/3 du temps pour un tour a vitesse mini et refait le calcul pour démarrer
 +    * ex //goto iii 5 160 10// => va peut etre attendre 2 minutes avant d'aller à la vitesse lente.
 +  * ensuite à chaque lecture de puce , la loco ajuste sa vitesse par rapport au temps restant à faire.
 +
 +  * **/vbatterie** renvoi le niveau batterie, de 300 a 800, 
 +    * 780= batterie chargée
 +      * si < 300 => **alarme** , il faut absolument recharger la batterie 
 +  * **/zou** déclenche le renvoi toutes les 10 s des infos loco ou l’arrête
 +    * //cmd_en_cours  dernière_puce_lue vitesse_en_cours niveau_batterie temps_pause_restante(seconde)// temps_absolu_depuis_mise_en_route(millis)
 +  * **/ou** donne dernière_puce_lue
 +
 +
 +==== Phase d'init exemple ====
 +<code>
 +/inittableau -i 99
 +# se mettre juste avant la puce 1
 +# pour 11 puces
 +/inittableau i 11
 +# verifier en retournant juste avant la puce 1
 +/goto iii 1 1000 -20
 +/donneflash
 +# doit retourner un tableau correcte
 +# puis init des vitesse ( maintenant juste 2 tableaux )
 +# puisque placée juste avant puce 1
 +/initvitesse i 1
 +/initvitesse i 2
 +<del>/initvitesse i 3
 +/initvitesse i 4
 +/initvitesse i 5
 +/initvitesse i 6</del>
 +/donneflash doit retourner un tableau correcte
 +</code>
 +On peut entrer / corriger les puces une par une, le tableau est reflashé 
 +<code>
 +/pucecode si tag nopuce
 +</code>
 +
 +===== Sources =====
 +  * sur ESP Nodecu
 +    * ... plein de versions ....
 +    * {{:esp8266:locomo-dom-rfid-63.ino|}}
 +      * ré alignement tableau json, correction init, lecture flash
 +      * test lecture tableau de 20 puces rfid
 +      * recalcule du temps de pause avant depart
 +      * simplification puisque 2 tableaux au lieu de 6
 +      * test ok /goto sur 12 puces
 +    * {{:esp8266:locomo-dom-rfid-64.ino|}}
 +      * calcul affiné, et autre vérif en cours
 +      * nom pour les loco 11 et 12 en ip 91 et 92
 +    * {{:esp8266:locomo-dom-rfid-65.ino|}}
 +      * modif vitesse moyenne en cas de pause
 +    * {{:esp8266:locomo-dom-rfid-66.ino|}}
 +      * correction pause et modif variables de temps
 +      * ajout commande " /pucecode si tag nopuce " et correction flashage
 +    * {{:esp8266:locomo-dom-rfid-67.ino|}}
 +      * sup notion de tour
 +      * clean lecture tableau rfid et autre tableau (recadrage)
 +    * {{:esp8266:locomo-dom-rfid-70.ino|}}
 +      * modif vitesse init a 400
 +    * {{:esp8266:locomo-dom-rfid-80.ino|}}, essais grandeur nature , 10 mobiles, dont 3 doubles , nickel :-)
 +      * ajout /pucetemps iii tableau puce temps pour pouvoir corriger un element d'un des tableaux
 +      * nombreuses corrections
 +
 +
 +
 +Librairies nécessaires:
 +  * ArduinoJson {{:esp8266:arduinojson.tgz|}} ( option , si pas deja présente )
 +  * esp8266-OSC  {{:esp8266:esp8266-osc.tgz|}}
 +  * softserial {{:esp8266:espsoftwareserial-master.zip|}} de https://github.com/plerup/espsoftwareserial
 +