ラズパイその他工作

ラズパイ電子工作の基本① サーボモータを使って指さし温度計を作ってみよう

今回のラズパイ記事は、人気の基本編!

デバプラではこれまで、みなさんに電子工作の楽しさをお伝えするために頑張ってきました。近頃は少しレベルの高い記事もアップしてきましたが、「これから」の人も、もちろんずっと応援しています。そして今回、改めて電子工作を始めたい、ちゃんと知りたい人のために立ち上がってくれたのは……、『これ1冊でできる!ラズベリー・パイ 超入門』などの入門編の書籍でも有名な、福田和宏さん。まずはサーボモータとセンサという王道の組み合わせです!

ラズパイで作品を制作するには、制作したい作品に応じた電子パーツを選択して接続し、プログラムで制御することで実現できます。ロボットやドローンなどといった機器はたくさんの電子パーツを接続し制御していまが、2つ程度の電子パーツでも、十分な電子工作が可能です。
そこで、今回はサーボモータと温度センサの2つを組み合わせて、指で温度が示せる「指さし温度計」を作成してみましょう。

完成イメージ:指さし温度計

【今回の記事の流れ】

制作で利用する機器、電子パーツ
サーボモータとは
Raspberry Piを準備する
サーボモータを動かしてみる
室温を取得する
指さし温度計を作成する
サーボモータの動作範囲を調べる
プログラムを実行して温度を指さすようにする
まとめ

制作で利用する機器、電子パーツ

●Raspberry Pi
02-1

モデルは、Raspberry Pi/2/3、Raspberry Pi Zero/Wのいずれでも問題ありません。わからない場合は最新版の「Raspberry Pi 3 Model B+」を購入しましょう。主な購入可能なサイトは以下の通り。
KSY
RS

