宅配ボックスカスタム

Arduinoで宅配ボックス内の荷物を検知させるぞ!庫内照明も@⑨プログラム編

2023年12月29日

さて、新規導入した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 組立徹底解説編
③宅配ボックスを設置する
④屋根を設置!
⑤宅配ボックスレビュー
⑥信号機ガチャを設置!?
⑦プログラミング始めてみた
⑧荷物検知・照明@準備編
👉⑨荷物検知・照明@プログラミング編
⑩荷物検知・照明@実装編

-宅配ボックスカスタム