(บล็อกที่ 16) เครื่องวัดความเร็วอะนาล็อกใช้ 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; / / เปลี่ยนนี้เพื่อให้พอดีกับจำนวนของขั้นตอนต่อการปฏิวัติ Stepper myStepper (stepsPerRevolution, 8, 9, 10, 11);
หลังจากนี้เราได้นำตัวแปรบางตัวและมาโครมาใช้ในการคำนวณ การคำนวณได้อธิบายไว้ในส่วนก่อนหน้าแล้ว
ไบต์ระเหย REV; ความเร็ว int ยาวที่ไม่ได้ลงชื่อ, RPM; unsigned long st = 0; unsigned เวลานาน; int ledPin = 13; int นำ = 0, RPMlen, prevRPM; int flag = 0; int flag1 = 1; #define bladesInFan 2 float รัศมี = 4.7; // int int preSteps = 0; float stepAngle = 360.0 / (float) stepsPer การปฏิวัติ; float minSpeed = 0; float maxSpeed = 280.0; float minSteps = 0; float maxSteps = maxSpeed / stepAngle;
หลังจากนั้นเราจะเริ่มต้น LCD, Serial, Interrupt และ Stepper motor ในฟังก์ชันการตั้งค่า
การตั้งค่าเป็นโมฆะ () { myStepper.setSpeed (60); Serial.begin (9600); pinMode (ledPin, เอาท์พุท); lcd.begin (16,2); lcd.print ( "Speedometer"); ล่าช้า (2000); attachInterrupt (0, RPMCount, RISING); }
หลังจากนี้เราอ่านรอบต่อนาทีในฟังก์ชันลูปและทำการคำนวณเพื่อให้ได้ความเร็วและแปลงเป็นขั้นตอนเพื่อให้ทำงานมอเตอร์สตาร์ทเพื่อแสดงความเร็วในรูปแบบอะนาล็อก
void loop () { readRPM (); รัศมี = ((รัศมี 2.54) / 100.0); / / converging in meter int ความเร็ว = ((ลอย) RPM * 60.0 * (2.0 * 3.14 * รัศมี) / 1000000); // รอบต่อนาทีใน 60 นาทีเส้นผ่านศูนย์กลางของยาง (2pi r) r คือรัศมี, 1000 ที่จะแปลงเป็นกิโลเมตร int ขั้นตอน = แผนที่ (ความเร็ว minSpeed, maxSpeed, minSteps, maxSteps); ถ้า (flag1) { Serial.print (ความเร็ว); Serial.println ( "Kmh"); lcd.setCursor (0,0); lcd.print ("RPM:"); lcd.print (RPM); lcd.print (""); lcd.setCursor (0,1); lcd.print ("ความเร็ว:"); lcd.print (ความเร็ว); lcd.print ("Km / h"); Flag1 = 0; } int currSteps = ขั้นตอน; ขั้นตอน int = currSteps-preSteps; preSteps = currSteps; myStepper.step (ขั้นตอน); }
ที่นี่เรามีreapRPM ()เพื่อคำนวณ RPM
int readRPM () { if (REV> = 10 หรือ millis ()> = st + 1000) // IT จะปรับปรุง AFETR ทุกๆ 10 READINGS หรือ 1 วินาทีในสถานะว่าง { if (flag == 0) flag = 1; rpm = (60/2) * (1000 / (มิลลิวินาที () - เวลา)) * REV / bladesInFan; เวลา = millis (); REV = 0; int x = รอบต่อนาที; while (x! = 0) { x = x / 10; RPMlen ++; } Serial.println (rpm, DEC); RPM = รอบต่อนาที ล่าช้า (500); ST = มิลลิวินาที (); Flag1 = 1; } }
สุดท้ายเรามีกิจวัตรขัดจังหวะซึ่งเป็นผู้รับผิดชอบในการวัดการปฏิวัติของวัตถุ
void RPMCount () { REV ++; ถ้า (นำ == LOW) { นำ = สูง; } else { led = LOW; } digitalWrite (ledPin, นำ); }
นี่คือวิธีที่คุณสามารถสร้างเครื่องวัดความเร็วอะนาล็อกโดยใช้ Arduino นี้สามารถสร้างขึ้นโดยใช้เซ็นเซอร์ Hall และความเร็วสามารถแสดงผลบนโทรศัพท์สมาร์ทให้ทำตามนี้สอน Arduino Speedometerสำหรับเดียวกัน
รหัส
#include <LiquidCrystal.h>
LiquidCrystal lcd (A5, A4, A3, A2, A1, A0);
#include <Stepper.h>
const int stepsPerRevolution = 200; / / เปลี่ยนนี้เพื่อให้พอดีกับจำนวนของขั้นตอนต่อการปฏิวัติ
Stepper myStepper (stepsPerRevolution, 8, 9, 10, 11);
ไบต์ระเหย REV;
ความเร็ว int ยาวที่ไม่ได้ลงชื่อ, RPM;
unsigned long st = 0;
unsigned เวลานาน;
int ledPin = 13;
int นำ = 0, RPMlen, prevRPM;
int flag = 0;
LiquidCrystal lcd (A5, A4, A3, A2, A1, A0);
#include <Stepper.h>
const int stepsPerRevolution = 200; / / เปลี่ยนนี้เพื่อให้พอดีกับจำนวนของขั้นตอนต่อการปฏิวัติ
Stepper myStepper (stepsPerRevolution, 8, 9, 10, 11);
ไบต์ระเหย REV;
ความเร็ว int ยาวที่ไม่ได้ลงชื่อ, RPM;
unsigned long st = 0;
unsigned เวลานาน;
int ledPin = 13;
int นำ = 0, RPMlen, prevRPM;
int flag = 0;
int flag1 = 1;
#define bladesInFan 2
float รัศมี = 4.7; //
int int preSteps = 0;
float stepAngle = 360.0 / (float) stepsPer การปฏิวัติ;
float minSpeed = 0;
float maxSpeed = 280.0;
float minSteps = 0;
float maxSteps = maxSpeed / stepAngle;
#define bladesInFan 2
float รัศมี = 4.7; //
int int preSteps = 0;
float stepAngle = 360.0 / (float) stepsPer การปฏิวัติ;
float minSpeed = 0;
float maxSpeed = 280.0;
float minSteps = 0;
float maxSteps = maxSpeed / stepAngle;
การตั้งค่าเป็นโมฆะ ()
{
myStepper.setSpeed (60);
Serial.begin (9600);
pinMode (ledPin, เอาท์พุท);
lcd.begin (16,2);
lcd.print ( "Speedometer");
ล่าช้า (2000);
attachInterrupt (0, RPMCount, RISING);
}
{
myStepper.setSpeed (60);
Serial.begin (9600);
pinMode (ledPin, เอาท์พุท);
lcd.begin (16,2);
lcd.print ( "Speedometer");
ล่าช้า (2000);
attachInterrupt (0, RPMCount, RISING);
}
void loop ()
{
readRPM ();
รัศมี = ((รัศมี 2.54) / 100.0); / / converging in meter
int ความเร็ว = ((ลอย) RPM * 60.0 * (2.0 * 3.14 * รัศมี) / 1000000);
// รอบต่อนาทีใน 60 นาทีเส้นผ่านศูนย์กลางของยาง (2pi r) r คือรัศมี, 1000 ที่จะแปลงเป็นกิโลเมตร
int ขั้นตอน = แผนที่ (ความเร็ว minSpeed, maxSpeed, minSteps, maxSteps);
ถ้า (flag1)
{
Serial.print (ความเร็ว);
Serial.println ( "Kmh");
lcd.setCursor (0,0);
lcd.print ("RPM:");
lcd.print (RPM);
lcd.print ("");
lcd.setCursor (0,1);
lcd.print ("ความเร็ว:");
lcd.print (ความเร็ว);
lcd.print ("Km / h");
Flag1 = 0;
}
int currSteps = ขั้นตอน;
ขั้นตอน int = currSteps-preSteps;
preSteps = currSteps;
myStepper.step (ขั้นตอน);
}
{
readRPM ();
รัศมี = ((รัศมี 2.54) / 100.0); / / converging in meter
int ความเร็ว = ((ลอย) RPM * 60.0 * (2.0 * 3.14 * รัศมี) / 1000000);
// รอบต่อนาทีใน 60 นาทีเส้นผ่านศูนย์กลางของยาง (2pi r) r คือรัศมี, 1000 ที่จะแปลงเป็นกิโลเมตร
int ขั้นตอน = แผนที่ (ความเร็ว minSpeed, maxSpeed, minSteps, maxSteps);
ถ้า (flag1)
{
Serial.print (ความเร็ว);
Serial.println ( "Kmh");
lcd.setCursor (0,0);
lcd.print ("RPM:");
lcd.print (RPM);
lcd.print ("");
lcd.setCursor (0,1);
lcd.print ("ความเร็ว:");
lcd.print (ความเร็ว);
lcd.print ("Km / h");
Flag1 = 0;
}
int currSteps = ขั้นตอน;
ขั้นตอน int = currSteps-preSteps;
preSteps = currSteps;
myStepper.step (ขั้นตอน);
}
int readRPM ()
{
if (REV> = 10 หรือ millis ()> = st + 1000) // IT จะปรับปรุง AFETR ทุกๆ 10 READINGS หรือ 1 วินาทีในสถานะว่าง
{
if (flag == 0)
flag = 1;
rpm = (60/2) * (1000 / (มิลลิวินาที () - เวลา)) * REV / bladesInFan;
เวลา = millis ();
REV = 0;
int x = รอบต่อนาที;
while (x! = 0)
{
x = x / 10;
RPMlen ++;
}
Serial.println (rpm, DEC);
RPM = รอบต่อนาที
ล่าช้า (500);
ST = มิลลิวินาที ();
Flag1 = 1;
}
}
{
if (REV> = 10 หรือ millis ()> = st + 1000) // IT จะปรับปรุง AFETR ทุกๆ 10 READINGS หรือ 1 วินาทีในสถานะว่าง
{
if (flag == 0)
flag = 1;
rpm = (60/2) * (1000 / (มิลลิวินาที () - เวลา)) * REV / bladesInFan;
เวลา = millis ();
REV = 0;
int x = รอบต่อนาที;
while (x! = 0)
{
x = x / 10;
RPMlen ++;
}
Serial.println (rpm, DEC);
RPM = รอบต่อนาที
ล่าช้า (500);
ST = มิลลิวินาที ();
Flag1 = 1;
}
}
void RPMCount ()
{
REV ++;
ถ้า (นำ == LOW)
{
นำ = สูง;
}
else
{
led = LOW;
}
digitalWrite (ledPin, นำ);
}
{
REV ++;
ถ้า (นำ == LOW)
{
นำ = สูง;
}
else
{
led = LOW;
}
digitalWrite (ledPin, นำ);
}
ความคิดเห็น
แสดงความคิดเห็น