Aller au contenu


Photo
- - - - -

Mon projet perso de robot mobile - présentation et demande d'avis


15 réponses à ce sujet

#1 Mickixe

Mickixe

    Nouveau membre

  • Membres
  • 17 messages
  • Gender:Male
  • Location:La Roche sur Yon

Posté 16 janvier 2020 - 11:42

Bonjour,
 
Comme indiqué dans ma présentation, jusque là j'étais un peu touche à tout, même si je suis resté principalement sur l'arduino.
J'ai toutefois décidé de me lancer dans un projet un peu plus concret et fonctionnel, de manière à mettre en application ce que j'ai pu apprendre jusque là. Objectifs : continuer d'apprendre et s'amuser !
 
Je suis donc parti sur un projet de robot mobile autonome comportant :
- 4 roues mecanum (roues imprimées en 3D (fichiers récupérées sur Thingiverse) et actionnées par des moteurs cc 12V),
- 1 écran LCD matérialisant des yeux qui suivront les mouvements du robot (voire pouvoir changer d'expression),
- 1 haut-parleur émettant des sons enregistrés sur une carte SD,
- de la lumière,
- 1 capteur IR pour avoir la possibilité de le piloter avec une télécommande (et faire ainsi des tests),
- des capteurs US
- un bras muni d'une pince (encore en projet pour l'instant)
 
Pour le châssis, je suis parti pour l'instant sur du carton plume, que je trouve parfait pour une phase de prototypage (perçage à volonté et remplacement facile en cas de casse).
Les pièces de support des composants sont imprimés en 3D (modélisées avec Tinkercad) 
 
Mon montage repose actuellement sur 2 arduino uno :
- 1 avec un shield moteur et qui commande l'écran LCD, les LED, le HP (et donc la lecture de la carte SD) et la réception IR (plus vraiment de pins dispos sur cette carte).
- 1 seconde que je destine pour les capteurs (pour le moment, tests en cours avec des US).
Communication série RX/TX entre les 2 arduino.
 
