12เครื่องวัดความเร็วอะนาล็อกใช้ Arduino และเซ็นเซอร์ IR
เครื่องวัดความเร็วอะนาล็อกใช้ Arduino และเซ็นเซอร์ IR
ARDUINO
การวัดความเร็ว / รอบต่อนาทีของยานพาหนะหรือมอเตอร์เป็นโครงการที่น่าสนใจเสมอไป ในโครงการนี้เราจะสร้างเครื่องวัดความเร็วอะนาล็อกโดยใช้ Arduino เราจะใช้โมดูลเซนเซอร์อินฟราเรดเพื่อวัดความเร็ว มีเซนเซอร์แบบอื่น ๆ เช่นเซ็นเซอร์ Hall เพื่อวัดความเร็วแต่การใช้เซ็นเซอร์ IR เป็นเรื่องง่ายเนื่องจากโมดูลเซนเซอร์อินฟราเรดเป็นอุปกรณ์ที่พบได้ทั่วไปและเราสามารถนำมาใช้งานได้ง่ายจากตลาดและยังสามารถใช้งานได้กับทุกประเภท มอเตอร์ / ยานพาหนะ
ในโครงการนี้เราจะไปแสดงความเร็วทั้งในรูปแบบดิจิตอลและอนาล็อก โดยการทำโครงการนี้เราจะเพิ่มทักษะในการเรียนรู้Arduino และ Stepper motorเนื่องจากโครงการนี้เกี่ยวข้องกับการใช้ Interrupts และ Timers ณ ตอนท้ายของโครงการนี้คุณจะสามารถคำนวณความเร็วและระยะทางที่ครอบคลุมโดยวัตถุที่หมุนใด ๆ และแสดงบน หน้าจอLCD ขนาด 16x2ในรูปแบบดิจิตอลและในเครื่องวัดอนาล็อก ลองเริ่มต้นด้วยเครื่องวัดความเร็วและมาตรวัดระยะทางด้วย Arduino
ต้องใช้วัสดุ
- Arduino
- มอเตอร์ขั้วสองขั้ว (4 สาย)
- โปรแกรมควบคุมมอเตอร์ Stepper (โมดูล L298n)
- โมดูลเซ็นเซอร์อินฟราเรด
- จอ LCD 16 * 2
- ตัวต้านทาน 2.2k
- สายเชื่อมต่อ
- เขียงหั่นขนม
- แหล่งจ่ายไฟ
- พิมพ์ภาพจาก Speedometer
คำนวณความเร็วและแสดงผลบนเครื่องวัดความเร็วอะนาล็อก
เซนเซอร์IRเป็นอุปกรณ์ที่สามารถตรวจจับการปรากฏตัวของวัตถุที่อยู่ข้างหน้าได้ เราได้ใช้ใบพัดใบพัดสองใบ (พัดลม) และวางเซ็นเซอร์ IR ไว้ใกล้ ๆ เพื่อให้ทุกครั้งที่ใบพัดหมุนเซ็นเซอร์ IR ตรวจจับได้ จากนั้นเราจะใช้ตัวจับเวลาและตัวขัดจังหวะใน Arduino เพื่อคำนวณเวลาที่ใช้ในการหมุนหนึ่งรอบของมอเตอร์
ที่นี่ในโครงการนี้เราได้ใช้ลำดับความสำคัญสูงสุดในการขัดจังหวะเพื่อตรวจจับรอบต่อนาทีและเราได้กำหนดค่าไว้ในโหมดเพิ่มขึ้น ดังนั้นเมื่อใดก็ตามที่เซ็นเซอร์เอาต์พุตต่ำกว่า LOW to High ฟังก์ชันRPMCount ()จะถูกใช้งาน และเมื่อเราใช้ใบพัดใบพัดสองใบก็หมายความว่าฟังก์ชันนี้จะเรียกว่า 4 ครั้งในการปฏิวัติหนึ่งครั้ง
เราสามารถคำนวณ RPM ได้โดยใช้สูตรด้านล่างซึ่ง 1000 / time ที่เราจะให้ RPS (การปฏิวัติต่อวินาที) และคูณด้วย 60 จะทำให้ RPM (การปฏิวัติต่อนาที)
รอบต่อนาที = (60/2) * (1000 / ( มิลลิวินาที() - เวลา)) * REV / bladesInFan;
หลังจากได้ RPM ความเร็วสามารถคำนวณได้จากสูตรที่กำหนด:
ความเร็ว = รอบต่อนาที * (2 * pi * รัศมี) / 1000
เรารู้ว่า Pi = 3.14 และรัศมี 4.7 นิ้ว
แต่ก่อนอื่นเราต้องแปลงรัศมีเป็นเมตรจากนิ้ว:
รัศมี = ((รัศมี 2.54) / 100.0) เมตร ความเร็ว = รอบต่อนาที * 60.0 * (2.0 * 3.14 * รัศมี) / 1000.0) เป็นกิโลเมตรต่อชั่วโมง
ที่นี่เราได้คูณรอบต่อนาที 60 เพื่อแปลงรอบต่อนาทีเป็น rph (การปฏิวัติต่อชั่วโมง) และหารด้วย 1000 เพื่อแปลงเมตร / ชั่วโมงเป็น Kilometers / hour
หลังจากมีความเร็วใน kmh เราสามารถแสดงค่าเหล่านี้ได้โดยตรงผ่านหน้าจอ LCD ในรูปแบบดิจิตอล แต่เพื่อแสดงความเร็วในรูปแบบอะนาล็อกเราจำเป็นต้องคำนวณเพิ่มเติมเพื่อหาเลขที่ ของขั้นตอนมอเตอร์สตาร์ทควรเคลื่อนที่เพื่อแสดงความเร็วบนมิเตอร์อนาลอก
ที่นี่เราได้ใช้มอเตอร์แบบขั้วสองขั้วสำหรับมิเตอร์แอนะล็อกซึ่งมีความหมายถึง 1.8 องศาซึ่งหมายความว่า 200 ก้าวต่อการปฏิวัติ
ตอนนี้เราต้องแสดง 280 กิโลเมตรต่อชั่วโมงสำหรับวัดความเร็ว ดังนั้นเพื่อแสดง 280 KMh stepper motor ต้องย้าย 280 องศา
ดังนั้นเราจึงมี maxSpeed = 280
และ maxSteps จะเป็น
maxSteps = 280 / 1.8 = 155 ขั้นตอน
ตอนนี้เรามีฟังก์ชันในโค้ด Arduino ของเราคือฟังก์ชันแผนที่ที่ใช้ในการทำแผนที่ความเร็วเป็นขั้นตอน
ขั้นตอน = แผนที่ (ความเร็ว 0, maxSpeed , 0, maxSteps);
ดังนั้นตอนนี้เรามี
ขั้นตอน = แผนที่ (ความเร็ว 0,280,0,155);
หลังจากคำนวณขั้นตอนแล้วเราสามารถใช้ขั้นตอนเหล่านี้ในการทำงานของมอเตอร์พอยต์เพื่อย้ายมอเตอร์สตาร์ท นอกจากนี้เรายังต้องดูแลขั้นตอนปัจจุบันหรือมุมของมอเตอร์สตาร์ทโดยใช้การคำนวณที่กำหนด
currSteps = ขั้นตอน ขั้นตอน = currSteps-preSteps preSteps = currSteps
นี่currStepsเป็นขั้นตอนในปัจจุบันที่มาจากการคำนวณที่ผ่านมาและpreStepsจะดำเนินการขั้นตอนสุดท้าย
แผนผังและการเชื่อมต่อ
แผนภาพวงจรสำหรับเครื่องวัดความเร็วอะนาล็อกนี้เป็นเรื่องง่ายที่นี่เราได้ใช้LCD 16x2เพื่อแสดงความเร็วในรูปแบบดิจิทัลและมอเตอร์สตาร์ทเพื่อหมุนเข็มวัดความเร็วอะนาล็อก
16x2 LCD เชื่อมต่อที่ขาต่ออะนาล็อกของ Arduino
RS - A5
RW - GND
EN - A4
D4 - A3
D5 - A2
D6 - A1
D7 - A0
RW - GND
EN - A4
D4 - A3
D5 - A2
D6 - A1
D7 - A0
ใช้ตัวต้านทาน 2.2k เพื่อตั้งค่าความสว่างของ LCD โมดูลเซ็นเซอร์อินฟราเรดซึ่งใช้ในการตรวจจับใบพัดของพัดลมเพื่อคำนวณความเร็วรอบต่อนาทีจะเชื่อมต่อกับ interrupt 0 หมายถึงขา D2 ของ Arduino
ที่นี่เราได้ใช้คนขับรถมอเตอร์คือโมดูล L293N IN1, IN2, IN3 และขา IN4 ของไดรเวอร์มอเตอร์สตาร์ทเชื่อมต่อโดยตรงกับ D8, D9, D10 และ D11 ของ Arduino ส่วนที่เหลือของการเชื่อมต่อจะมีอยู่ในแผนผังวงจร
อธิบายการเขียนโปรแกรม
รหัสสมบูรณ์สำหรับ Arduino Speedomete r จะได้รับที่ท้ายที่นี่เราจะอธิบายส่วนสำคัญบางส่วนของมัน
ในส่วนการเขียนโปรแกรมเราได้รวมไลบรารีที่จำเป็นทั้งหมดไว้เช่นไลบรารีของ stepper motor ห้องสมุด LiquidCrystal LCD และประกาศหมุดสำหรับพวกเขา
#include<LiquidCrystal.h> LiquidCrystal lcd(A5,A4,A3,A2,A1,A0); #include <Stepper.h> const int stepsPerRevolution = 200; // change this to fit the number of steps per revolution Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);
After this, we have taken some variables and macros for performing the calculations. Calculations are already explained in the previous section.
volatile byte REV; unsigned long int rpm,RPM; unsigned long st=0; unsigned long time; int ledPin = 13; int led = 0,RPMlen , prevRPM; int flag = 0; int flag1=1; #define bladesInFan 2 float radius=4.7; // inch int preSteps=0; float stepAngle= 360.0/(float)stepsPerRevolution; float minSpeed=0; float maxSpeed=280.0; float minSteps=0; float maxSteps=maxSpeed/stepAngle;
After this, we initialize the LCD, Serial, interrupt and Stepper motor in the setup function
void setup() { myStepper.setSpeed(60); Serial.begin(9600); pinMode(ledPin, OUTPUT); lcd.begin(16,2); lcd.print("Speedometer"); delay(2000); attachInterrupt(0, RPMCount, RISING); }
After this, we read rpm in loop function and perform a calculation to get speed and convert that into steps to run stepper motor to show speed in analog form.
void loop() { readRPM(); radius=((radius * 2.54)/100.0); // convering in meter int Speed= ((float)RPM * 60.0 * (2.0 * 3.14 * radius)/1000.0); // RPM in 60 minute, diameter of tyre (2pi r) r is radius, 1000 to convert in km int Steps=map(Speed, minSpeed,maxSpeed,minSteps,maxSteps); if(flag1) { Serial.print(Speed); Serial.println("Kmh"); lcd.setCursor(0,0); lcd.print("RPM: "); lcd.print(RPM); lcd.print(" "); lcd.setCursor(0,1); lcd.print("Speed: "); lcd.print(Speed); lcd.print(" Km/h "); flag1=0; } int currSteps=Steps; int steps= currSteps-preSteps; preSteps=currSteps; myStepper.step(steps); }
Here we have reapRPM() function to calculate RPM.
int readRPM() { if(REV >= 10 or millis()>=st+1000) // IT WILL UPDATE AFETR EVERY 10 READINGS or 1 second in idle { if(flag==0) flag=1; rpm = (60/2)*(1000/(millis() - time))*REV/bladesInFan; time = millis(); REV = 0; int x= rpm; while(x!=0) { x = x/10; RPMlen++; } Serial.println(rpm,DEC); RPM=rpm; delay(500); st=millis(); flag1=1; } }
Finally, we have interrupt routine which is responsible to measure revolution of object
void RPMCount() { REV++; if (led == LOW) { led = HIGH; } else { led = LOW; } digitalWrite(ledPin, led); }
This is how you can simply build an Analog Speedometer using Arduino. This can be also built using Hall sensor and speed can be displayed on smart phone, follow this Arduino Speedometer tutorial for the same.
Code
#include<LiquidCrystal.h>
LiquidCrystal lcd(A5,A4,A3,A2,A1,A0);
#include <Stepper.h>
const int stepsPerRevolution = 200; // change this to fit the number of steps per revolution
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);
volatile byte REV;
unsigned long int rpm,RPM;
unsigned long st=0;
unsigned long time;
int ledPin = 13;
int led = 0,RPMlen , prevRPM;
int flag = 0;
LiquidCrystal lcd(A5,A4,A3,A2,A1,A0);
#include <Stepper.h>
const int stepsPerRevolution = 200; // change this to fit the number of steps per revolution
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);
volatile byte REV;
unsigned long int rpm,RPM;
unsigned long st=0;
unsigned long time;
int ledPin = 13;
int led = 0,RPMlen , prevRPM;
int flag = 0;
int flag1=1;
#define bladesInFan 2
float radius=4.7; // inch
int preSteps=0;
float stepAngle= 360.0/(float)stepsPerRevolution;
float minSpeed=0;
float maxSpeed=280.0;
float minSteps=0;
float maxSteps=maxSpeed/stepAngle;
#define bladesInFan 2
float radius=4.7; // inch
int preSteps=0;
float stepAngle= 360.0/(float)stepsPerRevolution;
float minSpeed=0;
float maxSpeed=280.0;
float minSteps=0;
float maxSteps=maxSpeed/stepAngle;
void setup()
{
myStepper.setSpeed(60);
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
lcd.begin(16,2);
lcd.print("Speedometer");
delay(2000);
attachInterrupt(0, RPMCount, RISING);
}
{
myStepper.setSpeed(60);
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
lcd.begin(16,2);
lcd.print("Speedometer");
delay(2000);
attachInterrupt(0, RPMCount, RISING);
}
void loop()
{
readRPM();
radius=((radius * 2.54)/100.0); // convering in meter
int Speed= ((float)RPM * 60.0 * (2.0 * 3.14 * radius)/1000.0);
// RPM in 60 minute, diameter of tyre (2pi r) r is radius, 1000 to convert in km
int Steps=map(Speed, minSpeed,maxSpeed,minSteps,maxSteps);
if(flag1)
{
Serial.print(Speed);
Serial.println("Kmh");
lcd.setCursor(0,0);
lcd.print("RPM: ");
lcd.print(RPM);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print("Speed: ");
lcd.print(Speed);
lcd.print(" Km/h ");
flag1=0;
}
int currSteps=Steps;
int steps= currSteps-preSteps;
preSteps=currSteps;
myStepper.step(steps);
}
{
readRPM();
radius=((radius * 2.54)/100.0); // convering in meter
int Speed= ((float)RPM * 60.0 * (2.0 * 3.14 * radius)/1000.0);
// RPM in 60 minute, diameter of tyre (2pi r) r is radius, 1000 to convert in km
int Steps=map(Speed, minSpeed,maxSpeed,minSteps,maxSteps);
if(flag1)
{
Serial.print(Speed);
Serial.println("Kmh");
lcd.setCursor(0,0);
lcd.print("RPM: ");
lcd.print(RPM);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print("Speed: ");
lcd.print(Speed);
lcd.print(" Km/h ");
flag1=0;
}
int currSteps=Steps;
int steps= currSteps-preSteps;
preSteps=currSteps;
myStepper.step(steps);
}
int readRPM()
{
if(REV >= 10 or millis()>=st+1000) // IT WILL UPDATE AFETR EVERY 10 READINGS or 1 second in idle
{
if(flag==0)
flag=1;
rpm = (60/2)*(1000/(millis() - time))*REV/bladesInFan;
time = millis();
REV = 0;
int x= rpm;
while(x!=0)
{
x = x/10;
RPMlen++;
}
Serial.println(rpm,DEC);
RPM=rpm;
delay(500);
st=millis();
flag1=1;
}
}
{
if(REV >= 10 or millis()>=st+1000) // IT WILL UPDATE AFETR EVERY 10 READINGS or 1 second in idle
{
if(flag==0)
flag=1;
rpm = (60/2)*(1000/(millis() - time))*REV/bladesInFan;
time = millis();
REV = 0;
int x= rpm;
while(x!=0)
{
x = x/10;
RPMlen++;
}
Serial.println(rpm,DEC);
RPM=rpm;
delay(500);
st=millis();
flag1=1;
}
}
void RPMCount()
{
REV++;
if (led == LOW)
{
led = HIGH;
}
else
{
led = LOW;
}
digitalWrite(ledPin, led);
}
{
REV++;
if (led == LOW)
{
led = HIGH;
}
else
{
led = LOW;
}
digitalWrite(ledPin, led);
}
เราใช้ สปีดเชนเซอร์ได้ไหมครับ
ตอบลบ