Jak to zrobić ? Dwa programy w 1

Masz problem z Arduino? Tutaj możesz szukać pomocy.
ODPOWIEDZ
michaU
Młodszy majsterkowicz
Posty: 18
Rejestracja: 12 sty 2016, 20:40

Jak to zrobić ? Dwa programy w 1

Post autor: michaU » 12 sty 2016, 20:52

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: Zaznacz cały

#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ł :)

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


Awatar użytkownika
arduino-lab
Młodszy majsterkowicz
Posty: 30
Rejestracja: 2 gru 2015, 14:41
Kontakt:

Re: Jak to zrobić ? Dwa programy w 1

Post autor: arduino-lab » 12 sty 2016, 21:18

Na początku w kodzie programu sprawdzasz stan przycisku i wstawiasz warunek:

Kod: Zaznacz cały

if (tryb_sterowania == 1) { // sterowanie ręczne

}

if (tryb_sterowania == 0) { // sterowanie autoamtyczne

}
michaU
Młodszy majsterkowicz
Posty: 18
Rejestracja: 12 sty 2016, 20:40

Re: Jak to zrobić ? Dwa programy w 1

Post autor: michaU » 12 sty 2016, 21:22

Ale mam to zrobić w funkcji setup czy loop ?
Awatar użytkownika
arduino-lab
Młodszy majsterkowicz
Posty: 30
Rejestracja: 2 gru 2015, 14:41
Kontakt:

Re: Jak to zrobić ? Dwa programy w 1

Post autor: arduino-lab » 12 sty 2016, 21:33

Oczywiście, że w funkcji loop - to ta funkcja odpowiada za to, co dzieje się dalej z Twoim projektem. Z tego, co przedstawiłeś teraz, to przypisujesz do zmiennej przychodzacyBit to, co przychodzi na Serial. Na tym kończy się realizacja programu po uruchomieniu mikrokontrolera. Powinieneś teraz dodać sprawdzenie stanu na pinie podłączonym do przełącznika i wstawić to, co pokazałem. A dopiero w tych warunkach uruchomić autoomijanie() i jazda().
michaU
Młodszy majsterkowicz
Posty: 18
Rejestracja: 12 sty 2016, 20:40

Re: Jak to zrobić ? Dwa programy w 1

Post autor: michaU » 12 sty 2016, 22:08

Zrobiłem coś takiego

Kod: Zaznacz cały

void loop() 
  {
    if (Serial.available() > 0) 
    {
        przychodzacyBit = Serial.read();
        int tryb =  przychodzacyBit;
        if ( tryb == 49 )
        {
          Serial.println("Jazda");
          swiatelko();
          jazda();
        }
        else if (tryb == 50)
        {
          Serial.println("Auto-Omijacz");
          autoomijanie();
        }
    }
 
  }

To działa ale tylko na "1 raz" czyli jakbym wciskał cały "1" to wtedy będzie się wykonywała "jazda()" a mi chodzi o cos takiego ze wciskam 1 działa jazda dopóki np nie wcisne "S" = stop i nie wybiore innej funkcji.
Awatar użytkownika
arduino-lab
Młodszy majsterkowicz
Posty: 30
Rejestracja: 2 gru 2015, 14:41
Kontakt:

Re: Jak to zrobić ? Dwa programy w 1

Post autor: arduino-lab » 12 sty 2016, 22:33

void loop()
{

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

if (przychodzacyBit == 49) {
tryb = 1;
//Serial.println("tryb 1");
}

if (przychodzacyBit == 50) {
tryb = 2;
//Serial.println("tryb 2");
}

if(przychodzacyBit == 51)
{
tryb = 3;
//Serial.println("tryb 3");
}

if (tryb == 1)
{
Serial.println("Jazda");
swiatelko();
jazda();
przychodzacyBit = 0;
}
else if (tryb == 2)
{
Serial.println("Auto-Omijacz");
autoomijanie();
}
else if (tryb == 3)
{
M1_stop();
M2_stop();
}
}
Ostatnio zmieniony 13 sty 2016, 02:55 przez arduino-lab, łącznie zmieniany 2 razy.
michaU
Młodszy majsterkowicz
Posty: 18
Rejestracja: 12 sty 2016, 20:40

Re: Jak to zrobić ? Dwa programy w 1

Post autor: michaU » 12 sty 2016, 23:55

Dzięki wielkie jest już prawie idealnie
tylko wcześniej funkcja jazda działała na takiej zasadzie że jak trzymam "i" to jedzie do przodu jak puszcze to staje
teraz jest tak ze jak wcisnę "i" to jedzie bez końca
A jak uruchomię tryb 2 autoomijacz to jedzie cały czas prosto i robi jeden odczyt tylko :(
Awatar użytkownika
arduino-lab
Młodszy majsterkowicz
Posty: 30
Rejestracja: 2 gru 2015, 14:41
Kontakt:

Re: Jak to zrobić ? Dwa programy w 1

Post autor: arduino-lab » 13 sty 2016, 00:09

Przed przychodzacyBit = Serial.read(); dodaj przychodzacyBit = 0;
michaU
Młodszy majsterkowicz
Posty: 18
Rejestracja: 12 sty 2016, 20:40

Re: Jak to zrobić ? Dwa programy w 1

Post autor: michaU » 13 sty 2016, 00:39

Bez zmian dalej tylko jeden odczyt i ciśnie przed siebie :(

Bo mi chodzi o coś takiego jak tutaj na tym filmiku co zrobiłem
dodać youtube /watch?v=ICnAg9YqKlg
Awatar użytkownika
arduino-lab
Młodszy majsterkowicz
Posty: 30
Rejestracja: 2 gru 2015, 14:41
Kontakt:

Re: Jak to zrobić ? Dwa programy w 1

Post autor: arduino-lab » 13 sty 2016, 02:56

Edytowałem wczesniejszy wpis. Jeśli mi odpowiesz, ze działa zamieścimy cały kod dla innych? W sumie mała rzecz w tym kodzie :)
ODPOWIEDZ

Strony partnerskie: