BCM2835ライブラリ [Raspberry Pi]
OpenCLの途中だけど、また違うことをちょこっとだけやる。Raspberry PiのGPIOのためのライブラリについて。
Raspberry Pi 2が出てから、僕はこれを急速にいろんなことに使うようになってきた。それは僕にとって30年近く慣れ親しんだunixのシステムコールが使えて、例えばA/D変換のためにUSB接続なんかのダムなインターフェイスを使うことに比べるとずっとプログラミングがしやすい(自分で半田付けはしないといけないけど)上に、2でパフォーマンスがそれなりに良くなってしかも安価だからである。
Raspberry PiではWindowsやOS Xはもちろん、普通のLinuxに比べても低レベルのI/Oアクセスをすることが当然ずっと多い。Raspberry PiにはGPIOというTTLレベル(厳密には3.3VのいわゆるLVTTL)のデジタルI/Oがむき出しになっていて、なんにでも使えますよ(でも電気的には裸なので気をつけてね)ということになっている。
Raspberry PiのGPIOはCPUであるBCM2835チップ(SoCなのでCPUだけでなくGPUやI/Oもチップに乗っている)のピンが直接出ていて、仮想アドレスにマップすることができる。Linuxではmmapというシステムコールがあって、仮想アドレスと物理アドレスを結びつけることができる(ちなみに、mmapはPOSIX標準なのでたとえばOS Xでも存在しているが、物理アドレスアクセスには使えなくなっている)。Raspberry Piでは基本的にはmmapを使えばGPIOにアクセスできて、その先につながったものに合わせてなんでもできることになる。
Raspberry PiのGPIOを使って、とりあえずサクっとテストしたい、とかいう場合のために
そこでRaspberry Piを使っている人はなるべく簡単にI/Oが使えるようにいろいろなライブラリを作って、またそれを公開している。
有名どころではWiringPiというライブラリがあって、これはRubyやPythonのラッパを持っていて使いやすいらしい。また似たようなライブラリでPi Piperというのもあって、これもRubyのラッパを持っている。またWebIOPiというライブラリはネットワーク経由で外部のブラウザからGPIOをアクセするために作られている。どれもRaspberry Piの特徴を活かせるように工夫されている。
ヘッダもdoxygenによるドキュメント生成に従った書き方になっていてそのままでは読みづらい(ちなみに僕はソースコードドキュメント生成ツールは一瞬使ったけど、やめてしまった。ソースとドキュメントの整合を取るにはいいんだけど、どうしてもヘッダが長くなって単体では逆に読みづらくて、自分のためのドキュメントとしては効率が悪くなってしまった)が、きれいに整形されたシンプルな美しいヘッダである(試しに例えばfftwのヘッダと見比べてみればいい。fftwのヘッダは読めたものではない。もちろん読んでもらうためのヘッダではないことは明らかなんだけど、これをメンテナンスしろと言われたらぞっとする)。僕には組み込みをやってた人のソースに見える。
まあそれはいいとして、僕はいくつかのGPIO用のライブラリを使ってみて、これがCから呼ぶには一番シンプルで使いやすかったのと、ソースを読んだ感じが気に入ったので、GPIOアクセスにはずっとこれを使っている。でも、Raspberry Piで遊ぶという日本語のサイトはたくさんあるのに、このライブラリには日本語の解説がなくて日本ではあまり使われていないという感じがする。
ということでこのライブラリの日本での後押しをしよう。とりあえず概説のページを翻訳して、使える関数などを紹介した後、これを使ったRaspberry Piの具体的なサンプルを示したいと思う。
ということで、本題は次回から。
Raspberry Pi 2が出てから、僕はこれを急速にいろんなことに使うようになってきた。それは僕にとって30年近く慣れ親しんだunixのシステムコールが使えて、例えばA/D変換のためにUSB接続なんかのダムなインターフェイスを使うことに比べるとずっとプログラミングがしやすい(自分で半田付けはしないといけないけど)上に、2でパフォーマンスがそれなりに良くなってしかも安価だからである。
Raspberry PiではWindowsやOS Xはもちろん、普通のLinuxに比べても低レベルのI/Oアクセスをすることが当然ずっと多い。Raspberry PiにはGPIOというTTLレベル(厳密には3.3VのいわゆるLVTTL)のデジタルI/Oがむき出しになっていて、なんにでも使えますよ(でも電気的には裸なので気をつけてね)ということになっている。
Raspberry PiのGPIOはCPUであるBCM2835チップ(SoCなのでCPUだけでなくGPUやI/Oもチップに乗っている)のピンが直接出ていて、仮想アドレスにマップすることができる。Linuxではmmapというシステムコールがあって、仮想アドレスと物理アドレスを結びつけることができる(ちなみに、mmapはPOSIX標準なのでたとえばOS Xでも存在しているが、物理アドレスアクセスには使えなくなっている)。Raspberry Piでは基本的にはmmapを使えばGPIOにアクセスできて、その先につながったものに合わせてなんでもできることになる。
Raspberry PiのGPIOを使って、とりあえずサクっとテストしたい、とかいう場合のために
/sys/class/gpio/というディレクトリの下に一種のデバイスファイルがある。これはLinuxのSysfsという仮想ファイルシステムの機能を使っていて、/sys/devicesなどへのシンボリックリンクになっている。これはunix標準のopen、closeでは動作せず、ちょっと違った面白い使い方をする(ちなみにSysfsはLinux固有の機能でPOSIXにない。もちろんOS Xにもない)。具体的にはこういうところなどを見てもらったほうが、僕よりずっと親切。でもピンの指定の仕方がRaspberry Pi 2ではそれまでと違っているので注意する必要がある。
0.2 Raspberry PiのGPIOを使うためのライブラリ
Raspberry PiのBCM2835というチップは汎用のデジタルI/Oだけではなく、I2Cやspi、あるいは汎用のUARTといったシリアル通信の機能もあってRaspberry Piでは基本的にすべて機能を利用できる(すべてのピンが出ているわけではないので数は限られる。例えばPWMはBCM2835には2チャンネルあるけどRaspberry Piのピンに出てるのはひとつだけ)が、決められたアドレスへの読み書きとして書かなければならないので、それなりにプログラミングは面倒である。またRaspberry Piのバージョンによってアドレスが違っていてその差をなんらかの方法で吸収するか、あるいはバージョン決め打ちで書く必要がある。そこでRaspberry Piを使っている人はなるべく簡単にI/Oが使えるようにいろいろなライブラリを作って、またそれを公開している。
有名どころではWiringPiというライブラリがあって、これはRubyやPythonのラッパを持っていて使いやすいらしい。また似たようなライブラリでPi Piperというのもあって、これもRubyのラッパを持っている。またWebIOPiというライブラリはネットワーク経由で外部のブラウザからGPIOをアクセするために作られている。どれもRaspberry Piの特徴を活かせるように工夫されている。
0.3 BCM2835ライブラリ
そのそういった数あるライブラリの中でbcm2835というそのままの名前のライブラリがある。これはCから呼べるライブラリになっている。ヘッダファイル一つと実装ファイル一つの実にシンプルなもので、BCM2835のUART以外の外部IOをすべて引き受ける、というものである(UARTはPOSIX標準のターミナルIOが使えて、そっちのほうが細かな制御ができるうえに高水準のデバイスファイルとしても使えるのでやめたんだろう)。ソースを見ると難しいことをしようというのではなく、ハードウェアの一つ上の抽象化を淡々とやろうという感じで非常に好感が持てる。ヘッダもdoxygenによるドキュメント生成に従った書き方になっていてそのままでは読みづらい(ちなみに僕はソースコードドキュメント生成ツールは一瞬使ったけど、やめてしまった。ソースとドキュメントの整合を取るにはいいんだけど、どうしてもヘッダが長くなって単体では逆に読みづらくて、自分のためのドキュメントとしては効率が悪くなってしまった)が、きれいに整形されたシンプルな美しいヘッダである(試しに例えばfftwのヘッダと見比べてみればいい。fftwのヘッダは読めたものではない。もちろん読んでもらうためのヘッダではないことは明らかなんだけど、これをメンテナンスしろと言われたらぞっとする)。僕には組み込みをやってた人のソースに見える。
まあそれはいいとして、僕はいくつかのGPIO用のライブラリを使ってみて、これがCから呼ぶには一番シンプルで使いやすかったのと、ソースを読んだ感じが気に入ったので、GPIOアクセスにはずっとこれを使っている。でも、Raspberry Piで遊ぶという日本語のサイトはたくさんあるのに、このライブラリには日本語の解説がなくて日本ではあまり使われていないという感じがする。
ということでこのライブラリの日本での後押しをしよう。とりあえず概説のページを翻訳して、使える関数などを紹介した後、これを使ったRaspberry Piの具体的なサンプルを示したいと思う。
ということで、本題は次回から。
2015-08-22 21:10
nice!(0)
コメント(0)
トラックバック(0)
コメント 0