오늘날 디지털 계량기 는 전기 계량기이든 택시 요금 계량기이든 모든 부문에서 아날로그 계량기를 대체하고 있습니다. 그 주된 이유는 아날로그 계량기에는 오랜 시간 사용할 때 마모되는 경향이 있고 디지털 계량기만큼 정확하지 않은 기계 부품이 있기 때문입니다.
이에 대한 좋은 예는 속도와 이동 거리를 측정하기 위해 오래된 모터 자전거에 사용되는 아날로그 속도계와 주행 거리계입니다. 바퀴가 회전 할 때 속도계의 핀을 회전시키기 위해 케이블을 사용하는 피니언 및 랙 배열 이라는 특수 부품 이 있습니다. 장기간 사용하면 마모되며 교체 및 유지 보수가 필요합니다.
디지털 미터에서는 기계 부품을 사용하는 대신 광학 인터럽터 또는 홀 센서와 같은 일부 센서를 사용하여 속도와 거리를 계산합니다. 이것은 아날로그 미터보다 더 정확하며 장기간 유지 보수가 필요하지 않습니다. 이전에는 다양한 센서를 사용하여 많은 디지털 속도계 프로젝트를 구축했습니다.
- Arduino 및 Processing Android App을 사용하는 DIY 속도계
- PIC 마이크로 컨트롤러를 사용하는 디지털 속도계 및 주행 거리계 회로
- LM393 센서 (H206)를 사용한 모바일 로봇의 속도, 거리 및 각도 측정
오늘이 튜토리얼에서는 Arduino를 사용하여 디지털 택시 요금 계 의 프로토 타입을 만들 것 입니다. 이 프로젝트는 택시의 바퀴가 이동 한 속도와 거리를 계산하여 16x2 LCD 디스플레이에 지속적으로 표시합니다. 그리고 이동 거리에 따라 푸쉬 버튼을 누르면 운임이 생성됩니다.
아래 이미지는 디지털 택시 미터 프로젝트 의 전체 설정을 보여줍니다.
이 프로토 타입에는 속도 센서 모듈 과 모터에 부착 된 인코더 휠 이있는 RC 자동차 섀시가 있습니다. 속도가 측정되면 이동 거리를 측정하고 푸시 버튼을 눌러 요금 금액을 찾을 수 있습니다. 전위차계를 사용하여 바퀴의 속도를 설정할 수 있습니다. Arduino와 함께 LM-393 속도 센서 모듈을 사용하는 방법에 대해 자세히 알아 보려면 링크를 따르십시오. 속도 센서 모듈에 대한 간략한 소개를 살펴 보겠습니다.
적외선 슬롯 형 광학 LM-393 속도 센서 모듈
엔코더 휠의 회전 속도를 측정하는 데 사용할 수있는 슬롯 형 모듈입니다. 이 속도 센서 모듈은 광 소스 센서라고도하는 슬롯 형 광 인터럽터를 기반으로 작동합니다. 이 모듈은 3.3V ~ 5V의 전압을 필요로하며 디지털 출력을 생성합니다. 따라서 모든 마이크로 컨트롤러와 인터페이스 할 수 있습니다.
적외선 센서는 광원 (IR-LED)과 포토 트랜지스터 센서로 구성됩니다. 둘 다 그들 사이에 작은 간격을두고 배치됩니다. 물체가 IR LED와 포토 트랜지스터 사이에 위치하면 광선을 차단하여 포토 트랜지스터가 전류 통과를 중단합니다.
따라서이 센서를 사용하면 모터에 부착 할 수있는 슬롯 디스크 (인코더 휠)가 사용되며 휠이 모터와 함께 회전하면 IR LED와 광 트랜지스터 사이의 광선을 차단하여 출력을 켜고 끕니다 (펄스 생성).
따라서 소스와 센서 사이에 인터럽트가 발생 하면 HIGH 출력을 생성 하고 (사이에 물체가있을 때) 물체가 없을 때 LOW 출력을 생성 합니다. 모듈에는 발생한 광학 인터럽트를 나타내는 LED가 있습니다.
이 모듈은 OUTPUT에서 정확한 HIGH 및 LOW 신호를 생성하는 데 사용되는 LM393 비교기 IC 와 함께 제공됩니다. 따라서이 모듈은 LM393 속도 센서 라고도 합니다.
운임 계산을 위해 이동 한 속도 및 거리 측정
회전 속도를 측정하려면 인코더 휠에있는 슬롯의 수를 알아야합니다. 20 개의 슬롯이있는 인코더 휠이 있습니다. 하나의 완전한 회전으로 회전하면 출력에 20 개의 펄스가 있습니다. 따라서 속도를 계산하려면 초당 생성되는 펄스 수가 필요합니다.
예를 들면
1 초에 40 개의 펄스가 있으면
속도 = Noo. 펄스 수 / 슬롯 수 = 40/20 = 2RPS (초당 회전 수)
RPM (분당 회전 수)으로 속도를 계산하려면 60을 곱하십시오.
RPM 단위 속도 = 2 X 60 = 120 RPM (분당 회전 수)
거리 측정
휠로 이동 한 거리를 측정하는 것은 매우 간단합니다. 거리를 계산하기 전에 바퀴의 둘레를 알아야합니다.
바퀴 둘레 = π * d
여기서 d는 바퀴의 직경입니다.
π의 값은 3.14입니다.
나는 직경 6.60cm의 바퀴 (RC 자동차 바퀴)가 있으므로 둘레가 (20.7cm)입니다.
따라서 이동 거리를 계산하려면 감지 된 펄스 수에 둘레를 곱하면됩니다.
이동 거리 = 바퀴 둘레 x (펄스 수 / 슬롯 수)
따라서 원주 20.7cm의 휠이 엔코더 휠의 1 회전 인 20 펄스를 사용하면 휠이 이동 한 거리는 다음과 같이 계산됩니다.
이동 거리 = 20.7 x (20/20) = 20.7cm
미터 단위의 거리를 계산하려면 거리를 cm 값으로 100으로 나눕니다.
참고: 이것은 작은 RC 자동차 바퀴입니다. 실시간 자동차에는 이보다 큰 바퀴가 있습니다. 그래서 저는이 튜토리얼에서 바퀴의 둘레가 230cm라고 가정하고 있습니다.
이동 거리를 기준으로 요금 계산
총 운임 액을 구하려면 여행 거리에 운임 요금 (금액 / 미터)을 곱하십시오.
Timer1.initialize (1000000); Timer1.attachInterrupt (timerIsr);
다음으로 두 개의 외부 인터럽트를 연결합니다. 첫 번째 인터럽트는 Arduino 핀 2를 인터럽트 핀으로 만들고 핀 2에서 RISING (LOW TO HIGH)이 감지되면 ISR (count)을 호출합니다.이 핀 2는 속도 센서 모듈의 D0 출력에 연결됩니다.
두 번째는 Arduino 핀 3을 인터럽트 핀으로 만들고 pin3에서 HIGH가 감지되면 ISR (generatefare)을 호출합니다. 이 핀은 풀다운 저항으로 푸시 버튼에 연결됩니다.
attachInterrupt (digitalPinToInterrupt (2), 개수, RISING); attachInterrupt (digitalPinToInterrupt (3), generatefare , HIGH);
5. 다음으로 여기서 사용한 ISR에 대해 살펴 보겠습니다.
ISR1- count () ISR은 핀 2 (속도 센서에 연결된)에서 RISING (LOW TO HIGH)이 발생했을 때 호출됩니다.
void count () // 속도 센서의 카운트에 대한 ISR { counter ++; // 카운터 값을 1 회전 증가 ++; // 회전 값을 1 씩 증가 delay (10); }
ISR2- timerIsr () ISR은 1 초마다 호출되며 ISR 내부에있는 라인을 실행합니다.
void timerIsr () { detachInterrupt (digitalPinToInterrupt (2)); Timer1.detachInterrupt (); lcd.clear (); 부동 속도 = (카운터 / 20.0) * 60.0; 부동 회전 = 230 * (회전 / 20); rotationinm = 회전 / 100; lcd.setCursor (0,0); lcd.print ("거리 (m):"); lcd.print (rotationinm); lcd.setCursor (0,1); lcd.print ("속도 (RPM):"); lcd.print (속도); 카운터 = 0; int analogip = analogRead (A0); int motorspeed = map (analogip, 0,1023,0,255); analogWrite (5, motorspeed); Timer1.attachInterrupt (timerIsr); attachInterrupt (digitalPinToInterrupt (2), 개수, RISING); }
이 함수에는 ISR 내부에 LCD 인쇄 명령문이 있기 때문에 실제로 Timer1 및 Interrupt pin2를 먼저 분리하는 행이 포함되어 있습니다.
RPM에서 SPEED 를 계산 하기 위해 아래 코드를 사용합니다. 여기서 20.0은 인코더 휠에 미리 설정된 슬롯 수입니다.
부동 속도 = (카운터 / 20.0) * 60.0;
그리고 코드 아래의 거리를 계산하기 위해 사용됩니다.
부동 회전 = 230 * (회전 / 20);
여기서 바퀴 둘레는 230cm로 가정합니다 (실시간 차량의 경우 정상 임).
다음으로 거리를 100으로 나누어 거리를 m 단위로 변환하십시오.
rotationinm = 회전 / 100;
그 후 LCD 디스플레이에 SPEED와 DISTANCE를 표시합니다.
lcd.setCursor (0,0); lcd.print ("거리 (m):"); lcd.print (rotationinm); lcd.setCursor (0,1); lcd.print ("속도 (RPM):"); lcd.print (속도);
중요: 초당 감지 된 플러스 수를 가져와야하므로 카운터를 0으로 재설정해야하므로이 라인을 사용합니다.
카운터 = 0;
다음으로 아날로그 핀 A0을 읽고이를 디지털 값 (0 ~ 1023)으로 변환 하고이 값을 PWM 출력 (모터의 설정 속도)에 대해 0 ~ 255에 추가로 매핑하고 마지막으로 ULN2003에 연결된 analogWrite 기능을 사용하여 해당 PWM 값을 씁니다. 모터 IC.
int analogip = analogRead (A0); int motorspeed = map (analogip, 0,1023,0,255); analogWrite (5, motorspeed);
ISR3: generatefare () ISR은 이동 거리에 따라 요금을 생성하는 데 사용됩니다. 이 ISR은 인터럽트 핀 3이 HIGH로 감지 될 때 호출됩니다 (푸시 버튼을 누를 때). 이 기능은 핀 2의 인터럽트와 타이머 인터럽트를 분리 한 다음 LCD를 지 웁니다.
void generatefare () { detachInterrupt (digitalPinToInterrupt (2)); 2 Timer1.detachInterrupt (); lcd.clear (); lcd.setCursor (0,0); lcd.print ("요금 Rs:"); 플로트 루피 = rotationinm * 5; lcd.print (rupees); lcd.setCursor (0,1); lcd.print ("미터당 Rs 5"); }
그 후 이동 거리에 5를 곱합니다 (INR 5 / 미터 비율로 5를 사용했습니다). 원하는대로 변경할 수 있습니다.
플로트 루피 = rotationinm * 5;
금액을 계산 한 후 아두 이노에 연결된 LCD 디스플레이에 표시합니다.
lcd.setCursor (0,0); lcd.print ("요금 Rs:"); lcd.print (rupees); lcd.setCursor (0,1); lcd.print ("미터당 Rs 5");
전체 코드 및 데모 비디오 가 아래에 제공됩니다.
정확도, 견고성을 높이고 Android 앱, 디지털 결제 등과 같은 더 많은 기능을 추가하여이 프로토 타입을 더욱 개선하고 제품으로 개발할 수 있습니다.