2015年1月28日水曜日

読者の方々の声

発売以来、たくさんの方にご愛読頂きありがとうございます。
ここでは、読者の方々のレビューなどをご紹介したいと思います。

ご利用に感謝

         書籍をご紹介頂いています。
         AD変換やI2Cの演習を試されています。

         電子工作の参考書としてご利用頂いております。

         電子工作セミナーの教材としてご利用頂いています。

         ロボット制作教室の教材としてご利用頂いています。

         参考書としてご紹介頂いています。

          AD変換のプログラムをErlang環境に移植されています。

          手作り目覚まし時計を作る際にタクトスイッチを利用されています。

          本書をベースに様々な電子工作の例を試されており、解説も充実しています。

          遠隔操作できるカメラを作成する際、10章や追加コンテンツの内容の一部を
          参考にして頂いております。

          人感センサーを利用する際に6章のA/D変換の章を参考にして頂いております。

          Raspberry Pi 2で本書の内容を順に試されています。
          動作確認がとれている範囲は問題なく動いているようで安心しました。

          フィッシャーテクニックのブロックキットで作成した自走ロボットに
          10章のカメラつき回路を搭載してブラウザ経由で操作されています。

          LED点滅から順にプログラムの改造を加えながら試されていて参考になります。

レビュー

2015年1月7日水曜日

(追加コンテンツ)サーボモーターをPCやスマートフォンから角度制御する

はじめに

(注)WebIOPiをRaspberry Pi 2やRaspberry Pi 3で用いる場合、必ず「本書発売後の追加情報」の手法でインストールしてください。

本書ではサーボモーターを
  • 8.6 PWM信号によるサーボモーターの角度制御
という節で取り扱いました。

その際「入力部」として
  • 半固定抵抗のつまみ→AD変換→Raspberry Pi
という構成を用い、つまみの角度を読み取りました。そしてその角度に応じて
  • Raspberry Pi上のwiringPiライブラリ→サーボモーター(1個)
という流れの「出力部」により、サーボモーターを精度の良いPWM信号で制御しました。

その様子は公式のYoutube動画「ブルーバックス『RaspberryPiで学ぶ電子工作』」でも見ることができます。

この「入力部」のかわりに、9章で学んだ「WebIOPiを用いたPCやスマートフォンとの連携」の手法を用いると、サーボモーターをPCやスマートフォンから操作することができます。

ページの都合で本書内では紹介できなかった内容ですが、この補足ページではその方法を紹介します。

なお、このページではサーボモーター1個のみの制御を行いますが、Raspberry Pi Model B+以降(Raspberry Pi 2 Model Bを含む)ではサーボモーター2個までを精度の良いハードウェアPWM信号で制御できます。それらを出力できるピンの情報は「本書発売後の追加情報」を御覧ください。

さて、この方法を身につけると、例えば10章で体験した「カメラつきキャタピラ式模型」を改造することで、
  • カメラの上下の向きのサーボモーターによる制御
がブラウザを通して可能になります。具体的には、以下の動画のような動作が可能になります。まずは御覧ください。


以下、実現方法を順に紹介します。

なお、本ページの内容を学ぶ前に「8.6 PWM信号によるサーボモーターの角度制御」および「9章 WebIOPiを用いたPCやスマートフォンとの連携」をあらかじめ学び、必要なライブラリやソフトウェアをインストールしておく必要があります。

さらに、「カメラつきキャタピラ式模型」の改造まで行う場合は「10.4 キャタピラ式模型にカメラを搭載しよう」まで学んでおく必要があります。

必要な物品

必要な物品は下記のようになります。
  • ブレッドボード
  • ジャンパーワイヤ(オス-メス、オス-オス)
  • 電池ボックス(単3×4)
  • サーボモーター1個
さらに、「カメラつきキャタピラ式模型」の改造まで行う場合は「10.4 キャタピラ式模型にカメラを搭載しよう」で作成した模型が必要になります。


準備

ブラウザからサーボモーターを制御するためには、WebIOPiからwiringPiのPythonモジュールWiringPi2-Pythonを呼び出す必要があります。その際、WebIOPiはPython3で動いていますので、WiringPi2-PythonをPython3用にインストールする必要があります。

8.6節でwiringPiライブラリと、Python2用のWiringPi2-Pythonのインストールが済んでいますので、その続きとしてPython3用のWiringPi2-Pythonのインストールを実行します。ターミナルを開き、下記を実行します。
$ cd WiringPi2-Python
$ sudo python3 setup.py install
以上でPython3用WiringPi2-Pythonのインストールが完了しました。なお、9.2.2節で解説したWebIOPiのインストールも終わっていないと、上記のインストール時にエラーがでますのでご注意ください。