Voilà le rendu actuel (désolé pour le manque de propreté du câblage, j'améliorerai ce point une fois mon montage figé)
 
20200116_222843.jpg
 
Au niveau programmation, je suis encore dans une phase de tests, mais ceux-ci s'avèrent globalement concluants, sauf sur 1 point où je bloque actuellement, qui vient, je pense, de ma programmation sur la liaison série entre les 2 cartes. En effet, bien que le capteur US fonctionne et permet de modifier le comportement des moteurs en fonction des distances que j'ai définies, les moteurs fonctionnent à des vitesses extrêmement réduites par rapport à la normale (et que je peux avoir lorsque je commande avec la télécommande IR). Ci-dessous extrait de mes codes pour info.
Comme j'ai projet de mettre plusieurs capteurs US, je voulais sur ce point m'inspirer de la ceinture de capteurs US trouvée sur le forum (super tuto d'ailleurs !), mais dans ce cas, quel code utiliser ? Je n'ai pas essayé de passer en I2C.
 
Je souhaitais également un avis sur les alim :
- J'utilise une batterie LiPo 3S pour l'alim des moteurs,
- Pour les 2 arduino, je les alimente actuellement par une pile 9V chacune. J'ai également une batterie LiPo 2S. Puis-je l'utiliser et elle seule pour alimenter mes cartes ? Cela poserait-il un soucis ? 
 
Voilà, je vous remercie par avance pour l'aide et les conseils que vous pourrez m'apporter.
N'hésitez pas également à apporter tout commentaire/critique ou proposition d'amélioration, je suis encore débutant et tout est bon à prendre pour progresser !
 
Mickaël
 
Extrait code carte "actionneurs" - lecture liaison série
 
Serial.begin(115200);
 
if (Serial.available() > 0) {
    
    distance = Serial.read();
 
   if (distance=='p'){//Mouvement prudent
      digitalWrite(A1,LOW);
      digitalWrite(A2,HIGH);//LED jaune
      digitalWrite(A0,LOW);
      avance(150);//fonction avance à vitesse réduite
      }
    if (distance=='a'){//Arrêt
       digitalWrite(A2,LOW);
       digitalWrite(A0,HIGH);//LED rouge
       digitalWrite(A1,LOW);
       arret();//fonction arrêt
       }
   if (distance=='o'){//Marche
      digitalWrite(A0,LOW);
      digitalWrite(A1,HIGH);//LED verte
      digitalWrite(A2,LOW);
      avance(255);//fonction avance à pleine vitesse
    }
 

Extrait code carte "capteurs" - émission liaison série

Serial.begin(115200);
 
if(sonar1.ping_cm() > distance_Prudent && sonar1.ping_cm() <= distance_Arret) { Serial.print('p'); }
  else if(sonar1.ping_cm() <= distance_Arret) { Serial.print('a'); }
  else { Serial.print('o'); }


Modifié par R1D1, 17 janvier 2020 - 10:35 .
Ajout balises [code]


#2 Sandro

Sandro

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 623 messages
  • Gender:Male

Posté 17 janvier 2020 - 01:36

Bonjour,

 

Pour ton code, à quoi correspond la distance d'arrêt? C'est quand tu es vraiment trop proche? Si c'est ça, alors ton code de la carte "capteur" est faux.

Ta premi_re condition correspond (notation de maths, pas de programmation) à distance_prudent < dist_US <= distance_arret. Hors la distance d'arrêt est inférieure à la distance prudent (si j'ai bien compris), du coup ta condition sera toujours fausse et tu n'entrera jamais en mode prudent.

 

 

Pour ta question de batteries ;

- tu peux brancher ta lipo 2S sur les entrées Vin ou la prise jack de tes arduinos. Ça devrait bien fonctionner sur une bonne partie de la décharge, tu risque juste de commencer à avoir des problème quand la batterie est presque vide. Une lipo 2S pleine fait 8.4V, en nominal elle fait 7.4V, tu la détériore si tu descend en dessous de 5.6V. L'arduino prend en entrée (sur Vin ou la prise jack) de préférence entre 7 et 12V, entre 6 et 20V toléré. Donc si tu mets ton alarme lipo vers 6.5V, tu devrais être assez tranquille.

- tu peux essayer d'utiliser ta lipo 2S pour tout, mais tes moteurs tourneront au mieux au ralenti voir pas du tout (bof)

- tu peux utiliser ta lipo 3S pour tout : au maximum elle fait 12.6V, les arduinos supportent.

- tu peux utiliser ta lipo 3S pour tout en alimentant tes arduinos via un convertisseur DC-DC avec 5V en sortie (alimentation de l'arduino via le pin 5V)

 

EDIT : dans tous les cas, assurent toi que tous les GND soient reliés



#3 Mickixe

Mickixe

    Nouveau membre

  • Membres
  • 17 messages
  • Gender:Male
  • Location:La Roche sur Yon

Posté 18 janvier 2020 - 02:15

Bonjour,

 

Merci R1D1 pour l'édit.

 

Merci Sandro pour tes réponses.

Ok pour les batteries.

 

Bien vu pour le code, il y avait effectivement erreur que j'ai corrigée.

 

Par contre, toujours le même soucis, mes moteurs avancent à vitesse réduite... Dans mon programme principal, je gère tous les mouvements de mes moteurs dans la condition 

if (Serial.available() > 0)

Sans doute cela qui pose soucis ?

 

Bon week-end

Mickaël



#4 Sandro

Sandro

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 623 messages
  • Gender:Male

Posté 18 janvier 2020 - 08:31

Bonsoir,

dur à dire comme ça : selon le reste du code, ça peut être un problème (par exemple si la fonction avance ne fait avancer que pendant un temps fixe) ou pas.

Est-ce que tu pourrais nous mettre le code complet des deux programmes?

Sinon, un petit test que tu peux faire, c'est tu commente tout ce qu'il y a dans la fonction loop et tu ne mets que la fonction avance(255) dedans, et tu regarde si ça avance vite ou pas. Même test en métant la fonction avance(255) en dernière ligne du setup (et rien dans loop). Si ça marche dans aucun cas, c'est qu'il y a un problème avec ton setup, ton électronique ou ta fonction avance. Si ça marche que dans le premier cas, c'est que ta fonction avance doit êtrr appellée tout le temps pour garder la vitesse. Si ça marche dans les deux cas, c'est probablement que la fonction avance(255) n'est jamais appélée dans ton code.

 

Bonne soirée

Sandro



#5 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 8 691 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 19 janvier 2020 - 12:02

J'ai pas encore regardé en détail ton code / ton problème, mais de manière générale quand tu as deux codes : 
1 qui marche bien et 1 qui marche pas bien 

Essaye de revenir en arrière sur le code qui marche pas bien et de refaire des essais, jusqu'à ce que tu trouves la différence qui fait que d'un coup ça marche bien à un coup ça marche moins bien. 

N'hésite pas à poster tes essais ;) 

Je repasse plus tard, si tu as toujours pas résolut ton problème je me pencherais dessus ;) je suis sûr qu'on peut régler ton problème ;)


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 ! 

 

Les réalisations de Mike118  

 

 

 


#6 Mickixe

Mickixe

    Nouveau membre

  • Membres
  • 17 messages
  • Gender:Male
  • Location:La Roche sur Yon

Posté 19 janvier 2020 - 03:32

Bonjour,

 

Merci pour vos commentaires !

 

Après 1/2 journée à me prendre la tête sur la liaison série de mes cartes et le code correspondant (j'ai également essayé de passer en i2c) : sans succès...

 

Après vos commentaires (Sandro, les 2 tests avec la fonction avance(255) dans la loop et la setup ont bien fonctionné), j'ai cherché ailleurs et j'ai redécomposé mon code et ai trouvé le problème : il y avait conflit avec la partie de code pour la gestion de la télécommande IR : dans mon switch/case, j'avais indiqué une commande par défaut, à savoir la fonction arret() des moteurs... En retirant simplement cette ligne, ça marche impecc !!!

 

Voilà, problème résolu, je vais pouvoir continuer. Je posterai à l'occasion les évolutions.

 

Merci encore pour votre aide !

Bonne journée

Mickaël



#7 Mickixe

Mickixe

    Nouveau membre

  • Membres
  • 17 messages
  • Gender:Male
  • Location:La Roche sur Yon

Posté 01 février 2020 - 06:35

Bonjour,

 

Bon, mon projet végète un peu, je n'arrive pas à bien gérer les échanges entre les 2 cartes, je pense que mon code est foireux, où je ne sais pas bien quelle(s) information(s) envoyer et sous quelle forme... Disons qu'avec un capteur, j'arrive à faire fonctionner, avec plusieurs, ça ne marche plus...

Ci-dessous, mes codes, n'hésitez pas à me faire part de vos remarques/critiques/pistes d'amélioration...

(NB : j'ai intégré du delay dans le code capteur pour laisser ensuite le temps aux fonctions de s'éxecuter. Quand j'intégrais du delay dans ma condition Serial.available(), j'ai l'impression que cela venait stopper la communication...)

 

Vous remerciant par avance pour votre aide,

Mickaël

 

Carte capteurs US (x3) : 

#include <NewPing.h>

//Sonar1 avant
#define TRIGGER_PIN1  9
#define ECHO_PIN1     8

//Sonar2 gauche
#define TRIGGER_PIN2  5 
#define ECHO_PIN2     4

//Sonar3 droite
#define TRIGGER_PIN3  6  
#define ECHO_PIN3     7  

#define distance_Arret 20
#define distance_Prudent 50
#define MAX_DISTANCE 200 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.

NewPing sonar1(TRIGGER_PIN1, ECHO_PIN1, MAX_DISTANCE);
NewPing sonar2(TRIGGER_PIN2, ECHO_PIN2, MAX_DISTANCE);
NewPing sonar3(TRIGGER_PIN3, ECHO_PIN3, MAX_DISTANCE);


void setup() {
  Serial.begin(115200); 
}

void loop() {
  delay(50);                     // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.

//  **** Commandes pour test fonctionnement ****
//  Serial.print("Ping1: ");
//  Serial.print(sonar1.ping_cm()); // Send ping, get distance in cm and print result (0 = outside set distance range)
//  Serial.println("cm");
//  delay(1000); 
//  Serial.print("Ping2: ");
//  Serial.print(sonar2.ping_cm()); // Send ping, get distance in cm and print result (0 = outside set distance range)
//  Serial.println("cm");
//  delay(1000); 
//  Serial.print("Ping3: ");
//  Serial.print(sonar3.ping_cm()); // Send ping, get distance in cm and print result (0 = outside set distance range)
//  Serial.println("cm");
//  delay(1000); 

  //Cas prudent
  if(sonar1.ping_cm() < distance_Prudent && sonar1.ping_cm() > distance_Arret && sonar2.ping_cm() > distance_Arret && sonar3.ping_cm() > distance_Arret) { 
    Serial.print('p'); }//prudent avant
  else if(sonar1.ping_cm() < distance_Prudent && sonar1.ping_cm() > distance_Arret && sonar2.ping_cm() <= distance_Arret && sonar3.ping_cm() > distance_Arret) { 
    Serial.print('r');delay(1000); }//prudent avant tourne droite
  else if(sonar1.ping_cm() < distance_Prudent && sonar1.ping_cm() > distance_Arret && sonar2.ping_cm() > distance_Arret && sonar3.ping_cm() <= distance_Arret) { 
    Serial.print('l');delay(1000); }//prudent avant tourne gauche
  else if(sonar1.ping_cm() < distance_Prudent && sonar1.ping_cm() > distance_Arret && sonar2.ping_cm() <= distance_Arret && sonar3.ping_cm() <= distance_Arret) { 
    Serial.print('i');delay(1000); }//1/2 tour
  //Cas recule
  else if(sonar1.ping_cm() < distance_Arret && sonar2.ping_cm() > distance_Arret && sonar3.ping_cm() > distance_Arret) { 
    Serial.print('i');delay(1000); }//1/2 tour
  else if(sonar1.ping_cm() < distance_Arret && sonar2.ping_cm() <= distance_Arret && sonar3.ping_cm() > distance_Arret) { 
    Serial.print('g');delay(1000); }//recule tourne gauche
  else if(sonar1.ping_cm() < distance_Arret && sonar2.ping_cm() > distance_Arret && sonar3.ping_cm() <= distance_Arret) { 
    Serial.print('d');delay(1000); }//prudent avant tourne droite
  else if(sonar1.ping_cm() < distance_Arret && sonar2.ping_cm() <= distance_Arret && sonar3.ping_cm() <= distance_Arret) { 
    Serial.print('i');delay(1000); }//1/2 tour
  else { Serial.print('o'); }
  
}

Carte Actionneurs :

//Moteurs
#include <Wire.h> //bibliothèque pour la communication I2C
#include <Adafruit_MotorShield.h> //bibliothèque pour le shield
Adafruit_MotorShield monShield = Adafruit_MotorShield(); //création de l'objet shield
Adafruit_DCMotor *moteurArGauche = monShield.getMotor(1); //création de l'objet moteurArrièreGauche par pointeur et repérage du numéro
Adafruit_DCMotor *moteurArDroite = monShield.getMotor(2); //création de l'objet moteurArrièreDroite par pointeur et repérage du numéro
Adafruit_DCMotor *moteurAvGauche = monShield.getMotor(4); //création de l'objet moteurAvantGauche par pointeur et repérage du numéro
Adafruit_DCMotor *moteurAvDroite = monShield.getMotor(3); //création de l'objet moteurAvantDroite par pointeur et repérage du numéro

//Infra-Rouge
#include <IRremote.h>
long val;
int IRpin =A3;
IRrecv irrecv(IRpin);
decode_results results;

//Servos
//#include <Adafruit_PWMServoDriver.h>////bibliothèque pour la carte servo
//Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
//#define SERVOMIN  150 // this is the 'minimum' pulse length count (out of 4096)
//#define SERVOMAX  550 // this is the 'maximum' pulse length count (out of 4096)
//uint16_t pulselen0=SERVOMIN;
//uint16_t pulselen1=SERVOMIN;
//uint16_t pulselen2=SERVOMIN;
//uint16_t pulselen3=SERVOMIN;
//uint8_t servo0 = 0;
//uint8_t servo1 = 1;
//uint8_t servo2 = 2;
//uint8_t servo3 = 3;

// LES YEUX DU ROBOT 
#include<LiquidCrystal.h>
#define RS 2
#define E 4
#define D4 5
#define D5 6
#define D6 7
#define D7 8
#define COLS 16
#define ROWS 2
LiquidCrystal lcd(RS,E,D4,D5,D6,D7);
byte eye1[8]=
{
B00000,
B00001,
B00010,
B00100,
B00100,
B01000,
B01000,
B01000,
};
byte eye3[8]=
{
B11111,
B00000,
B00000,
B00000,
B00000,
B00000,
B10001,
B01110,
};
byte eye5[8]=
{
B00000,
B10000,
B01000,
B00100,
B00100,
B00010,
B00010,
B00010,
};
byte eye2[8]=
{
B01000,
B01000,
B01000,
B00100,
B00100,
B00010,
B00001,
B00000,
};
byte eye4[8]=
{
B01110,
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B11111,
};
byte eye6[8]=
{
B00010,
B00010,
B00010,
B00100,
B00100,
B01000,
B10010,
B00000,
};

//Capteurs US
int distance;
unsigned long time = millis();

//SD et sons
#include <SD.h>
#include <TMRpcm.h>
//Constants
#define SD_ChipSelectPin 10
const int speakerPin=9;
//Objects
TMRpcm tmrpcm;  


void setup() {
  //MOTEURS
  monShield.begin(); //On lance la communication avec le shield
  
  //IR
  Serial.begin(115200);
  irrecv.enableIRIn();

  //Servos
  //pwm.begin();
  //pwm.setPWMFreq(60);  // Analog servos run at ~60 Hz updates
  //delay(10);

  //Yeux
  lcd.begin(COLS,ROWS);
  lcd.createChar(0,eye1);
  lcd.createChar(1,eye2);
  lcd.createChar(2,eye3);
  lcd.createChar(3,eye4);
  lcd.createChar(4,eye5);
  lcd.createChar(5,eye6);
  Eyes(0);

  //LED
  pinMode(A0,OUTPUT);//Rouge
  pinMode(A1,OUTPUT);//Verte
  pinMode(A2,OUTPUT); //Jaune
  digitalWrite(A0,HIGH);
  digitalWrite(A1,HIGH);
  digitalWrite(A2,HIGH);
  delay(1000);
  digitalWrite(A0,LOW);
  digitalWrite(A1,HIGH);
  digitalWrite(A2,LOW);

  //SD et Sons
  //Init sd shield
  if (!SD.begin(SD_ChipSelectPin)) {Serial.println("SD fail"); return; }
  //Init speaker
  tmrpcm.speakerPin = speakerPin;
  tmrpcm.setVolume(7);
  tmrpcm.play("p0.wav");

}


//*******************
//*****MAIN**********
//*******************

void loop() {

  
  //LED
 
  if (Serial.available() > 0) {
    distance = Serial.read();
    if (distance=='o') {//avance
      Eyes(0);
      digitalWrite(A0,LOW);
      digitalWrite(A1,HIGH);
      digitalWrite(A2,LOW);
      avance(200);
    }
    if (distance=='p'){//prudent avant
      Eyes(0);
      digitalWrite(A1,LOW);
      digitalWrite(A2,HIGH);
      digitalWrite(A0,LOW);
      avance(100);
      }    
    if (distance=='r'){//prudent avant tourne droite
      Eyes(-2);
      digitalWrite(A2,HIGH);
      digitalWrite(A0,LOW);
      digitalWrite(A1,LOW);
      prudentdroite(100);
      } 
    if (distance=='l'){//prudent avant tourne gauche
      Eyes(2);
      digitalWrite(A2,HIGH);
      digitalWrite(A0,LOW);
      digitalWrite(A1,LOW);
      prudentgauche(100);
      } 
    if (distance=='i') {//demi-tour
      Eyes(0);
      digitalWrite(A0,LOW);
      digitalWrite(A1,HIGH);
      digitalWrite(A2,LOW);
      demitour(100);
    }
     if (distance=='g') {//recule tourne gauche
      Eyes(-2);
      digitalWrite(A0,LOW);
      digitalWrite(A1,HIGH);
      digitalWrite(A2,LOW);
      reculegauche(100);
     }
    if (distance=='d') {//recule tourne droite
      Eyes(2);
      digitalWrite(A0,LOW);
      digitalWrite(A1,HIGH);
      digitalWrite(A2,LOW);
      reculedroite(100);
    }
   }
  
  //IR
  if (irrecv.decode(&results)==1){
    val=results.value;
    Serial.println(val);
    irrecv.resume(); 
  }
  switch (val){
    case 16718055://Avance - touche 2
     Eyes(0);
      tmrpcm.play("p0.wav");
      delay(1000);
      avance(255);
      delay(1000);
      arret();
      break;
    case 16730805://Recule - touche 8
      Eyes(0);
      recule(255);
      delay(1000);
      arret();
      break;
   case 16716015://Va à gauche - touche 4
      Eyes(2);
      tmrpcm.play("p2.wav");
      lateralGauche(255);
      delay(1000);
      arret();
      break;
    case 16734885://Va à droite - touche 6
      Eyes(-2);
      lateralDroite(255);
      delay(1000);
      arret();
      break;
//    case 16724175://Servo 2 - touche 1
//      pulselen1=pulselen1+10;
//      Serial.println(pulselen1);
//      pwm.setPWM(servo1, 0, pulselen1);// commande du servo.
//      if (pulselen1>SERVOMAX){pulselen1=SERVOMIN;}
//      break;
//    case 16743045://Servo 3 - touche 3
//      pulselen2=pulselen2+10;
//      Serial.println(pulselen2);
//      pwm.setPWM(servo2, 0, pulselen2);// commande du servo.
//      if (pulselen2>SERVOMAX){pulselen2=SERVOMIN;}
//      break;
//    case 16728765://Servo 1 - touche 7
//      pulselen0=pulselen0+10;
//      Serial.println(pulselen0);
//      pwm.setPWM(servo0, 0, pulselen0);// commande du servo.
//      if (pulselen0>SERVOMAX){pulselen0=SERVOMIN;}
//      break;
//    case 16732845://Servo 4 - touche 9
//      pulselen3=pulselen3+10;
//      Serial.println(pulselen3);
//      pwm.setPWM(servo3, 0, pulselen3);// commande du servo.
//      if (pulselen3>SERVOMAX){pulselen3=SERVOMIN;}
//      break;
    default :
      
      break;
  }  

 }

  
//*******************
//*****FONCTIONS*****
//*******************

//fonctions de mouvement de la plateforme
void arret(){
  //fonction d'arrêt des deux moteurs
  moteurArGauche->run(RELEASE);
  moteurArDroite->run(RELEASE);
  moteurAvGauche->run(RELEASE);
  moteurAvDroite->run(RELEASE);
}
void defVitesse(int v){
  moteurArGauche->setSpeed(v); //on redéfinit la vitesse
  moteurArDroite->setSpeed(v); //des deux moteurs
  moteurAvGauche->setSpeed(v); //on redéfinit la vitesse
  moteurAvDroite->setSpeed(v); //des deux moteurs
}
void avance(int v){
  //fonction de marche avant
  defVitesse(v); //appel de la fonction pour définir la vitesse
  moteurArGauche->run(FORWARD);
  moteurArDroite->run(FORWARD);
  moteurAvGauche->run(FORWARD);
  moteurAvDroite->run(FORWARD);
}
void prudentdroite(int v){
  //fonction de tourne à droite en mode prudent
  defVitesse(v); //appel de la fonction pour définir la vitesse
  moteurArGauche->run(FORWARD);
  moteurArDroite->run(RELEASE);
  moteurAvGauche->run(FORWARD);
  moteurAvDroite->run(RELEASE);
}
void prudentgauche(int v){
  //fonction de tourne à gauche en mode prudent
  defVitesse(v); //appel de la fonction pour définir la vitesse
  moteurArGauche->run(RELEASE);
  moteurArDroite->run(FORWARD);
  moteurAvGauche->run(RELEASE);
  moteurAvDroite->run(FORWARD);
}
void demitour(int v){
  //fonction de tourne à gauche en mode prudent
  defVitesse(v); //appel de la fonction pour définir la vitesse
  moteurArGauche->run(BACKWARD);
  moteurArDroite->run(FORWARD);
  moteurAvGauche->run(BACKWARD);
  moteurAvDroite->run(FORWARD);
}
void reculedroite(int v){
  //fonction de marche arrière
  defVitesse(v);
  moteurArGauche->run(BACKWARD);
  moteurArDroite->run(RELEASE);
  moteurAvGauche->run(BACKWARD);
  moteurAvDroite->run(RELEASE);  
}
void reculegauche(int v){
  //fonction de marche arrière
  defVitesse(v);
  moteurArGauche->run(RELEASE);
  moteurArDroite->run(BACKWARD);
  moteurAvGauche->run(RELEASE);
  moteurAvDroite->run(BACKWARD);  
}

//AVEC TELECOMMANDE
void recule(int v){
  //fonction de marche arrière
  defVitesse(v);
  moteurArGauche->run(BACKWARD);
  moteurArDroite->run(BACKWARD);
  moteurAvGauche->run(BACKWARD);
  moteurAvDroite->run(BACKWARD);  
}
void lateralDroite(int v){
  //fonction pour tourner à droite sur place
  defVitesse(v);
  moteurArGauche->run(BACKWARD);
  moteurArDroite->run(FORWARD);
  moteurAvGauche->run(FORWARD);
  moteurAvDroite->run(BACKWARD);
}
void lateralGauche(int v){
  //fonction pour tourner à droite sur place
  defVitesse(v);
  moteurArGauche->run(FORWARD);
  moteurArDroite->run(BACKWARD);
  moteurAvGauche->run(BACKWARD);
  moteurAvDroite->run(FORWARD);
}
void Droite(int v){
  //fonction pour tourner à droite sur place
  defVitesse(v);
  moteurArGauche->run(RELEASE);
  moteurArDroite->run(FORWARD);
  moteurAvGauche->run(FORWARD);
  moteurAvDroite->run(RELEASE);
}
void Gauche(int v){
  //fonction pour tourner à droite sur place
  defVitesse(v);
  moteurArGauche->run(FORWARD);
  moteurArDroite->run(RELEASE);
  moteurAvGauche->run(RELEASE);
  moteurAvDroite->run(FORWARD);
}

//Fonction mouvement des yeux
void Eyes(int pos){
lcd.clear();
int b=4+pos;
for(int i=0;i<2;i++){
int a=5*i;
lcd.setCursor(0+b+a,0);
lcd.write(byte(0));
lcd.setCursor(1+b+a,0);
lcd.write(byte(2));
lcd.setCursor(2+b+a,0);
lcd.write(byte(4));
lcd.setCursor(0+b+a,1);
lcd.write(byte(1));
lcd.setCursor(1+b+a,1);
lcd.write(byte(3));
lcd.setCursor(2+b+a,1);
lcd.write(byte(5));
}
delay(500);
}


#8 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 8 691 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 01 février 2020 - 08:19

Ne pas mettre de delay dans ton code => Le delay est bloquant, en aucun cas ça ne donne plus de temps à ton code pour s'exécuter ou autre. 

 

Si tu veux laisser du temps à ton code pour s'exécuter utilise la fonction millis()  et deux variables globales uint32_t time et ref .  

genre dans ton loop 

time = millis();
if(time - ref > 500) {
 // Action à faire toutes les 500ms 
 ref = time;
}


Pour le reste propose moi un code plus simple avec que la partie qui ne marche pas selon toi et je verrais pour t'aider à la corriger =) 
 


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 ! 

 

Les réalisations de Mike118  

 

 

 


#9 Mickixe

Mickixe

    Nouveau membre

  • Membres
  • 17 messages
  • Gender:Male
  • Location:La Roche sur Yon

Posté 01 février 2020 - 08:35

Merci pour ta réponse.

Oui, pour le delay j'en ai fait l'expérience... J'avais essayé avec millis(), mais sans succès, mais sans doute mal utilisé aussi...

 

Voici les parties de codes bloquantes selon moi :

Je pense que je n'ai pas la bonne méthode : suivant la plage de distance détectée sur la carte capteurs, j'associe une lettre que j'envoie sur lacarte actionneurs. Celle-ci est lue et donne une action. Mais comme cet envoi est en continue, cela ne permet pas aux fonctions de s'exécuter correctement.

 

Te remerciant par avance,

Mickaël

 

Carte capteurs :

//Cas prudent
  if(sonar1.ping_cm() < distance_Prudent && sonar1.ping_cm() > distance_Arret && sonar2.ping_cm() > distance_Arret && sonar3.ping_cm() > distance_Arret) { 
    Serial.print('p'); }//prudent avant
  else if(sonar1.ping_cm() < distance_Prudent && sonar1.ping_cm() > distance_Arret && sonar2.ping_cm() <= distance_Arret && sonar3.ping_cm() > distance_Arret) { 
    Serial.print('r');delay(1000); }//prudent avant tourne droite
  else if(sonar1.ping_cm() < distance_Prudent && sonar1.ping_cm() > distance_Arret && sonar2.ping_cm() > distance_Arret && sonar3.ping_cm() <= distance_Arret) { 
    Serial.print('l');delay(1000); }//prudent avant tourne gauche
  else if(sonar1.ping_cm() < distance_Prudent && sonar1.ping_cm() > distance_Arret && sonar2.ping_cm() <= distance_Arret && sonar3.ping_cm() <= distance_Arret) { 
    Serial.print('i');delay(1000); }//1/2 tour
  //Cas recule
  else if(sonar1.ping_cm() < distance_Arret && sonar2.ping_cm() > distance_Arret && sonar3.ping_cm() > distance_Arret) { 
    Serial.print('i');delay(1000); }//1/2 tour
  else if(sonar1.ping_cm() < distance_Arret && sonar2.ping_cm() <= distance_Arret && sonar3.ping_cm() > distance_Arret) { 
    Serial.print('g');delay(1000); }//recule tourne gauche
  else if(sonar1.ping_cm() < distance_Arret && sonar2.ping_cm() > distance_Arret && sonar3.ping_cm() <= distance_Arret) { 
    Serial.print('d');delay(1000); }//prudent avant tourne droite
  else if(sonar1.ping_cm() < distance_Arret && sonar2.ping_cm() <= distance_Arret && sonar3.ping_cm() <= distance_Arret) { 
    Serial.print('i');delay(1000); }//1/2 tour
  else { Serial.print('o'); }

Carte actionneurs :

if (Serial.available() > 0) {
    distance = Serial.read();
    if (distance=='o') {//avance
      Eyes(0);
      digitalWrite(A0,LOW);
      digitalWrite(A1,HIGH);
      digitalWrite(A2,LOW);
      avance(200);
    }
    if (distance=='p'){//prudent avant
      Eyes(0);
      digitalWrite(A1,LOW);
      digitalWrite(A2,HIGH);
      digitalWrite(A0,LOW);
      avance(100);
      }    
    if (distance=='r'){//prudent avant tourne droite
      Eyes(-2);
      digitalWrite(A2,HIGH);
      digitalWrite(A0,LOW);
      digitalWrite(A1,LOW);
      prudentdroite(100);
      } 
    if (distance=='l'){//prudent avant tourne gauche
      Eyes(2);
      digitalWrite(A2,HIGH);
      digitalWrite(A0,LOW);
      digitalWrite(A1,LOW);
      prudentgauche(100);
      } 
    if (distance=='i') {//demi-tour
      Eyes(0);
      digitalWrite(A0,LOW);
      digitalWrite(A1,HIGH);
      digitalWrite(A2,LOW);
      demitour(100);
    }
     if (distance=='g') {//recule tourne gauche
      Eyes(-2);
      digitalWrite(A0,LOW);
      digitalWrite(A1,HIGH);
      digitalWrite(A2,LOW);
      reculegauche(100);
     }
    if (distance=='d') {//recule tourne droite
      Eyes(2);
      digitalWrite(A0,LOW);
      digitalWrite(A1,HIGH);
      digitalWrite(A2,LOW);
      reculedroite(100);
    }
   }


#10 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 8 691 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 01 février 2020 - 09:08

Bon attend on va faire les choses en 2 temps. 

Choisis si tu veux d'abord travailler sur le code capteur ou d'abord travailler sur le code déplacement. 
Ensuite on va virer tous les delay de ton code modifier les parties à modifier si besoin puis tester complètement ce code tout seul en connectant la carte à ton PC. 
Quand ce code fonctionnera bien comme souhaité on fera exactement la même chose avec l'autre code. 

Ensuite on mettra les deux ensemble et si on a bien travailler ça devrait marcher nickel =) Sinon on verra pour corriger les petits point à corriger. 

Par quel code souhaite tu commencer ? 


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 ! 

 

Les réalisations de Mike118  

 

 

 


#11 Mickixe

Mickixe

    Nouveau membre

  • Membres
  • 17 messages
  • Gender:Male
  • Location:La Roche sur Yon

Posté 01 février 2020 - 09:39

Ok, on va commencer par la carte capteurs.

J'ai allégé le programme pour ne commencer qu'avec 1 seul capteur, car j'avais déjà un soucis que j'avais alors résolut avec un delay.

Voilà le code allégé et pour cette carte seule, cela marche.

if(sonar1.ping_cm() < distance_Prudent && sonar1.ping_cm() > distance_Arret) { 
    Serial.print('p'); }//prudent avant
  else if(sonar1.ping_cm() < distance_Arret) { 
    Serial.print('i'); }//1/2 tour
  else { Serial.print('o'); }  

Le moniteur série m'affiche bien une série continue de oooooo...pppp...iiii,  en fonction de la distance.



#12 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 8 691 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 01 février 2020 - 10:08

Je te propose de faire une fonction qui contient un switch case, et qui en fonction du numéro de capteur que tu vas mettre te retournera la mesure correspondante.

 

Je te propose aussi de stocker les derniers résultat de chacun de tes capteurs dans un tableau =) 

Puis essaye de faire une boucle  loop avec millis() comme je t'ai montré plus haut, et à chaque fois que tu rentres dans la partie que tu veux exécuter toute les x millisecondes, tu vas faire l'acquisition d'un capteur i et stocker le résultat, puis incrémenter i, et le remettre à 0 si i est plus grand que le nombre de capteur que tu as =) 


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 ! 

 

Les réalisations de Mike118  

 

 

 


#13 Mickixe

Mickixe

    Nouveau membre

  • Membres
  • 17 messages
  • Gender:Male
  • Location:La Roche sur Yon

Posté 02 février 2020 - 12:49

Ok, merci pour tes conseils, je comprends le principe, je vais travailler cela, dès que je pourrai... mon PC "Hobby" a eu la bonne idée de rendre l'âme ce soir, et donc perte d'une bonne partie de mes données (et pas ou difficilement récupérable, disque emmc soudé...), heureusement que j'ai posté ici mes codes entiers sur mon projet en cours !!!



#14 Mickixe

Mickixe

    Nouveau membre

  • Membres
  • 17 messages
  • Gender:Male
  • Location:La Roche sur Yon

Posté 21 mai 2020 - 09:39

Bonjour,

 

Pour donner quelques suites et avancement de mon projet, après une petite pause où je me suis consacré à mon lego mindstorm qui reposait depuis pas mal de temps dans sa boîte, j'ai repris mon projet que j'ai bien revu, où je suis reparti sur une base lego pour la structure du véhicule, bien plus solide.

 

Les fonctionnalités sont les suivantes (pour l'instant) :

- 2 moteurs CC 12V pour la propulsion,

- 1 servo pour la direction (j'ai abandonné mes roues mecanum, entièrement imprimées, mais qu'il faudrait que je modifie pour améliorer l'adhérence),

- 1 écran Oled pour des yeux (type robot Cozmo),

- 1 lecteur carte SD + Haut-parleur pour mettre un peu de son,

- 1 capteur US pour détection d'obstacle,

- Quelques Led,

- 1 capteur IR pour pilotage avec une télécommande (principalement utilisé pour les tests)

 

Le tout commandé par une arduino mega 2560 et alimenté par une LiPo 12V.

 

J'ai en effet abandonné mon idée de départ de 2 arduino en communication série que je peinais à bien faire fonctionner et surtout pour des raisons de mémoire. Les fonctions pour la SD et l'Oled sont très gourmandes et je suis vite arriver à dépasser la mémoire de la Uno...

De plus j'ai eu à faire face à des conflits de bibliothèques entre le servo, l'US et le son... Il a fallut jongler avec les timers et la mega offrait plus de possibilités.

 

Bref, tout fonctionne bien comme souhaité :yahoo:  et je suis satisfait du résultat obtenu, ce qui me donne une bonne base pour continuer. Je pense faire évoluer le projet pour le rendre plus autonome et je souhaite le doter d'une pince. Je retravaillerai le design également, ça ne ressemble pas à grand chose pour l'instant :unsure: , mais ce n'était pas le but... Je laisserai de côté pour cette seconde phase le son et les yeux qui restent gadgets.

 

Enfin si vous avez des remarques, des commentaires, des critiques, n'hésitez pas, je suis preneur ! Je reste en phase d'apprentissage ! :)

 

Suite à un prochain épisode !

 

Mickaël

 

20200519_002216.jpg

 

 

 

 

 

 

 



#15 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 5 046 messages
  • Gender:Male

Posté 22 mai 2020 - 06:55

Bravo !

 

Pour la connexion, il existe des Shields qui facilitent grandement le travail et pour pas cher.

En voici un, c'est un exemple, il y en existe certainement d'autres, https://fr.aliexpres...earchweb201603_



#16 Mickixe

Mickixe

    Nouveau membre

  • Membres
  • 17 messages
  • Gender:Male
  • Location:La Roche sur Yon

Posté 25 mai 2020 - 12:50

Bonjour,

 

Merci Oracid pour ton message et cette info, je vais regarder cela.

 

Mickaël





Répondre à ce sujet



  


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

0 members, 0 guests, 0 anonymous users