Arduino Polska Forum

Pełna wersja: Dwa "programy" w jednym Jak to zrobić?
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Witam

Witam mam taki problem zrobiłem sobie robocika który ma mieć 2 funkcje

1. Sterowanie poprzez bluetooth za pomocą i,j.k.l (działa)


2. Omijanie przeszkód (działa)

Problem polega na tym że po uruchomieniu mikrokontrolera chciałbym mieć wybór czy chcę sterować ręcznie czy ma chodzić z automatu i chciałbym też w każdej chwili móc przerwać automat i sterować ręcznie lub na odwrót 
Robiłem switchem ale coś mi sie bzdury tworzyły.

Przesyłam swój kod 

Kod:
#include <Servo.h>

//Zmienne dla sterownika
int M1_A = 12; //Silnik 1 kanał A
int M1_B = 10; //Silnik 1 kanał B

int M2_A = 4; //Silnik 2 kanał A
int M2_B = 2; //Silnik 2 kanał B

int przychodzacyBit = 0; //Zmienna odczytująca co przyszło na serialPort

int distF = 0; //dystans przód
int distR = 0; //dystans prawo
int distL = 0; //dystans lewo
int czas = 0;

int pingPin = 8;
int echoPin = 7;
int szybkosc = 255;

long duration;
int x;

int bezpOdleglosc = 35;
int odleglosc;

Servo servo;

int pos = 90; //Pozycja serva

void setup() {
 Serial.begin(115200);
 servo.attach(5); //Przypięcie serva do pinu 5;
 servo.write(pos);
 //Ustawienie pinów na wyjscie
 pinMode(M1_A,OUTPUT);
 pinMode(M1_B,OUTPUT);
 pinMode(M2_A,OUTPUT);
 pinMode(M2_B,OUTPUT);
   M1_stop();
   M2_stop();

 delay(500);

}

void loop()
 {
   if (Serial.available() > 0)
   {
       przychodzacyBit = Serial.read();
       
   }

 }
void jazda()
{
 if (przychodzacyBit == 105) //i, przod
  {
   M1_przod(szybkosc);
   M2_przod(szybkosc);
    delay(25);
}
// "j", lewo
  else if (przychodzacyBit == 106)
  {
   M1_tyl(szybkosc);
   M2_przod(szybkosc);
   delay(25);
  }
// l w prawo
   else if (przychodzacyBit == 108)
   {
     M1_przod(szybkosc);
     M2_tyl(szybkosc);
     delay(25);
   }
// k tyl
   else if (przychodzacyBit == 107)
   {
     M1_tyl(szybkosc);
     M2_tyl(szybkosc);
     delay(25);
   }
// jeli co innego to stop
   else
   {
     M1_stop();
     M2_stop();
   }
 
}
void autoomijanie()
{
 Serial.println("autoomijanie");
       odleglosc = pingpong();
      if (odleglosc>bezpOdleglosc)
       {
         Serial.println(odleglosc);
         M1_przod(szybkosc);
         M2_przod(szybkosc);
       }
     else
     {
       Serial.println(odleglosc);
       M1_stop();
       M2_stop();
       delay(500);
       servo.write(20);
       distR  = pingpong();
       delay(500);
       servo.write(160);
       delay(500);
       distL = pingpong();
       delay(500);
       servo.write(90);
       delay(200);
       porownaj();
     }
}

void porownaj()
{
 if (distL>distR) //jezeli cos jest po prawej
 {
   M2_tyl(szybkosc);
   delay(1000);
 }
 else if (distR>distL) //jesli cos jest po lewej
 {
   M1_tyl(szybkosc);
   delay(1000);
 }
  else if (distR<15 && distL<15) //jesli jest ciasno
 {
   M1_tyl(szybkosc);
   M2_tyl(szybkosc);
   delay(2000);
   M1_tyl(szybkosc);
   delay(2000);
 }
}
//FUNKCJE STERUJĄCE
void M1_tyl(int x){
digitalWrite(M1_B, LOW);
digitalWrite(M1_A, HIGH);
}

