0 そのほかのセンサーについても同 left_end_range ( 240 , 640 ) ードの 31 行目で反映しています。 が分かります。その情報を先ほどコ よそ 240 から 640 の間を振れること 最小値 237 、最大値 644 でした。お 外側左のセンサーは黒い線の上で 所はどこでも構いません。 er4. py 」として保存します。保存場 のコードを「 raspimouse_linefollow テキストエデイタを使って図 1 1 夫します。 ので、回路ではなくプログラムで工 で完全に同じ反応を得るのは難しい 影響を受けます。すべてのセンサー ンヘッダーなど、さまざまな要素の 体だけではなく、回路中の抵抗やピ れました。センサー値はセンサー本 センサーよりもだいぶ小さく出力さ ( 1 番左 ) のセンサーの値が、ほかの 筆者が使用した機体では外側左 こは [C t r 1 + C] で止める 2 3 8 6 5 7 5 6 5 7 0 5 2 3 7 6 5 8 5 58 712 240 653 572 699 240 663 564 705 この四つのセンサー値の最小値をメモ コース上の黒い部分での値 y ロ . /raspimouse linefollowerl . p ー値の最小値もメモしておきます。 一度実行します。出力されるセンサ コース上の黒い部分に合わせ、もう 次にラズバイマウスのセンサーを こは [C t r 1 + C] で止める 641 1331 13 7 7 13 7 3 6 3 8 13 2 8 13 7 9 13 64 644 133 5 13 88 13 7 7 641 13 31 13 7 6 13 7 9 この四つのセンサー値の最大値をメモ コース上の白い部分での値 特集 5 「ラすントレ = ス』に挑戦しよプ センサ = 値を補正しで行き先を決定 回 - ( 回 様にして left 、 right 、 right_end に それぞれ内側左、内側右、外側右が 対応するように、 32 ~ 34 行目でセ ンサー値の最大値と最小値を指定 します * 5 。ここで指定したセンサー 値の最大値と最小値を基に、 27 ~ 28 行目の「 normalize 」関数ではセ ンサー値を 0 ~ 1 の範囲の小数に変 換しています。これで、白あるいは 黒の部分に当てたときの各センサー の値がばらばらでも、 normalize に 通すと 0 ~ 1 の範囲に補正できます。 この範囲を外れてもわすかな値で収 まるはすです。 45 、 47 行目では、内側と外側の 左右のセンサー値をそれぞれ比較し て、それぞれ diff ーⅲ、 diff out とい う変数に代入しています。さらにそ こから、 49 行目で左右の車輪の回転 速度に差をつけるための変数 diff を 求めています。 49 行目の計算では、 diff_in の値 を半分にして diff_out と足して diff を求めており、 diff_in と比べて diff 。 ut の方を diff の変化に強く反映し ています。こうしているのは、外側 のセンサーの片方がラインにかかる 場合、内側のセンサーがラインにか かるよりも車体の向きがラインの向 きに対してより大きくすれているこ とを意味するからです。この場合、 より回転速度を大きくして車体を 戻す必要があります。 値を指定できたら、 MOTOR SW をオンに倒し、次のように raspimo use—linefollower4. py を実行してく ださい。 実行権限を付与 $ chmod + x raspimouse_linefoll ower4. py ロ Python のコードを実行 . /raspimouse_Iinef0110wer4. p y ロ ready ready ready 図 13 動画公開ページの QR コード キーポードや HDMI ケープルを が、外側左のセンサーでの設定例の通り、大 * 5 「最大値」「最小値」と表現しています てみてください。 などがあります。ぜひチャレンジし する複雑なコースを走らせたりする 上げたり、十字路や Y 字路など分岐 です。応用例としては、スピードを 今回書いたコードは簡易的なもの ことを確認しました。 ステッピングモーターを制御できる イバを通してセンサー値を取得し、 トレースさせました。デバイスドラ たコードでラズバイマウスをライン 用の基板を取り付け、 python で書い ラズバイマウスにライントレース 終わりに tu. be/bN9kpsJOclO) 。 意しています ( 図 13 、 https://you ースしている動画を YouTube に用 い、センサー値を校正しながらトレ 停止させます。四つのセンサーを使 ら、 SWI を押してラズバイマウスを コースを走り切れるこどを確認した レースが正確になったと思います。 開始します。先ほどよりもだいぶト う。 SWO を押してライントレースを ができたところでスタートしましょ 外し、コース上に設置します。準備 まかな値で問題ありません。 4 ラスパイマカジ - 年 2011.10
電子み、一 ツ 25 種必すくつな 利用部品 22 ジャイロセンサー x 1 個 特集 1 ジャイロセンサー 回転動作の速度を計測する ジャイロセンサーは、回転動作に ーン、ロボットなどで現在の姿勢を 関する速度 ( 角速度 ) を計測できる 把握するために活用されています。 センサーです ( 図 1 ) 。飛行機やドロ ドローンなどが安定した姿勢を保て るのは、ジャイロセンサーからの姿 電源につなぐと 勢の情報を得ているためなのです。 GND 卩 C モードになる ジャイロセンサーは、回転動作を 0 ピッチ、ロール、ヨーの三つの成分 0 に分けて取得できます ( 図 2 ) 。ピッ チは前後の傾きの方向、ロールは左 右の傾きの方向、ヨーは左右の「振 り」の方向に、それぞれ回転してい る成分を表します。 ジャイロセンサーの「 L3GD20 」 は、計測したデータを 12C 、 SPI の ◆ た値と、 1 秒間の回転量を表す角速 いすれかで通信して取得できます。 ◆ 度を計算して表示します。 ここでは、 12C を使ってデータを取 ◆ なおジャイロセンサーでは、角速 得する方法について説明します。 ◆ 度を計測しており、実際のセンサー 図 3 のように接続します。 12c を ◆ の傾きや向いている方角などは直接 使うには 5 番端子を電源に接続して 計測できません。傾きや方角につい ◆ おきます。また、 4 番端子を電源あ ては、求めた角速度を足し合わせる るいは GND に接続することで 12C ア ◆ ことで求まります。しかし、初めの ◆ ドレスを変更できます。 状態からの傾きや方角の変化しか分 ◆ ジャイロセンサーを動かすプログ からないので、加速度センサーや地 ◆ ラムは読者限定サイトに用意しま 磁気センサーを併用して実際の傾き ◆ した。ジャイロセンサーから取得し などを求めます。 卩 C は、 2 本の通信線を接続するだけでセンサーなどからデー 各線を枝分かれさせて、複数の卩 C デバイスを接続できる Raspberry Pi タのやり取りか可能な通信規格です ( 図 A)O データを送受信す SDA る「 SDA 」と機器同士がタイミングを取る「 SCL 」の 2 本を接 続するだけで通信できます。 SCL 尸 c は、複数の機器を接続に対応しています。この際、どの機 SDA SCL SDA SCL センサーの計測 器と通信するかを判別するために、各機器に割り当てられている 結果はレジスタ 卩 C アドレス : 0x 鬨 レジスタ 日 2c アドレス」を使います。 と呼ばれるメモ 温湿度センサー リーに保存され 卩 C アドレス :ox6a センサーなどで計測したデータはレジスタと呼ばれるメモリー る。レジスタに保 ジャイロセンサー それぞれの卩 C 機器には卩 C アドレスが割り 存されているデ に保存され、 RaspberryPi などからデータの保存されているレジ 当てられており、通信元が卩 C アドレスを指 ータを Raspberry スタのアドレスを指定することで取得できます。レジスタにテー Pi から読み取る 定することで、対象の機器と通信できる タを書き込んで設定を変えたりすることもできます。 図 A 2 本の線でデータ通信ができる日 2c 」 センサー部分 Z 軸 Y 軸 6 ・ 00 ぎ 汀 1 」 6 X 軸 卩 C アドレス選択 電源 電源につなぐと 0x6b 、 3.3V SCL SDA GND につなぐと 0x6a 02C ) 02C ) 図 1 姿勢について計測できる「ジャイロ センサー」 5 図 3 接続図 A Z 軸 ピッチ X 軸 ・・第を第・ Y 軸を前とした場合 Y 軸ロール 図 2 ジャイロは回転連動を計測する 2 本の線だけでデタをやり取りできる日 2C 」 SDA SCL 卩 C アドレス : 0x1e 地磁気センサー ラスパイマカジン 201 ⅱ 0
1 電子、一 ーーツ 25 種すくつなぎ 20 加速度センサー x 1 個 特集 1 利用部品 加速度センサー 、加速した向きや傾きを調べる 加速度センサーは、アクセルやプ き、そこからセンサーがどの程度傾 ライプラリは別途ファイル「 1is3 レーキをかけるなどといった加速度 いているかも導き出せます ( 図 2 ) 。 dh. py 」として用意しておき、プロ を計測できるセンサーです ( 図 1 ) 。 加速度センサーの「 LIS3DH 」は、 グラムと同じフォルダーに保存して 重力も加速度の一種なので、どの方 X 軸、 Y 軸、 Z 軸に分けて加速度を おきます。ライプラリをプログラム 向に重力がかかっているかを計測で 計測します。計測した結果は、 12c で利用するには、「 form lis3dh imp 0 または SPI のどちらかで取得できま ort lis3dh 」と呼び出しておきます。 0 AD コンバーターとして す。ここでは SPI を利用し、図 3 の ライプラリによっては「クラス」 0 使える端子を三つ備える ように接続します。 を使ってプログラムをまとめてある 0 図 4 のプログラムを実行すると、 場合があります。クラスとは関数や Z 軸 各軸の加速度と、加速度から求めた 変数などをひとまとまりにしておく Y 軸 センサーの傾きが表示されます。 方式です。クラスの機能を使うとき 加速度センサーで傾きを得るに には、その「インスタンス」を作成 は、初期化の後、計測結果を取得 します。例えば、 lis3dh クラスを使 ◆ する、データを利用できる形式に変 うには「 accel = lis3dh() 」のように ◆ 換する、計測結果から傾きを求める ◆ 記述します。 などさまざまな処理が必要になりま ◆ この後は作成したインスタンスの す。これらの処理をライプラリとし ◆、 「 accel 」を利用してセンサーを制御 てまとめておくと、ほかのプログラ ◆・ します。例えば、センサーから値を ムでも使い回しができます。今回の ◆、 読み取る関数の read_accel() を使う 重力から傾 ◆・ プログラムでも加速度センサーを制 には、「 accel. read_accel() 」のよう いている角 ◆、 御する処理を「 lis3dh 」というライ 度が分かる に関数の前にインスタンス名を付加 ◆、 プラリとして製作してあります。 します。 ◆ ◆イ ◆、 センサー 0 0 0 6 0 6 9 0 9 9 9 0 9 X 軸 電源 CS 3.3V SDO GND ( M 旧 0 ) SPC SDI (SCLK) (MOSI) 図 1 加速度や重力の向きを検知できる 「加速度センサー」 加速度センサー import wiringpi as pi from 1is3dh import 1is3dh import time 重力 図 2 重力を 3 軸の成分に分けて検出する ことで傾き度合いを導き出せる 加速度センサーのライブラリを読み込む 加速度センサーを接続した S 曰の CE を指定する SPI_CS 0 SPI_SPEED = 100000 pi . wiringPiSPISetup (SPI_CS, SPI_SPEED) 加速度センサーを「 accel] という名前で 通信できるようにする 1is3dh( SPI_CS ) a C C e 1 w h i 1 e T r u e : ( x, Y, z ) p r i n t ( "x : accel . read_accel ( ) Z : 各軸の加速度を取得する ( x—angle, y—angle ) accel . conv_angle( x, Y, z ) 加速度か print ()X Ang1e:' x—angle ー Y An g 1 e : " y—angle ) ら傾きを 求める 24 6 t i me . s 1 eep ( 1 ) 図 4 加速度と傾きを取得するプログラム「 acce ゆ y 」 図 3 接続図 ラスパイマガジン 2017.10
ーを で動かそ をで確認 尸 C と呼ぶイノタフ、土スを持つセンサーを Raspber Ⅳ Pi につないで制御してみましよう。センサーごとに制御方法 ? 違いますが、デパイスメーカーのデータシートをホイントだけ読めは動かし方が分かります。気圧センサーを実際に ないでい定期的に計測値を記録してみます & 気候の変化をデータで示せます。 安東一真 ) は難解なドキュメントですが、ポイ ス」という番号を指定して個々のデ Raspberry Pi にいろいろなセンサ ーをつなぐと、電子工作の楽しみが ントを絞って読んでいけば何とかな バイスと通信します。 広がります。温度や湿度、距離、気 ります。 圧といった外部の状況を把握して、 ここでは気圧センサーを題材に C デバイスを選ぼう 対応する制御ができます。ロポット Raspberry Pi につないで動かす方 まずセンサーを選びましよう。今 もいわばセンサーの固まりです。 法を途中の過程も含めて紹介しま 回は、「ストロべリー・リナックス」 す。定期的に大気圧を測って記録 Raspberry Pi でセンサーを利用 のオンラインショップ (https:// する場合、通常「 12C 」または「 SPI 」 し、天候の変化をデータで示せるよ strawberry-linux.com/) で気圧セ と呼ぶインタフェースに対応した製 うにしましよう ( 図 1 ) 。 ンサーを選びました。「気圧 12C 」と 品を選びます。選択肢は豊富にあっ いうキーワードで検索すると、「 MP て、選ぶのに困るほどです。 L115A2 」というセンサーを見つける 何を買うか決めて ところがこうしたデバイスを制御 ことができました ( 2017 年 8 月 7 日 回路を組み立て するのは、それほど手軽ではありま 時点 ) 。製品の Web ページでざっと せん。 12C や SPI に対応するデバイ インタフェースは、ホビーでも扱 スペックを確認します。 Raspberry スは一種のコンピュータであり、デ いやすい対応センサーが多い 12C を Pi の端子の動作電圧である 3.3V に バイスごとに異なる制御手順を理 選びました。データをやり取りする 対応していることが確認できます。 解する必要があります。 SDA と、クロックの SCL という二 パーツを選ぶときに大事なのが実 鍵になるのは、デバイスメーカー つの線で通信するインタフェースで 際に利用した " 先人 " が多いかどう が用意するドキュメント「データシ す ( 図 2 ) 。同じ線に複数のセンサ かです。 Google などで「製品名 Ra ート」の読み解き方です。初心者に ーをつなぐことができ、「 12C アドレ spberryPi 」と検索してプログなど を調べます。 MPL115A2 で調べてみ ると、利用者が豊富にいることが分 かりました。先人のプログなどは、 ある日の深夜から翌日の昼にか けて天候が荒天から晴れに向 かったが、気圧も上がっていた 気圧 [hPa] 1 1 182 1 マスター (Raspberry Pi) SDA データ ( 双方向 ) クロック SCL SDA SCL SDA SCL スレーブ 1 スレーブ 2 ( センサー 1 ) ( センサー 2 ) SDXSerial Data 、 SCL:Serial Clock 図 2 卩 C の仕組み 0 時 6 時 12 時 図 1 気圧センサーで 5 分ごとに測ったデータ 表計算ソフトで測定データをグラフにした。 ラスパマガジン 2011.10 特別付録 を 第
1 #!/usr/bin/env python3 2 # - ☆ - coding: utf-8 - ☆ - 3 import time # sleep のためのモジュールをインポート ( 略 ) 6 def get-line-sensor-data(): 11 def set_motor_speed(left, right) : ( 略 ) 17 def set motor_power(mode): ( 略 ) 22 def get_switch-input(swnum) : 26 # センサー値を正規化するための関数を用意 27 def normalize(), rng): return (V 30 # センサーの値の範囲 なります。 31 left_end_range 32 left_range ライントレースする際、左側の 33 right_range センサーがライン上にあるとき、本 34 right_end_range = ( 500 , 1600 ) 体を左に向ける必要があります。 m a 1 n n a m e のとき、センサー値の差 (left-rig while not get-switch-input(0): # SW0 が押されるまで待機 print("ready") (t) が負の数になります。「 set-mot time. sleep(0.1) or-speed 」に与える引数 (100 + diff, set_motor_power(True) while not get-switch-input(l): # SWI が押されたら止める 100-diff) は左車輪の方が小さく、右 41 # センサー値を取得 車輪の方が大きくなります。右車輪 left end, left, right, right-end = get-line-sensor-data() の方が速く回転することで本体を左 # 内側のニっセンサー値を校正・比較 44 に向けることができます。この「セ # 外側のニっセンサー値を校正・比較 ンサーの差を計算」「車輪の回転速 47 # 校正したセンサー値を合算 度に反映」の行程を繰り返すことで diff = diff_in/2 + diff_out ライントレースを実現しています。 print(diff_in, diff_out) set_m0tor-speed(100*(1 + diff), 100*(1-diff)) 先ほどと同様にラズバイマウスの time. sleep(0.1) # 0.1 秒毎にセンサー値とモーターの回転速度を更新 車輪を浮かせた状態にし、 MOTOR set_m0tor-power(FaIse) SW をオンに倒し、次のように raspi 図 1 1 raspimouse linefollower4. py mouse—IinefoIIower3. PY を実行しま の校正 ( キャリプレーション ) もし 落下しないよう十分に注意しましよ す。 て、もう少しトレースの精度を向上 う。ったないながらもトレースがで させます。 きることを確認できたと思います。 実行権限を付与 $ chmod + x raspimouse—linefoll 校正のために raspimouse-linefol 場合によってはカープを曲がり切れ ower3. py lowerl. py を使用してセンサー値の なかったかもしれません。ライント Python のコードを実行 . /raspimouse—IinefoIIower3. P ばらっきを把握しましよう。ます、 レースができている ( ロポットがト y ロ ラズバイマウスのセンサー四つをコ レースしようとしている ) ことを確 ready ready ース上の白い部分に合わせ、 raspi 認したら、 SWI を押してラズバイマ ready mouse—linefollowerl. PY を実行しま ウスを停止させます。 す。そのとき端末に出力された四つ のセンサー値の最大値をメモしてお トレースの精度を向上させる 実行後、 HDMI ケープルやキー きます。 ボードを外します。コースの黒い線 raspimouse linefollower3. PY で は内側の二つのセンサーの値をその の上にラズバイマウスを置き、 SWO ままステッピングモーターの回転速 を押しましよう。ラズバイマウスが 度へ反映していました。今度はセン 走り出します。机の上にコースを設 サーを四つとも使用し、センサー値 置している場合はラズバイマウスが 右側のセンサー の位置 左側のセンサー の位置 ( 黒い線の上 ) ( 白い紙の上 ) ・ E ・ ec E 第・ ( 嘴 E ・を C 町 ( ORPO 舩引 ON 第ゞ 図 10 コース上のセンサーの位置 - rng[0]) / (rng[l] - rng[0]) = ( 240 , 640 ) = ( 650 , 1350 ) = ( 550 , 1400 ) メモした値を代入 diff_in = normalize(left, left_range) - normalize(right, right-range) diff out = normalize(left-end, left end_range) - normalize(right-end, right-end-range) 1 . /raspimouse—linefollowerl . p ザ ラスパイマガジン 2017.10 0
0 続き番号 0 送信機の 電源電圧 [mV] 3L6 : 5 : 0 0 0 0 0 0 0 0 : 1 5 6 : 0 0 1 : 1 0 0 8 f 0 3 : 3 1 0 0 : 2 4 6 0 ; 7 9 2 6 : 1 3 2 1 : 0 8 4 6 : L : ②未使用 3 送信機の D (MAC 0 未使用⑩ A 旧の電圧 [mv] アドレスの下 7 桁 ) LQI: 0 ~ 255 、電波通信品質を表す尺度で 数値が大きいほど品質が高い 図 9 温度センサーからのデータを読み取ったところ す。ま v$TWELITE DIP のモード センサ三を 設定ビット 2 (M2) を GND につな 子機につなごう ぎます。その状態で TWELITE R に セットし、 TWELITE R を Raspbe 続いてセンサーを子機に接続しま rry Pi の USB ポートに接続します。 しよう。 $ miniterm. py /dev/ttyUSB0 115 温度センサーをつなぐ 2 0 0 ロ まずは温度センサーです。プレッ ドボードなどを使って図 8 のように を実行して TWELITE R の RST>F タ 配線してください。今回のファーム DIP にファームウェアを書き込むた ンを押すとインタラクテイプモードに ウェアではアナログセンサーを AI トワイライタ ーでは TWELITE R をライ 入ります。次のように表示されます。 (Analog lnput) の 1 、 3 番のどちら ターとして使用します ( 写真 2 ) 。 かにつなぎます。 LM61 は 3 番につ まず TWELITE R に TWELITE なぐことで温度計算までできます。 d : S1eep Dur ( 5000 ) set DIP を差し、 TWELITE R と Raspb 電源には単三電池を 2 個使います。 S e n s 0 r M 0 d e ( 0 x 1 0 ) m : set erry Pi を USB ケープルで接続しま DO (DigitaI Output) の 3 番には す ( この状態で Raspberry Pi と TW 動作確認用の LED をつなぎます。電 S : save Configuration ELITE DIP 間でシリアル通信する 源を入れて 5 秒に 1 回点灯すれば OK R : r e s e t t 0 D e f a u 1 t s こともできます ) 。 Raspberry Pi の です。 Raspberry Pi に MONOSTICK コンソールで次を実行します。 を接続して起動し、温度センサーの アナログセンサーをつないで通 値を読み取れるか確認します。 . /firm_write -t /dev/ttyUSB0 信頻度を変える場合、 d を入力し /opt/MW—App—Tag/App—Tag/App_T ます。通信する時間の間隔はミリ a g - E n d D e v i c e - B LU E . b i n ロ $ miniterm. py /dev/ttyUSB0 115 2 0 0 秒で指定します。デフォルトの 5 秒 MONOSTICK と同様に「 OK 」な ( 5000mS ) から 1 分 ( 60000mS ) に どと出力されれば成功です。 変える場合、 60000 と [Enter] キ を実行すると 5 秒以内に図 9 のよう 子機のファームウェアはデフォル ーを入力します。 に出力されるはずです。 トでアナログセンサー用になってい 使用するセンサーを指定する際に ⑦の温度が、 A13 につないだ温度 ます。温度センサーや磁気スイッチ m を入力し、温度センサーを用いる センサー LM61 の出力電圧から温度 を用いる場合、インタラクテイプモ 場合はセンサーモードとして 11 と を計算したものです。これを 100 で ードでセンサーモードを変更する必 [Enter] キーを、磁気スイッチの場 割って、手元の温度計と同等なら子 要があります。また、親機との通信 合は 51 と [Enter] キーを入力しま 機と正常に通信できています。 0 と 頻度を変更することもできます。 す。どちらも最後に S を入力して設 ⑩で AII と A13 の電圧を読み取れま 定を保存すると、設定した値を確認 TWELITE DIP ではインタラク す。ほかのセンサーの場合はこの値 テイプモードへの入り方が違いま できます。 を利用します。 ①親機起動後の タイムスタンプ [s] ⑦温度 [ ℃ ] OAII の電圧 [mv] X 100 0 0 TWE-Lite-R 写真 2 ライターの「 TWELITE R 」 丸ピンヘッダーを取り付けた例。 0 3V TWELITE DIP 0 VOUT LM61 GND 十 Vs 680C LED Vcc GND Vcc 図 8 子機に温度センサーをつなぐ回路図 40
利用部品 目地気センサー 21 コン / ヾスモジュール x 1 個 世の第有あ科をべを これで計測値が補正され、 X 軸の向 地磁気は非常に弱い磁界なので、周 地磁気センサーは、磁気の強さを いている角度が表示されます。 りにスピーカーなど磁界を発生する 計測できるセンサーです ( 図 1 ) 。地 機器などがあると、計測値がずれて 球は s 極 ( 北極 ) から N 極 ( 南極 ) しまいます。このずれを簡便に計測 に向かって磁気を帯びています。方 計測の中心が ずれている する方法として、水平にしたセンサ 位磁針 ( コンパス ) を置けば、北極 と、地磁気の 強さが異なっ ーをぐるっと 1 回転させ、そのとき や南極の方向が分かります。 てしまう の計測値を調べる方法があります。 地磁気センサーも地球の磁気を X 軸と Y 軸のそれぞれについて、最 検知し、数値として出力します。計 ◆ 大値と最小値を調べ、その中心値が 測装置は、 X 軸、 Y 軸、 Z 軸の三つ ◆ 0 からすれていれば、その分だけ補 の成分に分かれていて、各成分から ◆ 正するのです ( 図 3 ) 。 向いている方向を求められます。 ◆ 「 compass-cab. PY 」を実行して補 12c 通信に対応している地磁気セ ◆ 正値を求めます。実行したらゆっく ンサーの「 HMC5883L 」は図 2 のよ 計測の中心が ◆ りと地磁気センサーを 1 周させ、表 正しければ、 うに接続します。 どの方向を向 ◆ 示された値をメモしておきます。そ 地磁気センサーは「校正」 ( キャリ いても地磁気計測の中心がずれて ◆ しまっている の強さは同じ の値をプログラム ( 図 4 ) の「 x- プレーション ) の操作が必要です。 図 3 地磁気センサーは計測値にずれが生 cab 」と「 y-cab 」に書き込みます。 各軸の方向を表すマークセンサー部分 : ◆ SDA 02C ) 電源 (5V) SCL 02C ) 電源 ( 3.3V ) GND 図 1 地球の地磁気を計測して方角を導き 出せる「地磁気センサー」 Y 軸 の値 / 来測 本計 X 軸 / ずれた 計測値 2 。 7 第 import time, wiringpi as pi from hmC5883 import hmC5883 地磁気センサーのライブラリを読み込む 地磁気センサーの impo アドレスを指定 HMC5883L_ADDR = 0xIe = 0 . 92 S C a 1 e scale_data = 0X01 = 38 . 5 - 2 08 . 0 X C a b y—cab commpass-cab. PY で取得した補正値を指定 温湿度センサーを「 sensor 」という 名前で通信できるようにする scale, scale—data, x—cab, y—cab ) = hmC5883 ( i2c, HMC5883L—ADDR, pi . wiringPiSetupGpi0() i 2c = pi . 12C ( ) compass w h i 1 e T r u e : ( x, Y, z ) compass . get—data() 地磁気センサーから各軸 のデータを取得 print ( compass . calib( x, Y ) ( x—c , y—c ) compass . angle( x—c, Y—C angle 取得した値から方角を導 き出す angle ) print ( "Degree: t i me. s 1 eep ( 1 ) 6 5 図 4 地磁気の強さと方角を取得するプログラム「 compass. py 」 あらかじめ compass ー cab. py を実行して補正する必要がある。 図 2 接続図 ラズバイマガジン 2011.10
CÄ電子ハツ 25 種必すくつな 18 大気圧センサー xl 個 35 コンデンサー 0.14F x 1 個 利用部品 大気圧を計する 大気圧センサーは、気圧を計測で 分かり、これから天気力繃れる可能 図 3 のプログラムを実行します。 きるセンサーです ( 図 1 ) 。気圧は天 性があります。 大気圧センサーの計測プログラムは 気の移り変わりを知るのに活用でき 今回利用する大気圧センサーは、 「 mP1115a1 」ライプラリとして読者 ます。例えば、気圧が急激に低下し 図 2 のように接続します。接続には 限定サイトに用意しました。 た場合は、低気圧が来ていることが 向きがあり、一方の端に凹状の線が 大気圧センサーは計測値にプレ 書かれています。この方向が左にな が生じます。そこで、何回か計測 センサー部分 るようにプレッドボードに差し込み をしてその平均値を取るようにしま 電源 ( 3.3V ) →。 ます。この大気圧センサーは値がう す。プログラムでは「 PRESS_AVE 」 0 外部コンデンサー→ まく定まらないことがあります。そ で平均を取る回数を変更できます。 DOUT (MISO) GND--> の場合は、 2 番端子に 0. 取 F 程度の 「 press. read-press() 」で大気圧を スリーフ・ ◆ - 飛 図 1 大気圧を計測できる「大気圧センサ コンデンサーを接続します。 hPa 単位で取得できます。 ◆・ ◆、 import wiringpi as pi import time ◆ f r om mp 1 115 a 1 i mp 0 r t mp 1 115 a 1 ◆、 ◆、 ◆・ ◆、 ◆、 ◆、 ◆、 ◆イ ◆、 ◆、 ◆、 気圧センサーのライブラリを読み込む S P I C S S P I S P E E D 0.1 Ⅲ旧・・ 100000 PRESS_AVE = 平均値を取る計測値の数を指定する pi . wiringPiSPISetup( SPI_CS, SPI_SPEED ) 気圧センサーを「 press 」 という名前で通信できる ようにする センサーから気圧を取得する " h P a " mP1115a1 ( SPI_CS, PRESS_AVE ) press wh i 1 e ( True ) : press_data 6 24 press . read_press() p r i n t ( " P re S S u re : press—data t i me . s 1 e e p ( 1 ) 図 3 大気圧を計測するプログラム「 p 「 ess. py 」 図 2 接続図 S 曰は、 4 本の線を利用してセンサーなどの機器とデータをや Raspberry Pi り取りできる通信規格です ( 図 A)O データは「 MOSI] ( 送信 ) 、 SCLK 「 M 0 」 ( 受信 ) の 2 本の線で受け渡し、高速の通信にも対応で MISO きます。 SCLK では、通信機器同士が同期を取るための信号を M03 送ります。 CEO SPI は複数の機器を接続して通信が可能です。通信対象とな CEI る機器を指定するために、「 CS 」 ( または CE 、 SS などと呼ぶ ) Low SCLK OUT CS SCLK OUT 爪 CS を接続します。通信対象の機器は CS を「 Low 」にして指定しま 大気圧 AD コンバ通信しない機器 す。なお、 Raspberry Pi では CEO ( 24 番端子 ) 、 CEI ( 25 番 センサー は、 CS を「 High 」 にしておく 端子 ) が用意されていて、最大ニつの s 曰機器を制御できます。 図 A 4 本の通信線でデータ通信ができる「 sp 凵 4 本の線を利用して高速に通信できる「 SPIJ 各線を枝分かれさせて、複数の S 曰機器を接続できる 通信対象の機器に は、 CS を「 Low 」 にセットする ラスパイマガジン間 17
、、安価で手軽な無線マイコン「 TWE 凵 TE 」と Raspberry Pi を組み合わせ、自宅のいろいろな場所に温度センサーや、扉の 開閉センサー ( 磁気スイッチ ) を設置しましよう。一定温度を超えたときや扉の開閉時につぶやくマシンに仕立てます。 ( モノワイヤレス齋藤拓史、奥村成吾 ) 自宅のいろいろな場所にセンサー で ) 10 年以上使えるほど省電力で ( 写真 1 ) を使い、センサーを接続し す * 1 。センサーをつないだ無線マイ を設置して、今の状況を調べられる て計測結果を親機へ送信します。 センサー無線ネットワーク。 Raspb コンを自宅内にたくさん置いて、 Ra ここではセンサーとして、温度 erry Pi を使えば、そんなシステム spberry Pi に情報を収集できるよう センサー「 LM61 」と磁気スイッチ も手軽に構築できます。 にしましよう。 「 MC-14AG 」を使います ( 表 1 、図 ただし Raspberry Pi は安価とは TWELITE はいくつかのバリエ 2 、 3 ) 。磁気スイッチは冷蔵庫や玄 いえ、センサーを設置する場所ごと ションがあります。 Raspberry 関などの扉に取り付け、開閉をチェ Pi には無線の親機として、 USB ポ に置くのはコストがかかります。そ ックするのに便利なものです。磁石 こでモノワイヤレスの無線マイコン ートにつなげる USB ドングル版 トワイライト モノスティック * 1 このほか、 32 ビット CPU を用いていて 「 TWELITE 」を活用します。 TWE 「 MONOSTICK 」をつなぎます ( 図 高速処理が可能、標準アンテナで最大 lkm LITE は、 1 台 1500 円くらいから購 1 ) 。子機にはプレッドボードにその と長距離通信が可能、多数の子機を接続可 能といった特徴があります。 入でき、ボタン電池でも ( 間欠駆動 まま差して使える「 TWELITE DIP 」 図 2 子機に温度センサーを取り付けたと 図 3 子機に磁気スイッチを取り付けたと 表 1 部品表 すべて秋月電子通商で購入した。 図 1 USB ドングル版の「 MONOST ℃ K 」 Raspberry Pi に差したところ。 一個数ー価格 分類 2980 円 200 円 250 円 100 円 1620 円 X 2 270 円 X 2 180 円 20 円 X 2 100 円 80 円 x 2 2430 円 ロロ : 親機 MONOST ℃ K 1 LM61ClZ ( 4 個入り ) 子機の温度センサー 1 MC-14AG ( 磁石付セット ) 1 子機の磁気スイッチ 抵抗 IMQ ( 100 本入り ) 1 TWELITE DIP-WA ( 半完成品セミキット ) 2 ブレッドボード E ℃ -801 2 ブレッドボードジャンバーコードセット センサー以外に 1 子機で利用するもの 緑色 LED 2 ( 2 台分 ) 抵抗 680Q ( 100 本入り ) 2 電池ポックス単 3X2 本用 ( フタ付プラスチック・ス 2 イッチ付 ) その他 TWELITE R 1 写真 1 ブレッドボードに差して使える 「 TWELITE D 旧」 37
一、 0 咏がこほないお作ろプ ーで傾きを Raspberry Pi は電子工作を手軽に楽しめるのが大きな魅力です。加速度センサーを取り付けて傾きを検知し、サーボモー ターで傾きを調節して水平を保つ「バランストレイ」を作成してみましようよこうした「フィードバック制御」はロボット製 作の基本になる技術です。ここでは加速度センサーで傾きが分かる仕組みも詳しく解説します。。 ( ライター福田和宏 ) トレイに液体を入れたコップを載 す。 Raspberry Pi は筆者は Pi 3 を使 なくなります。加速度センサーでは、 せたとき、トレイの取っ手を持って傾 いましたが、どのモデルでも問題なく このコンデンサーの一方の板を固定 使えます。 OS は Raspbian を利用し けたとしても、水平を保ってくれる していて、もう一方をバネに付けてあ 「バランストレイ」を作ってみましょ ます。 ります。これで加速がかかるとバネが う ( 図 1 ) 。 伸び縮みして、板の間の距離が変わ 加速度センサーと センサーにはモノの動きを検知す ります。このときの電荷の量を計測す サーボの動作原理 る「加速度センサー」を使い、特定 ることで加速度が分かるのです。 の回転角度に制御する「サーボモー ます今回のフィードバック制御を ター」 ( サーボ ) でトレイを動かしま 実現する加速度センサーとサーボの 重力という加速度で傾きを検知 す。加速度センサーでトレイの角度を 動作原理を紹介します。 この加速度センサーで傾きを調べ 読み取り、水平方向という目標に向 られるのは、地球では重力により、真 かって動くようにします。 加速度はコンデンサーで分かる 下方向に常に加速がかかっているか サーボは 2 個使い、それぞれ前後方 トレイの傾きを調べる加速度セン らです。バネの原理で考えれば分か 向と左右方向のすれを元に戻します。 サーは、取り付けたモノが加速してい りますが、板がバネの下にあればバネ このバランストレイの手法はロポット る度合いを電圧や数値として出力す は伸びますし、逆なら縮みます。この の姿勢制御などでも用いられていて、 るものです。これでトレイの傾きが分 地球の重力による加速度を IG と表し ロボット製作の基本ともいえます。 かります。 ます。 今回の工作で購入した機器は表 1 加速度センサーは「コンデンサー」 今回利用する加速度センサーは 3 の通りです。サーボ制御用のドライバ の原理を利用して加速度を検出しま 軸、つまり縦 ( x 軸 ) 、横 ( Y 軸 ) 、高 ーは 2 種類を紹介していますが、どち す。コンデンサーとは 2 枚の導電性の さの (Z 軸 ) の 3 方向の加速度を計測 らも「 PCA9685 」というチップを使っ 板を向かい合わせにした素子です。板 できます。加速度センサーが水平にな ていて基本的な使い方は同じです。ど の間に電圧をかけることで、一方には っていれば、高さ方向に IG の加速度 ちらか一方を使ってください。このほ + 電荷が、他方には一電荷がたまり が検出されます。これを基準に、縦 かにジャンパー線などのケープルや、 ます。たまる電荷は、板同士の距離 や横方向にも加速度が検出されます 傾 0 、た角度を調 取っ手を組み上げる板などが必要で が近くなれば多くなり、遠くなれば少 この加速度から、 ミルクを入れたコップを トレイは水平に保たれる 表 1 部品表 加速度・ジャイロセンサー 「 MPU -6050 」 サーポモーター 「 MiniS 日 B90 」 ( 2 個 ) サーポドライバーは次のどちらかを利用 PCA9685 搭載 16 チャネル PWM/ サーポドライバー 02C 接続 ) Adafruit に C 接続 16 チャンネル 12 ビット PWM/ サーポシールド 参考価格 参考購入店 品名 Amazon. CO. jp ( MPU -6050 で検索 ) 千石電商 (2A4A-JAJP で検索 ) スイッチサイエンス (http://ssci.t0/961 ) スイッチサイエンス (http://ssci.t0/1411 ) 210 円 1810 円 2095 円 2462 円 図 1 トレイの傾きを水平に保つ「バランストレイ」 サーポモーターがニっ付いていて、それぞれ前後、左右の傾きを調整する。 ラスパイマガジン 2017.10 特別付録