Skocz do zawartości
Komentator

Kurs budowy robotów - #8 - zdalne sterowanie IR (RC5)

Pomocna odpowiedź

Sprawa problemu z kodami RC5 rozwiązana. W niektórych zestawach znalazły się piloty potrafiące nadawać w kilku różnych standardach. Jeśli Wasz pilot ma przycisk Select, który podświetla różne tryby pracy, to pamiętajcie o ustawieniu TV1. Przykład pilota z taką opcją: https://botland.com.pl/piloty/7395-pilot-uniwersalny-z-kodowaniem-rc5.html Po odpowiednim ustawieniu pilota wszystko działa poprawnie 🙂

Udostępnij ten post


Link to post
Share on other sites

Mam problem kiedy chce połączyć czujnik odległości HC - SR04 z pilotem to pilot przestaje reagować nie wiem już co jest powodem ;( co prawda nie wiem jak napisana jest ta biblioteka od pilota prosił bym o jakość podpowiedz 🙂

#define odebraniePilota 3
#define wyslanieSygnalu A4
#define odebranieSygnalu 8
#define LewaWykryta A2
#define PrawaWykryta A3
#define LewaPWM 5
#define LewaKierunek 4
#define PrawaPWM 6
#define PrawaKierunek 9
#define PWM_MAX 150
#define glosnik 10
#define WykrywaczPrawy A0
#define WykrywaczLewy A1
#define RoznicaMin 100
#define RoznicaMax -100 
int odczytLewy = 0;
int odczytPrawy = 0;
int roznica = 0;
byte zmianaStanup = 1;
int predkosc = 800;

#include <RC5.h>
RC5 rc5(odebraniePilota);
byte adres;
byte dane;
byte zmianaStanu;
int odczyt = 1;

void setup() {
 Serial.begin(9600);
 pinMode(LewaKierunek, OUTPUT);
 pinMode(PrawaKierunek, OUTPUT);
 pinMode(LewaPWM, OUTPUT);
 pinMode(PrawaPWM, OUTPUT);

 pinMode(LewaWykryta, INPUT_PULLUP);
 pinMode(PrawaWykryta, INPUT_PULLUP);

 pinMode(glosnik, OUTPUT);
 digitalWrite(glosnik, 0);

 randomSeed(analogRead(5));

 pinMode(wyslanieSygnalu, OUTPUT);
 pinMode(odebranieSygnalu, INPUT); 


 }

void pilot(){
 if(rc5.read(&zmianaStanu, &adres, &dane)){
   switch(dane){
      case 12:
      if(zmianaStanu == 1){
      odczyt = 0;
      LewySilnik(0);
      PrawySilnik(0);

      }
      if(zmianaStanu == 0){
      stopSilnik();
      odczyt = 1;
      }
      break;
      case 144:
      LewySilnik(40);
      PrawySilnik(40);
      break;
      case 150:
      LewySilnik(-40);
      PrawySilnik(40);
      break;
      case 149:
      LewySilnik(40);
      PrawySilnik(-40);
      break;
      case 145:
      LewySilnik(-40);
      PrawySilnik(-40);
      break;

  }  
 }
}



void tyl(int a,int b){ 
int los = random(a, b)*10;

if(digitalRead(LewaWykryta) == LOW){
 LewySilnik(40);
 PrawySilnik(40);
 digitalWrite(glosnik, 1);
 delay(1500);
 LewySilnik(40);
 PrawySilnik(-40);
 digitalWrite(glosnik, 0);
 delay(140+los);
}

if(digitalRead(PrawaWykryta) == LOW){
 LewySilnik(40);
 PrawySilnik(40);
 digitalWrite(glosnik, 1);
 delay(1500);
 LewySilnik(-40);
 PrawySilnik(40);
 digitalWrite(glosnik, 0);
 delay(140+los);
}
}

void Swietlik(){
if(odczyt == 0){
int odczytLewy = analogRead(WykrywaczLewy);
int odczytPrawy = analogRead(WykrywaczPrawy);
int roznica = 0;
 if((odczytLewy < 500)||(odczytPrawy < 500)){
 if(odczytLewy < 500){
   roznica = RoznicaMin;


 }
 else if(odczytPrawy < 500){
   roznica = RoznicaMax;

 }

int zmianaPredkosci = map(roznica,RoznicaMin,RoznicaMax,-30,30);

LewySilnik(30+zmianaPredkosci);
PrawySilnik(30-zmianaPredkosci);
delay(500);}
else{ 
LewySilnik(40);
PrawySilnik(40);
}
}
}
int zmieszOdleglosc(){
 long czas, dystans;
 digitalWrite(wyslanieSygnalu, LOW);
 delayMicroseconds(2);
 digitalWrite(wyslanieSygnalu, HIGH);
 delayMicroseconds(10);
 digitalWrite(wyslanieSygnalu, LOW);
 czas = pulseIn(odebranieSygnalu, HIGH);
 dystans = czas / 58;
 return dystans;
}


void zakres(int a, int b){
 int jakDaleko = zmieszOdleglosc();
 if((jakDaleko > a)&&(jakDaleko < b)){

   int losSkretu = random(1,3);

   if(losSkretu == 1){

     LewySilnik(40);
     PrawySilnik(-40);
     delay(500);
   }
   else if(losSkretu == 2){

     PrawySilnik(40);
     LewySilnik(-40);
     delay(500);

 }

}
}


void LewySilnik(int V){
 if(V > 0){
   V = map(V,0,100,0,PWM_MAX);
   digitalWrite(LewaKierunek, 1);
   analogWrite(LewaPWM, V);
 }
 else{
   V = abs(V);
   V = map(V,0,100,0,PWM_MAX);
   digitalWrite(LewaKierunek, 0);
   analogWrite(LewaPWM, V);
 }
}


void PrawySilnik(int V){
 if(V > 0){
   V = map(V,0,100,0,PWM_MAX);
   digitalWrite(PrawaKierunek, 0);
   analogWrite(PrawaPWM, V);
 }
 else{
   V = abs(V);
   V = map(V,0,100,0,PWM_MAX);
   digitalWrite(PrawaKierunek, 1);
   analogWrite(PrawaPWM, V);
 }
}


void stopSilnik(){
 analogWrite(LewaPWM, 0);
 analogWrite(PrawaPWM, 0);
}


void loop() { 
tyl(5,20); 
pilot();
Swietlik();
zakres(3,25); //<-- problem z reakcja pilota ;/

}

Udostępnij ten post


Link to post
Share on other sites

mistus, czy na pewno pilot przestaje działać tylko po dodaniu kodu od czujnika odległości? Biblioteka od RC5 działa poprawnie jeśli wystarczająco często wywołujesz jej funkcję read(). W Twoim programie jest sporo różnych opóźnień. Ciężko więc jednoznacznie określić skąd bierze się ten problem. Nie wiem czy czujnik odległości jest faktycznie głównym winowajcą. Próbowałeś zakomentować tę część programu, czy wtedy wszystko wraca do normy?

Udostępnij ten post


Link to post
Share on other sites

jak wyłączę funkcje pilota to wszystko fajnie hula ze sobą jedynie jeśli wpisze do funkcji pilota by uruchamiał czujnik to nie robi problemów a poza funkcja pilota nie rusza może i problem są faktycznie opóźnienia będę próbował zrobić bez(odkryłem też że serwomechanizm nie działa z pilotem) na razie znalazłem inne rozwiązanie skorzystałem z innej biblioteki na podczerwień

i wszystko hula

Udostępnij ten post


Link to post
Share on other sites

mistus, super, że udało się rozwiązać problem 🙂 Im więcej się podłącza do Arduino tym więcej może się pojawić różnych problemów. Najważniejsze, że jednak sobie poradziłeś 🙂

Udostępnij ten post


Link to post
Share on other sites

Witam.

Mam problem ze sterowaniem RC5. Pilot z zestawu. Na konsoli szeregowej po wciśnięciu 2846 wszystko jest OK. Ale gdy chcę sterować robotem niestety ale nie działa tak jak powinno. 4 - do przodu, 6 - do tyłu, 2 - w prawo, 8 - w lewo. Czy jakoś da sie to zmienić? w kodzie nawet skopiowanym z kursu tak samo się dzieje.

Udostępnij ten post


Link to post
Share on other sites

@rafcio_bed, witam na forum 😉 Widzę, że to Twoje pierwsze kroki na Forbocie, oto najważniejsze informacje na start:

  • Chcesz przywitać się z innymi członkami naszej społeczności? Skorzystaj z tematu powitania użytkowników.
  • Opis najciekawszych funkcji, które ułatwiają korzystanie z forum znajdziesz w temacie instrukcja korzystania z forum - co warto wiedzieć?
  • Poszczególne posty możesz oceniać (pozytywnie i negatywnie) za pomocą reakcji - ikona serca w prawym dolnym rogu każdej wiadomości.

5 minut temu, rafcio_bed napisał:

Na konsoli szeregowej po wciśnięciu 2846 wszystko jest OK. Ale gdy chcę sterować robotem niestety ale nie działa tak jak powinno. 4 - do przodu, 6 - do tyłu, 2 - w prawo, 8 - w lewo. Czy jakoś da sie to zmienić? w kodzie nawet skopiowanym z kursu tak samo się dzieje.

Pewnie, wszystko się da. Powiedz tylko czy na pewno robot jeździł poprawnie w poprzednich ćwiczeniach? Wygląda na to jakbyś miał źle ustawione u siebie funkcje sterujące silnikami. Możesz mieć inaczej podłączone przewody do jednego z silników co odwraca działanie całego sterowania. Czy robot jeździł poprawnie podczas wykonywania ćwiczeń z czwartej części kursu?

Udostępnij ten post


Link to post
Share on other sites

Podmieniłem numery z klawiatury i jest OK. Wcześniejsze testy silników były OK. Tylko po podłączeniu pilota tak się dzieje. Czyli to może być wina odwrotnego podłączenia przewodów od silników? czyli będe musiał inaczej podłączyć przewody i sprawdzić.

Udostępnij ten post


Link to post
Share on other sites

Brzmi to dość podejrzanie, bo jeśli wcześniej działało poprawnie to teraz też powinno. Jeśli po wciśnięciu przycisku "2" wywołujesz funkcję od jazdy prosto, to robot powinien jechać prosto (skoro tak działało to poprzednio). W każdym razie zamiana kodów przycisków w programie też będzie dobrym rozwiązaniem 😉

Udostępnij ten post


Link to post
Share on other sites

Witam, mam takie pytanie, czy dało by się tak zrobić że robot będzie jechał tylko gdy dany przycisk będzie wciśnięty (tzn. np. jak wciskam 2 to jedzie do przodu a jak puszczam to się zatrzymuje), a także czy dało by się zrobić tak że robot jechał by po łuku gdy wciśnięte będą dwa przyciski(np. wciskamy 2 i 6 i robot jedzie po łuku w prawo)?

Udostępnij ten post


Link to post
Share on other sites
28 minut temu, Adampi314 napisał:

Witam, mam takie pytanie, czy dało by się tak zrobić że robot będzie jechał tylko gdy dany przycisk będzie wciśnięty (tzn. np. jak wciskam 2 to jedzie do przodu a jak puszczam to się zatrzymuje), a także czy dało by się zrobić tak że robot jechał by po łuku gdy wciśnięte będą dwa przyciski(np. wciskamy 2 i 6 i robot jedzie po łuku w prawo)?

Dało by się.

Udostępnij ten post


Link to post
Share on other sites

Jaki jest kod RC5 naciśnięcia dwóch klawiszy jednocześnie? AFAIRC to żaden standard tego nie obsługuje.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
1 godzinę temu, Adampi314 napisał:

Witam, mam takie pytanie, czy dało by się tak zrobić że robot będzie jechał tylko gdy dany przycisk będzie wciśnięty (tzn. np. jak wciskam 2 to jedzie do przodu a jak puszczam to się zatrzymuje),

Tak, takie coś osiągniesz bardzo łatwo 🙂 Zerknij na fragment artykułu od nagłówka "Wykorzystanie bitu toggle" tam jest podobny przykład.

1 godzinę temu, Adampi314 napisał:

a także czy dało by się zrobić tak że robot jechał by po łuku gdy wciśnięte będą dwa przyciski(np. wciskamy 2 i 6 i robot jedzie po łuku w prawo)?

Z tym będzie problem (tak jak było napisane wyżej) - standard komunikacji nie obsługuje takiego zachowania. Najłatwiej będzie wykorzystać do tego osobny klawisz (np. 3).

Udostępnij ten post


Link to post
Share on other sites

Dzięki za odpowiedzi, @Treker ale bit toggle zmienia się tylko jeśli znowu wciśniemy jakiś przycisk, a jeśli puszczamy to w zapisanej wartości pozostaje ta poprzednia, czyli 0, no i tak jak np w przykładzie trzeba jeszcze wcisnąć przycisk. A ja próbuję tak zrobić żeby przy puszczeniu przycisku przestawał jechać (kombinowałem z else po tym pierwszym if-ie, ale wtedy robot nawet nie ruszał).

Udostępnij ten post


Link to post
Share on other sites

Po prostu: nie ma takiej możliwości, chyba że zrobisz sobie własnego pilota i własny protokół komunikacji.

EOT.

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Napisz odpowiedź...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...