Plus電子デバイス・電子工作用語集モータドライバ博士のQ&A読者よりいただいたお問い合わせを元に、ロボット製作者、エンジニアのみなさんに役に立つ技術解説を発信していきます。Plus電子デバイス・電子工作用語集モータドライバ博士のQ&A読者よりいただいたお問い合わせを元に、ロボット製作者、エンジニアのみなさんに役に立つ技術解説を発信していきます。サーボモータを使って指さし温度計を作ってみよう今回のラズパイ記事は、人気の基本編!デバプラではこれまで、みなさんに電子工作の楽しさをお伝えするために頑張ってきました。近頃は少しレベルの高い記事もアップしてきましたが、「これから」の人も、もちろんずっと応援しています。超入門』などの入門編の書籍でも有名な、福田和宏さん。サーボモータとセンサという王道の組み合わせです!◆ラズパイで作品を制作するには、制作したい作品に応じた電子パーツを選択して接続し、プログラムで制御することで実現できます。ロボットやドローンなどといった機器はたくさんの電子パーツを接続し制御していまが、2つ程度の電子パーツでも、十分な電子工作が可能です。そこで、今回はサーボモータと温度センサの2つを組み合わせて、指で温度が示せる「指さし温度計」を作成してみましょう。Zero/Wのいずれでも問題ありません。B+」を購入しましょう。主な購入可能なサイトは以下の通り。Piを動作させるためのSDカード、ADアダプター、キーボード、マウス、ディスプレイなどを別途準備する必要があります(参考記事:https://deviceplus.jp/hobby/raspberrypi_entry_056/)●サーボモータ指を動かすために利用する動力機器です。ここでは、模型などに利用されるサーボモータ「MG90D」を利用します。●温度センサ室温を計測するセンサです。Piに温度情報を送れる温度センサ「ADT7410」を利用します。●電池ボックス・単3電池(4本)サーボモータを動かすための電力を供給するために利用します。単3電池4本で6Vを出力できる電池ボックスを選択します。サーボモータとは今回、腕を動かして温度を指すために、サーボモータを利用します。サーボモータとは、特定の角度まで回転させられる動力パーツです。角度を指定して動かせるため、ロボットの関節の制御や、ラジコン飛行機の操舵などに使われています。サーボモータの内部には回転動作をするためのDCモータと、現在の角度を調べるためのポテンショメーター、ギア、動作する角度を制御するための制御用基板が搭載されています。Piなどから制御用の信号が送られてくると、DCモータで回転軸を動かします。この回転軸はポテンショメータにつながっており、現在の角度を逐次調べています。所定の角度に達するとDCモータを停止するようになっています。サーボモータの制御には、パルス波と呼ばれるHigh(電圧の高い状態。3.3Vや5Vなど)とLow(電圧の低い状態。0V)を周期的に切り替える矩形波を送り込むことで制御しています。制御信号のHighとなっている時間の長さによって角度を指定できます。Highの時間のことをパルス幅と呼びます。パルス幅が小さいと右方向に移動し、大きくなると左方向に移動するようになっています。どの程度のパルス幅の信号を送れば目的の角度に回転できるかは、サーボモータによって異なります。一般的に約1500μ秒のパルス幅にすると駆動範囲の中央付近に動作するようになっています。今回利用するサーボモータのMG90Dの場合は、は120度の範囲をパルス幅800から2300μ秒の間で制御できます。Piを準備しましょう。Piは、専用OSのRaspbianを用意する必要があります。PiのWebサイトからRaspbianをインストールする「Noobs」をダウンロードし、SDカードに書き込みます。Piを起動すると、Raspbianのインストールが開始されます。Piを利用できるようになります。Raspbianのインストール方法については下記の記事を参照してください。Piで各電子パーツを制御できるように設定します。Piの制御方法として「pigpio」ライブラリがあります。LEDの点灯制御やスイッチの状態確認やサーボモータの制御など可能となっています。pigpioを利用するには、常駐用プログラムを起動しておきます。デスクトップの上部のパネル上にある「>_」が描かれたアイコンをクリックして端末アプリを起動します。次に以下のように実行します。pigpiodこれで準備完了です。サーボモータを動かしてみる実際にサーボモータを動かしてみましょう。サーボモータには3本の配線が取り付けられています。配線は、赤線が電源、黒線がGND、オレンジ線が制御信号用配線となっています。今回利用するサーボモータ「MG90D」は、4.58から6.6Vの電圧を供給する必要があります。Piの電源端子に直接接続するのには向いていません。そこで、別途単3電池を4本直列接続して6Vの電源でサーボモータに供給するようにします。PiのGPIO(ここでは、GPIO23:端子番号16番)に接続して制御するようにします。実際には、以下のように接続します。接続したらサーボモータ動作プログラム「servo.py」を利用して動作させてみましょう。Piにダウンロードしておきます。Piでファイルをダウンロードする場合は、WebブラウザのChromiumで閲覧して、ファイルのリンク上で右クリックし「名前を付けてリンク先を保存」を選択します。【ダウンロード】サーボモータ動作プログラム「servo.py」servo.pyダウンロードしたら端末アプリを起動してプログラムを実行してみます。servo.pyは、Pythonを利用したプログラムとなっています。このため、以下のようにpython3コマンドでプログラムファイルを指定することで実行できます。実行の際にはサーボモータに送り込むパルスの幅を指定します。パルス幅を1500μ秒とする場合は、以下のように実行します。1500すると、サーボモータが動き、特定の角度で停止します。同様にパルス幅を変えて実行するとほかの角度まで回転します。室温を取得する室温を調べるには温度センサを利用します。ここでは、温度センサ「ADT7410」を利用することします。Piなどで受け取ることが可能です。I2Cは、データを送受信する「SDA」、同期信号をやり取りする「SCL」、および電源の4本の線を接続すれば通信ができるようになります。Piでは、3番端子がSDA、5番端子がSCLとなっており、以下のように接続することで通信できるようになります。PiでI2Cを利用するには、設定が必要となります。Piの設定」を選択します。「インターフェイス」タブにある「I2C」項目を有効に切り替えます。これでI2Cが有効化されます。温度センサの準備ができたら実際に温度を取得してみましょう。温度計測プログラム「temp.py」をダウンロードします。【ダウンロード】温度取得プログラム「temp.py」temp.pyダウンロードしたら端末アプリを起動して以下のように実行します。temp.pyすると、現在の温度が画面上に表示されます。試しに温度センサに触れるなどしてみましょう。すると温度が上昇するのがわかります。指さし温度計を作成するサーボモータと温度センサを動作できることを確認したら実際に指さし温度計を製作しましょう。板や紙などにイラストと温度を示す目盛りを書き込ます。筆者はパソコン上で画像編集ソフトを利用して製作しています。この際、重要なのが、目盛りを均等の角度で描くことです。今回は20度ごとに10°Cずつ温度が変化するように描きました。サーボモータの軸を差し込む部分を中心とした丸を描いてその上に目盛りを振るときれいに描くことができます。温度を指すために利用する腕のイラストを別に準備しておきます。描いた絵は板やカラーボードなどに貼り付けます。サーボモータの軸となる部分に穴を開け、裏側からサーボモータを取り付けておきます。この際、サーボモータの向きは気にする必要はありません。サーボモータのホーンに腕のイラストを貼り付けておきます。腕を貼り付けたホーンをサーボモータの軸に差し込めば、指で温度を指すようになります。Piに次の図のように接続します。接続は前述したサーボモータの動作回路と温度センサの回路同時に接続した形となります。これで指さし温度計の外観と制御回路ができあがりました。サーボモータの動作範囲を調べる指さし温度計を実現する際に重要となるのが、正しい温度の目盛りを指せることです。作成した温度の目盛りやサーボモータの特性の違いがあるため今回用意したプログラムをそのまま動かすだけでは、温度がずれてしまうことがあります。このため、温度とサーボモータの動作を調節する必要があります。調整には、実際にサーボモータを動かし、所定の温度を指すためのパルス幅を調べることとなります。サーボモータを動かすには前述したプログラム「servo.py」を利用します。サーボモータの動作範囲と中央値を調べるまず、サーボモータの動かせる範囲を調べます。今回利用するサーボモータ「MG90D」はパルス幅800μ秒〜2300μ秒の範囲で動作します。多少の個体差があるため、度の範囲で動かせるかは実際に調べて確かめておくことをおすすめします。他のサーボモータを利用する場合は、動作するパルス幅の範囲が異なるので、あらかじめ調べておく必要があります。「servo.py」を利用して、500〜2500の範囲でパルス幅を指定してサーボモータが動く最大値と最小値を調べます。「800」を指定した場合はサーボモータが動作し、「750」を指定するとサーボモータが動かなくなった場合は、動作範囲の最小値は「800」だとわかります。同様に最大値についても調べておきます。パルス幅は正確に調べる必要はありません。実際はパルス幅が794μ秒まで動作したとしても、800μ秒と見なしてもかまいません。次に最大値と最小値から中央の角度に動かすためのパルス幅を調べます。筆者のサーボモータは「800〜2300」の範囲で動作したので、中央値は「1550」となります。最大温度と最小温度のパルス幅を調べる次に温度とサーボモータを制御するパルス幅を合わせます。servo.pyを使ってサーボモータを中央に移動します。ここでは中央値は「1550」なので以下のように実行します。1550サーボモータが中央に移動したら、腕のイラストを貼り付けたホーンをサーボモータに差し込みます。この際、目盛りのおおよそ中央になるように差し込みます。今回の場合は15°Cぐらいを指すように差し込みます。正確な15°Cにする必要はありません。次に目盛りの最大温度と最小温度を指すためのパルス幅を調べます。指定するパルス幅を変えながらservo.pyでサーボモータを動かし、最大または最小温度を指すようにします。温度を指したらパルス幅をメモしておきます。筆者の環境では-10°Cのパルス幅は「2150」、40°Cは「1100」となりました。それぞれのパルス幅の4つの値を準備することで、温度からサーボモータを制御するパルス幅への変換が可能となります(実際にどのように変換しているかは、次に利用するプログラムを閲覧ください)。プログラムを実行して温度を指さすようにするここまでできあがったら、温度計測とサーボモータの動作を合わせたプログラムを作成します。Piにダウンロードします。Editor」を選択してテキストエディタを起動し、ダウンロードしたプログラム「point_temp.py」を開きます。次に、4から7行目にあるサーボモータの動作範囲に関する設定を変更します。「MIN_TEMP」には温度計に描いた目盛りの最小温度、「MAX_TEMP」には最大温度に変更します。「MIN_PULSE」は、最小温度を指している角度にするためのサーボモータに送るパルスの幅、「MAX_PULSE」には最大温度のパルスの幅を指定します。前述した「servo.py」を使って調べたパルス幅を指定します。設定ができたらファイルを保存してテキストエディタを終了します。これで準備ができました。端末アプリを起動して以下のように実行します。point_temp.pyすると、温度センサが計測した温度をプログラムでパルスの幅に変換します。このパルス幅をサーボモータに送り、目的の温度を指さすようになります。まとめ今回は温度センサを使ってサーボモータで温度を示すようにしました。電子工作やパソコン、Linux、スマートフォンなどの記事を執筆。「ラズパイマガジン」や「日経Linux」へ記事の執筆。実践講座」(ソーテック社)、「Arduino[実用]入門」(技術評論社)など。現在、ものづくりをしたいメンバーを集めて電子工作を利用した作品などを制作する「サッポロ電子クラフト部」を主催(https://sapporo-elec.com/)。誰でも参加可能ですので、ご参加をお待ちしています。Pi」累計出荷台数1000万台突破!記念キャンペーンとしてスターターキットが発売。