また、Raspberry Piを動作させるためのSDカード、ADアダプター、キーボード、マウス、ディスプレイなどを別途準備する必要があります
(参考記事:https://deviceplus.jp/hobby/raspberrypi_entry_056/)

●サーボモータ
02-2
指を動かすために利用する動力機器です。ここでは、模型などに利用されるサーボモータ「MG90D」を利用します。

●温度センサ
02-3

室温を計測するセンサです。ここでは、I2CでRaspberry Piに温度情報を送れる温度センサ「ADT7410」を利用します。

●電池ボックス・単3電池(4本)
02-4

サーボモータを動かすための電力を供給するために利用します。単3電池4本で6Vを出力できる電池ボックスを選択します。

サーボモータとは

今回、腕を動かして温度を指すために、サーボモータを利用します。サーボモータとは、特定の角度まで回転させられる動力パーツです。角度を指定して動かせるため、ロボットの関節の制御や、ラジコン飛行機の操舵などに使われています。
サーボモータの内部には回転動作をするためのDCモータと、現在の角度を調べるためのポテンショメーター、ギア、動作する角度を制御するための制御用基板が搭載されています。
Raspberry Piなどから制御用の信号が送られてくると、DCモータで回転軸を動かします。この回転軸はポテンショメータにつながっており、現在の角度を逐次調べています。所定の角度に達するとDCモータを停止するようになっています。
12

サーボモータの制御には、パルス波と呼ばれるHigh(電圧の高い状態。3.3Vや5Vなど)とLow(電圧の低い状態。0V)を周期的に切り替える矩形波を送り込むことで制御しています。制御信号のHighとなっている時間の長さによって角度を指定できます。なお、Highの時間のことをパルス幅と呼びます。
パルス幅が小さいと右方向に移動し、大きくなると左方向に移動するようになっています。
パルス幅 制御信号
なお、どの程度のパルス幅の信号を送れば目的の角度に回転できるかは、サーボモータによって異なります。一般的に約1500μ秒のパルス幅にすると駆動範囲の中央付近に動作するようになっています。今回利用するサーボモータのMG90Dの場合は、は120度の範囲をパルス幅800から2300μ秒の間で制御できます。

Raspberry Piを準備する

Raspberry Piを準備しましょう。Raspberry Piは、専用OSのRaspbianを用意する必要があります。Raspberry PiのWebサイトからRaspbianをインストールする「Noobs」をダウンロードし、SDカードに書き込みます。
SDカードを差し込み、Raspberry Piを起動すると、Raspbianのインストールが開始されます。インストールが完了するとRaspberry Piを利用できるようになります。Raspbianのインストール方法については下記の記事を参照してください。
第56回「改めましてラズベリーパイの基本!(1) Raspberry Pi NOOBSインストール 2017年度版」

起動したら、Raspberry Piで各電子パーツを制御できるように設定します。Raspberry Piの制御方法として「pigpio」ライブラリがあります。LEDの点灯制御やスイッチの状態確認やサーボモータの制御など可能となっています。pigpioを利用するには、常駐用プログラムを起動しておきます。デスクトップの上部のパネル上にある「>_」が描かれたアイコンをクリックして端末アプリを起動します。次に以下のように実行します。

sudo systemctl enable pigpiod
sudo systemctl start pigpiod

これで準備完了です。

サーボモータを動かしてみる

実際にサーボモータを動かしてみましょう。サーボモータには3本の配線が取り付けられています。配線は、赤線が電源、黒線がGND、オレンジ線が制御信号用配線となっています。
31

今回利用するサーボモータ「MG90D」は、4.58から6.6Vの電圧を供給する必要があります。また、モータは電流が多く流れるため、Raspberry Piの電源端子に直接接続するのには向いていません。そこで、別途単3電池を4本直列接続して6Vの電源でサーボモータに供給するようにします。
また、制御信号用の配線は、Raspberry PiのGPIO(ここでは、GPIO23:端子番号16番)に接続して制御するようにします。実際には、以下のように接続します。
32

接続したらサーボモータ動作プログラム「servo.py」を利用して動作させてみましょう。以下のリンクからプログラムをRaspberry Piにダウンロードしておきます。
※Raspberry Piでファイルをダウンロードする場合は、WebブラウザのChromiumで閲覧して、ファイルのリンク上で右クリックし「名前を付けてリンク先を保存」を選択します。

【ダウンロード】サーボモータ動作プログラム「servo.py」
servo.py

ダウンロードしたら端末アプリを起動してプログラムを実行してみます。servo.pyは、Pythonを利用したプログラムとなっています。このため、以下のようにpython3コマンドでプログラムファイルを指定することで実行できます。

$ python3 servo.py パルス幅

実行の際にはサーボモータに送り込むパルスの幅を指定します。例えば、パルス幅を1500μ秒とする場合は、以下のように実行します。

$ python3 servo.py 1500

すると、サーボモータが動き、特定の角度で停止します。同様にパルス幅を変えて実行するとほかの角度まで回転します。

室温を取得する

室温を調べるには温度センサを利用します。ここでは、温度センサ「ADT7410」を利用することします。
ADT7410は、計測した温度をI2Cを利用してRaspberry Piなどで受け取ることが可能です。I2Cは、データを送受信する「SDA」、同期信号をやり取りする「SCL」、および電源の4本の線を接続すれば通信ができるようになります。Raspberry Piでは、3番端子がSDA、5番端子がSCLとなっており、以下のように接続することで通信できるようになります。
41

Raspberry PiでI2Cを利用するには、設定が必要となります。Raspberry Piのメニューをクリックして「設定」-「Raspberry Piの設定」を選択します。「インターフェイス」タブにある「I2C」項目を有効に切り替えます。これでI2Cが有効化されます。
42

温度センサの準備ができたら実際に温度を取得してみましょう。温度計測プログラム「temp.py」をダウンロードします。

【ダウンロード】温度取得プログラム「temp.py」
temp.py

ダウンロードしたら端末アプリを起動して以下のように実行します。

$ python3 temp.py

すると、現在の温度が画面上に表示されます。試しに温度センサに触れるなどしてみましょう。すると温度が上昇するのがわかります。

指さし温度計を作成する

サーボモータと温度センサを動作できることを確認したら実際に指さし温度計を製作しましょう。
板や紙などにイラストと温度を示す目盛りを書き込ます。筆者はパソコン上で画像編集ソフトを利用して製作しています。この際、重要なのが、目盛りを均等の角度で描くことです。今回は20度ごとに10℃ずつ温度が変化するように描きました。サーボモータの軸を差し込む部分を中心とした丸を描いてその上に目盛りを振るときれいに描くことができます。また、温度を指すために利用する腕のイラストを別に準備しておきます。
51

描いた絵は板やカラーボードなどに貼り付けます。サーボモータの軸となる部分に穴を開け、裏側からサーボモータを取り付けておきます。この際、サーボモータの向きは気にする必要はありません。
52

サーボモータのホーンに腕のイラストを貼り付けておきます。
53

腕を貼り付けたホーンをサーボモータの軸に差し込めば、指で温度を指すようになります。
次に温度センサとサーボモータをRaspberry Piに次の図のように接続します。接続は前述したサーボモータの動作回路と温度センサの回路同時に接続した形となります。
54

これで指さし温度計の外観と制御回路ができあがりました。

サーボモータの動作範囲を調べる

指さし温度計を実現する際に重要となるのが、正しい温度の目盛りを指せることです。しかし、作成した温度の目盛りやサーボモータの特性の違いがあるため今回用意したプログラムをそのまま動かすだけでは、温度がずれてしまうことがあります。このため、温度とサーボモータの動作を調節する必要があります。
調整には、実際にサーボモータを動かし、所定の温度を指すためのパルス幅を調べることとなります。サーボモータを動かすには前述したプログラム「servo.py」を利用します。

1. サーボモータの動作範囲と中央値を調べる
まず、サーボモータの動かせる範囲を調べます。今回利用するサーボモータ「MG90D」はパルス幅800μ秒〜2300μ秒の範囲で動作します。ただし、多少の個体差があるため、度の範囲で動かせるかは実際に調べて確かめておくことをおすすめします。また、他のサーボモータを利用する場合は、動作するパルス幅の範囲が異なるので、あらかじめ調べておく必要があります。
「servo.py」を利用して、500〜2500の範囲でパルス幅を指定してサーボモータが動く最大値と最小値を調べます。例えば、「800」を指定した場合はサーボモータが動作し、「750」を指定するとサーボモータが動かなくなった場合は、動作範囲の最小値は「800」だとわかります。同様に最大値についても調べておきます。なお、パルス幅は正確に調べる必要はありません。実際はパルス幅が794μ秒まで動作したとしても、800μ秒と見なしてもかまいません。
次に最大値と最小値から中央の角度に動かすためのパルス幅を調べます。筆者のサーボモータは「800〜2300」の範囲で動作したので、中央値は「1550」となります。
61

2. 最大温度と最小温度のパルス幅を調べる
次に温度とサーボモータを制御するパルス幅を合わせます。servo.pyを使ってサーボモータを中央に移動します。ここでは中央値は「1550」なので以下のように実行します。

$ python3 servo.py 1550

サーボモータが中央に移動したら、腕のイラストを貼り付けたホーンをサーボモータに差し込みます。この際、目盛りのおおよそ中央になるように差し込みます。今回の場合は15℃ぐらいを指すように差し込みます。正確な15℃にする必要はありません。
次に目盛りの最大温度と最小温度を指すためのパルス幅を調べます。指定するパルス幅を変えながらservo.pyでサーボモータを動かし、最大または最小温度を指すようにします。正しく温度を指したらパルス幅をメモしておきます。筆者の環境では-10℃のパルス幅は「2150」、40℃は「1100」となりました。
62

目盛りの最大温度、最小温度、それぞれのパルス幅の4つの値を準備することで、温度からサーボモータを制御するパルス幅への変換が可能となります(実際にどのように変換しているかは、次に利用するプログラムを閲覧ください)。

プログラムを実行して温度を指さすようにする

ここまでできあがったら、温度計測とサーボモータの動作を合わせたプログラムを作成します。
以下のリンクから、プログラム「point_temp.py」をRaspberry Piにダウンロードします。

【ダウンロード】指さし温度計のプログラム「point_temp.py」
point_temp.py

ダウンロードしたらRaspberry Piのメニューから「アクセサリ」-「Text Editor」を選択してテキストエディタを起動し、ダウンロードしたプログラム「point_temp.py」を開きます。次に、4から7行目にあるサーボモータの動作範囲に関する設定を変更します。「MIN_TEMP」には温度計に描いた目盛りの最小温度、「MAX_TEMP」には最大温度に変更します。「MIN_PULSE」は、最小温度を指している角度にするためのサーボモータに送るパルスの幅、「MAX_PULSE」には最大温度のパルスの幅を指定します。前述した「servo.py」を使って調べたパルス幅を指定します。
設定ができたらファイルを保存してテキストエディタを終了します。
これで準備ができました。端末アプリを起動して以下のように実行します。

$ python3 point_temp.py

すると、温度センサが計測した温度をプログラムでパルスの幅に変換します。このパルス幅をサーボモータに送り、目的の温度を指さすようになります。

まとめ

今回は温度センサを使ってサーボモータで温度を示すようにしました。この仕組みを利用すれば、温度だけでなく湿度や気圧、重さ、水のかさなど様々なセンサで計測した結果をサーボモータを使って示すことが可能です。

deviceplus_vol3_cta_580x223_ver2
福田和宏

札幌在住のライター。電子工作やパソコン、Linux、スマートフォンなどの記事を執筆。「ラズパイマガジン」や「日経Linux」へ記事の執筆。著書として「これ1冊でできる!ラズベリー・パイ 超入門 」(ソーテック社)、「電子部品ごとの制御を学べる!Arduino 電子工作 実践講座」(ソーテック社)、「Arduino[実用]入門」(技術評論社)など。 現在、ものづくりをしたいメンバーを集めて電子工作を利用した作品などを制作する「サッポロ電子クラフト部」を主催(https://sapporo-elec.com/)。誰でも参加可能ですので、ご参加をお待ちしています。