概要・基本構成
①ホームセンターにあるコンテナボックスに、arduino LCDディスプレイ キーパッド サーボモータを装着
②宅配ドライバーが荷物をコンテナボックスに配置し、ロックを行う
③荷物受け取り人は、暗証番号を入力してロックを解除する
間違えれば、ロックされたまま
解説
ユーチューブ ニコニコ動画 にて 構成解説動画を公開しています
ニコニコ動画
[https://www.nicovideo.jp/watch/sm43942718)
ポイント
●arduinoがキーパッド入力を読み取る
●入力情報を受信して、ロックモード、暗証番号受信処理、
解除モード、LCDディスプレイ表示指令、サーボモータへ指令
●Arduinoには5V ポケットリチウムイオンバッテリー、サーボモータには9V乾電池を使用
今回は,ホームセンタに売られているコンテナボックスをベースに、電動宅配ボックスを自作しました
サーボモータの取付
コンテナボックスの一部をリュータで削っておき、ねじ用の穴もあけておきます
白い部品は、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++) // 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単線 | アマゾン |
投稿者の人気記事
-
ProjectSR
さんが
2024/08/16
に
編集
をしました。
(メッセージ: 初版)
ログインしてコメントを投稿する