Tu veux dire la rotation de la roue arrière droite est inverssée par rapport à la roue avant droite (et même problème à gauche)?
Exactement !
Ce problème est lié au type de contrôleur que j'utilise. Même si je modifiais le raccordement, cela pourrait se reproduire.
En résumé, il y a une commande "Self Study" qui permet au contrôleur de trouver tout seul, la bonne combinaison de raccordement du moteur. Il va falloir que je fouille dans ce sens.
C'est vraiment la misère. Je n'avais pas besoin de cela.
J'ai tripatouillé la commande "Self Study". Résultat, j'ai inversé tous les moteurs, mais avec un peu d'acharnement, j'ai réussi à faire tourner tous les moteurs dans le même sens.
Cela veut dire que les moteurs droits tournent à l'inverse des moteurs gauches. C'est normal !
J'ai donc inversé la commande pour les moteurs droits et ça à l'air de tenir.
J'ai quand même perdu pas mal de temps avec ça, à visualiser un paquet de vidéos.
Bon, je vais donc reprendre mes tests, là où je les avais arrêtés.
Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir
Posté 31 janvier 2023 - 01:09
Quand tu as un moteur brushless 3 phases, sur le principe il te suffit d'inverser deux phases dans ton câblage pour inverser le sens de rotation.
(Et si tu as des capteurs à effet hall il te faut aussi inverser les 2 capteurs hall correspondant aux deux phases ... )
Quand tu as un moteur brushless 3 phases, sur le principe il te suffit d'inverser deux phases dans ton câblage pour inverser le sens de rotation.
(Et si tu as des capteurs à effet hall il te faut aussi inverser les 2 capteurs hall correspondant aux deux phases ... )
Oui, je comprends bien.
En fait, la difficulté est de contrôler . . . . . les contrôleurs moteur e-Bike.
Ces petites bêtes sont "intelligentes", et leurs réactions ne sont pas toujours évidentes.
Pour moi, il est extrêmement important de maitriser la technologie e-Bike.
Je pense que c'est avec ce matériel que l'on pourra réaliser des gros robots roulants, à des prix raisonnables.
Réutiliser la carte de puisse des hoverboards pour construire un UGV à 4 ou 6 roues de 6.5 pouces (mode tank) vous semble une solution viable (vitesse, couple, odométrie) ?
J'ai 10 wagons de retard. Je viens de flasher la carte de puissance avec le firmware hoverboard hack FOC, et je peux contrôler les moteurs avec une Rpi avec le retour de vitesse des deux roues.
Les cartes rouges sur tes moteurs c'est des cartes custom ? Ou bien c'est les cartes que tu avais de base sur ton overboard?
Dans ce type d'hoverboard, il y a trois cartes en tout : une carte de puissance et deux cartes capteurs (gyro, bluetooth). Je ne sais réutiliser que le première.
Elle dispose de deux connecteurs permettant de communiquer avec les cartes capteur droite et gauche et on peut configurer ces connecteurs en liaison série pour brancher une Arduino ou RPi par exemple.
-
Sinon, il existe un autre type d'hoverboard, dit Gen2, avec seulement deux cartes (split board). Le résultat est le même, à la différence est que le logiciel fonctionne en mode 6 phases et non en FOC.
J'ai fait une petite modification du firmware Gen2 pour pouvoir envoyer la valeur de PWM de chaque moteur via la liaison série (-1000..+1000). On récupère aussi la vitesse des roues via la liaison série (m/s). L'estimation de vitesse se fait sur une rotation de l'angle électrique complète. Je pense pouvoir modifier pour mesurer la vitesse sur une rotation de 60° (x6 plus précis). J'attends de voir comment la stack de navigation ROS se débrouille avec l'odométrie pour éventuelle faire la modification pour améliorer la préciison.
Réutiliser la carte de puisse des hoverboards pour construire un UGV à 4 ou 6 roues de 6.5 pouces (mode tank) vous semble une solution viable (vitesse, couple, odométrie) ?
J'ai 10 wagons de retard. Je viens de flasher la carte de puissance avec le firmware hoverboard hack FOC, et je peux contrôler les moteurs avec une Rpi avec le retour de vitesse des deux roues.
Patrick.
C'est la solution royale !
Le problème, c'est qu'il faut des compétences en STM32, et même plus, mais cela ne saurait te gêner.
Il y a quand même un inconvénient, c'est que cette carte est spécifique à l'Hoverboard. Ce n'est pas un contrôleur e-Bike.
Hors toute la technique des trottinettes, des Skateboards et des vélos électriques, est basée sur ces fameux contrôleurs e-Bike.
Si tu vas sur Ali et que tu cherches "contrôleur e-bike", ça tombe en pluie fine.
J'ai acheté 2 Hoverboards neufs, avec des nouvelles cartes qui sont beaucoup plus petites et qui sont à la place des cartes des capteurs de pression (les cartes dont tu parles, Mike) et de la même taille. Si cela t'intéresse, je peux t'en fournir une paire.
J'ai acheté 2 Hoverboards neufs, avec des nouvelles cartes qui sont beaucoup plus petites et qui sont à la place des cartes des capteurs de pression (les cartes dont tu parles, Mike) et de la même taille. Si cela t'intéresse, je peux t'en fournir une paire.
Bienvenue au club.
Merci.
Ca ressemble à ca tes cartes ? Ca m'interesse.
Le seul défaut, c'est l'absence de FOC dans le firmware disponible actuellement. Ajouter le FOC est un projet dans le projet. A voir, ca viendra peut être de la communauté un jour.
On habite en RP, tu n'es pas loin. Tu veux que je te dépanne pour programmer ton hoverboard ?
J'ai relu tous vos messages. La première étape est de monter les moteurs sur un châssis et de tester la commande de direction. Voir si ca tourne !
Je vous fais un retour rapidement et si ca fonctionne, on avise. On est plusieurs en RP à bidouiller ce type de cartes. On peut s'entraider pour la partie programmation/hack.
C'est 4 fils à raccorder et un logiciel de programmation STM32 à installer sur PC. Contre un café et une madeleine, je me déplace pour donner un coup de main, si besoin ... :-)
Comme les moteurs ne sont pas réductés, le couple au démarrage n'est pas énorme, même avec le firmware FOC.
Pour faire un robot qui peut tourner sur place avec 4 moteurs, mieux vaut le faire plus large que long...
Je pars sur un châssis avec seulement deux moteurs pour commencer, avec la carte hoverboard la plus répandue. Je vais essayer de coder le pilotage au gamepad, vite fait.
edit : Décalage des roues.
NB: Je viens de monter sur mon châssis et j'ai traversé le salon avec la radiocommande dans les mains ! Finalement, le couple et la vitesse sont plutôt bons !
Le robot est sur un support, les roues tournent librement. La consigne PWM est fixée à 122.
Pour l'instant, je ne m'intéresse qu'aux roues gauches.
A l'oscilloscope, une période du signal d'un capteur Hall s'étend sur environ 13 divisions de 10ms, soit 130ms, soit 1000/130 = 7.69Hz (environ 7 Hz à 8Hz).
Une fonction d'interruption (IRS) est déclenché sur front montant. La fréquence calculée par la fonction est d'environ du double de la consigne à 7Hz-8Hz.
C'est là que réside mon problème. Avant d'aller plus loin, j'aimerais bien le résoudre.
Le lien vers la fonction attachInterrupt() - Arduino Reference , à voir, les réserves sur l'utilisation de la fonctions micros() qui à priori ne me concernent pas.
Voici une image de la trace.
La fonction RC (Radio Commande) envoie une consigne de rotation à environ 8Hz aux roues gauche et droite ( L et R ).
La fonction ISR (interruption) récupère le TimesStamp des fronts montants d'un capteur Hall, alternativement aux temps A et B, et calcule la période et la fréquence.
Malheureusement, cette fréquence est d'environ du double de la consigne.
RC brk OrderHz: L 8 R 8 ISR: A 11894988 B 11963588Period68600HallHz: L 14 R 0
RC brk OrderHz: L 8 R 8 ISR: A 12034464 B 11963588Period70876HallHz: L 15 R 0
RC brk OrderHz: L 8 R 8 ISR: A 12034464 B 12099320Period71588HallHz: L 13 R 0
RC brk OrderHz: L 8 R 8 ISR: A 12170908 B 12238840Period67932HallHz: L 14 R 0
RC brk OrderHz: L 8 R 8 ISR: A 12310620 B 12238840Period71780HallHz: L 14 R 0
RC brk OrderHz: L 8 R 8 ISR: A 12310620 B 12379224Period71312HallHz: L 14 R 0
RC brk OrderHz: L 8 R 8 ISR: A 12450536 B 12516784Period66248HallHz: L 15 R 0
RC brk OrderHz: L 8 R 8 ISR: A 12588052 B 12516784Period71268HallHz: L 14 R 0
RC brk OrderHz: L 8 R 8 ISR: A 12588052 B 12655780Period70580HallHz: L 14 R 0
RC brk OrderHz: L 8 R 8 ISR: A 12726360 B 12794600Period68240HallHz: L 14 R 0
RC brk OrderHz: L 8 R 8 ISR: A 12864268 B 12794600Period69668HallHz: L 14 R 0
RC brk OrderHz: L 8 R 8 ISR: A 12864268 B 12929116Period69624HallHz: L 14 R 0
RC brk OrderHz: L 8 R 8 ISR: A 12998740 B 13065144Period66404HallHz: L 15 R 0
RC brk OrderHz: L 8 R 8 ISR: A 13134512 B 13065144Period69368HallHz: L 15 R 0
Le programme.
Spoiler
// BigRoverIRQ-V3 - 05/02/2023void(* resetFunc)(void)=0;// soft reset functionconstint pb = A0;// Start pgm buttonconstint PWM_OUT_L =5, PWM_OUT_R =6;// Pins PWM 976Hz Outputconstint DIR_OUT_L =10, DIR_OUT_R =11;// Pins Direction OutputvolatileintHall_L_pin=2,Hall_R_pin=3;// interrupt left and right volatileunsignedlongHall_Hz_L,Hall_Hz_R;// Hall sensors frequency left and rightvolatileunsignedlongHigh,Low,Period, ISR_A, ISR_B;// IRS function variables int SPEED =122;// speed state (PWM value) about 8Hzint c1=0, c2=0;// Radio Control channelsintOrder_L=0,Order_R=0;// left and right PWM ordersintOrder_Hz_L,Order_Hz_R;// left and right Hz ordersvoid setup(){
delay(500);// for reset considerationSerial.begin(9600);
pinMode(pb,INPUT_PULLUP);// Stop/Start button
pinMode(A1,INPUT); pinMode(A2,INPUT);// channels 1 and 2 receiver input
pinMode(Hall_L_pin, INPUT);// Hall sensor Left wheels
pinMode(Hall_R_pin, INPUT);// Hall sensor Right wheels
pinMode(DIR_OUT_R, OUTPUT); digitalWrite(DIR_OUT_R, HIGH);// Direction order forward or backward, right wheels
pinMode(DIR_OUT_L, OUTPUT); digitalWrite(DIR_OUT_L, HIGH);// Direction order forward or backward, left wheels
pinMode(PWM_OUT_R, OUTPUT); analogWrite(PWM_OUT_R,0);// PWM order right wheels
pinMode(PWM_OUT_L, OUTPUT); analogWrite(PWM_OUT_L,0);// PWM order right wheels
attachInterrupt(digitalPinToInterrupt(Hall_L_pin), ISR_Hz_Hall_L, HIGH);// Attach Interrupt for Hall sensor left wheelSerial.print("\n To start pgm, click on the Start button");while(digitalRead(pb)); delay(400);Serial.print("\n Started"); delay(100);}void loop(){if(! digitalRead(pb)){Serial.print("\n Operator Application Interrupt !!!"); delay(400); resetFunc();}
RC();
DBG();}void RC(){// Radio Controlstaticint old_Order_L;
c1 = pulseIn(A1,HIGH,30000);// receiver channel 1 getting value turn Left and Right
c2 = pulseIn(A2,HIGH,30000);// receiver channel 2 getting value Forward and Backwardif(c1==0|| c2==0){Serial.print("\n RC off !!!"); DBG(); delay(500); resetFunc();}// if RC off then resetif(c2 >=1600)Forward();if(c2 <1400)Backward();if(c2 >=1400&& c2 <1600)Stop();if(Order_L== old_Order_L){Serial.print("\n RC brk");return;}// if same order, returnelse{old_Order_L =Order_L;Serial.print("\n RC newVal #############################\n");}
analogWrite(PWM_OUT_R,Order_R);// write PWM value to output with LowPass Filter
analogWrite(PWM_OUT_L,Order_L);// write PWM value to output with LowPass Filter }voidStop(){Order_L=0;Order_R=0;Order_Hz_L=0;Order_Hz_R=0;
digitalWrite(DIR_OUT_L, HIGH);
digitalWrite(DIR_OUT_R, HIGH);}voidForward(){Order_L= SPEED;Order_R=Order_L;Order_Hz_L= map(Order_L,115,130,0,18);Order_Hz_R=Order_Hz_L;
digitalWrite(DIR_OUT_L, HIGH);
digitalWrite(DIR_OUT_R, HIGH);}voidBackward(){Order_L= SPEED;Order_R=Order_L;Order_Hz_L= map(Order_L,115,130,0,18);Order_Hz_R=Order_Hz_L;
digitalWrite(DIR_OUT_L, LOW);
digitalWrite(DIR_OUT_R, LOW);}void DBG(){Serial.print("\tOrder Hz: L ");Serial.print(Order_Hz_L);Serial.print(" R ");Serial.print(Order_Hz_R);Serial.print("\tISR: A ");Serial.print(ISR_A);Serial.print(" B ");Serial.print(ISR_B);Serial.print(" Period ");Serial.print(Period);Serial.print("\tHall Hz: L ");Serial.print(Hall_Hz_L);Serial.print(" R ");Serial.print(Hall_Hz_R);}void ISR_Hz_Hall_L(){// Interrupt Service Routinestaticbool i=HIGH;if(i){ ISR_A = micros();Period= ISR_A - ISR_B;Hall_Hz_L=1000000/Period;}else{ ISR_B = micros();Period= ISR_B - ISR_A;Hall_Hz_L=1000000/Period;}
i =!i;}
attachInterrupt(digitalPinToInterrupt(Hall_L_pin), ISR_Hz_Hall_L, HIGH);// Attach Interrupt for Hall sensor left wheel
hors, d'après la documentation de la fonction attachInterupt (cf lien que tu as donné), la valeur "HIGH" n'est utilisable que pour les arduinos Due, Zero et MKR1000 (il me semble que tu utilises une Arduino Nano).
Normalement, les interruptions se font sur front montant (RISING) ou desendant (FALLING). Essaye un de ces deux pour voir si ça résout le problème.
Sinon, tu peux aussi utiliser CHANGE, mais dans ce cas tu vas mesurer la demi-période au lieu de la période (ça peut être utile pour augmenter ta fréquence de lecture de ta vitesse). Dans ce cas, la période, c'est 2 fois la différence.
Sinon, vu que tu demandais des remarques : dans la routine ISR, est-ce que ça sert à quelque chose d'utiliser la variable i, plutôt que de juste stocker la valeur précédente. Que dirais tu de :
Du coup, ça t'évite les variables globales ISR_A et ISR_B : au lieu de 2 varialbes globales + 1 static, tu as maintenant 1 variable local + 1 static. Et je trouve ça plus lisible.
Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...
Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.
RC brk OrderHz: L 8 R 8 ISR: A 10066536 B 10204360Period137824HallHz: L 7 R 0
RC brk OrderHz: L 8 R 8 ISR: A 10066536 B 10204360Period137824HallHz: L 7 R 0
RC brk OrderHz: L 8 R 8 ISR: A 10342692 B 10204360Period138332HallHz: L 7 R 0
RC brk OrderHz: L 8 R 8 ISR: A 10342692 B 10478236Period135544HallHz: L 7 R 0
RC brk OrderHz: L 8 R 8 ISR: A 10342692 B 10478236Period135544HallHz: L 7 R 0
RC brk OrderHz: L 8 R 8 ISR: A 10617632 B 10478236Period139396HallHz: L 7 R 0
RC brk OrderHz: L 8 R 8 ISR: A 10617632 B 10758108Period140476HallHz: L 7 R 0
RC brk OrderHz: L 8 R 8 ISR: A 10617632 B 10758108Period140476HallHz: L 7 R 0
Demain, je vais étudier ton code d'interruption.
Pour ce soir, je voulais te donner le résultat du RISING.