起因:
自走車在繞圈的時候因為各種原因使我們無法精確掌控轉速,因此決定拿紅外線避障模組當旋轉編碼器,測量馬達轉速。
程式碼:
analog version
#include <AFMotor.h>
AF_DCMotor motorLeft(2);
AF_DCMotor motorRight(3);
int DigitalPin = A5;
int AnalogPin = A4;
int ledPin = 13;
int cnt = 0;
int last = 10;
void setup()
{
Serial.begin(115200);
pinMode(DigitalPin, INPUT); // 設定數位Pin為輸入
pinMode(AnalogPin, INPUT); // 設定數位Pin為輸入
pinMode(ledPin, OUTPUT);
motorLeft.setSpeed(150);
//motorLeft.run(FORWARD);
}
void loop()
{
boolean D_val = digitalRead(DigitalPin); // 讀取數位Pin的值
int A_val = analogRead(AnalogPin);
if(D_val == HIGH) {
Serial.println(1);
}
else {
Serial.println(0);
}
//Serial.print("Analog Data: ");
if(abs(last - A_val) > 85){
cnt++;
}
last = A_val;
//Serial.print(A_val);
//Serial.print(" ");
//Serial.println(cnt);
delay(10);
}
Digital version(影片使用版本):
#include <AFMotor.h>
AF_DCMotor motorLeft(2);
AF_DCMotor motorRight(3);
int DigitalPin = A5;
int cnt = 0;
int last = 0;
boolean D_val;
unsigned long timer;
unsigned long dt;
float rpm;
void setup()
{
Serial.begin(115200);
pinMode(DigitalPin, INPUT);
motorLeft.setSpeed(150);
motorLeft.run(FORWARD);
D_val = digitalRead(DigitalPin);
}
void loop()
{
timer = millis();
while(cnt < 10){
D_val = digitalRead(DigitalPin);
/*if(D_val == HIGH) {
Serial.print(1);
}
else {
Serial.print(0);
}*/
if(abs(last - D_val) == 1){
cnt++;
}
last = D_val;
}
dt = millis() - timer;
rpm = (60000/float(dt));
Serial.println(rpm);
cnt = 0;
}
影片:
參考資料: