Skocz do zawartości

Test Robota IR na Arduino


mateusz797

Pomocna odpowiedź

Cześć, testuje obecnie robota IR na arduino. Napisałem dwa programy, po obu z nich widze że:

Robot reaguje tylko na 1 poczatkowa komende. Czyli zalozmy ze:

Klikne po włączeniu go 2 jedzie do przodu , nie da sie go zatrzymac, skrecic w lewo, prawo, czy do tyłu

Klikne po włączeniu go 4 skreca w lewo , nie da sie go zatrzymac, skrecic prawo, czy jechać do tyłu

Klikne po włączeniu  go 6 skreca w prawo , nie da sie go zatrzymac, skrecic w lewo,  czy do tyłu

Klikne 8 jedzie do tyłu , nie da sie go zatrzymac, skrecic w lewo, prawo, czy jechac do przodu.

 

Z tego wynika że jak chce nim jechać w przeciwnym kierunku to musze go najpierw złapać podczas jazdy, wyłączyć od zasilania i dopiero potem po włączeniu kliknąć 4 i wtedy bedzie tylko w lewo skrecał. Itd. Chodzi o to że nie mozna w trakcie jazdy kierunkow zmieniać. Mam takie dwa programy i tak reaguje. Wiecie może gdzie tutaj tkwi przyczyna?

1, Program bez użycia flagi

#include <IRremote.h>
#include <ir_Lego_PF_BitStreamEncoder.h>

int receiverpin = 13;         // def.PIN odbiornika
IRrecv irrecv (receiverpin);  // nazwa odb
decode_results results;       // odwolanie do odbiornika


const int IN1 = 7;
const int IN2 = 6;
const int IN3 = 4;
const int IN4 = 5;
const int ENA = 11;
const int ENB = 3;            // Piny silników


void setup() {

irrecv.enableIRIn();         // uruchamia odbiornik podczerwieni
pinMode (IN1, OUTPUT);
pinMode (IN2, OUTPUT);
pinMode (IN3, OUTPUT);
pinMode (IN4, OUTPUT);
pinMode (ENA, OUTPUT);
pinMode (ENB, OUTPUT);      // ust.silnikow jako wyjscia


}

void przod() {

digitalWrite (IN1, LOW);
digitalWrite (IN2, HIGH);
digitalWrite (IN3, LOW);
digitalWrite (IN4, HIGH);
analogWrite  (ENA, 150);
analogWrite  (ENB, 150);

}

void lewo() {

digitalWrite (IN1, HIGH);
digitalWrite (IN2, LOW);
digitalWrite (IN3, LOW);
digitalWrite (IN4, HIGH);
analogWrite  (ENA, 150);
analogWrite  (ENB, 150);

}

void prawo() {

digitalWrite (IN1, LOW);
digitalWrite (IN2, HIGH);
digitalWrite (IN3, HIGH);
digitalWrite (IN4, LOW);
analogWrite  (ENA, 150);
analogWrite  (ENB, 150);

}

void tyl() {

digitalWrite (IN1, HIGH);
digitalWrite (IN2, LOW);
digitalWrite (IN3, HIGH);
digitalWrite (IN4, LOW);
analogWrite  (ENA, 150);
analogWrite  (ENB, 150);

}

void stop() {

digitalWrite (IN1, LOW);
digitalWrite (IN2, LOW);
digitalWrite (IN3, LOW);
digitalWrite (IN4, LOW);
analogWrite  (ENA, 0);
analogWrite  (ENB, 0);

}

void IRtranslate(){

switch(results.value){
 
   case 0x942:
   case 0x142:
   
   
   przod();  
   
   break;     // 2 - Jazda do przodu


   case 0x944:
   case 0x144:

   lewo();
    
    break;     // 4 - Skret w lewo

   case 0x946:
   case 0x146:


    prawo();
    
      break;     // 6 - Skret w prawo


   case 0x948:
   case 0x148:

    tyl();
    
      break;     // 8 - Jazda do tylu
      
  case 0x940:
  case 0x140:
  stop();
 
}


}
void loop() {

if (irrecv.decode(&results))

{

  IRtranslate();
}

}

2. Program z użyciem flagi

#include <IRremote.h>
#include <ir_Lego_PF_BitStreamEncoder.h>

int receiverpin = 13;         // def.PIN odbiornika
IRrecv irrecv (receiverpin);  // nazwa odb
decode_results results;       // odwolanie do odbiornika


const int IN1 = 7;
const int IN2 = 6;
const int IN3 = 4;
const int IN4 = 5;
const int ENA = 11;
const int ENB = 3;            // Piny silników


void setup() {

irrecv.enableIRIn();         // uruchamia odbiornik podczerwieni
pinMode (IN1, OUTPUT);
pinMode (IN2, OUTPUT);
pinMode (IN3, OUTPUT);
pinMode (IN4, OUTPUT);
pinMode (ENA, OUTPUT);
pinMode (ENB, OUTPUT);      // ust.silnikow jako wyjscia


}

void przod() {

digitalWrite (IN1, LOW);
digitalWrite (IN2, HIGH);
digitalWrite (IN3, LOW);
digitalWrite (IN4, HIGH);
analogWrite  (ENA, 150);
analogWrite  (ENB, 150);

}

void lewo() {

digitalWrite (IN1, HIGH);
digitalWrite (IN2, LOW);
digitalWrite (IN3, LOW);
digitalWrite (IN4, HIGH);
analogWrite  (ENA, 150);
analogWrite  (ENB, 150);

}

void prawo() {

digitalWrite (IN1, LOW);
digitalWrite (IN2, HIGH);
digitalWrite (IN3, HIGH);
digitalWrite (IN4, LOW);
analogWrite  (ENA, 150);
analogWrite  (ENB, 150);

}

void tyl() {

digitalWrite (IN1, HIGH);
digitalWrite (IN2, LOW);
digitalWrite (IN3, HIGH);
digitalWrite (IN4, LOW);
analogWrite  (ENA, 150);
analogWrite  (ENB, 150);

}

void stop() {

digitalWrite (IN1, LOW);
digitalWrite (IN2, LOW);
digitalWrite (IN3, LOW);
digitalWrite (IN4, LOW);
analogWrite  (ENA, 0);
analogWrite  (ENB, 0);

}

void IRtranslate(){

switch(results.value & 0x07FF){
 
   
   case 0x142:
   
   
   przod();  
   
   break;     // 2 - Jazda do przodu


   
   case 0x144:

   lewo();
    
    break;     // 4 - Skret w lewo

   
   case 0x146:


    prawo();
    
      break;     // 6 - Skret w prawo


  
   case 0x148:

    tyl();
    
      break;     // 8 - Jazda do tylu
      
 
  case 0x140:
  stop();
 
}


}


void loop() {

if (irrecv.decode(&results))

{

  IRtranslate();
}

}

 

Link to post

To nie ma znaczenia, kolega próbuje znaleźć frajera, który uruchomi za niego wymarzoną zabawkę. Jednego dnia pisze, że nie będzie się uczył języka w którym próbuje pisać programy a drugiego dnia pyta dlaczego jego program nie działa i prosi o pomoc. Do książki, Mateuszku i ryjesz. A poniżej pisownia, składnia i ortografia oryginalna:

"Gdybym miał problemy to. 

Nie wiedziałbym wogole jak wysterowac silniki, jak podłączyć cały układ, nadać stany, napisać program na odczyt kodów z pilota, potem do robota IR. Mam już wszystko. Złączony układ dwa programy. Jedyne co brakuje to ostatniej kropki nad i. Czyli zgrać wszystko tak z odbiornikiem podczerwieni zeby robot jechał tam gdzie chce użytkownik. Czujnik juz nawet odczytuje kody. I brakuje tylko ostatniej kropki nad i. Nie bede sie uczył C jak arduino ma inne komendy i gotowe biblioteki. Przecież to już ostatni punkt projektu jest tego robota. 99,8proc. Dla mnie to ogromny fun ze juz tak daleko zaszedlem"

Jak tam Twój "fun" w tej kłopotliwej sytuacji? Przecież nie masz problemów a tu taki pech, no popatrz, program nie działa. Gotowe biblioteki nie pomogły? Bo jak rozumiem rada byś zajrzał do programu, który działał - ten od wypisywania kodów z pilota - przecież poprawnie odbierał, więc wystarczy tylko dopisać do pętli głównej (innej niż ta tutaj, przypadek?) dekodowanie, jest zbyt skomplikowana, bo nie pokazuje paluszkiem jaką "komendę Arduino" i gdzie dopisać? Ojej, to może przerzuć się na budowanie ramienia robotycznego w innym swoim wątku a "kropkę nad i" w tym robocie postawisz jak zmądrzejesz?

Link to post

Temat przenoszę do kosza i przypominam wszystkim o PPF. Jeśli ktoś nie chce się uczyć to nie możemy go do tego zmuszać 🙂

Link to post
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.