Aller au contenu


Photo
- - - - -

Mode automatique - Expoloration robot chenille


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

#1 bypbop

bypbop

    Habitué

  • Membres
  • PipPip
  • 273 messages
  • Gender:Male
  • Location:Lille

Posté 24 septembre 2017 - 11:56

Bonjour à tous,

 

Après une longue absence je reprends mon projet de robot à chenille.

Je viens de terminer la lecture des capteurs ultrasonic à intervalle régulier et j'aimerais commencer le mode automatique ( robot qui se déplace tout seul et dès qu'il rencontre un obstacle change de direction )

 

Pour l'instant j'ai fait un test avec mon code actuel c'est le mode 1.

 

 

Pourriez vous me montrer des exemples de code pour que je puisse m'en inspirer et  paramétrer la distance et par exemple le temps de pause entre les changements de direction ?

#include <LiquidCrystal.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Ultrasonic.h>

LiquidCrystal lcd(52, 50, 48, 46, 44, 42);


#define ONE_WIRE_BUS 22
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature ds18b20(&oneWire);

#define T1  24
#define E1  26
#define T2  23
#define E2  25
#define T4  30
#define E4  31


Ultrasonic ultrasonic1(T1, E1);
Ultrasonic ultrasonic2(T2, E2);
Ultrasonic ultrasonic4(T4, E4);


int Sequence[][3] = {
{255, 0  ,    0 },
{0,   255  ,  0 , },
{0,   0  ,    255 },
{255, 255  ,    0 },
{0,   255  ,  255 , },
{255,   0  ,    255 },
{255,   255  ,    255 },
};



// Moteur A
int dir1PinA = 13;
int dir2PinA = 12;

// Moteur B
int dir1PinB = 11;
int dir2PinB = 8;

// Vitesse Moteur
int speedPinA = 10;
int speedPinB = 9;

int duree = 0;


char incomingByte;
int mode;

long timerefreshUltrason = 200;
long previousMillisUltrason = 0;

long timedatasend = 1000;
long previousMillis = 0;

long timerefreshLCD = 1000;
long previousMillisLCD = 0;

long timerefreshPIR = 250;
long previousMillisPIR = 0;

long timerefreshRGB = 1000;
long previousMillisRGB = 0;

long previousMillisBuzzer = 0;
int buzzerPin = 2;

int beepdone = 0;

long timerefreshLED = 250;
long previousMillisLED = 0;

int ledcamerablink = 0;
int ledCameraState = LOW;
int ledCameraPin = 28;
int capteurIrPin = 27;
int laserPin = 29;
int laserState = LOW;
int capteurIr = 0;

int BluePin = 3;
int GreenPin = 4;
int RedPin = 5;

int pwmred= 0;
int pwmblue = 0;
int pwmgreen = 0;

String motorA = "";
String motorB = "";
int speedA = 0;
int speedB = 0;

float U1 = 0;
float U2 = 0;
float U3 = 0;
float U4 = 0;


int i=0;
int distanceU2 = 10;

void setup() {
  ds18b20.begin();
  lcd.begin(16, 2);
  Serial.begin(115200);
  lcd.print("KBOT");

  pinMode(dir1PinA, OUTPUT);
  pinMode(dir2PinA, OUTPUT);
  pinMode(dir1PinB, OUTPUT);
  pinMode(dir2PinB, OUTPUT);
  pinMode(speedPinB, OUTPUT);
  pinMode(speedPinA, OUTPUT);
  
  pinMode(ledCameraPin, OUTPUT);
  pinMode(buzzerPin, OUTPUT);
  pinMode(laserPin, OUTPUT);
  pinMode(capteurIrPin, INPUT);

  pinMode(BluePin, OUTPUT);
  pinMode(GreenPin, OUTPUT);
  pinMode(RedPin, OUTPUT);

  
}

float temperature(){
ds18b20.requestTemperatures();
return ds18b20.getTempCByIndex(0);
}

float ultrason(){
long microsec0 = ultrasonic1.timing(); 
float cmMsec0 = ultrasonic1.convert(microsec0, Ultrasonic::CM); 
long microsec1 = ultrasonic2.timing(); 
float cmMsec1 = ultrasonic2.convert(microsec1, Ultrasonic::CM);
long microsec4 = ultrasonic4.timing(); 
float cmMsec4 = ultrasonic4.convert(microsec4, Ultrasonic::CM);
U1 = cmMsec0;
U2 = cmMsec1;
U4 = cmMsec4;
return U1,U2,U4;
}

