Nikel ! j'ai fait comme tu me l'as dit.
Un grand merci !!
Il y a 9 élément(s) pour zuzu (recherche limitée depuis 05-mai 13)
Posté par zuzu sur 15 février 2016 - 07:28 dans Programmation
Nikel ! j'ai fait comme tu me l'as dit.
Un grand merci !!
Posté par zuzu sur 20 février 2016 - 12:07 dans Programmation
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à !!
Posté par zuzu sur 21 février 2016 - 06:28 dans Programmation
// 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); }
Posté par zuzu sur 14 février 2016 - 09:54 dans Programmation
Ok merci.
je vais essayé.
Posté par zuzu sur 14 février 2016 - 07:29 dans Programmation
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; }
Posté par zuzu sur 13 février 2016 - 06:02 dans Programmation
Posté par zuzu sur 13 février 2016 - 08:03 dans Programmation
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.
Posté par zuzu sur 13 février 2016 - 10:58 dans Programmation
Pour tester, j'ai fait cela :
affichage moniteur (pas réussi à coller l'image du moniteur) :
1
1345
1
1350
1
1
11575
1
1350
2
1
1
11649
Posté par zuzu sur 13 février 2016 - 03:58 dans Programmation