Arduino nanoを用いてロータリー付きエンコーダー2つを制御したいです.
制御の要件としましては2つのモーターの位相を同じにしたいです.
回転数か回転を表す値をシリアルモニターに表示しその値によって電流を制御してほしいです.
片方のモーターのCount値をArduino nanoの2,3番ピンで割り込みはできたのですが,もう片方のモーターが表示できません.
Arduino nanoの外部割込みピンは2,3の2つしかないと調べていたら出てきたのですがArduino UNOのようにPinChangeInterruptなどのプログラムで外部割込みピンを増やせないでしょうか.
'''Arduino nano
コード
'''#include <Rotary.h>
Rotary r1 = Rotary(2, 3); //モーター①用エンコーダー
Rotary r2 = Rotary(4, 5); //モーター②用エンコーダー
//モーター①用エンコーダー入力カウンター
int motor1_count = 0;
//モーター②用エンコーダー入力カウンター
int motor2_count = 0;
//モーター①用PWM信号
int motor1_pwm=0;
//モーター②用PWM信号
int motor2_pwm=0;
//モーター①出力ピン
const int motor1_B_IA = 10; //正転
const int motor1_B_IB = 11; //逆転
//モーター②出力ピン
const int motor2_A_IA = 9; //正転
const int motor2_A_IB = 6; //逆転
//モーター①駆動トリガー
int motor1_on = 1;
//モーター②駆動トリガー
int motor2_on = 1;
//モーター正転・逆転を決定する変数
int motor1_LR = 0; //モーター①:初期値は正転
int motor2_LR = 0; //モーター②:初期値は正転
//モーター用カウンター値表示用変数
String motor1_monitor="";
String motor2_monitor="";
void setup() {
Serial.begin(9600);
//モーター①用エンコーダー入力割り込み
attachInterrupt(digitalPinToInterrupt(2), motor1, CHANGE);
attachInterrupt(digitalPinToInterrupt(3), motor1, CHANGE);
//モーター②用エンコーダー入力割り込み
attachInterrupt(digitalPinToInterrupt(4), motor2, CHANGE);
attachInterrupt(digitalPinToInterrupt(5), motor2, CHANGE);
//モーター①②出力ピン準備
pinMode(motor1_B_IA,OUTPUT); //モーター①
pinMode(motor1_B_IB,OUTPUT); //モーター①
pinMode(motor2_A_IA,OUTPUT); //モーター②
pinMode(motor2_A_IB,OUTPUT); //モーター②
}
void loop() {
//モーター①ON・OFF制御
if (motor1_on == 1){
motor1_pwm = 250;
} else if (motor1_on == 0){
motor1_pwm = 0;
}
//モーター②ON・OFF制御
if (motor2_on == 1){
motor2_pwm = 250;
} else if (motor2_on == 0){
motor2_pwm = 0;
}
//モーター①駆動ON:正転・逆転制御
if (motor1_LR == 0){
analogWrite(motor1_B_IA,motor1_pwm); //正転
}else if(motor2_LR == 1){
analogWrite(motor1_B_IB,motor1_pwm); //逆転
}
//モーター②駆動ON:正転・逆転制御
if (motor2_LR == 0){
analogWrite(motor2_A_IA,motor2_pwm); //正転
}else if(motor2_LR == 1){
analogWrite(motor2_A_IB,motor2_pwm); //逆転
}
}
//
void motor1() {
//エンコーダー状態入力
unsigned char result1 = r1.process();
if (result1 == DIR_NONE) {
// do nothing
}
else if (result1 == DIR_CW) {
motor1_count++;
motor1_monitor = "Motor1【Right】:Count = " + String(motor1_count);
Serial.println(motor1_monitor);
}
else if (result1 == DIR_CCW) {
motor1_count++;
motor1_monitor = "Motor1【Left】:Count = " + String(motor1_count);
Serial.println(motor1_monitor);
}
if (motor1_count > 200){
motor1_on = 0;
motor1_count = 0;
motor1_monitor = "Motor1 CountMAX:Return to zero:Count = " + String(motor1_count);
Serial.println(motor1_monitor);
}
}
void motor2() {
//エンコーダー状態入力
unsigned char result2 = r2.process();
if (result2 == DIR_NONE) {
// do nothing
}
else if (result2 == DIR_CW) {
motor2_count++;
motor2_monitor = "Motor2【Right】:Count = " + String(motor2_count);
Serial.println(motor2_monitor);
}
else if (result2 == DIR_CCW) {
motor2_count++;
motor2_monitor = "Motor2【Left】:Count = " + String(motor2_count);
Serial.println(motor2_monitor);
}
if (motor2_count > 50){
motor2_on = 0;
motor2_count = 0;
motor2_monitor = "Motor2 CountMAX:Return to zero:Count = " + String(motor2_count);
Serial.println(motor2_monitor);
}
}