133 lines
6.4 KiB
Markdown
133 lines
6.4 KiB
Markdown
## Principes de base
|
||
|
||
Un circuit de voitures Carrera comporte des manettes et un circuit de contrôle électronique de la tension par voie. Ce contrôleur est HS sur notre circuit et à besoin d'un remplacement.
|
||
|
||
Le controleur ci dessous est la carte d'origine, je l'ai volontairement coupée en plusieurs endroits pour mes essais afin de me connecter sur les pistes pour les télécommandes.
|
||
|
||

|
||
|
||
Les contrôleurs de télécommande sont des résistances variables ayant pour valeurs :
|
||
- 11.45 kΩ la gâchette relâchée
|
||
- 0.840 kΩ la gâchette enfoncée
|
||
- 13 Ohms me bouton "turbo" pressé
|
||
|
||
Une idée tentante est de refaire un circuit simple avec des convertisseurs DC-DC accessibles pour remplacer le circuit original. Si on part sur une base à régulateurs LM2596HVS ADJ qui sont de petits DC-DC variables, voilà le schéma de référence de la datasheet de ce composant :
|
||
|
||

|
||
|
||
Le problème est que pour la majorité de ces convertisseurs :
|
||
- Il y a un minimum de sortie de 1 V
|
||
- La régulation n'est pas linéaire, donc certaines zones de pression de la télécommande auront + d'influence que d'autres.
|
||
## Réalisation d'un maquette
|
||
|
||
Pour valider un concept de réparation, j'ai pris ce que j'avais dans les tiroirs :
|
||
- Un LM298N
|
||
- Un Arduino Nano
|
||
|
||

|
||
|
||
L'idée est de créer un générateur de PWM, en fonction de la résistance de la manette, le signal électrique appliqué aux voitures sera + ou moins long. Ici on applique pas le PWM à une LED mais à des moteurs donc sur la maquette on utilise le L298N comme pont de puissance.
|
||
|
||

|
||
|
||
Je n'ai pas besoin du point en H car mes moteurs ne vont pas dans les deux sens, on utilise donc qu'une seule sortie du module comportant le L298N. Sur l'image ci-dessous, je câble les rails du circuit sur la sortie "DC Motor 1" et j'utilise uniquement l'entrée INA
|
||
|
||

|
||
|
||
Pour créer un PWM le code Arduino suivant va s'occuper de :
|
||
- Lire une tension d'entrée analogique (+5V vers pont diviseur 11k de la télécommande avec une résistance de 1k à la masse)
|
||
- Générer un PWM de sortie
|
||
|
||
```
|
||
// High-frequency PWM using Timer2 on digital outputs D3 & D11 (31 kHz)
|
||
const int pwmPin1 = 11; // OC2B, Pin 15 sur le 328P, pilote Q1
|
||
const int pwmPin2 = 3; // OC2A, Pin 1 sur le 328P, pilote Q2
|
||
|
||
const int analogPin1 = A0; //J2 Manette Gauche, Pin 23 sur le 328P
|
||
const int analogPin2 = A1; //J4 Manette Millieu, Pin 24 sur le 328P
|
||
|
||
void setup() {
|
||
pinMode(pwmPin1, OUTPUT);
|
||
pinMode(pwmPin2, OUTPUT);
|
||
pinMode(analogPin1, INPUT);
|
||
pinMode(analogPin2, INPUT);
|
||
|
||
// ----- Timer2 Fast PWM (8-bit), no prescaler -----
|
||
TCCR2A = _BV(WGM20) | _BV(WGM21) | _BV(COM2A1) | _BV(COM2B1);
|
||
TCCR2B = _BV(CS20); // No prescaler → 31.37 kHz
|
||
}
|
||
|
||
void loop() {
|
||
int adc1 = analogRead(analogPin1);
|
||
int adc2 = analogRead(analogPin2);
|
||
|
||
if (adc1 <= 100){
|
||
adc1 = 0;}
|
||
if (adc2 <= 100){
|
||
adc2 = 0;}
|
||
|
||
uint8_t pwm1 = map(adc1, 0, 1023, 0, 255);
|
||
uint8_t pwm2 = map(adc2, 0, 1023, 0, 255);
|
||
|
||
OCR2B = pwm1; // D3, J2 Manette Gauche, Pin 1 sur le 328P, pilote Q3
|
||
OCR2A = pwm2; // D11, J4 Manette Millieu Pin 15 sur le 328P, pilote Q1
|
||
}
|
||
```
|
||
|
||
Et voici le signal de sortie :
|
||
|
||

