2016年6月27日月曜日

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

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

本ページの内容は、NOOBS 1.9.2およびNOOBS 2.1.0で動作確認しています。その間のリリース、すなわちNOOBS 1.9.3およびNOOBS 2.0.0ではScratchのバグにより動作しませんのでご注意ください。

NOOBS 2.1.0以降のご利用をお勧めしますが、NOOBS1.9.3およびNOOBS 2.0.0で本ページの内容を試したい場合、ターミナルソフトウェアLXTerminalを起動し、下記の2つのコマンドを順に実行することでScratchが最新になり、本ページの内容が動作するようになります。入力ミスを避ける意味で、コマンドをそれぞれコピーして実行することを推奨します(先頭の「$」はコピーする必要がありません)。
$ wget https://raw.githubusercontent.com/raspberrypi/scratch/master/NuScratch20161021.tgz
$ sudo tar zxf NuScratch20161021.tgz  -C /


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ロボットのマインドストームのような教材として十分に使えそうですね。

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



こちらもどうぞ


「カラー図解 最新 Raspberry Piで学ぶ電子工作」、「実例で学ぶRaspberry Pi電子工作」を執筆しました。

2016年6月17日金曜日

Raspberry Pi上のScratchでDCモーターを制御してみた

0. はじめに

前回のエントリ「NOOBS 1.9.2でインストールしたRaspbian (jessie) 上のScratchで日本語入力を可能にしてみた」にて、Raspberry Pi上のScratchを使えるようになりましたので、本来の目的に戻り、ScratchでGPIOにアクセスしてみました。

目標は、DCモーターを一つ搭載したタンク型模型をScratchから操作することです。タンク型模型は下図のようにタミヤの楽しい工作シリーズで作成しました。


このタンク型模型をスプライトの動きに合わせて左右にコントロールしている様子を示した動画がこちらです。


1. 回路とプログラム

まず、作成した回路はこちら。モータードライバTA7291Pを用いています。GPIO 25と24からソフトウェアPWM信号を出力する回路としています。



そして、この回路に対して作成したプログラムは下図のようになります。

スプライトの動き(「向き」)が反転するたびに、「向き」は-90と90との間を切り替わります。それに応じてモータードライバへの出力を切り替えるプログラムとなっています。

プログラム動作中にスペースキーが押されると、モーターを止め、アプリケーションを終了しています。


2. ソフトウェアPWMについて

プログラム作成には、「Raspberry Piではじめる どきどきプログラミング」および公式のドキュメント「SCRATCH GPIO」を参考にしました。

公式のドキュメントでは、PWMの指定法について「gpio + pin number + pwm + [ 0..1024 ] 」と書いてあったので、0~1024でデューティ比を指定するのかと最初は思いました。

しかし、試してみるとどうも「0~256」程度の範囲がデューティ比0%~100%に対応しているようでした。上記のプログラムでは、デューティ比50%に相当する値128を用いています。

さらに、そのソフトウェアPWM信号の周波数ですが、オシロスコープで波形を見たところ、800Hzでした。100Hz程度だろう、と思っていたので、思いのほか高い周波数で驚きました。

また、下図では値128に対応するデューティ比が確かに50%程度になっていることも観察できます。


3. 終わりに

そのようなわけで、ScratchでGPIOにアクセスしてDCモーターを制御することができました。

これにより、タミヤの楽しい工作シリーズの様々な模型をScratchから操作できます。うまく使うと、小中学生のプログラミングの教材として面白いものができるのではないでしょうか?

こちらもどうぞ


「カラー図解 最新 Raspberry Piで学ぶ電子工作」、「実例で学ぶRaspberry Pi電子工作」を執筆しました。

2016年6月16日木曜日

NOOBS 1.9.2でインストールしたRaspbian (jessie) 上のScratchで日本語入力を可能にしてみた

0. はじめに

Raspberry PiでGPIOにアクセスする場合、プログラミング言語としてPythonばかり使ってきたのですが、ふとScratchではどうなんだろう、と思い、調べてみることにしました。

ところが、Scratchに触れること自体が初めてだったので、GPIOへアクセスする以前に、Scratchで日本語入力を実現する設定に手こずってしまいました。

そこで、日本語入力を実現するために行った方法をまとめておきます。用いたのは、執筆時に最新であったNOOBS 1.9.2に含まれるjessie系列のRaspbian (2016-05-27)です。Raspberry Pi 2のみで試しました。


1. Raspbianの日本語表示設定

Scratchの前に、まずはRaspbianで日本語を表示できるようにします。

jessie系列のRaspbianには日本語フォントが含まれないので、日本語表示設定の前にまず日本語フォントをインストールする必要があります。ターミナルを起動し、下記のコマンドを実行しましょう。
$ sudo apt-get update
$ sudo apt-get install fonts-vlgothic
フォントのインストールが終わったら、デスクトップ左上のメニュー(Menu)から、「Preferences(設定)」→「Raspberry Pi Configuration(Raspberry Piの設定)」をマウスで選択してください。

現れた設定用アプリケーションで「Localisation」→「Set Locale」を選択し、「Language」を「ja (Japanese)」に、「Country」を「JP (Japan)」に、「Character Set」を「UTF-8」に設定します。その後Raspberry Piを再起動すると、日本語表示されたデスクトップ環境が起動します。

その後、メニューから「プログラミング」→「Scratch」を選択すると、下図のようにメニューが日本語化されたScratchが起動します。

しかし、よく見ると文字があまりなめらかではありませんね。そこで、Scratch用には別のフォントを設定することにします。


2. Scrachの日本語表示設定

Scrachでの日本語表示に適したフォントをインストールし、それを用いるよう設定します。本節の内容は「Raspberry PiでScratchを使う際の覚書」を参考にしました。

まず、ターミナルを起動し、下記のコマンドでフォントをインストールしましょう。
$ sudo apt-get update
$ sudo apt-get install ttf-sazanami-gothic
インストール後、「/usr/share/scratch/locale/ja.po」および「/usr/share/scratch/locale/ja_HIRA.po」という2つの設定ファイルをテキストエディタで編集し、上記のさざなみフォントを用いるよう設定します。

まず、下記のコマンドにより、管理者権限のテキストエディタで「/usr/share/scratch/locale/ja.po」を開きます。
$ sudo leafpad /usr/share/scratch/locale/ja.po
この中で、
msgid "Linux-Font"
msgstr "Mona"
という2行を見つけ、これを下記のように編集します。
msgid "Linux-Font"
msgstr "Sazanami Gothic"
編集が終わったら保存してテキストエディタを閉じます。

同様に、下記のコマンドにより、「/usr/share/scratch/locale/ja_HIRA.po」をテキストエディタで開きます。
$ sudo leafpad /usr/share/scratch/locale/ja_HIRA.po
編集内容は「/usr/share/scratch/locale/ja.po」と全く同じです。編集したら保存してテキストエディタを閉じてください。

その後、Scratchを起動しなおすと、下記のようにメニューなどがきれいなフォントで表示されます。


3.日本語入力用アプリケーションのインストール

jessie系列のRaspbianでは、日本語入力アプリケーションとして、Googleが開発したMozcをインストールするのが良いでしょう。

ターミナルを起動し、下記のコマンドでインストールします。
$ sudo apt-get update
$ sudo apt-get install ibus-mozc
インストールが終わったらRaspberry Piを再起動します。

その後、下図のように「US」と書かれた部分をマウスでクリックし「日本語 - Mozc」を選択してください。あとは「半角/全角」キーで日本語入力のオンオフを切り替えられます。


4. Scrachに日本語入力を受け付けさせるための設定

次に、上で可能になった日本語入力をScrachに受け付けさせるための設定を行います。

ターミナルを起動し、テキストエディタでScratchの起動スクリプトを編集します。
$ sudo leafpad /usr/bin/scratch
最後付近にある下記の行を見つけます。
$WRAPPER "$VM" "$IMAGE" "$DOCUMENT" $IMOPTIONS
ここに、下記のように「 -vm-display-x11 -compositioninput 」を追記します。
$WRAPPER "$VM" -vm-display-x11 -compositioninput "$IMAGE" "$DOCUMENT" $IMOPTIONS
追記したら保存してテキストエディタを閉じます。

その後Scratchを起動し、文字を入力できる部分で「半角/全角」キーを押すと、左下に変換候補が表示され、日本語入力が受け付けられそうなことがわかります。


ここで、確定した変換が文字化けすることなく入力部に表示されれば、設定は終了です(将来のRaspbianではそうなると思います)。

しかし、NOOBS 1.9.2に含まれるRaspbianでは確定した文字列が下記のように文字化けしてしまいます。

これを直す設定をさらに行っていきましょう。


5. Squeakのvm-display-x11をビルドしなおす

最後の手順です。長いですが一つずつ実行していきましょう。なお、この節の内容は「RaspbianのScratch1.4で日本語入力(QEMU上だけど)」を参考にさせて頂きました。

Squeakというアプリケーションを再ビルドし、vm-display-x11というプラグインを差し替える必要があります。まず、ターミナルを起動し、 ビルドに必要なパッケージをインストールします。
$ sudo apt-get update
$ sudo apt-get install subversion cmake g++ xorg-dev uuid-dev libasound2-dev libssl-dev libgl1-mesa-dev
その後、Squeakのソースをダウンロードし、ビルドします。
$ svn co http://www.squeakvm.org/svn/squeak/branches/Cog
$ cd Cog/build.linux32ARM/squeak.cog.spur/build
$ ./mvm
ここで「clean?」と聞かれますが「n」を入力してEnterします。

Raspberry Pi 2で5分くらい待つと、ビルドが完了します。 後は、下記の要領でできたプラグインを差し替えます。
$ sudo mv /usr/lib/squeak/5.0-3663/vm-display-X11  /usr/lib/squeak/5.0-3663/vm-display-X11.orig
$ sudo cp /home/pi/Cog/products/cogspurlinuxhtARM/lib/squeak/5.0-3744/vm-display-X11 /usr/lib/squeak/5.0-3663/
その後、Scratchを起動すると、日本語を入力しても文字化けしなくなっているはずです。

何が起こっているかというと、NOOBS 1.9.2に含まれるRaspbianのSqueakは、ダウンロードしたソースよりも若干バージョンが古いのですね。最新のソースでは文字化けを解消するコードが既に取り込まれているので、ビルドして差し替えるだけで文字化けが解消した、というわけです。

6. 終わりに


以上でした。最近のScratchはデフォルトでGPIOにアクセスできたり、カメラモジュールが使えたりするらしいので(参考)、試してみたいと思います。

こちらもどうぞ



「カラー図解 最新 Raspberry Piで学ぶ電子工作」、「実例で学ぶRaspberry Pi電子工作」を執筆しました。