ProjectSR が 2021年12月30日12時19分02秒 に編集
初版
タイトルの変更
タイマー式スマホ隔離ボックス 1号 タイムロッキングコンテナ自作
タグの変更
Arduino
スマホ依存症対策
タイムロッキングボックス自作
タイマープログラム
Youtube
ニコニコ動画
メイン画像の変更
記事種類の変更
製作品
Lチカの変更
本文の変更
スマートホン依存症向けにも使われているタイムロッキングコンテナを自作しました. 廃材と段ボールで構成されています. 構成を紹介します. 🔳知れる事 --- ◇ボックスの電子回路 ◇タイマーとロック用プログラム (箱は本当に参考程度) 解説動画 --- ユーチューブ ニコニコ動画 にて 解説もしています. どのような動作をされるか見たい方は,ご参照ください. **PV** @[youtube](https://www.youtube.com/watch?v=SJt7O5kXaKw) **タイマー式スマホ隔離ボックス 構成解説編** @[youtube](https://youtu.be/4NIgGpuOWDs) ### ニコニコ動画 [タイマー式スマホ隔離ボックス ](https://www.nicovideo.jp/watch/sm39225697) 🔳概要・基本構成 --- 動画でも話しておりますが,今回製作したスマホ隔離ボックスは, ・できるだけスマートホンを触れにくくする ・緊急事態にはこじ開けやすくする ために製作をいたしました. 2021年8月22日時点で,私が調べた限りですと,市販で売られておりますタイムロッキングボックスは クリアケースといった樹脂で販売されていることが多いです. 普段の生活から,こじ開けられないように強制的に隔離して遠ざける機能として, とても素晴らしい機能と思います. ですが,地震や火災など緊急事態の時には,すぐに取り出すことはできず,最悪壊すしかありません. その際,緊急時なので,パニックになっているので,焦って二次災害が発生することも考えられるので, できるだけ,取り出しやすい構成はできないかと考えました.  なので,今回DIYで1号機として,緊急時では箱を強制的にこじ開けやすくしつつ,普段の時は開けられないようにギリギリのところを考えたところ,普段の時は, 「この時間はスマホに触らないんだった」と利用者に再認識させやすくして,緊急事態の時は壊しても抵抗がない素材を使えば,システムとして割と良いものができるのではないかという考えで作成することにしました.  そこで,製作したのが今回の「スマホ隔離ボックス」です. こちらは,箱が段ボールで出来ており,段ボールの蓋はガムテープ,糊,両面テープなどで接着し, いざっていう時には,手でこじ開けられやすくしております.  また,利用者に意識づけを行う方法として,タイマー機能を設けており,LEDで開錠までの時間を表示しているほかに,RCサーボモータでロックする方法をとっております. 「せこいなぁ」と思われるかもしれませんが,ひとまず思い付きを具現化しておきたいと思って, 急遽製作しました. システムとして,未完成なところもありますので,今後改良を加えてゆきたいと思います.   回路図 --- 製作の上で,箱の製作は段ボールでなくても構いません.要は似た材質を探して,取り出しやすいように 好みで作成すればよいという事です. むしろ,タイマー+施錠を行うという,通常時に一定時間の間,スマホ利用者と隔離するためのシステムを 作成する方が肝になります.  タイマーの時間表示にはLEDで数字を表示させる4×7セグメントLEDがあります.  まずLEDですが,電極+のアノード,電極ーのカソードという2本の足があります. 電池等電圧を加える場合は,+をへアノード,ーをカソードへ接続しないとLEDは点灯しません.  7セグメントLEDは,LEDが7つありますが,アノード側またはカソード側のどちらかが共通でつながれており,共通ではない他方の極性をONまたはOFFで調整することで,特定のLEDだけ光らせるというものです. ↑の図は7を表示するときの,極性の状態と電流の流れのイメージを図示したものです.  そして今回使う4桁×7セグメントLEDは7セグメントがさらに4つあります. すると配線は7セグメントで8本×桁数4なので32本・・・ではないんですね. 実は常時各桁に電圧を加えるのではなく,各桁を順番に点灯させてゆく制御を行います. この制御を「ダイナミック点灯制御方式」といいます. ↑のgifにイメージですが,8021を4桁から1桁へ順番に表示する例を示しました.(拡大可能) 突然ですが,人は光を見た後に目を離せば,100ms以内は光が光っていると錯覚してしまうそうです. この錯覚を利用して,8021の表示1週分を100ms以内で回せば,常時点灯しているように見えるという,面白い方法をとっております.  ↑の図は,ポンチ絵ですが今回作成しましたボックスの回路図です. 4桁×7セグメントLEDには,時間表記で最大99分59秒が表示できますが, それを超えるとカンストしてしまいます. なので,場当たり的な対応ではありますが,LEDランプを4個設け,設定時間が100分を超えるごとに 点灯するランプが増える仕様にしました. これで,ボタンで押す場合は最大499分の設定が可能になります. また,PC側では499分59秒が最大設定時間になります. それ以上の時間も設定が可能ですが,回路の仕様上500分以上の時間を表示することができないので, 最大設定時間は上記の内容になっております.  セグメントLEDにそのままArduinoのピンへつなぐと,最悪過剰な電流が流れる恐れがあるため, 抵抗を設けておくとよいでしょう. 今回使用した,LEDは定格で200mAなので,その値以下にするため,最低でも150Ωを使うとよいでしょう. プログラム ---  現在,詳細資料を作成しておりますが,ざっくり解説しますと, voidloop内のswitch文で表示する時間(変数名timeDisp)を計算し,停止,カウントダウン,リセットの 処理を行います. そして,セグメントLEDへ表示するときも,switch文ないで計算,処理を行ったtimeDispを利用して,現在の表示時刻を算出し,for文で以前に説明しました8021表示を行うgifのように4桁分を順番に表示する処理を行います. その1週を,void loopでArduinoが起動している間に何週でも実行するという構成になっております. ```html:□Program #include <Servo.h> Servo myservo; int servosignal = 6; int servocont = A2; int readsignal = analogRead(servocont); //入力スイッチ int pinSwCnt = 13; int pinSwCnt2 = A0; int pinSwCntreset = A1; //LED用ピン int pin7A = 1; int pin7B = 3; int pin7C = 5; int pin7D = 7; int pin7E = 8; int pin7F = 2; int pin7G = 4; //7セグ桁制御 int pin7Dig1 = 12; int pin7Dig2 = 11; int pin7Dig3 = 10; int pin7Dig4 = 9; //時間操作判定 int swCntPrevState = 0; //1つ前のスイッチ状態 int sw_stop_launch = 0; //現在のスイッチ状態 int pushSingle = 0; //1回押された判定 //時間設定スイッチ関連 int swSetPrevState = 0; //1つ前のスイッチ状態 int swSetCurrState = 0; //現在のスイッチ状態 long timeStartSet; //時間設定 long timePrevCtUp; //リセットスイッチ int swReSetCurrState = 0; //時間 long timeNow; //現在時刻 long timeStart; //タイマー開始時刻 long timeStop; //一時停止時刻 int numUpEdge = 0; //立ち上がりエッジを検出した回数 int setTime = 10; //設定時刻(秒単位) int timeset = setTime; //スイッチ設定時刻 int timeDisp = setTime; //表示時刻 int numDisp[4]; //LEDに表示する数字 //各セグメント制御用変数 ダイナミック点灯制御 int i; /*voidloop内のタイマーモードswitch caseに使う変数 タイマー状態 0:初期 1:動作 2:完了 3:停止*/ int timefase=0; //時間設定用ボタンの関数 void up_time_disp() { if( timeDisp > 29999 ) timeDisp = 0; else timeDisp += 60; } /*void serial(){ //アルディーノの状態を確認したいときに,下記の様に使ってっください. Serial.print("timeNow "); Serial.print(timeNow); Serial.print("timeStop "); Serial.print(timeStop); Serial.print(" timestart "); Serial.print(timeStart); Serial.print(" timefase "); Serial.print(timefase); Serial.print(" i "); Serial.print(i); Serial.print(" timeDisp "); Serial.println(timeDisp); }*/ //100分LEDの点灯制御 void LED(){ if(12000>timeDisp && timeDisp>=6000){//100分超えた digitalWrite(A2,HIGH); digitalWrite(A3,LOW); digitalWrite(A4,LOW); digitalWrite(A5,LOW); } else if(18000>timeDisp && timeDisp>=12000){//200分超えた digitalWrite(A2,HIGH); digitalWrite(A3,HIGH); digitalWrite(A4,LOW); digitalWrite(A5,LOW); } else if(24000>timeDisp && timeDisp>=18000){//300分超えた digitalWrite(A2,HIGH); digitalWrite(A3,HIGH); digitalWrite(A4,HIGH); digitalWrite(A5,LOW); } else if(timeDisp>=24000){//400分超えた digitalWrite(A2,HIGH); digitalWrite(A3,HIGH); digitalWrite(A4,HIGH); digitalWrite(A5,HIGH); } else {//100分未満 digitalWrite(A2,LOW); digitalWrite(A3,LOW); digitalWrite(A4,LOW); digitalWrite(A5,LOW); } } void setup() { //入出力の初期化 pinMode(pinSwCnt, INPUT); pinMode(pinSwCnt2, INPUT); pinMode(pinSwCntreset, INPUT); pinMode(pin7A, OUTPUT); pinMode(pin7B, OUTPUT); pinMode(pin7C, OUTPUT); pinMode(pin7D, OUTPUT); pinMode(pin7E, OUTPUT); pinMode(pin7F, OUTPUT); pinMode(pin7G, OUTPUT); pinMode(pin7Dig1, OUTPUT); pinMode(pin7Dig2, OUTPUT); pinMode(pin7Dig3, OUTPUT); pinMode(pin7Dig4, OUTPUT); pinMode(A2, OUTPUT); pinMode(A3, OUTPUT); pinMode(A4, OUTPUT); pinMode(A5, OUTPUT); myservo.attach(servosignal); //Serial.begin(9600); } void loop() { //現在時刻の取得 timeNow = millis(); //時間操作スイッチ立ち上がりエッジ検出 //現在のONOFFのスイッチ状態 sw_stop_launch = digitalRead(pinSwCnt); //現在のスイッチ状態と一つ前のスイッチ状態を比較 if(sw_stop_launch==HIGH && sw_stop_launch!=swCntPrevState) { pushSingle = 1; } swCntPrevState = sw_stop_launch; //リセットボタンの読み込み ピンからの信号を読み取る swReSetCurrState = digitalRead(pinSwCntreset); //タイマー動作状態を4段階に分ける switch(timefase){ //動作 case 1: myservo.write(0); //開始時刻と現在時刻の差が表示時刻 timeDisp = timeset -( (timeNow-timeStart)/1000 ); if(pushSingle == 1){ timefase = 3; timeStop = timeNow; } else if((timeNow-timeStart)/1000>=(timeset)){ timefase = 2; } break; //完了 case 2: myservo.write(85); timeDisp = 0; if(pushSingle==1){ timefase = 0; timeDisp = setTime; } break; //停止 case 3: myservo.write(0); //開始時刻と停止時刻の差が表示時刻 timeDisp = timeset -((timeStop-timeStart)/1000); if(pushSingle == 1){ timefase = 1; timeStart = timeNow - (timeStop-timeStart); } else if(swReSetCurrState==1){ timefase = 0; timeDisp = timeset; } break; //初期 default: myservo.write(85); if(pushSingle == 1){ timefase = 1; timeset = timeDisp; timeStart = timeNow; } else if(swReSetCurrState==1){ timefase = 0; timeDisp = timeset; } if( timeDisp > 29999 ) //settimeが29999秒を超えるようなら,デフォルトはLED4個点灯と9959を表示 timeDisp = 0; break; } pushSingle = 0; /*//⇓動作中はswithch文内でループしているのかそれともvoidloop内でループしているかの確認と現在の状態の確認を行う if(timefase == 2 || timefase == 0) { serial(); myservo.write(0); } else{ serial(); myservo.write(85); }*/ //serial(); //時間設定スイッチ立ち上がりエッジ検出 swSetCurrState = digitalRead(pinSwCnt2); //現在の時間設定スイッチ状態を読み取る /*現在の時間設定スイッチ状態と一つ前のスイッチ状態を比較 つまり起動時やリセットボタンを押してタイマーが作動していない状態で時間設定ボタンが押されたら, 1分単位で増える*/ if(timefase==0 && swSetCurrState==HIGH && swSetCurrState!=swSetPrevState){ timeStartSet = timeNow; timePrevCtUp = timeNow; up_time_disp(); } //外付けLEDで30000秒 つまり499分まで使える関数 LED(); //一つ前の時間設定スイッチ状態を判定 swSetPrevState = swSetCurrState; //表示時刻をLEDの数字へ変更 %は剰余 つまり「余り」を表示 numDisp[0] = timeDisp % 10; numDisp[1] = (timeDisp % 60)/10; numDisp[2] = (timeDisp/60)%10; numDisp[3] = (timeDisp/600)%10; pushSingle = 0; //4桁×7セグLEDの制御 ダイナミック点灯制御 カソードコモン for(i=0; i<4; i++){ //カソード側制御 switch(i){ case 1: digitalWrite(pin7Dig4 , HIGH ); digitalWrite(pin7Dig3 , LOW ); digitalWrite(pin7Dig2 , HIGH ); digitalWrite(pin7Dig1 , HIGH ); break; case 2: digitalWrite(pin7Dig4 , HIGH ); digitalWrite(pin7Dig3 , HIGH ); digitalWrite(pin7Dig2 , LOW ); digitalWrite(pin7Dig1 , HIGH ); break; case 3: digitalWrite(pin7Dig4 , HIGH ); digitalWrite(pin7Dig3 , HIGH ); digitalWrite(pin7Dig2 , HIGH ); digitalWrite(pin7Dig1 , LOW ); break; default: digitalWrite(pin7Dig4 , LOW ); digitalWrite(pin7Dig3 , HIGH ); digitalWrite(pin7Dig2 , HIGH ); digitalWrite(pin7Dig1 , HIGH ); break; //アノード側の点灯制御部分 switch(numDisp[i]){ case 1: digitalWrite(pin7A , LOW ); digitalWrite(pin7B , HIGH ); digitalWrite(pin7C , HIGH ); digitalWrite(pin7D , LOW ); digitalWrite(pin7E , LOW ); digitalWrite(pin7F , LOW ); digitalWrite(pin7G , LOW ); break; case 2: digitalWrite(pin7A , HIGH ); digitalWrite(pin7B , HIGH ); digitalWrite(pin7C , LOW ); digitalWrite(pin7D , HIGH ); digitalWrite(pin7E , HIGH ); digitalWrite(pin7F , LOW ); digitalWrite(pin7G , HIGH ); break; case 3: digitalWrite(pin7A , HIGH ); digitalWrite(pin7B , HIGH ); digitalWrite(pin7C , HIGH ); digitalWrite(pin7D , HIGH ); digitalWrite(pin7E , LOW ); digitalWrite(pin7F , LOW ); digitalWrite(pin7G , HIGH ); break; case 4: digitalWrite(pin7A , LOW ); digitalWrite(pin7B , HIGH ); digitalWrite(pin7C , HIGH ); digitalWrite(pin7D , LOW ); digitalWrite(pin7E , LOW ); digitalWrite(pin7F , HIGH ); digitalWrite(pin7G , HIGH ); break; case 5: digitalWrite(pin7A , HIGH ); digitalWrite(pin7B , LOW ); digitalWrite(pin7C , HIGH ); digitalWrite(pin7D , HIGH ); digitalWrite(pin7E , LOW ); digitalWrite(pin7F , HIGH ); digitalWrite(pin7G , HIGH ); break; case 6: digitalWrite(pin7A , HIGH ); digitalWrite(pin7B , LOW ); digitalWrite(pin7C , HIGH ); digitalWrite(pin7D , HIGH ); digitalWrite(pin7E , HIGH ); digitalWrite(pin7F , HIGH ); digitalWrite(pin7G , HIGH ); break; case 7: digitalWrite(pin7A , HIGH ); digitalWrite(pin7B , HIGH ); digitalWrite(pin7C , HIGH ); digitalWrite(pin7D , LOW ); digitalWrite(pin7E , LOW ); digitalWrite(pin7F , HIGH ); digitalWrite(pin7G , LOW ); break; case 8: digitalWrite(pin7A , HIGH ); digitalWrite(pin7B , HIGH ); digitalWrite(pin7C , HIGH ); digitalWrite(pin7D , HIGH ); digitalWrite(pin7E , HIGH ); digitalWrite(pin7F , HIGH ); digitalWrite(pin7G , HIGH ); break; case 9: digitalWrite(pin7A , HIGH ); digitalWrite(pin7B , HIGH ); digitalWrite(pin7C , HIGH ); digitalWrite(pin7D , HIGH ); digitalWrite(pin7E , LOW ); digitalWrite(pin7F , HIGH ); digitalWrite(pin7G , HIGH ); break; default : //0 digitalWrite(pin7A , HIGH ); digitalWrite(pin7B , HIGH ); digitalWrite(pin7C , HIGH ); digitalWrite(pin7D , HIGH ); digitalWrite(pin7E , HIGH ); digitalWrite(pin7F , HIGH ); digitalWrite(pin7G , LOW ); break; } delay(5); } } ``` 参考文献 後閑哲也 著 電子工作の素 技術評論社 後閑哲也 著 PICマイコンの基礎 毎日コミュニケーションズ Arduinoで遊ぶブログ タイマー -第6回:スイッチでタイマー操作2(時間設定) http://play-arduino.seesaa.net/articl... プチモンテ 4桁7セグメントLEDの使い方 [Arduino] https://www.bing.com/search?q=%E3%83%... おもしろく、たのしく、Arduinoと戯れる おもろ家 Arduino 入門 Lesson 25 【4桁7セグメントLED編】https://omoroya.com/arduino-lesson25/ マルツパーツ LED基本ガイド LEDの基本を詳しく解説 https://www.marutsu.co.jp/pc/static/l... 電子部品 秋月電子 https://akizukidenshi.com/catalog/top... マルツパーツ https://www.marutsu.co.jp/ 千石電商 https://www.sengoku.co.jp/ amazon 4桁7セグメントLED https://www.amazon.co.jp/gp/product/B... 段ボール 近所のスーパー or 100円ショップ