DreamerDreamのブログ

夢想家の夢です。〜揚げたてのモヤっとしたものをラフレシアと共に〜

3Dプリンターを使ってスマートロックを自作する ⑤スマートロック制御方法の構想

前回、ハードウェアの実験はクリアできました。

dreamerdream.hateblo.jp

 

今回はスマートロックを制御する具体的な方法を考えていきます。

 

ICカードや各種Webサービス(GoogleHome等)を利用してスマートロックを作成されておられる方を拝見しましたが、個人でVPSサーバーを契約している者としてはこれを利用しない手は無いでしょう。

 

このようなイメージです。

f:id:DreamerDream:20210616120103p:plain

何故直接制御器の自宅サーバーへ直接アクセスしないのかというと、自宅に近づくとスマホが自宅のWi-Fiを拾ってしまい室内では屋外と同じアドレスから自宅サーバーにアクセス出来なくなるためです。

(※屋外だと「hogehoge.com」で接続できるけど、家の中からは「192.168.1.100」のようなアドレスになる)

 

接続環境によってアクセスページを変更するのは非常に面倒なので、自宅にいてもVPS経由でラズパイサーバーにアクセスさせることにします。回りくどいですが操作が楽です。

 

物理的な部分

室内側の物理的な装置は、スマートロッック機構とドアの開閉を感知するマグネットセンサー、ドアの開閉や案内をお知らせするためのスピーカー、物理的な施錠解錠スイッチを想定。

あとはカメラやモニター、室内から取っ手に手をかけたら自動で解錠させるようにするは赤外線センサーやタッチセンサー、屋外から解錠するにはICカードリーダーや指紋センサーやテンキー等も使えますね。いろいろ考えると面白いです。

ひとまずのゴールとしてスマホからWEB経由で施錠解錠を目指します。

 

制御パネルには「施錠」「解錠」ボタンと「オートロックの設定解除」ボタンが必要。タッチパネル式にするか物理ボタンにするか、それとも制御器は隠してタブレットで操作するか・・・悩みどころ

履歴には「何を使って施錠解錠操作をしたのか?」という記録とドアの開閉時間を記録することは必須。場合によってはメールで警告を発信。

 

GPIOからサーボモーターへのPWM制御にはpigpioライブラリを使うことにしました。

pigpiodがsystemdサービスで自動起動しない /etc/rc.localに登録して自動起動させる - DreamerDreamのブログ

 

アプリ

WEBアプリ自体はDjangoを使えばユーザー管理までサクッと作れそうです。

dreamerdream.hateblo.jp

 

①スマホからVPSにアクセス

②VPSは自宅のラズパイサーバーにアクセスして

  • 現在アクセスが可能か?
  • 前回の動き(サムターン自体を監視しないので)から施錠中か解錠中かの情報を取得して表示

③スマホの操作をラズパイに伝達

④ラズパイからの応答をスマホに返す

という風に、VPSはWEBアプリとラズパイサーバーの中継を担当させます。

 

通信

VPSサーバーまではSSL通信を行なう。

VPSからラズパイへはSocket通信とし、通信の為にオリジナルのプロトコルを作成する。

(SSLSocket通信という手段もあるけど、ブラウザやアプリ経由では無いし通信相手が決まっていてデータも単純なのでオリジナル暗号化で対応します)

接続&通信は全て暗号化して行なう。

 

個人宅なのでそんな厳重にする必要は無いでしょうけれど、やはりセキュリティーに配慮するに超した事はないのでこのような型にします。

 

次回はSocket通信をセキュアに行う方法を考えていきます。

dreamerdream.hateblo.jp

 

 

 

3Dプリンターを使ってスマートロックを自作する ④実動試験

前回ギアボックスを作って動作が良好でしたので、実際に使うことになるであろうケーブル長のケーブルを用意して実験することにしました。

dreamerdream.hateblo.jp

 

<前回の実験>

youtu.be

 

実はこのスマートロックは設計無しの思いつきで始めたので実際の制御機は現時点で全く考えていません。

 

ただ、電池ではなく外部電源から稼動させたいのでイメージ的にはこんな感じにする予定です↓(ざっくり)

f:id:DreamerDream:20210616085637p:plain

スマートロック機構から制御器まで結構長いケーブルが必要になります。

長いケーブルは手軽な手元にあるLANケーブルを使いたいのですがその際に

  • PWM信号が送れるのか?
  • 電力線として機能するのか?

