grbl1.1+Arduino CNCシールドV3.5+bCNCを使用中。
BluetoothモジュールおよびbCNCのPendant機能でスマホからもワイヤレス操作可能。
その他、電子工作・プログラミング、機械学習などもやっています。
MacとUbuntuを使用。

CNCマシン全般について:
国内レーザー加工機と中国製レーザー加工機の比較
中国製レーザーダイオードについて
CNCミリングマシンとCNCルーターマシンいろいろ
その他:
利用例や付加機能など:
CNCルーター関係:



*CNCマシンの制作記録は2016/04/10〜の投稿に書いてあります。


2017年9月8日金曜日

CourseraのMachine LearningコースとDeep Learningコース

前回のRaspberry Pi Zero Wのリチウムバッテリー化が中断しているのは、CourseraのMachine Learningコースに多くの時間がとられているためでもあります。


以前から、人工知能には興味があったので、ネットで調べながらTensorFlowなど試してはいました。サンプルを試してみると面白いのですが、細かな設定や自分なりに工夫してコードを書くということになると、基本を知らなければ、このライブラリ自体がブラックボックス化してしまい、それ以上活用することができなくなってしまいます。

個人的には機械学習やディープラーニングで何をしたいかというと、DCGANをつかった画像生成です(TensorFlowをつかったDCGANもできるらしい)。これは何かを解析したり分類したりするというよりは、学習させた画像をもとに、複合的な画像を新たに生成することができるようなので、やや創造的な行為に近いところもあり気になります。
ただ、一気にこのアルゴリズムを理解するには基礎知識がなさすぎなので、きちんと最初から勉強してみようと思ったわけです。当然、基本がわかっていないと機械学習の説明やサンプルコードを見ても、何がなんだか分からなくなってしまいます。

いろいろと検索していると、CouseraのMachine Learningオンラインコース(無料)が評判いいので受講してみようかと。さらには最近同じAndrew Ng先生のDeep Learning(deeplearning.ai)コース(有料:$49/月)も出来たようです。
おそらくこちらはもっと本格的なので、まずは基本からきちんと学ぶということで(無料でもあるし)、Machine Learningコース(11週)をやってみることにしました。Couseraにはその他にもたくさんのコースがあるので、ネット検索で必要な情報を得ながら独学してもいいのですが、このような無料(一部有料の場合もあり)のオンラインコースを利用したほうが効率がよさそうです。

Machine Learningコース(11週:無料):
一週間単位で次のステップに進んでいきます。現在3週目が終わろうとしています(あとはプログラミングの課題を提出するだけ)。毎週日曜日が締め切りなのですが、それまでにトピックごとの授業動画(一つ10分程度を複数)を見て、途中に出題される4択ミニクイズ、トピック最後に出題されるテスト(5問:4問以上正解で合格)ならびにプログラミングによる課題を提出します。受講と言っても、実際に講師と何かをやりとりするわけではないので、自分のペースで学んでいくことができます。いちおうForumがあるので、もしどうしても分からない部分があれば質問すればいいという仕組みです。
無料コースなので、タイミリミットはあるとは言え、遅れてもとくにペナルティがあるというわけではありません。あるいは、どんどん先にすすんでいっても構いません。
授業自体は基本英語ですが、動画には日本語字幕もあるので、英語でよくわからなければ日本語訳に切り替えて、再度動画を見るという感じにしています(復習も兼ねて)。ただ、専門用語が日本語化されると、微妙にニュアンスがかわって、かえってわかりづらいということがよくあります。テストの出題は英語なので、できれば用語などは英語で覚えたほうがいいような気がします。

