Aller au contenu


zuzu

Inscrit(e) (le) 13 févr. 2016
Déconnecté Dernière activité févr. 21 2016 06:47
-----

Messages que j'ai postés

Dans le sujet : Radio rc et pont h

21 février 2016 - 06:28

Bon je veux bien me lancer. Ne m'en veux pas si je pose des questions débiles !!!
 
 
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);
 
}
​

Dans le sujet : Radio rc et pont h

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à !!


Dans le sujet : Radio rc et pont h

15 février 2016 - 07:28

Nikel ! j'ai fait comme tu me l'as dit.

 

Un grand merci !!


Dans le sujet : Radio rc et pont h

14 février 2016 - 09:54

Ok merci.
 
je vais essayé.


Dans le sujet : Radio rc et pont h

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;
}
​