まだ検証の途中なのだけど、このままだと忘れそうなので一旦公開(2014.1.24)
Raspberry-PiのGPIOを操作するためのツールについてまとめた。
Raspberry-Piには基板上に13×2ピンのコネクタがあり、GPIOを利用することができる。
(http://elinux.org/RPi_Low-level_peripheralsより)
GPIOへ直接アクセスする方法以外に、公開されているツールを利用することができる。
ここでは、PWMのためにWiringPiを、サーボ制御のためにServoBlasterを用いる方法について説明する。
WiringPi
WiringPiは、https://projects.drogon.net/raspberry-pi/wiringpi/で公開されている、Raspberry-PiのGPIOを扱うためのライブラリである。
WiringPiそのものはC/C++言語などからGPIOを利用するライブラリであるが、付属しているツールによりコマンドラインからGPIOの設定や操作を行うこともできる。
(参考:http://tomowatanabe.hatenablog.com/entry/2013/01/14/181116)
WiringPiのインストール
WiringPiはgitを用いてインストールする。以下がダウンロードおよびビルドのためのコマンドである。
git clone git://git.drogon.net/wiringPi cd wiringPi ./build
(2014.10.20追記はじめ)
上記の方法によってインストールできない時は、以下のwebサイトにアクセスしてshortlogの一覧の先頭にあるsnapshotリンクを右クリックしてファイルをダウンロードする。
https://git.drogon.net/?p=wiringPi;a=summary
ダウンロードしたら、raspberry-pi上で解凍し、ビルドする。なお、「df45388」の部分はダウンロードしたバージョンによって変わるので注意する。
cd wiringPi-df45388/ ./build
(2014.10.20追記おわり)
buildによってライブラリやツールがインストールされる。
GPIOを操作するツールであるgpioの動作は以下により確認できる。(バージョンなどが表示される)
gpio -v
Raspberry-PiのGPIOの状態は以下のコマンドにより調べることができる。
gpio readall
gpioの使い方
ここではWiringPiライブラリではなく、付属ツールgpioの使い方について簡単に説明する。
ピン番号について
gpioツールでは、各GPIOピンのモードを指定したり、値を設定・取得することができる。各GPIOピンの指定方法としては、WiringPiのピン番号を用いる方法と、Raspberry PiでのGPIO番号を用いる方法がある。以下の表にその対応を示す。(詳細な対応表はこちらを参照のこと)
ピン番号 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
GPIO番号 | 17 | 18 | 21/27 | 22 | 23 | 24 | 25 | 4 |
(ピン番号の2番についてはRaspberry PiのリビジョンによってGPIOの21か27になる。)
上記の対応表で、上段の値を使う場合は-gオプションは不要で、下段の値を使う場合はコマンドラインのオプションとして-gを付ける必要がある。
モード指定
gpio [-g] mode ピン番号 モード
モードには、in、out、pwm、up、down、triのいずれかを指定する。それぞれの意味は以下の通り。
モード | in | out | pwm | up | down | tri |
意味 | 入力 | 出力 | PWM出力 | プルアップ | プルダウン | ハイインピーダンス |
ディジタル出力
gpio [-g] write ピン番号 出力
出力には、0(=Low)または1(=High)を指定する。
アナログ(PWM)出力
gpio [-g] pwm ピン番号 PWM値
PWM値としては、0から1023までの値を指定する。
ディジタル入力
gpio [-g] read ピン番号
指定したGPIOピンのディジタル値を取得する。得られる値は0(=Low)または1(=High)である。
gpio readall
上記のようにすれば、全てのGPIOピンのディジタル値が表示される。
ServoBlaster
ServoBlasterは、https://github.com/richardghirst/PiBits/tree/master/ServoBlasterで公開されている、Raspberry Piを使ってサーボモータを動かすためのソフトウェアである。
ServoBlasterのインストール
ServoBlasterもgitを用いてインストールする。以下がダウンロードおよびビルドのためのコマンドである。
git clone git://github.com/richardghirst/PiBits.git cd PiBits/ServoBlaster/user make sudo make install
ServoBlasterの使い方
WiringPiと異なり、SerboBlasterは特別なデバイスファイル/dev/servoblasterに文字列を書き込むことによってサーボモータを制御する。具体的には、「サーボ番号=サーボ位置」のような文字列を/dev/servoblasterに書き込む。
サーボ番号は以下の表に基づいて指定する。WiringPiの対応とは微妙に異なるので注意する。(サーボ番号の3番についてはRaspberry PiのリビジョンによってGPIOの21か27になる。)
サーボ番号 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
GPIO番号 | 4 | 17 | 18 | 21/27 | 22 | 23 | 24 | 25 |
例えば、4番の(つまり、GPIO-22に繋がれた)サーボモータを一方の端まで回転させるには以下のようにする。
echo 4=0% > /dev/servoblaster
同じサーボモータを反対の端まで回転させるには、以下のようにする。
echo 4=100% > /dev/servoblaster
サーボモータの回転角度は、パーセンテージによる指定の他、パルス幅を直接指定することもできる。この場合はパルス幅を10マイクロ秒単位で指定する。例えば、4番のサーボモータで1.2ミリ秒(=1200マイクロ秒)幅のパルスを生成する場合、以下のように指定する。
echo 4=120 > /dev/servoblaster
その他、サーボ位置の直前に+や-の符号を付けると、現在の位置からの相対量を指定することもできる。
なお、生成された波形をオシロスコープで見たところ、サーボ位置を指定すると、数秒間だけ指定したパルスが生成された後、Lowレベルになるようである。