ProjectSRのアイコン画像
ProjectSR 2024年08月16日作成
製作品 製作品 閲覧数 709
ProjectSR 2024年08月16日作成 製作品 製作品 閲覧数 709

自作電動宅配ボックス

自作電動宅配ボックス

🔳概要・基本構成

①ホームセンターにあるコンテナボックスに、arduino LCDディスプレイ キーパッド サーボモータを装着

②宅配ドライバーが荷物をコンテナボックスに配置し、ロックを行う

③荷物受け取り人は、暗証番号を入力してロックを解除する
 間違えれば、ロックされたまま

🔳解説

ユーチューブ ニコニコ動画 にて 構成解説動画を公開しています

ここに動画が表示されます

ニコニコ動画

[https://www.nicovideo.jp/watch/sm43942718)

ポイント

●arduinoがキーパッド入力を読み取る
●入力情報を受信して、ロックモード、暗証番号受信処理、
 解除モード、LCDディスプレイ表示指令、サーボモータへ指令
●Arduinoには5V ポケットリチウムイオンバッテリー、サーボモータには9V乾電池を使用

今回は,ホームセンタに売られているコンテナボックスをベースに、電動宅配ボックスを自作しました

1⃣本体ハード
本体の外観はこのようになっています
キャプションを入力できます

サーボモータの取付
コンテナボックスの一部をリュータで削っておき、ねじ用の穴もあけておきます
白い部品は、3Dプリンタで作った取付治具ですが、アクリル板などの代用でも可能です
キャプションを入力できます

フック用に、ボックスとフタにも穴をあけておきます
フックは、サーボモータホーンに付いています
キャプションを入力できます

一応、虫や水が入らないようにゴムを張り付けておきます
キャプションを入力できます

2⃣電気電子回路
回路構成はこんな感じです 拡大可能です
LCDディスプレイは、消費電力が多く、9V乾電池では点灯しませんでした
キャプションを入力できます
LCDディスプレイは、接続ピンを減らすために、I2C機能ピンがついたものがよいです

回路格納ボックス
キャプションを入力できます

ボックスの中身
キーパッド、LCDディスプレイの端子には、グルーガンで補強しております
キャプションを入力できます

LCDディスプレイが起動しているとこんな感じです 拡大可能です
キャプションを入力できます

3⃣制御フロー プログラム

・サーボモータ、LCDディスプレイ、キーパッドライブラリを用意
・void setupで初期設定を行い、電池を入れたら、LCDディスプレイで、起動指示を促す
 プログラムを記載
・void loopで 関数Read Keypadを起動する(ここをループさせている)
・Read Keypadはswich文で構成
 デフォルトで一度入力した番号を削除できるなどの機能を搭載
 caseA キーパッドAを入力したらサーボモータ解除 数値0
荷物をセットしたら、を押すように表示
 case

サーボモータ数値を81にして、ロックを行う
 #を押すように指示
 case#
 check key関数を発動
・check key関数
 for文で暗証番号入力数をカウント
 入力内容KEY[i]とあらかじめそろえていたパスコードattempt[i]と照合して
 一致しているか、=で判断し、if分で条件分岐を行う

キャプションを入力できます

プログラム

送信側

#include <Servo.h> Servo myservo; const int SV_PIN = 10;//ここまでサーボモータピンなど設定 #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2);//ここまでLCDのヘッダなど #include <Keypad.h>//ここからキーパッド準備 const byte ROWS = 4; const byte COLS = 4; char keys[COLS][ROWS] = { {'1', '2', '3', 'A'}, {'4', '5', '6', 'B'}, {'7', '8', '9', 'C'}, {'*', '0', '#', 'D'} }; byte rowPins[ROWS] = {9,8,7,6}; byte colPins[COLS] = {5,4,3,2}; Keypad keypad=Keypad(makeKeymap(keys),rowPins,colPins,ROWS,COLS); char KEY[4] = {'1','2','3','4'}; char attempt[4] = {0,0,0,0}; int z=0;//ここまでキーパッド準備 void setup() { lcd.init(); // initialize the LCD lcd.clear(); // clear the LCD display lcd.backlight(); // Make sure backlight is on /* Print a message on both lines of the LCD.*/ lcd.setCursor(0, 0); //Set cursor to character 2 on line 0 lcd.print("UNBOX"); lcd.setCursor(0, 1); lcd.print("PLEASE PUSH A"); myservo.write(0); lcd.setCursor(0, 1); //Move cursor to character 2 on line 1 lcd.print(""); //↑LCDの入力例メモ書き myservo.attach(SV_PIN, 500, 2400);//サーボモータパルス幅設定 } void checkKEY() { int correct=0; int i; for ( i = 0; i < 4 ; i++ ) { if (attempt[i]==KEY[i]) { correct++; } } if (correct==4) { lcd.setCursor(0, 0); //Set cursor to character 2 on line 0 lcd.print("OK OPEN COVER"); lcd.setCursor(0, 1); //Move cursor to character 2 on line 1 lcd.print("AFTER PUSH A"); Serial.println(""); myservo.write(0); } else { lcd.setCursor(0, 0); //Set cursor to character 2 on line 0 lcd.print("NOT ACCEPT "); lcd.setCursor(0, 1); //Move cursor to character 2 on line 1 lcd.print("CLOSE COVER "); myservo.write(81); delay(2000); lcd.setCursor(0, 0); //Set cursor to character 2 on line 0 lcd.print("PLEASE PUSH *"); lcd.setCursor(0, 1); //Move cursor to character 2 on line 1 lcd.print("CLOSE COVER "); myservo.write(81); } for (int zz=0; zz<4; zz++) // attempt1桁づつ初期化(0) { attempt[zz]=0; } } void readKeypad() { char key = keypad.getKey(); if (key != NO_KEY) { switch(key) { case 'A'://入力開始 z=0; lcd.setCursor(0, 0); //Set cursor to character 2 on line 0 lcd.print("IF SET LUGGAGE "); lcd.setCursor(0, 1); lcd.print(" PUSH * "); myservo.write(0); break; case '*'://入力開始 z=0; lcd.setCursor(0, 0); //Set cursor to character 2 on line 0 lcd.print("LOCKMODE. PUSH "); lcd.setCursor(0, 1); lcd.print("NUMBER AND # "); myservo.write(81); break; case '#'://入力終了 delay(100); checkKEY(); break; default: attempt[z]=key; z++; if(key == 'D'){ lcd.setCursor(0, 0); //Set cursor to character 2 on line 0 lcd.print("Deleating No. "); lcd.setCursor(0, 1); lcd.print(" "); delay(2000); char attempt[4] = {0,0,0,0}; lcd.setCursor(0, 0); //Set cursor to character 2 on line 0 lcd.print("Deleating FIN "); lcd.setCursor(0, 1); lcd.print(" "); delay(2000); lcd.setCursor(0, 0); //Set cursor to character 2 on line 0 lcd.print("NOW LOADING "); lcd.setCursor(0, 1); lcd.print(" "); delay(2000); lcd.setCursor(0, 0); //Set cursor to character 2 on line 0 lcd.print("PLEASE PUSH * "); lcd.setCursor(0, 1); lcd.print(" "); } } } } void loop() { readKeypad(); }
部品名 購入先
Arduino uno 秋月電子通商orマルツパーツor千石電商
キーパッド アマゾン
サーボモータ 千石電商
LCDディスプレイ アマゾン
ブレッドボード 秋月電子通商orマルツパーツor千石電商
22AWG単線 アマゾン
ログインしてコメントを投稿する