LOCODUINO
Parlons Arduino => Vos projets => Discussion démarrée par: bucks le septembre 13, 2016, 09:19:35 pm
-
bonjour à tous,
sur base du décodeur d'acessoire versatile proposé sur le site ... je me suis mis en tête de développer une animation de PN, reprenant le clignotement réaliste du feu de PN (code dispo sur locoduino) ainsi que la sonnette l'accompagnant en se servant d'un DFPlayer....
la suite dès que je dispose des composants commandés :)
-
Bonjour,
Sur mon réseau N j'ai réalisé un PN avec barrières et clignotants, mais sans le son !
J'ai utilisé un Attiny 2313 programmé directement et les détails sont décrits dans le post ci-après du forum du N: http://le-forum-du-n.forumotions.net/t12790-pn-actionne-par-servo-moteurs-electronique (http://le-forum-du-n.forumotions.net/t12790-pn-actionne-par-servo-moteurs-electronique).
Les techniques mises en oeuvre se transposent sans problème à l'environnement Arduino.
Bonne réalisation et meilleures salutations.
-
mais mon objectif est plus humble... juste faire sonner et clignoter sans barrière .... puis ajouter la partie "DCC"
j'ai cumulé des codes pour arriver a cela :
#include <DFPlayer_Mini_Mp3.h>
#include <SoftwareSerial.h>
enum { ETEINT, EN_AUGMENTATION, ALLUME, EN_DIMINUTION };
struct FeuClignotant {
const byte pin;
byte etat;
unsigned long dateDernierChangement;
};
struct FeuClignotant feuPN = {3, ETEINT, 0 };
void gereFeuClignotant(struct FeuClignotant& feu)
{
unsigned long date = millis();
int valeurPWM;
switch (feu.etat)
{
case ETEINT:
analogWrite(feu.pin, 0);
// Attente de 200ms
if (date - feu.dateDernierChangement >= 200) {
// les 200ms sont passée, on change l'état du feu
feu.dateDernierChangement = date;
feu.etat = EN_AUGMENTATION;
}
break;
case EN_AUGMENTATION:
// La valeur de la PWM est donnée par la difference entre
// la date et la dateDernierChangement
valeurPWM = date - feu.dateDernierChangement;
if (valeurPWM <= 250) analogWrite(feu.pin, valeurPWM);
else {
// Les 250 ms sont passées, on change l'état du feu
feu.dateDernierChangement = date;
feu.etat = ALLUME;
}
break;
case ALLUME:
analogWrite(feu.pin, 250);
// Attente de 200ms
if (date - feu.dateDernierChangement >= 200) {
// les 200ms sont passée, on change l'état du feu
feu.dateDernierChangement = date;
feu.etat = EN_DIMINUTION;
}
break;
case EN_DIMINUTION:
// La valeur de la PWM est donnée par 250 moins la difference entre
// la date et la dateDernierChangement. Attention aux parenthèses
valeurPWM = 200 - (date - feu.dateDernierChangement);
if (valeurPWM >= 0) analogWrite(feu.pin, valeurPWM);
else {
// Les 250 ms sont passées, on change l'état du feu
feu.dateDernierChangement = date;
feu.etat = ETEINT;
}
break;
}
}
void setup() {
// put your setup code here, to run once:
pinMode(feuPN.pin, OUTPUT);
Serial.begin (9600);
mp3_set_serial (Serial); //set Serial for DFPlayer-mini mp3 module
delay(1);
mp3_set_volume (30);
pinMode(feuPN.pin, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
gereFeuClignotant(feuPN);
mp3_play (1); //play 0001.mp3
}
mes problèmes sont les suivants :
il faudrait que le son dure plus longtemps ? comment puis je faire ?
il faudrait que la LED commence a clignoter en même temps que le son .... or pour l'instant le son viens en premier et quand c'est fini la led clignote...
désolé si les questions sont bêtes ... mais je découvre le codage arduino
-
Bonjour,
Moi, j'ai la barrière + le feu clignotant + le son, sur un Arduino Pro Mini !
J'ai branché un lecteur de carte microSD sur le port SPI et le croquis est en PJ
Amicalement
PS j'avais ouvert un fil spécialement pour les PN, mais tout le monde se met à coté !!!
-
merci pour le sketch,
j'ai plusieurs question car toi l'activation se fait par une détection ?
aussi qu'est ce que le port SPI ? moi le DFPlayer ils me disent de se brancher sur rx et tx
n'y as t il pas moyen d'adapter mon code tout simple pour que le déroulement soit simulatané ?
merci
-
Après pas mal d'essais de différentes choses, j'ai choisi TMRpcm pour faire du son de façon asynchrone (en même temps qu'autre chose) sur Arduino. Une simple carte SD branchée sur le port SPI suffit, ça ne coute qu'1 ou 2€.
Le port SPI est le port de communication le plus rapide et le plus simple d'emploi quand un périphérique l'intègre. Regardes les notions de base sur l'Arduino (articles 69 http://www.locoduino.org/spip.php?article69 (http://www.locoduino.org/spip.php?article69) et surtout sur arduino.cc). Pour la gestion de fichier sur carte SD et pour piloter un écran graphique, il n'y a que le port SPI qui tient la route. Et il peut faire les 2 en même temps !
Si possible (et ça l'est presque toujours), je ne branche rien sur Tx et Rx qui sont utilisés par le chargeur.
Je pense qu'il vaut mieux que tu adaptes mon code plutôt que le tien, mais je réponds ça parce que je n'ai pas le temps de regarder ton code (je regarderai la semaine prochaine, le week-end est entièrement pris ...)
Amicalement
-
je vais essayer de zieuter ça ... et surtout de comprendre ...