Mr.Kubikus писал(а):Здравствуйте!
Возможно вы ошиблись. Товар "[RTL-10783] Дистанционное управление ИК" в ассортименте нашего магазина появился только в мае 2012 года.
Не могли бы вы отправить нам на почту info at pacpac.ru номер вашего заказа?
Благодарю сотрудников магазина за доброжелательность и замену не работающего пульта на новый, но, к сожалению, новый пульт так же отказывается работать, по всей видимости произошел брак на производстве, так как негативных отзывов относительно данного товара в сети Интернет достаточно.
Тем не менее, подключив к дуине домашний пульт от ТВ возник следующий вопрос.
Задача:
Управлять серво мотором ультразвуковым дальномером и инфракрасным пультом. Так как пульт и дальномер не могут одновременно посылать данные на серво, требуется добавить кнопку для включения/выключения дальномера и последующей активации пульта для работы с серво. К сожалению никак не могу обойтись без физического переключения с пульта на дальномер и обратно путем замыкания/размыкания цепи на 12ом цифровом выходе с помощью тумблера. 
Код: Выделить всё
#include <rxURM04.h> //импорт библиотеки для дальномера
#include <Servo.h>   //импорт библиотеки для сервопривода
Servo servo;
float rs = 0;    //переменная для данных с датчика
static unsigned long timePoint = 0;
int irPin = 5;   //Подключаем ножку данных TSOP приёмника
int start_bit = 2200; 
int bin_1 = 1000;
int bin_0 = 400;
int ledPin = 13; //светодиод на 13-м пине
int Button = 12; //кнопка переключения управления с пульта на дальномер
int val = 0;
int pos = 0;
void setup()
  {
    pinMode(irPin, INPUT);
    pinMode(ledPin, OUTPUT);
    pinMode(Button, INPUT);
    digitalWrite(Button, HIGH);
    Serial.begin(19200); //инициализируем Serial соединение
    servo.attach(9);     //подключаем сигнальный провод сервы к пину 9
    URM04_init();        //инициализируем дальномер
  }
void loop()
 {
  digitalWrite(ledPin, LOW);
  val = digitalRead(Button); //опрашиваем состояние кнопки
  delay(50);
  switch(val)
    {
      case 0: Distance(); break;
      case 1: ButtonControl(); break;
      default: break; 
    }
  delay(50);
 }
void Distance() //функция опреления расстояния и движения сервы
  {
    if(millis() - timePoint > 200)
    {
      pos = servo.read();
      servo.write(pos);
      rs = URM04_getDistance(); // получение данных с датчика
      //Serial.print("Дистанция:  ");
      //Serial.println(rs);   // Вывод данных в консоль, скорость 19200 бод
      rs = map(rs, 0, 350, 0, 150);
      servo.write(rs);
      digitalWrite(ledPin, HIGH);
      delay(100);
     }
   }
  
void ButtonControl() //функция управления сервой с пульта (LEFT/RIGHT)
  {
    pos = servo.read();
    servo.write(pos);
    int key = getIRKey();
    if(key != 0) 
     {
        switch(key)
          {
            case 180: 
              {
                int servopos = servo.read();
                servo.write(servopos);
                int irserv = servopos - 20;
                servo.write(irserv);
                digitalWrite(ledPin, HIGH);
                delay(100);
              };
                break;
            case 179: 
              {
                int  servopos = servo.read();
                servo.write(servopos);
                int irserv = servopos + 20;
                servo.write(irserv);
                digitalWrite(ledPin, HIGH);
                delay(100);
              };
                break;
            default: break;
          }
       delay(50);
     } 
  }
  
int getIRKey() 
  {
    int data[12];
    int i;
    while(pulseIn(irPin, LOW) < start_bit); 
    for(i = 0 ; i < 11 ; i++)
      data[i] = pulseIn(irPin, LOW); 
    for(i = 0 ; i < 11 ; i++)
      {	    
        if(data[i] > bin_1)
        data[i] = 1;
          else if(data[i] > bin_0)
            data[i] = 0;
              else
                return -1;
       }
  
    int result = 0;
    for(i = 0 ; i < 11 ; i++)
      if(data[i] == 1) result |= (1<<i);
        return result; //Возвращаем код нажатой кнопки
  }