void M1_przod(int x){
digitalWrite(M1_A, LOW);
digitalWrite(M1_B, HIGH);
}

void M1_stop(){
digitalWrite(M1_B, LOW);
digitalWrite(M1_A, LOW);
}

void M2_przod(int y){
digitalWrite(M2_B, LOW);
digitalWrite(M2_A, HIGH);
}

void M2_tyl(int y){
digitalWrite(M2_A, LOW);
digitalWrite(M2_B, HIGH);
}

void M2_stop(){
digitalWrite(M2_B, LOW);
digitalWrite(M2_A, LOW);
}

long pingpong()
{
 // wysyla ping
 pinMode(pingPin, OUTPUT);
 digitalWrite(pingPin, LOW);
 delayMicroseconds(2);
 digitalWrite(pingPin, HIGH);
 delayMicroseconds(5);
 digitalWrite(pingPin, LOW);
 
 //odbiera i liczy
 pinMode(echoPin, INPUT);
 duration = pulseIn(echoPin, HIGH);
 float odl = (duration/2) / 29.1;
 return odl;
}

Jeśli ktoś z was mógłby mi pomóc albo jakoś naprowadzić to byłoby mi miło

Pozdrawiam
Michał Smile
Spróbuj zrobić dwa podprogramy Bt i czujniki
Przyciskiem będziesz zmieniał wartość zmiennej i++
Potem styki do porównania jak i=0 to bt jak i=1 to czujniki i jak i=2 to i zmieni wartość na 0

Może nie być to jakieś mega dobre ale jestem też początkującym i sam tak stosuje Smile
Witam
Kilka uwag i zaraz wklejam poprawiony kod do przetestowania.
1 - przenieś deklaracje pinu z funkcji pingpong() do sekcji setup() - tak jest bezpieczniej a na pewno lepiej
2 - zamiast if-ów użyj konstrukcji switch - case -> kod będzie bardziej czytelny ( ja tego nie robiłem tu celowo, bo za dużo zmian w Twoim kodzie by było).
3 -Wprowadziłem kilka zmian i wszystkie opatrzyłem komentarzem //wojtekizk
Opis zmian:
- wprowadzono zmienną pomocniczą typu volatile int M =0 - dzięki niej program będzie rozpoznawał co ma robić.
- do loop-a wrzucono obie funkcje robota
- w funkcji jazda dodano rozpoznawanie klawisza 'm' i zmodyfikowano stan zmiennej M
Opis algorytmu:
-Na początku działa tryb manualny - sterujesz sobie robotem klawisze: ijkl. Zmienna M=0. i funkcja autoomijanie nie działa.
- Jak wciśniesz klawisz 'm' to zmienna M=1 i startuje funkcja autoomijania.
- Jeśli teraz wciśniesz dowolny klawisz 'ijkl' to zmienna M=0 i przechodzisz na manualne sterowanie.

Myślę, że to powinno działać, jeśli nie to przynajmniej do tego trzeba dążyć.
Twój zmodyfikowany nieco kod:
Kod:
#include <Servo.h>

//Zmienne dla sterownika
int M1_A = 12; //Silnik 1 kanał A
int M1_B = 10; //Silnik 1 kanał B

int M2_A = 4; //Silnik 2 kanał A
int M2_B = 2; //Silnik 2 kanał B

int przychodzacyBit = 0; //Zmienna odczytująca co przyszło na serialPort

int distF = 0; //dystans przód
int distR = 0; //dystans prawo
int distL = 0; //dystans lewo
int czas = 0;

int pingPin = 8;
int echoPin = 7;
int szybkosc = 255;

long duration;
int x;
volatile int M=0;        //wojtekizk
int bezpOdleglosc = 35;
int odleglosc;

Servo servo;

int pos = 90; //Pozycja serva

void setup() {
Serial.begin(115200);
servo.attach(5); //Przypięcie serva do pinu 5;
servo.write(pos);
//Ustawienie pinów na wyjscie
pinMode(M1_A,OUTPUT);
pinMode(M1_B,OUTPUT);
pinMode(M2_A,OUTPUT);
pinMode(M2_B,OUTPUT);
  M1_stop();
  M2_stop();

delay(500);

}