//void stopbeep(int timebuzzerOn){
//long currentMillis = millis();
//
//    if(currentMillis - previousMillisBuzzer > timebuzzerOn) {
//        previousMillisBuzzer = currentMillis;
//        analogWrite(buzzerPin, 0);
//
//    }
//}

void beep (int buzzerpwm, int timebuzzerOn)
{
  if (beepdone == 1){
  analogWrite(buzzerPin, buzzerpwm);
  int duree = timebuzzerOn;
  long previousMillisBuzzer = millis();
  beepdone = 0;
  }
  
  }

void stopBeepAtEnd () {
long  currentMillis = millis();
if(currentMillis - previousMillisBuzzer > duree) {
    previousMillisBuzzer = currentMillis;
    analogWrite(buzzerPin, 0);
    beepdone = 1;
  }
}

void rgbled (int pwmred, int pwmgreen, int pwmblue)
{
analogWrite(RedPin,pwmred);
analogWrite(GreenPin,pwmgreen);
analogWrite(BluePin,pwmblue); 
  }

void motor (String motorA, int speedA, String motorB, int speedB)
{
      if (motorA == "forward"){
            analogWrite(speedPinA, speedA);
            digitalWrite(dir1PinA, HIGH);
            digitalWrite(dir2PinA, LOW);
              
      }
      else if (motorA == "backward"){
      analogWrite(speedPinA, speedA);
      digitalWrite(dir1PinA, LOW);
      digitalWrite(dir2PinA, HIGH);  
      }
      else{
        }
      if (motorB == "forward"){
            analogWrite(speedPinB, speedB);
            digitalWrite(dir1PinB, LOW);
            digitalWrite(dir2PinB, HIGH);    
      }
      else if (motorB == "backward"){
      
      analogWrite(speedPinB, speedB);
      digitalWrite(dir1PinB, HIGH);
      digitalWrite(dir2PinB, LOW); 
      }
      else{
        }
    }

void loop() 
{

  if (Serial.available() > 0) {
  lcd.setCursor(0, 0);
  lcd.print("KBOT CONNECTED"); 
  incomingByte = Serial.read();
  //Serial.println(incomingByte, DEC);

  switch (incomingByte)
    {
    case 'L':
      ledcamerablink = 1;
      break;
    case 'Z':
      ledcamerablink = 0;
      digitalWrite(ledCameraPin, LOW);
      previousMillisLED = 0;
      break;
    case 'T':
      ledcamerablink = 0;
      digitalWrite(ledCameraPin, HIGH);
      previousMillisLED = 0;
      break;
    case 'Q':
      digitalWrite(laserPin, HIGH);
      beep(255,500);
      break;
    case 'S':
      digitalWrite(laserPin, LOW);
      
      break;
    case 'A':
      motor("forward",60, "forward",60);
      //beep(255, 2000);
      break;
    case 'B':
      digitalWrite(dir1PinA, LOW);
      digitalWrite(dir2PinA, LOW);
      digitalWrite(dir1PinB, LOW);
      digitalWrite(dir2PinB, LOW);
      break;
    case 'C':
      motor("backward",80, "backward",80);
      break;
    case 'D':
      motor("backward",20, "forward",20);
      break;
    case 'G':
      motor("forward",20, "backward",20);
      break;

      case 'H':
      Serial.println("Mode automatique");
      mode = 1;
      break;
    default:
      Serial.print("commande : ");
      Serial.print(incomingByte);
      break;
    
      }
    
 
 }

if (mode == 1){
      if ( U2 > distanceU2)
      {
      rgbled(0,255,0);
      motor("forward",70, "forward",70);
        } 
      else{
      rgbled(255,0,0);
      motor("backward",70, "backward",70);
      }
}

// Fréquence de rafraichissement des capteurs ultrasons
long currentMillis = millis();
if(currentMillis - previousMillisUltrason > timerefreshUltrason) {
previousMillisUltrason = currentMillis;
ultrason();
}

 currentMillis = millis();
if(currentMillis - previousMillis > timedatasend) {
    previousMillis = currentMillis;  
    //float sondetemperature = temperature();
    float sondetemperature = 35;
    
    Serial.println(sondetemperature);
    Serial.print("U1 : ");
    Serial.println(U1);
    Serial.print("U2 : ");
    Serial.println(U2);
    Serial.print("U4 : ");
    Serial.println(U4);
    Serial.println(capteurIr);
    Serial.println(timerefreshLED);
    }


currentMillis = millis();
if(currentMillis - previousMillisLCD > timerefreshLCD) {
    previousMillisLCD = currentMillis;
    lcd.clear();
    lcd.print("U1 :");  
    lcd.print(U1);
    lcd.setCursor(0, 2) ;
    lcd.print("U2 :");  
    lcd.print(U2);
    lcd.print(" U4 :");
    lcd.print(U4);
    }

currentMillis = millis();
if (ledcamerablink == HIGH){
if(currentMillis - previousMillisLED > timerefreshLED) {
    previousMillisLED = currentMillis;
    if (ledCameraState == LOW) {
      ledCameraState = HIGH;
    } else {
      ledCameraState = LOW;
    }

    digitalWrite(ledCameraPin, ledCameraState);
}
}

//currentMillis = millis();
//if(currentMillis - previousMillisPIR > timerefreshPIR) {
//    previousMillisPIR = currentMillis;
//    capteurIr = digitalRead(capteurIrPin);
//    if (capteurIr==1){//rgbled(255,0,0);
//    
//    }
//    else {
//rgbled(0,255,0);
//      }
//    }

currentMillis = millis();
if(currentMillis - previousMillisRGB > timerefreshRGB) {
  previousMillisRGB = currentMillis;
  rgbled(Sequence[i][0],Sequence[i][1],Sequence[i][2]);
  i++;
  if (i> 6){i=0;}
}
  
stopBeepAtEnd ();
}

    
 


