Parlons Arduino > Vos projets
Warning dans véhicule HO / animation de décor réseau
BB9004:
Bonjour
voici un mini projet , présenté sur le forum Arduino de LocoRevue :
- cadre : animation de décor sur réseau HO
- objectif : créer une animation visuelle, éventuellement variable
- Contexte : Un incident technique ferroviaire (machine en panne, aiguille cassée, signalisation HS, etc...) nécessite la présence de techniciens de maintenance sur les lieux, avec le matériel dans leur véhicule
- moyens : un véhicule HO pouvant être équipé de Leds oranges (ses clignotants en mode warning)
- carte Arduino : Nano ? Uno ?
- petits "+" possibles :
> option 1 : pourrait être pilotée par un décodeur DCC accessoire, à 4 fonctions (sinon : bouton ON/OFF ou rotatif à 4 sorties ??)
> option 2 : pourrait avoir une lampe de cligno grillée sur demande si DCC
> option 3 : pourrait avoir un rythme d'allumage du warning selon le mode "SOS" en morse (reprise du programme Titanic, esprit farceur / étonnement des spectateurs attentifs)
> option x : ...
- le véhicule pouvant être déplacé, ses connexions (au décor) doivent être facilement démontables, et éventuellement être existantes à plusieurs endroits du réseau, si besoin, mais pilotées par la même carte Arduino
- si le châssis du véhicule HO est identique pour plusieurs caisses différentes, on optimise les effets d'animation
- L'objet de ce mini projet est d'accompagner les différents apprentissages Arduino à mettre en oeuvre (je débute).
Budget minimum estimé au départ : moins de 30€.
version 0.2: Warning "simple" (ou warning en mode morse SOS, actuellement mis en commentaire //) :
--- Code: ---/*
* Programme pour arduino Nano ou Uno : à préciser
* par LLG Juin2018 V0.2
* Licence GNU GPLv3 - Version IDE 1.8.5
*
* Ce programme fait fonctionner des feux Warning sur un véhicule HO, plus 3 options (a ecrire)
* option 1 : gestion d'1 ampoule HS : a ecrire
* option 2 : cycle du warning de type "SOS" : a ecrire
* option 3 : liaison et pilotage du warning par un decodeur d'accessoires 4 fonctions DCC : a ecrire
* 4 LED (oranges ou rouges) sont reliees aux sorties 4 a 7
* Les sorties 4 a 7 sont indépendantes, afin de simuler eventuellement (en option # 1) une ampoule cassée
*/
// Initialisation des variables
const byte AVD = 4 ; // cligno AVD
const byte AVG = 5 ; // cligno AVG
const byte ARD = 6 ; // cligno ARD
const byte ARG = 7 ; // cligno ARG
const byte TOUS = 7 ; // les 4 clignos ensemble
//Delai du Warning normal : duree on = off, rythme d'environ 1/2 seconde
const long TempsON = 500;
const long TempsOFF = 500;
// a completer pour l'option SOS (cf Titanic) et la condition IF, si decodeur DCC installe : ??
// Initialisation des lignes 4 a 7 en sortie
void setup () {
pinMode (AVD, OUTPUT) ;
pinMode (AVG, OUTPUT) ;
pinMode (ARD, OUTPUT) ;
pinMode (ARG, OUTPUT) ;
}
// Fonction loop
void loop () {
// Extinction de toutes les LED au depart
digitalWrite (AVD, LOW) ;
digitalWrite (AVG, LOW) ;
digitalWrite (ARD, LOW) ;
digitalWrite (ARG, LOW) ;
// Allumage des leds, en meme temps
digitalWrite (AVD, HIGH) ;
digitalWrite (AVG, HIGH) ;
digitalWrite (ARD, HIGH) ;
digitalWrite (ARG, HIGH) ;
// Debut de cycle 0 : mode warning Normal
delay (TempsON) ; // 4 Feux allumes
digitalWrite (AVD, LOW) ; // Extinction AVD
digitalWrite (AVG, LOW) ; // Extinction AVG
digitalWrite (ARD, LOW) ; // Extinction ARD
digitalWrite (ARG, LOW) ; // Extinction ARG
delay (TempsOFF) ; // 4 feux eteints
// et on boucle, jusqu'à la décision d'extinction DCC
// option 1 : gestion d'1 ampoule HS : a ecrire
// option 2 : cycle du warning de type "SOS" : a ecrire
// option 3 : liaison et pilotage du warning par un decodeur d'accessoires 4 fonctions DCC : a ecrire
}
/* warning sur rythme SOS : à ré-ecrire , copie du SOS Titanic
//
void loop() {
digitalWrite(pinLED, HIGH) ; // allumage du S = 3 fois point, avec delai entre chaque allumage
delay (point) ; // durée d'allumage de la led
digitalWrite (pinLED, LOW) ; // extinction
delay (interPointTrait) ; // attente
digitalWrite(pinLED, HIGH) ;
delay (point) ;
digitalWrite (pinLED, LOW) ;
delay (interPointTrait) ;
digitalWrite(pinLED, HIGH) ;
delay (point) ;
digitalWrite (pinLED, LOW) ;
delay (interPointTrait) ;
// fin du 1er "S"
delay (interlettres) ; // delai entre 2 lettres
// on allume pour le "O" : 3 fois trait de 0,6 s
digitalWrite(pinLED, HIGH) ;
delay (trait) ;
digitalWrite(pinLED, LOW) ;
delay (interPointTrait) ;
digitalWrite(pinLED, HIGH) ;
delay (trait) ;
digitalWrite(pinLED, LOW) ;
delay (interPointTrait) ;
digitalWrite(pinLED, HIGH) ;
delay (trait) ;
digitalWrite(pinLED, LOW) ;
// delay (interPointTrait);
// pause entre 2 lettres :
delay (interlettres) ;
// on allume le 2é S (recopie de la premiére fois)
digitalWrite(pinLED, HIGH) ; // allumage du S = 3 points, avec delai entre chaque allumage
delay (point) ;
digitalWrite (pinLED, LOW) ;
delay (interPointTrait) ;
digitalWrite(pinLED, HIGH) ;
delay (point) ;
digitalWrite (pinLED, LOW) ;
delay (interPointTrait) ;
digitalWrite(pinLED, HIGH) ;
delay (point) ;
digitalWrite (pinLED, LOW) ;
//delay (interPointTrait);
// fin du 2é "S"
// on attend entre 2 SOS
delay (entre2sos) ;
}
*/
--- Fin du code ---
Edit : ce fil présentera les différentes étapes d'apprentissage Arduino (questionnements, instructions utilisées, etc...) et l'avancement du projet.
8)
BB9004:
bonjour
je butte sur ceci : peut-on "piloter" 4 sorties avec une SEULE variable définie ?
(par paresse, je voudrai éviter de répéter trop de ligne... but : 1 seule instruction pour allumer les 4 clignos ensembles, dans l'option SOS)
exemple :
const byte TOUS = x ; // les 4 clignos seraient gérés ensemble >> comment le faire, si c'est possible ?
>> soit à l'origine : il y a une sortie par cligno (pour permettre de simuler, sur une autre option, 1 ampoule grillée dans les 4) :
const byte AVD = 4 ; // cligno AVD
const byte AVG = 5 ; // cligno AVG
const byte ARD = 6 ; // cligno ARD
const byte ARG = 7 ; // cligno ARG
merci
Jean-Luc:
Bonjour,
Oui c'est possible mais il faut descendre dans les tréfonds du microcontrôleur et ça suppose que toutes les broches correspondent à un même registre du GPIO.
En l'occurrence les broches 4 à 7 (sur un Uno je suppose) correspondent aux bits 4 à 7 du port D (coup de pot). Donc en écrivant :
--- Code: ---PORTD |= 0xF0;
--- Fin du code ---
on met à HIGH les 4 broches simultanément et en écrivant
--- Code: ---PORTD &= ~0xF0;
--- Fin du code ---
On les met à LOW
Mais est-ce nécessaire ? On y perd en lisibilité et en portabilité et l'application ne nécessite pas d'aller vite
De manière plus portable, tu peux écrire :
--- Code: ---for (byte broche = 4; broche < 8; broche++) digitalWrite(broche, HIGH);
--- Fin du code ---
Par ailleurs, pour éviter de répéter de nombreuse fois la même séquence, tu peux faire une fonction :
--- Code: ---void clignotant(byte etat)
{
for (byte broche = 4; broche < 8; broche++) digitalWrite(broche, etat);
}
--- Fin du code ---
Il suffit ensuite d'appeler la fonction :
--- Code: ---clignotant(HIGH);
delay(2000);
clignotant(LOW);
--- Fin du code ---
BB9004:
Merci beaucoup Jean Luc de ton aide !
c'était d'abord sur une Nano, mais finalement c'est une Uno "RPC" (puce Atmel mega 328P) pour les facilitées de branchement avec la breadboard
aide précieuse : ça me conduit vers des "couches" plus profondes d'IDE : génial !
et des "astuces" d'optimisation des lignes et fonctions ...
> j'étudie tes propositions, je les digère ... , puis je les mettrai ai mises dans le prog
(j'ai changé le rythme d'allumage à 1/2 seconde > plus réaliste pour un warning !
8)
edit : maintenant que les "sorties" sont en cours de résolution..., je m'interroge sur la sélection des entrées ... (via digitalRead ? )
- choix 1 : warning normal
- choix 2 : warning "SOS"
- choix 3 : warning avec 1 ampoule cassée
- choix 4 : pas défini
> en attendant d'étudier (ultérieurement) les choix via un DCC, faut-il prévoir de passer par un bouton rotatif à 5 positions (0 = éteint) pour piloter ces entrées ? (pour aller du plus simple vers le plus compliqué)
Pour le moment, j'écris les 3 premiers sous-programmes (testés individuellement, c'est OK) en les mettant en commentaire... en attendant de savoir par quelles instructions les sélectionner
> pas de test possible sur la BB, par manque de résistance 220 ou 330 ohm pour tester les 4 leds ensemble ...
PS : si quelqu'un est intéressé, je peux mettre le prog compilé ici (fait)
BB9004:
hello
Dans le prog "Warning", je m'interroge sur la logique de gestion des entrées : vos avis seraient utiles ...
Q1 : il y a un choix multiples d’entrées, la majorité est exclusive ("OU") (1 entrée = 1 seule action de sortie), mais il y aura éventuellement 1 entrée = 2- ou 3 - actions/sorties simultanées ("ET")
(ex : warning + phares allumés) et même "warning + phares + éclairage cabine" : possible ?
> est-ce le moment de s’intéresser aux bibliothèques, afin de ne pas ré-écrire ces sous-ensemble à chaque fois ?
>> les choix potentiels actuels :
* option 1 : warning normal : rédigé : à tester
* option 2 : cycle du warning de type "SOS" : rédigé : a tester
* option 3 : gestion d'1 ampoule HS : rédigé : a tester
* option 4 : liaison et pilotage du choix du warning par un decodeur d'accessoires 4 fonctions DCC : a ecrire
* option 5 : allumage des phares seuls : a ecrire
* option 6 : allumage des phares ET du warning normal : a ecrire
* option 7 : éclairage de la cabine du véhicule : a ecrire
Q2 > si la sélection en entrée se fait par un bouton rotatif sur TCO : le "pôle" choisi alimentera une SEULE Pin dédiée, en entrée, qui, elle, conditionnera la Pin de sortie : possible ?
>nota : cette option semble empêcher les choix "ET" : ?
Q3 > si la sélection en entrée se fait par différents boutons sur le TCO : risque de superposition des choix si on oublie, par fonction, "d'éteindre" l'ensemble avant de lancer la fonction choisie
> petit inconvénient : plus de cablage sur le TCO
> avantage : devrait permettre les choix "ET" : ?
Q4 > si la sélection se fait par décodeur DCC (je n'ai pas encore étudié les possibilités du décodeur Locoduino, que j'envisage de mettre en oeuvre), le nombre de choix possibles sera limité au nombre de possibilités de fonction de ce décodeur .
L'idée est d'associer 1 choix "warning" à une fonction DCC : réaliste ?
- Autres questions, concernant les "loop" :
L1 : peut-on conditionner leur "lancement" par un "index" ?
> genre : IF xx= YY, alors GOTO loop1, sinon goto loop2, etc ... : possible ?
L2 : peut-on avoir plusieurs loop dans un même programme ?
si oui, comment les gere-t-on ?
le IF le permet-il ? (si le "goto" est impossible)
Merci de vos conseils, bonne journée à tous
Navigation
[#] Page suivante
Utiliser la version classique