Salut,
Je propose ici un test du Kit robot à chenille avec encodeurs.
Il est déjà entièrement assemblé, le châssis est soudé et les moteurs montés comme le montre la photo.
Bon pour commencer on va faire fonctionner ce mini char sans les encodeurs présents sur les moteurs chaque chose en son temps !
C'est un peu dommage, mais pour l'utiliser il faudra d'abord rallonger les fils d'alimentation des moteurs qui sont trop courts pour être branchés sur un quelconque driver .
Pour jouer avec ce petit char j'utilise : une radiocommande, un driver de moteur CC, un clone d'Arduino Uno et une batterie Li-Po.
Les branchements s'effectuent comme dans le test pour le driver puisque c'est le même.
Pour fixer les cartes sur le châssis, il y a plusieurs emplacement possible, il suffit d'en trouver un qui convient. Par contre comme les moteurs sont déjà montés et gènent un peu, c'est pas toujours évident pour positionner les vis et les entretoises.
Quelques images du robot avec les cartes :
J'ai commencé par faire un programme simple pour piloter uniquement le robot en avant ou en arrière en fonction des ordres de la radiocommande.
Je mets le code et une image une fois dans l'IDE (au cas ou le web editor ne fonctionne pas ).
// Contrôle PWM simple #define PB 3 // Contrôle vitesse moteur 1 #define B1 5 // Contrôle direction moteur 1 #define B2 6 #define PA 9 // Contrôle vitesse moteur 2 #define A1 10 // Contrôle direction moteur 2 #define A2 11 // Déclaration des variables correspondantes int ch2; // aux différentes channels int ch3; unsigned int vitesse; //vitesse de commande des moteurs void stop() //Stop { digitalWrite(PB,LOW); digitalWrite(PA,LOW); } void avance(int vitesse) // En avant { analogWrite (PB,vitesse); // Contrôle de vitesse en PWM digitalWrite(B1,LOW); digitalWrite(B2,HIGH); analogWrite (PA,vitesse); digitalWrite(A1,LOW); digitalWrite(A2,HIGH); } void recule (int vitesse) // En arrière { analogWrite (PB,vitesse); digitalWrite(B1,HIGH); digitalWrite(B2,LOW); analogWrite (PA,vitesse); digitalWrite(A1,HIGH); digitalWrite(A2,LOW); } void setup() { pinMode(PB, OUTPUT); pinMode(B1, OUTPUT); pinMode(B2, OUTPUT); pinMode(PA, OUTPUT); pinMode(A1, OUTPUT); pinMode(A2, OUTPUT); // Configuration des broches pinMode(4, INPUT); // comme entrées pinMode(7, INPUT); Serial.begin(9600); // Démarage de la liaison série } void loop() { // Lit la largeur d'impulsion de ch2 = pulseIn(4, HIGH, 25000); // chaque channel delay(5); ch3 = pulseIn(7, HIGH, 25000); delay(5); vitesse=map(ch3,980,2000,0,255); //valeur vitesse de commande Serial.print("Channel 2:"); Serial.println(ch2); Serial.print("Channel 3:"); Serial.println(ch3); if(ch2==0){ //radiocommande éteinte stop(); } else{ if ((ch2>1470) and (ch2<1490)){ stop(); } if (ch2>1490){ //joystick en avant avance(vitesse); } if (ch2<1470){ //joystick en arrière recule(vitesse); } } }
J'ai essayé un programme pour ajouter une fonction de rotation au robot. Et là ça devient un peu plus compliqué avec la gestion des différentes positions des joysticks .
// Contrôle PWM simple #define PB 3 // Contrôle vitesse moteur 1 #define B1 5 // Contrôle direction moteur 1 #define B2 6 #define PA 9 // Contrôle vitesse moteur 2 #define A1 10 // Contrôle direction moteur 2 #define A2 11 int ch1; // Déclaration des variables correspondantes int ch2; // aux différentes channels int ch3; unsigned int vitesse; //vitesse de commande des moteurs void stop() //Stop { digitalWrite(PB,LOW); digitalWrite(PA,LOW); } void avance(int vitesse) // En avant { analogWrite (PB,vitesse); // Contrôle de vitesse en PWM digitalWrite(B1,LOW); digitalWrite(B2,HIGH); analogWrite (PA,vitesse); digitalWrite(A1,LOW); digitalWrite(A2,HIGH); } void recule (int vitesse) // En arrière { analogWrite (PB,vitesse); digitalWrite(B1,HIGH); digitalWrite(B2,LOW); analogWrite (PA,vitesse); digitalWrite(A1,HIGH); digitalWrite(A2,LOW); } void tourne_G (int vitesseB,int vitesseA) // Tourne à gauche { analogWrite (PB,vitesseB); digitalWrite(B1,LOW); digitalWrite(B2,HIGH); analogWrite (PA,vitesseA); digitalWrite(A1,LOW); digitalWrite(A2,HIGH); } void tourne_D (int vitesseB,int vitesseA) // Tourne à droite { analogWrite (PB,vitesseA); digitalWrite(B1,LOW); digitalWrite(B2,HIGH); analogWrite (PA,vitesseB); digitalWrite(A1,LOW); digitalWrite(A2,HIGH); } void tourne_G_AR (int vitesseB,int vitesseA) // Tourne à gauche en arrière { analogWrite (PB,vitesseB); digitalWrite(B1,HIGH); digitalWrite(B2,LOW); analogWrite (PA,vitesseA); digitalWrite(A1,HIGH); digitalWrite(A2,LOW); } void tourne_D_AR (int vitesseB,int vitesseA) // Tourne à droite en arrière { analogWrite (PB,vitesseA); digitalWrite(B1,HIGH); digitalWrite(B2,LOW); analogWrite (PA,vitesseB); digitalWrite(A1,HIGH); digitalWrite(A2,LOW); } void setup() { pinMode(PB, OUTPUT); pinMode(B1, OUTPUT); pinMode(B2, OUTPUT); pinMode(PA, OUTPUT); pinMode(A1, OUTPUT); pinMode(A2, OUTPUT); pinMode(2, INPUT); // Configuration des broches pinMode(4, INPUT); // comme entrées pinMode(7, INPUT); Serial.begin(9600); // Démarage de la liaison série } void loop() { ch1 = pulseIn(2, HIGH, 25000); // Lit la largeur d'impulsion de delay(5); ch2 = pulseIn(4, HIGH, 25000); // chaque channel delay(5); ch3 = pulseIn(7, HIGH, 25000); delay(5); vitesse=map(ch3,980,2000,0,255); //valeur vitesse Serial.print("Channel 1:"); Serial.println(ch1); Serial.print("Channel 2:"); Serial.println(ch2); Serial.print("Channel 3:"); Serial.println(ch3); if(ch2==0){ //radiocommande éteinte stop(); } else{ if ((ch2>1470) and (ch2<1490)){ stop(); } if (ch2>1490){ //joystick en avant avance(vitesse); } if ((ch1>1490) and (ch2>1490)){ //joystick à droite en avant if (vitesse<128){ tourne_D(vitesse,255-vitesse); } else{ tourne_D(255-vitesse,vitesse); } } if ((ch1<1470) and (ch2>1490)){ //joystick à gauche en avant if(vitesse<128){ tourne_G(vitesse,255-vitesse); } else{ tourne_G(255-vitesse,vitesse); } } if (ch2<1470){ //joystick en arrière recule(vitesse); } if ((ch1>1490) and (ch2<1470)){ //joystick à droite en arrière if(vitesse<128){ tourne_D_AR(vitesse,255-vitesse); } else{ tourne_D_AR(255-vitesse,vitesse); } } if ((ch1<1470) and (ch2<1470)){ //joystick à gauche en arrière if(vitesse<128){ tourne_G_AR(vitesse,255-vitesse); } else{ tourne_G_AR(255-vitesse,vitesse); } } } }
Finalement voici le robot en action :
Bon.. les commandes ne sont pas encore tout à fait au point mais il y a de l'évolution !
EDIT : Voici le tutoriel complet pour fabriquer votre char.