ということが心配されます。

 

玄関の凸凹に会わせてスケーラーで測った結果、ケーブルが約10mぐらいあれば足りるようでしたので10mのLANケーブルを用意し、コネクタをぶった切って実験しました。(下に実験動画があります)

 

実験

まず、通常のジャンプワイヤーにて問題無く動くことを確認します。

次にCAT6対応のフラットLANケーブルにPWM信号線だけ通します。

これも問題無く動きます。高速通信線なので当然です。

 

しかし、フラットケーブルの芯は細いより線で作られた構造のもので、実験の結果サーボモーターへの電力供給は実質不可能でした。

(より線に実験しやすいようすずメッキ線をハンダ付けしています)

f:id:DreamerDream:20210616090739p:plain

このケーブルがそのまま使えたら色も配線も簡単な話だったのですが・・・

2本3本と束ねてみてもダメでしたorz。コネクタぶった切ったことに後悔。。。

残念です。

 

次に、CAT5E対応の単線構造のLANケーブルを用意しました。

f:id:DreamerDream:20210616091329p:plain

色も型も後から目立たないように加工が必要です。

f:id:DreamerDream:20210616091339p:plain

1本の芯が0.6mmもあるので取り回しも面倒そうです。

 

実験の結果、10mだとこの線を2本使って電力供給することでしっかりと動作することが判明しました(1本でも動くけど、実際に鍵を回すとなるとパワー不足に陥ることが判明、結果的に+ー共に2本必要でした)。

youtu.be

 

実際にサムターンを回してみました。大成功です!

youtu.be

 

しかし、下のサムターンを回そうとすると・・・上のサムターンより若干固いらしく回りません!問題発生です。

youtu.be

 

試しにSG90の偽物にしたら・・・余計に回らないことに。。。orz

youtu.be

<SG90の本物と偽物の比較>

dreamerdream.hateblo.jp

過去記事で「偽物でも割と使えそう」と書いていましたが、実験でどうやら偽物はパワーが本物より弱かったことが判明しました。 

動画では残っていませんが、本物の方は解錠動作だけは辛うじて回るようですが偽物はとても回る気配がありません。

 

そこで、SG90の強化版サーボモーターSG92Rに組み替えたところ、今度は見事に成功しました!

youtu.be

SG92RはSG90とほとんどサイズは一緒なので3Dプリンターの出力モデルを変更することなくそのままSG90と同じマウントのまま使えました。

マイクロサーボ SG92R (1個)

マイクロサーボ SG92R (1個)

  • TOWER PRO(タワープロ)
Amazon

 

SG92Rのサイズ感に関しては過去記事参考↓ 

dreamerdream.hateblo.jp

 

 

次回、このサーボモーターを制御する方法を考えます。

dreamerdream.hateblo.jp

 

 

3Dプリンターを使ってスマートロックを自作する ③ギアボックス作る

前回の実験で、いい感じで鍵が回ることと取っ手の間に本体が納まりそうだということが確認出来ました。

dreamerdream.hateblo.jp

 

今回はギアボックスを作成していきます。

f:id:DreamerDream:20210605085554p:plain

この部分にピッタリ収めたら見た目がスッキリします。

 

 

ギアとギアの隙間、部品同士の結合と3Dプリンターの誤差と強度も考慮して0.1mm単位でサイズを詰めていきます。

f:id:DreamerDream:20210605091623p:plain

 

何度もトライ&エラーです。(最初の殴り書きのメモは自分にしか解らん自信があります)

f:id:DreamerDream:20210605091703p:plain

実際に作って動かして補強したり仕様変更したり、不満な部分を自分で後から加工し直さなくても設計の変更だけしておけば他の用事をしている間に新しく部品を出力してくれる。こういった作り方は3Dプリンターの成せる技ですね。非常に頼もしい存在です。

 

 

モーター部分を収めるボックスです。

やはり少し出っ張りますが取っ手の邪魔にはならずイイ感じにフィットしています。
f:id:DreamerDream:20210605091549p:plain

 

ギアボックスが出来た事で、これが↓

youtu.be

こうなりました↓

youtu.be

イイ感じで動いています。

 

白色フィラメントの在庫が多かったので試験的に使いましたが流石に白色だと目立ってしまうので本番は目立たないように色を変えて作ります。

f:id:DreamerDream:20210605093132p:plain

やはり黒色の方が粗が目立たず綺麗に見えますね(出力品の精度自体は同じです)。

 

次回、実際に動かしてみます。

dreamerdream.hateblo.jp

 

 

 

3Dプリンターを使ってスマートロックを自作する ②鍵を回す機構を考える

前回、サーボモーターをギア化しましたので今度はサムターンを回す部分を作成します。

<前回記事>

dreamerdream.hateblo.jp

 

構想 

サーボモーターからの動力を直接鍵に入力するには、下のピンクのような部品を作るという方法が一番簡単な方法です。

ギアと鍵がぴったり合う部品の例↓

f:id:DreamerDream:20210604093012p:plain

しかし、これだと手動で鍵を回す時にはサーボモーターも一緒に回さなくてはいけないので力が必要になるのと、サーボへの逆入力になるのでサーボ内のギアを破壊してしまう恐れもあります。

 

 

そこで、下図のような鍵を回す部品を作ります。

施錠後、解錠後には青色のポジションに常に戻るようにします。

<施錠>

f:id:DreamerDream:20210604093023p:plain

<解錠>

f:id:DreamerDream:20210604093032p:plain

常に青色の状態に戻すことで手動でもモーターの抵抗を受けること無く施錠解錠作業が行なえます

 

作成

設計したのがこのモデルです。

f:id:DreamerDream:20210604093850p:plain

 

鍵の出っ張り部分を軸として回るように蓋のようにパコッと覆うだけです。

f:id:DreamerDream:20210604094056p:plain

こうなります。

f:id:DreamerDream:20210605084726p:plain

サムターンは基本的に手動で回す事を想定しているので出来るだけ鍵には部品がかからないよう、実際鍵に引っかかる部分は約2mm程度に抑えました。

 

手動で開閉実験 

youtu.be

鍵周囲の出っ張りを軸にしていい感じに回転してくれています。

モーターでもこんな感じで動けば良いなーというイメージが湧いてきます。

 

丁度鍵と取っ手の部分の間のスペースで2つのギアが納まりそうなことも確認できました。

f:id:DreamerDream:20210605085554p:plain

 

次回、ギアボックスの作成をしていきます。

dreamerdream.hateblo.jp

 

 

3Dプリンターを使ってスマートロックを自作する ①サーボモーターのマウント方法を考える

スマホやICカードから自宅の鍵の開閉を行なうスマートロックという商品が沢山あります。

 

 

 

スマートロックは例えば、

  • 手荷物がいっぱいのとき、事前に鍵を開けておいたり近づいたときに開けるようにする。
  • 遠隔で施錠の確認をする。
  • 緊急時に自宅へ鍵を持たない誰かに荷物を取りに行ってもらったり留守中にペットの餌やりをお願いする時に遠隔で操作する。
  • 就寝時等、時間になったら鍵が自動で閉まるようにする。
  • 外に出たら勝手に鍵が閉まるようにする(オートロック)。
  • 子供に物理的な鍵を持ち歩かせたくない。

こんな用途で使えます。

 

 

便利な道具なのですが、そのまま玄関に使うとなると色々と不安や不満な要素もあります。

  • 壊れた場合に手動で解錠できるのだろうか?
  • 連携サービスが終了しちゃったら操作できるのだろうか?
  • サーバーの不正アクセスで操作されない?
  • 作成販売会社は信用できる?(どこの誰が使ってるか把握出来ると悪意がある作成販売者なら自宅に押しかけて任意に操作できてしまうのでは?)
  • 後付け感が否めない(目立つ)
  • 電池交換が面倒くさい

 

加えて僕の玄関が上下のダブルロックなので、いざ付けるとなると2つ取り付けて連携が必要です。

f:id:DreamerDream:20210602124438p:plain

f:id:DreamerDream:20210602124423p:plain

2つも付けて毎回電池交換するのは面倒くさいし、高い!

 

・・・いろいろ考えると納得出来る理想的な型にするはやはり「自作」するしかありませんよね!(自作してみたいだけだったりする・・・)

 

<スマートロックを自作するメリット>

dreamerdream.hateblo.jp

 

 

自作にはまずモーターの選定が必要です。

たまたまですが、手元に電子工作では言わずと知れたマイクロサーボモーター、WOWER PROのSG90が1つありました。 

この頼りなく見えるちっこいサーボモーターで鍵が回るのか?とりあえずテープを貼付けてArduinoで制御して実験しましたら鍵を回す程度のパワーは充分あるようです。小さいのにすごい!

youtu.be

今までサーボモーターの実験をしたことはありますが、実際に工作でサーボモーターを使うのは今回が初めてです。 

dreamerdream.hateblo.jp

 

SG90は類似品(コピー商品)も安く大量に出品されています。

 

制御角度の精度を求めない今回の用途であればコピー品でも特に問題は無いでしょう。

実験で壊す可能性もあるのでとりあえず安いのをポチりました。

 

実はスマートロックは過去にNinjaLockというものを分解してみたこともあります。

dreamerdream.hateblo.jp

 

この分解レポートで用いられていましたモーターは逆入力不可能なDCモーターでした(つまり、モーターから鍵を回すことはできるけど、逆に鍵側を回してモーターを動かすことは出来ない)が、マイクロサーボモーターであれば最悪壊れた場合でも通常の鍵を使って手動でサーボを逆入力で回して鍵を開けるということも可能です。

 

作成準備

 

3Dプリンターを使って鍵とモーターがしっかりマウント出来るように型を作ります。

(3Dプリンターでベースとなるスペースのサイズを実際に作成して鍵と取っ手の間ピッタリに納まるように確認中)

f:id:DreamerDream:20210602143946p:plain

これがきちんと型に納まらないと最終的にギアボックスが出っ張って不細工になります。

 

機構の構想

「スマートロックの自作」で検索すると、よくこのような工作例が出て来ます。

f:id:DreamerDream:20210602145456p:plain

これはシンプルで設計が簡単、モーター直結なのでメンテナンスも楽というメリットがありますが、反面鍵が手前に出っ張ってしまうことと、何かしらエラーの際にサーボと支柱が邪魔で本来のサムターンを手動で回すという動作が難しくなることが難点、何より見た目が問題です。

 

そこで、今回はサーボモーターを鍵と横並びに配置し、ギアを使って伝達させる構造を取ります。

f:id:DreamerDream:20210602145507p:plain

ギアを作るのが手間ですが、この方法だと元の鍵を手で回すことは容易です。

実際にモデリングしてみると思ったよりモーターが出っ張ってしまったので図のようにはいかなかったのですが、頑張って小さく収めるという意気込みだけでこの方法を採用することにしました。

 

 

ひとまずBlenderでステッピングモーターが中に納まるようなギアを設計してみます。

f:id:DreamerDream:20210602125710p:plain

Blender↓入門書

dreamerdream.hateblo.jp

 

一通り設計したらとりあえず3Dプリントします。

f:id:DreamerDream:20210604085629p:plain

 

モーターが狙い通りピッタリとギアの中に収まりました。

f:id:DreamerDream:20210604085652p:plain

 

3Dプリンターの良いところは、とりあえず設計→出力→実験までが短期間で出来ることです。  

動作テスト

youtu.be

 

多少ガタツキがあるようですが、ガッチリ固定しなくても差し込んでるだけで充分ギアとして機能するようなのでOK!このまま次に進みます。

 

次回はサムターンをどうやって回すか?です。 

dreamerdream.hateblo.jp

 

 

超音波センサーモジュールをPICを使って人感センサーにする 備忘録

超音波センサモジュール「HC-SR04」が手に入ったので使ってみました。

 

しかし、このモジュール不具合品が含まれることで有名なもので手元にあるものを調べてみました。

mag.switch-science.com

 

あらら、見事に不具合品に合致します。

テストしても確かにモジュールの電源を入れ直さないと連続して距離が測れないので、今回使おうとしている用途では全く使い物になりません。

大した消費電力ではないのでマイコンのピンから直接電源が取れないかと試しましたが駄目でした。

 

不具合の修正方法が投稿されています。

<参考>

超音波距離センサーモジュール「HC-SR04」回路不具合の修正

 

参考サイトに習ってR1の抵抗を外し、

 

外した抵抗を再利用してGNDへプルダウンしました。

結果、手元のモジュールではこの方法では駄目でした。

 

仕方がないので別のモジュールを使うことにしました。

こちらは不具合無しのものです。

現行で売られているものはほとんど不具合無しのモデルのようです(当たり前か)。

 

 

 

使い方は簡単です。

5V電源とGNDを繋いで起動。

Trig端子を10マイクロ秒だけHIレベルにします。

するとモジュールから超音波が出て、反射した音波が帰ってくる時間に応じてEcho端子がHIレベルになります。

Echo端子がHIレベルになっている時間をマイコンで計測して結果を文字に出したりするだけです。

Web上にサンプルも多く出ているので特にここでは記述しなくても良いでしょう。

 

今回はこのモジュールを激安マイコン「PIC10F222」で制御して人感センサーとする目論見です。

<過去記事参考>

dreamerdream.hateblo.jp

 

 

まずはPICに移植できるコードをArduinoで書いてみます。

ArduinoにはEcho端子のHIレベルを計測するのに便利なpulseIn()関数が用意されていますが、PICには無いので自前で用意しないといけません。

PIC10Fシリーズは小規模なマイコンなのでArduinoのように多大なメモリ領域が使えません。それにスタック領域も2つ、つまり関数の呼び出せる層が2つだけなのでロジックを組むにも少し工夫が必要です。変数も0~255までのunsigned charを出来るだけ使いまわして省メモリ化します。

その代わり超省エネで回路が簡単、単純な動作をさせるにはオススメのマイコンです。

 

ArduinoはUSBで簡単に書き換えられるのでPICに比べて動作確認はめちゃめちゃ楽ですのでPIC用コードを実際に書く前のロジックの確認用としてかなり使えます。

クソコードですがArduino用コード

unsigned char TRIG = 3;
unsigned char ECHO = 2;
unsigned char LED = 4;
unsigned int cnt_avl = 0;

void setup() {
  Serial.begin( 9600 );

  pinMode(ECHO, INPUT );
  pinMode(TRIG, OUTPUT );
  pinMode(LED, OUTPUT );
 

}

unsigned char getCnt(){

  digitalWrite(TRIG, LOW); 
  delayMicroseconds(2);
  digitalWrite( TRIG, HIGH );
  delayMicroseconds( 10 ); 
  digitalWrite( TRIG, LOW );
  unsigned char cnt = 0;


  //cnt = pulseIn( ECHO, HIGH ); // 往復にかかった時間が返却される[マイクロ秒]
  
  while( digitalRead( ECHO ) == 0 ){
    delayMicroseconds( 10 );
    cnt++;
    if( 254 < cnt){
      break;
    }
  }
  cnt = 0;
  while( digitalRead( ECHO ) == 1 ){
    delayMicroseconds( 40 );
    cnt++;
    if( 254 < cnt){
      delay(20);
      break;
    }
  }
  
  return cnt;
}

void loop() {
  unsigned char scale = getCnt();

  if( scale < cnt_avl - cnt_avl/10 ){
    digitalWrite( LED, HIGH );
    Serial.println("Active!!");
    delay( 10000 );
    digitalWrite( LED, LOW );
  }

  if( scale != 0 && scale != 255 ){
    cnt_avl = ( scale + cnt_avl )/2;
  }
  Serial.print("cnt: ");
  Serial.print( cnt_avl );
  Serial.println("cnt");
    
  delay(300);
  
}

 

「0.3秒ごとに計測し、待機状態の1/10以上の反射時間が短くなる変化(物体が近くなったり横切ったりする変化)があれば10秒間スイッチをONにする。」だけの動作です。

 

これを、この回路のPICへ移植します。

 

動作は「センサーが反応すると10秒間GP1とGP2のHIとLOが入れ違う」だけです。

 

やっつけ感満載の基板ですが完成。

当たり前だけどArduinoより遥かにシンプルですね^^vマイコンの動作だけだとPICとパスコンだけで完結しています。こんな単純な回路で充分動くのがPICの良いところ。

 

プログラムはMPLABの出番です。流石に古い…(WindowsXP)

PIC10F222用に移植したコード

#include  <pic.h>

/*****  コンフィギュレーションの設定  ********/
//__CONFIG( OSC_IntRC & CP_OFF & WDT_OFF & MCLRE_OFF );
//オシレータ種類 & コードプロテクト & ウォッチドックタイマ & リセットピン
//内部4MHz
// file:///C:/Program%20Files/Microchip/xc8/v1.30/docs/chips/10f222.html

//MCLRE = ON : ResetPin  OFF: GPIO Pin

#pragma config MCLRE = OFF, WDTE = OFF, IOSCFS = 4MHZ, CP = OFF, MCPU = OFF