Bien à vous

Bypbop



#2 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 504 messages
  • Gender:Male
  • Location:Paris

Posté 24 septembre 2017 - 12:12

Merci du partage ;)

#3 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 766 messages
  • Gender:Male

Posté 24 septembre 2017 - 01:35

Aurais-tu quelque chose à nous montrer ?

#4 bypbop

bypbop

    Habitué

  • Membres
  • PipPip
  • 273 messages
  • Gender:Male
  • Location:Lille

Posté 24 septembre 2017 - 01:45

C'est à dire Oracid ?

 

Pour l'instant j'arrive juste à faire changer de direction avant arrière en fonction de la distance d'un capteur U2

if (mode == 1){
      if ( U2 > distanceU2)
      {
      rgbled(0,255,0);
      motor("forward",70, "forward",70);
        } 
      else{
      rgbled(255,0,0);
      motor("backward",70, "backward",70);
      }
}

Donc en gros qd j'envoie la lettre H via le terminal serie je passe sur mon mode 1 les moteurs vont dans un sens tant que la distanceU2 n'est pas inférieur à un seuil ... sinon l'autre sens .... maintenant j'aimerais terminer ce mode en programmant un changement de direction en fonction des autres capteurs et un délai de pause reglable ... Avez vous des exemples simples qui pourraient m'aider pour la suite ?

 

Cordialement,

bypbop



#5 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 766 messages
  • Gender:Male

Posté 24 septembre 2017 - 06:23

C'est à dire Oracid ?

Et bien, je pense que c'est toujours agréable pour le lecteur d'avoir une image du robot.

#6 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 504 messages
  • Gender:Male
  • Location:Paris

Posté 24 septembre 2017 - 06:24

Oui, c'est vrai, il a raison Oracid :)



#7 bypbop

bypbop

    Habitué

  • Membres
  • PipPip
  • 273 messages
  • Gender:Male
  • Location:Lille

Posté 24 septembre 2017 - 07:11

Voilà ma base de travail ...

 

http://kmeg.free.fr/IMG_6512.JPG

http://kmeg.free.fr/IMG_6513.JPG

http://kmeg.free.fr/IMG_6514.JPG

 

 

Désolé pour l'instant il y a des fls de partout ;-)

 

 

Je ferai une vidéo qd le mode automatique sera terminé ...

 

 

Bien à vous 

 

Fichier joint  IMG_6512.JPG   127,81 Ko   31 téléchargement(s)

 

Fichier joint  IMG_6513.JPG   108,46 Ko   29 téléchargement(s)

 

Fichier joint  IMG_6514.JPG   122,47 Ko   32 téléchargement(s)


Modifié par bypbop, 24 septembre 2017 - 07:23 .
Je me suis permis d'insérer les images


