WiringPiとC言語でGPIOを制御する
前回はWiringPiのPythonパッケージをインストールしてLEDを点滅させてみたが、もともとWiringPiはC言語のライブラリなので、Cのプログラムで使用することも可能。
といことで、今回はC言語をコンパイルして実行する練習も兼ねて、WiringPiをC言語のコードの中で使ってLEDを光らせてみる。
※前回も書いたが、WiringPiは2019年で作者による開発が停止されているので今後使う予定の人はご注意を。
回路は前回同様、以下のセットを使ってブレッドボード上につくる。
実行環境
Raspberry Pi 4 Model B
Raspberry Pi OS (Bullseye)
wiringpi 2.52
gcc version 10.2.1 20210110 (Raspbian 10.2.1-6+rpi1)
ブレッドボードに回路をつくる
ここは前回と変わらず。LEDと抵抗をラズベリーパイの35pin(GPIO 19)と39pin(GND)に接続した。抵抗値は330Ω。
Cのコードを書く
C言語についてはWiringPiの公式ページにサンプルがあるので、こちらを参考にして作成。ほとんどサンプルコードと一緒だが、ピンをBCM(Raspberry PiのSoC)のピン番号で指定したかったので、wiringPiSetupではなくwiringPiSetupGpioでピンアサインを設定している。
設定方法の詳細については公式サイトのreferenceを参照。
#include <wiringPi.h> int main (void) { int led_gpio = 19; wiringPiSetupGpio(); pinMode(led_gpio, OUTPUT); while (1) { digitalWrite(led_gpio, HIGH); delay(500); digitalWrite(led_gpio, LOW); delay(500); } return 0 ; }
gccでコンパイルして実行
C言語で書いたコードはコンパイラでコンパイルしてから実行する必要がある。Rasberry Pi OSには最初からgccというコンパイラがインストールされているので、今回はこのコンパイラを使う。試しにVersionを確認して見ると、10.2.1のコンパイラがインストールされていた。
$ gcc -v … gcc version 10.2.1 20210110 (Raspbian 10.2.1-6+rpi1)
コードを置いてあるディレクトリで以下を実行し、wiringpi_ledという名前で実行ファイルを作成する。gccのオプションについては「gcc オプション」とかでググればたくさん情報が出てくるので、気になる方はググッてみてください。
$ gcc -Wall -o wiringpi_led wiringpi_led.c -lwiringPi
そして以下を実行すればプログラムが動く。
$ sudo ./wiringpi_led
これで無事に光った。以下が光っている様子。
さっきはPythonでコード書いてたけど今度はCで書いてコンパイルしてLチカ。まぁ見た目にはわからんのだけど…笑 pic.twitter.com/x7AmYRqdMl
— Wakky (@wakky_free) April 29, 2022
これでLチカは完了。次のステップへ…と行きたいところだが、実はもう一個やりたいことがある。これまでLinuxのsysfsを使ったり、ライブラリ(Wiring)を使ったりしてGPIOを操作したが、ラズパイにのっているSoC(BCM2711)のレジスタを直接叩いて、GPIOを操作するという方法がある。
次回はC言語やラズパイのSoCの勉強も兼ねて、レジスタを叩いてGPIOを操作してLチカをやってみたい。
日記まとめ
ラズパイで遊んでみた軌跡を以下でまとめてます。