#define _XTAL_FREQ 4000000     //CPU4MHz設定delay関数用。
// #define FOSC 4000000L

#define Led GP0
#define Out GP1
#define Trig GP2
#define Echo GP3 // GP3: input only

unsigned char i = 0;
unsigned char cnt_1ms =0;
unsigned char cnt_100ms =0;
unsigned char cnt_10s =0;

unsigned int cnt_avl =0;


/* initial */
void init_com(void){
   /*STATUS
    bit 7:ピン変化によるウェイクアップ(GP0, GP1, GP3) 0:電源投入時リセット 1:ピン変化リセット
    bit 6:Non
    bit 5:Non
    bit 4:タイムアウト0 WDT 1電源投入 
    bit 3:パワーダウン 0sleep命令 1電源投入
    bit 2:ゼロビット 0算術演算結果が0以外 1結果が0 
    bit 1:デジットキャリー・ボロー 0キャリー発生なし、ボロー発生あり 1逆 
    bit 0:キャリー 0 1 
    */
    STATUS =0b00000000;

    /**  OPTION
    bit 7 :ピン変化によるウェイクアップGP0 GP1 GP3 0有効 1無効
    bit 6 :弱プルアップ 0有効 1無効
    bit 5 :タイマ0クロックソース 0内部 1T0CKIピン
    bit 4 :タイマ0ソースエッジ 0 L->H 1 H->L
    bit 3 :ぷリスケーら 0 タイマ0 1 WDT
    bit 2-0 :ぷリスケーらレート選択 0 1
    **/
    OPTION = 0b10000000;

    ADCON0 = 0b00001111; //0 Analog 1 digital

    TRIS = 0b11111000; //出力:0 入力:1  (GP3は入力のみ)
    GPIO = 0b00000010;

    //TRISが未対応らしいのでインラインアセンブラで記述
    //asm("movlw 0x0B");    
    //asm("TRIS 6");
}

/* wait (0 - 255) m secound */
void delay_1ms(unsigned char cnt){
    for(cnt_1ms = 0 ;cnt_1ms < cnt; cnt_1ms++){
        __delay_ms(1);
    }
}

/* wait (0 - 255) *100m secound */
void delay_100ms(unsigned char cnt){
    for(cnt_100ms = 0 ;cnt_100ms < cnt; cnt_100ms++){
        __delay_ms(100);
    }
}

/* wait (0 - 255) *100m secound */
void delay_10s(unsigned char cnt){
    for(cnt_10s = 0 ;cnt_10s < cnt; cnt_10s++){
        delay_100ms( 100 );
    }
}

unsigned char getCnt(){
   Trig = 0;
   __delay_us(2);
   Trig = 1;
   __delay_us(10);
   Trig = 0;

   unsigned char cnt = 0;
   while( Echo == 0 ){
        __delay_us( 10 );
        cnt++;
        if( 254 < cnt){
             break;
        }
    }
    cnt = 0;
    while( Echo == 1 ){
        __delay_us( 40 );
        cnt++;
        if( 254 < cnt){
             break;
        }
    }
    return cnt;
}

/* main */
//Led Out Trig Echo
void main(void){
    init_com();

    while( 1 ){
        Led = 0;
        Out = 1;

        unsigned char scale = getCnt();
        if( scale < cnt_avl - cnt_avl/10){
            Led = 1;
            Out = 0;
            delay_10s(1);
            Led = 0;
            Out = 1;
        }
        if(scale != 0 && scale != 255){
            cnt_avl = ( scale + cnt_avl )/2;
        }


        delay_100ms( 3 );
    }

}

PICはチップ自体は安く済むけれど殆どの便利な関数は自前で用意しないといけませんしコンフィギュレーション設定がマイコン毎や設計回路ごとに変わるのでコードを書くのは実に面倒です。(それでもアセンブラで組むよりは遥かにマシです。)

Arduinoはこのややこしい部分を取っ払ってしまっているのですごく入門しやすい親切設計ですね。

 

とりあえずは狙い通りに動きました。

人が横切ると反応します。

感度調整は状況に応じてコード内の

