Files
Helico/README.fr.md
T
2026-08-11 11:15:45 +02:00

88 lines
6.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Helico
Ce projet consiste à réaliser une animation ferrovière. Il s'agit de piloter un hélicoptere.
Basé sur un arduino nano, la partie électronique est constituée de :
- une entrée 'signal' recevant le signal DCC (PIN 2)
- une sortie 'led' qui simule un strobe sur l'hélicoptère
- une sortie 'pwm' permettant de lancer le micro-moteur (pales)
- une sortie 'servo' qui actionne un servo de +100% à -100% pour la montée et descente.
Principe, sur réception de commande accessoire DCC :
- Mise en route 'strobe' ON/OFF
- Mise en route 'moteur pale' ON/OFF
- Action sur le servo Up et Down ON/OFF/OFF
Le décodeur répond par défaut sur l'adresse 1
## Note
Sur les réseaux ferroviaires miniatures en DCC, il n'y a pas d'adresse unique par défaut universelle, mais la convention la plus répandue chez la majorité des fabricants est de livrer leurs décodeurs d'accessoires (aiguillages, signaux, accessoires de décor) sur l'adresse 1.
Certains modules multi- Sorties (Notre cas car on a bseoin de 3 informations) reçoivent par défaut le premier groupe d'adresses (ex. sorties 1 à 4).
## Comment modifier son adresse ?
La norme NMRA prévoit deux méthodes principales pour régler l'adresse d'un accessoire, nous utilisons les CVs.
Pour la plupart des décodeurs modernes réglables par CV, l'adresse principale n'est pas stockée dans un seul CV, mais est répartie sur deux CVs distincts pour pouvoir dépasser la valeur 255 (comme pour l'adresse longue des locomotives) :
- CV 513 (Adresse basse / Decoder Address LSB)
- CV 521 (Adresse haute / Decoder Address MSB)
Attention à l'adressage par sortie / par décodeur :
Le boitier contient une adresse (3 sorties regroupées).
Récapitulatif des CVs de notre accessoire
| CV | Description |
| -------- | ---------------------------------------------------------------------------------- |
| CV 513 | Adresse d'accessoire (Bits de poids faible) |
| CV 521 | Adresse d'accessoire (Bits de poids fort) |
| CV 100 | Vitesse de rotation du moteur de pale (0 à 255) |
| CV 101 | Valeur maximale du servo (0 à 180) |
| CV 102 | Valeur minimale du servo (0 à 180) |
| CV 519 | Version du décodeur (Lecture seule) -1- Hélico module |
| CV 520 | Identifiant fabricant (Lecture seule) -13- Construction amateur |
| CV 512/8 | Reset d'usine (Écrire la valeur 8 réinitialise le décodeur à l'adresse 1) |
# Matériel
1. Une led blanche 'Strobe' est connectée sur la broche 3 du Nano, elle est branchée avec une résistance de 470𝛺 ce qui donne une intensité suffisante et un courant consommé d'environ 5mA
2. Le moteur qui entraine les pales (coreless réducté) est un modèle 720, il est piloté par un transitor MOSFET 2N7002 avec une diode 1N4148 en roue libre et un polyswitch de 250mA
3. Un servo standard est dédié au mouvement de montée descente
## Configuration
Cette configuration de broches (D2 pour le DCC, D9 pour le servo, D5 pour le PWM) est parfaitement optimisée pour un Arduino Nano. L'Atmega328P sera tout à fait capable de gérer ces trois tâches de front, car les composants matériels utilisés n'entrent pas en conflit.
### Pourquoi le choix des broches est idéal (Conflits évités)
L'Arduino Nano gère ses tâches internes via des horloges appelées Timers. Votre configuration répartit parfaitement la charge de ces timers :
- *D2 (Signal DCC)* : La bibliothèque standard NmraDcc nécessite une interruption matérielle externe. Sur un Nano, seules les broches D2 (Interruption 0) et D3 (Interruption 1) possèdent cette capacité. Placer le DCC sur la broche D2 est donc obligatoire et indispensable. La bibliothèque utilise l'interruption matérielle et la fonction micros(). Elle ne monopolise aucun timer majeur pour son calcul
- *D9 (Servomoteur)* : La bibliothèque Servo.h de l'Arduino utilise par défaut le Timer 1. Lorsqu'elle s'active, elle désactive le PWM natif des broches D9 et D10. En branchant votre servo sur D9, vous utilisez la broche idéale puisqu'elle est nativement liée à ce timer.
- *D5 (Moteur PWM)* : Le signal PWM de la broche D5 est généré de manière 100 % matérielle par le Timer 0 (partagé avec millis()). Comme le servo confisque le Timer 1 (D9/D10), votre PWM sur D5 reste totalement indépendant et stable, oscillant à sa fréquence normale d'environ 976 Hz sans subir de distorsion.
### Le comportement face à vos contraintes de fonctionnement.
L'Arduino exécutera ces fonctions de manière virtuellement simultanée grâce aux interruptions :
- *Peu de changements de commandes DCC* : Le signal DCC applique une charge constante de micro-interruptions sur la broche D2 (détection des fronts d'ondes à haute fréquence). Toutefois, le décodage d'un message d'accessoire se fait en quelques microsecondes. Le fait qu'il y ait peu de changements de commandes signifie que la fonction principale de votre code (loop) sera très souvent disponible pour d'autres tâches.
- *ON / OFF ou variation du PWM de 0 à 255* : La fonction analogWrite(5, valeur); demande un effort nul au processeur. Une fois la valeur envoyée, cest le circuit électronique (Timer 0) qui maintient le signal de manière autonome. Changer le paramétrage n'impactera pas le reste du système.
- *Changement lent de position du servo* : Pour faire bouger un servo lentement, la technique consiste à incrémenter sa position degré par degré avec un petit intervalle de temps
### Le piège absolu à éviter
Les `delay()`. Pour garantir la simultanéité des tâches, il ne faut pas utiliser la fonction delay() pour ralentir le servo. Avec `delay(20);` entre chaque degré du servo, l'Arduino va "geler". Bien que le DCC continue de fonctionner en tâche de fond grâce à son interruption, l'appel à la fonction cruciale Dcc.process(); (qui doit être exécutée en boucle continue dans le loop) sera bloqué pendant ce délai. Cela entraînera des pertes de paquets DCC ou des saccades.
### La bonne pratique
Utiliser la technique des minuteurs logiciels sans blocage basée sur millis() pour cadencer le déplacement lent du servo.