ブログパーツUL5

スケールスピードメーターの資料

スケールスピードメーターが、一応、完成しましたので、実際にテストをしています。誤動作することが珠にあり、改善の余地はまだありますが、これを基本形にノイズ対策など精度を今後上げていこうと思います。参考になればと回路図、部品表、ソフトウェアを掲載すます。ソフトウェアはどこかのサイトを参考にデバッグしながら修正しているのであまりきれいではありませんが、短いソフトなので解読は出来るともいます。LCDは標準SC12602に準拠しており、16文字×2行の表示に対応しています。縮尺率や計測距離など調整、変更してください。

 回路図
回路図

 部品表
部品表
 すべて秋月で購入できると思います。Arduino UNO Rev3は互換品での動作は保証できません。自己責任でご確認ください。価格は参考価格です。

 ソフトウェア
(見づらいので折りたたんであり、続きを読む>>をクリックすれば開きます。)

【変更点】2018.2.27
 ・HOの縮尺の表示を、1/80から1/87に変更
 ・計算式の中でも、80から87に変更
 ・計測エラーのエラー処理(Error表示)を追加
//
// Sale-SPeed-Meter for RailWay-Modle
// by T.Mikawa
// 2018.2.25
//

#include // LCDライブラリの読み込み

// Arduino LCD
// D2 14(DB7)
// D3 13(DB6)
// D4 12(DB5)
// D5 11(DB4)
// D10 6(E)
// D11 5(R/W)
// D12 4(RS)
// 3(VLC)
// 2(Vdd)
// 1(Vss)

#define BUTTON 7 // 模型縮尺サイズ切替
#define SLIT1_PIN 8 // センサー1
#define SLIT2_PIN 9 // センサー2
int DISTANCE = 66; // 測定距離(mm)
int val;
int old_val;
int slit1;
int slit2;
int i;
unsigned long t1;
unsigned long t2;
unsigned long tt;
long V;
char out_str1[16];

// LiquidCrystal型の変数lcdをつくる
LiquidCrystal lcd(12,11,10,5,4,3,2);

void setup()
{

lcd.begin(16, 2); /* LCDの初期化 */
lcd.noCursor(); /* LCDのカーソル非表示 */
pinMode(BUTTON,INPUT);
pinMode(SLIT1_PIN,INPUT);
pinMode(SLIT2_PIN,INPUT);
lcd.setCursor(0, 0);
lcd.print("ScaleSpeedMeter");
lcd.setCursor(2, 1);
lcd.print("** Start **");
Serial.begin(9600); /* 9600 bpsで接続 */
Serial.println("Start"); /* 最初に1度だけ Start を表示 */
delay (2000);
lcd.clear(); /* LCDの消去 */

}

void loop()
{
lcd.clear();
val = digitalRead(BUTTON); /* Nゲージ、HO切替 */
if(val == HIGH){
lcd.setCursor(0, 0);
lcd.print("SSM 1/150");
lcd.setCursor(0, 1);
lcd.print("OK");
Serial.println("1/150 OK");
}
else{
lcd.setCursor(0, 0);
lcd.print("SSM 1/87");
lcd.setCursor(0, 1);
lcd.print("OK");
Serial.println("1/87 OK");
}

delay(50);
slit1 = digitalRead(SLIT1_PIN); /* センサー信号1 */
slit2 = digitalRead(SLIT2_PIN); /* センサー信号2 */
tt = 0;
V = 0;
lcd.setCursor(0, 1);
lcd.print(" ");

//左向きの速度チェック
if (slit1 == LOW) {
t1 = millis();
while (slit2 == HIGH) {
slit2 = digitalRead(SLIT2_PIN);
}
t2 = millis();
tt = t2 - t1;
if(val == HIGH){
V = 540 * DISTANCE / tt / 100000;
}
else{
V = 540 * DISTANCE / tt / 100000;
V = V * 87 / 150;
}
if(V == 0 or tt < 20 or V >10000){
lcd.setCursor(3, 1);
lcd.print("Error");
}
else{
sprintf(out_str1,"<-- %3d Km/h" , V);
lcd.setCursor(3, 1);
lcd.print(out_str1);
}

Serial.println(tt);
Serial.println(out_str1);
delay (500);

//通過中の車両チェック
for (i=0; i<20; i++) {
delay (100);
slit2 = digitalRead(SLIT2_PIN) ;
if (slit2 == LOW) {
i = 0 ;
}
delay (100);
}
}


//右向きの速度チェック
if (slit2 == LOW){
t1 = millis();
while (slit1 == HIGH) {
slit1 = digitalRead(SLIT1_PIN) ;
}
t2 = millis();
tt = t2 - t1;
if(val == HIGH){
V = 540 * DISTANCE / tt / 100000;
}
else{
V = 540 * DISTANCE / tt / 100000;
V = V * 87 / 150;
}
if(V == 0 or tt < 20 or V >10000){
lcd.setCursor (3, 1) ;
lcd.print("Error");
}
else{
sprintf(out_str1, "--> %3d Km/h" , V);
lcd.setCursor (3, 1) ;
lcd.print(out_str1);
}

Serial.println(tt);
Serial.println(out_str1);
delay (500);

//通過中の車両チェック
for (i=0; i<20; i++) {
delay (100);
slit1 = digitalRead(SLIT2_PIN) ;
if (slit1 == LOW) {
i = 0 ;
}
delay (100);
}
}
}
0

    コメント
    コメントする








       
    この記事のトラックバックURL
    トラックバック

    カレンダ

        123
    45678910
    11121314151617
    18192021222324
    252627282930 
    << November 2018 >>