[conseil] mode evitement d obstacle

bonsoir a tous

Pour la ptite présentation je suis lolo un cuisinier de 30 ans je me lance dans la robotique pour me faire plaisir je me suis acheter un robot en kit le mbot ranger de chez makeblock il fonctionne avec la carte "me auriga" base sur la carte ATmega2560 sur laquelle ils ont rajouté quelques capteurs : 2 de luminosités, un anneau des 12 LED.... et sans oublier que la carte comporte 10 branchements rj25 :
4 pour les moteurs
6 pour d autre modules dont deux sont fournis un suiveur de ligne et un ultrason

je travail sur Windows 8; Arduino 1.8.1;Mblock3.4( logiciel base sur scratch )

Pour faire au plus simple j ai pris comme base ce tuto internet

du coup grâce à un peu t aide et à Mblock j ai réussi construire un sketch Arduino qui fonctionne
.

 //upt=up bck=back lef=left rgt=right
//led low=led on/off buz=starwars music

//////////////////////////////////////////////////////////////////
#include "MeAuriga.h"
#include <Arduino.h>
#include <Wire.h>
#include <SoftwareSerial.h>

//Encoder Motor
MeEncoderOnBoard Encoder_1(SLOT1);
MeEncoderOnBoard Encoder_2(SLOT2);
MeRGBLed led(0,12); 
MeBuzzer buzzer; 
MeUltrasonicSensor ultrasonic_10(PORT_10);

//Global variables.
char g_version[] = "0.10\n";


void isr_process_encoder1(void)
{
      if(digitalRead(Encoder_1.getPortB()) == 0){
            Encoder_1.pulsePosMinus();
      }else{
            Encoder_1.pulsePosPlus();
      }
}

void isr_process_encoder2(void)
{
      if(digitalRead(Encoder_2.getPortB()) == 0){
            Encoder_2.pulsePosMinus();
      }else{
            Encoder_2.pulsePosPlus();
      }
}

void move(int direction, int speed)
{
      Serial.print("dir ");
      Serial.print(direction);
      Serial.print("vit ");
      Serial.print(speed);
      int leftSpeed = 0;
      int rightSpeed = 0;
      if(direction == 1){
            leftSpeed = -speed;
            rightSpeed = speed;
      }else if(direction == 2){
            leftSpeed = speed;
            rightSpeed = -speed;
      }else if(direction == 3){
            leftSpeed = -speed;
            rightSpeed = -speed;
      }else if(direction == 4){
            leftSpeed = speed;
            rightSpeed = speed;
      }
      Encoder_1.setTarPWM(leftSpeed);
      Encoder_2.setTarPWM(rightSpeed);
}

//Setup the hardware.
void setup() 
{ 
  //Setup USB serial comms.
  Serial.begin( 115200 );
  Serial.setTimeout( 100 );
  
  //Send a message over USB serial.
  Serial.print( "salut lolo :)\n" );
  
      //Set Pwm 8KHz
    TCCR1A = _BV(WGM10);
    TCCR1B = _BV(CS11) | _BV(WGM12);
    TCCR2A = _BV(WGM21) | _BV(WGM20);
    TCCR2B = _BV(CS21);
     attachInterrupt(Encoder_1.getIntNum(), isr_process_encoder1, RISING);
    attachInterrupt(Encoder_2.getIntNum(), isr_process_encoder2, RISING);
    if(0){
        move(1,100);
    }else{
        move(1,0);
    }//*/
  {
    led.setpin(44);                                                                      
  }
  {
    buzzer.setpin(45); 
  }
}

//This function is called forever.
void loop() 
{
//  move(1,100);
  
  //Read serial commands.
  while( Serial.peek() != -1 )
  {
    //Read 3 character command.
    char cmd[4] = "---";
    Serial.readBytes( cmd, 3 );
    Serial.print(cmd); 
    //Execute chosen command.
    if( strcmp( cmd, "upt" )==0 )   move(1, 255);
    else if( strcmp( cmd, "bck" )==0 ) move(2, 255);
    else if( strcmp( cmd, "lef" )==0 ) move(3, 255);
    else if( strcmp( cmd, "rgt" )==0 ) move(4, 255);
    else if( strcmp( cmd, "stp" )==0 ) move(1, 0);
    else if( strcmp( cmd, "led" )==0 ) couleur(); 
    else if( strcmp( cmd, "low" )==0 ) couleur2();
    else if( strcmp( cmd, "buz" )==0 ) tone();
    else Serial.print( "Bordel!!" );
  } 
  
      _loop();
}

void _loop(){
    Encoder_1.loop();
    Encoder_2.loop();
}

void couleur()
{
      led.setColor(0,255,255,255);
      led.show();
 }
void couleur2()
{
      led.setColor(0,0,0,0);
      led.show();
 }
 void tone()
 {
      buzzer.tone(440, 500);
    buzzer.tone(440, 500);
    buzzer.tone(440, 500);
    buzzer.tone(349, 376);
    buzzer.tone(523, 126);
    
    buzzer.tone(440, 500);
    buzzer.tone(349, 376);
    buzzer.tone(523, 126);
    buzzer.tone(440, 1000);
    
    buzzer.tone(659, 500);
    buzzer.tone(659, 500);
    buzzer.tone(659, 500);
    buzzer.tone(698, 376);
    buzzer.tone(523, 126);
    
    buzzer.tone(415, 500);
    buzzer.tone(349, 376);
    buzzer.tone(523, 126);
    buzzer.tone(440, 1000);
    
    buzzer.tone(880, 500);
    buzzer.tone(440, 376);
    buzzer.tone(440, 126);
    buzzer.tone(880, 500);
    buzzer.tone(831, 376);
    buzzer.tone(784, 126);
    
    buzzer.tone(740, 166);
    buzzer.tone(698, 166);
    buzzer.tone(740, 166);
    delay(250);
    buzzer.tone(466, 250);
    buzzer.tone(622, 500);
    buzzer.tone(587, 376);
    buzzer.tone(554, 126);
    
    buzzer.tone(523, 166);
    buzzer.tone(494, 166);
    buzzer.tone(523, 166);
    delay(250);
    buzzer.tone(349, 250);
    buzzer.tone(415, 500);
    buzzer.tone(349, 376);
    buzzer.tone(415, 126);
    
    buzzer.tone(523, 500);
    buzzer.tone(440, 376);
    buzzer.tone(523, 126);
    buzzer.tone(659, 1000);
    
    buzzer.tone(880, 500);
    buzzer.tone(440, 376);
    buzzer.tone(440, 126);
    buzzer.tone(880, 500);
    buzzer.tone(831, 376);
    buzzer.tone(784, 126);
    
    buzzer.tone(740, 166);
    buzzer.tone(698, 166);
    buzzer.tone(740, 166);
    delay(250);
    buzzer.tone(466, 250);
    buzzer.tone(622, 500);
    buzzer.tone(587, 376);
    buzzer.tone(554, 126);

    buzzer.tone(523, 166);
    buzzer.tone(494, 166);
    buzzer.tone(523, 166);
    delay(250);
    buzzer.tone(349, 250);
    buzzer.tone(415, 500);
    buzzer.tone(349, 376);
    buzzer.tone(523, 126);
    
    buzzer.tone(440, 500);
    buzzer.tone(349, 376);
    buzzer.tone(523, 126);
    buzzer.tone(440, 1000);
 
}

Je vous accorde qu il ne doit pouvoir être amélioré.
Le problème vient quand je souhaite rajoute une commande tel que:
_ quand le robot reçoit le message "oto" il lance la la fonction ultracarprocess jusqu a qu il reçoivent la commande "stp".

Du coup j ai rajouter ces lignes de commandes.

//dans le void loop()
 else if( strcmp( cmd, "oto" )==0 ) ultrCarProcess();

//ensuite
void ultrCarProcess()
{
 do

 {   
    if((ultrasonic_10.distanceCm()) < (20))
    {
        if(((random(0,(1)+1))==(0)))
        {
            move(4,150);
            delay(2);
        }
        else
        {
            move(3,150);
            delay(2);
        }
    }
    else
    {
        move(1,255);
    }
    if((ultrasonic_10.distanceCm()) < (10))
    {
        move(2,200);
    }
}while(Serial.readBytes("stp" ))
}

Mais je n arrive pas a écrire la sortie de la boucle while. La sa me donne un message d erreur sinon j essaye "stp" mais la boucle est a l infini pouvez vous me donnez un conseil ou une autre manière de parvenir au résultat.

Dans votre loop vous testez une commande avecif( strcmp( cmd, "oto" )==0 )il faut prendre la même approche dans votre fonction, écouter le port de communication, bâtir la chaîne de commande au fur et à mesure qu'elle arrive (asynchrone) et effectuer le test avec strcmp()

ok je me penche dessus merci beaucou