|
||
|
||
Etant donné que ca fonctionne et que c'est simple il reste à miniaturiser la chose pour que cela puisse rentrer à nouveau dans le circuit originel.
|
||
|
||
Pour miniaturiser le concept va retenir :
|
||
- L'utilisation d'un Atmega328p et son quartz a 16Mhz programmé avec le code Arduino
|
||
- Deux petits Mosfet 1A qui vont faire pont de puissance vers les moteurs
|
||
- Des diodes de roues libre autour des moteurs pour ne pas claquer les Mosfets
|
||
- Un port JTAG pour reprogrammer au besoin le processeur.
|
||
|
||

|
||
|
||
Pour valider que le Mosfet N-channel puisse bien être piloté, une simulation du circuit à été faite dans LTSpice:
|
||
|
||

|
||
|
||
Le PCB sur lequel seront soudés les composants et qui reprends les pistes pour les télécommandes et le raccordement de puissance d'origine.
|
||
|
||

|
||
|
||
Et la commande qui arrivera bientôt :
|
||
|
||

|
||
|
||
La soudure à été réalisée avec de la pâte a souder, d'abord on met des gouttes sur toutes les pastilles, on y colle les composants et on fait fondre. Le circuit est fonctionnel, mais j'ai fait une erreur de positionnement qui va me déranger pour mettre le circuit en place : La diode D5 est à un endroit qui m'oblige à retirer un peu de plastique.
|
||
|
||
On voit aussi C1 qui est remplacé par un électrolytique car je n'ai pas commandé la bonne référence.
|
||
|
||

|
||
|
||
Pour programmer la carte ci-dessus j'utilise la méthode : Méthode #4 : programmation d’un ATmega328P en ISP, avec un Arduino Uno transformé en programmateur décrite sur le site [https://passionelectronique.fr/programmer-atmega328p/#methode-4-programmation-dun-atmega328p-en-isp-avec-un-arduino-uno-transforme-en-programmateur]()
|
||
|
||

|
||
|
||
Le montage réalisé avec à gauche le programmateur, et a droite le contrôleur à programmer.
|
||
|
||

|
||
|
||
Ensuite dans ArduinoIDE
|
||
Bon cette première version du contrôleur de circuit fonctionne mais n'est pas fiable...
|
||
|
||
Après quelques minutes de jeu sur le circuit je casse Q1 ou Q2. J’imagine que le problème viens de petit courts-circuits sur la piste lorsque les balais de la voiture viennent à toucher les deux rails. D'une part Q1 et Q2 sont limites pour ce moteur, d'autre part il n'y a aucune protection contre les sur-intensités sur ce circuit.
|
||
|
||
Dans la deuxième version, j'ai laissé passer une erreur dans la conception du PCB qui s'est retrouvée sur le circuit fabriqué...
|
||

|
||
|
||
Il a fallu gratter la piste pour rattraper le faux contact entre ADC3 et la piste U1-PD3. J'ai pu aussi trouver deux autres problèmes de design. Tout d'abord une piste bien trop petite :
|
||
|
||

|
||
|
||
Un condensateur permettant de réduire le bruit de mesure à ajouter :
|
||
|
||

|
||
|
||
Tout celà à été corrige dans le fichier KiCad mais non mis en production. Je garde le circuit "bricolé" à la main avec les erreurs corrigées en grattant dans le jouet actuel car cela fonctionne. |