記事の詳細
後閑哲也先生監修!サーボモータ拡張モジュール Web詳細解説
※記事内に試作品の画像を使っているものがあります。
キット版の組み立て方はこちらのPDFもご参照ください
- 第一章 システム構成
- 第二章 ラズパイで動画をストリーミングする
- 第三章 リモコンカメラのページの製作
- 第四章 RCサーボ制御ボードの製作
- 第五章 ファームウェアの製作
- 第六章 動作確認
- 第七章 アップグレード1 外部アクセス機能の追加
- 第八章 アップグレード2 シャットダウン機能の追加
サーボモータ制御モジュールの全体概要
ラズパイに付属するカメラを使って「リモコンカメラ」を製作します。ブラウザでカメラの動画を見ながら、同じ画面に作成したボタン操作でカメラの向きを自在に操れるようにします。
カメラの向きを動かすために、「RCサーボ」というラジコン用のサーボモータを使います。これを2個使って上下と左右にスムーズに動くようにPICマイコンを使った制御ボードで制御します。
完成した外観が写真Aとなります。
第一章 システム構成
製作するシステムの全体構成を図Aのようにします。操作側はパソコンかスマホあるいはタブレットのブラウザを使います。ラズパイに標準カメラを搭載して動画を撮りストリーミングアプリケーションでネットワークにアップします。さらにWebIOPiを使ってGPIOを制御し、これにPICマイコンで構成した制御ボードを接続し、RCサーボの制御を行います。
RCサーボを滑らかに動かすためには、高分解能なPWM制御が必要なため、ラズパイではその制御は難しいですから、PICマイコンを間に挿入して制御しています。
ラズパイとPICマイコンで製作したRCサーボ制御ボードとの接続は、できるだけ簡単にできるようにラズパイのGPIOを使って制御し、単純なオンオフ信号による信号でPICマイコンと接続し、GPIOのピンごとに表Aのような機能を持たせることにしました。
この機能を実現するために必要なプログラムの構成は図Bのようになります。
ラズパイ側は動画を撮影してストリーミングをするアプリ(mjpg_streamer)と、GPIOを制御するためにWebIOPiアプリを使用します。これらの既存アプリケーションの他に、ウェブサーバとして動作させるために必要なHTMLファイル(CamRemocon.html)と、PICマイコンとのインターフェースを取るために必要なPythonスクリプト(CamRemocon.py)の2つのファイルを新規に製作して構成します。いずれも簡単な構成のファイルです。
PICマイコン側はRCサーボ制御ボードとして新規にハードウェアを製作し、RCサーボを動かすためのファームウェア(Raspi_Servo)を製作します。
第二章 ラズパイで動画をストリーミングする
最初に動画のストリーミングの製作から始めます。ラズパイとカメラを使って製作しますが、ラズパイに接続できるカメラには、USBに接続する市販のUSBカメラと、ラズパイに専用に用意されたコネクタに接続できる標準カメラとがあります。この両者では動かし方が少し異なります。本稿では標準カメラを使います。
(1) 標準カメラの接続
まず、カメラをコネクタに接続します。カメラに付属のフラットケーブルをコネクタに挿入しますが、この接続には若干コツが必要です。まずコネクタのロックを上に引き上げてから、ケーブルを差し込みます。このときケーブルには裏表がありますので、ケーブルの接続端子部となっている方を、コネクタの接点が見えている向きに挿入し、指でケーブルを押さえながらコネクタのロックを下げて固定します。これだけでカメラのハードウェアの設定は終わりです。接続したところが写真Bとなります。
(2) Rasbianの初期設定
カメラの接続が完了したら、ラズパイにモニタとキーボード、マウスを接続してから電源を接続して起動します。このカメラアプリはHDMIに接続したモニタでしか表示できませんので、リモートデスクトップは使えません。
電源を接続してデスクトップが起動完了したら、「Menu」→「設定」→「Raspberryの設定」とすると開くダイアログで「インターフェース」タグを選択すると図Cのダイアログが開きます。ここでカメラの欄の「有効」にチェックを入れてOKとすると再起動を要求されますから、そのまま再起動(リブート)します。これだけでカメラを使う準備は完了です。
(3) ストリーミング用アプリのインストール
標準状態ではラズパイのHDMIコネクタに接続したモニタでしか撮影した動画を見ることができません。そこで、撮影した動画をリアルタイムでウェブブラウザにより表示できるようにします。つまり動画をストリーミングしてネットワークに接続されたパソコン、スマホ、タブレットで動画像を見ることができるようにします。
動画のストリーミングには、「mjpg-streamer」というアプリを使いますが、そのままではなくラズパイ標準カメラ用に専用に用意されたアプリ「mjpg-streamer-experimental」を使います。
このアプリをインストールしますが、その前にストリーミングに必須の関連アプリを下記コマンドでインストールします。途中でディスクメモリを必要とするがよいかと聞かれますから、「y」と入力します。これでアプリをダウンロードしコンパイルまで自動でやってくれます。
sudo apt-get install libjpeg9-dev cmake
次に下記コマンドで専用アプリをインストールし、makeコマンドでコンパイルします。
sudo git clone https://github.com/jacksonliam/mjpg-streamer.git mjpg-streamer
cd mjpg-streamer/mjpg-streamer-experimental
sudo make
(4) コンパイル結果を下記コマンドでディレクトリごと/optディレクトリに移動します。
cd
sudo mv mjpg-streamer/mjpg-streamer-experimental /opt/mjpg-streamer
(5) 動画のストリーミングアプリの起動
この専用アプリの起動は下記コマンドで行います。長いコマンドですがこれを1行として入力する必要があります。ハイフンとアンダーバーを間違いやすいので気をつけてください。
sudo LD_LIBRARY_PATH=/opt/mjpg-streamer/ /opt/mjpg-streamer/mjpg_streamer
-i “input_raspicam.so -fps 20 -q 50 -x 640 –y 480”
-o “output_http.so –p 8010 –w /opt/mjpg-streamer/www”
このコマンドの主なオプションは表Bとなっています。2段階の記述になっていて、2段階目はダブルクオーテーションでくくった中に記述する必要があります。
(5) 動画ストリーミングの表示
ストリーミングアプリを起動したら、パソコンやスマホのブラウザでラズパイのIPアドレスとコマンドで指定したポートをURL(つまりhttp://IPアドレス:8010)として指定すれば、図Dのようなスタート画面が表示されます。このときブラウザにはInternet ExplorerではなくChromeを使ってください。
左側のメニューで「Static」を選択すれば固定写真で表示され、「Stream」を選択すればストリーミングモードでの表示が行われ、動画が確かに表示されていることが解ります。特に表示コマンドでフレームレート(fps)を20程度にすると動画が滑らかに動くようになります。
また図Dの右側の画面で「here」の部分をクリックすれば動画だけが表示されるようになります。このときのURLは下記となります。
http://IPアドレス:8010/stream_simple.html
このURLのHTMLファイル(stream_simple.html)の内容を見ると、リストAのように非常に単純なリストとなっています。このあとの製作例で、動画とボタンを同時に表示する際にこの方法を使っています
(6) 自動起動
リモートカメラとして独立に動作するようにするためには、このストリーミングアプリをラズパイ起動時に自動起動するようにする必要があります。
mjpg-streamerアプリをラズパイ起動時に自動的に起動するためには、起動用シェルスクリプトを用意して下記の手順で行います。
・mjpg-streamerの起動コマンドをシェルスクリプトとして作成する
・etc/rc.localという起動制御ファイルにこのシェルスクリプトの起動を追加する
自動起動用シェルスクリプト「start_stream.sh」はリストBのようにして新規作成します。これを任意のディレクトリを作成して保存します。「/home/pi/work」に保存しました。後ほど作成するHTMLファイルなども同じディレクトリに保存します。ディレクトリ作成はファイルマネージャを使うと簡単にできます。
次に起動制御ファイルにこのシェルスクリプトを追加するため、下記コマンドで起動制御ファイルをエディタで読み込みます。
sudo nano /etc/rc.local
これで表示されたファイルの最後の行の直前にリストCのようにシェルスクリプト起動コマンドを追加します。
追加修正が終わったら、「Ctrl-O」で上書き保存し、「Ctrl-X」でnanoエディタを終了します。
以上でラズパイ起動時に動画のストリーミングのアプリが自動起動し、常に動画のページが有効になることになります。リブートすれば自動起動します。
自動起動でストリーミングが正常に行われているかどうかは、カメラの赤いLEDが点灯することで解ります。
第三章 リモコンカメラのページの製作
動画のストリーミングができましたから、今度はWebIOPiと動画を同じ画面に表示させリモコンカメラとして使える画面を製作します。
目標とする画面を図Eのようにするものとします。表題の下に動画が表示され、その下に4個のボタンを表示します。このボタンを押している間だけカメラが動いて画像が変わっていくという動作になります。
この画面の実現方法は、HTMLファイルで画面を作成し、ボタンの動作はWebIOPiからPythonスクリプトのマクロ関数を呼び出して行うことにしました。これを実現したHTMLファイルがリストDとなります。
最初に表題をちょっと大きめの文字で表示します。次にWebIOPiのJavascriptを使うことを宣言してからスクリプトを記述します。
スクリプトの最初でWebIOPiの初期化関数であるready()関数を記述しています。この中で、4個のボタンの名称とオン時とオフ時のイベントごとにマクロ関数を定義しています。これでボタンを押している間を区別することが可能になります。続いてボタンを生成するためにappendでスタイルシートとの関係をつけています。
次がスタイルシートの記述で、ボタンのサイズと配置を指定しています。
次はbody部で実際の表示を実行しています。一緒に動画ストリームを表示させるためリストAの記述の仕方をそのまま利用しています。IPアドレス部は読者のラズパイのIPアドレスに変更してください。
最後は4個のボタンの表示です。これで図Eの画面が構成でき、ボタンを押したとき、離したときそれぞれにマクロ関数が呼び出されてPythonスクリプトが実行されることになります。
HTMLファイルの作成が終わったら次はPythonスクリプトの製作です。製作したスクリプトはリストEとなります。このリストは単純なので解りやすいかと思います。
最初にWebIOPiのライブラリを読み込みます。次にWebIOPiのオブジェクトのインスタンスをGPIOという名称で生成します。次にボタンごとに対応させるGPIOの番号を定義します。
あとはボタンごとのマクロ関数そのもので、ボタンごとに押したときと離したときのイベントごとに2種類ずつのマクロがあります。上下と左右でオンさせるときは反対動作のGPIOをLowにして反対動作が同時にオンになることが無いようにしています。最後はアプリを終了させたときにGPIOをすべてLow状態にしています。
WebIOPiのHTMLファイルとスクリプトファイルができあがったら、こちらも自動起動するようにします。起動時に製作したファイルが指定されるようにWebIOPiのコンフィギュレーションファイルを修正します。
下記コマンドでWebIOPiのコンフィギュレーションファイルをエディタで開きます。
sudo nano /etc/webiopi/config
次にリストFのように追加修正を行います。
①Pythonスクリプト(CamRemocon.py)を記述例にしたがってフルパスで指定します。
②ポート番号は8020としましたが、別のポート番号にしても構いません
③HTMLファイルのあるディレクトリ(/home/pi/work)の指定
④ウェブサーバが呼ばれたとき返すHTMLファイル(CamRemocon.html)の指定
最後にWebIOPiを自動起動するため下記コマンドで起動ファイルにWebIOPiを追加します。
sudo update-rc.d webiopi defaults
この自動起動をしないようにするには下記コマンドで解除します。
sudo update-rc.d webiopi remove
これでラズパイ側の準備は完了です。ボタンの動作確認はGPIOピンにLEDを接続すれば簡単にできます。テスタで電圧を計測することでもテストができます。
第四章 RCサーボ制御ボードの製作
ラズパイ側の製作が終わりましたから、次はRCサーボ制御ボードの製作です。RCサーボをスムーズに動かせるように高分解能なPWMを使ってRCサーボを動作させるようにします。PICマイコンの内蔵モジュールの機能を活用します。このボードの全体構成は図Fのようにしました。
まず、PICマイコンには最新の20ピンのPIC16F1508かPIC16F1509を使います。いずれでもピン数もメモリ容量も十分です。クロック周波数は8MHzとし内蔵発振器から供給することにします。
電源供給方法は、PICマイコンはラズパイからの3.3Vで動作させ、RCサーボはラズパイからの5Vで動作させることにしました。
ラズパイとPICマイコンとの接続方法ですが、ラズパイのGPIOとPICのポートとを直接接続することにしました。ラズパイのGPIOは3.3VのインターフェースレベルなのでPICマイコンと同じですから全く問題なく動作します。
プログラミングは標準のICSP(In-Circuit Serial Programming)方式とし、ツールにはPICkit3を使うことにしました。
RCサーボは5V動作となりますので、PICマイコンから直接制御できませんからトランジスタ経由で駆動することにします。
テストやデバッグ用に汎用のスイッチ2個と発光ダイオードを2個用意しておきます。
ここでRCサーボの制御方法にはちょっと問題があります。
RCサーボの制御は、このPICマイコンに内蔵されている10ビット分解能のPWMモジュールを使って制御します。しかし、RCサーボの仕様は図Gのようになっていて、単純なPWMで制御しようとすると、使えるデューティが約20msecの内の0.9msecから2.1msecの間の1.1msecだけですから全体の1/20しか使えないことになってしまいます。単純に考えると、10ビット分解能では1024/20=51ステップしか使えません。このステップではスムーズな動作は難しくなります。
そこで、このRCサーボの駆動方法に工夫を加えました。このPICマイコンにはCLC(Configurable Logic Cell)というプログラマブルなハードウェアモジュールが4組内蔵されています。そこで、このCLCを使って図Hのような回路を構成しました。この回路を追加すれば、PWM2とPWM4の2.048msec周期で10ビット分解能のパルスを20.48msecごとに出せますから、10ビットの分解能をフルに使えます。しかも2系統独立に出力することができます。このパルス出力の0.9msec~2.048msecの間の1.1msecを使うことにすれば、1.1msec/2.048msec≒1/2ですから500分解能は得られることになります。しかもCLCは一度設定すればあとはハードウェアとして動作しますから、RCサーボの制御はPWMのデューティを変えるだけでできるようになり、分解能の問題をクリアできます。
実際に動作させた結果では、デューティ値が0x120~0x3F0の範囲で2台とも安定に動作しましたので、720分解能が得られていることになり十分滑らかにRCサーボを動かすことができます。
図Fの全体構成を元に作成した回路図が図I、実装図が図Jとなります。
RCサーボ駆動用トランジスタは汎用のトランジスタを使いました。5Vで出力されるようにプルアップ抵抗を追加しています。接続は3ピンのシリアルピンヘッダを使っています。接続する際には向きに注意が必要です。RCサーボの起動時に多くの電流が流れますので、RCサーボに供給する5V電源には大容量の電解コンデンサを付加しています。
ラズパイとの接続には2列のヘッダピンを使えばフラットケーブルで接続できますから、1対1の同じピン配列としておきます。
この回路図でプリント基板を自作して組み立てます。部品点数は少ないですから小型の基板で十分実装できます。各コネクタの周囲はコネクタ挿入時に邪魔になるものが無いように注意して配置します。
実装図の中で太い線はジャンパ線で、錫メッキ線で配線しますが、スイッチ部はスイッチ本体でつながるのでジャンパ配線は不要です。実装が完了した基板の外観が写真Cとなります。
この基板ができあがったら全体を組み立てます。RCサーボは2個を直交動作するように金具を組み合わせます。2個を写真Dのように縦に接続することで上下と左右方向に動かすことができるようになります。
標準カメラを実装したラズパイとRCサーボ制御基板を一緒にアクリル板に組み立てて、RCサーボの上に乗せました。カメラは横向きにする必要がありますからアクリル板を直角になるように接着して実装しました。実装が完了した状態が写真Eとなります。カメラのフラットケーブルが貫通するようにアクリルの接着部に隙間をあける必要があります。
第五章 ファームウェアの製作
RCサーボ制御ボードのハードウェアが完成したら、次はPICマイコンのファームウェアの製作です。
この製作には「MPLAB X IDE + MPLAB XC8 Cコンパイラ + MPLAB Code Configurator(MCC)」という開発環境で行います。とくに新しい開発ツールのMCCを使うと各モジュールの設定をGUI環境ででき、設定やモジュールの制御関数を自動生成してくれますから、レジスタ等を意識せずに手早くプログラムを製作できます。
ファームウェアの製作手順は次の順序で行います。
① MPLAB X IDEで空のプロジェクトを作成する
② MCCで各モジュールの設定を行う
・クロックとコンフィギュレーション
・I/Oポートの入出力モードの設定と名称の設定
・TMR0とTMR2モジュールの設定
・CLC1、2、3、4モジュールの設定
・PWM2とPWM4モジュールの設定
③ MCCでGenerateを実行してコードの自動生成を行う
④ main関数に必要なプログラムを記述する
⑤ コンパイルし書き込む
以上の手順で製作しますが、本稿ではMCCの設定の仕方を主に説明します。
(1) プロジェクトの作成
まずMPLAB X IDEで空のプロジェクト「Raspi_Servo」を作ります。ソースファイル等は何も登録されていない状態です。
(2) MCCのインストールと起動
MCCはMPLAB X IDEのPlug Inとして用意されているツールですので、これを最初にインストールする必要があります。インストールは、図Kのようにメインメニューから、[Tools] → [Plugins] で表示されるダイアログで[Available Plugins]タグを選択してから、[MPLAB Code Configurator]にチェックを入れて[Install]とします。これでインストールが実行されて自動的に再起動します。再起動後には図Kの下側のようなアイコンが追加されますからこれをクリックしてMCCを起動します。
(3) クロックとコンフィギュレーションの設定
クロックは図Lのように「Project Resource」欄で「System Module」を選択すると右側に表示される欄で「INTOSC」で「8MHz」とします。これで命令や周辺モジュールはこの1/4の2MHzで動作することになります。
次にコンフィギュレーションは図Mのように選択設定します。必須なのは下記だけで、他は異なっていても正常動作をします。
・WDTをdisable
・LVPをHigh-voltageにする
(4) I/Oピンの入出力モードと名称設定
左側のResource欄でPin Moduleを選択し、図Nのような「Pin Manager」を表示します。ここで、各ピンの入出力モードを回路図にしたがってGPIOのinputとoutput欄に設定します。最後に説明しますが、RA2ピンとRC0ピンはCLCから出力されるので、ここでのoutput設定を後から削除する必要があります。
次に「Code Configurator」のタブをクリックして表示される図Oのような表で、ピンの詳細属性の設定と名称を入力します。名称を入力するとプログラムではこの名称で扱えるようになります。
Analogの欄のチェック、WPU欄(プルアップ抵抗)のチェックはすべて削除します。
(5) タイマ0の設定
次はタイマ0の設定です。「Device Resources」の欄のTMR0をダブルクリックして選択すると図Pのようなダイアログとなります。ここで、図の順序で設定し、20.48msec周期のインターバルタイマとします。このタイマは割り込みを有効にして割り込み処理の中でTMR0の値を設定しなおして、次の割り込みも同じ時間となるようにします。(この処理は自動的に行われます)
(6) タイマ2の設定
次はタイマ2の設定です。このタイマは2.048msec周期のタイマとする必要があります。タイマ0と同じようにして図Qのダイアログを開き設定します。このタイマの場合は割り込みなしでも設定した周期で動作します。
(8) PWMモジュールの設定
次はPWM2とPWM4の設定で図Rのダイアログで行います。いずれも「Device Resource」欄でPWM2またはPWM4をダブルクリックするだけです。これで初期値は50%で2.048msec周期のPWMを出力します。出力はCLCに使うだけで外部には出力しませんから「Enable pin Output」のチェックは不要です。
(9) CLCの設定
次はCLC1からCLC4までの設定を図Mの回路になるように行います。最初にCLC1(CLC2)の設定は図Sのようにします。CLC1とCLC2は同じ内容ですが括弧内だけが異なります。
① 出力を有効にします。これでRA2ピン(RC0ピン)に出力がでることになります。
② ロジックとして4入力ANDを選択します。
③ LCIN0をFOSCに変更して入力ピンを使わないようにします。
④ 入力としてLC3OUTつまりCLC3の出力を選択し ⑤ORゲートに接続します。
⑥ PWM4(PWM2)を入力として選択し ⑦ ORゲートに接続します。
⑧⑨ 残りのORゲート出力を反転し常時Highとなるようにします。
⑩ CLC1(CLC2)の出力を反転して出力がトランジスタで反転することを考慮します。
次はCLC3の設定で図Tのようにします。
① リセット付きDフリップフロップを選択します。
② R入力にはTMR2の周期一致を指定し、④ORゲートに接続します。
③ D入力にはLC4OUTを指定し、 ⑤ORゲートに接続します。
最後はCLC4の設定で図Uとなります。
① SR Latchを選択する。
② TMR0IFを選択してタイマ0のタイムアウトとする ④ ORゲートに接続
③ TMR2=PR2を選択し、 ⑤ ORゲートに接続する
これで設定はすべて完了しますが、CLCの出力を有効化したことで、最初のI/Oピンで出力モードに設定したピンがダブって定義されてしまっているためPin Moduleを選択しなおしてRA2ピンとRC0ピンのOUTPUT設定を削除します。
最後に「Generate」のボタンをクリックすると、コードが自動生成されプロジェクトに自動的に登録されます。登録結果は図Vのようになります。
この自動生成されたコードの中には、main関数以外に、モジュールごとのファイルの中に初期化関数と制御関数が含まれています。
これらの関数の関係は図Wのようになっています。
最初の初期化はmain.cの「SYSTEM_Initialize」関数から始まり、mcc.cにあるシステム初期化関数がmain関数から呼び出されると、そこからそれぞれのモジュールの初期化関数が呼び出されて全モジュールの初期化を実行します。
あとは、main関数の中に必要なユーザ処理を追加すればよいようになっていますが、そこでモジュールを使う場合には、モジュールの中に用意されている制御関数を呼び出せば良いようになっています。したがってモジュールごとに生成された関数を見て使い方を調べる必要があります。
タイマ0の割り込み処理では、次のインターバル時間のゲタを履かせ直す設定だけが必要な処理で、この処理は自動的に生成されていますから、何も追加は必要ありません。
実際に必要な処理はmain関数内に記述するだけで済んでしまいます。
main関数の中に記述した内容はリストGとなります。
このmain関数の前に内部で使う変数を定義しています。グローバル変数にしましたが、ローカル変数としても問題ありません。
main関数の最初でタイマ0の割り込みを許可するためグローバル割り込み許可の記述のコメントアウトを削除して有効にしています。
次にデューティの初期値を指定して中央位置で停止するようにしています。この値は実際に動作させて動作範囲を確認してからおよその中央値で決めます。
メインループでは、後からアップグレードで追加するシャットダウン機能を有効にするため、S1とS2のスイッチを同時に押したときにGPIO4をHighにする機能を組み込んでいます。
次に、4つのGPIOの状態をチェックし、Highであったら対応するデューティを上げ下げする処理を追加します。ただし上限と下限で制限をかけています。
実際の制御にはPWMのデューティ設定関数を呼んでいるだけです。
最後に繰り返し周期を決めるディレイ文を挿入しています。カメラの動く速さはこのディレイ時間で決まります。この時間は実際に動かしてみて適当な値で設定します。
以上でファームウェアは完成で、これをコンパイルして書き込めば完成です。
MCCを使うとモジュールごとに設定が必要なレジスタ類についての詳細を調べなくても、実際に必要な動作から決めるべきことだけを設定すればすべての設定が完了しますし、レジスタ制御用の関数も自動生成されますから、解りやすい英語の関数名で使えるようになります。
第六章 動作確認
以上でラズパイとRCサーボ制御ボード両方が完成しましたから、実際に動作確認をしてみます。電源はラズパイに5Vを供給しますが、ラズパイ用のACアダプタを使います。
ラズパイは初期設定でWi-Fiが使えるようにしてネットワークに接続します。ラズパイに外部から接続が必要なのは、電源とPICとの接続だけです。
次にRCサーボ制御ボードにRCサーボのケーブルを接続します。上下と左右の方向がどちらかわからない場合は、とりあえず接続し動作確認をしてから接続をしなおせば大丈夫です。
電源を接続し、ラズパイが動作を開始したら、同じネットワークに接続したパソコン、スマホ、タブレットのいずれかで、下記URLを指定します。
http://ラズパイのIPアドレス:8020
正常に呼び出せれば図XのようにユーザIDとパスワードの認証を求められますから、IDには「webiopi」、パスワードには「raspberry」と入力すれば目的とした図Eの画面が表示されるはずです。
第七章 アップグレード1 外部アクセス機能の追加
同じネットワーク内のパソコンなどで動画を見ながら制御できるようになりましたから、次にインターネット経由で外部からもアクセスできるようにアップグレードしてみましょう。
この機能の実現には、「ダイナミックDNS」(DDNS)という方法を使います。
このDDNSを使えば、家庭のプロバイダから提供されるモデムでインターネットに接続している場合でも、特定のURLでいつでも外部から呼び出せるようになります。
DDNSをサービスしているサイトには有料と無料と数多くありますが、本稿では無料でDDNSをサービスしているサイトである「MyDNS」を使って試してみました。
MyDNSでの設定手順は次のようになります。
(1) ユーザ登録をする
MyDNSのウェブサイトのトップページで、メニューの「JOIN US」をクリックするとユーザ登録のページになります。ここで住所、氏名、メールアドレスを入力して「CHECK」とすると登録が完了し、ログイン用のユーザIDとパスワードがメールで送られてきます。この入力では「子ID」の欄は0とすること。
(2) ドメイン名の登録
メールで送付されたIDとパスワードでMyDNSのトップページからログインすると図Yの画面となります。この画面の下の方に図Yの右下のようなドメイン名を入力する欄があります。ここで入力できるドメイン名は図Yに示されたものの中から任意に選べます。 この???の部分を適当な名称に変更して登録します。図の例では「camremocon」としています。
(3) ドメイン登録完了通知がくる
他に同じ名称が無ければ、正常に登録され、完了通知がメールで届きます。これで新規ドメインが確保されています。
(4) ドメインにIPアドレスを登録する
確保されたドメインをURLとして使えるように、自宅のルータに割り振られているグローバルアドレスを送信して登録します。
直ぐ登録して試したいときは、ラズパイのターミナルから下記コマンドを実行します。実行後、図Zの画面で「LOG INFO」をクリックすれば、これまでの登録情報がログとして見られ、ここでIPアドレスが割り振られたことが解ります。
sudo wget -q -O /dev/null
http://mydnsID:mydnsPASS@www.mydns.jp/login.html
(mydnsIDとmydnsPASSには送付されたユーザIDとパスワードを使う)
(5) 自宅ルータの割り付け
これでURLが常時自宅ルータに割り振られるようになったので、今度はポートとHTMLプロトコルがラズパイに割り振られるように自宅のルータを設定する必要があります。
筆者の自宅ルータでは図AAのような設定項目があり、接続先にラズパイの名称を、ポート範囲に「8000から8030」と入力しただけで、簡単にバーチャルサーバとしてラズパイを設定することができました。
以上の設定で、「camremocon.mydns.jp:8020」というURLでインターネットのどこからでもアクセスできるようになります。
ただし、動画ストリーミングも正常にできるようにするため、HTMLファイル(CamRemocon.html)のIPアドレスの部分をリストHのようにMyDNSに登録したURLに変更する必要があります。
(6) IPアドレスの自動送信
(4)でルータのグローバルアドレスを送信しましたが、このアドレスはプロバイダから定期的に変更されますから一定間隔でアドレスを送信し直す必要があります。
このためには「crontab」を使います。下記コマンドでcrontabのファイルを開きます。
crontab -e
開いたファイルの最後にリストIのように追記して保存します。
以上でインターネットのどこからでも、パソコンでもスマホでもタブレットでもアクセスできるウェブカメラができ上がりました。
第八章 アップグレード2 シャットダウン機能の追加
リモコンカメラもモニタやキーボードなしでの単体動作になりますから、ラズパイのシャットダウンもできるようにしましょう。
方法はPythonのsubprocess機能を使います。リモコンカメラとは独立に専用のPythonスクリプトを作成し、カメラを自動起動する際にこのスクリプトの起動も追加します。
まず、シャットダウン用のPythonスクリプト「shut_down.py」をリストJのように作成し、他と同じディレクトリ(/home/pi/work)に保存します。
次にこのスクリプトを自動起動するように起動制御ファイル(/etc/rc.local)にリストKのように追記します。この起動制御ファイルは先にカメラ機能で追記したものと同じですから、その後にシャットダウン用の記述を追加します。
このシャットダウン機能を有効にするには、RCサーボ制御ボードのS1とS2のスイッチを同時に押したときにGPIO4をHighにするという機能をPICマイコンのファームウェアに追加する必要があります。
これで単体でもラズパイのシャットダウンができるようになりますから、安心して電源をオフとすることができるようになります。