2016年6月27日月曜日

Raspberry Pi上のScratchでアナログ入力を利用してみた

-1. はじめにのはじめに

本ページの内容は、NOOBS 1.9.3およびNOOBS 2.0.0ではScratchのバグにより動作しませんのでご注意ください。最新のNOOBSで試すことをおすすめします。

なお、本ページで対象としているのはメニューの「プログラミング」→「Scratch」で起動できるScratch バージョン1.4です。Scratch 2は対象としていませんのでご了承ください。

0. はじめに

中学生を対象とした電子工作関連のセミナーを担当するにあたり、Scratchによる電子工作で何ができるかを調査しました。

前回のエントリ「Raspberry Pi上のScratchでDCモーターを制御してみた」でRaspberry Pi上のScratchを試してみたところ、と、デフォルトで
  • デジタル(0/1)の入出力
  • ソフトウェアPWM出力
が取り扱えることがわかりました。

ここまでできるのならアナログ入力も取り扱えるようにしよう、というのが今回のエントリです。

結論から言うと、PicoBoardというボードの通信仕様をそのまま用いることで、アナログ入力を利用できることがわかりました。

下図は、前回取り扱ったDCモーター搭載のキャタピラ式模型の前面に距離センサを取り付け、障害物までの距離を一定に保つというデモの様子です。


その様子を示した動画がこちらです。


1. 方針

まずは方針について解説します。

PicoBoardというボードを用いると、Raspberry Piに限らず、WindowsやOS X上のScratchでセンサ入力を取り扱えるようになります。しかし、セミナなどで使うために複数購入するには、価格がやや高いのが難点です。

PicoBoardはシリアル通信でScratchにデータを送るのですが、その仕様は公開されています。これを自分で実装すれば良さそうです。

一番簡単なのは、「Scratching with Arduino」に基づいて、Arduinoで「AD変換+シリアル通信」の機能を実現することでしょう。しかし、この方法もやはり一つあたり数千円かかるので、低価格で複数用意したい、という今回の目的を満たしません。

なお、本ページではArduinoによる実現については解説しませんが、Arduino UnoではRaspberry Pi上のScratchから認識されないので注意が必要です(/dev/ttyACM0 が使われるため)。「FTDI USBシリアル変換アダプター(5V/3.3V切り替え機能付き)」などのように、/dev/ttyUSB0 が使われるデバイスを介する必要があります。

さて、「AD変換+シリアル通信」をなるべく低価格で実現するため、本ページでは「PIC12F1822」または「PIC16F1823」用いることにしました。

PIC12F1822では3個の入力、PIC16F1823では8個の入力を取り扱うことができます。学習目的ならば入力3個のPIC12F1822で十分かな、と個人的には思います。PIC12F1822の方がピン数が少なくて中学生には取り扱いが容易、というのも理由の一つです

なお、シリアル通信はUSB経由ではなく、Raspberry Piのピン番号8, 10のGPIOを用います。

2. Raspberry Piでシリアルコンソールを無効に

さて、上述のようにRaspberry Piのピン番号8, 10のGPIOをPICとのシリアル通信で用いるため、Raspberry Piでシリアルコンソールを無効にする必要があります。

まず、/boot/cmdline.txtを管理者権限のテキストエディタで編集します。
sudo leafpad /boot/cmdline.txt
その中に下記のように「console=serial0,115200」という部分があるので…
dwc_otg.lpm_enable=0 console=tty1 console=serial0,115200 root=/dev/mmcblk0p7 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
これを以下のように削除して保存し、テキストエディタを閉じます。
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p7 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
さらに、ターミナルを起動し、下記のコマンドを実行してシリアルコンソールを無効にします。
sudo systemctl disable serial-getty@ttyAMA0.service
以上が終わったらRaspberry Piを再起動します。

なお、Raspberry Pi 3ではさらにオンボードのBluetooth機能を無効にしする必要があります。 まず、ターミナルLXTerminalを起動し、下記のコマンドを実行します。
sudo leafpad /boot/config.txt
このコマンドにより、設定ファイル/boot/config.txtが管理者権限のテキストエディタleafpadで開きますので、末尾に下記の1行を追記して保存し、Raspberry Piを再起動します。
dtoverlay=pi3-disable-bt
もし、オンボードのBluetooth機能とシリアル機能を両方使いたい場合、こちらなどを参考にしてください。

3. PICにプログラムを書き込む

Raspberry Piに対してシリアル通信でデータを送るために、PICマイコンにこちらで用意したプログラムをあらかじめ書き込んでおく必要があります。

以前はこれをWindowsやMac OS X上でPICkit3というツールを用いて実現する方法を記していましたが、PICkit3を必要とせずRaspberry Piのみで実現する方法がわかりました。

その方法を別ページの「Raspberry PiのGPIOを用いてPICマイコンに書き込みをしてみた」に記しましたので、そちらを参照して準備を整えてから先に進んでください。

4. 回路を組んで動作させる

プログラムを書き込んだPICの用意ができたら、回路を組んで動作させるだけです。

今回PIC12F1822用に組んだ回路はこちら。前回同様、DCモーター一つを動かすプログラムになっています。



PIC12F1822の「A, B, C」と書かれた3つのピンがアナログセンサを接続できる箇所となっています。

モーター用電源以外は3.3Vで動作する回路としましたので、アナログセンサも3.3Vで動作するものを選択する必要があります。今回は「シャープ測距モジュールGP2Y0E02A」を選んでみました。

なお、ほぼ同じですが、PIC16F1823を用いた回路は下記の様になります。


こちらは、「A, B, C, D, スライダ, 明るさ, 音」と記されたピンにアナログセンサを取り付けられます。「ボタン」と記されたピンにはタクトスイッチからの入力を取り付けることができます。なお、「明るさ」は大小の向きが他と異なること、「音」は大小の変化の仕方が他と異なることに注意してください。これはもともとのPicoBoardの仕様だと思います。

さて、回路が組めたら、Scratchを起動します。

今回組んだプログラムはこちらです。PICから送られるセンサ値は0~100の整数値となっていますので、その値が55~65の場合と30~55の場合とで、モーターの向きを逆にしています。それ以外の値が入力された場合はモーターを止めています。


なお、このプログラムを動作させるためには、あらかじめScratchでセンサを読み取れるようにしておかねばなりません。

下図のように、センサの値を読み取るブロックで右クリックし、「ScratchBoard監視板を表示」を選択します。


すると、下図のようにスプライト表示部に「ScratchBoard監視板」が表示されます。


この「切」の部分で右クリックし、「シリアルかUSBのポートを選択」を選択します。


そこで、ピン番号8と10のGPIOに対応する/dev/ttyAMA0を選択します。


すると、下図のようにセンサからの入力が表示されるようになります。PIC12F1822の場合、値が有効なのは「A、B、C」の三つのみです。


この状態でキャタピラ式模型を動作させたのが冒頭の動画だったというわけです。

5. 終わりに

というわけで、Raspberry Pi上のScratchで下記の入出力が取り扱えることがわかりました。
  • デジタル(0/1)の入出力
  • ソフトウェアPWM出力
  • アナログ入力(0~100の整数値が読まれる)
ここまでできると、LEGOロボットのマインドストームのような教材として十分に使えそうですね。

実際にこの教材を用いて中学校で行なった講義の資料がこちらです。



こちらもどうぞ



「ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作」、「実例で学ぶRaspberry Pi電子工作」、「Raspberry Piではじめる機械学習」を執筆しました。

0 件のコメント:

コメントを投稿