3.9 KiB
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 kO la gâchette relâchée
- 0.840 kO la gâchette enfoncée
- 13 Ohms me bouton "turbo" pressé
Une idée tentante est de refaire un circuit simple avec des convertisseurs DCDC accessibles pour remplacer le circuit original. Si on part sur une base à régulateurs LM2596HVS ADJ qui sont de petits DCDC 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 1V
- 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 pins 3 & 11 (31 kHz)
const int pwmPin1 = 11; // OC2B
const int pwmPin2 = 3; // OC2A
const int analogPin1 = A0;
const int analogPin2 = A1;
void setup() {
pinMode(pwmPin1, OUTPUT);
pinMode(pwmPin2, OUTPUT);
// ----- Timer2 Fast PWM (8-bit), no prescaler -----
TCCR2A = _BV(WGM20) | _BV(WGM21) | _BV(COM2A1) | _BV(COM2B1);
TCCR2B = _BV(CS20); // No prescaler → 31.37 kHz
Serial.begin(9600);
}
void loop() {
int adc1 = analogRead(analogPin1);
int adc2 = analogRead(analogPin2);
if (adc1 <= 100){ // pour éteindre lorsque la télécomande est relachée
adc1 = 0;}
if (adc2 <= 100){ // pour éteindre lorsque la télécomande est relachée
adc2 = 0;}
uint8_t pwm1 = map(adc1, 0, 1023, 0, 255);
uint8_t pwm2 = map(adc2, 0, 1023, 0, 255);
OCR2B = pwm2; // Pin 3
OCR2A = pwm2; // Pin 11
}
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.
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 :






