ข้ามไปที่เนื้อหาหลัก

(บล็อกที่ 16) เครื่องวัดความเร็วอะนาล็อกใช้ Arduino และเซ็นเซอร์ IR



เครื่องวัดความเร็วอะนาล็อกใช้ Arduino และเซ็นเซอร์ IR

ARDUINO
โดยซัดดัม 0
เครื่องวัดความเร็วอะนาล็อก Analog Arduino ใช้เซนเซอร์ IRเครื่องวัดความเร็วอะนาล็อก Analog Arduino ใช้เซนเซอร์ IR

การวัดความเร็ว / รอบต่อนาทีของยานพาหนะหรือมอเตอร์เป็นโครงการที่น่าสนใจเสมอไป ในโครงการนี้เราจะสร้างเครื่องวัดความเร็วอะนาล็อกโดยใช้ Arduino เราจะใช้โมดูลเซนเซอร์อินฟราเรดเพื่อวัดความเร็ว มีเซนเซอร์แบบอื่น ๆ เช่นเซ็นเซอร์ Hall เพื่อวัดความเร็วแต่การใช้เซ็นเซอร์ IR เป็นเรื่องง่ายเนื่องจากโมดูลเซนเซอร์อินฟราเรดเป็นอุปกรณ์ที่พบได้ทั่วไปและเราสามารถนำมาใช้งานได้ง่ายจากตลาดและยังสามารถใช้งานได้กับทุกประเภท มอเตอร์ / ยานพาหนะ
ในโครงการนี้เราจะไปแสดงความเร็วทั้งในรูปแบบดิจิตอลและอนาล็อก โดยการทำโครงการนี้เราจะเพิ่มทักษะในการเรียนรู้Arduino และ Stepper motorเนื่องจากโครงการนี้เกี่ยวข้องกับการใช้ Interrupts และ Timers ณ ตอนท้ายของโครงการนี้คุณจะสามารถคำนวณความเร็วและระยะทางที่ครอบคลุมโดยวัตถุที่หมุนใด ๆ และแสดงบน  หน้าจอLCD ขนาด 16x2ในรูปแบบดิจิตอลและในเครื่องวัดอนาล็อก ลองเริ่มต้นด้วยเครื่องวัดความเร็วและมาตรวัดระยะทางด้วย Arduino

ต้องใช้วัสดุ

  1. Arduino
  2. มอเตอร์ขั้วสองขั้ว (4 สาย)
  3. โปรแกรมควบคุมมอเตอร์ Stepper (โมดูล L298n)
  4. โมดูลเซ็นเซอร์อินฟราเรด
  5. จอ LCD 16 * 2
  6. ตัวต้านทาน 2.2k
  7. สายเชื่อมต่อ
  8. เขียงหั่นขนม
  9. แหล่งจ่ายไฟ
  10. พิมพ์ภาพจาก Speedometer

เครื่องวัดความเร็วอะนาล็อกที่ประกอบขึ้นด้วย Arduino และเซ็นเซอร์ IR

 

คำนวณความเร็วและแสดงผลบนเครื่องวัดความเร็วอะนาล็อก

เซนเซอร์IRเป็นอุปกรณ์ที่สามารถตรวจจับการปรากฏตัวของวัตถุที่อยู่ข้างหน้าได้ เราได้ใช้ใบพัดใบพัดสองใบ (พัดลม) และวางเซ็นเซอร์ IR ไว้ใกล้ ๆ เพื่อให้ทุกครั้งที่ใบพัดหมุนเซ็นเซอร์ IR ตรวจจับได้ จากนั้นเราจะใช้ตัวจับเวลาและตัวขัดจังหวะใน Arduino เพื่อคำนวณเวลาที่ใช้ในการหมุนหนึ่งรอบของมอเตอร์
เซ็นเซอร์ IRเซ็นเซอร์ IR

ที่นี่ในโครงการนี้เราได้ใช้ลำดับความสำคัญสูงสุดในการขัดจังหวะเพื่อตรวจจับรอบต่อนาทีและเราได้กำหนดค่าไว้ในโหมดเพิ่มขึ้น ดังนั้นเมื่อใดก็ตามที่เซ็นเซอร์เอาต์พุตต่ำกว่า 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 ก้าวต่อการปฏิวัติ
มอเตอร์ลวด 4 ขั้วแบบขั้วบวก

ตอนนี้เราต้องแสดง 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
 แผนภาพสำหรับ Analog Speedometer ใช้ Arduino และ IR Sensor

ใช้ตัวต้านทาน 2.2k เพื่อตั้งค่าความสว่างของ LCD โมดูลเซ็นเซอร์อินฟราเรดซึ่งใช้ในการตรวจจับใบพัดของพัดลมเพื่อคำนวณความเร็วรอบต่อนาทีจะเชื่อมต่อกับ interrupt 0 หมายถึงขา D2 ของ Arduino
ที่นี่เราได้ใช้คนขับรถมอเตอร์คือโมดูล L293N IN1, IN2, IN3 และขา IN4 ของไดรเวอร์มอเตอร์สตาร์ทเชื่อมต่อโดยตรงกับ D8, D9, D10 และ D11 ของ Arduino ส่วนที่เหลือของการเชื่อมต่อจะมีอยู่ในแผนผังวงจร
ฮาร์ดแวร์วงจรสำหรับเครื่องวัดความเร็วอะนาล็อกใช้ Arduino และเซ็นเซอร์ IR

อธิบายการเขียนโปรแกรม

รหัสสมบูรณ์สำหรับ 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;     
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;
การตั้งค่าเป็นโมฆะ ()  

  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 (ขั้นตอน); 
}
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, นำ); 
 }

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

การเขียนผังงาน (Flowchart)

โครงงานเรื่อง ล้อวัดระยะทางด้วย Encoder (งานที่ 17)

โครงงานเครื่องวัดส่วนสูงแบบดิจิตอล ( งานที่ 4)