
Radio rc et pont h
#1
Posté 13 février 2016 - 03:58
Débutant en arduino, je cherche un sketch qui servirai à piloter 2 moteurs avec un pont h et un ensemble radio/récepteur RC.
Merci d'avance pour votre aide
#2
Posté 13 février 2016 - 05:32
Alors si tu cherches juste un sketch tout fait, en recherchant sur google tu peux en trouver plusieurs...
Par contre si tu cherches à faire ce sketch toi même, et du coup apprendre pas mal de choses tu es au bon endroit
En plus de bien comprendre le sketch tu auras à mon avis un sketch qui sera bien plus efficace et optimisé que plus de 50% des trucs que tu pourras trouver tout fait !
Dans ce cas il faut décomposer le problème en 3 et avancer étape par étape.
1) Acquérir le signal RC
a) Comprendre comment fonctionne le signale
b ) Developper la fonction permettant d'extraire les valeurs du signal
2) Piloter 2 moteurs
a) Comprendre comment fonctionne le pont en H que tu utilises
b ) Développer la fonction permettant de convertir des valeur en pilotage du moteur
3) Traiter le signal RC
a) Définir les plage de valeurs entrante reçu et les valeurs sortantes pour piloter le moteur qu'on souhaite avoir ( normalement déjà fait avec 1 & 2 )
b ) Développer la fonction qui permet de faire le mappage entre les entrée et sorties
Du coup choisis ton étape fait un peu de recherche, pose tes questions précises et tu auras des réponses
à très bientôt !
Si mon commentaire vous a plus laissez nous un avis !
Nouveau sur Robot Maker ?
Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope aux articles, à la boutique et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être !
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!
#3
Posté 13 février 2016 - 06:02
1ère étape : lire signal du récepteur
J'ai trouvé un sketch pour lire le signal du récepteur qui utilise la fonction pulseIn.
Mais quand je l'utilise, les valeurs lues par moniteur arduino ne cessent de varier, pourquoi ?
#4
Posté 13 février 2016 - 07:17
Eh bien bienvenu sur le forum Je te suggère de te présenter dans la rubrique adéquate ainsi on en saura un peu plus sur toi et ça peut être pratique pour mieux t'aider
Ensuite justement, si je te disais
un sketch qui sera bien plus efficace et optimisé que plus de 50% des trucs que tu pourras trouver tout fait !
C'est par ce que justement la plus part des sketch que tu vas trouver va utiliser pulsIn, mais c'est pas du tout les plus adapté.
Avant de continuer est ce que tu es bien au point sur le point 1 a ) ? En gros la forme du signal =) ?
PS : combien de signal RC souhaite tu lire avec ta arduino ?
Si mon commentaire vous a plus laissez nous un avis !
Nouveau sur Robot Maker ?
Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope aux articles, à la boutique et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être !
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!
#5
Posté 13 février 2016 - 08:03
Point 1a : a priori ok
j'ai lu qu'il y avait une manière de faire sans la fonction pulseIn mais j'ai pris peur.
#6
Posté 13 février 2016 - 08:15
En effet c'est pas simple sans pulseIn mais terriblement plus optimisé. Si ça t'a fait peur on pourra revenir dessus plus tard et commencer avec pulseIn.
Si le point 1 a) et ok, commence par poster ce que tu as déjà fait. et montre nous ces résultats qui "varient "
On va voir si il y a une petite erreur de code ou pas
Si mon commentaire vous a plus laissez nous un avis !
Nouveau sur Robot Maker ?
Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope aux articles, à la boutique et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être !
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!
#7
Posté 13 février 2016 - 10:58
Pour tester, j'ai fait cela :
int ch2;
ch2 = pulseIn(5, HIGH, 25000);
}
affichage moniteur (pas réussi à coller l'image du moniteur) :
1
1345
1
1350
1
1
11575
1
1350
2
1
1
11649
#8
Posté 14 février 2016 - 03:22
Hum je ne vois pas où est le problème ...
Bien que cela ne soit pas du tout optimisé le code suivant ( similaire au tien ) devrait fonctionner :
int ch2; // déclaration de la variable ch2 qui va contenir le channel 2 void setup() { pinMode(5, INPUT); // On met le pin 5 en entré car channel 2 branché sur pin 5 Serial.begin(9600); // initialisation de la communicaction série avec un baud rate de 9600 } void loop() { ch2 = pulseIn(5, HIGH, 25000); // Lecture du pulse Serial.print("Channel 2:"); Serial.println(ch2); delay(100); // On attend un peu histoire de ne pas "flood" la console }
Es tu sur que ton channel 2 est bien branché sur la pin 5 ?
Avec le code fournit que te dit la console ?
Si mon commentaire vous a plus laissez nous un avis !
Nouveau sur Robot Maker ?
Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope aux articles, à la boutique et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être !
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!
#9
Posté 14 février 2016 - 07:29
J'ai refait le test avec un autre récepteur RC, ça fonctionne !!!
Je l'ai testé avec les 2 sketchs, parfait.
Pour les valeurs :
pos mini : 1033
neutre : 1432
pos max : 1828
je comprends mieux maintenant !!!
Ensuite, je pensais convertir les valeurs du récepteur pour les adapter à ce programme qui utilise un joystick 2 axes filaire.
C'est possible de faire cela?
// Définition des broches analogique #define JOYSTICK_X A0 // X -> droite / gauche #define JOYSTICK_Y A1 // Y -> vitesse / direction // Définition des états des moteurs #define MOTEUR_STOP 0 #define MOTEUR_AVANCE 1 #define MOTEUR_RECULE 2 // Définition de la marge autour du point d'origine (0, 0) // Permet d'éviter que les moteurs n'oscille entre MOTEUR_AVANCE et MOTEUR_RECULE #define THRESHOLD 20 // Définition de la valeur maximum pour la vitesse #define MAX_SPEED 127 // Variables global // calX : calibration en 0 de l'axe X // calY : calibration en 0 de l'axe Y // vitesse : vitesse calculé // direction : direction calculé int calX, calY, vitesse, direction; // coefG : coefficient de vitesse (entre 0 et 1) pour le moteur gauche // coefD : coefficient de vitesse (entre 0 et 1) pour le moteur droit float coefG, coefD; // setup() void setup() { // Initialisation du port série Serial.begin(115200); // Calibration de la valeur (0, 0) du joystick calX = analogRead(JOYSTICK_X); calY = analogRead(JOYSTICK_Y); } // loop() void loop() { // Calcul des données getData(calX, calY, &coefG, &coefD, &vitesse, &direction); // Affichage de la vitesse du moteur gauche Serial.print("Moteur Gauche : "); Serial.println((int)(vitesse * coefG)); // Affichage de la vitesse du moteur droit Serial.print("Moteur Droit : "); Serial.println((int)(vitesse * coefD)); // Affichage de la direction des moteurs Serial.print("Direction : "); if(direction == MOTEUR_AVANCE) // Vers l'avant Serial.println("AVANT"); else if(direction == MOTEUR_RECULE) // Vers l'arriére Serial.println("ARRIERE"); else Serial.println("ARRET"); // Aucun mouvement // Delai de 500ms pour pouvoir lire la console delay(500); } // Fonction calculant les divers coefficient de vitesse, la direction, ainsi que la vitesse void getData(int calX, int calY, float *coefG, float *coefD, int *vitesse, int *direction) { // rawX : valeur brute en X du joystick centrée sur calX // rawY : valeur brute en Y du joystick centrée sur calY int rawX, rawY; // Mesure des valeurs brute en X et Y rawX = analogRead(JOYSTICK_X) - calX; rawY = analogRead(JOYSTICK_Y) - calY; // Si -THRESHOLD < rawY < THRESHOLD if(rawY > -THRESHOLD && rawY < THRESHOLD) { // Les moteurs sont marqués comme arrétés, et vitesse = 0 *direction = MOTEUR_STOP; *vitesse = 0; } // Si rawY >= 0 else if(rawY >= 0) { // Les moteurs sont marqués en mode "recule" *direction = MOTEUR_RECULE; // La vitesse est égale à map(rawY) depuis 0 ~ (1023 - calY) vers 0 ~ MAX_SPEED *vitesse = map(rawY, 0, 1023 - calY, 0, MAX_SPEED); } // Si rawY < 0 else { // Les moteurs sont marqués en mode "recule" *direction = MOTEUR_AVANCE; // La vitesse est égale à map(rawY) depuis 0 ~ calY vers 0 ~ MAX_SPEED *vitesse = map(-rawY, 0, calY, 0, MAX_SPEED); } // Si rawX < -THRESHOLD alors coefG = -rawX / calX sinon coefG = 1 *coefG = (rawX < -THRESHOLD) ? -rawX / (float)calX : 1; // Si rawX > THRESHOLD alors coefD = rawX / calX sinon coefD = 1 *coefD = (rawX > THRESHOLD) ? rawX / (float)calX : 1; }
#10
Posté 14 février 2016 - 08:20
Si tu veux juste modifier le code pour le rendre compatible tu peux modifier la fonction getData et remplacer
"analogRead(JOYSTICK_X) " par " pulseIn(5, HIGH, 25000); "
pense aussi à modifier calX par la valeur du neutre du channel branché sur le pin 5.
et change aussi l'ensemble pour l'axe y...
Par contre si tu veux améliorer le code mieux vaut séparer les fonctions.
- Acquisition
-
Traitement
-
Exploitation
Si mon commentaire vous a plus laissez nous un avis !
Nouveau sur Robot Maker ?
Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope aux articles, à la boutique et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être !
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!
#11
Posté 14 février 2016 - 09:54
Ok merci.
je vais essayé.
#12
Posté 15 février 2016 - 07:28
Nikel ! j'ai fait comme tu me l'as dit.
Un grand merci !!
#13
Posté 15 février 2016 - 07:56
N'hésites pas à poster tes résultats pour que ceux qui liront le sujet puissent en profiter
Si mon commentaire vous a plus laissez nous un avis !
Nouveau sur Robot Maker ?
Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope aux articles, à la boutique et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être !
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!
#14
Posté 20 février 2016 - 12:07
Bon revenons au sujet du post, j'avais trouvé un code qui utilisait une commande d'un pont H par joystick analogique filaire pour piloter 2 moteurs DC;
Voici le code avec les commentaires (en rouge) pour le modifier et obtenir une commande par une radio RC :
#define motorPin1a 1 // Marche avant du premier moteur #define motorPin1b 2 // Marche arrière du premier moteur #define speedPin1 3 // L293D enable pin pour le premier moteur #define motorPin2a 4 // Marche avant du deuxième moteur #define motorPin2b 7 // Marche arrière du deuxième moteur #define speedPin2 5 // L293D enable pin pour le deuxième moteur #define JoyStickPin1 1 // #define JoyStickPin1 11 #define JoyStickPin2 2 // #define JoyStickPin2 12 int Mspeed= 0; int Mspeed1 = 0; int Mspeed2 = 0; unsigned long time; void setup() { // réglage des broches à output pinMode(motorPin1a, OUTPUT); pinMode(motorPin1b, OUTPUT); pinMode(speedPin1, OUTPUT); pinMode(motorPin2a, OUTPUT); pinMode(motorPin2b, OUTPUT); pinMode(speedPin2, OUTPUT); } void loop() { Mspeed1 = (analogRead(JoyStickPin1)-511)/2; // Mspeed1 = (pulseIn(11,HIGH,25000)-1432)/2; 1432 est la valeur du neutre Mspeed1 = Mspeed1 - (analogRead(JoyStickPin2)-511)/2; // Mspeed1 = Mspeed1 - (pulseIn(12,HIGH,25000)-1432)/2; if (Mspeed1 > 255) { Mspeed1 = 255; } if (Mspeed1 < -255) { Mspeed1 = -255; } Mspeed2 = (analogRead(JoyStickPin1)-511)/2; // Mspeed2 = (pulseIn(11,HIGH,25000)-1432)/2; Mspeed2 = Mspeed2 + (analogRead(JoyStickPin2)-511)/2; Mspeed2 = Mspeed2 + (pulseIn(12,HIGH,25000)-1432)/2; if (Mspeed2 > 255) { Mspeed2 = 255; } if (Mspeed2 < -255) { Mspeed2 = -255; } if (Mspeed1 > 0) // donc marche arrière { analogWrite(speedPin1, abs(Mspeed1)); digitalWrite(motorPin1a, LOW); digitalWrite(motorPin1b, HIGH); } else { // donc marche avant (ou repos) analogWrite(speedPin1, abs(Mspeed1)); digitalWrite(motorPin1a, HIGH); digitalWrite(motorPin1b, LOW); } if (Mspeed2 > 0) // donc marche arrière { analogWrite(speedPin2, abs(Mspeed2)); digitalWrite(motorPin2a, LOW); digitalWrite(motorPin2b, HIGH); } else // donc marche avant (ou repos) { analogWrite(speedPin2, abs(Mspeed2)); digitalWrite(motorPin2a, HIGH); digitalWrite(motorPin2b, LOW); } }
voilà !!
#15
Posté 20 février 2016 - 05:40
Bon ça te dit d'aller un peu plus loin maintenant ? =)
Il faudrait que ton code ressemble à ça :
// liste des define #define motorPin1a 1 // à compléter // Déclarations des variables globales il faut essayer de les limiter int Mspeed= 0; // à compléter void setup() { // réglage des broches à output pinMode(motorPin1a, OUTPUT); pinMode(motorPin1b, OUTPUT); pinMode(speedPin1, OUTPUT); pinMode(motorPin2a, OUTPUT); pinMode(motorPin2b, OUTPUT); pinMode(speedPin2, OUTPUT); } void loop() { upateRCvalue(); // Fonction qui permet de récupérer les valeur RC convertRCvalue(); // Fonction qui transforme la valeur RC en vitesse à envoyer applyCommandSpeed(); // Fonction qui permet de commander la vitesse souhaité au moteur } // ici tu mets tes fonctions ...
Après il y a plusieurs façon de faire ça, tu peux commencer en utilisant les variable globales, mais c'est mieux d'apprendre dès le début à limiter leur usage.
Il est préférable d'utiliser des pointeurs par exemple =).
Tout comme il y a mieux pour lire la valeur RC que pulseIn () ...
Après libre à toi de vouloir améliorer ou pas =)
Si mon commentaire vous a plus laissez nous un avis !
Nouveau sur Robot Maker ?
Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope aux articles, à la boutique et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être !
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!
#16
Posté 21 février 2016 - 06:28
Je commence simple mais déjà les questions arrivent :
* j'ai remplacé joystickpin 1et 2 par rcvalueX et rcvalueY : c'est possible ?
* je comprends pas bien Mspeed car il n'est pas utilisé dans le code alors que Mspeed1 et Mspeed2.
Merci par avance de ta patience !
// liste des define #define motorPin1a 1 // Marche avant du premier moteur #define motorPin1b 2 // Marche arrière du premier moteur #define speedPin1 3 // L293D enable pin pour le premier moteur #define motorPin2a 4 // Marche avant du deuxième moteur #define motorPin2b 7 // Marche arrière du deuxième moteur #define speedPin2 5 // L293D enable pin pour le deuxième moteur #define RCvalueX 11 // Valeur de la RC en X #define RCvalueY 12 // Valeur de la RC en Y // Déclarations des variables globales il faut essayer de les limiter int Mspeed= 0; int Mspeed1 = 0; int Mspeed2 = 0; unsigned long time; void setup() { pinMode(motorPin1a, OUTPUT); // réglage des broches en output pinMode(motorPin1b, OUTPUT); pinMode(speedPin1, OUTPUT); pinMode(motorPin2a, OUTPUT); pinMode(motorPin2b, OUTPUT); pinMode(speedPin2, OUTPUT); }
#17
Posté 21 février 2016 - 07:09
#define RCpinX 11 // pin utilisé pour la voie RC x #define RCpinY 12 // pin utilisé pour la voie RC y
et les variables globales // variable globale pour commencer on améliorera après en supprimant au fur et à mesure ces variables
int RCvalueX 127 // Valeur de la RC en X int RCvalueY 127 // Valeur de la RC en Y
Ensuite pour Mspeed, c'était juste une variable comme ça, à toi de mettre les variable dont tu as besoin.
Je ne t'ai donné qu'une "structure " pour ton code, le reste tu dois le modifier

De plus il te faut ajouter les 3 fonctions aussi =)
bonne continuation !
Si mon commentaire vous a plus laissez nous un avis !
Nouveau sur Robot Maker ?
Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope aux articles, à la boutique et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être !
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!
1 utilisateur(s) li(sen)t ce sujet
0 members, 1 guests, 0 anonymous users