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:
-
- 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
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
- un régulateur de charge 12V alimenté par le booster http://www.e44.com/rechercher/?q=m083
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
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
- /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
/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:
- ArduinoJson arduinojson.tgz ( option , si pas deja présente )
- esp8266-OSC esp8266-osc.tgz