Outils pour utilisateurs

Outils du site


esp8266:wagons

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:

  1. Olimex BB-L298 commande de moteur

<del>Préparation</del>

  1. Commencer par enlever le strap IO0JP sur la platine ESP pour pouvoir flasher à volonté la bêbête.
    1. 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)
    2. pour flasher il faut allumer la platine en maintenant le bouton enfoncé
  2. avoir une chaine de compilation, je prends celle d'arduino qui fonctionne pour moi cf autres pages la dessus ( https://github.com/esp8266/Arduino )
  3. librairies à utiliser

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.

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

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

lecture rfid par uart ok vitesse de lecture suffisante

 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

https://github.com/OLIMEX/ESP8266/blob/master/HARDWARE/ESP8266-EVB/ESP8266-EVB_Rev_A.pdf

Avec NodeCU :

DRIVER NodeCU
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
      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
      
      

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

  1. /inittableau i nbr_total_de_puce
    1. /inittableau i 99 = RAZ total de tous les tableaux puces et vitesses
    2. ex /inittableau i 8 = fait le tour pour enregistrer 8 puces
    3. max 15 puces
    4. l'inittableau fait un tour pour apprendre la présence des puces,
    5. 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

  1. /initvitesse i 99 RAZ tableau vitesse ( option puisque inittableau 99 deja fait )
  2. /aller iii 1 500 -10 pour se positionner juste sur la 1
  3. /initvitesse i 1 rempli le tableau de la vitesse rapide (1000) en avant
  4. /aller iii 1 500 -10 revient juste sur la 1
  5. /initvitesse i 2 rempli le tableau de la vitesse rapide (1000) en arrière
  6. /aller iii 1 500 -10

ancient : puisque il ne reste plus que 2 tableaux a 500

  1. /initvitesse i 3 rempli le tableau de la vitesse moyenne (800) en avant
  2. /initvitesse i 4
  3. /initvitesse i 5 rempli le tableau de la vitesse moyenne-lente (500) en avan
  4. /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

/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

On peut entrer / corriger les puces une par une, le tableau est reflashé

/pucecode si tag nopuce

Sources

  • sur ESP Nodecu
    • … plein de versions ….
      • 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
      • calcul affiné, et autre vérif en cours
      • nom pour les loco 11 et 12 en ip 91 et 92
      • modif vitesse moyenne en cas de pause
      • correction pause et modif variables de temps
      • ajout commande “ /pucecode si tag nopuce ” et correction flashage
      • sup notion de tour
      • clean lecture tableau rfid et autre tableau (recadrage)
      • modif vitesse init a 400
    • 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:

esp8266/wagons.txt · Dernière modification : 2024/02/09 17:10 de 127.0.0.1