Raspberry Pi でLチカする方法がたくさんありすぎる件について

Raspberry PiでLチカしようとググって見ると、たくさんの方法があることに気づかされます。
それらの方法をまとめて紹介しようと思います。
なお、「こーゆー方法も存在する」という気づきを与えることに重点を置いているので、インストール方法などは書いていません。

http://elinux.org/RPi_GPIO_Code_Samples を参考にして書いてます。

#ダイレクトレジスタアクセス
http://elinux.org/RPi_GPIO_Code_Samples#Direct_register_access
俗に言う「ハードウェア直叩き」です。すべての方法において、最下層ではコレが使われているというプリミティブな方法ですね。
メモリマップドI/Oなので、Cのポインタでメモリにアクセスする雰囲気でレジスタにアクセスします。意味不明ですね。。。
別の方法でどうしてもうまくいかない場合はハードウェア直叩きすることになるかもしれませんが、「最後の手段」です。
初心者は知らないほうがいいでしょうｗ

##/dev/mem
~~ダイレクトレジスタアクセスの、ちょっと行儀のいい方法です。Cのポインタの代わりに、`/dev/mem` を使います。レジスタの仕様を知ってないと使えない点で、難易度はダイレクトレジスタアクセスとほぼ変わりません。~~
ラズパイも仮想メモリを使うシステムなので、アプリが使う仮想メモリとレジスタが使う物理メモリは別々のものになっています。
それらをマッピングするためには、あらかじめ/dev/memとmmap()システムコールを使用しなければなりません。
これも初心者は知らないほうがいいでしょうｗ

##/dev/gpiomem
~~`/dev/mem`よりももうちょっと行儀のいい方法です。root権限が不要になった、ぐらいの違いしかありません。~~
`/dev/mem` はroot権限が必要で扱いにくかったため、最近になってroot権限不要の`/dev/gpiomem`が用意されました。
多くのライブラリにおいて、下位レイヤでコレを使っていると思われます。
「最新版ではカーネル4.1以上が必要だけどroot権限が不要になりましたよ」という場合はまずコレですね。
~~頑張ればどんな言語からでも扱えると思いますが、何らかのライブラリを利用するほうが得策だと思います。~~

#sysfs
https://www.kernel.org/doc/Documentation/gpio/sysfs.txt
Linuxの思想、というかUNIXの思想として、なんでもかんでもファイルとして扱うという考え方があります。それがコレです。
`/sys/class/gpio` 以下のファイルにゴニョゴニョするとGPIOを弄れるという仕組みです。

`/dev/mem` や `/dev/gpiomem` との違いは、それらがレジスタレベル（下位レイヤ）でのアクセスであるのに対し、`/sys/class/gpio` はGPIOのピン単位（上位レイヤ）でのアクセスである点です。

ファイルが扱える言語なら何でもイケるので、実質どの言語からでもイケるでしょう。ライブラリのインストールが不要なのもいいですね。

UNIX信者的にはオススメの方法です。

ただ、SPIやI2C通信ができないっぽいので、それらを使う場合は何らかのライブラリが必要になるでしょう。

#Wiring Pi
http://wiringpi.com/
一番有名な方法ではないでしょうか。
Arduino ライクなAPIであることが特徴です。Arduino での開発に慣れている方には親しみやすいと思われます。
Arduino を意識しすぎて、analogRead()というAPIがあるのが最大の特徴だと思っています。Raspberry Piにはアナログ入力はないので、analogRead()を使うには拡張ボードが必要です。
Lチカするだけなら、こんな重いライブラリは必要ないんじゃないかと思います。

ちなみに、昔はインストールするにはコンパイルが必要でしたが、今は
`apt-get install wiringpi`
でインスコできます。
公式にもその旨書いてほしいですねー。


#bcm2835 library
http://www.airspayce.com/mikem/bcm2835/
Wiring PiがArduinoを意識したAPIであるのに対して、こちらはBCM2835チップの仕様に合わせたAPIになっているんでしょうか。
他のライブラリの存在に気づかずに作っちゃった感があります。
割り込みをサポートしていないという点で選択したくない感じがします。

#pigpio
http://abyz.co.uk/rpi/pigpio/
個人的に注目しているのがコレ！

最近の raspi-config を走らせたとき、GPIO Server という項目があることから存在に気づきました。
Raspberry Pi 上でpigpiodを動かして、他のPC(Windows,Mac,Linux)上のプログラムからGPIOをいじれるようです。
もちろん、単体でも動きます。

ドキュメントを読む限りでは、素性のよいライブラリな予感がします。
使ってみてないのにオススメです。

#その他言語特有の
言語別に紹介していきます。

##C# - RaspberryGPIOManager 
https://github.com/AlexSartori/Raspberry-GPIO-Manager
C#から使うやつです。

Windows 10 IoT Core からつかうのか、Raspbian+MONOから使うのか書いてない時点で選択したくない感じです。

C#は好きなんですけどね。

##C# - RaspberryPi.Net 
https://github.com/cypherkey/RaspberryPi.Net/
これはMONOから使うと書いてあります。

ただ、Linuxの世界でC#を使うことはないんじゃないかと思います。

C#は好きなんですけどね。

##Ruby - WiringPi Serial And Shiftout
http://pi.gadgetoid.com/article/wiringpi-serial-and-shiftout

下位にwiringpiを使っているようです。

##Ruby - pi_piper
https://github.com/jwhitehorn/pi_piper

下位にbcm2835 libraryを使っているようです。

##Perl - Device::BCM2835
http://search.cpan.org/~mikem/Device-BCM2835-1.0/lib/Device/BCM2835.pm

下位にbcm2835 libraryを使っているようです。

##Python - RPi.GPIO
https://sourceforge.net/p/raspberry-gpio-python/wiki/Home/

Raspberry Pi の公式言語はPythonらしく、Pythonを使っている方も多いと思います。そして、PythonでGPIOといえばコレのようです。

Python Software Foundationからリリースされているという点でも安心できます。

しかし！ ちょっと使ってみたんですが、割り込みを取りこぼしがちなので本格的には使いたくない感じでした。

apt-get install python-rpi.gpio でインスコできる点では便利だと思います。

##Python - RPIO
https://pypi.python.org/pypi/RPIO

RPi.GPIOを拡張した、という話なのですが、最新版が2013年で止まっています。
なんだそれ。

##Python - pigpio
http://abyz.co.uk/rpi/pigpio/python.html

Raspberry Pi の公式言語Pythonと、素性の良さげな pigpioの組み合わせで最強にオススメです。まだ使ってみてませんが。

##Python -  WiringPi
https://github.com/WiringPi/WiringPi-Python

下位にWiringPiを使っているやつです。

##Java - Pi4J 
http://pi4j.com/

下位にWiringPiを使っています。

##Java - framboos
https://github.com/jkransen/framboos

下位にsysfsを使っています。
pure java 感があって好感が持てます。


##HTTP - Raspberry Pi GPIO Web Control
https://bitbucket.org/sbub/raspberry-pi-gpio-web-control

HTTP経由でいじれるものです。
中身はJavaで書かれています。
RC回路を使ったアナログ入力に対応しているなど、尖った特徴があります。全体的に尖り過ぎのような気がします。
弄って遊ぶ分には楽しいんじゃないでしょうか。


#おわり
書いてて疲れてきました。Scratch や BASIC は省略しました。

いろいろ見てきましたが、新たな発見はあったでしょうか？

様々な選択肢から、ベストオブLチカソリューションを見つけていただけたら幸いです。

私はこれから pigpio + Python を試してみたいと思います。