久しぶりの更新ですがさっそく本題に入ります。
今日は2桁7セグメントLEDで距離を表示させる超音波距離計を製作します。
今回使った部品です。
・2桁7セグメントLED (ELD-511SRWA)
・Arduino Nano (互換品)
・超音波センサ (HC-SR04)
・51Ω抵抗(7本)
※型番をクリックするとデータシートへ飛びます
回路図です。
こんな感じです。
ではプログラムへ行きます。
const int A = 2;
const int B = 3;
const int C = 4;
const int D = 5;
const int E = 6;
const int F = 7;
const int G = 8;
const int TRG = 12;
const int ECH = 13;
void setup() {
pinMode(TRG, OUTPUT); //超音波センサトリガー
pinMode(ECH, INPUT); //超音波センサエコー
/*
a1 a2
f1 b1 f2 b2
g1 g2
e1 c1 e2 c2
d1 dp1 d2 dp2
7seg対応ピン
a1=16, a2=11
b1=15, b2=10
c1=3, c2=8
d1=2, d2=6
e1=1, e2=5
f1=18, f2=12
g1=17, g2=7
dp1=4, dp2=9
cathode1=14, cathode2=13
*/
pinMode(A,OUTPUT);
pinMode(B,OUTPUT);
pinMode(C,OUTPUT);
pinMode(D,OUTPUT);
pinMode(E,OUTPUT);
pinMode(F,OUTPUT);
pinMode(G,OUTPUT);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
Serial.begin(9600);
}
//光らせる部分を指定
void ledSeg(int val) {
switch(val) {
case 0:
digitalWrite(A,1);
digitalWrite(B,1);
digitalWrite(C,1);
digitalWrite(D,1);
digitalWrite(E,1);
digitalWrite(F,1);
digitalWrite(G,0);
break;
case 1:
digitalWrite(A,0);
digitalWrite(B,1);
digitalWrite(C,1);
digitalWrite(D,0);
digitalWrite(E,0);
digitalWrite(F,0);
digitalWrite(G,0);
break;
case 2:
digitalWrite(A,1);
digitalWrite(B,1);
digitalWrite(C,0);
digitalWrite(D,1);
digitalWrite(E,1);
digitalWrite(F,0);
digitalWrite(G,1);
break;
case 3:
digitalWrite(A,1);
digitalWrite(B,1);
digitalWrite(C,1);
digitalWrite(D,1);
digitalWrite(E,0);
digitalWrite(F,0);
digitalWrite(G,1);
break;
case 4:
digitalWrite(A,0);
digitalWrite(B,1);
digitalWrite(C,1);
digitalWrite(D,0);
digitalWrite(E,0);
digitalWrite(F,1);
digitalWrite(G,1);
break;
case 5:
digitalWrite(A,1);
digitalWrite(B,0);
digitalWrite(C,1);
digitalWrite(D,1);
digitalWrite(E,0);
digitalWrite(F,1);
digitalWrite(G,1);
break;
case 6:
digitalWrite(A,1);
digitalWrite(B,0);
digitalWrite(C,1);
digitalWrite(D,1);
digitalWrite(E,1);
digitalWrite(F,1);
digitalWrite(G,1);
break;
case 7:
digitalWrite(A,1);
digitalWrite(B,1);
digitalWrite(C,1);
digitalWrite(D,0);
digitalWrite(E,0);
digitalWrite(F,1);
digitalWrite(G,0);
break;
case 8:
digitalWrite(A,1);
digitalWrite(B,1);
digitalWrite(C,1);
digitalWrite(D,1);
digitalWrite(E,1);
digitalWrite(F,1);
digitalWrite(G,1);
break;
case 9:
digitalWrite(A,1);
digitalWrite(B,1);
digitalWrite(C,1);
digitalWrite(D,1);
digitalWrite(E,0);
digitalWrite(F,1);
digitalWrite(G,1);
break;
}
}
//ここまで
void loop() {
//ここから超音波計
int diff;
float dis;
digitalWrite(12, HIGH);
delayMicroseconds(10);
digitalWrite(12, LOW);
diff = pulseIn(13, HIGH);
dis = (float)diff * 0.01715;
Serial.print(dis);
Serial.println("cm");
delay(10);
//ここまで
//数字を桁で分ける
int n = dis; //整数変換
int n1=0,a2=0,a1=0,i,j;
for(i=0;i<=10;i++){
n1 = n-i*10;
if(n1>9){
a2 = 9; //99以上なら2桁目を9
a1 = 9; //99以上なら1桁目を9
}
else if(0<=n1 && n1<=9){
a2 = i; //2桁目の数字
for(j=0;j<=10;j++){
if(n1 == j){
a1 = j; //1桁目の数字
}
}
}
else if(n1>9) a2 = 9;
}
//ここまで
//7セグカウンタ出力
for(int k=0; k<10; k++) {
digitalWrite(9,LOW);
digitalWrite(10,HIGH);
ledSeg(a2);
delay(10);
digitalWrite(9,HIGH);
digitalWrite(10,LOW);
ledSeg(a1);
delay(10);
}
//ここまで
}
プログラムの中で一応コメント書いてあるので解説は省略します、質問ある方はコメントしてください。
はい、そしてこれをArduinoへ書き込みます。
大体50cmくらいまではかなり正確に測定できています。
それ以降はたまにかなり値がぶれます。
70cm付近で250cmなど値が荒ぶっています。
100cm以上は99と表示されます。
これで、無事完成しました。
一応備忘録のつもりですので自分が見やすいように書いています。
それと写真では7セグLEDに抵抗挟んでいませんが回路図の通り抵抗挟んだ方がいいです。
一応補足でした。
では。ノシ
にほんブログ村に参加しています。
↓よかったらクリックお願いします↓