スロットカーレーザートリガーラップタイムGLCDディスプレイ
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 1 |
アプリとオンラインサービス
> |
|
このプロジェクトについて
イントロ
KY008レーザーモジュールとそれに対応するセンサーのペアを購入しましたが、それを使ってクールなプロジェクトを作成する必要があることはわかっていました。そこでペアを取り、自動運転スロットカープロジェクトのテーブルにすでにあるスロットカートラック用の電気計時ゲートを作成しました。
ハードウェア
3つの主要コンポーネントは、レーザーモジュール、レーザーレシーバーセンサー、GLCDスクリーンです。
私はGLCDを使うのが大好きです。ピン配置に関する情報は、https://playground.arduino.cc/Code/GLCDks0108/
にあります。そして、ここからライブラリをダウンロードできます:
https://bitbucket.org/bperrybap/openglcd
下の画像に示すように、私はそれのための素晴らしくて簡単なコネクタを作成しました。
<図>KY008レーザーモジュールには、-、+、Sの3つのピンがあります。Sと+の両方を5Vに短縮します。レーザーを常にオンにしたくない場合は、SピンをArduinoのデジタルピンに接続します。高く設定すると、レーザーがオンになります。
センサーには、GND、VCC、SIGNALEの3つのピンもあります。 Arduinoの電源と入力ピンに接続します。
このビルドで最も困難な課題は、すべてを調整することでした。
<図>このクリップで最終結果を見ることができます。
コード
- 無題のファイル
無題のファイル Arduino
/ **タイムキーピングデジタルゲート*コード:Tal Ofer * [email protected] * /#include "openGLCD.h" // laps infounsigned long currentRunStartMillis; unsigned long lastRunInMillis; unsigned long bestRunInMillis; int currentLap; unsigned long savedMillis; gText t1; //ランタイムを後で定義しますgTextt2; //ランタイムを後で定義しますgTextt3; //後でランタイムを定義します// displayint sec_val、milli_valのグローバル; //レーザーゲートconstint gateSensorPin =2; //ゲートセンサーの番号pinintgateSensorState; // sensorintからの現在の読み取りlastgateSensorState =LOW; // Sensorunsigned longlastDebounceTimeからの前回の読み取り=0; //センサーピンが最後に切り替えられた時刻dintdebounceDelay =50; //デバウンス時間;出力がちらつく場合は増加しますsetup(){//ピンモードpinMode(gateSensorPin、INPUT); delay(50); //センサーとレーザーの動作を遅らせるため、ラップがトリガーされません。 // GLCDを開始しますGLCD.Init(NON_INVERTED); //領域を定義しますt1.DefineArea(textAreaTOP、lcdnums14x24); t2.DefineArea(0、GLCD.CenterY、8、2、fixednums7x15); t3.DefineArea(GLCD.CenterX、GLCD.CenterY、8、2、fixednums7x15); t3.SetFontColor(WHITE); //フォントの色を設定しますt3.ClearArea(); //テキストを印刷しますGLCD.SelectFont(System5x7); GLCD.CursorTo(1、4); GLCD.print( "LAST"); GLCD.CursorTo(11、4); GLCD.print( "BEST"); //パラメータをリセットcurrentRunStartMillis =0; lastRunInMillis =0; bestRunInMillis =0; currentLap =0;} void loop(){//レーザーセンサーの状態を読み取ります:int reading =digitalRead(gateSensorPin); //ノイズまたは押すことにより、スイッチが変更された場合:if(reading!=lastgateSensorState){//デバウンスタイマーをリセットしますlastDebounceTime =millis(); } // end if // ifがデバウンス時間を渡すif((millis()-lastDebounceTime)> debounceDelay){if(reading!=gateSensorState){gateSensorState =reading; //低くなった場合、これはビームが壊れたことを意味しますif(gateSensorState ==LOW){//ミリ秒を保存して、すべての計算が同じ値で行われるようにします。 savedMillis =millis(); //最初のラップでない場合if(currentLap> 0){//最後の実行を保存lastRunInMillis =savedMillis --currentRunStartMillis; //最後の実行が速い場合は最良の実行if(lastRunInMillis0){calcResultFromMillis(savedMillis --currentRunStartMillis、&sec_val、&milli_val); } else {calcResultFromMillis(0、&sec_val、&milli_val); } // end if // CURRENT RUN t1.CursorTo(3、0); //列と行はテキスト領域に相対的ですt1.Printf(F( "%02d。%03d")、sec_val、milli_val); //最後の実行calcResultFromMillis(lastRunInMillis、&sec_val、&milli_val); t2.CursorTo(1、1); //列と行はテキスト領域に相対的ですt2.Printf(F( "%02d。%03d")、sec_val、milli_val); // BEST RUN calcResultFromMillis(bestRunInMillis、&sec_val、&milli_val); t3.CursorTo(1、1); t3.Printf(F( "%02d。%03d")、sec_val、milli_val);} // wnd loop //ミリ秒を2つの値に計算し、displayvoid calcResultFromMillis(unsigned long value、int * sec_val、int * milli_val){* sec_val =int(value / 1000); * mili_val =value- * sec_val * 1000;}
製造プロセス