Arduino「IRremote.hpp」ライブラリを使用してラジコンを動かしたい
解決したいこと
Freenoveのラジコンキットをつかい、IRリモコンでラジコンを操作したいです。
https://amzn.asia/d/ghOXhW0
発生している問題・エラー
サンプルファイルだとエラーはないが、動作しない
*発生している問題・エラー参照
シリアルモニタにてどのリモコンのボタンを押しても「FFFFFFF」と表示される
該当するソースコード
/**********************************************************************
* Filename : IR_Remote_Car.ino
* Product : Freenove 4WD Car for UNO
* Description : An IR-Remote Car.
* Auther : www.freenove.com
* Modification: 2019/08/06
**********************************************************************/
#include <IRremote.h>
#include "Freenove_4WD_Car_for_Arduino.h"
//define key, the code can not be changed.
#define IR_REMOTE_KEYCODE_UP 0xFF02FD
#define IR_REMOTE_KEYCODE_DOWN 0xFF9867
#define IR_REMOTE_KEYCODE_LEFT 0xFFE01F
#define IR_REMOTE_KEYCODE_RIGHT 0xFF906F
#define IR_REMOTE_KEYCODE_CENTER 0xFFA857
#define IR_UPDATE_TIMEOUT 120
#define IR_CAR_SPEED 180
IRrecv irrecv(PIN_IRREMOTE_RECV);
decode_results results;
u32 currentKeyCode, lastKeyCode;
bool isStopFromIR = false;
u32 lastIRUpdateTime = 0;
void setup() {
irrecv.enableIRIn(); // Start the receiver
}
void loop() {
if (irrecv.decode(&results)) {
isStopFromIR = false;
currentKeyCode = results.value;
if (currentKeyCode != 0xFFFFFFFF) {
lastKeyCode = currentKeyCode;
}
switch (lastKeyCode) {
case IR_REMOTE_KEYCODE_UP:
motorRun(IR_CAR_SPEED, IR_CAR_SPEED); //move forward
break;
case IR_REMOTE_KEYCODE_DOWN:
motorRun(-IR_CAR_SPEED, -IR_CAR_SPEED); //move back
break;
case IR_REMOTE_KEYCODE_LEFT:
motorRun(-IR_CAR_SPEED, IR_CAR_SPEED); //turn left
break;
case IR_REMOTE_KEYCODE_RIGHT:
motorRun(IR_CAR_SPEED, -IR_CAR_SPEED); //turn right
break;
case IR_REMOTE_KEYCODE_CENTER:
setBuzzer(true); //turn on buzzer
break;
default:
break;
}
irrecv.resume(); // Receive the next value
lastIRUpdateTime = millis(); //write down current time
}
else {
if (millis() - lastIRUpdateTime > IR_UPDATE_TIMEOUT) {
if (!isStopFromIR) {
isStopFromIR = true;
motorRun(0, 0);
setBuzzer(false);
}
lastIRUpdateTime = millis();
}
}
}
#include "Freenove_4WD_Car_for_Arduino.h"
float batteryVoltage = 0;
bool isBuzzered = false;
void pinsSetup() {
pinMode(PIN_DIRECTION_LEFT, OUTPUT);
pinMode(PIN_MOTOR_PWM_LEFT, OUTPUT);
pinMode(PIN_DIRECTION_RIGHT, OUTPUT);
pinMode(PIN_MOTOR_PWM_RIGHT, OUTPUT);
pinMode(PIN_SONIC_TRIG, OUTPUT);// set trigPin to output mode
pinMode(PIN_SONIC_ECHO, INPUT); // set echoPin to input mode
pinMode(PIN_TRACKING_LEFT, INPUT); //
pinMode(PIN_TRACKING_RIGHT, INPUT); //
pinMode(PIN_TRACKING_CENTER, INPUT); //
setBuzzer(false);
}
void motorRun(int speedl, int speedr) {
int dirL = 0, dirR = 0;
if (speedl > 0) {
dirL = 0 ^ MOTOR_DIRECTION;
} else {
dirL = 1 ^ MOTOR_DIRECTION;
speedl = -speedl;
}
if (speedr > 0) {
dirR = 1 ^ MOTOR_DIRECTION;
} else {
dirR = 0 ^ MOTOR_DIRECTION;
speedr = -speedr;
}
speedl = constrain(speedl, 0, 255);
speedr = constrain(speedr, 0, 255);
if (abs(speedl) < MOTOR_PWM_DEAD && abs(speedr) < MOTOR_PWM_DEAD) {
speedl = 0;
speedr = 0;
}
digitalWrite(PIN_DIRECTION_LEFT, dirL);
digitalWrite(PIN_DIRECTION_RIGHT, dirR);
analogWrite(PIN_MOTOR_PWM_LEFT, speedl);
analogWrite(PIN_MOTOR_PWM_RIGHT, speedr);
}
bool getBatteryVoltage() {
if (!isBuzzered) {
pinMode(PIN_BATTERY, INPUT);
int batteryADC = analogRead(PIN_BATTERY);
if (batteryADC < 614) // 3V/12V ,Voltage read: <2.1V/8.4V
{
batteryVoltage = batteryADC / 1023.0 * 5.0 * 4;
return true;
}
}
return false;
}
void setBuzzer(bool flag) {
isBuzzered = flag;
pinMode(PIN_BUZZER, flag);
digitalWrite(PIN_BUZZER, flag);
}
void alarm(u8 beat, u8 repeat) {
beat = constrain(beat, 1, 9);
repeat = constrain(repeat, 1, 255);
for (int j = 0; j < repeat; j++) {
for (int i = 0; i < beat; i++) {
setBuzzer(true);
delay(100);
setBuzzer(false);
delay(100);
}
delay(500);
}
}
void resetCarAction() {
motorRun(0, 0);
setBuzzer(false);
}
// Freenove_4WD_Car_for_Arduino.h
#ifndef _FREENOVE_4WD_CAR_FOR_ARDUINO_h
#define _FREENOVE_4WD_CAR_FOR_ARDUINO_h
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
#define PIN_SERVO 2
#define MOTOR_DIRECTION 0 //If the direction is reversed, change 0 to 1
#define PIN_DIRECTION_LEFT 4
#define PIN_DIRECTION_RIGHT 3
#define PIN_MOTOR_PWM_LEFT 6
#define PIN_MOTOR_PWM_RIGHT 5
#define PIN_SONIC_TRIG 7
#define PIN_SONIC_ECHO 8
#define PIN_IRREMOTE_RECV 9
#define PIN_SPI_CE 9
#define PIN_SPI_CSN 10
#define PIN_SPI_MOSI 11
#define PIN_SPI_MISO 12
#define PIN_SPI_SCK 13
#define PIN_BATTERY A0
#define PIN_BUZZER A0
#define PIN_TRACKING_LEFT A1
#define PIN_TRACKING_CENTER A2
#define PIN_TRACKING_RIGHT A3
#define MOTOR_PWM_DEAD 5
#define BAT_VOL_STANDARD 7.0
extern float batteryVoltage;
void pinsSetup();
void motorRun(int speedl, int speedr);
bool getBatteryVoltage();
void setBuzzer(bool flag);
void alarm(u8 beat, u8 repeat);
void resetCarAction();
#endif
自分で試したこと
そこで一度拡張ボードやモーターを取り外して、
①arduinoUno
②ジャンパーワイヤー
③IRセンサー
だけを使用し、不具合の原因切り分けを行った。
センサの信号線を9番→11番につけかえて下記コードでシリアルモニタを開くと正常に反応
#include <IRremote.hpp>
void setup() {
Serial.begin(115200);
IrReceiver.begin(11,true);
}
void loop() {
if(IrReceiver.decode()){
Serial.println(IrReceiver.decodedIRData.command,HEX);
}
IrReceiver.resume();
delay(100);
}
IRremote.hではなく、IRremote.hppをつかったコードでリモコンの信号を受信できた
そのため、IRremote.hppのライブラリを使用することでうまくいくと考えたが
、何を変えればよいか不明
下記コードで書き替えたが、コンパイルエラー
#include <IRremote.hpp>
#include "Freenove_4WD_Car_for_Arduino.h"
#define IR_REMOTE_KEYCODE_UP 0xFF02FD
#define IR_REMOTE_KEYCODE_DOWN 0xFF9867
#define IR_REMOTE_KEYCODE_LEFT 0xFFE01F
#define IR_REMOTE_KEYCODE_RIGHT 0xFF906F
#define IR_REMOTE_KEYCODE_CENTER 0xFFA857
#define IR_CAR_SPEED 180 // モーターの速度を180として宣言
#define IR_UPDATE_TIMEOUT 500 // IRリモコンの受信が500ミリ秒間更新されなかった場合、停止する
IRrecv irrecv(PIN_IRREMOTE_RECV);
decode_results results;
u32 currentKeyCode, lastKeyCode;
bool isStopFromIR = false;
u32 lastIRUpdateTime = 0;
void setup() {
Serial.begin(9600);
irrecv.enableIRIn();
}
void loop() {
if (irrecv.decode(&results)) {
isStopFromIR = false;
currentKeyCode = results.value;
if (currentKeyCode != 0xFFFFFFFF) {
lastKeyCode = currentKeyCode;
}
switch (lastKeyCode) {
case IR_REMOTE_KEYCODE_UP:
motorRun(IR_CAR_SPEED, IR_CAR_SPEED);
break;
case IR_REMOTE_KEYCODE_DOWN:
motorRun(-IR_CAR_SPEED, -IR_CAR_SPEED);
break;
case IR_REMOTE_KEYCODE_LEFT:
motorRun(-IR_CAR_SPEED, IR_CAR_SPEED);
break;
case IR_REMOTE_KEYCODE_RIGHT:
motorRun(IR_CAR_SPEED, -IR_CAR_SPEED);
break;
case IR_REMOTE_KEYCODE_CENTER:
setBuzzer(true);
break;
default:
break;
}
irrecv.resume();
lastIRUpdateTime = millis();
}
else {
if (millis() - lastIRUpdateTime > IR_UPDATE_TIMEOUT) {
if (!isStopFromIR) {
isStopFromIR = true;
motorRun(0, 0);
setBuzzer(false);
}
lastIRUpdateTime = millis();
}
}
}
C:\Users\kabao\AppData\Local\Temp\.arduinoIDE-unsaved2024321-15896-n5z3bt.cvmqi\sketch_apr21a\sketch_apr21a.ino:2:10: fatal error: Freenove_4WD_Car_for_Arduino.h: No such file or directory
#include "Freenove_4WD_Car_for_Arduino.h"
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
exit status 1
Compilation error: Freenove_4WD_Car_for_Arduino.h: No such file or directory