コースの難易度:
最初の1週目や2週目は入門という感じでやさしいのですが、3週目からは少々難しくなってきました。ただ、内容は高度になっていくとは言え、どんどん便利なアルゴリズムになっていくので面白さと関心度が高まっていきます。やはり説明動画を何回か見て、途中に出てくる公式もその場で覚えていかないとダメと言う感じです。動画を一回みただけだと(10分間程度の理解)、概要を把握するだけになってしまい、覚えた内容をすぐにコード化できるかというと、そうもいきません。つまり、プログラミングできるレベルまでの理解を得るには何回か動画をみたり、ひとつ前に遡ったりしながら、ある程度の反復作業が必要という感じです。見たり読んだりするだけでなく、手書きのノートで覚えていったりしたほうがよさそうです。

Octaveという言語:
例えば、3週目の授業は合計すると3〜4時間あれば終わることになっているのですが(つまり一日30分程度やれば済むという計算になる、場合によっては1日で終わらせることもできる)、きちんと理解するには、その2〜3倍の時間がかかりそうな気がします。個人差にもよるのですが、ある程度復習したり、本や他のサイトなどで理解を深めていかないと、本当に身についたかどうかが怪しいという感じです。実際身についたかどうかは、プログラミング(Octaveという言語で)で書けるかどうかでも確かめることはできると思いますが、Octaveの使い方もある程度平行して勉強しないといけません。Octave自体は難しくないのですが、ちょっとした癖があるので、最初のうちは間違えないようにしないといけないと言う感じです。Octaveだとforループをつかわずに行列計算ができるので便利です。スマホにもOctaveが使えるアプリがあるので、簡単な演算などの練習はスマホで試したりもしています。

学習のペース:
ちょっと数日休んでしまうと、すぐに締め切り日が来てしまうので、毎日少しずつでもいいからコツコツやったほうがよさそうです。継続的に毎日やれば、それだけ頭にも入ってくるので、短期間に何かを覚えるなら、多少時間に追われながらでもやったほうがよさそうです。
コースはスマホでも見ることができるので、電車の中で勉強することも可能です。そうやって暇な時間を使って勉強していくこともできます。大学で数学をやっていたとか、仕事でこのようなことをやっているのであれば理解は早まるとは思いますが、専門領域でもない人にとってはきちんと理解するためには、多少まとまった時間を設けたほうがいいと思います。

まとめ:
おそらく人工知能や機械学習に関心を持っている人は多いと思います。機械学習についての概要を説明してある記事などを読んで、なんとなくどんなものなのかということを理解するまではいいのですが、突然複雑な数式が出てくると急に敷居が高くなって、その手前でやめてしまう人も多いと思います。個人的には、数学は高校以後ほとんどやっていませんが、プログラミングを通して、そのつど必要な計算方法を身につけていった感じです。つまり数学的な数式はあまり得意ではないのですが、それをプログラミングコードに置き換えてあれば理解しやすくなります。
しかし、数学やプログラミングのどちらもやったことがないとなると二重苦で難しいのかもしれません。さらには、Courseraの場合基本英語なので、英語も苦手だと三重苦になるのかもしれません。
とりあえずコース3週目までにも一見複雑な数式はいくつか出てきましたが、どんなことがなされているのか理解していくと、その数式の意味もわかってきました。複雑な数式を見ることにも慣れてきたと言う感じです。
機械学習を学ぶ上で、ネット検索すればたくさんの情報が見つかるので独学も可能ですが、その多くは概要的な説明であったり、要点をまとめたメモのようなものであったり、必ずしもこれから学ぶ人のための記述にはなっていないので、教えることに主眼をおいたCourseraのようなコースのほうがいいと思います。

次週(4週目)からはニューラルネットワークなので楽しみです。以前パーセプトロンまでは独学したのですが、多層パーセプトロンあたりから中断してしまっていたので、ここの壁を乗り越えられればと思っています。ニューラルネットワークあたりから面白くなってくると思うので、この機会に理解を深めておきたいと思います。

関連:
機械学習/Deep Learningについて

Raspberry Pi Zero Wのリチウムポリマーバッテリー化(その1)

Raspberry Pi Zero Wは、小型なのでそのままスタンドアロンで使いたいところですが、外部電源を接続するとUSBケーブルが邪魔だったりするので、なんとかならないかと、Raspberry Pi Zero Wの外形(65x30mm)にあったリチウムポリマーバッテリーを探していました。

Raspberry Pi Zero Wの短手30mmと同じ30mm幅のリチウムポリマーバッテリー。そして、リチウムポリマーバッテリー(3.7V出力)を使うからには、DCDC昇圧コンバーター(3.7V→5.0V)兼充電回路も必要。
青いアクリル板の上にRaspberry Pi Zero Wが固定されていますが、左側の長い部分は後からカットする予定です。

リチウムポリマーバッテリーに関してはアマゾンで探すとドローン用も含めいろいろありますが、やはりAliExpressで探すともっと種類があり少し安いので、今回もAliExpressから購入。
Raspberry Pi Zero WをWifiカメラとして使う予定でもあるので、バッテリー容量は1000mAh程度あったほうがいいかと。そうするとこのサイズのバッテリー(30x50mm程度)だと厚さが8mmくらい。つまりは、Raspberry Pi Zero Wの裏側に昇圧/充電回路とバッテリーを配置するのでこんなサイズにおさめてみました。

Raspberry Pi Zero Wとの電源供給ライン:
Raspberry Pi Zero Wに外部バッテリーから電源供給するには、いくつか方法があるようです。
(1)PimoroniのLipo SHIM(手っ取り早いのはこの部品、しかし充電機能がない)
(2)Raspberry Pi Zero WのGPIO2(5V)とGPIO6(GND)に接続(こちらのサイトを参考に

今回は元々ついているMicroUSB端子に直結している5V電源の端子(基板裏にある2つの端子:PP1とPP6)に接続することにしました。

これは↑、Raspberry Pi Zeroの基板裏面の画像ですが、PP1(5V)とPP6(GND)に接続するといいようです(Raspberry Pi Zero WにはPP1やPP6はプリントされていないのですが同じ位置にある端子です)。ここに直接ハンダづけしてもいいのですが、今回はポゴピンをつかって接続しようと思います。


ポゴピン:
Raspberry Pi Zero Wの端子に直接ハンダづけしてしまうと、交換するさいに面倒なので今回はすぐに脱着可能なポゴピンを間にはさみます。
今回用いたポゴピンは非常に小さく、直径1.5mm(下部の段の直径2mm)、高さ3mm程度です。内蔵してあるスプリングで先端の丸くなっている部分が約1mm沈みます。右側の黒い円筒形のものは、このポゴピンを保護するためのもの?
AliExpress.com Product - 10pcs Ultra small spring loaded pogo pin Diameter 2.3mm 3.0mm heigth brass material with Gold plated 1u 331円(10個セット:送料無料)。

このポゴピンを2mm厚のアクリル板に1.5mmと2mmの段差のある穴を開けて差し込みます(以下)。

そうすると、こんな感じになります。通電テストしてみると大丈夫そうでした。そしてこのポゴピンの底面(上画像では上面)に導線をはんだ付けし、昇圧/充電回路と接続する予定。
ここまでの作業はCNCマシンを使えばよさそうですが、実は手作業でやっています。というのも、まだ試作段階なので、各寸法や部品の配置位置を検証していると言う感じです。


昇圧充電回路:
リチウムポリマーバッテリーの昇圧充電回路もいくつかあります。今回探しているのは、5V電源供給可能かつバッテリー充電可能な回路。
(1)18650モバイルバッテリー内の回路流用(安い:AiExpressで100円程度)
(2)アマゾンでも購入可能なTP4056搭載の回路(安い:100円前後)
(3)Wemos Battery Shield(AliExpressで200円前後)
(4)AliExpressで売っている昇圧充電回路(300円前後)
(5)Adafruits PowerBoost1000 Charger($19.95:かなり高い)
というかんじで、候補はこれくらい。

(1)の18650モバイルバッテリーに使われているUSBコネクタ付きの昇圧充電回路。ダイソーでも300円で売っているようですが、AliExpressなら100円以下。ただしバッテリー(18650)は含まれていません。
AliExpress.com Product - Blue Portable Mini 18650 Battery Charge Box Case 18650 External Backup Battery Charger With Key Chain f#UO87円(送料無料)。安いので、ここから部品取りをするといいのかもしれませんが、実はこの回路、充電時は放電シャットアウトするタイプのようです。つまり充電しながらの使用(放電)はできないようです。
(2)のアマゾンでもよく見かけるTP4056搭載の昇圧充電回路。
HiLetgo 3PCS TP4056 1A リチウム バッテリ 充電ボード ミニ USB 充電器モジュール 4.5V-5.5V [並行輸入品]
HiLetgo
Amazonで詳細を見る
3個で120円なので、かなり安い。中国製基板には品質のばらつきがあるので複数買って比較しながら使うといいと思います(どれかが不良品という場合もあるので)。
この基板は充電放電を同時にできますが、USB接続時(充電中)は出力端子からは4.2Vが出ているようです。そしてUSB充電を外してバッテリーだけで駆動すると3.7Vが出力されます。つまり出力が5Vではないので、5Vが欲しいならさらに昇圧回路が必要となります(降圧して昇圧するためロスが大きい)。

(3)のWemos Battery Shield。
AliExpress.com Product - Battery Shield V1.1.0 For WEMOS D1 mini single lithium battery charging and boost
259円(送料込み)
これはESP8266のWemos D1 mini用のバッテリー充電シールド。この基板だけで充放電可能。
USB接続中は5Vがそのまま出力されるようです。バッテリーだけでの出力については、まだ未検証(ブーストしてくれるようなのでおそらく5V出力)。D1 mini用のシールドなので端子が両端に並んでいるぶん、やや大きい。

(4)AliExpressでその他リチウムバッテリー用の充放電回路を探すと、
こんな回路も売っています。350円(送料無料)。充放電可能で、InputにUSB接続(5V)、Outputが5VなのでそのままRaspberry Pi Zero Wの5V入力に使えそうです。現在の候補はこれ。サイズ:23x15.4mmも比較的小さい。

(5)Adafruit PowerBoost1000 Chargerもよさそうなのですが$19.95と高い。
右下に見えるのが、PowerBoost1000 Charger。これも充放電可能のようで便利そうですが、とにかく高い。それと想定しているサイズより少し大きめなので候補から除外。23x45mm。

ということから、(4)の基板にMicroUSB端子(メス)を接続して使う予定です。それぞれ安いので購入して試してみました。
左から、(4)、(2)、(3)、(1)です。それぞれかなり小さいのですが、(3)のWemos用のバッテリーシールドだけちょっと大きめ。機能的には左端の(4)がいいのですが(5V入力、5V出力、充放電同時可能)、MicroUSB端子(メス)をはんだづけしなければいけない。それと、電源ON-OFFスイッチもつけなければいけない。

リチウムポリマーバッテリー:
バッテリーのほうはというと、様々なサイズがありますが、Raspberry Pi Zero Wのサイズが65x30mmなので、30mm幅のもので1000mAh程度を探すと、

AliExpress.com Product - 3.7V,1000mAH,[803040] PLIB; polymer lithium ion / Li-ion battery for GPS,mp3,mp4,mp5,dvd,bluetooth,model toy616円(送料無料)、40x30mm、厚さ8mmで1000mAhというのがあります。1200mAhだと50x30mmというのもあります。だいたいこのあたりのバッテリーを採用。保護回路もついているので、そのまま使えます。そこそこ厚みはあるのですが、充放電回路のスペースも含めRaspberry Pi Zero Wの外形にはおさまる感じです。
という感じで、パーツ類はほぼ揃ってきたのですが、一旦中断しています。このRaspberry Pi Zero Wとリチウムポリマーバッテリーを一体化して、さらにはカメラも装着して、コンパクトにまとめたIPカメラをつくることがとりあえずの目標です。
追記:続きはこちらへ
関連:Raspberry Pi Zero W:IPカメラ実験(Picamera)

2017年7月31日月曜日

ワイヤレス充電器(USB:5V)

ワイヤレス充電器を購入してみました。あいかわらずAliExpressで数百円で売っていたので試してみたという感じです。

AliExpress.com Product - Ifavor Universal Qi Wireless Charging Kit Charger Pad Coil Receiver Charger Adapter For Samsung Xiaomi Android Phone Micro USB515円(送料無料)、受電(左)と送電(右:直径70mm)のセット
左側の受電用の薄っぺらいカードは厚さ1mm程度で、スマホケースを使えばスマホの裏側におさまります。ただ、MicroUSBの差し込む向き、あるいはタイプCやiPhone用のものなど、選択する必要があります。

AliExpress.com Product - Android Micro USB Universal Qi Wireless Charger Receiver Charging Adapter Receptor Receiver Pad Coil Chip For Samsung HUAWEI131円(送料無料)、受電用のカード(コイル)だけ。スマホ以外にも使えるかもしれないので、MicroUSBの向きが逆のタイプも購入してみました。

こんな感じで、受電用カード(右)は厚さ1mm程度なのでスマホケース内部に収まります。受電カード上のワイヤレスマーク(((●)))側が充電器(給電器)と向き合うように配置します。距離的には、8mmくらい離れていても給電できました。

受電用カードの裏には、5V/1000mAまでの出力と書いてあります。給電用の丸い充電器は5V/1500mAまで入力可能のようです。
Amazonでも購入できますが、やはり少し高い。

ESP8266への給電:実は、スマホ用充電器として購入したのではなく、以下のような使い方を想定していました。
ESP8266に接続して5Vをワイヤレスで給電。安定はしないかもしれませんがESP8266だと一応動くようです。


受電用カードとブレッドボードはほぼ同じサイズ。

間に電圧電流計をはさんで計測してみると、安定しているときでは0.11Aくらいでしたが、0.4〜0.25Aの間を上下していました。不安定なときは4.8Vに下がるなど、充電器の位置が多少ずれると電力が変動しているようでした。
Raspberry Pi Zero Wへの給電:試しにRaspberry Pi Zero Wも接続してみましたが、もっと電力が必要そうでダメでした。
たまに安定して起動するときもあるのですが、電圧が5.0V以下になることもあり不安定で途中で落ちてしまいます。もう少し強力な充電器が必要そうです。ちなみに、Raspberry Pi Zero Wの場合は、
18650(一本)のUSB電源であれば動きますが、右端の単3電池を2本使うタイプ(100均)のUSB電源だとやはり電力不足。ということから、18650の電源を使ったほうがよさそうですが問題はケーブルが邪魔。ケーブルを使わないで直接Raspberry Pi Zero Wに配線してしまったほうがコンパクトになりそうです。Raspberry Pi Zero Wの裏側に電源の端子があるのですが、そこに直接ケーブルをハンダつけするというよりは、以下のようなポゴピンコネクターを電気接点に使うとよさそうです。
AliExpress.com Product - 10pcs Spring Loaded Pogo Pin Connector Diameter 2.0 mm x 7.0 mm height SMT / SMD PCB brass Gold plate 1u 50g force Probe Pin505円(10個:送料無料)

ワイヤレス充電器の部品:再び、ワイヤレス充電器についてですが、以下のような5Vで2Aまで流せる部品もあります。これを使えば、Raspberry Pi Zero Wも起動するのかもしれません。
AliExpress.com Product - 5V2A Large current wireless charging module Wireless power supply module free shipping1332円(送料無料)ある程度容量があるので、これは何かに使えそうです。
AliExpress.com Product - Universal Charging Receiver Charger 3 Coils Qi Wireless Charger PCBA Circuit Board Coil Wireless Charging Micro USB Ap 25 472円(送料無料)、こちらは3個コイルがついているタイプで強力そうです。その分、横長になっています。ある程度安定して給電するには、これくらいのほうがよさそうです。
テーブルに給電器を埋め込んでおけば、ただそこに置くだけでちょっとした電化製品なら電源が入る仕組みになりそうです。ノートパソコンなどもそうなればいいとは思いますが、そこまで強力だと電磁波など問題にならないのでしょうか?

ワイヤレス充電器内蔵型家具:IKEAの家具の中には、ワイヤレス充電器を埋め込むためのキットが売っています。
IKEAワイヤレス充電ユニット:3000円直径9cm、5V/2000mAなので、スマホやタブレット程度なら充電が可能なのかもしれません。

このように既存のテーブルなどに穴を開けて埋め込むようです。

すでにワイヤレス充電器が埋め込まれているベッドサイドテーブル:6999円もあるようです。家具も電源が必要になってきたという感じです。

2017年7月26日水曜日

Raspberry Pi Zero W:IPカメラ実験(Picamera)

Raspberry Pi Zero Wでやりたかったことの一つにIPカメラがあります。Zero Wにカメラをつないで、他の端末からZero WのIPアドレスにアクセスして監視できるようにするものです。主には、レーザー加工時の監視用カメラ(直接目で確認するより安全なので)です。

カメラの種類:
カメラは以前AliExpressから以下のような赤外線カメラを購入しておりました。このタイプはカメラ両脇に赤外線LED照明がついており、それを照射して暗い部屋の中でもその赤外線反射光を頼りに撮影可能になるらしい。ただし、レンズには赤外線フィルターがついていないため、明るい状況下ではやや色味が実際とは異なってしまうと思います(やや赤紫っぽくなる)。

AliExpress.com Product - Raspberry Pi Camera RPI Focal Adjustable Night Version Camera + Acrylic Holder + IR Light + FFC Cable for Raspberry Pi 2 / 31677円(送料込み)、赤外線LED照明のついた暗視タイプ、5メガピクセル。
また通常のタイプのものであれば以下。こちらは赤外線フィルターがついているため色味は自然なほうかと。
AliExpress.com Product - Free Shipping raspberry pi camera 5mp pixels RASPBERRY PI CAMERA730円(送料込み)、5メガピクセル、これは比較的安価。でも国内で買うと3000円くらい。
どうやら5メガピクセルのカメラV1がV2へバージョンアップして8メガピクセルになったようで、以下。
AliExpress.com Product - Original RPI 3 Camera Raspberry pi Camera V2 Module Board 8MP Webcam Video 1080p 720p Official camera For Raspberry Pi 3 2206円(送料無料)、8メガピクセル。これは純正。こちらは国内価格が5000円くらい。
なぜかカメラが国内では高いのですが、試す程度なら730円のV1でもよさそうです。

カメラ用プログラム:カメラ撮影を可能にするプログラム/アプリケーションがいくつかあるようで、ざっと調べた限りでは、・Motion・MJPG-streamer・Picamera(python)があるようです。こちらの記事を参考にすると、Motionは遅延があるようでMJPG-streamerのほうがいいらしい。また、公式ドキュメンテーションを見ると、Picameraが標準インストールされているらしいので、すぐにコマンドを打てば使えるらしい。ということから、MJPG-streamerは後回しにして、まずはPicameraで軽く実験してみることに。
Picamera:公式ドキュメンテーションのカメラ使用については、RASPBERRY PI CAMERA MODULEというページ(英語)があります。さらに、Picameraのドキュメンテーションとしてはこちらのページに詳しく書かれています。
セッティングと動作チェック:Zero Wでカメラ使用を可能にするための設定として、以下の「Raspberry Piの設定」画面で「カメラ」を「有効」にチェックを入れておきます。そして一度再起動が必要らしいです。このあたりの設定については、ドキュメンテーションのGetting Startedに書いてあります。 

尚、パソコンからWifiを通してZero Wを遠隔操作しているため「VNC」も「有効」にしてあります。どうやら、その後「シリアル」も「有効」にしておいたほうがよさそうですが、いまのとこ無効のまま。Picameraを起動する前に、sudo apt-get updatesudo apt-get upgradeをしておいたほうがいいでしょう。数ヶ月使っていなかったため、10分以上アップグレードに時間がかかりました。
Zero Wを再起動後、ターミナルを開いて、
raspistill -o test.jpg

を入力すれば、test.jpgという名前のファイルで静止画を出力(保存)するようです。実際にやってみると、
このように、test.jpgが/home/piディレクトリ内に出力保存されています。これをクリックし写っていればカメラは問題なく機能しているということになります。

プレビュー画面:ビデオ映像をプレビューするには、raspivid -t 10000を入力すれば、10秒間プレビュー画面がでてくるようです。raspivid -t 0であれば、ctrl+cを押してプログラムを終了するまでずっとプレピューとなるようです。しかしながら、VNCを通してプレビューしようとするとプレビュー画面が現れません。これはVNCにプレビュー画面を転送表示する機能がないからのようです。その場合はでネットワーク表示させろと書いてあります

Webストリーミング:次に本題のWebストリーミングの方法に入っていきたいと思います。ちなみに、これらすべてはVNCを通してMacBook ProからWifi経由で操作しています。いろいろ探してみると、PicameraのドキュメンテーションのAdvanced Recipesに、そのまんま「4.10 Web Streaming」という項目があります。冒頭の説明で、Webを通してのビデオストリーミングは驚くほど複雑だと書いてあります。しかしながら、Pythonによる88行からなるサンプルソースが掲載されています。試しにコピペしてZero W上で確かめてみようと思います。


import io
import picamera
import logging
import socketserver
from threading import Condition
from http import server

PAGE="""\
<html>
<head>
<title>picamera MJPEG streaming demo</title>
</head>
<body>
<h1>PiCamera MJPEG Streaming Demo</h1>
<img height="480" src="stream.mjpg" width="640" />
</body>
</html>
"""

class StreamingOutput(object):
    def __init__(self):
        self.frame = None
        self.buffer = io.BytesIO()
        self.condition = Condition()

    def write(self, buf):
        if buf.startswith(b'\xff\xd8'):
            # New frame, copy the existing buffer's content and notify all
            # clients it's available
            self.buffer.truncate()
            with self.condition:
                self.frame = self.buffer.getvalue()
                self.condition.notify_all()
            self.buffer.seek(0)
        return self.buffer.write(buf)

class StreamingHandler(server.BaseHTTPRequestHandler):
    def do_GET(self):
        if self.path == '/':
            self.send_response(301)
            self.send_header('Location', '/index.html')
            self.end_headers()
        elif self.path == '/index.html':
            content = PAGE.encode('utf-8')
            self.send_response(200)
            self.send_header('Content-Type', 'text/html')
            self.send_header('Content-Length', len(content))
            self.end_headers()
            self.wfile.write(content)
        elif self.path == '/stream.mjpg':
            self.send_response(200)
            self.send_header('Age', 0)
            self.send_header('Cache-Control', 'no-cache, private')
            self.send_header('Pragma', 'no-cache')
            self.send_header('Content-Type', 'multipart/x-mixed-replace; boundary=FRAME')
            self.end_headers()
            try:
                while True:
                    with output.condition:
                        output.condition.wait()
                        frame = output.frame
                    self.wfile.write(b'--FRAME\r\n')
                    self.send_header('Content-Type', 'image/jpeg')
                    self.send_header('Content-Length', len(frame))
                    self.end_headers()
                    self.wfile.write(frame)
                    self.wfile.write(b'\r\n')
            except Exception as e:
                logging.warning(
                    'Removed streaming client %s: %s',
                    self.client_address, str(e))
        else:
            self.send_error(404)
            self.end_headers()

class StreamingServer(socketserver.ThreadingMixIn, server.HTTPServer):
    allow_reuse_address = True
    daemon_threads = True

with picamera.PiCamera(resolution='640x480', framerate=24) as camera:
    output = StreamingOutput()
    camera.start_recording(output, format='mjpeg')
    try:
        address = ('', 8000)
        server = StreamingServer(address, StreamingHandler)
        server.serve_forever()
    finally:
        camera.stop_recording()




とりあえず、デスクトップ上にテキストエディタでwebstream.pyなるファイルをつくって、そこにコピペです。どうやらこれは、Python3用のソースです(このままではPython2.7では動きません)。Zero WにPIXELをインストールしていれば、Python2.7も3も両方入っているので特に問題はありません。
保存したあと、ターミナルを開いて、まずはwebstream.pyのあるDesktopディレクトリへ移動するために、
cd Desktop
そして、Python3でこのスクリプトを起動するのですが、
python3 webstream.py
と打ち込みます。そうすると、特にモニタリング用の画面などは現れずに以下のような画面。
これは、Zero W上のターミナル画面です。サンプルが起動したら、Zero WのIPアドレス:8000/index.htmlに他の端末のブラウザでアクセスするとリアルタイムでの映像を見ることができます。


こんな感じで、193.168.3.2:8000/index.htmlにMacBook ProのChromeでアクセスしてみました。手を揺らしてみましたが、特に目立った遅延などなくスムースに動いています。コードを編集する必要もなく、すぐに動作確認することができました。画面上方の文字が邪魔ですが、コード11行目のHTMLを編集し直せばすぐに消しとることができます。
プログラム終了方法:ctrl+cを押すか、ターミナルを閉じてしまうと終了します。
Zero WのIPアドレス:
ちなみに、Zero WのIPアドレスは、画面右上のWifiアンテナマークにカーソルを重ねると出てきます。
またポート:8000に関しては、コード下から5行目に8000を指定してあるので、変更したい場合はその部分を任意のポートにすればいいと思います。


Python IDLEで起動:
ターミナルが苦手というのであれば、すでにPython 3 (IDLE)がインストールされているので、

コピペしたPythonスクリプトをデスクトップ上で右クリックして、
アプリケーションで開くを選択し、

Python 3(IDLE)を選択すれば、

先程のコードがIDLE上にでてきます。あとはRun Moduleすれば、このプログラムが起動します。
そして、別の端末のブラウザでIPアドレスにアクセスすれば撮影内容を見ることができます。

モバイルバッテリーにつなげばスタンドアロンのIPカメラとして使えるので便利そうです。バッテリーとUSBケーブルの間に電圧電流計をはさんでみましたが、カメラ起動中は約0.2〜0.3A程度の電流になっていました(以下)。
カメラ起動中は、赤いLEDがオンになります。

まとめ:
比較的簡単にWebストリーミングできました。このソースにHTMLの表示内容も書き込んであるので、見た目や配置を変更することも簡単にできそうです。
この実験のあと、Python2.7でも動かせるかどうか確かめてみました。Python3のsocketserverならびにserverモジュールが、python2.7ではSocketServer、SimpleHTTPServerに置き換わるのですが、そのために多少書き直す部分がでてくるので面倒。そのうちやろうと思います。
それから、かなりZero Wのチップが熱くなっていたので、ヒートシンクはつけたほうがよさそうです。

Posted at 2017.7.26
EasyWordMall アルミニウムヒートシンク Raspberry Pi用 6枚入り
Apple Trees E-commerce co., LT
販売価格 ¥198
(2017年7月26日4時48分時点の価格)

人気の投稿