#8 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 766 messages
  • Gender:Male

Posté 24 septembre 2017 - 09:04

Très bien !
Envisages-tu d'agrandir un peu ton char ?
Cela va devenir un peu serré dans pas très longtemps...

#9 bypbop

bypbop

    Habitué

  • Membres
  • PipPip
  • 273 messages
  • Gender:Male
  • Location:Lille

Posté 25 septembre 2017 - 12:05

Pas pour le moment je l'utilise comme plateforme de développement donc pas très grave ...
C'est vrai que c'est un peu serré ;-)

Est ce que qq'un aurait un exemple de code pour avancer dans mon mode automatique ?

Cordialement,
Bypbop

#10 Mike118

Mike118

    Staff Robot Maker

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

Posté 25 septembre 2017 - 05:04

Décrit simplement ce que tu as envie de faire dans ton mode automatique et on pourra t'aider =) 

exemple de pseudo code comme ça  : 

 

distanceObstacleDroite = cmMsec0 + cmMsec1 ;

distanceObstacleAvant = cmMsec1 + cmMsec2 ;

distanceObstacleGauche = cmMsec2 + cmMsec3 ;

 

if ( distanceObstacleAvant< limite)

{

  recule();

}

else if ( distanceObstacleDroite< limite)

{

  tourneAgauche();

}

else if ( distanceObstacleGauche< limite)

{

  tourneAdroite();

}

else avance();

 

 

après tu peux faire quelque chose de plus fluide qui plutôt que de tourner à une vitesse donnée donnera une vitesse en fonction de la valeur de la distance mesuré avec la fonction Map par exemple et qui sera mise en paramètre des fonctions  =) 

 

Après il y a pleins de méthode =) 

 

Le plus important c'est pas de prendre un modèle et de le suivre, le plus important c'est d'essayer d'imaginer comment toi tu aimerais le faire et si besoin tu seras aidé pour faire comme tu as envie de faire ;) 


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 arobasseb

arobasseb

    Membre chevronné

  • Administrateur
  • PipPipPipPip
  • 737 messages
  • Gender:Male
  • Location:BORDEAUX (33)

Posté 25 septembre 2017 - 12:24

Je pense que pour ce genre de problème entre distance, position d'obstacle et vitesse et angle de rotation l'utilisation de la logique floue serai intéressante au lieu d'une quantité de 'if' . Je ne sais pas s'il existe une bibliothèque arduino pour ça par contre.

#12 bypbop

bypbop

    Habitué

  • Membres
  • PipPip
  • 273 messages
  • Gender:Male
  • Location:Lille

Posté 25 septembre 2017 - 07:48

Merci Mike118,

 

Je voulais juste un exemple pour voir comment gerer le changement de direction sur un robot.

 

Oui je vais faire le changement de vitesse en fonction de la distance ...

 

Je code tout ça et je reviens vers vous ...

 

merci à tous



#13 Mike118

Mike118

    Staff Robot Maker

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

Posté 27 septembre 2017 - 12:55

Sans même chercher à coder le tout avant de revenir, juste en décrivant ce que tu veux faire on peut déjà beaucoup t'aider =) 

Normalement quand on veut commencer à faire des codes un peu plus compliqué en général on passe d'abord par une étape de réflexion où on fais du pseudo code on écrit des trucs sur le papier ou autre avant de coder le tout ! =) 

Sauf si on est méga fort et qu'on a tout en tête ^^ Mais bon généralement le faire en deux temps permet d'aller plus vite ;) 
 


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 bypbop

bypbop

    Habitué

  • Membres
  • PipPip
  • 273 messages
  • Gender:Male
  • Location:Lille

Posté 07 octobre 2017 - 11:10

Bonjour à tous,

 

Désolé pour cette réponse tardive mais j’étais en déplacement et j'avais pas mon matériel avec moi ...

 

 

Pour l'instant j'aimerais faire ceci ...

 

Quand je tape H le mode automatique s’enclenche et le robot parcourt en mode automatique en s'aidant des capteurs avant ...

 

Donc avancer en ligne droite jusque l'obstacle si obstacle ... stop ... pause avec délai(réglable) droite ou gauche pendant qques secondes  puis de nouveau tout droit ...

 

Pour l'instant c'est qu'il me trotte à l'esprit ...

 

Bien à vous






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

0 members, 0 guests, 0 anonymous users