차량이나 모터의 속도 / rpm을 측정하는 것은 항상 시도해 볼만한 흥미로운 프로젝트였습니다. 이 프로젝트에서는 Arduino를 사용하여 아날로그 속도계 를 구축 할 것 입니다. IR 센서 모듈을 사용하여 속도를 측정합니다. 속도를 측정하는 홀 센서와 같은 다른 방법 / 센서가 있지만 IR 센서 모듈은 매우 일반적인 장치이므로 시장에서 쉽게 구할 수 있으며 모든 유형의 모터 / 차량.
이 프로젝트에서 우리는 아날로그와 디지털 형식으로 속도 를 보여줄 것 입니다. 이 프로젝트를 수행함으로써 우리는 Arduino 및 Stepper 모터 학습 기술을 향상시킬 것입니다. 이 프로젝트에는 인터럽트 및 타이머 사용이 포함되기 때문입니다. 이 프로젝트가 끝나면 회전하는 물체가 다루는 속도와 거리를 계산하여 16x2 LCD 화면에 디지털 형식과 아날로그 미터에 표시 할 수 있습니다. 이제 Arduino를 사용하는이 속도계와 주행 거리계 회로 부터 시작하겠습니다.
필요한 재료
- Arduino
- 바이폴라 스테퍼 모터 (4 선)
- 스테퍼 모터 드라이버 (L298n 모듈)
- IR 센서 모듈
- 16 * 2 LCD 디스플레이
- 2.2k 저항
- 전선 연결
- 브레드 보드.
- 전원 공급
- 속도계 사진 인쇄물
속도 계산 및 아날로그 속도계에 표시
IR 센서 는 앞에있는 물체의 존재를 감지 할 수있는 장치입니다. 두 개의 블레이드 로터 (팬)를 사용하고 블레이드가 회전 할 때마다 IR 센서가 감지하는 방식으로 IR 센서를 그 근처에 배치했습니다. 그런 다음 Arduino의 타이머 및 인터럽트를 사용하여 모터가 한 번 완전히 회전하는 데 걸리는 시간을 계산합니다.
이 프로젝트에서는 rpm을 감지하기 위해 우선 순위가 가장 높은 인터럽트를 사용했으며 상승 모드로 구성했습니다. 따라서 센서 출력이 LOW가 될 때마다 RPMCount () 함수 가 실행됩니다. 그리고 두 개의 블레이드 로터를 사용했기 때문에 1 회전에 4 번 기능이 호출된다는 뜻입니다.
소요 된 시간을 알고 나면 아래 공식을 사용하여 RPM을 계산할 수 있습니다. 여기서 1000 / time은 RPS (초당 회전 수)를 제공하고 60을 더 곱하면 RPM (분당 회전 수)을 얻을 수 있습니다.
rpm = (60/2) * (1000 / (millis ()-시간)) * REV / bladesInFan;
RPM을 얻은 후 다음 공식으로 속도를 계산할 수 있습니다.
속도 = rpm * (2 * Pi * 반경) / 1000
Pi = 3.14이고 반경이 4.7 인치라는 것을 알고 있습니다.
그러나 먼저 반지름을 인치에서 미터로 변환해야합니다.
반경 = ((반경 * 2.54) /100.0) 미터 속도 = rpm * 60.0 * (2.0 * 3.14 * 반경) / 1000.0) 시간당 킬로미터
여기에서는 rpm에 60을 곱하여 rpm을 rph (시간당 회전 수)로 변환하고 1000으로 나누어 미터 / 시간을 킬로미터 / 시간으로 변환했습니다.
kmh 단위의 속도를 얻은 후에는 이러한 값을 LCD에 디지털 형식으로 직접 표시 할 수 있지만 아날로그 형식으로 속도를 표시 하려면 한 번 더 계산하여 아니오를 알아 내야합니다. 스텝 수, 스테퍼 모터가 움직여 아날로그 미터에 속도를 표시해야합니다.
여기에서는 아날로그 미터 용 4 선 바이폴라 스테퍼 모터를 사용했는데 1.8 도는 회 전당 200 스텝을 의미합니다.
이제 속도계에 280km를 표시해야합니다. 따라서 280 Kmh 스테퍼 모터가 280도 움직여야 함을 보여주기 위해
따라서 maxSpeed = 280입니다.
그리고 maxSteps는
maxSteps = 280 / 1.8 = 155 단계
이제 Arduino 코드에 속도를 단계로 매핑하는 데 사용되는 map 함수 가 있습니다.
단계 = map (speed, 0, maxSpeed , 0, maxSteps);
이제 우리는
steps = map (속도, 0,280,0,155);
단계를 계산 한 후 스테퍼 모터 기능에 이러한 단계를 직접 적용하여 스테퍼 모터를 이동할 수 있습니다. 또한 주어진 계산을 사용하여 스테퍼 모터의 현재 단계 또는 각도를 관리해야합니다.
currSteps 단계 = 단계 = currSteps-preSteps preSteps = currSteps
여기서 currSteps 는 마지막 계산에서 오는 현재 단계이고 preSteps 는 마지막으로 수행 된 단계입니다.
회로도 및 연결
이 아날로그 속도계의 회로도는 간단합니다. 여기에서는 16x2 LCD를 사용하여 디지털 형식으로 속도를 표시하고 스테퍼 모터를 사용하여 아날로그 속도계 바늘을 회전했습니다.
16x2 LCD는 Arduino의 다음 아날로그 핀에 연결됩니다.
RS-A5
RW-GND
EN-A4
D4-A3
D5-A2
D6-A1
D7-A0
2.2k 저항은 LCD의 밝기를 설정하는 데 사용됩니다. 팬의 블레이드를 감지하여 rpm을 계산하는 데 사용되는 IR 센서 모듈이 인터럽트 0에 연결되어 Arduino의 D2 핀을 의미합니다.
여기서 우리는 L293N 모듈 이라는 스테퍼 모터 드라이버를 사용했습니다. 스테퍼 모터 드라이버의 IN1, IN2, IN3 및 IN4 핀은 Arduino의 D8, D9, D10, D11에 직접 연결됩니다. 나머지 연결은 회로도에 나와 있습니다.
프로그래밍 설명
Arduino Speedomete r에 대한 완전한 코드 가 마지막에 제공되며 여기서 중요한 부분을 몇 가지 설명하겠습니다.
프로그래밍 부분에는 스테퍼 모터 라이브러리, LiquidCrystal LCD 라이브러리 및 선언 된 핀과 같은 모든 필수 라이브러리가 포함되어 있습니다.
#포함
그 후 계산을 수행하기 위해 몇 가지 변수와 매크로를 사용했습니다. 계산은 이전 섹션에서 이미 설명했습니다.
휘발성 바이트 REV; unsigned long int rpm, RPM; 부호없는 long st = 0; 서명되지 않은 오랜 시간; int ledPin = 13; int led = 0, RPMlen, prevRPM; int 플래그 = 0; int flag1 = 1; #define bladesInFan 2 부동 반경 = 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;
그 후 설정 기능 에서 LCD, Serial, Interrupt 및 Stepper 모터를 초기화 합니다.
void setup () { myStepper.setSpeed (60); Serial.begin (9600); pinMode (ledPin, OUTPUT); lcd.begin (16,2); lcd.print ("속도계"); 지연 (2000); attachInterrupt (0, RPMCount, RISING); }
그런 다음 루프 함수 에서 rpm을 읽고 속도를 구하는 계산을 수행하고이를 스텝으로 변환하여 속도를 아날로그 형식으로 표시합니다.
void loop () { readRPM (); 반지름 = ((반지름 * 2.54) /100.0); // 미터 단위로 수렴 int Speed = ((float) RPM * 60.0 * (2.0 * 3.14 * radius) /1000.0); // 60 분 RPM, 타이어 직경 (2pi r) r은 반경, 1000은 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 ("속도:"); lcd.print (속도); lcd.print ("Km / h"); flag1 = 0; } int currSteps = 단계;int steps = currSteps-preSteps; preSteps = currSteps; myStepper.step (단계); }
여기에 RPM을 계산하는 reapRPM () 함수가 있습니다.
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 ()-시간)) * REV / bladesInFan; 시간 = millis (); REV = 0; int x = rpm; while (x! = 0) { x = x / 10; RPMlen ++; } Serial.println (rpm, DEC); RPM = rpm; 지연 (500); st = millis (); flag1 = 1; } }
마지막으로 물체의 회전을 측정하는 인터럽트 루틴이 있습니다.
void RPMCount () { REV ++; if (led == LOW) { led = HIGH; } else { led = LOW; } digitalWrite (ledPin, led); }
이것이 Arduino를 사용하여 아날로그 속도계를 간단하게 구축하는 방법 입니다. 이것은 홀 센서를 사용하여 구축 할 수도 있고 스마트 폰에 속도를 표시 할 수 있습니다.이 Arduino 속도계 튜토리얼을 따르십시오.