if( scale < cnt_avl - cnt_avl/10){

の変化率「/10」のところを弄るだけですね。ボリュームで調整できるようにしたらさらに使いやすくなりますが設置箇所は固定なので今回は不要。

 

超音波式の人感センサーは自動ドア等でよく見られる方式で焦電型の人感センサーより屋外での使用には強いはずですが、こういった人感センサー的な設計の超音波モジュールは電子部品として見当たりませんね。何か理由があるのでしょうかね?

 

 

 

実際に使えるかどうかは実運用で試してみることにします。

今回は以上です。

 

 

RaspberryPiからLCDのバックライトを操作する方法 備忘録

とある事情でLCDディスプレイを手に入れたので使ってみます。

 

16文字×2行のしょぼいやつです。

 

以前に使った有機ELディスプレイのほうが文字数も機能も多いです。

dreamerdream.hateblo.jp

 

低機能ですが表示するものが少なければ用途は足りるし文字も大きいので見やすく、LCDを薄くして小型化する必要の無いものであれば充分でしょうし、調べてみると特に何もインストールする必要もなく使えるそうなのでお手軽ですね。

 

<参考>

hellobreak.net

 

参考サイトの通り、まずはI2Cデバイスを有効にします。

sudo raspi-config

コマンドでラズパイの設定画面に入り、インターフェースから

I2Cデバイスを有効にします。

念の為再起動。

sudo reboot

 

 

配線も参考サイトの通り、電源とSDA/SCL線の4線を間違えないように配線するだけです。

 

参考サイトの通り

 $sudo i2cdetect -y 1

と打つ。

 

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f

00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 

10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 

20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 

30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 3f 

40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 

50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 

60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 

 

 

「3f」が僕のディスプレイのアドレス

 

wget http://osoyoo.com/driver/i2clcda.py

 

でosoyoooのサンプルプログラムをダウンロードして、

ダウンロードしたi2clcda.pyファイルを先程確認したアドレスに変更。

 

python3 i2clcda.py

でサンプルコードを動かしたら、LCDコントローラーのLCD濃淡調整ボリュームを弄って文字が見えるようにします。

無事に表示されたので、オリジナル文字を表示してみます。

 

test.py

import i2clcda as lcd

 

lcd.lcd_init()

lcd.lcd_string("HELLO", lcd.LCD_LINE_1)

lcd.lcd_string("1234567890123456", lcd.LCD_LINE_2)

実行!!

ちゃんと指示どうりに表示されます。簡単ですね。

 

さて、問題はバックライトです。

バックライト点灯しっぱなしだとLED寿命も気になりますし、消費電力も無駄になります。画面に表示するものが無い時はできれば消えてほしいものです。

LCDコントローラーに付属のピンを抜くと消えるそうですが、物理的に消すよりプログラム的に消せないのか?とサンプルプログラムを見ていると、設定項目にそれらしきものがありました。

 

なるほど、消したい時はこの値をどこかに入れれば良いみたいですね。

 

サンプルコードを見てみると、どうやらビット処理したら出来るっぽいことを発見。

 

サンプルコードの i2clcda.py に以下を追加

def backlight( light = True ):

  On  = 0x08  # LED On

  Off = 0x00  # LED Off

  if light:

    light = On

  else:

    light = Off

 

  bits_high = LCD_CMD | light

  bits_low = LCD_CMD | light

 

  # High bits

  bus.write_byte(I2C_ADDR, bits_high)

  lcd_toggle_enable(bits_high)

 

  # Low bits

  bus.write_byte(I2C_ADDR, bits_low)

  lcd_toggle_enable(bits_low)

 

backlight( True )でON,backlight( False )でOFFになる設定だけLCDに送るコードです。

で、同サンプルコードのmainにbacklight(False)を追記しました。

def main():

  # Main program block

  # Initialise display

  lcd_init()

  while True:

    # Send some test

    lcd_string("Created by         <",LCD_LINE_1)

    lcd_string("Osoyoo.com        <",LCD_LINE_2)

    time.sleep(3)

    # Send some more text

    lcd_string("> Tutorial Url:",LCD_LINE_1)

    lcd_string("> http://osoyoo.com",LCD_LINE_2)

    backlight(False)

    time.sleep(3)

 

実行!


www.youtube.com

 

きちんと動作しました!大成功です。

 

注意点は、[ 文字表示 → バックライトOFF ]という順番で操作することです。

逆だと、一瞬消えて文字表示した瞬間バックライトが点灯します。(文字表示のときに既にバックライトコードも盛り込むので)

これで情報を表示して、しばらく更新が無ければバックライトを消灯する。ということができますね^^

 

今回は以上です。

 

 

 

 

kampa.me