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⃣本体ハード 本体の外観はこのようになっています  サーボモータの取付 コンテナボックスの一部をリュータで削っておき、ねじ用の穴もあけておきます 白い部品は、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分で条件分岐を行う  ### プログラム #### 送信側 ```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単線|アマゾン|