【自作】Arduinoでディジタルカウンターを作る!
今回は、過去につくった作品紹介です。(覚えている範囲内で…)
何か物体が通過した時にカウントする装置です。
大まかな構成としては、赤外線センサーを使って物体を検出し、その信号から
Arduinoがカウント、セグメントへの表示をさせています。
《センサー部》
赤外線LED・赤外線リモコン受信モジュールを使って、物体を検出します。
今回は反射タイプにしましたので、赤外線を受信したら、信号を出力するといった感じにします。
しかし、そのまま赤外線LEDを光らせても反応しません。
高速で点滅させた赤外線でないと受信モジュールは反応してくれません。
受信モジュールは製品によって、周波数が決まっています。
大体 38[kHz]付近が多いいです。
使ったやつも、たしか 38[kHz]ぐらいですので、赤外線LEDも 38[kHz]で点滅させます。
点滅方法は、オペアンプを使った発振回路です。
発振周波数については、回路図中の ”R”と”C” の定数によって変化します。
38[kHZ]ぴったしになる部品の組み合わせはなかなか難しいですので、
可変抵抗1[kΩ]で調整します。
ちなみに、発振周波数 f[Hz] は
f = 1/(2RC×In2)
≒ 1/(2RC×0.693)
= 1/(1.386RC)
によって求めることができます。
なので、C=0.01[μF]のとき、R=1.9[kΩ]ぐらいで38[kHz]になる計算です。
ただし、実際は部品の誤差、回路図中にはない要素があるため、計算どうりにぴったしにはならないと思います。(高周波になればなるほど影響が大きい)
あと、オペアンプ(又はコンパレータ)もある程度高速なタイプを使わないと、動作速度が間に合いませんので注意が必要です。(今回は NJM 2742 使用)
発振動作についてなど⇓
オペアンプを使った矩形波発振回路 | meyon's STUDY
赤外線センサーには、赤外線リモコン受信モジュールを使用。
赤外線リモコン受信モジュール GP1UXC41QS: センサ一般 秋月電子通商-電子部品・ネット通販 (akizukidenshi.com)
赤外線を受信しますと、出力端子Voutは High→Low となります。
出力インピーダンスは低くないですので、電力増幅回路を入れています。
(なくても出来ないことはない)
その際、信号を反転させており、受信すると、信号を出力するようにしています。
(赤外線を受信するとArduino入力端子がHighに)
また、誤受信を防ぐために、受信モジュール出力側に、0.1[μF]のコンデンサをいれています。
《処理部》
センサー部で得た信号はマイコンによって処理され、セグメントへ出力します。
今回使用したマイコンは ”Arduino micro” です。
↓プログラム______________________________
unsigned long t1 = 0;
unsigned long t2 = 0;
int outA = 3; //セグメントA
int outB = 2; //セグメントB
int outC = 8; //セグメントC
int outD = 7; //セグメントD
int outE = 6; //セグメントE
int outF = 4; //セグメントF
int outG = 5; //セグメントG
int outDP = 9; //セグメントDP(小数点用の点)
int outc1 = 10; //セグメント(1桁目)COM
int outc2 = 11; //セグメント(2桁目)COM
int outc3 = 12; //セグメント(3桁目)COM
int T = 40; //スイッチング周期(μs)
int Dty = 40; //デューティ比(セグメント明るさ調整 0~100[%])
int N = 0; //繰り返し回数N初期値0
int M = 10; //繰り返し回数M設定値
int O = 0; //(仮)
int Ton = ( (T*Dty)/100 ); //ターンオン時間
int Toff = ( (T*(100-Dty))/100 ); //ターンオフ時間
int Tout = (T*10); //変化しない時間(ms)
int t = 0; //カウント周期 初期値0
int L = 0; //タイヤ外周距離(cm)
int X = 0; //センサー信号カウント回数初期値0
int l = 000; //総合走行距離 初期値0
int A = 0; //【入力しない】計算に使う
int B = 0; //【入力しない】計算に使う
int C = 0; //【入力しない】計算に使う
int D = 0; //【入力しない】計算に使う
int DP2 = LOW;
int DP3 = LOW;
void setup() {
pinMode(A0, INPUT); //センサー信号
pinMode(A1, INPUT); //明るさ信号(2.2kΩ)
pinMode(A2, INPUT); //明るさ信号(2.2kΩ)
pinMode(A3, INPUT_PULLUP); //タクトスイッチ左(表示リセット)
pinMode(A4, INPUT_PULLUP); //タクトスイッチ右(教示切替)
pinMode(outA, OUTPUT);
pinMode(outB, OUTPUT);
pinMode(outC, OUTPUT);
pinMode(outD, OUTPUT);
pinMode(outE, OUTPUT);
pinMode(outF, OUTPUT);
pinMode(outG, OUTPUT);
pinMode(outDP, OUTPUT);
pinMode(outc1, OUTPUT);
pinMode(outc2, OUTPUT);
pinMode(outc3, OUTPUT);
pinMode(0, OUTPUT);
pinMode(1, OUTPUT);
}
void loop() {
B = 0;
C = 0;
while(digitalRead(A0)==HIGH){D=D+1;C=1;break;}
if(D<2){l=l+C;}
if(digitalRead(A0)==LOW){D=0;}
if(digitalRead(A3)==LOW){l=0;}
A = l;
B = 0;
C = 0;
if(A>=900){digitalWrite(outA,HIGH);digitalWrite(outB,HIGH);digitalWrite(outC,HIGH);digitalWrite(outD,HIGH);
digitalWrite(outE,LOW);digitalWrite(outF,HIGH);digitalWrite(outG,HIGH);digitalWrite(outDP,LOW);
digitalWrite(outc1,HIGH);digitalWrite(outc2,HIGH);digitalWrite(outc3,LOW);A = A-900;B = 2;} //3桁目 9
if(A>=800){digitalWrite(outA,HIGH);digitalWrite(outB,HIGH);digitalWrite(outC,HIGH);digitalWrite(outD,HIGH);
digitalWrite(outE,HIGH);digitalWrite(outF,HIGH);digitalWrite(outG,HIGH);digitalWrite(outDP,LOW);
digitalWrite(outc1,HIGH);digitalWrite(outc2,HIGH);digitalWrite(outc3,LOW);A = A-800;B = 2;} //3桁目 8
if(A>=700){digitalWrite(outA,HIGH);digitalWrite(outB,HIGH);digitalWrite(outC,HIGH);digitalWrite(outD,LOW);
digitalWrite(outE,LOW);digitalWrite(outF,HIGH);digitalWrite(outG,LOW);digitalWrite(outDP,LOW);
digitalWrite(outc1,HIGH);digitalWrite(outc2,HIGH);digitalWrite(outc3,LOW);A = A-700;B = 2;} //3桁目 7
if(A>=600){digitalWrite(outA,HIGH);digitalWrite(outB,LOW);digitalWrite(outC,HIGH);digitalWrite(outD,HIGH);
digitalWrite(outE,HIGH);digitalWrite(outF,HIGH);digitalWrite(outG,HIGH);digitalWrite(outDP,LOW);
digitalWrite(outc1,HIGH);digitalWrite(outc2,HIGH);digitalWrite(outc3,LOW);A = A-600;B = 2;} //3桁目 6
if(A>=500){digitalWrite(outA,HIGH);digitalWrite(outB,LOW);digitalWrite(outC,HIGH);digitalWrite(outD,HIGH);
digitalWrite(outE,LOW);digitalWrite(outF,HIGH);digitalWrite(outG,HIGH);digitalWrite(outDP,LOW);
digitalWrite(outc1,HIGH);digitalWrite(outc2,HIGH);digitalWrite(outc3,LOW);A = A-500;B = 2;} //3桁目 5
if(A>=400){digitalWrite(outA,LOW);digitalWrite(outB,HIGH);digitalWrite(outC,HIGH);digitalWrite(outD,LOW);
digitalWrite(outE,LOW);digitalWrite(outF,HIGH);digitalWrite(outG,HIGH);digitalWrite(outDP,LOW);
digitalWrite(outc1,HIGH);digitalWrite(outc2,HIGH);digitalWrite(outc3,LOW);A = A-400;B = 2;} //3桁目 4
if(A>=300){digitalWrite(outA,HIGH);digitalWrite(outB,HIGH);digitalWrite(outC,HIGH);digitalWrite(outD,HIGH);
digitalWrite(outE,LOW);digitalWrite(outF,LOW);digitalWrite(outG,HIGH);digitalWrite(outDP,LOW);
digitalWrite(outc1,HIGH);digitalWrite(outc2,HIGH);digitalWrite(outc3,LOW);A = A-300;B = 2;} //3桁目 3
if(A>=200){digitalWrite(outA,HIGH);digitalWrite(outB,HIGH);digitalWrite(outC,LOW);digitalWrite(outD,HIGH);
digitalWrite(outE,HIGH);digitalWrite(outF,LOW);digitalWrite(outG,HIGH);digitalWrite(outDP,LOW);
digitalWrite(outc1,HIGH);digitalWrite(outc2,HIGH);digitalWrite(outc3,LOW);A = A-200;B = 2;} //3桁目 2
if(A>=100){digitalWrite(outA,LOW);digitalWrite(outB,HIGH);digitalWrite(outC,HIGH);digitalWrite(outD,LOW);
digitalWrite(outE,LOW);digitalWrite(outF,LOW);digitalWrite(outG,LOW);digitalWrite(outDP,LOW);
digitalWrite(outc1,HIGH);digitalWrite(outc2,HIGH);digitalWrite(outc3,LOW);A = A-100;B = 2;} //3桁目 1
if(B>1){C = 1;}
if(C<1){digitalWrite(outA,HIGH);digitalWrite(outB,HIGH);digitalWrite(outC,HIGH);digitalWrite(outD,HIGH);
digitalWrite(outE,HIGH);digitalWrite(outF,HIGH);digitalWrite(outG,LOW);digitalWrite(outDP,LOW);
digitalWrite(outc1,HIGH);digitalWrite(outc2,HIGH);digitalWrite(outc3,LOW);} //3桁目 0
while(N < M){N = N+1; digitalWrite(outc3,LOW);delayMicroseconds(Ton);digitalWrite(outc3,HIGH);delayMicroseconds(Toff);} //明るさ調整
N = 0;
B = 0;
C = 0;
digitalWrite(outA, LOW);
digitalWrite(outB, LOW);
digitalWrite(outC, LOW);
digitalWrite(outD, LOW);
digitalWrite(outE, LOW);
digitalWrite(outF, LOW);
digitalWrite(outG, LOW);
digitalWrite(outc1, HIGH);
digitalWrite(outc2, HIGH);
digitalWrite(outc3, HIGH);
if(A>=90){digitalWrite(outA,HIGH);digitalWrite(outB,HIGH);digitalWrite(outC,HIGH);digitalWrite(outD,HIGH);
digitalWrite(outE,LOW);digitalWrite(outF,HIGH);digitalWrite(outG,HIGH);digitalWrite(outDP,LOW);
digitalWrite(outc1,HIGH);digitalWrite(outc2,LOW);digitalWrite(outc3,HIGH);A = A-90;B = 2;} //2桁目 9
if(A>=80){digitalWrite(outA,HIGH);digitalWrite(outB,HIGH);digitalWrite(outC,HIGH);digitalWrite(outD,HIGH);
digitalWrite(outE,HIGH);digitalWrite(outF,HIGH);digitalWrite(outG,HIGH);digitalWrite(outDP,LOW);
digitalWrite(outc1,HIGH);digitalWrite(outc2,LOW);digitalWrite(outc3,HIGH);A = A-80;B = 2;} //2桁目 8
if(A>=70){digitalWrite(outA,HIGH);digitalWrite(outB,HIGH);digitalWrite(outC,HIGH);digitalWrite(outD,LOW);
digitalWrite(outE,LOW);digitalWrite(outF,HIGH);digitalWrite(outG,LOW);digitalWrite(outDP,LOW);
digitalWrite(outc1,HIGH);digitalWrite(outc2,LOW);digitalWrite(outc3,HIGH);A = A-70;B = 2;} //2桁目 7
if(A>=60){digitalWrite(outA,HIGH);digitalWrite(outB,LOW);digitalWrite(outC,HIGH);digitalWrite(outD,HIGH);
digitalWrite(outE,HIGH);digitalWrite(outF,HIGH);digitalWrite(outG,HIGH);digitalWrite(outDP,LOW);
digitalWrite(outc1,HIGH);digitalWrite(outc2,LOW);digitalWrite(outc3,HIGH);A = A-60;B = 2;} //2桁目 6
if(A>=50){digitalWrite(outA,HIGH);digitalWrite(outB,LOW);digitalWrite(outC,HIGH);digitalWrite(outD,HIGH);
digitalWrite(outE,LOW);digitalWrite(outF,HIGH);digitalWrite(outG,HIGH);digitalWrite(outDP,LOW);
digitalWrite(outc1,HIGH);digitalWrite(outc2,LOW);digitalWrite(outc3,HIGH);A = A-50;B = 2;} //2桁目 5
if(A>=40){digitalWrite(outA,LOW);digitalWrite(outB,HIGH);digitalWrite(outC,HIGH);digitalWrite(outD,LOW);
digitalWrite(outE,LOW);digitalWrite(outF,HIGH);digitalWrite(outG,HIGH);digitalWrite(outDP,LOW);
digitalWrite(outc1,HIGH);digitalWrite(outc2,LOW);digitalWrite(outc3,HIGH);A = A-40;B = 2;} //2桁目 4
if(A>=30){digitalWrite(outA,HIGH);digitalWrite(outB,HIGH);digitalWrite(outC,HIGH);digitalWrite(outD,HIGH);
digitalWrite(outE,LOW);digitalWrite(outF,LOW);digitalWrite(outG,HIGH);digitalWrite(outDP,LOW);
digitalWrite(outc1,HIGH);digitalWrite(outc2,LOW);digitalWrite(outc3,HIGH);A = A-30;B = 2;} //2桁目 3
if(A>=20){digitalWrite(outA,HIGH);digitalWrite(outB,HIGH);digitalWrite(outC,LOW);digitalWrite(outD,HIGH);
digitalWrite(outE,HIGH);digitalWrite(outF,LOW);digitalWrite(outG,HIGH);digitalWrite(outDP,LOW);
digitalWrite(outc1,HIGH);digitalWrite(outc2,LOW);digitalWrite(outc3,HIGH);A = A-20;B = 2;} //2桁目 2
if(A>=10){digitalWrite(outA,LOW);digitalWrite(outB,HIGH);digitalWrite(outC,HIGH);digitalWrite(outD,LOW);
digitalWrite(outE,LOW);digitalWrite(outF,LOW);digitalWrite(outG,LOW);digitalWrite(outDP,LOW);
digitalWrite(outc1,HIGH);digitalWrite(outc2,LOW);digitalWrite(outc3,HIGH);A = A-10;B = 2;} //2桁目 1
if(B>1){C = 1;}
if(C<1){digitalWrite(outA,HIGH);digitalWrite(outB,HIGH);digitalWrite(outC,HIGH);digitalWrite(outD,HIGH);
digitalWrite(outE,HIGH);digitalWrite(outF,HIGH);digitalWrite(outG,LOW);digitalWrite(outDP,LOW);
digitalWrite(outc1,HIGH);digitalWrite(outc2,LOW);digitalWrite(outc3,HIGH);} //2桁目 0
while(N < M){N = N+1; digitalWrite(outc2,LOW);delayMicroseconds(Ton);digitalWrite(outc2,HIGH);delayMicroseconds(Toff);} //明るさ調整
N = 0;
B = 0;
C = 0;
digitalWrite(outA, LOW);
digitalWrite(outB, LOW);
digitalWrite(outC, LOW);
digitalWrite(outD, LOW);
digitalWrite(outE, LOW);
digitalWrite(outF, LOW);
digitalWrite(outG, LOW);
digitalWrite(outc1, HIGH);
digitalWrite(outc2, HIGH);
digitalWrite(outc3, HIGH);
if(A>=9){digitalWrite(outA,HIGH);digitalWrite(outB,HIGH);digitalWrite(outC,HIGH);digitalWrite(outD,HIGH);
digitalWrite(outE,LOW);digitalWrite(outF,HIGH);digitalWrite(outG,HIGH);digitalWrite(outDP,LOW);
digitalWrite(outc1,LOW);digitalWrite(outc2,HIGH);digitalWrite(outc3,HIGH);A = A-9;B = 2;} //1桁目 9
if(A>=8){digitalWrite(outA,HIGH);digitalWrite(outB,HIGH);digitalWrite(outC,HIGH);digitalWrite(outD,HIGH);
digitalWrite(outE,HIGH);digitalWrite(outF,HIGH);digitalWrite(outG,HIGH);digitalWrite(outDP,LOW);
digitalWrite(outc1,LOW);digitalWrite(outc2,HIGH);digitalWrite(outc3,HIGH);A = A-8;B = 2;} //1桁目 8
if(A>=7){digitalWrite(outA,HIGH);digitalWrite(outB,HIGH);digitalWrite(outC,HIGH);digitalWrite(outD,LOW);
digitalWrite(outE,LOW);digitalWrite(outF,HIGH);digitalWrite(outG,LOW);digitalWrite(outDP,LOW);
digitalWrite(outc1,LOW);digitalWrite(outc2,HIGH);digitalWrite(outc3,HIGH);A = A-7;B = 2;} //1桁目 7
if(A>=6){digitalWrite(outA,HIGH);digitalWrite(outB,LOW);digitalWrite(outC,HIGH);digitalWrite(outD,HIGH);
digitalWrite(outE,HIGH);digitalWrite(outF,HIGH);digitalWrite(outG,HIGH);digitalWrite(outDP,LOW);
digitalWrite(outc1,LOW);digitalWrite(outc2,HIGH);digitalWrite(outc3,HIGH);A = A-6;B = 2;} //1桁目 6
if(A>=5){digitalWrite(outA,HIGH);digitalWrite(outB,LOW);digitalWrite(outC,HIGH);digitalWrite(outD,HIGH);
digitalWrite(outE,LOW);digitalWrite(outF,HIGH);digitalWrite(outG,HIGH);digitalWrite(outDP,LOW);
digitalWrite(outc1,LOW);digitalWrite(outc2,HIGH);digitalWrite(outc3,HIGH);A = A-5;B = 2;} //1桁目 5
if(A>=4){digitalWrite(outA,LOW);digitalWrite(outB,HIGH);digitalWrite(outC,HIGH);digitalWrite(outD,LOW);
digitalWrite(outE,LOW);digitalWrite(outF,HIGH);digitalWrite(outG,HIGH);digitalWrite(outDP,LOW);
digitalWrite(outc1,LOW);digitalWrite(outc2,HIGH);digitalWrite(outc3,HIGH);A = A-4;B = 2;} //1桁目 4
if(A>=3){digitalWrite(outA,HIGH);digitalWrite(outB,HIGH);digitalWrite(outC,HIGH);digitalWrite(outD,HIGH);
digitalWrite(outE,LOW);digitalWrite(outF,LOW);digitalWrite(outG,HIGH);digitalWrite(outDP,LOW);
digitalWrite(outc1,LOW);digitalWrite(outc2,HIGH);digitalWrite(outc3,HIGH);A = A-3;B = 2;} //1桁目 3
if(A>=2){digitalWrite(outA,HIGH);digitalWrite(outB,HIGH);digitalWrite(outC,LOW);digitalWrite(outD,HIGH);
digitalWrite(outE,HIGH);digitalWrite(outF,LOW);digitalWrite(outG,HIGH);digitalWrite(outDP,LOW);
digitalWrite(outc1,LOW);digitalWrite(outc2,HIGH);digitalWrite(outc3,HIGH);A = A-2;B = 2;} //1桁目 2
if(A>=1){digitalWrite(outA,LOW);digitalWrite(outB,HIGH);digitalWrite(outC,HIGH);digitalWrite(outD,LOW);
digitalWrite(outE,LOW);digitalWrite(outF,LOW);digitalWrite(outG,LOW);digitalWrite(outDP,LOW);
digitalWrite(outc1,LOW);digitalWrite(outc2,HIGH);digitalWrite(outc3,HIGH);A = A-1;B = 2;} //1桁目 1
if(B>1){C = 1;}
if(C<1){digitalWrite(outA,HIGH);digitalWrite(outB,HIGH);digitalWrite(outC,HIGH);digitalWrite(outD,HIGH);
digitalWrite(outE,HIGH);digitalWrite(outF,HIGH);digitalWrite(outG,LOW);digitalWrite(outDP,LOW);
digitalWrite(outc1,LOW);digitalWrite(outc2,HIGH);digitalWrite(outc3,HIGH);} //1桁目 0
while(N < M){N = N+1; digitalWrite(outc1,LOW);delayMicroseconds(Ton);digitalWrite(outc1,HIGH);delayMicroseconds(Toff);} //明るさ調整
N = 0;
if(l>999){l=0;}
}
__________________________________
私はマイコン初心者なので、非常に無駄の多いいプログラムだと思いますが、
お気になさらず…:(;゙゚''ω゚''):
あと、元々はカウンターではなく、速度計を作る予定でしたので、いろいろ要らない文字列がありますのでそれは無視してください。
(動作には支障ありません。)
大まかにやっていることを言いますと、”A”という文字にカウント数を記憶させ、
”A”がいま、なんの数字なのか、0~9まで三桁分判断させ、
セグメントへの出力端子をそれぞれの数字になるように "High,Low" 組み合わせています。
使用したセグメントは”カソードコモン”ですので、LEDのカソード側が共通になっています。
駆動方式はダイナミック駆動方式です。
三桁すべて同時に表示制御させると、マイコンの端子が足りませんので、
一桁目を制御(一桁目だけCOMがLow , 二,三桁目はHigh)→
二桁目を制御(二桁目だけCOMがLow , 一,三桁目はHigh)→
三桁目を制御(三桁目だけCOMがLow , 一,二桁目はHigh)…
っといった感じに制御させます。
また、セグメントの明るさを調整できるよう”PWM制御”もさせています。
”Dty”の数値を変えることで変更可能です。
(※大幅に明るさ変更するためには、他の数値を変更すれば出来ますが、表示がチラついてしまいますので、注意が必要です。)
入力端子の設定で、"表示リセット"の入力端子はプルアップさせていますので、入力端子とGND間にスイッチを入れるだけででOKです。
【まとめ】
0~999までカウント可能な装置を作ってみました。
(※999の次は0に戻ります。)
マイコンの設定次第で、回路ベースを変えずに、いろんな表示に変えられ、また複雑な動作も出来ちゃうのがマイコンの便利なところだと思います。
では、今回は、この辺で、
おしまい
おまけ⤵
ys-electronics-institute.hatenablog.com
YouTube チャンネル名:よしエレ研究所
URL : https://www.youtube.com/channel/UCo3LKDNnY0GGRDPGOEST_vg
Twitter アカウント:よしエレ研究所 @8jrMEWW6zlq3UAt
URL:https://mobile.twitter.com/8jrMEWW6zIq3UAt