void loop()
{
  if (Serial.available() > 0)
  {
      przychodzacyBit = Serial.read();
      jazda();                // wojtekizk
      autoomijanie();         // wojtekizk
     
  }

}
void jazda()
{
if (przychodzacyBit == 105) //i, przod
 {
  M=0;    //wojtekizk
  M1_przod(szybkosc);
  M2_przod(szybkosc);
   delay(25);
}
// "j", lewo
 else if (przychodzacyBit == 106)
 {
  M=0;  //wojtekizk
  M1_tyl(szybkosc);
  M2_przod(szybkosc);
  delay(25);
 }
// l w prawo
  else if (przychodzacyBit == 108)
  {
    M=0;  //wojtekizk
    M1_przod(szybkosc);
    M2_tyl(szybkosc);
    delay(25);
  }
// k tyl
  else if (przychodzacyBit == 107)
  {
    M=0;  // wojtekizk
    M1_tyl(szybkosc);
    M2_tyl(szybkosc);
    delay(25);
  }
  else if (przychodzacyBit == 109)   // wojtekizk 109 - to chyba kod litery m SPRAWDŹ TO!!!
  {                                  // wojtekizk
    M=1;  // wojtekizk               // wojtekizk
    delay(25);                       // wojtekiz
  }                                  // wojtekizk
// jeli co innego to stop
  else
  {
    M1_stop();
    M2_stop();
  }

}
void autoomijanie()
{
if(M==1)    //wojtekizk
{           //wojtekizk
Serial.println("autoomijanie");
      odleglosc = pingpong();
     if (odleglosc>bezpOdleglosc)
      {
        Serial.println(odleglosc);
        M1_przod(szybkosc);
        M2_przod(szybkosc);
      }
    else
    {
      Serial.println(odleglosc);
      M1_stop();
      M2_stop();
      delay(500);
      servo.write(20);
      distR  = pingpong();
      delay(500);
      servo.write(160);
      delay(500);
      distL = pingpong();
      delay(500);
      servo.write(90);
      delay(200);
      porownaj();
    }
} // wojtekizk
}

void porownaj()
{
if (distL>distR) //jezeli cos jest po prawej
{
  M2_tyl(szybkosc);
  delay(1000);
}
else if (distR>distL) //jesli cos jest po lewej
{
  M1_tyl(szybkosc);
  delay(1000);
}
 else if (distR<15 && distL<15) //jesli jest ciasno
{
  M1_tyl(szybkosc);
  M2_tyl(szybkosc);
  delay(2000);
  M1_tyl(szybkosc);
  delay(2000);
}
}
//FUNKCJE STERUJĄCE
void M1_tyl(int x){
digitalWrite(M1_B, LOW);
digitalWrite(M1_A, HIGH);
}

void M1_przod(int x){
digitalWrite(M1_A, LOW);
digitalWrite(M1_B, HIGH);
}

void M1_stop(){
digitalWrite(M1_B, LOW);
digitalWrite(M1_A, LOW);
}

void M2_przod(int y){
digitalWrite(M2_B, LOW);
digitalWrite(M2_A, HIGH);
}

void M2_tyl(int y){
digitalWrite(M2_A, LOW);
digitalWrite(M2_B, HIGH);
}

void M2_stop(){
digitalWrite(M2_B, LOW);
digitalWrite(M2_A, LOW);
}

long pingpong()
{
// wysyla ping
pinMode(pingPin, OUTPUT);
digitalWrite(pingPin, LOW);
delayMicroseconds(2);
digitalWrite(pingPin, HIGH);
delayMicroseconds(5);
digitalWrite(pingPin, LOW);

//odbiera i liczy
pinMode(echoPin, INPUT);
duration = pulseIn(echoPin, HIGH);
float odl = (duration/2) / 29.1;
return odl;
}


Pozdrawiam