Skocz do zawartości

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


Pomocna odpowiedź

@ghost1313 chyba do tej pory nikt nie zgłaszał nam problemu z kółkami, dzięki za sygnał - przekazuję sprawę do sprawdzenia 🙂 Jeśli Twoje kółka są wadliwe to zgłoś reklamację do Botlandu, na pewno wymienią je na nowy komplet 🙂

Link do komentarza
Share on other sites

Dzień dobry, otóż przeszedłem właśnie 8 część kursu budowy robotów o sterowaniu robota pilotem do TV i zastanawia mnie jedno, dlaczego klikając np. 2 która w kursie była przypisana jako jazda do przodu robot jedzie do przodu cały czas, aż do momentu wydania polecenia zatrzymania czy zmiany kierunku jazdy, pomimo iż tylko raz wcisnąłem ten przycisk. Ja myślałem, że żeby robot jechał do przodu cały czas to i cały czas trzeba wciskać dany przycisk, nie rozumiem dlaczego tak nie jest, prosiłbym o wytłumaczenie tego.

Link do komentarza
Share on other sites

@modok340 kurs ma na celu uczenie i podany został przykładowy program, który nie jest trudny w dostosowaniu do własnych potrzeb. Sprawdź czy podczas trzymania przycisku pilot dalej emituje sygnał, czy tylko w momencie kliknięcia - poświęć w kamerę i zobacz czy cały czas miga. Jeżeli tak, to możesz wykorzystać powtarzany sygnał.

Link do komentarza
Share on other sites

Witam,

Mam problem, w programie jest zapisane że przycisk 2 na pilocie to do przodu a jak klikam to skręca i tak ze wszystkimi jakby się przyciski po przemieniały macie jakieś porady jak z tym poradzić

Nie ważne wystarczyło zamienić 2 za 4 i 8 za 6 i wszystko działa przepraszam za problemy

Edytowano przez Akumulator222
  • Lubię! 1
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

C:\Users\jerem\AppData\Local\Temp\.arduinoIDE-unsaved2024020-17228-p97663.0m9z\sketch_jan20a\sketch_jan20a.ino:2:10: fatal error: RC5.h: No such file or directory
 #include <RC5.h>
          ^~~~~~~
compilation terminated.

exit status 1

Compilation error: RC5.h: No such file or directory

 

Link do komentarza
Share on other sites

Tak przy okazji zdalnego sterowanie IR przetestowałem kilka pilotów: 2 do odbiorników TV i 2 do dekoderów DVBT. Okazało się, że żaden nie współpracuje z protokółem kodowania RC5. Cóż pozostało mi znaleźć obsługiwany protokół dla moich pilotów. W tym przypadku odpowiednim protokołem okazał się NEC i trzeba było zmienić bibliotekę.

#define IR_SMALLD_NECx

#include <IRsmallDecoder.h>

  • Lubię! 1
Link do komentarza
Share on other sites

Super poradnik, a tu wersja kodu ode mnie z formą przyspieszenia po dłuższym trzymaniu przycisku (zrobiona nie podstawie command, nie toggle) oraz tryb sportowy (przycisk +, zwykly tryb przycisk -)
 

#include <RC5.h>

#define L_PWM 5
#define L_DIR 4
#define R_PWM 6
#define R_DIR 9
#define PWM_MAX 165

#define BUZZER 10
#define LED 13
#define TSOP_PIN 3

#define START_SPEED 40
#define DIFFERENCE_SPEED 20

RC5 rc5(TSOP_PIN);  //Informacja o podłączeniu odbiornika TSOP
byte address;
byte command;
byte toggle;

void setup() {
  //Konfiguracja pinow od mostka H
  pinMode(L_DIR, OUTPUT);
  pinMode(R_DIR, OUTPUT);
  pinMode(L_PWM, OUTPUT);
  pinMode(R_PWM, OUTPUT);

  //Konfiguracja pozostalych elementow
  pinMode(BUZZER, OUTPUT);
  digitalWrite(BUZZER, 0);  //Wylaczenie buzzera
  pinMode(LED, OUTPUT);
  digitalWrite(LED, 0);  //Wylaczenie diody

  Serial.begin(9600);
}

int Speed = START_SPEED;
byte lastToggle = 0;
byte lastCommand = 255;

bool SportMode = false;

void loop() {
  if (rc5.read(&toggle, &address, &command)) {

    switch (command) {

      case 1:
        Speed = acceleration();               // Skret lewy skos
        leftMotor(Speed - DIFFERENCE_SPEED);   
        rightMotor(Speed);
        break;

      case 2:                    //Do przodu
        Speed = acceleration();   
        leftMotor(Speed);         
        rightMotor(Speed);
        break;

      case 3:
        Speed = acceleration();  // Skret prawy skos
        leftMotor(Speed);         
        rightMotor(Speed - DIFFERENCE_SPEED);
        break;

      case 4:                    //Obrót w lewo
        Speed = acceleration();   
        leftMotor(-Speed);        
        rightMotor(Speed);
        break;

      case 5:  //STOP
        stopMotors();
        break;

      case 6:  //Obrót w prawo
        acceleration();
        leftMotor(Speed);
        rightMotor(-Speed);
        break;

      case 7:                                  
        Speed = acceleration();                // Skret lewy skos wstecz
        leftMotor(-Speed + DIFFERENCE_SPEED);   
        rightMotor(-Speed);
        break;

      case 8:                    //Do tyłu
        Speed = acceleration();   
        leftMotor(-Speed);        
        rightMotor(-Speed);
        break;

      case 9:
        Speed = acceleration();  // Skret prawy skos wstecz
        leftMotor(-Speed);        
        rightMotor(-Speed + DIFFERENCE_SPEED);
        break;

      case 12:
        buzzer();
        break;

      case 32:  //SportMode
        SportMode = 1;
        buzzer();
        break;

      case 33:
        SportMode = 0;
        buzzer();
        break;
    }
  }
}

void leftMotor(int V) {
  if (V > 0) {  //Jesli predkosc jest wieksza od 0 (dodatnia)
    V = map(V, 0, 100, 0, PWM_MAX);
    digitalWrite(L_DIR, 0);  //Kierunek: do przodu
    analogWrite(L_PWM, V);   //Ustawienie predkosci
  } else {
    V = abs(V);  //Funkcja abs() zwroci wartosc V  bez znaku
    V = map(V, 0, 100, 0, PWM_MAX);
    digitalWrite(L_DIR, 1);  //Kierunek: do tyłu
    analogWrite(L_PWM, V);   //Ustawienie predkosci
  }
}

void rightMotor(int V) {
  if (V > 0) {  //Jesli predkosc jest wieksza od 0 (dodatnia)
    V = map(V, 0, 100, 0, PWM_MAX);
    digitalWrite(R_DIR, 0);  //Kierunek: do przodu
    analogWrite(R_PWM, V);   //Ustawienie predkosci
  } else {
    V = abs(V);  //Funkcja abs() zwroci wartosc V  bez znaku
    V = map(V, 0, 100, 0, PWM_MAX);
    digitalWrite(R_DIR, 1);  //Kierunek: do tyłu
    analogWrite(R_PWM, V);   //Ustawienie predkosci
  }
}

int acceleration() {
  if (SportMode) {
    Speed = 95;
  } else {
    if (command != lastCommand) {
      Speed = START_SPEED;   
      lastCommand = command;  
    } else if (Speed >= 90) {
      Speed = START_SPEED;
    } else {
      Speed++;
    }
  }

  return (Speed);
}
void stopMotors() {
  analogWrite(L_PWM, 0);  //Wylaczenie silnika lewego
  analogWrite(R_PWM, 0);  //Wylaczenie silnika prawego
}

void buzzer() {
  digitalWrite(BUZZER, 1);
  delay(500);
  digitalWrite(BUZZER, 0);
}

 

  • Lubię! 1
Link do komentarza
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!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   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...

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.