ProjectSR が 2024年08月16日07時21分55秒 に編集
初版
タイトルの変更
自作電動宅配ボックス
タグの変更
3Dプリンタ
Arduino
電子工作
Youtube
宅配ボックス
キーパッド
LCDディスプレイ
メイン画像の変更
記事種類の変更
製作品
本文の変更
🔳概要・基本構成 --- ①ホームセンターにあるコンテナボックスに、arduino LCDディスプレイ キーパッド サーボモータを装着 ②宅配ドライバーが荷物をコンテナボックスに配置し、ロックを行う ③荷物受け取り人は、暗証番号を入力してロックを解除する 間違えれば、ロックされたまま 🔳解説 ユーチューブ ニコニコ動画 にて 構成解説動画を公開しています @[youtube](https://youtu.be/ixg_bHMtipI) ### ニコニコ動画 [https://www.nicovideo.jp/watch/sm43942718) ポイント --- ●arduinoがキーパッド入力を読み取る ●入力情報を受信して、ロックモード、暗証番号受信処理、 解除モード、LCDディスプレイ表示指令、サーボモータへ指令 ●Arduinoには5V ポケットリチウムイオンバッテリー、サーボモータには9V乾電池を使用 今回は,ホームセンタに売られているコンテナボックスをベースに、電動宅配ボックスを自作しました 1⃣本体ハード 本体の外観はこのようになっています ![キャプションを入力できます](https://camo.elchika.com/fa1cbf6f20a4182a6001d35cf761b792b434d17d/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65636165613738332d303336612d346532652d383632662d3732393461656431353662352f36376562363438392d353865662d346164632d393263362d343437383034336338623333/) サーボモータの取付 コンテナボックスの一部をリュータで削っておき、ねじ用の穴もあけておきます 白い部品は、3Dプリンタで作った取付治具ですが、アクリル板などの代用でも可能です ![キャプションを入力できます](https://camo.elchika.com/4beafae2886cd6e7322f397944989fe54c2f7b47/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65636165613738332d303336612d346532652d383632662d3732393461656431353662352f37633562373736332d346132612d346331372d383765332d373131616332313738313836/) フック用に、ボックスとフタにも穴をあけておきます フックは、サーボモータホーンに付いています ![キャプションを入力できます](https://camo.elchika.com/c59be7300d9e039ed31531028ed9d4df1a522390/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65636165613738332d303336612d346532652d383632662d3732393461656431353662352f30356665616566382d363734302d346265312d393061342d666565653739396230643535/) 一応、虫や水が入らないようにゴムを張り付けておきます ![キャプションを入力できます](https://camo.elchika.com/12cbf75ef4472c90f5c730d1d934cfc6137127d5/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65636165613738332d303336612d346532652d383632662d3732393461656431353662352f35663833303266342d663566642d343233332d383130312d626566336234323032663866/) 2⃣電気電子回路 回路構成はこんな感じです 拡大可能です LCDディスプレイは、消費電力が多く、9V乾電池では点灯しませんでした ![キャプションを入力できます](https://camo.elchika.com/3c82ebbf88963dee51b68817b86ed6c13796b21e/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65636165613738332d303336612d346532652d383632662d3732393461656431353662352f37303564383930312d343031372d346361342d396162312d643535636333383237376339/) LCDディスプレイは、接続ピンを減らすために、I2C機能ピンがついたものがよいです 回路格納ボックス ![キャプションを入力できます](https://camo.elchika.com/a268627c096a7b696fc2a59eb0363ea082c524b1/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65636165613738332d303336612d346532652d383632662d3732393461656431353662352f31633539313132312d343034342d346261652d383832302d313330633764316230323139/) ボックスの中身 キーパッド、LCDディスプレイの端子には、グルーガンで補強しております ![キャプションを入力できます](https://camo.elchika.com/a51d12a8f2b251251b970ad46ea20a3849353cf6/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65636165613738332d303336612d346532652d383632662d3732393461656431353662352f35633630353238642d663739662d346134632d383164342d353734393236396366366463/) LCDディスプレイが起動しているとこんな感じです 拡大可能です ![キャプションを入力できます](https://camo.elchika.com/6de04bdd2c7fbfcf10559d07a8127f39757f622a/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65636165613738332d303336612d346532652d383632662d3732393461656431353662352f38373966353937342d376530662d343434652d623663612d663432326265386565333630/) 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分で条件分岐を行う ![キャプションを入力できます](https://camo.elchika.com/110f39d3c3b44006995df9e9bfd89ab3f9b8e191/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65636165613738332d303336612d346532652d383632662d3732393461656431353662352f62386330323032372d336263612d343562302d613435652d336138393935633038643538/) ### プログラム #### 送信側 ```html #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++) // attemptを1桁づつ初期化(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単線|アマゾン|