Skocz do zawartości

Pomocna odpowiedź

Napisano

Witam mam następujący problem- Posiadam robota alphabot https://botland.com.pl/waveshare-roboty-edukacyjne/8077-alphabot-2-kolowa-platforma-robota-z-czujnikami-i-napedem-dc-waveshare-12249-5903351240291.html takiego jak w linku gdy wgrywam kod do sterowania ir kod nie działa czytałem że trzeba po przełączać jakieś zworki ale które nie wiem wstawiam również kod bo może to jest jego wina dodam że kod jest dołączony w instrukcji od robota z góry dziękuję za odpowiedź 🙂 

#include "AlphaBot.h"

#define KEY2 0x18                 //Key:2 
#define KEY8 0x52                 //Key:8 
#define KEY4 0x08                 //Key:4 
#define KEY6 0x5A                 //Key:6 
#define KEY1 0x0C                 //Key:1 
#define KEY3 0x5E                 //Key:3 
#define KEY5 0x1C                 //Key:5
#define SpeedDown 0x07            //Key:VOL-
#define SpeedUp 0x15              //Key:VOL+
#define ResetSpeed 0x09           //Key:EQ
#define Repeat 0xFF               //press and hold the key

#define IR  4                     //he infrare remote receiver pin 
unsigned long n = 0;
AlphaBot ArduinoCar = AlphaBot();

unsigned char t[30];
unsigned char results;
char IR_decode(unsigned char code);
void translateIR();

void setup()
{
  Serial.begin(115200);
  pinMode(IR, INPUT);
  ArduinoCar.SetSpeed(150);
}

void loop()
{
  if (IR_decode(&results))
  {
    translateIR();
  }

    if (millis() - n > 200)
  {
    ArduinoCar.Brake();
  }
}

/*-----( Declare User-written Functions )-----*/
void translateIR() // takes action based on IR code received
// describing KEYES Remote IR codes
{
  n = millis(); ;
  switch (results)
  {
    case KEY1:
      ArduinoCar.LeftCircle();
      break;

    case KEY2:
      ArduinoCar.Forward();
      break;

    case KEY3:
      ArduinoCar.RightCircle();
      break;

    case KEY4:
      ArduinoCar.Left();
      break;

    case KEY5:
      ArduinoCar.Brake();
      break;

    case KEY6:
      ArduinoCar.Right();
      break;

    case KEY8:
      ArduinoCar.Backward();
      break;

    case Repeat:
      break;

    default:
      ArduinoCar.Brake();
  }// End Case
} //END translateIR

char IR_decode(unsigned char * code)
{
  char flag = 0;
  unsigned int count = 0;
  unsigned char i, index, cnt = 0, data[4] = {0, 0, 0, 0};
  if (digitalRead(IR) == LOW)
  {
    count = 0;
    while (digitalRead(IR) == LOW && count++ < 200)  //9ms
      delayMicroseconds(60);
    t[0] = count;
    count = 0;
    while (digitalRead(IR) == HIGH && count++ < 80)   //4.5ms
      delayMicroseconds(60);
    t[1] = count;
    for (i = 0; i < 32; i++)
    {
      count = 0;
      while (digitalRead(IR) == LOW && count++ < 15) //0.56ms
        delayMicroseconds(60);
      count = 0;
      while (digitalRead(IR) == HIGH && count++ < 40) //0: 0.56ms; 1: 1.69ms
        delayMicroseconds(60);
      if (count > 20)data[index] |= (1 << cnt);
      if (cnt == 7)
      {
        cnt = 0;
        index++;
      }
      else cnt++;
    }
    if (data[0] + data[1] == 0xFF && data[2] + data[3] == 0xFF) //check
    {
      code[0] = data[2];
      Serial.println(code[0], HEX);
      flag = 1;
    }
    if (data[0] == 0xFF && data[1] == 0xFF && data[2] == 0xFF && data[3] == 0xFF)
    {
      code[0] = 0xFF;
      Serial.println("rep");
      flag = 1;
    }
  }
  return flag;
}

 

A odkryłeś stronę WIKI tej platformy? Znajdziesz tam manual, schematy i przykłady. Na stronie 33-34 manuala masz opisane sterowanie IR i jak te zworki musisz ustawić.

https://www.waveshare.com/w/upload/c/c7/AlphaBot-User-Manual.pdf

WIKI:

https://www.waveshare.com/wiki/AlphaBot

  • Lubię! 2
(edytowany)

Nie znam Leonardo ale masz dokumentację tej platformy. Myślę, że Leonardo nie jest w pełni kompatybilne z UNO więc czy Twój moduł jest w 100% kompatybilny z platformą AlphaBot? Ja bym poszedł małymi kroczkami i uruchomiłbym najpierw np. obsługę odbiornika IR, później obsługę silnika, a na koniec wszystko z sobą połączył. Piszesz, że nie wiesz jakie zworki jak ustawić. Platforma ta posiada wyprowadzone wejścia/wyjścia swoich układów elektronicznych na złącza, które za pomocą zworek umożliwiają ich dołączenie do odpowiedniego pinu RPi lub Arduino. W mojej platformie w ostatnim polu opisanym na platformie jako G (IR Receiver) znajduję 3 "bolce" gdzie środkowy to "IR Receiver" czyli wyjście odbiornika IR. Za pomocą zworki możesz podłączyć to wyjście albo do pinu D4 Arduino, albo do pinu P18 RPi.

D4__IR__P18

Skup się więc na "uruchomieniu" odbiornika. Możesz analizować czy cokolwiek odbiera wyświetlając w monitorze portu szeregowego odbierane dane.
Opanujesz sterowanie IR weź się za uruchomienie silników.
Tak na marginesie - jeśli pierwszy raz użyłeś tego pilota to czy usunąłeś folię z baterii?

Edytowano przez Belferek
  • Lubię! 2

@Belferek Mam również uno silniki działają na obu platformach uruchomiłem wtedy run test z dołączonego pliku i wszystko ładni działało próbowałem przełączać oraz patrzyłem na monitor portu i nic się nie działo tylko co jakiś czas wyświetlało się mniej więcej coś takiego (sony1)1 (sony2)1 (rec1)1 (rec2)1

 

A pilot działa? Poniżej znajdziesz programy przykładowe dołączone do tej platformy. Jest tam folder IRemote (na marginesie to standardowa biblioteka Arduino) z całkiem dużą liczbą programów, które możesz wykorzystać do testowania. Próbowałeś użyć innego pilota. Z ciekawości sam zaraz uruchomię tę platformę i zobaczę jak reaguje na piloty.

 

 

 

AlphaBot_Demo.zip

@Belferek Działa działa sprawdzałem wcześniej ale silniki dalej nie działają 😞 w tamtym kodzie co wcześniej wstawiłem trzeba było zmienić adres wysyłany przez pilota ponieważ tam były np. 0xff i i zmieniłem na to co odbiera program co podesłał kolega @Belferek i dalej nie działa 

#include "AlphaBot.h"

#define KEY2 0xFF18E7                 //Key:2 
#define KEY8 0xFF4AB5                 //Key:8 
#define KEY4 0xFF10EF                 //Key:4 
#define KEY6 0xFF5AA5                //Key:6 
#define KEY1 0xFF30CF         //Key:1 
#define KEY3 0xFF7A85                 //Key:3 
#define KEY5 0xFF38C7                 //Key:5
#define SpeedDown 0xFFE01F            //Key:VOL-
#define SpeedUp 0xFFA857              //Key:VOL+
#define ResetSpeed 0xFF906F           //Key:EQ
#define Repeat 0xFF               //press and hold the key

#define IR  4                     //he infrare remote receiver pin 
unsigned long n = 0;
AlphaBot ArduinoCar = AlphaBot();

unsigned char t[30];
unsigned char results;
char IR_decode(unsigned char code);
void translateIR();

void setup()
{
  Serial.begin(115200);
  pinMode(IR, INPUT);
  ArduinoCar.SetSpeed(150);
}

void loop()
{
  if (IR_decode(&results))
  {
    translateIR();
  }

    if (millis() - n > 200)
  {
    ArduinoCar.Brake();
  }
}

/*-----( Declare User-written Functions )-----*/
void translateIR() // takes action based on IR code received
// describing KEYES Remote IR codes
{
  n = millis(); ;
  switch (results)
  {
    case KEY1:
      ArduinoCar.LeftCircle();
      break;

    case KEY2:
      ArduinoCar.Forward();
      break;

    case KEY3:
      ArduinoCar.RightCircle();
      break;

    case KEY4:
      ArduinoCar.Left();
      break;

    case KEY5:
      ArduinoCar.Brake();
      break;

    case KEY6:
      ArduinoCar.Right();
      break;

    case KEY8:
      ArduinoCar.Backward();
      break;

    case Repeat:
      break;

    default:
      ArduinoCar.Brake();
  }// End Case
} //END translateIR

char IR_decode(unsigned char * code)
{
  char flag = 0;
  unsigned int count = 0;
  unsigned char i, index, cnt = 0, data[4] = {0, 0, 0, 0};
  if (digitalRead(IR) == LOW)
  {
    count = 0;
    while (digitalRead(IR) == LOW && count++ < 200)  //9ms
      delayMicroseconds(60);
    t[0] = count;
    count = 0;
    while (digitalRead(IR) == HIGH && count++ < 80)   //4.5ms
      delayMicroseconds(60);
    t[1] = count;
    for (i = 0; i < 32; i++)
    {
      count = 0;
      while (digitalRead(IR) == LOW && count++ < 15) //0.56ms
        delayMicroseconds(60);
      count = 0;
      while (digitalRead(IR) == HIGH && count++ < 40) //0: 0.56ms; 1: 1.69ms
        delayMicroseconds(60);
      if (count > 20)data[index] |= (1 << cnt);
      if (cnt == 7)
      {
        cnt = 0;
        index++;
      }
      else cnt++;
    }
    if (data[0] + data[1] == 0xFF && data[2] + data[3] == 0xFF) //check
    {
      code[0] = data[2];
      Serial.println(code[0], HEX);
      flag = 1;
    }
    if (data[0] == 0xFF && data[1] == 0xFF && data[2] == 0xFF && data[3] == 0xFF)
    {
      code[0] = 0xFF;
      Serial.println("rep");
      flag = 1;
    }
  }
  return flag;
}

 

(edytowany)

Coś cicho. U mnie działa np. coś takiego:

// ----------------------------- PILOT IR ---------------------------------
#include <IRremote.h>
int IRpin = 4;
IRrecv IR(IRpin);
//klawisze na moim pilocie
#define KEY_2 0xE718FF00
#define KEY_5 0xE31CFF00
#define KEY_8 0xAD52FF00

void setup()
{
  Serial.begin(115200);
  IR.enableIRIn();
}

void loop()
{
  if(IR.decode())
   {
    //Serial.println(IR.decodedIRData.decodedRawData,HEX);
    switch(IR.decodedIRData.decodedRawData)
    {
      case KEY_2:
      Serial.println("NAPRZOD");    //tutaj np. skok do procedury ruchu pojazdu
      break;
      case KEY_5:
      Serial.println("STOP");
      break;
      case KEY_8:
      Serial.println("WSTECZ");
      break;
      default:
      break;
    }
    delay(500);
    IR.resume();
   }
}

Korzystam z biblioteki IRemote w wersji 3.5.2

Edytowano przez Belferek
  • Lubię! 2

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