Skocz do zawartości

IR nie odbiera


neuneu

Pomocna odpowiedź

Cześć,
Proszę o to kod.

Czemu odbiornik mi nie odbiera? (odbiera ale nie działa, gdy mam nie w komentarzu to co teraz jest w komentarzu [void odbiornik])

#define PWM_L 3
#define PWM_P 5
#define silnik1_1 2
#define silnik1_2 4
#define silnik2_1 7
#define silnik2_2 8

#define PWM_MAX 256

#include <IRremote.h>
#define odbiornik_pin 11
IRrecv irrecv(odbiornik_pin);
decode_results results;


void setup()
{
 pinMode(PWM_L, OUTPUT);
 pinMode(PWM_P, OUTPUT);

 pinMode(silnik1_1, OUTPUT);
 pinMode(silnik1_2, OUTPUT);
 pinMode(silnik2_1, OUTPUT);
 pinMode(silnik2_2, OUTPUT);

 digitalWrite(silnik1_1, LOW);
 digitalWrite(silnik1_2, LOW);
 digitalWrite(silnik2_1, LOW);
 digitalWrite(silnik2_2, LOW);

 Serial.begin(9600);
 irrecv.enableIRIn();//uruchamia odbiornik
}


void do_przodu_V(int predkosc)
{
 if (predkosc > 0)
 {
   predkosc = map(predkosc, 0, 100, 0, PWM_MAX); //od 0 do 100%; 0 do PWMMAX wypelnienie sygnalu
   analogWrite(PWM_L, predkosc);
   //    analogWrite(PWM_P, predkosc);
   do_przodu();
 }
}


void do_przodu()
{
 digitalWrite(silnik1_1, HIGH);
 digitalWrite(silnik1_2, LOW);
 delay(5000);
}


void do_tylu_V(int predkosc)
{
 if (predkosc > 0)
 {
   predkosc = map(predkosc, 0, 100, 0, PWM_MAX); //od 0 do 100%; 0 do PWMMAX wypelnienie sygnalu
   analogWrite(PWM_L, predkosc);
   //    analogWrite(PWM_P, predkosc);
   do_tylu();
 }
}


void do_tylu()
{
 digitalWrite(silnik1_1, LOW);
 digitalWrite(silnik1_2, HIGH);
 delay(5000);
}


void zatrzymaj()
{
 digitalWrite(silnik1_1, LOW);
 digitalWrite(silnik1_2, LOW);
 // digitalWrite(silnik2_1, LOW);
 //  digitalWrite(silnik2_2, LOW);
 delay(2000);
}


void IR()
{
 if (irrecv.decode(&results))
 {
   odbiornik();
 }
}


void odbiornik()
{
 /* Serial.print("0x");
   Serial.println(results.value, HEX);
   delay(250);*/
 switch (results.value)
 {
   case 0xCB000FF:
     do_tylu_V(80);
     break;

   case 0xCB0807F:
     do_tylu_V(40);
     break;

   case 0x20DF8877:
     do_przodu_V(80);
     break;

   case 0x20DF48B7:
     do_przodu_V(40);
     break;
 }
 irrecv.resume();
}


void loop()
{
 IR();
 irrecv.resume();
}

Proszę o rady czy wszytko z kodem jest ok.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Wydaje mi się, że irrecv.resume() powinieneś wołać tylko wtedy, gdy irrecv.decode() było niezerowe, a ty wołasz za każdym razem (a jak jest niezerowe, to nawet dwa razy).

Co to znaczy "odbiera ale nie działa"? Możesz trochę zwiększyć jasność wypowiedzi?

  • Pomogłeś! 1
Link do komentarza
Share on other sites

deshipu chyba ma rację 🙂

//+=============================================================================
// Restart the ISR state machine
//
void  IRrecv::resume ( )
{
irparams.rcvstate = STATE_IDLE;
irparams.rawlen = 0;
}

Wywołując resume w każdej iteracji głównej pętli zerujesz stan odebranej wiadomości, przez co biblioteka nie jest w stanie odczytać wszystkich danych.

Link do komentarza
Share on other sites

Wydaje mi się, że irrecv.resume() powinieneś wołać tylko wtedy, gdy irrecv.decode() było niezerowe, a ty wołasz za każdym razem (a jak jest niezerowe, to nawet dwa razy).

Co to znaczy "odbiera ale nie działa"? Możesz trochę zwiększyć jasność wypowiedzi?

Odbiornik nie odbiera wysłanego sygnału z pilota (diody Tx, Rx nie migają) więc silnik nie chodzi.

Jak jest bez odbiornika i to silnik chodzi.

void loop() 
{ 
// IR(); 

 if (irrecv.decode(&results))
 {
   Serial.print("0x");
     Serial.println(results.value, HEX);
     delay(250);
    switch (results.value)
 {
   case 0xCB000FF:
     do_tylu_V(80);
     break;

   case 0xCB0807F:
     do_tylu_V(40);
     break;

   case 0x20DF8877:
     do_przodu_V(80);
     break;

   case 0x20DF48B7:
     do_przodu_V(40);
     break;
 }
 irrecv.resume();
 }

}

Nie bawiąc się w funkcje, tak to powinno działać , ale nie działa tzn. widać, że odbiera ale silnik nie chodzi.

Te diody są na Arduino Nano. Oczywiście, działało

Troszkę się pogubiłem z tym wszystkim już...

Link do komentarza
Share on other sites

Diody Rx/Tx w Nano sygnalizują transmisję przez UART/USB. Co to ma wspólnego z IR?

Jeśli opierasz się na bibliotekach których działania do końca nie rozumiesz (i my też nie musimy), spróbuj pisać wolniej i uruchamiać kod małymi krokami. Np. puść na swojej płytce (tej z silnikami) przykład IR odbierania z biblioteki. Potem uzupełnij go o prostą analizę kodów - i znów sprawdź czy działa przez wypisywanie zdekodowanych komend zwykłym printem np."Odebralem: Do przodu". Dopiero wtedy dopisz sterowanie jednym silnikiem w jedną stronę i znów sprawdź czy działa to i wszystko poprzednie. W przeciwnym razie masz "gotowy" program którego nijak nie możesz ugryźć i który może mieć błędy w wielu miejscach. Rób na tyle małe zmiany między kolejnymi testami, byś nie mógł tam nasadzić wiele błędów. Łatwiej znaleźć jeden przed chwilą zrobiony babol niż ileśtam w przypadkowych miejscach, szczególnie gdy cały program jest martwy.

Nawet jeśli ktoś teraz znajdzie Ci błąd i to ruszy, postępując jak dotychczas nigdy nie napiszesz nic większego. Pracuj wolniej, startuj od działającego kodu i dopisuj tylko jedną małą rzecz na raz.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

"Działa oczywiście - tylko wartosc predkosci zapisuje mi w zmiennej turbo a jest to zmienna globalna - więc UWAGA gdy nacisne byle jaki inny przycisk od pilota i z powrotem nacisne od predkosci to pamieta wczesniejsza predkosc silnika i dodaje do niej 51.

A chcę aby ten przycisk od predkosci po nacisnieciu obojętnie kiedy wlaczał poczatkowa wartosc predkosci (czyli jakby od nowa uruchomil silnik). "

Nic nie rozumiem. Albo po każdym wciśnięciu tego przycisku dodajesz prędkość i wtedy przycisk służy tylko do rozpędzania silnika (i co wtedy służy do hamowania lub zatrzymywania)? Albo przycisk ten zawsze odpala silnik na prędkość początkową (ale znowu: co wtedy go dalej rozpędza i hamuje)? Te dwie funkcje: inkrementacja prędkości i ustalanie zawsze tej samej wartości początkowej są sprzeczne. Możesz opisać to jaśniej? Co mają robić inne przyciski w sprawie tego silnika?

To są proste rzeczy, ale musisz się skupić i opisać dokładnie krok po kroku co ma się dziać z silnikiem. Jeśli nie jesteś w stanie tego zrobić, nie możesz napisać programu realizującego ten pomysł - to jasne. Może jakiś rysunek algorytmu? Spróbuj, to zwykle wiele wyjaśnia.

Czy mają tu być jakieś zależności czasowe? Np: po 5 sekundach bez nowego kodu silnik sam się zatrzymuje itp. Przemyśl to dobrze, zamknij oczy i wyobraź sobie ten pojazd i to jak nim sterujesz. Czasem niefortunne pomysły mogą być upierdliwe w późniejszym użytkowaniu. Wymyśl od razu całe sterowanie (funkcje wszystkich przycisków), bo pewne rozwiązania/konstrukcje programu mogą być trudne do przerobienia na coś innego i trzeba pisać cały kod on nowa.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.