Raspberry Pi 日記 (part2)

長嶋 洋一


2013年6月18日(火)

前期火曜日は1限と4-5限に講義があるものの、4-5限の「企画立案演習」は後半戦に入って、各グループがそれぞれ作業を進める段階なので、僕は冒頭のミーティングと最後の進捗確認、そして「チームランナー」のアニメーション撮影のための機材を撮影スタジオにセットすれば、最後の撤収に行くまでほとんど研究室で待機、という良好な期間である。 朝イチから「サウンドデザイン」で学生に紹介する、先輩のMax6アニメーション課題作品集を整理していたが、うーむ、メディア造形学科の学生は年々、優秀になっている事を再確認した。 受験倍率と偏差値が右肩上がりになっているのも納得がいく。

その1限を前にして、まず最初に行ったのは、Raspberry Piの「SSH設定済み」「VNCインストール済み」「固定IPアドレス(172.16.65.62)設定済み」のOSイメージファイルなどの、Raspberry PiのOSドライブとしては不調だった(ただしMacではすこぶる快調な)16GBのSDカード2枚へのバックアップである。 これで、何かのトラブルの際にはMacから新しいSDカードにこれを書き込めば、あとはIPアドレスだけ変更して使用できるので、あくまでRaspberry Piに外付けのモニタとマウスとキーボードは不要となる。(^_^)

そして ここの 続きである。上の例は、「5 lines: Functions」と「6 lines: Import, regular expressions」をそれぞれ「test.py」に書き出して、Raspberry Piからrcpでゲットして走らせた模様の、VNC経由のスクリーンショットである。 まだこの程度であればここのページにPythonソースを置く程のこともないだろう。

・・・と思ったら、なんと この ページには、Pythonサンプルが33個もあるのであった。 あと27個かぁ、こりゃかなりのボリュームである。 とりあえずここで1限の時間が近付いてきたので、マルチメディア室に移動、続きは2限からやっていこう。 Raspberry PiとVNCで繋いだまま放置していくが、90分のインターバルがあるとRaspberry Piはスリープする筈なので、そこも帰ってきたら、見てみよう。

・・・そして2限になったが、Raspberry Piはちゃんと生きていた(^_^;)。 どうやら、スクリーンセーバーもOFFにする設定にしていたようである。 こうなれば、もう この ページのサンプルをいちいちRaspberry Piに送って走らせて確認するだけである。 以下は「7 lines: Dictionaries, generator expressions」と「8 lines: Command line arguments, exception handling」をそれぞれ「test.py」に書き出して、Raspberry Piからrcpでゲットして走らせた模様の、VNC経由のスクリーンショットである。 プログラムの引き数として数値を渡すこの方法は、C言語のargcとargvと同じで、使えそうである。

次の「9 lines: Opening files」はファイルのアクセスのようであるが、「f:」というのは邪悪なDOS系パソコンのようだったのでパスした(^_^;)。 以下は「10 lines: Time, conditionals, from..import, for..else」を「test.py」に書き出して、Raspberry Piからrcpでゲットして走らせた模様の、VNC経由のスクリーンショットである。 ネットで調べて、Linuxでの日付時刻の設定「sudo date --set="2013/16/18 11:00"」というのもついでに覚えて、時間帯によって変化する応答も確認できた。(^_^)

以下は「11 lines: Triple-quoted strings, while loop」を「test.py」に書き出して、Raspberry Piからrcpでゲットして走らせた模様の、VNC経由のスクリーンショットである。 最初は「bottles_of_beer = 99」ということで膨大な行が表示されてスクロールしたので(^_^;)、nanoで「bottles_of_beer = 5」と変更している。

以下は「12 lines: Classes」と「13 lines: Unit testing with unittest」をそれぞれを「test.py」に書き出して、Raspberry Piからrcpでゲットして走らせた模様の、VNC経由のスクリーンショットである。 前者はdef定義のサンプル、後者はクイックソートの速度測定である。

