Mon ancien système utilisait un DFPLayer commandé par deux ILS, un de chaque côté du pont.
Mais avec l'utilisation des attelages magnétiques sur plusieurs rames, le DFPLayer bégaye et envoie un son à chaque passage d'un attelage.
Donc j'avais commencé par faire une petite usine à gaz avec un système qui envoie une impulsion unique avec période de blocage de 10 secondes mais il fallait 3 transistors, un NE555, des condensateurs etc.
Donc j'ai laissé tomber et je me suis dit qu'avec un Arduino ce serait plus simple.
Le DFPLayer ext commandé par liaison série.
Effectivement ... plus simple, il n'y a pas
Le schéma:
Ne pas oublier la résistance de 1k pour abaisser la tension sur la ligne RX qui fonctionne en 3,3V sur le DFPlayer alors que l'Arduino envoie du 5V. La ligne TX n'en a pas besoin puisque bouclée.
La détection est confiée à deux TTP223 à poser sur la voie à la place des ILS
J'ai ajouté deux poussoirs pour le réglage du volume
Un TTP envoie la commande "Next" pour jouer le morceau suivant et l'autre la commande "Previous" ainsi les sons ne sont pas toujours les mêmes et si deux trains se croisent ils auront chacun un klaxon différent.
J'ai une dizaine de sons différents enregistrés sur la carte micro SD du DFPlayer.
J'avais présenté le DFPlayer en détail dans une ancienne vidéo car c'est un petit module très intéressant et qui ne coute qu'un euro environ.
Le système revient à moins de 4€...
Le HP (8 ohms / 5W) est une récupération sur un vieux PC
La platine en veroboard:
Les connecteurs tulipe à droite sont ceux des DPLayers.
Celui du centre servait à brancher les boutons de commande du volume avant que je les mette directement sur la platine.
Donc un petit montage vite fait.
Il y a juste à régler plus finement la temporisation de la période réfractaire que j'ai mise à 8 secondes dans le code.
Code : Tout sélectionner
/* =========================================
* Commande DFPlayer par TTP223
* avec réglage du volume
* V1.00 (c) Ramasoft 2026
* =========================================
* Matériel :
* - Arduino Nano
* - DFPLayer Mini
* - 2 capteurs tactiles TTP223 (utilisés comme détecteurs de passage)
*
* Un capteur envoie la commande "Suivant" et l'autre la commande "Précédent" au DFPLayer
* Le DFPLayer est piloté par liaison série
* Deux boutons poussoirs permettent de régler le volume (facultatif)
*
* Câblage TTP223 Détecteurs:
* - Capteur 1 (Suivant) → D2 fil bleu
* - Capteur 2 (Prédécent) → D3 fil vert
* Câblage Poussoirs réglage: (commutation par la masse)
* - Vol+ -> D4 fil jaune
* - Vol- -> D5 fil violet
* Câblage DFPLayer:
* - VCC -> 5V
* - RX -> D12 (via une résistance de 1k pour adapter les niveaux 5V->3,3V)
* - TX -> D11 (TX du DFPlayer -> RX Arduino et RX DFPLayer -> TX Arduino)
* - GND -> GND
*
* Note sur les TTP223 :
* Le TTP223 doit avoir ses plots A et B non shuntés = congiguration d'origine
* pour sortir un état HAUT (HIGH) quand il détecte quelque chose et fonctionner en mode impulsion
*
* Bibliothèques requises (à charger par le Gestionnaire de bibliothèques Arduino) :
* - SoftwareSerial
* - DFRobotDFPlayerMini
*/
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
// Définition des broches pour les pistes
const int PIN_SUIVANT = 2;
const int PIN_PRECEDENT = 3;
// Définition des broches pour le volume
const int PIN_VOL_PLUS = 4;
const int PIN_VOL_MOINS = 5;
// Broches DFPlayer
const int PIN_TX = 12; // Relié au RX du DFPLayer
const int PIN_RX = 11; // Relié au TX du DFPlayer
SoftwareSerial mySoftwareSerial(PIN_RX, PIN_TX); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
// Variable pour stocker le volume (Le DFPlayer va de 0 à 30)
int volumeCourant = 20;
void setup() {
pinMode(PIN_SUIVANT, INPUT);
pinMode(PIN_PRECEDENT, INPUT);
pinMode(PIN_VOL_PLUS, INPUT_PULLUP);
pinMode(PIN_VOL_MOINS, INPUT_PULLUP);
mySoftwareSerial.begin(9600); // liaison série avec le DFPlayer
Serial.begin(9600); // démarre le moniteur série pour débogage
Serial.println(F("Initialisation du DFPlayer..."));
if (!myDFPlayer.begin(mySoftwareSerial)) {
Serial.println(F("Erreur : Vérifiez les branchements ou la carte SD."));
while(true);
}
Serial.println(F("DFPlayer en ligne."));
// Application du volume initial
myDFPlayer.volume(volumeCourant);
Serial.print(F("Volume initial fixe a : "));
Serial.println(volumeCourant);
}
void loop() {
// 1. GESTION DES PISTES (Changement de bruitage)
if (digitalRead(PIN_SUIVANT) == HIGH) {
Serial.println(F("Capteur SUIVANT active"));
myDFPlayer.next();
delay(8000); // Anti-rebond / temps de passage du train 8 secondes
}
if (digitalRead(PIN_PRECEDENT) == HIGH) {
Serial.println(F("Capteur PRECEDENT active"));
myDFPlayer.previous();
delay(8000);
}
// 2. GESTION DU VOLUME
// Augmenter le volume
if (digitalRead(PIN_VOL_PLUS) == LOW) {
if (volumeCourant < 30) { // 30 est le max du DFPlayer
volumeCourant += 2; // On augmente de 2 en 2
if (volumeCourant > 30) volumeCourant = 30; // Sécurité
myDFPlayer.volume(volumeCourant);
Serial.print(F("Volume augmente : "));
Serial.println(volumeCourant);
}
delay(300); // Petit délai pour éviter que le volume ne s'envole si on reste appuyé
}
// Baisser le volume
if (digitalRead(PIN_VOL_MOINS) == LOW) {
if (volumeCourant > 0) { // 0 est le minimum (muet)
volumeCourant -= 2; // On baisse de 2 en 2
if (volumeCourant < 0) volumeCourant = 0; // Sécurité
myDFPlayer.volume(volumeCourant);
Serial.print(F("Volume baisse : "));
Serial.println(volumeCourant);
}
delay(300); // Petit délai pour un réglage fluide
}
}Je vais faire une boite en PLA pour fixer la platine proprement et Il n'y aura plus qu'à monter ça sur le réseau ...




