• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Jak połączyć kilka programów sterujących robotem w jeden wspólny pro z wyborem trybu?
#1
Witam, mam kilka programików do sterowania robotem-samochodem - jeden program prowadzi samochód po linii, inny wykrywa przeszkody, jeszcze inny pozwala sterować komórką. Teraz chciałbym te 3 programy ubrać w jeden wspólny program z wyborem jednego z trzech trybów za pomocą pilota IR. Czyli np.: wciskam na pilocie 1 - uruchamia się program 1, 2-2, 3-3. Gdy wcisnę np. # to samochód powraca do trybu czuwania. Czy mogę prosić o poradę jak powinien wyglądać szkielet takiego łączącego programu? Dodam ,że nie chodzi mi o obsługę IR tylko ogólnie o konstrukcję takiego programu z kilkoma trybami działania. Wyobrażałem sobie, że każdy z trzech trybów będzie obsługiwany przez inną funkcję , ale nie wiem jak zrobić, żeby podczas wykonywania jednego z 3 programów Arduino cały czas zachowało gotowość do otrzymania sygnału z pilota i zmiany trybu. Bo np jak samochód będzie w trybie unikania przeszkód to będzie "zajęty" przetwarzaniem danych z odległościomierza i reagowaniem na te dane i wydaje mi się, że nie będzie reagować na sygnały z pilota i próby zmiany trybu.
Mar
 
Odpowiedź
#2
Funkcja danego trybu jazdy powinna być tak napisana, że nie jest zapętlona w nieskończoność.

Kod:
loop()
{
sprawdzenieczyjestnowakomenda();
if(nowakomenda)
{
nowakomenda=0;
trybjazdy=komendazpilota; (0,1,2,3,4);
}
switch (trybjazdy)
{
 case 1:
   //tu to co było w programie po linii
   break;
 case 2:
   // to co wykrywało przeszkody
   break;
 case 3:
   // teraz sterownie komorką
   break;
 default:
   // jak nie ma żadnej komendy 1,2,3, a jest np. 4,5, 547235 itd to np. funkcja by zatrzymać pojazd
//można też ustawić jakiś timeout, odliczać upływ czasu w pętli głównej np. 10s i po tym czasie komenda=0, tu zatrzymać pojazd.
// lub po upływie czasu komenda++ i sam zmienia tryb jazdy, if(komenda>3) komenda =0, zatrzyma pojazd, lub komenda=1, od nowa po kolei.
}
}

Ważne by wywołana funkcja przeleciała jak najszybciej i została ewentualnie wywołana ponownie, a nie żeby program utknął tu oczekując na jakieś dane z czujnika, które nigdy nie przyjdą, bo np. się wziął i zepsuł.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#3
(21-02-2018, 13:23)kaczakat napisał(a): Funkcja danego trybu jazdy powinna być tak napisana, że nie jest zapętlona w nieskończoność.

Kod:
loop()
{
sprawdzenieczyjestnowakomenda();
if(nowakomenda)
{
nowakomenda=0;
trybjazdy=komendazpilota; (0,1,2,3,4);
}
switch (trybjazdy)
{
 case 1:
   //tu to co było w programie po linii
   break;
 case 2:
   // to co wykrywało przeszkody
   break;
 case 3:
   // teraz sterownie komorką
   break;
 default:
   // jak nie ma żadnej komendy 1,2,3, a jest np. 4,5, 547235 itd to np. funkcja by zatrzymać pojazd
//można też ustawić jakiś timeout, odliczać upływ czasu w pętli głównej np. 10s i po tym czasie komenda=0, tu zatrzymać pojazd.
// lub po upływie czasu komenda++ i sam zmienia tryb jazdy, if(komenda>3) komenda =0, zatrzyma pojazd, lub komenda=1, od nowa po kolei.
}
}

Ważne by wywołana funkcja przeleciała jak najszybciej i została ewentualnie wywołana ponownie, a nie żeby program utknął tu oczekując na jakieś dane z czujnika, które nigdy nie przyjdą, bo np. się wziął i zepsuł.

Bardzo logicznie i prosto to wyjaśniłeś. Dziękuję Ci bardzo! Smile  Mar
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości