ИК управление

Тема в разделе "Технологии радиолюбителя", создана пользователем Maksim_22, 12 фев 2016.

  1. Maksim_22

    Maksim_22 Нерд

    Делаю управление робота на ардуино с пульта на ардуино. Мне надо по ИК каналу передать какой-то код, из которого я смогу вытащить два значения от 0 до 1023. Как вариант - отправлять 8-ми значное число. Первые четыре цифры - первое значение, другие - второе. Принимающее устройство должно принять этот сигнал и в зависимости от значений первого и второго датчиков что-то сделать.
    Проблема в том, что до принимающей ардуины доходит сигнал, совершенно не совпадающий с реальным. Подскажите, кто знает, как исправить?
    Код отправляющей части:
    Код (C++):
    #include <IRremote.h>

    IRsend irsend;

    void setup()
    {
      pinMode(A0, INPUT);
      pinMode(A1, INPUT);
    }

    void loop() {
      int a1 = analogRead(A0) * 10000;
      int a2 = analogRead(A1);
      int a3 = a1 + a2;
      irsend.sendNEC(a3, 32);
      delay(200);
    }
    и принимающей:
    Код (C++):
    #include <IRremote.h>

    IRrecv irrecv(A0);
    decode_results results;

    void setup() {
      irrecv.enableIRIn();
      Serial.begin(9600);
    }

    void loop() {
      if (irrecv.decode(&results)) {
        irrecv.resume();
        Serial.print((results.value - results.value % 10000) / 10000);
        Serial.print(' ');
        Serial.println(results.value % 10000);
      }
    }
    Заранее спасибо!
     
  2. AlexU

    AlexU Гуру

    Два 'int' без потери данных нужно упаковывать в 'long':
    Код (C++):
    #include <IRremote.h>

    IRsend irsend;

    void setup()
    {
      pinMode(A0, INPUT);
      pinMode(A1, INPUT);
    }

    void loop() {
      int a1 = analogRead(A0);
      int a2 = analogRead(A1);
      long a3 = a1 + a2 * 0x10000;
      irsend.sendNEC(a3, 32);
      delay(200);
    }
    Вот только не знаю как к 'long' отнесётся функция 'sendNEC'.
    Аналогично необходимо доработать приёмную часть.
     
  3. Maksim_22

    Maksim_22 Нерд

    Спасибо, но это не помогло. Решил проблему другим способом:

    Отправитель
    Код (C++):
    #include <IRremote.h>

    IRsend irsend;

    void setup()
    {
      pinMode(A0, INPUT);
      pinMode(A1, INPUT);
    }

    void loop() {
      int a1 = analogRead(A0);
      int a2 = analogRead(A1);
      irsend.sendNEC(a1, 32);
      delay(50);
      irsend.sendNEC(a2 + 2000, 32);
      delay(50);
    }
    Приемник
    Код (C++):
    #include <IRremote.h>

    IRrecv irrecv(A0);
    decode_results results;

    void setup() {
      // put your setup code here, to run once:
      irrecv.enableIRIn();
      Serial.begin(9600);
    }

    int a1 = 0;
    int a2 = 0;

    void loop() {
      // put your main code here, to run repeatedly:
      if (irrecv.decode(&results)) {
        irrecv.resume();
        int a = results.value;
        if (a >= 2000) {
          a1 = a - 2000;
        } else {
          a2 = a;
        }
        Serial.print(a1);
        Serial.print(' ');
        Serial.println(a2);
      }
    }