WringPiのインストールも終わり実際WiringPiを使ってGPIOの制御も行いました。今回はC言語で実装してみたいと思います。
なんでC言語?
WiringPiのC言語ライブラリを使えば簡単にGPIOポートが制御できるからです。後ほどご紹介しますが、水耕栽培だとPWMと呼ばれる制御が非常に重要です。光の明るさを変える制御で最適な光をデザインできます。WiringPiを使えばこの制御を簡単にできるんですね💡
WiringPiでシンプルなプログラムを作ろう。
WiringPiで作ってみるプログラム
WiringPiを使った最初のStepということになるのでシンプルなプログラムにしましょう。LEDの点灯を繰り返すだけのプログラムにします。
サンプルプログラム
サンプルプログラムは30行程度です。少ない行数ですので頑張って書きましょう💡
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
// Sample program to turn on/off LED connected to GPIO2. #include <wiringPi.h> #define PORT_LED 2 #define LOOP 5 #define WAITMS 1000 #define LED_ON 1 #define LED_OFF 0 int init(void){ if(wiringPiSetupGpio() == -1) return -1; pinMode(PORT_LED, OUTPUT); return 0; } int main(void) { int i; if (init() != 0 ) return -1; for(i=0; i<LOOP; i++){ //Turn on LED digitalWrite(PORT_LED, 1); delay(WAITMS); //Turn off LED digitalWrite(PORT_LED, 0); delay(WAITMS); } return 0; } |
色んな関数が出てきましたね。ラズペリーパイのLED制御で使うGPIOの制御ライブラリについてご紹介します。
wiringPiSetupGpio
Raspberry PiにはBroadcomという会社のSoC(System On Chip)が載っており、GPIOを制御します。この関数を呼ぶとそれぞれのGPIOポートを番号で呼ぶことができるようになります。
pinMode
I/OのInput / Outputの設定をします。OUTPUTの場合はOUTPUTを指定します。PWMの場合はPWM_OUTPUTです。InputはINPUTです。
digitalWrite
指定したGPIOに値を設定します。1を設定した場合には3.3Vが供給される設定になり、0を指定した場合には電圧を供給しないことになります。
コンパイルします。
C言語はコードだけでは動かないのでコンパイルしてあげる必要があります。Raspbianに標準で入っているgccを使いました。
1 |
$gcc -o wiringPi-Gpio2OnOff.o wiringPi-Gpio2OnOff.c -lwiringPi |
と入力してください。これでwiringPi-Gpio2OnOff.oというファイルができるはずです。
-lwiringPiと指定することでwiringPiのライブラリを使うことができるので忘れないようにしましょう。
実際に動かしてみる。
プログラムができたので動かしてみます。su権限が必要なのでsudoを付けます。
1 |
$sudo ./wiringPi-Gpio2OnOff.o |
動きましたか??
まとめ
c言語を使ったラズペリーパイの制御方法についてご紹介しました。ここが理解できると色んなことができるようになります。
記事を読んでいただいてありがとうございます。この記事がいいなと思ったら下記のSNSボタンのクリックをお願いします。励みになります😁
とても興味深く読ませてもらいました。自分も挑戦してみようかと考えているところです。
ところで、サンプルプログラム2行目の#includeの後が欠落しているようで、このまま実行するとコンパイルエラーが出てしまい、そっくり真似してみようとする方は躓いてしまうと思います。
これからも更新期待しています。
まっくん さん
こんにちは!記事がお役に立てれば幸いです(〃’ω’)
ご指摘の点修正いたしました。ありがとうございます。
興味がある内容があったら教えてくださいね♪ 挑戦してみます!(*´罒`*)
修正の際に、23行目の
for(i=0; i<LOOP; i++){
が
for(i=0; i<LOOP; i++){
に変わってしまっているようです。
まっくん さん
修正しました。HTMLモードになってしまったようですね。。