なかなか記事を更新出来ずに申し訳ありません!
どうも,記事を更新するのことが久しぶりになってしまいました.一カ月ほど家を空ける用事が出来てしまい,スマート冷蔵庫の完成プログラムにコメントを付けたり,プログラムの使い方をまとめたスライドを作成するのがなかなか時間がかかってしまい,記事を更新できませんでした.出来るだけ早く,スマート冷蔵庫のまとめ記事を書きたいと思います.
まとめ記事の代わりではありませんが,このブログはスマート冷蔵庫の開発記録で記事をメインに今書いているため,世間における現在のスマート冷蔵庫の動向を少し書きたいと思います.
スマート冷蔵庫についてですが,私と同じように冷蔵庫の中を撮影するスマート冷蔵庫の製品が海外で発売されるようですね.
ドイツ「IFA2017」で見つけた!驚きのキッチン家電7選 [T-SITE]
サムスンのスマート冷蔵庫(FamilyHub)を私も以前から知っていて,冷蔵庫内に最初からカメラが設置されていて,それで中身を撮影し,クラウド?にアップロードして確認できるシステムになっています.冷蔵庫の中にカメラが3つついているため,数で冷蔵庫の中身全体の様子を撮影しているようですね.
ここでもう一つのスマート冷蔵庫の製品が私のアイデアと似ていた製品がSmaterのFridgeCamです.冷蔵庫をIoT化するのに冷蔵庫を買い替えるのは少しきついという方におすすめの製品になります.(サムスンのスマート冷蔵庫はめちゃくちゃ高いです...30~50万くらい)
FridgeCamはいま予約中で約100ポンド(約15000円くらい)だそうです.
FridgeCam 壁に貼り付けて使用するらしいです.そして,首が回るため,任意の場所を撮影するようにあらかじめ撮影したい場所に向けておくようですね.また,このカメラには食材を認識し,消費したかを判断する機能があるらしいです.そして食材がなくなったらスマホに通知をしてあげるという優れものらしいです.私のラズパイスマート冷蔵庫に同様な機能をのせてみたいです!!
電気はワイヤレスで3カ月もつバッテリーをもっているらしいです.低消費電力で設計されていますね.そして今後はAmazonのAlexaとの連携とかもあるらしいですよ.
私も頑張ってスマート冷蔵庫をもっと実用化させねばと思いました!
最後まで読んでいただきありがとうございました!
スマート冷蔵庫開発5:ラズベリーパイによるパワーLED点灯回路
最後のスマート冷蔵庫のまとめ記事を書く前に,今回の記事ではラズベリーパイによるパワーLED点灯回路を紹介します.
使用する部品
1W白色パワーLED OSW4XME1C1E−100: LED(発光ダイオード) 秋月電子通商 電子部品 ネット通販
パワーLEDを使う理由
通常のLEDだと,光量が足りず,撮影するのに冷蔵庫の中を十分照らせないため今回パワーLEDを使用しました.
下記のブログの記事はパワーLEDを使用するのにお世話になったものです.
Raspberry PIでLED点灯コントロール、Part1 パワーLEDとMOS FET | ものづくりエクスペリメント
回路構成
回路は以下のようになっています.作成したプログラム動作には光検出回路が含まれているため過去の記事を参考にしてください.
18Ωを並列に2本つなげている理由はパワーLEDの点灯のため大きな電流が流れるため,一つの抵抗にかかる電流を少なくしています.参考記事ではセメント抵抗などの耐圧が高いものを使用しています.私はセメント抵抗を持っていなかったため,並列回路を使用しました.欲しい抵抗値の2倍の抵抗を並列に接続すれば欲しい抵抗値になり,一つの抵抗にかかる電流は半分になります.
簡単な動作原理
FETはゲートに信号が入ればドレインとソースが導通するのでゲートにGPIOからの信号が入ったとき,ドレインとソースがつながりLEDが点灯します.逆に信号がオフになればドレインとソースが切断されるため,LEDはオフになります.パワーLEDは順電圧が3.3Vのため,5Vからの電圧でLEDを駆動させます.
作成プログラム
作成したプログラムは光検出回路にif文をつけて,暗くなったときのみ光るようになっています.そしてsleepで1秒点灯
if data < 1300:
GPIO.output(LED_pin , GPIO.HIGH) #led on
sleep(1)
GPIO.output(LED_pin , GPIO.LOW) #led off
gistf596bc104802df6e3a5359479ca141ae
点灯写真
かなり明るいのでデータシートに書かれていますが,直視しないようにして下さい.光量の調整は並列につなぐ抵抗値を変化させれば出来ます.
最後までお読みいただきありがとうございました!
スマート冷蔵庫開発4:メール送信プログラム
今回の記事では,冷蔵庫の中身を撮影した写真をスマートフォンやパソコンにメール送信するプログラムを解説します.
今回のメール送信プログラムは下記のサイトを参考に書きました.
送信側のgmail初期設定
メールを送信するプログラムはgmailを使って送信するため,送信側のgmailのセキュリティの設定を変更する必要があります.
googleのアカウント管理画面から
ログインとセキュリティの項目から,接続済みアプリとサイトを選択する.
安全性の低いアプリの許可を無効から有効に変更する.これでラズパイからgmailでメールが送信できるようにセキュリティの設定を行いました.
作成プログラム
下記のプログラムがメールを送信するプログラムになります.
gistc4a2b51574286e5f5bf11761e03c760b
プログラム解説
詳しいプログラム解説をしたいとこですが,私にはまだ参考サイトに書かれていたプログラムを完全に理解するのは困難であるため,すいませんが簡単な使い方だけを説明します....
15行目から19行目のプログラムについてです.
from_addr="example_Tx@gmail.com" #送信メールアドレス
to_addr ="example_Rx@gmail.com" #受信メールアドレス
subject = u'スマート冷蔵庫からのメールです' #メールの件名
body = u'\n%s\n' % (u'冷蔵庫の中の写真になります') #メールの本文の文章
jpegs = ['mail_test.jpg'] #添付する画像
それぞれコメントの通りの動作をするものとなっています.また,送りたい画像が複数ある場合にはjpegsを複数のリストにしてあげれば複数の画像を送信できます.
jpegs = ['mail_test1.jpg','mail_test2.jpg'] #mail_test1,2を送れる
そして42から43行目のプログラムです.
_user = "example_Tx@gmail.com"
_pass = "password"
送信する側のメールアドレスとgoogleアカウントのパスワードを書くようになっています.
以上が撮影した画像を添付し,メールで送信するプログラムになります.
ここまでで,スマート冷蔵庫のシステムで使用した主要なプログラムの説明は私なりに説明の記事を書いてみました.まだまだ私のプログラムの知識や回路の知識が足りない所も多く,記事を読んでいる方に大変申し訳ないです...
スマート冷蔵庫のプログラムは今まで紹介したプログラムを関数化してあり,メインプログラムを動かすだけで,他の関数化されたプログラムを呼び出す仕組みになっています.この後の記事としては,その関数化された全体のプログラムの動作の説明を行い,関数化されたプログラムをgithubにアップロードしたいと思います!
最後までお読みいただきありがとうございました.
スマート冷蔵庫開発3:パノラマ写真作成(2)
前回の記事の続きでスマート冷蔵庫のパノラマ写真のプログラムの解説をします.
以下のプログラムが元々のプログラムであるstitch.pyを変更し,作成したプログラムになります.
作成プログラム
gist46b35104c1f4f2dc3d5db73da1f56590
そして今回このプログラムのテスト動作として以下の3つの写真をつなげて一つの写真にしました.
この3枚の写真を使ってパノラマ写真を作成するプログラムの動作を説明します.今回テストに使用した画像もgithubにアップロードしました.
テスト用写真↓
https://github.com/Raspberry765/Smart_Frige_Raspi/tree/master/test_picture
まず,imageAとimageBにtest2.jpgとtest1.jpgを読み込ませます.
imageA = cv2.imread("test2.jpg") #test2.jpgを読み込む
imageB = cv2.imread("test1.jpg") #test1.jpgを読み込む
そしてstitcher()という関数を呼び出してimageAとimageBをくっつけます.
stitcher = Stitcher()
(preresult, vis) = stitcher.stitch([imageA, imageB], showMatches=True)
ここでの動作は以下の形で動いています.
左側の画像(imageA)に対して右側の画像(imageB)がくっつきます.パノラマ写真の1段階目の結果がpre_result.jpgになります.
次にpre_result.jpgとtest3.jpgの画像を左右反転させて以下のような形で同様に画像をくっつけます.
imageC = cv2.imread("pre_result.jpg") #pre_result.jpgを読み込む
imageD = cv2.imread("test3.jpg") #test3.jpgを読み込む
imageC = cv2.flip(imageC,1) #左右反転
imageD = cv2.flip(imageD,1) #左右反転
- test3.jpgの写真を右側から順番にくっつければいいのでは?
test3.jpgから順番に右側に接続していけばパノラマ写真はできるのですが,panorama写真の作る上でどうしても「ズレ」が生じてしまいます.
そのため,「ズレ」が生じた写真に対して写真をくっつけるとさらにズレてしまうため,中央の写真の両側から写真をくっつける処理を行いました.
以上がパノラマ写真を作成するプログラムの解説になります.最後まで読んでいただきありがとうございました!
スマート冷蔵庫開発3:パノラマ写真作成
今回の記事では冷蔵庫の中身を撮影した複数の写真を一枚のパノラマ写真にするシステムの説明をします.
最初にこの記事のプログラムを説明する前にパノラマ写真を作るためには画像処理ライブラリであるpythonのopen cvをダウンロードする必要があります.Open CVのダウンロードの仕方は様々あり,時間がかかります.後,SDカードに十分な容量があったほうがいいと思います.かなり容量が大きいです.私が参考にしたサイトは以下のものです.
他のサイトでもいろいろ紹介しているのですが,ものすごい時間がかかったり,途中で停止してしまうなどのトラブルがありました.このサイトで紹介されてる方法は60分ぐらいでインストールできました.もし,他にもっと早く手軽にインストールできる方法があれば教えてください!
そして二つ目なのですが,実は私が作ったパノラマ写真のプログラムは元のプログラムが存在します.以下のサイトで紹介されているプログラムを使用して冷蔵庫用に書き換えています.
私は,冷蔵庫の中を撮影して合成するためにパノラマ写真のプログラムについて調べており,様々なプログラムを実装してみたのですが,パノラマ写真自を作成する処理は非常に重く,長い時間(20分ぐらい?)を要します.しかしながら,上記のサイトで紹介されていたパノラマ写真を作成するプログラムは2~3分で作成することができるため今回使用させていただいています.オリジナルのプログラムは参考サイトから作者にメールするフォームがあるため,そこにメールアドレスを書きこめば,作者からサンプルコードのメールがとどきます. 以下の画像のようなファイル構造になっていると思われます.
panorama-stitchingの中に2つのディレクトリと一つのpythonプログ
ラムファイル
このstitch.pyというプログラムを変更して冷蔵庫用に変化させます.ここで,申し訳ありませんが,次回の記事で変更したプログラムの内容を説明します.少し,記事用に分かりやすくするため,パノラマ写真用のプログラムを分かりやすく変更しようと思います.それでは,最後までお読みいただきありがとうございました!
P.S
最近PyQというPythonのプログラムを習うブラウザー型学習サイトを利用し始めました.理由としては,実は私はまともにPythonの勉強をしたことがありません.いつもネットで調べてはコピペして,少し自分用にカスタマイズしての繰り返してした.大学の授業で少しC++をやったくらい.後は研究でMatlabを使っているくらいです.そのため,しかっりと勉強するために,今現在PyQで勉強中です.今後機会があればPyQのこともブログで書けたらいいなと思います.
アマゾンで購入したRasperryPi周辺機器
ラズベリーパイのスマート冷蔵庫の記事をせっせと書く傍らに今回の記事では最近Amazonでラズパイのために買った周辺機器を紹介します.
一つ目は電源ケーブル(Volutz micro usb ケーブル 2パック(2m×2))です.前々から少し長めの電源ケーブルを買おう買おうとしていたのですが,今回の買いました.タイムセールで少し安くなっていたのでついね(笑).
冷蔵庫からケーブルを出すため今回2mタイプのものを購入しています.用途によっては短いものでもいいかもれませんね.2mが2本入っていますが,2本共に少しデザインが異なります.ケーブルはかなりしっかりとした作りで,ケーブルの端子の部分が太く持ちやすいため,ケーブルを抜き差しが楽にできます.
パッケージになります
パッケージの中身
ラズパイ3に差すとこんな感じ!
外すとときも従来のケーブルに比べて楽なような気がします.
2つ目に購入したのはmicroSDカード(Samsung microSDHCカード 32GB EVO Plus Class10)です.最近はいろいろなプログラムを作成したり,ソフトをいれたりするためいつかsdが壊れたときが怖い!!と思いバックアップ用のsdを購入しました.なお,バックアップにはラズパイに最初から入っているSD CARD Copierを使用しました.
使い方については下の参考記事をお読みください.簡単にバックアップがとれます.このバックアップをするためにはsdカードを読み込むusbのsdカードリーダーが必要になります.参考サイトの通りにバックアップをとりました.定期的にバックアップを取らなければ!!
BackupPi: Raspberry Pi のバックアップとリストアを Raspberry Pi 自身で行う方法 - Qiita
記事をお読みいただきありがとうございました.冷蔵庫の記事は現在作成中なのでもうしばらくお待ちください!!がんばらねば!!
スマート冷蔵庫開発2:サーボモーターとカメラ撮影
今回の記事ではサーボモータに2軸のサーボモータによる回転とwebカメラを用いることによって冷蔵庫全体を撮影できるようにしたシステムの説明をします.
使用部品 and 製品
- SG90 x2個
- カメラマウント
- コンデンサ 220uF
カメラマウントの組み立て方については以下の記事を参考にしました↓.
SG90サーボ用の2軸カメラマウントが到着: EeePCの軌跡
今回の広角カメラを使用した理由は広角カメラを縦方向に使用することによって冷蔵庫の内部を出来るだけ広く撮影をするために今回使用しました.普通のwebカメラでもでも動作しますが一部分しか撮影できませんでした.
BUFFALO 200万画素WEBカメラ 広角120°マイク内蔵 ブラック BSW200MBK
- 出版社/メーカー: バッファロー
- 発売日: 2016/10/07
- メディア: Personal Computers
- この商品を含むブログを見る
サーボモータとカメラマウントとwebカメラを組み合わせると下記のような写真となります.すでに完成されたシステムなのでパワーLEDがついて状態の写真になっています.サーボモータとカメラマウントとの間に隙間があり,ぐらついたため,薄いプラスチックの板を凸で切り取り隙間を埋めています.またwebカメラは台座を取り外して使用します.運良く,カメラマウントにきれいにはまりました.
以下の2つの製品はPiZeroでUSB機器を動かすのに使用しました.Pi3で行う場合はUSBポートが存在するため要りません
-
microUSBを下向き変換ケーブル
- MicroUSBオス→USBメスに変換端子
-
Joyshare Micro USB OTGケーブル (ホスト機能)対応 USBホスト 変換アダプター (MicroBオス-Aメス) (ゴールド - 1セット)
- 出版社/メーカー: Joyshare
- メディア: エレクトロニクス
- この商品を含むブログを見る
私は下向きのケーブルがシステムを作るうえで便利であったため使用しました.写真でみると下記の写真のような感じになります.USBの出力が下方向にくるのでシステム回路が横方向に広がることを防ぐことができます.ただちょっと長いです.そのため,牛乳パックに実装するときはコードをまとめましたが,あまりコードの扱い方としていいものではありませんので,なにかもっといい変換端子がないか模索中です.
回路図
コンデンサを挿入した理由は,参考記事にあるようにサーボモーターの動作時(特に始動時)に大量に電流が流れることがあるため、その時の電圧降下による不具合を防止するためだそうです.コンデンサの容量は手元にあったやつを使用しました.サーボモーターの電源電圧5Vはラズパイの5Vからとっています.
参考記事↓
Arduinoで学ぶ基礎からのモーター制御:基礎からのマイコンモーター制御(6):PWMを使ったサーボモーターの制御 (2/3) - MONOist(モノイスト)
作成プログラム
作成プログラムですがここでのサンプルプログラムは前回の光検出回路のプログラムを使用して明るさが1500以下になったら撮影をサーボモーターを回転させながら撮影するというプログラムを説明します.作成したプログラムでは重要な要素はコマンドプロントによる撮影とpigpioによるpwm制御です.
- 写真の撮影
pythonを用いて写真の撮影を撮影する方法は調べれば多くあると思います.しかし
ながら私は最初に撮影した方法がfswebcamというコマンドプロント(cmd)を使用して撮影したため,cmdをpythonで実行する方法はないかと探しました.調べていく中でsubprocessというライブラリを使用すれば良いということが分かりこのスマート冷蔵庫ではfswebcamをsubprocessで呼び出して撮影しています,subprocess詳しい説明については以下を参考にしてください.さらにfswebcamについてのインストール方法についても以下を参考にしてください.
subprocess – プロセスを生成して連携する - Python Module of the Week
fswebcamの参考記事↓
https://www.raspberrypi.org/documentation/usage/webcams/
fswebcamを使う際に多くの引数を使用しているためその解説をします.
sudo fswebcam -F 10 --no-timestamp --no-banner --rotate 90 /home/pi/blog/test1.jpg
-F 10は撮影するフレーム数(露光時間)を意味します.数値が小さいほどぶれないそうです.
--no-timestamp --no-bannerはfswebcamは通常は撮影すると写真下に時間とバーが表示されます.しかしながらパノラマ写真をつくるときこの情報はいらないため,消去する引数となっています
--rotate 90は画像を90度回転(時計回り)させます.これはもともと横向きで撮影するカメラを縦にして撮影しているため,撮影が終わった段階で90度回転してあげることによって元の状態に戻してあげています.
- pigpioによるpwm制御
pwm制御にも様々な方法があります.しかしながら前回の記事で紹介した本でも書かれているのですがラズパイの標準のpwmでは精度が悪いため,サーボモータが小刻みにプルプルと振動してしまい撮影に支障がでてしまいます.本ではwiringPiを用いた高精度なpwm信号を使用していますが,スマート冷蔵庫の開発ではpigpioを用いてpwm制御をしました.以下の理由がpigpioを使う理由になります.
カラー図解 最新 Raspberry Piで学ぶ電子工作 作って動かしてしくみがわかる (ブルーバックス)
- 作者: 金丸隆志
- 出版社/メーカー: 講談社
- 発売日: 2016/07/20
- メディア: 新書
- この商品を含むブログを見る
- 高精度のPWMの出力ピンが多い!(32本)
WiringPiはpwmの出力pinが2本しかないため,回路設計の柔軟性がありません.
- 使い方がシンプル!
基本的な高精度pwmを出力するのに以下の2行で終わりです
pi = pigpio.pi()
pi.set_servo_pulsewidth(ピン番号, pwm_width)
- 自動実行(rc.local)の不具合がwiringPiであった
これが一番の大きな要因です.実は開発当初はwiringPiでサーボモータの制御をやっていたのですが,通常通りにプログラムを実行すると普通に動いていました.しかしながらrc.localで自動実行するようにpythonのプログラムを書いたとこサーボモータが回転しなかったり,途中で停止したりなどの不具合が多発しました.プログラムの自動実行の方法の変更とか調べてみてやってみたのですがうまくいかなかったのでpigpioを使用しています.
- WiringPiによるpwmの停止のさせ方が分からない
撮影が終わっても永遠にpwm信号を出力しっぱなしであるため,WiringPiのgpioピンの開放プログラムが分かればいいのですが,私の知識不足でできなかっため,pigpioを使用しています.
また以下の記事はpigpioの優秀な点を分かりやすくまとめてあってよい参考ブログです.
Raspberry PiのGPIO制御の決定版 pigpio を試す - karaage. [からあげ]
またpwmの制御についてお世話になった記事です
pigpioでサーボモーターを動かす。 – Blue-black.ink
撮影プログラムは前回の光検出回路にif文で条件を加えて検出した光が1500以下になったらサーボモータを回転させ撮影するようなプログラムとなっています.
if data < 1500: for pwm_width in range(1350,1700,150): print(pwm_width) sleep(0.5) pi.set_servo_pulsewidth(pin_az, pwm_width)
pwm_widthについては上記の参考記事でだいたい1500がサーボの角度中央のところにくるとかかれていたため,1500を中心に1350と1650の位置にカメラが回転するようにしました.
そしてsubprocess
subprocess.call(camera,shell = True)
で撮影をするcmdを呼び出します
sleep(0.5) #このsleepがないとサーボがしっかり動かない
sleepをしないとサーボが回転する時間がなく,回転しきれないままで次の命令にいってしまうため,sleepを入れています,
また,撮影する写真の名前が重複しないように名前を変更しています
count = count +1
camera = camera.replace('test'+str(count-1),'test'+str(count))
以上がサーボモータとカメラの連携による解説になります.プログラムや回路などまだまだ改善すべき所や非効率な部分があると思います.多分,間違っているところとかもあるかもしれません.随時記事の内容を見直し更新していきたいと思います.最後までお読みいただきありがとうございました!