Arduino車車自製旋轉編碼

Posted on Sat, Mar 26, 2022 Arduino

起因:

自走車在繞圈的時候因為各種原因使我們無法精確掌控轉速,因此決定拿紅外線避障模組當旋轉編碼器,測量馬達轉速。

程式碼:

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;
}

影片:

參考資料:

Arduino筆記(86):紅外線反射尋跡/避障模組TCRT5000

買了這個模組有一段時間了,最近重新整理一下手邊的模組,利用這幾天實作一下這個模組的功能。 紅外線反射尋跡/避障模組 TCRT5000 利用紅外線反射的特性,有兩種可應用的功能,一是偵測是否有物體靠近,當模組被裝在小車時,可以偵測前方是否有障礙物;另一個功能是藉由反射面的顏色改變,來判斷小車是否偏離畫好的路線。以下是實作說明及結果。 TCRT5000尋跡感測器模組的紅外發射二極體不斷發射紅外線,當發射出的紅外線沒有被反射回來或被反射回來但強度不夠大時,光敏三極管一直處於關斷狀態,此時模組的輸出端為低電位,指示二極體一直處於熄滅狀態;被檢測物體出現在檢測範圍內時,紅外線被反射回來且強度足夠大,光敏三極管此時模組的輸出端為高電位,指示二極體燈被點亮。 產品規格: 採用TCRT5000紅外反射感測器 檢測反射距離:1mm~25mm適用 工作電壓3.3V-5V 輸出形式 :數位開關量輸出(0和1)及類比輸出兩種 使用寬電壓LM393比較器 #include // 引用 LiquidCrystal_I2C Library LiquidCrystal_I2C lcd(0x27,16,2); // 設定 LCD 位址為 0x27,有 16 個字元 2 列 int DigitalPin = 2; int AnalogPin = A0; int ledPin = 13; void setup() { Serial.begin(115200); pinMode(DigitalPin, INPUT); // 設定數位Pin為輸入 pinMode(AnalogPin, INPUT);

Arduino 序列繪圖家 (Arduino serial plotter)

A blog about arduino, raspberry pi, programming, 3D modeling, Scratch, TinkcerCAD, math, STEAM, and maker project.

PID控制理論---紅外線循跡車(五)---調整PID參數

作者J. Sluka http://www.inpharmix.com/jps/PID_Controller_For_Lego_Mindstorms_Robots.html 話說先前提過PID控制理論中的P和I了 PID控制理論---紅外線循跡...

You're Temporarily Blocked

It looks like you were misusing this feature by going too fast. You've been temporarily blocked from using it. If you think this doesn't go against our Community Standards let us know.