さて、新規導入した3Dプリンタを活用して、超音波センサーケース・BOX内照明・BOX上部照明を作製しました。
宅配ボックス内の荷物検知・信号の切り替え・照明の制御は全て、Arduino Uno(互換機)1台で行います。
Arduino・C言語初心者のまいたけが、本やネット上の情報を参考にしてプログラムを作製しているので、詳しい方から見るとおかしな部分もあるかと思います…
初心者なので暖かい目で見て下さいね🥺
≪宅配ボックス魔改造 記事一覧≫
①考察編
②P-BOX 組立徹底解説編
③宅配ボックスを設置する
④屋根を設置!
⑤宅配ボックスレビュー
⑥信号機ガチャを設置!?
⑦プログラミング始めてみた
⑧荷物検知・照明@準備編
👉⑨荷物検知・照明@プログラミング編
⑩荷物検知・照明@実装編
全体像
まずは、Arduinoに周りの全体像はこんな感じです。
(画像をクリックすると、別ウィンドウで開きます)
赤線は5V。黒線はGNDでまとめてから、Arduinoの5V端子・GND端子にそれぞれ接続されています。
照明用のLEDは、Arduinoの5Vや出力端子からでは電流的に足りないので、Arduinoを動かす9VのACアダプターを分岐して供給します。
(画像では9V電池になっていますが、実際は9VのACアダプタです。)
ですが、Arduinoでは9Vは直接的には扱えないので、リレーモジュールを使用して動かします。
5Vの命令で違う電圧(今回は9V)の回路をON-OFFさせる事ができるので、電子工作には便利なモジュールです。
明るさ検知で使用しているフォトレジスタはGL5528を使用していますが、他の品番でも問題ないと思います。
フォトレジスタの+電源側にある抵抗値は5kΩを使用しました。
Arduino本体付近の拡大画像。
コードを見れば、何がどこにつながっているのかは分かると思うので、画像とコードで判断して下さいね👍
プログラミング
さて、このArduinoを動かすコードはこちらになります。
//宅配ボックス制御信号機
int TRIG1 = 2;
int ECHO1 = 3;
int TRIG2 = 4;
int ECHO2 = 5;
int TRIG3 = 8;
int ECHO3 = 9;
int TRIG4 = 10;
int ECHO4 = 11;
int TRIG5 = A0;
int ECHO5 = A1;
int ueaka = 12;
int uemidori = 13;
int shitaaka = 6;
int shitamidori = 7;
int konai = A3;
int cds = A2;
double duration1 = 0;
double duration2 = 0;
double duration3 = 0;
double duration4 = 0;
double duration5 = 0;
double distance1 = 0;
double distance2 = 0;
double distance3 = 0;
double distance4 = 0;
double distance5 = 0;
#define WAT 20000 // Wait Time 20000mS
unsigned long kako; //
void setup() {
kako = millis();
Serial.begin( 9600 );
pinMode(ECHO1, INPUT );
pinMode(TRIG1, OUTPUT );
pinMode(ECHO2, INPUT );
pinMode(TRIG2, OUTPUT );
pinMode(ECHO3, INPUT );
pinMode(TRIG3, OUTPUT );
pinMode(ECHO4, INPUT );
pinMode(TRIG4, OUTPUT );
pinMode(ECHO5, INPUT );
pinMode(TRIG5, OUTPUT );
pinMode(ueaka, OUTPUT);
pinMode(ueaka, OUTPUT);
pinMode(uemidori, OUTPUT);
pinMode(shitaaka, OUTPUT);
pinMode(shitamidori, OUTPUT);
pinMode(konai,OUTPUT);
pinMode(cds,INPUT);
}
void loop() {
//上段制御センサ1
digitalWrite(TRIG1, LOW);
delayMicroseconds(2);
digitalWrite( TRIG1, HIGH );
delayMicroseconds( 10 );
digitalWrite( TRIG1, LOW );
duration1 = pulseIn( ECHO1, HIGH ); // 往復にかかった時間が返却される[マイクロ秒]
if (duration1 > 0) {
duration1 = duration1 / 2; // 往路にかかった時間
distance1 = duration1 * 340 * 100 / 1000000; // 音速を340m/sに設定
Serial.print("distance1:");
Serial.print(distance1);
Serial.println(" cm");
}
delay(400);
//上段制御センサ2
digitalWrite(TRIG2, LOW);
delayMicroseconds(2);
digitalWrite( TRIG2, HIGH );
delayMicroseconds( 10 );
digitalWrite( TRIG2, LOW );
duration2 = pulseIn( ECHO2, HIGH );
if (duration2 > 0) {
duration2 = duration2 / 2;
distance2 = duration2 * 340 * 100 / 1000000;
Serial.print("distance2:");
Serial.print(distance2);
Serial.println(" cm");
if (distance1 < 50 || distance2 <50){
digitalWrite(uemidori, LOW);
digitalWrite(ueaka, HIGH);
}else{
digitalWrite(ueaka, LOW);
digitalWrite(uemidori, HIGH);
}
}
delay(400);
//下段制御センサ3
digitalWrite(TRIG3, LOW);
delayMicroseconds(2);
digitalWrite( TRIG3, HIGH );
delayMicroseconds( 10 );
digitalWrite( TRIG3, LOW );
duration3 = pulseIn( ECHO3, HIGH );
if (duration3 > 0) {
duration3 = duration3 / 2;
distance3 = duration3 * 340 * 100 / 1000000;
Serial.print("distance3:");
Serial.print(distance3);
Serial.println(" cm");
}
delay(400);
//下段制御センサ4
digitalWrite(TRIG4, LOW);
delayMicroseconds(2);
digitalWrite( TRIG4, HIGH );
delayMicroseconds( 10 );
digitalWrite( TRIG4, LOW );
duration4 = pulseIn( ECHO4, HIGH );
if (duration4 > 0) {
duration4 = duration4 / 2;
distance4 = duration4 * 340 * 100 / 1000000;
Serial.print("distance4:");
Serial.print(distance4);
Serial.println(" cm");
if (distance3 < 50 || distance4 <50){
digitalWrite(shitamidori, LOW);
digitalWrite(shitaaka, HIGH);
}else{
digitalWrite(shitaaka, LOW);
digitalWrite(shitamidori, HIGH);
}
}
delay(400);
//庫内LED照明
digitalWrite(TRIG5, LOW);
delayMicroseconds(2);
digitalWrite( TRIG5, HIGH );
delayMicroseconds( 10 );
digitalWrite( TRIG5, LOW );
duration5 = pulseIn( ECHO5, HIGH );
if (duration5 > 0) {
duration5 = duration5 / 2;
distance5 = duration5 * 340 * 100 / 1000000;
Serial.print("distance5:");
Serial.print(distance5);
Serial.println(" cm");
cds=analogRead(A2); // アナログピンA2の値を読み取る(0~1023)
{cds=analogRead(A2); //シリアル通信開始 以下4行
Serial.print("cds:"); // シリアルモニタにアナログ値を表示
Serial.println(cds);
if (distance5 < 230 && cds >800){
digitalWrite(konai, HIGH);
kako = millis(); // 実行時刻をメモる
}else{
if((millis() - kako) > WAT){ // Wait Time 経過したか?
digitalWrite(konai,LOW); // WATタイム以上時間が経過していれば実行
}
}
}
}
}
この制御を簡単に文字で表すと、
・超音波センサー上段①の距離を測定
・超音波センサー上段②の距離を測定
・①②の値のどちらかが50cm以下なら上段信号機を赤に、50cm以上なら緑に
・超音波センサー下段③の距離を測定
・超音波センサー下段④の距離を測定
・③④の値のどちらかが50cm以下なら下段信号機を赤に、50cm以上なら緑に
・超音波センサー⑤の距離を測定
・明るさセンサーの数値を読み取る
・⑤の距離が230cm以内かつ、明るさセンサーの数値が800以上なら照明を点灯させる
・点灯時間は最終検知から20秒間
各超音波センサーの数値を読取後、delay400(0.4秒待ち)を入れてあります。
なのでプログラムが1周するのに約2秒かかります。もっとレスポンスをよくしたければ、delay(50);くらいに設定して下さい。
照明を点灯させる20秒は、millisコマンドで制御しているので、照明点灯中も庫内超音波センサーは測定を続ける事が可能です👍
全体の配線やプログラムはこんな感じです。
これをArduino本体に、Arduino IDEで書き込んで準備完了です👍
次は実際に宅配ボックスに組み込んでいきます。
≪宅配ボックス魔改造 記事一覧≫
①考察編
②P-BOX 組立徹底解説編
③宅配ボックスを設置する
④屋根を設置!
⑤宅配ボックスレビュー
⑥信号機ガチャを設置!?
⑦プログラミング始めてみた
⑧荷物検知・照明@準備編
👉⑨荷物検知・照明@プログラミング編
⑩荷物検知・照明@実装編