Не получается сделать управление двигателями с ИК-порт пульта

azatshi
Offline
Зарегистрирован: 31.01.2021

Считал коды кнопок на пульте по образцу, но как только включаю двигатели, коды кнопок начинают случайным образом меняться.  Пример нажатия одной кнопки (код постоянно меняется):

6AA81940
DE8F1CBB
917F59F4
FFFFFFFF
4537EFEB
7C4BF8B1
683B9927
FFFFFFFF
12BD2068
65A13BBF
4AB0F7B5
 

Не могу понять в чем дело:

#include <Servo.h>
//#include <NewPing.h>
#include "IRremote.h"

#define MOTOR_R 2
#define SPEED_R 3
#define MOTOR_L 4
#define SPEED_L 5

int key;
IRrecv irrecv(13); // указываем вывод, к которому подключен приемник

decode_results results;

void setup() //This block happens once on startup
{
pinMode(MOTOR_R, OUTPUT);
pinMode(SPEED_R, OUTPUT);
pinMode(MOTOR_L, OUTPUT);
pinMode(SPEED_L, OUTPUT);

Serial.begin(9600); // выставляем скорость COM порта
 irrecv.enableIRIn(); // запускаем прием 
}
void loop() //his block repeats itself while the Arduino is turned on
{
  if (irrecv.decode(&results)) {
    Serial.println( results.value, HEX); // печатаем данные
        if (results.value == 16718055)
          key = 1;
         else if (results.value == 16730805)
          key = 2;
         else if (results.value == 16716015)
          key = 3;
           else if (results.value == 16734885)
          key = 4;
           else if (results.value == 16726215)
           {
            key = 0;
           }
          if (results.value == 4294967295)
          {
            key = key;
          }
        irrecv.resume();// Receive the next value
    }
    else
      key = 0;
    
      if (key == 1){ 
        moveForward();
     }
     else if (key == 2){
       moveBackward();  
     }
     else if (key == 3){
       moveLeft();
     }
     else if (key == 4){
       moveRight(); 
     } /*
     else if (key == 0) {       
      moveStop();
     }
    */   
  }

void moveForward() //This function tells the robot to go forward
{

Serial.println("");
Serial.println("Moving forward");
//digitalWrite(LeftWotorBackward, LOW);
digitalWrite(MOTOR_R, HIGH);
digitalWrite(SPEED_R, HIGH);
digitalWrite( MOTOR_L, HIGH);
digitalWrite(SPEED_L, HIGH);
}

void moveBackward() //This function tells the robot to move backward
{
Serial.println("");
Serial. println("Moving backward");
digitalWrite(MOTOR_R, LOW);
digitalWrite(SPEED_R, HIGH);
digitalWrite(MOTOR_L, LOW);
digitalWrite(SPEED_L, HIGH);
}

void moveLeft() //This function tells the robot to turn left
{
Serial. println("");
Serial.println("Moving left");
digitalWrite(MOTOR_R, HIGH);
digitalWrite(SPEED_R, HIGH);
digitalWrite( MOTOR_L, LOW);
digitalWrite(SPEED_L, HIGH);
}

void moveRight() //This function tells the robot to turn right
{
Serial.println("");
Serial. println("Moving right");
digitalWrite(MOTOR_R, LOW);
digitalWrite(SPEED_R, HIGH);
digitalWrite(MOTOR_L, HIGH);
digitalWrite(SPEED_L, HIGH);
}

void moveStop()

{
Serial.println("");
Serial.println("Stopping");
digitalWrite(SPEED_R, LOW);
digitalWrite(SPEED_L, LOW);
}

 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Это от бездумного использования библиотек.
Объясняю.
Аппаратных таймера на ардуино всего 3.
Один занят отсчетом времени.
Остаётся выяснить на каком из оставшихся висят эти библиотеки.
Ну и самая малость, переписать одну из них под незанятый, либо отказаться от одной из библиотек.
Серва и без библиотеки , через analogWrite(), неплохо работает.
Только опять же нужно порты выбрать не завязанные к тому же таймеру, что и ик-приемник

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

azatshi пишет:

Считал коды кнопок на пульте по образцу, но как только включаю двигатели, коды кнопок начинают случайным образом меняться.  Пример нажатия одной кнопки (код постоянно меняется):

Не могу понять в чем дело:

Не понял, у Вас есть какой-то вопрос? Или Вы просто решили горем поделиться?

Если первое, то Вы забыли его задать, а если второе, то, что ж, "принято к сведению".

azatshi
Offline
Зарегистрирован: 31.01.2021

Спасибо ответ. Но, к сожалению, я так и ничего не понял. Попробовал заменить все на analogWrite(), убрать лишнюю библиотеку, но все тоже самое

azatshi
Offline
Зарегистрирован: 31.01.2021

Из-за чего это происходит, как сделать так, чтобы все работало?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

azatshi пишет:

Из-за чего это происходит, как сделать так, чтобы все работало?

Очевидно, правильно написать программу и правильно собрать схему.

А что, в этом есть какие-то сомнения?

azatshi пишет:

Но, к сожалению, я так и ничего не понял.

Ну так, если что-то непонятно, то, в первую очередь, - гуглить по непонятным словам. А не "менять на analogWrite".

sadman41
Offline
Зарегистрирован: 19.10.2016

Отключите двигателям питание. IR заработал удовлетворительно? Значит были наводки и "программа" не причем.

azatshi
Offline
Зарегистрирован: 31.01.2021

sadman41 пишет:
Отключите двигателям питание. IR заработал удовлетворительно? Значит были наводки и "программа" не причем.

Без двигателей все работает, как только хотя бы один подключаешь - все коды с пульта сбиваются

sadman41
Offline
Зарегистрирован: 19.10.2016

Значит собрали неудачно.

azatshi
Offline
Зарегистрирован: 31.01.2021

Спасибо всем, исправил. Работает. Теперь надо выяснить, почему под нагрузкой (например, когда машинка буксует) не получается переключить направление движения...(