• 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
ArUNO/IR/L293D
#1
Cześć, więc ogólnie powiem, że jestem dosyć świeży jeżeli chodzi o sprawy programowania i opieram się w głównej mierze już na istniejących programach próbując je przerabiać tak żeby spełniał moje oczekiwania.

Po wielokrotnej próbie odkodowania przycisków pilota IR finalnie mi się udało. Następnym moim krokiem jest zarządzanie sterownikiem L293D za pomocą tego otóż pilota tak żeby mój projekt wykonywał kolejno skręty w prawo i lewo, jechał do przodu i do tyłu oraz się zatrzymywał, czyli pięć przycisków.

Odkodowałem sobie te przyciski w wartościach HEX, DEC i jeszcze mam je zapisane jako liczby dziesiętne 70/64 itd..

Po 3-4 nockach zabawy z ctrl+c i ctrl+v przeróżnych kodów natrafiłem na jakiś kod, na który w jakikolwiek sposób silniczki reagowały i tak przystąpiłem do przerabiania go (pewnie źle). 

Wyszło mi to tak, że arduino reaguje na każdy przycisk z pilota, a nie tylko określone w programie (5).

Ogólnie dużo programów już istniejących opiera się na tej starej bibliotece IR, w tym właśnie przypadku nic mi nie działa.

W serial monitorze dla tej starej biblioteki jest poradnik jak przekonwertować program 2.0 dla 4.0 dla IRremote ale nieudolnie próbuje przez to przebrnąć.

Mój obwód wygląda następująco: https://www.tinkercad.com/things/7W6tBfb...te-control

Zamiast pojedynczej diody IR, zakupiłem taki mniejszy moduł: https://botland.com.pl/odbiorniki-podcze...8kEALw_wcB



Cały kod zamieszczam poniżej:

Kod:
#include <IRremote.hpp>
#include <IRremote.h>
#define SUPPRESS_ERROR_MESSAGE_FOR_BEGIN

int IR_RECEIVE_PIN = 2;
int motor_pin1 = 13;    // Left motor
int motor_pin2 = A4;
int motor_pin3 = A2;    // Right motor
int motor_pin4 = A1;

void setup ()
{
IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);
  pinMode(motor_pin1,OUTPUT);    // Left motor
  pinMode(motor_pin2,OUTPUT);
  pinMode(motor_pin3,OUTPUT);    // Right motor
  pinMode(motor_pin4,OUTPUT);
  Serial.begin(9600);
}

void loop() {
 
  //if some date is sent, reads it and saves in state
   if (IrReceiver.decode()) {
    Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX);
    IrReceiver.printIRResultShort(&Serial);
    IrReceiver.printIRSendUsage(&Serial);
    IrReceiver.resume();   // Receive the next value
    }
 
   if (IrReceiver.decode(0xB946FF00) ) {   // VOL+ this is where you put in your IR remote button #
    digitalWrite(motor_pin1,LOW);      // Left motor forward
    digitalWrite(motor_pin2,HIGH);
    digitalWrite(motor_pin3,LOW);      // Right motor forward
    digitalWrite(motor_pin4,HIGH);
    {
      Serial.println("Go Forward!");
      }
    }
   
  //if some date is sent, reads it and saves in state   
  if (IrReceiver.decode()) {
    IrReceiver.resume();   // Receive the next value
    }

    if (IrReceiver.decode(0xEA15FF00))
    { 
      digitalWrite(motor_pin1,HIGH);      // Left motor backward
      digitalWrite(motor_pin2,LOW);
      digitalWrite(motor_pin3,HIGH);      // Right motor backward
      digitalWrite(motor_pin4,LOW);
      {
        Serial.println("Go Backward!");
      }
    }


 
  if (IrReceiver.decode())
  {
    IrReceiver.resume();   // Receive the next value
  }
 
    if (IrReceiver.decode(0xBB44FF00)) {
      digitalWrite(motor_pin1,HIGH);      // Left motor backward
      digitalWrite(motor_pin2,LOW);     
      digitalWrite(motor_pin3,LOW);       // Right motor forward
      digitalWrite(motor_pin4,HIGH);
      {
        Serial.println("Turn Left!");
      }
    }
   
 
  if (IrReceiver.decode()) {
    IrReceiver.resume();   // Receive the next value
    }
   
    if (IrReceiver.decode(0xBC43FF00)) {
      digitalWrite(motor_pin1,LOW);       // Left motor forward
      digitalWrite(motor_pin2,HIGH);   
      digitalWrite(motor_pin3,HIGH);      // Right motor backward
      digitalWrite(motor_pin4,LOW);
      {
        Serial.println("turn Right!");
      }
    }

  //if some date is sent, reads it and saves in state
  if (IrReceiver.decode()) {
    IrReceiver.resume();   // Receive the next value
    }
   
    if (IrReceiver.decode(0xBF40FF00)) {
      digitalWrite(motor_pin1,LOW);      
      digitalWrite(motor_pin2,LOW);   
      digitalWrite(motor_pin3,LOW);      
      digitalWrite(motor_pin4,LOW);
      {
        Serial.println("Stop!");
      }
    }
}



Cały post zamieszczam z prośbą/pytaniem o ewentualne poprawki bądź nakreślenie w którą stronę z tym kodem zmierzać, z góry dziękuję.
 
Odpowiedź
#2
Jak masz kod na starą bibliotekę, i z nią działa OK, to użyj starej, nie musisz używać najnowszej.
Cokolwiek przyleci z pilota raz to odczytaj, przypisz do zmiennej, wznów odbiór.
Potem użyj zmiennej do sterowania pojazdem.
Takich projektów znajdziesz na pęczki, np. tu:
https://projecthub.arduino.cc/comptek4/i...car-24e0bf
Przeczytaj kod, nawet nie trzeba mieć tego przypisania do zmiennej, tu wygląda to tak, że odbiera, wznawia, a ostatnio odebrany kod pilota jest w result i tego używa do sterowania.
Można też użyć konstrukcji switch case zamiast drabinki if/else if, ja bym jeszcze dodał pomiar czasu, że co np. 10ms mam inkrementowaną zmienną, jak przyleci coś z IR to jest zerowana, jak zmienna urośnie do 50, tzn. przez pół sekundy nie było nic z nadajnika to zatrzymaj pojazd, może operator upuścił pilot, może zszedł, po co męczyć baterie.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#3
Numery pinów w Twoim kodzie nie odpowiadają schematowi, który zamieściłeś.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości