Version à valider
This commit is contained in:
@@ -0,0 +1,199 @@
|
||||
# Implémentation DCC NMRA - Guide Technique
|
||||
|
||||
## Vue d'ensemble
|
||||
|
||||
Ce programmateur implémente le protocole DCC (Digital Command Control) selon la norme NMRA S-9.2. Il permet de programmer les décodeurs des locomotives et accessoires via une interface de commande série.
|
||||
|
||||
## Architecture DCC
|
||||
|
||||
### Norme NMRA S-9.2
|
||||
|
||||
Le protocole DCC est un standard d'électrotechnique pour les modèles ferroviaires. Les principales caractéristiques sont :
|
||||
|
||||
- **Fréquence des bits** :
|
||||
- Bit "1" : 116 µs (durée minimale) - période totale 232 µs
|
||||
- Bit "0" : 232 µs (durée minimale) - période totale 464 µs
|
||||
|
||||
- **Format des paquets** :
|
||||
```
|
||||
Préambule(14x1) + 0 + Adresse + 1 + [Données]... + 1 + Checksum + 0
|
||||
```
|
||||
|
||||
- **Signe du signal** : Alterne chaque moitié de bit pour garantir la symétrie
|
||||
|
||||
### Modes de programmation
|
||||
|
||||
#### Mode CV Byte (Lecture/Écriture complète)
|
||||
- Opération la plus courante
|
||||
- Adresse programmation : `0x7C`
|
||||
- Format :
|
||||
```
|
||||
[0x7C] [Commande] [CV Hi] [CV Lo] [Valeur]
|
||||
```
|
||||
- Commandes :
|
||||
- `0x64` : Lire CV
|
||||
- `0x74` : Écrire CV
|
||||
|
||||
#### Détection ACK (Accusé de Réception)
|
||||
Le décodeur répond à une commande de programmation en augmentant sa consommation de courant pendant 6 ms, ce qui produit une augmentation mesurable sur le capteur de courant.
|
||||
|
||||
- Seuil ACK configuré : 60 mA de différence
|
||||
- Permet de détecter si le décodeur a bien reçu et exécuté la commande
|
||||
|
||||
## Architecture Matérielle
|
||||
|
||||
### Schéma simplifié
|
||||
```
|
||||
Arduino Nano
|
||||
├── Pin 9 (DIR1) → Pont en H LM18220 (IN1)
|
||||
├── Pin 10 (DIR2) → Pont en H LM18220 (IN2)
|
||||
├── Pin 11 (PWM) → Pont en H LM18220 (Enable)
|
||||
└── Pin A0 → Capteur de courant (ACS712-5A)
|
||||
↓
|
||||
Rail de programmation DCC
|
||||
↓
|
||||
Décodeur à programmer
|
||||
```
|
||||
|
||||
### Pont en H LM18220
|
||||
- Génère le signal DCC symétrique
|
||||
- Amplitude contrôlée par PWM (pin 11)
|
||||
- Direction contrôlée par DIR1/DIR2 (pins 9-10)
|
||||
|
||||
### Capteur de courant ACS712-5A
|
||||
- Mesure la consommation du décodeur
|
||||
- Sortie : 0V à 5V (2.5V = 0A)
|
||||
- Sensibilité : 185 mV/A
|
||||
|
||||
## Fonctionnement
|
||||
|
||||
### Flux de programmation
|
||||
|
||||
```
|
||||
1. Lecture du courant de base (sans signal)
|
||||
2. Activation du signal DCC
|
||||
3. Envoi du paquet 5 fois (assure la réception)
|
||||
4. Attendre ~10ms la réaction du décodeur
|
||||
5. Mesurer le courant pour détecter l'ACK
|
||||
6. Désactiver le signal DCC
|
||||
7. Afficher le résultat
|
||||
```
|
||||
|
||||
### Chronogramme d'un bit DCC
|
||||
|
||||
Pour un bit "1" (116 µs + 116 µs) :
|
||||
```
|
||||
116µs 116µs
|
||||
┌─────────┐ ┌─────────┐
|
||||
───┤ └────────┤ └────
|
||||
Signal+ Signal-
|
||||
```
|
||||
|
||||
Pour un bit "0" (232 µs + 232 µs) :
|
||||
```
|
||||
232µs 232µs
|
||||
┌──────────────┐ ┌──────────────┐
|
||||
───┤ └────────┤ └────
|
||||
Signal+ Signal-
|
||||
```
|
||||
|
||||
## CVs Importants
|
||||
|
||||
| CV | Description | Plage | Par défaut |
|
||||
|----|-------------|-------|-----------|
|
||||
| 1 | Adresse courte | 1-127 | 3 |
|
||||
| 7 | Version décodeur | 0-255 | Variable |
|
||||
| 8 | Fabricant | 0-255 | Variable |
|
||||
| 17-18 | Adresse longue | 128-10239 | 0 |
|
||||
|
||||
## Communication Série
|
||||
|
||||
**Port série** :
|
||||
- Débit : 9600 baud
|
||||
- Format : 8N1 (8 bits, pas de parité, 1 bit de stop)
|
||||
|
||||
**Commandes disponibles** :
|
||||
```
|
||||
READ_CV 1 → Lire CV 1
|
||||
WRITE_CV 1 42 → Écrire 42 dans CV 1
|
||||
SET_ADDR 42 → Configurer adresse 42
|
||||
TEST_DCC → Test du signal DCC
|
||||
CURRENT → Mesurer courant instantané
|
||||
INFO → Infos système
|
||||
HELP → Aide
|
||||
```
|
||||
|
||||
## Détails d'Implémentation
|
||||
|
||||
### Génération du signal (sendDCCBit)
|
||||
- Utilise `delayMicroseconds()` pour précision (± quelques µs)
|
||||
- Alterne DIR1/DIR2 pour la symétrie
|
||||
- Pulse PWM à 100% pour amplitude maximale
|
||||
|
||||
### Envoi de paquet (sendDCCPacket)
|
||||
```cpp
|
||||
void sendDCCPacket(uint8_t *packet, uint8_t length) {
|
||||
// 14 bits de préambule (tout à 1)
|
||||
for (int i = 0; i < 14; i++) sendDCCBit(1);
|
||||
|
||||
// Bit de démarrage (0)
|
||||
sendDCCBit(0);
|
||||
|
||||
// Données avec bits de séparation (1) entre chaque
|
||||
for (int i = 0; i < length-1; i++) {
|
||||
sendDCCByte(packet[i], 1);
|
||||
}
|
||||
|
||||
// Dernier octet et bit de fin (0)
|
||||
sendDCCByte(packet[length-1], 0);
|
||||
}
|
||||
```
|
||||
|
||||
### Lecture/Écriture CV (Mode Byte)
|
||||
Les CV sont codées sur 10 bits en NMRA :
|
||||
```
|
||||
CV 1-256 : Octet bas = CV-1, Octet haut = 0x00
|
||||
CV 257-512 : Octet bas = CV-257, Octet haut = 0x04
|
||||
CV 513-768 : Octet bas = CV-513, Octet haut = 0x08
|
||||
...
|
||||
```
|
||||
|
||||
Formule de codage :
|
||||
```cpp
|
||||
cv_addr = cv - 1;
|
||||
octet_haut = 0xE4 | ((cv_addr >> 8) & 0x03);
|
||||
octet_bas = cv_addr & 0xFF;
|
||||
```
|
||||
|
||||
## Limitations et Considérations
|
||||
|
||||
1. **Timing précis** : Le timing DCC est critique (±10%). Les `delayMicroseconds()` sont généralement précis à ±4µs sur Arduino Nano.
|
||||
|
||||
2. **Détection ACK simple** : Le système détecte uniquement la présence d'ACK, pas sa durée. Un vrai décodeur DCC ferait une réponse plus complexe.
|
||||
|
||||
3. **Mémoire CV simulée** : Pour le test, une mémoire locale simule les CVs du décodeur. Un vrai décodeur implémenterait la mémoire EEPROM.
|
||||
|
||||
4. **Pas de répéteur** : Le système envoie chaque paquet 5 fois pour assurer la réception (NMRA recommande 5-20 fois).
|
||||
|
||||
5. **Alimentation** : Le pont en H LM18220 doit être correctement alimenté (12-18V) et délivrer assez de courant pour le décodeur et le capteur.
|
||||
|
||||
## Extension Future
|
||||
|
||||
Pour une implémentation complète, on pourrait ajouter :
|
||||
|
||||
- **Mode CV Bit** : Programmation bit par bit (utile pour CV8 Fabricant)
|
||||
- **Mode Adresse Seule** : Configuration rapide de l'adresse
|
||||
- **Lecture de réponses décorées** : Analyser les réponses DCC du décodeur
|
||||
- **Interface graphique** : Via terminal Web ou application
|
||||
- **Programmation par service track vs. main track** : Deux modes de programmation
|
||||
- **Gestion d'erreurs avancée** : Détection de courts-circuits, décodeur absent, etc.
|
||||
- **Logs détaillés** : Enregistrement de tous les paquets envoyés/reçus
|
||||
- **Calibration automatique** : Ajustement des timings en fonction du CPU
|
||||
|
||||
## Références
|
||||
|
||||
- NMRA S-9.2 : DCC Electrical Standards
|
||||
- https://www.nmra.org/dcc
|
||||
- Arduino Nano Datasheet
|
||||
- LM18220 H-Bridge Datasheet
|
||||
- ACS712 Current Sensor Datasheet
|
||||
Reference in New Issue
Block a user