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:
Attention ce n'est pas un arduino, le PWM évolue entre 0 et 1023, c'est sur 10bits moteur à 40%
en travoooo
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…
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.
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 |
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
Reconnaissance de toutes les puces présentes sur le circuit
Apprentissage des temps de déplacement entre chaque puce
ancient : puisque il ne reste plus que 2 tableaux a 500
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.
/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
Librairies nécessaires: