Aller au contenu


Photo
- - - - -

Radio rc et pont h


  • Veuillez vous connecter pour répondre
16 réponses à ce sujet

#1 zuzu

zuzu

    Nouveau membre

  • Membres
  • 9 messages

Posté 13 février 2016 - 03:58

Bonjour à tous,

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 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 964 messages
  • Gender:Male
  • Location:Anglet

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  !  :thank_you:

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!

 

Les réalisations de Mike118  

 

 

 


#3 zuzu

zuzu

    Nouveau membre

  • Membres
  • 9 messages

Posté 13 février 2016 - 06:02

Mon but est d'apprendre ( arduineur depuis 5 jours).

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 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 964 messages
  • Gender:Male
  • Location:Anglet

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  !  :thank_you:

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!

 

Les réalisations de Mike118  

 

 

 


#5 zuzu

zuzu

    Nouveau membre

  • Membres
  • 9 messages

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 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 964 messages
  • Gender:Male
  • Location:Anglet

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  !  :thank_you:

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!

 

Les réalisations de Mike118  

 

 

 


#7 zuzu

zuzu

    Nouveau membre

  • Membres
  • 9 messages

Posté 13 février 2016 - 10:58

Pour tester, j'ai fait cela :


int ch2;
void setup() {
pinMode(5, INPUT);
Serial.begin(9600);
}
void loop() {
  ch2 = pulseIn(5, HIGH, 25000);
Serial.println(ch2);
delay(25);
}

affichage moniteur (pas réussi à coller l'image du moniteur) :

1

1345

1

1350

1

1

11575

1

1350

2

1

1

11649 



#8 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 964 messages
  • Gender:Male
  • Location:Anglet

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  !  :thank_you:

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!

 

Les réalisations de Mike118  

 

 

 


#9 zuzu

zuzu

    Nouveau membre

  • Membres
  • 9 messages

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 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 964 messages
  • Gender:Male
  • Location:Anglet

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  !  :thank_you:

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!

 

Les réalisations de Mike118  

 

 

 


#11 zuzu

zuzu

    Nouveau membre

  • Membres
  • 9 messages

Posté 14 février 2016 - 09:54

Ok merci.
 
je vais essayé.



#12 zuzu

zuzu

    Nouveau membre

  • Membres
  • 9 messages

Posté 15 février 2016 - 07:28

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

 

Un grand merci !!



#13 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 964 messages
  • Gender:Male
  • Location:Anglet

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  !  :thank_you:

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!

 

Les réalisations de Mike118  

 

 

 


#14 zuzu

zuzu

    Nouveau membre

  • Membres
  • 9 messages

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 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 964 messages
  • Gender:Male
  • Location:Anglet

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  !  :thank_you:

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!

 

Les réalisations de Mike118  

 

 

 


#16 zuzu

zuzu

    Nouveau membre

  • Membres
  • 9 messages

Posté 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);
 
}
​


#17 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 964 messages
  • Gender:Male
  • Location:Anglet

Posté 21 février 2016 - 07:09

hum déjà je pense que tu devrais distinguer : 
 
#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 ;).  Que ce soit le contenu des define des variable globale du setup etc... 

De plus il te faut ajouter les 3 fonctions aussi =) 

 
bonne continuation !

Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

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!

 

Les réalisations de Mike118  

 

 

 





0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users