Files

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 dun 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. Jimagine 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.