なお、2016/2/12以降にWiringPi2-Pythonをダウンロードした方は、エラーが出てWiringPi2-Pythonを読み込んだWebIOPiの起動に失敗します。その場合、下記の手順でエラーの起きないWiringPi2-Pythonをダウンロードし、インストールし直してください。

まず、ターミナルで下記のコマンドを実行し、古いWiringPi2-Pythonを削除します。
$ sudo rm -rf WiringPi2-Python
そして、下記の手順でインストールします。
$ git clone https://github.com/neuralassembly/WiringPi2-Python.git
$ cd WiringPi2-Python
$ sudo python3 setup.py install

 次に、サーボモーターをブラウザから操作するためのサンプルプログラムを、ダウンロードします。webiopi-servo.zipを304ページの図B-1と同じ方法で、ホームディレクトリに移動します。その後、308ページの図B-3と同様に、この圧縮ファイルを展開します。すると、ディレクトリ07と08が現れます。これらを下記のコマンドによりWebIOPi用のフォルダにコピーします。
$ cd
$ cp –r 07 08 /usr/share/webiopi/htdocs/bb/
なお、このコマンドは9.2.5節で解説した本書のWebIOPi用サンプルのコピーを行っていないと失敗しますのでご注意ください。

これが済んだ後、下記のコマンドにより、WebIOPi用のフォルダにあるフォルダを確認すると、下記のように01から08までのディレクトリ名が表示されるはずです。
$ ls /usr/share/webiopi/htdocs/bb/
01 02 03 04 05 06 07 08
これは、 /usr/share/webiopi/htdocs/bb/ ディレクトリにあるファイルやディレクトリを表示する命令です。01~06が本書で用いたサンプルファイルを含むディレクトリ群であり、07がこれから用いるサーボモーター制御用プログラムを含むディレクトリ、08がキャタピラ式模型のカメラを操作するためのプログラムを含むディレクトリです。

以上が確認できたら準備は終了です。

サーボモーターをPCやスマートフォンから角度制御する

まずはサーボモーターを制御する例です。必要な回路は下図のようになります。


これは、本書の図8-13から「入力部」に相当するADコンバータと半固定抵抗を取り除いたものです。

準備ができたらWebIOPiを起動する準備に移ります。

まずは、Raspberry PiでWebIOPiが起動していないことをあらかじめ確認しておきます。その方法の詳細は本書に記述されていますが、Raspberry Piを再起動してしまうのが最も簡単です。

もし、キャタピラ式模型用の設定のように、Raspberry Pi起動時にWebIOPiが自動起動する設定になっている場合、下記のコマンドで自動起動を無効にした後、Raspberry Piを再起動します。
(jessieの場合)$ sudo systemctl disable webiopi
(wheezyの場合)$ sudo update-rc.d webiopi remove
さて、WebIOPiが起動されていない状態になったら、管理者権限で設定ファイル /etc/webiopi/config を開き、編集します。leafpadを用いるならば下記のコマンドを実行するのでした。
$ sudo leafpad /etc/webiopi/config
このファイルのなかで[SCRIPTS]セクションを見つけ、起動するマクロを下記のように記述し、保存します。その後leafpadは閉じて構いません。
myscript = /usr/share/webiopi/htdocs/bb/07/script.py
それが済んだら、下記のコマンドでWebIOPiを起動します。
$ sudo /etc/init.d/webiopi start
そして、起動が済んだら、PCやスマートフォンのブラウザから下記のアドレスにアクセスします。
http://(Raspberry PiのIPアドレス):8000/bb/07/
「http://」や末尾の「/」の記述を忘れないよう注意するのでした。

ここまでの流れが上手く行けば、ブラウザ上にスライダーが1つ現れます。iPad miniの場合のスクリーンショットは下図のようになります。このスライダーをスライドすることで、冒頭で紹介した動画のようにサーボモーターの角度が変化するはずです。


なお、このプログラムはArduino Sidekick Basic Kit付属のサーボモーターを対象に記述しました。その他のサーボモーターを用いると、スライダの向きとサーボモーターの回転の向きが逆になる場合があります。

そのような場合、/usr/share/webiopi/htdocs/bb/07/javascript.js にて、下記の2行を見つけます。そして、この2行目の行頭に「//」を追記して無効化してください。
// サーボの回転の向きを逆にしたい場合次の行を無効に
        ratio = 1.0 - ratio;
無効化後、ブラウザでページを再読み込みすると、サーボモーターの向きが逆転しているはずです。

エッセンスの解説

このプログラムのエッセンスを書籍と同様に解説します。他の例と同様、関連するのは、 /usr/share/webiopi/htdocs/bb/07/ ディレクトリにある下記の4ファイルです。
  • index.html
  • javascript.js
  • styles.css
  • script.py

HTMLファイルindex.html

9.5節と同様、jQuery UIのスライダを配置しています。9.5節ではRGBフルカラーLEDの三色を変更するためにスライダが3つ必要でしたが、本ページの例では下記の1つだけです。
<div id="slider_servo"></div>

JavaScriptファイルjavascript.js

スライダの配置はやはり9.5節と同様です。スライダは下記にあるように、0から20の1刻みの値を持ちます。
var sliderMin = 0;
var sliderMax = 20;
var sliderStep = 1;
スライダを動かした時、下記の関数が実行されます。
    var sliderHandler = function(e, ui){
        var ratio = ui.value/sliderMax;
        // サーボの回転の向きを逆にしたい場合次の行を無効に
        ratio = 1.0 - ratio;
        webiopi().callMacro("setHwPWM", [ratio, commandID++]);
    };
関数の最後のあるように、Pythonスクリプト内にあるsetHwPWMマクロが、0.0~1.0に変換されたスライダの位置ratioと、何番目の命令送信かを示すcommandIDという引数付きで送られます。commandIDが必要な理由は、本書269ページを御覧ください。

Pythonスクリプトscript.py

Pythonスクリプト内では、wiringPiの手法でPWMを生成する記述をしています。周波数やデューティ比の設定方法を知るには8.6節の解説が役に立つでしょう。JavaScriptから呼ばれるsetHwPWMマクロは下記のように定義されています。
@webiopi.macro
def setHwPWM(duty, commandID):
    wiringpi.pwmWrite(18, getServoDutyForWebIOPi(float(duty)))
getServoDutyForWebIOPi関数はこのファイル内部で下記のように定義されています。wiringPi用のデューティー比の計算は219~220ページを参考にしてください。
def getServoDutyForWebIOPi(val):
    val_min = 0.0
    val_max = 1.0
    servo_min = 36   # 50Hzで, 0.7ms
    servo_max = 102  # 50Hzで, 2.0ms

    duty = int((servo_max-servo_min)*(val-val_min)/(val_max-val_min) + servo_min)
    return duty

カメラ付きキャタピラ式模型のカメラをサーボモーターで動かす(機体編)

以上でサーボモーターをブラウザから角度制御できるようになりました。その応用として、本書10章の最後に作成した「カメラ付きキャタピラ式模型」のカメラを上下方向に動かせるようにしてみましょう。どのような動作が可能になるのかは本ページ冒頭の動画でご覧頂けます。

模型の概観は下図のようになります。


書籍で紹介したように、この模型は
  • 機体に用いるパーツとして可能な限りTAMIYAの模型キットのものを用いる
  • 搭載する回路は半田付けではなく、ブレッドボードで実現する
  • 用いる工具はニッパとドライバ程度とする
という方針で作成していますので、サーボモーターの取り付けもその方針に従いました。

今回新たに取り付けたサーボモーター部のみを拡大したものが下図です。サーボモーターはArduino Sidekick Basic Kit付属のものを用いました。他のサーボモーターでももちろん可能ですが、サーボモーターの取り付け法は用いるモーターによって変更が必要になるかもしれません。


図中、赤字はTAMIYAの工作キットのパーツ、青字はサーボモーター付属のパーツを表しています。軸受け材からサーボモーターを吊り下げているサーボホーンは、長いものをニッパーで半分に切って用いました。

サーボモーターのサーボホーンをL型アームに取り付ける箇所には2mm径(M2)ワッシャーを用いました。このパーツのみ、TAMIYAの模型キットにもサーボモーターにも付属しないパーツですが、amazonなどの通販サイトで購入することができます。

このように、カメラとサーボモーターの取り付けは、耐久性やメンテナンス性を考えると全てねじ止めするのが理想です。しかし、試してみるとわかりますが、これは工夫が必要な作業です。どうしても難しい場合は両面テープなどによる仮止めでも良いと思います。

なお、2016年4月、Raspberry Piのカメラモジュールのバージョン2が発売になりました。こちらでもここで紹介するプログラムは動作するのですが、NOOBS1.9.0までのRaspbianでは映像の向きが上下逆転してしまいます。次のRaspbianが出るまで待つことをお勧めします。上級者の方には「sudo rpi-update」でカーネルを最新にすれば正常動作することをお知らせしておきます。

なお、二段構造の上部(Raspberry Piが乗った部分)のプレートですが、カメラと電池ボックスがぶつからないよう、少し前にずらして取り付けなおしています。

カメラ付きキャタピラ式模型のカメラをサーボモーターで動かす(回路編)

カメラを動かせるよう変更したキャタピラ式模型を動かすための回路は下図のようになります。本書の図10-6から、サーボモーターを動かすために変更した部分を赤で示しました。


準備ができたらWebIOPiを起動する準備を行います。この作業を行う方は、既に本書の10章まで終えているはずですので、簡単に解説します。

まず、管理者権限で設定ファイル /etc/webiopi/config を開き、編集します。leafpadを用いるならば下記のコマンドを実行するのでした。
$ sudo leafpad /etc/webiopi/config
このファイルのなかで[SCRIPTS]セクションを見つけ、起動するマクロを下記のように記述し、保存します。その後leafpadは閉じて構いません。
myscript = /usr/share/webiopi/htdocs/bb/08/script.py
それが済んだら、WebIOPiを起動します。キャタピラ式模型の場合は、WebIOPiがRaspberry Piの起動とともに自動起動するように設定するのでしたね。

WebIOPiの自動起動が有効になっていない場合、下記コマンドで有効になるのでした。
(jessieの場合)$ sudo systemctl enable webiopi
(wheezyの場合)$ sudo update-rc.d webiopi defaults
その後Raspberry Piを再起動すれば、WebIOPiが自動起動されます。

そして、スマートフォンのブラウザから下記のアドレスにアクセスします。
http://(Raspberry PiのIPアドレス):8000/bb/08/
「http://」や末尾の「/」の記述を忘れないよう注意するのでした。

ここまでの流れが上手く行けば、下図のようにカメラからの映像の右側に、カメラの上下を操作するスライダが現れます。このスライダーをスライドすることでカメラの上下方向の向きが変化します。


なお、このプログラムをディスプレイをつながない状態で自動起動しようとすると、NOOBS 1.9.1以降のRaspbianでは「キャタピラは動作するが、サーボモーターは動作しない」という状態になり得ます。この問題に直面した場合、以下のように「Raspbianがコンソールで起動する」状態にしてください。

まず、Jessieで導入されたGUIの設定アプリケーションを起動し、「システム(System)」タブの「ブート(Boot)」項目にある「CLI(To CLI)」にチェックを入れ、再起動してください。画面が黒い「コンソール」状態でRaspbianが起動し、ここで紹介したプログラムが自動起動で正常動作するようになります。
なお、Raspbianが黒いコンソールで起動する状態から元に戻したい場合、コンソールで「startx 」というコマンドを実行してデスクトップを起動してから、設定アプリケーションの「ブート(Boot)」項目で「デスクトップ(To Desktop)」を選択し、再起動してください。

さて、このプログラムもArduino Sidekick Basic Kit付属のサーボモーターを対象に記述しています。その他のサーボモーターを用いると、スライダの向きとサーボモーターの向きが上下逆になる場合があります。

そのような場合、/usr/share/webiopi/htdocs/bb/08/javascript.js にて、下記の2行を見つけます。そして、この2行目の行頭に「//」を追記して無効化してください。
// サーボの回転の向きを逆にしたい場合次の行を無効に
        ratio = 1.0 - ratio;
無効化後、ブラウザでページを再読み込みすると、サーボモーターの向きが逆転しているはずです。

さて、このプログラムは、10章のプログラムと、本ページで紹介したサーボモーター操作のプログラムを合体させたものです。

ただし、サーボモーターの動く範囲はscript.py内で下記のように設定し、元の範囲(36~102)よりも狭めています(どちらも中心は69)。これは、サーボモーターの動く範囲を広げすぎると、カメラを支えているアームが機体とぶつかるためです。
    servo_min = 48
    servo_max = 90
また、スライダを縦に配置するには、下記の変更を行っています。

1. index.html内でスライダをspan要素に変更
    <span id="slider_servo"></span>
2. styles.css内で下記の設定
#slider_servo{
    display: inline-block;
}
3. javascript.js内でスライダをverticalに設定
$( "#slider_servo" ).slider({
        orientation: "vertical",
(略)
4. javascript.js内でスライダの高さを設定
$( "#slider_servo" ).height(mHeight);

以上です。お疲れ様でした。