今日、デジタルメーターは、電気メーターであれタクシー料金メーターであれ、あらゆる分野でアナログメーターに取って代わりつつあります。その主な理由は、アナログメーターには、長期間使用すると摩耗する傾向のある機械部品があり、デジタルメーターほど正確ではないためです。
この良い例は、速度と移動距離を測定するために古いモーターバイクで使用されているアナログ速度計と走行距離計です。ピニオンとラックアンドピニオンと呼ばれる特別な部品があり、ホイールが回転するとケーブルを使用してスピードメーターのピンが回転します。長期間使用すると摩耗し、交換やメンテナンスが必要になります。
デジタルメーターでは、機械部品を使用する代わりに、光遮断器やホールセンサーなどの一部のセンサーを使用して速度と距離を計算します。これはアナログメーターよりも正確であり、長期間のメンテナンスを必要としません。以前は、さまざまなセンサーを使用して多くのデジタルスピードメータープロジェクトを構築しました。
- ArduinoとAndroidアプリの処理を使用したDIYスピードメーター
- PICマイクロコントローラーを使用したデジタル速度計と走行距離計回路
- LM393センサー(H206)を使用した移動ロボットの速度、距離、角度の測定
今日、このチュートリアルでは、Arduinoを使用してデジタルタクシー料金メーターのプロトタイプを作成します。このプロジェクトは、タクシーの車輪が移動する速度と距離を計算し、16x2LCDディスプレイに継続的に表示します。そして、移動距離に基づいて、プッシュボタンを押すと運賃額が生成されます。
下の画像は、デジタルタクシーメータープロジェクトの完全なセットアップを示しています
このプロトタイプには、速度センサーモジュールとモーターに取り付けられたエンコーダーホイールを備えたRCカーシャーシがあります。速度が測定されると、プッシュボタンを押すことで移動距離を測定し、運賃額の値を見つけることができます。ポテンショメータを使用してホイールの速度を設定できます。ArduinoでLM-393スピードセンサーモジュールを使用する方法の詳細については、リンクをたどってください。速度センサーモジュールの簡単な紹介を見てみましょう。
赤外線スロット光学LM-393速度センサーモジュール
エンコーダホイールの回転速度の測定に使用できるスロットタイプのモジュールです。この速度センサーモジュールは、光源センサーとも呼ばれるスロットタイプの光遮断器に基づいて動作します。このモジュールは3.3Vから5Vの電圧を必要とし、デジタル出力を生成します。そのため、どのマイクロコントローラーともインターフェースできます。
赤外線センサーは、光源(IR-LED)とフォトトランジスタセンサーで構成されています。両方とも、それらの間に小さなギャップを置いて配置されます。IR LEDとフォトトランジスタの隙間に物体を置くと、光線が遮られ、フォトトランジスタに電流が流れなくなります。
したがって、このセンサーでは、モーターに取り付けることができるスロット付きディスク(エンコーダーホイール)が使用され、ホイールがモーターと一緒に回転すると、IR LEDとフォトトランジスターの間の光線を遮断して出力をオン/オフにします(パルスの作成)。
したがって、ソースとセンサーの間に割り込みがある場合(オブジェクトが間にある場合)はHIGH出力を生成し、オブジェクトが配置されていない場合はLOW出力を生成します。モジュールには、発生した光割り込みを示すLEDがあります。
このモジュールには、出力で正確なHIGHおよびLOW信号を生成するために使用されるLM393コンパレータICが付属しています。したがって、このモジュールはLM393速度センサーと呼ばれることもあります。
運賃を計算するために移動した速度と距離を測定する
回転速度を測定するには、エンコーダホイールに存在するスロットの数を知る必要があります。20スロットのエンコーダーホイールがあります。それらが1回転するとき、出力には20パルスがあります。したがって、速度を計算するには、1秒あたりに生成されるパルスの数が必要です。
例えば
1秒間に40パルスある場合、
速度=いいえ。パルス数/スロット数= 40/20 = 2RPS(1秒あたりの回転数)
RPM(Revolutions per Minute)で速度を計算するには、60を掛けます。
RPM単位の速度= 2 X 60 = 120 RPM(1分あたりの回転数)
距離の測定
ホイールの移動距離の測定はとても簡単です。距離を計算する前に、ホイールの円周を知っておく必要があります。
ホイールの円周= π* 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);
次に、2つの外部割り込みを接続します。最初の割り込みは、Arduinoピン2を割り込みピンとし、ピン2でRISING(LOW TO HIGH)が検出されると、ISR(カウント)を呼び出します。このピン2は、速度センサーモジュールのD0出力に接続されます。
2つ目は、Arduinoのピン3を割り込みピンとし、ピン3でHIGHが検出されるとISR(generatefare)を呼び出します。このピンは、プルダウン抵抗で押しボタンに接続されています。
attachInterrupt(digitalPinToInterrupt(2)、count、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( "Dist(m):"); lcd.print(rotationinm); lcd.setCursor(0,1); lcd.print( "Speed(RPM):"); lcd.print(speed); カウンター= 0; int Analogip = analogRead(A0); int motorspeed = map(analogip、0,1023,0,255); AnalogWrite(5、motorspeed); Timer1.attachInterrupt(timerIsr); attachInterrupt(digitalPinToInterrupt(2)、count、RISING); }
この関数には、ISR内にLCD印刷ステートメントがあるため、実際に最初にTimer1とInterruptpin2を最初に切り離す行が含まれています。
RPMでSPEEDを計算するために、以下のコードを使用します。ここで、20.0はエンコーダーホイールにプリセットされているスロットの数です。
フロート速度=(カウンター/ 20.0)* 60.0;
そして、以下の距離を計算するためにコードが使用されます:
フロート回転= 230 *(回転/ 20);
ここでは、ホイールの円周は230cmと想定されています(これはリアルタイム車では通常のことです)
次に、距離を100で割って、距離をm単位で変換します。
rotationinm =回転/ 100;
その後、LCDディスプレイにSPEEDとDISTANCEを表示します
lcd.setCursor(0,0); lcd.print( "Dist(m):"); lcd.print(rotationinm); lcd.setCursor(0,1); lcd.print( "Speed(RPM):"); lcd.print(speed);
重要: 1秒あたりに検出されたプラスの数を取得する必要があるため、カウンターを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( "FARE Rs:"); フロートルピー= rotationinm * 5; lcd.print(ルピー); lcd.setCursor(0,1); lcd.print( "1メートルあたり5ルピー"); }
その後、移動距離に5を掛けます(私は5インドルピー/メートルのレートに5を使用しました)。ご希望に応じて変更できます。
フロートルピー= rotationinm * 5;
金額を計算した後、Arduinoに接続されたLCDディスプレイに表示します。
lcd.setCursor(0,0); lcd.print( "FARE Rs:"); lcd.print(ルピー); lcd.setCursor(0,1); lcd.print( "1メートルあたり5ルピー");
完全なコードとデモンストレーションビデオを以下に示します。
精度と堅牢性を高め、Androidアプリ、デジタル決済などの機能を追加してこのプロトタイプをさらに改善し、製品として開発することができます。