次の14から17はパス、18の「8クイーン問題」もパス、20もパスした。 そして次の「21 lines: XML/HTML parsing (using Python 2.5 or third-party library)」はちょっと気になったのでやってみたが、以下のようにあまりパッとしなかった(^_^;)。 ・・・そしてここまで来て気付いたが、このPythonサンプルの最後は「33番」だったものの、全ての番号が揃っているわけではなくて、後は28番と33番のゲームだけ、ということで、これでオシマイとなった。

さて、そこでいよいよ これ である。 ザッと見たところでは、インプレス本で残っていた部分とほぼかぶっている模様だが、せっかくなので こっち を追いかけることにした。 このチュートリアルは「GPIO」について、という事である。 とりあえず確認の意味で「2 GPIO Basic's」をあらためて整理すると、以下のようになる。

まぁ、お約束の脅かしはこのへんにしておいて(^_^;)、いよいよライブラリのインストールである。 どうもapt-getではないようなので、以下に書かれている情報から、tar.gzをMacでダウンロードして・・・というのを試してみよう。
3 Installing RPi.GPIO

RPi.GPIO is a small python library that take some of the complexity out of driving 
the GPIO pins, once install a single LED can be lit with 3 lines of python. Installing 
the library is almost as simple, either at a text console or using LXTerminal enter 
the following

$ wget http://pypi.python.org/packages/source/R/RPi.GPIO/RPi.GPIO-0.1.0.tar.gz
$ tar zxf RPi.GPIO-0.1.0.tar.gz
$ cd RPi.GPIO-0.1.0
$ sudo python setup.py install
そこで、Macでダウンロードした「RPi.GPIO-0.1.0.tar.gz」をRaspberry Piの61号機にrcpして、「tar zxf RPi.GPIO-0.1.0.tar.gz」で解凍して、「cd RPi.GPIO-0.1.0」で移動して、「sudo python setup.py install」してみると、以下のような状態で止まった。 これはかつてふーみんに聞いた、SUACのプロキシサーバの情報を「export http_proxy="http://・・・」と入れても駄目だった(^_^;)。
pi@raspberrypi ~ $ ls
Desktop  ocr_pi.png  python_games  test.py  twilight.png
pi@raspberrypi ~ $ rcp nagasm@172.16.65.31:Desktop/RPi.GPIO-0.1.0.tar.gz .
Password:
RPi.GPIO-0.1.0.tar.gz                                                  100% 7931     7.8KB/s   00:00    
pi@raspberrypi ~ $ ls
Desktop  RPi.GPIO-0.1.0.tar.gz  ocr_pi.png  python_games  test.py  twilight.png
pi@raspberrypi ~ $ tar zxf RPi.GPIO-0.1.0.tar.gz
pi@raspberrypi ~ $ cd RPi.GPIO-0.1.0
pi@raspberrypi ~/RPi.GPIO-0.1.0 $ sudo python setup.py install
Downloading http://pypi.python.org/packages/source/d/distribute/distribute-0.6.21.tar.gz
^Z
[1]+  停止                  sudo python setup.py install
pi@raspberrypi ~/RPi.GPIO-0.1.0 $
こうなれば、久しぶりにモバイルWiFiルータの出番である。 直接にネットに繋いで、最新の「distribute-0.6.21.tar.gz」を取りに行かないといけないのだ。 さっそく61号機と62号機をシャットダウンして、 ここでやった方法 を再現して、以下のように63号機の固定IPをDHCPに変更してシャットダウンして、LANハブを研究室の学内LANからモバイルWiFiルータに繋ぎ変えた。

そして久しぶりに、以下のチャチいキーボードと見にくい液晶モニタの出番である(^_^;)。 何度もミスタイプを叱られながら、過去の失敗の経験から何度も「sudo apt-get update」をかましつつ、「GPIO」のゲットとインストールだけでなく、ふーみんに教わった「sudo apt-get install puredata」と「sudo apt-get install python-txosc」と「sudo apt-get install pd-osc」をエラー無しに完了させ、さらにThingmのBlibk(1)もついでにダウンロードしてみた。 経緯は こんな感じ である。

ここで重要なのは、ここまで63号機で進めてきて、まず一旦sudoでDHCPを固定IPに戻してシャットダウンして、研究室LANに戻してホストのMacとVNC出来たことを確認してまたシャットダウンして、そのSDカードのイメージデータを吸い上げた事である。 残りの61号機・62号機でまたいちいちWiFi経由で環境設定するのはナンなので、まずはこの段階を保持しておく、という事である。 ここまでで3限の時間が終わり、いったん「企画立案演習」に向かうこととなった。

そして15時を過ぎて、研究室に戻る時間ができた。 スタジオでのアニメーション撮影グループの作業もスタートし、研究室では別のグループが素材を発注するカタログをめくっている。 これ の「3 Installing RPi.GPIO」が終わったつもりなので、次はいよいよ「4 LED and Pushbutton Slice」である。 ここであらためてGPIOポートのコネクタを確認すると、以下のようになっている。 このうちI2CとSPIは使うつもりはないので、使えるのはGPIO0からGPIO7までの8ビットの汎用入出力と、UARTの2本だけである。

(この図は後で改訂されている事に注意)

そして、せっかく連結した3枚のRaspberry Piをバラすのもナンなので(^_^;)、また新しいRaspberry Piを出してきて63号機のSDカードを挿し、Slice基板を付けるほどの事もないので直接、コネクタに挿したピンヘッダ上に空中配線で8ビットのLEDを付けて、とりあえず+3.3Vから470Ωで点灯させてみたのが以下である。 まずは「sudo Python」でのコマンドであるが、ポートに出力設定すると既にlowレベル出力で点灯し、Falseをちゃんと出力して点灯できた。 まぁディジタル入力は未検証であるが、これで ここまで はオシマイである(^_^)。

Pythonのコマンドラインから点灯させるというのもナンなので、以下のようなPythonプログラムを作ってRaspberry Piに送って、「sudo python test.py」ということで実行させると、順にLEDが点灯した。 ただし何故か、3ビット目、13ピンのLEDが点灯しなかったのが謎だが(^_^;)、まぁこれでPythonプログラムでハードを叩く、という流れは確認できた。 謎の13ピンは置いておくとして(^_^;)、今日はまずまず進展した。 ここまでで、インプレスのRaspberry Pi本も全て終わったことになる。

import RPi.GPIO as GPIO
import time
GPIO.setup(11, GPIO.OUT)
GPIO.setup(12, GPIO.OUT)
GPIO.setup(13, GPIO.OUT)
GPIO.setup(15, GPIO.OUT)
GPIO.setup(16, GPIO.OUT)
GPIO.setup(18, GPIO.OUT)
GPIO.setup(22, GPIO.OUT)
GPIO.setup(7, GPIO.OUT)
GPIO.output(11,True)
GPIO.output(12,True)
GPIO.output(13,True)
GPIO.output(15,True)
GPIO.output(16,True)
GPIO.output(18,True)
GPIO.output(22,True)
GPIO.output(7,True)
while True:
    GPIO.output(11,False)
    GPIO.output(7,True)
    time.sleep(1)
    GPIO.output(12,False)
    GPIO.output(11,True)
    time.sleep(1)
    GPIO.output(13,False)
    GPIO.output(12,True)
    time.sleep(1)
    GPIO.output(15,False)
    GPIO.output(13,True)
    time.sleep(1)
    GPIO.output(16,False)
    GPIO.output(15,True)
    time.sleep(1)
    GPIO.output(18,False)
    GPIO.output(16,True)
    time.sleep(1)
    GPIO.output(22,False)
    GPIO.output(18,True)
    time.sleep(1)
    GPIO.output(7,False)
    GPIO.output(22,True)
    time.sleep(1)

YouTube


「Raspberry Pi日記」トップに戻る