Table des matières

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

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

      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

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.

Autres commandes

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

Librairies nécessaires: