différentiel électronique RC 1/5

Je suis enseignant en électronique et je viens de découvrir que les cartes arduino peuvent très certainement résoudre mon problème. Je cherche à remplacer le différentiel mécanique d’une voiture RC 1/5 par un différentiel électronique. J’ai actuellement un moteur central brushless et pour projet d’en avoir un par roue (sur chaque roue arrière ; donc deux). Avec des filtres RC 1er ordre j’arrive à avoir une ddp fonction de la charge (freinage) appliquée au moteur. Il me faut une carte capable de faire la mesure de : -deux ddp, -du signal de la radio (MLI, période 11ms, signal haut de 1ms à 2ms, 0% à 1.5ms) -de générer deux signaux MLI (PWM) pour chaque contrôleur du moteur de chaque roue. Et aussi capable d'être autonome. Il y a-t-il quelqu’un qui peut me dire quelle carte je dois choisir ? Cordialement Wilfried

Bonsoir,

J'ai juste pas saisi la parti ddp : elle se ferait sur les brushless si je comprend bien. Sauf qu'un brushless y'a plusieurs phases ...

Sinon une pro micro devrait être le mieux, à moins qu'une liaison USB soit régulièrement nécessaire, sans quoi une nano serait alors plus appropriée.

A voir également la compatibilité au niveau tension

Bonjour, Oui trois " phases" si on peut dire. Même allure, même caractéristiques et déphasées à 120°. J'ai branché un filtre résistance/condensateur (470K, 100nF) entre une des phases et la masse de l'alimentation, et l'oscilloscope sur condensateur-masse. J'arrive alors à avoir une tension (ddp) continue qui est fonction du freinage appliqué sur le moteur. Pour la plage tension compatible c'est facile d'avoir une image adaptée avec un AIL.... J'ai vu le model mega, il semble que ce soit le plus plus de chez arduino et vu le prix..... Je ne me rend pas bien compte de la capacité de la mémoire "rom" en fonction du programme. Je vais essayer cette carte. Merci. Wilfried

odisseano: Bonjour, Oui trois " phases" si on peut dire. Même allure, même caractéristiques et déphasées à 120°. J'ai branché un filtre résistance/condensateur (470K, 100nF) entre une des phases et la masse de l'alimentation, et l'oscilloscope sur condensateur-masse. J'arrive alors à avoir une tension (ddp) continue qui est fonction du freinage appliqué sur le moteur. Pour la plage tension compatible c'est facile d'avoir une image adaptée avec un AIL.... J'ai vu le model mega, il semble que ce soit le plus plus de chez arduino et vu le prix..... Je ne me rend pas bien compte de la capacité de la mémoire "rom" en fonction du programme. Je vais essayer cette carte. Merci. Wilfried

Bonjour une mega c'est un peu too much

si je resume tu a besoin : - d'acquerir 2 tensions (2 pins AD) - intercepter le signal servo d'une des voies radio (1 pin digital) - generer 2 signaux au "standard" servo (2 pins digital) ?

si c'est ça , perso je partirais sur un petit nano et il reste de la marge

Bonjour, Oui! c'est ça! :D merci! Wilfried

odisseano: Bonjour, Oui! c'est ça! :D merci! Wilfried

ok je pense que pour te faire la main le plus simple est un nano ceci etant à chaud et comme je vois " a peu pres ce que tu veux faire" :grin: je ne suis pas sur que dériver le différentiel de vitesse en partant de ta méthode soit très fiable (tout dépend de ce qu tu recherche en terme de précision/résolution) si j'ai bien compris : tu souhaite intégrer en V l'alimentation d'une des phases ? Si oui : a chaud je pense qu'il va y avoir enormement de dispersions dans l'acquisition entre les 2 moteurs pour une meme vitesse de rotation VR1=VR2 .

Bonjour, Pour donner une explication: Je capte le signal radio et une ddp moyenne par filtrage d'une phase de chaque moteur. En fonction de cela je génère deux nouveau signaux corrigés qui me piloterons les deux contrôleur des deux moteurs. Je ne modifie pas directement les phases puissance: trop de puissance. Voila. Si ça marche je vous en ferais part. Je me pose juste la question a savoir si un signal pwm est généré en continu pendant l’exécution d'un programme ou si il faut procédé par interruption...

Cordialement Wilfried

odisseano: Bonjour, Pour donner une explication: Je capte le signal radio et une ddp moyenne par filtrage d'une phase de chaque moteur. En fonction de cela je génère deux nouveau signaux corrigés qui me piloterons les deux contrôleur des deux moteurs. Je ne modifie pas directement les phases puissance: trop de puissance. Voila. Si ça marche je vous en ferais part. Je me pose juste la question a savoir si un signal pwm est généré en continu pendant l’exécution d'un programme ou si il faut procédé par interruption...

Cordialement Wilfried

bonsoir j'avais très bien compris ton souhait 8) Ne raisonne pas là en prof, mais en ingénieur :grin: J'attire juste ton attention sur "Tes capteurs vitesse différentielle" en ce qui concerne la précision/résolution et surtout la reproductibilité. Pour faire du "bon" calcul sur du differentiel , il faut déjà s'assurer de connaitre "la classe" de précision absolue de chacun des capteurs.

arduino, autres, ou pas , la chaine décisionnelle de l'action decoulant des capteurs sera inévitablement affectée par le plus mauvais :grin:

pour ce qui concerne là l'arduino en utilisation avec des servos RC voir http://arduino.cc/en/reference/servo c'est une base , pas la panacée :sunglasses:

Bonsoir! ;D
Donc euh oui… je pensais avoir répondu à cette phrase
"si j’ai bien compris : tu souhaite intégrer en V l’alimentation d’une des phases ? "
Je ne comprend pas bien finalement…
Ensuite qu’entendez vous:
“Tes capteurs vitesse différentielle” ?

Mon idée est de corriger la commande des deux contrôleur en mesurant si il existe une différence de charge et de réguler celle ci par une incrémentation dans une boucle jusqu’à ce que celle ci n’existe plus.
Cordialement

odisseano: Bonsoir! ;D Donc euh oui... je pensais avoir répondu à cette phrase "si j'ai bien compris : tu souhaite intégrer en V l'alimentation d'une des phases ? " Je ne comprend pas bien finalement.... Ensuite qu'entendez vous: "Tes capteurs vitesse différentielle" ?

Mon idée est de corriger la commande des deux contrôleur en mesurant si il existe une différence de charge et de réguler celle ci par une incrémentation dans une boucle jusqu’à ce que celle ci n'existe plus. Cordialement

bonjour oui, oui :grin: ce que j'essaie simplement d'expliquer c'est que tu a besoin d'un capteur par roue pour en extraire une info de vitesse de rotation differentielle necessaire pour retroagir.

là tu souhaite comme capteur deriver cette info en utilisant comme dispositif une cellule RC pour integrer en V la vitesse la vitesse de chaque roue.

Ce que je crains (mais c'est à vérifier) c'est que compte tenu des inévitables dispersions entre les 2 roues (R,C, conso moteur,etc ) c'est que tu te retrouve avec 2 courbes qui ne se superposent pas exactement .

Il en irait différemment par exemple si sur chaque roue tu mettait comme capteur un disque optique de X secteurs , là il est simple de savoir en "lisant" la durée des secteurs si la Vitesse de rotation de chaque moteur est identique ou pas.

Ceci etant ta soulution est peut etre viable, et ça ne coute pas cher de la tester. :grin:

Bonjour, oui oui ;) je suis en test de tout ça avec tout ca... L’idée du disque est très bonne mais elle devient un pb supplémentaire dans la construction mécanique. Aujourd'hui j'ai deux buggy 1/5 fabriqués par nos sections usinage avec des brushless de 5kW leopard de chez hobbycenter . Le dernier modèle monté prend largement les 100km même si c'est peu croyable... en course de fin d'année elles ne sont qu'a 40%. Suite à l'essais d'une vraie voiture électrique je me suis renseigné sur celles-ci. Après quelques recherches il semble que la solution du moteur roue soit l'avenir. Ainsi mon idée est d'intégrer des brushless de modèle réduit a fort couple, failble vitesse de rotation, dans les 2-3kW dans des jantes. Dans l'établissement ou je travail j'ai la possibilité avec des collègues de réaliser des prototypes de jante en impression 3D, et plus si concluant, en incluant des moteurs a cage tournante type avion ou hélicoptère. Contrairement à des véhicules sans différentiels avec un axe fixe les moteurs électriques acceptent des variations de charge ce qui ne me persuade pas véritablement sur l'obligation d'un différentiel. Ajoutons à tout cela que ce projet doit être mené avec des élèves et dans le cadre "EN" (compétences, savoir, ...). Je ne peux pas partir sur des solutions "pour en finir avec" avant même quelques essais ou quelques tests. Votre idée est intéressante et elle est mise dans la case des solutions si...

Si cela vous intérresse je peux donner les mesures oscilloscoppe sur mes phases avec filtrage et le prgramme en c que j'ai écris.

Merci pour les infos, je commande cet ap une uno; vu le prix.... Cordialement

odisseano: ...

Si cela vous intérresse je peux donner les mesures oscilloscoppe sur mes phases avec filtrage et le prgramme en c que j'ai écris.

Merci pour les infos, je commande cet ap une uno; vu le prix.... Cordialement

Bonjour ce qui serais interessant dans un premier temps ce serait de tracer les 2 courbes (1 par moteur) X=vitesse de rotation réelle (avec un tacho optique par exemple) echelon la 100taine de tr/mn par exemple Y=image V issue de ta cellule RC et de voir ce que cela donne comme aspect

voila tout le code pour ceux que cela intéresse.
Cordialement et merci docteur Frankenstein!
W

/**/
/différentiel électronique /
/
arduino uno + shield lcd microbot /
/
/

#include <LiquidCrystal.h> // inclusion des bibliothèques
#include <Servo.h>

LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // Initialisation de la bibliothèque par rapport au cablage du shield afficheur lcd

void tempodemarrage (void); // declaration des sous programmes
void affichage(void);

Servo consigneg; // Definition Objet controle de servo; consigne gauche; sortie
Servo consigned; // Definition Objet controle de servo; consigne droite; sortie

const int inputPin = A0; // entree A0 reservée a l’affichage
int signalradio = A3; // signal de consigne sur patte 0 en MLI entree
int spd = A1; // signal de mesure de puissance à droite sur patte 1 tension cc entree
int spg = A2; // signal de mesure de puissance à gauche sur patte 2 tension cc entree
int inputValue = 0; //variable entree bouton
unsigned int vpd; //variable de puissance à droite
unsigned int vpg; //variable de puissance à gauche
int dd; //variable de correction a droite variable to read the value from the analog pin
int dg; //variable de correction a gauche
unsigned int d; //variable ecart de correction
unsigned int c; //varaible de consigne
unsigned int cg; //variable de consigne gauche
unsigned int cd; //variable de consigne droite
unsigned int E; //variable ecart
unsigned int e; // variable absolue ecart
unsigned int t; // variable de tempo

void setup()
{
lcd.begin(16, 2);
lcd.print(“Prg_correction”);
lcd.setCursor(0, 1); // Déplace le curseur sur le caractère 0 de la ligne 1
lcd.print(“differentiel_v06”);
consigneg.attach(9); // attache du servo sur la pin 9 de l’objet consigne gauche
consigned.attach(10); // attache du servo sur la pin 10 de l’objet consigne droite
}

void loop()

{

dd = 0; //mise a 0 des variables de correction
dg = 0;
cg = 90; //mise variable rotation 0 du moteur gauche
cd = 90; //mise variable rotation 0 du moteur droite
consigneg.write(cg); //ecriture sur la sortie 9
consigneg.write(cd); //ecriture sur la sortie 10
tempodemarrage(); // tempo de demarrage, temps d initialisation des controleurs de puissance ti ti ti 7 secondes
lcd.begin(16, 2);
lcd.print(“Prg_en_cours”);

do
{
affichage();
c = pulseIn(signalradio, HIGH, 11000); //lecture du signal de la radio consigne de vitesse mise en variable c, variable de 1000 a 2000
c = constrain(c, 1000, 2000);
c = map(c, 1000, 2000, 0, 180); //calibrage de l’impulsion 1-1,5-2ms en 0-90-180°
if (c <= 90) // si pas de commande de marche avant ou commande marche arrière alors cgauche = cdroite_ pas de différentiel en arrière
{
cg = c; // mise consigne a droite et a gauche a consigne
cd = c;
consigneg.write(cg); //ecriture sur la sortie 9
consigned.write(cd); //ecriture sur la sortie 10
dd = 0;
dg = 0;
}

else
{
vpd = analogRead(spd); //lecture sur l’entree spd pin 1 de la puissance et mise en variable vpd compris entre 0 et 1023
vpg = analogRead(spg);
E = vpg-vpd; // calcul de l’ecart de puissance
e= abs(E); // calcul de la valeur absolue de l’ecart

if ( e > 100 ) // si l’ecart absolue est fort, supérieur à 50…
{
if ( E < 0 ) // Si l’ecart est supérieur sur la gauche
{
dd = dd + 1; //augmente a droite de 1°
dg = dg - 1; // diminu à gauche
}
else //sinon
{
dd = dd - 1; // diminu a droite
dg = dg + 1; //augmenta a gauche
}

}
else // sinon pas d’ecart de puissance important
{
d = dd-dg; //calcul de l’ecart de derive
d= abs(d);
if ( d < 5 ) // si l’ecart est faible alors on repositionne les variable de correction a 0
{ // cas de retour en ligne droite ecart de puissance faible & ecart de dérive faible.
dd = 0;
dg = 0;
}
}
//acquisition du signal radio et application des signaux de commande des controleur avec correction ou pas
//c = pulseIn(signalradio, HIGH, 11000); //lecture du signal radio consigne de vitesse mise en variable C
//c = map(c, 1000, 2000, 0, 180); // mise a l’echelle de c sur 0-180°
dd = constrain(dd, -20, 20); //angle de correction limié à ±20°
dg = constrain(dg, -20, 20);
cg = c + dg; // calcul de la consigne a gauche en °
cg = constrain(cg, 0, 180);
cd = c + dd; // calcul de la consigne a droite en °
cd = constrain(cd, 0, 180);
consigneg.write(cg); // mise a la position de la commande gauche sortie pwm
consigned.write(cd); // mise a la position de la commande droite sortie pwm

}
} while ( 1>0 );
}

//
/
tempo de demarrage 7s pour initialisation des controleurs de puissance.
/
/
**/
void tempodemarrage (void)
{
t = 0;
do
{
delay(1000);
t = t + 1;
} while ( t < 7);
}

//
/
vérifie l’état des boutons (Avec prise en charge de la variabilité de la tension).
/
/
**/
void affichage(void)
{
inputValue = analogRead(inputPin);
if(inputValue < 100 && inputValue >= 0) inputValue = 1;
else if(inputValue < 250 && inputValue > 150) inputValue = 2;
else if(inputValue < 470 && inputValue > 370) inputValue = 3;
else if(inputValue < 670 && inputValue > 570) inputValue = 4;
else if(inputValue < 870 && inputValue > 770) inputValue = 5;
else if(inputValue <= 1023 && inputValue > 950) inputValue = 0;
// afficher les evenement, correction, consigne,…
if(inputValue == 1 )
{
lcd.setCursor(0, 1);
lcd.print("cor droite ");
lcd.print(dd );
}

if(inputValue == 2 )
{
lcd.setCursor(0, 1);
lcd.print("cor gauche ");
lcd.print(dg );
}

if(inputValue == 3 )
{
lcd.setCursor(0, 1);
lcd.print("consigne ");
lcd.print(c );
}

if(inputValue == 4 )
{
lcd.setCursor(0, 1);
lcd.print("consigne g ");
lcd.print(cg);
}

if(inputValue == 5 )
{
lcd.setCursor(0, 1);
lcd.print("consigne d ");
lcd.print(cd);
}
}