作成日時:2015年05月27日 23時37分42秒
更新日時:2020年05月19日 08時47分38秒
この記事は9年ほど前に投稿されました。内容が古くなっている可能性がありますので更新日時にご注意ください。
※前回の記事が長くなりそうだったので分割しました。
フルカラー制御してみる
次はLEDで様々な色を出してみたいと思います。
今まではシェルでコマンドを叩いて実行していましたが、今回からはC言語を使用して制御してみたいと思います。なぜC言語なのかというのは、単純にPythonを触ったことがないからだったりするのですが。
C言語とはなんぞや?と言う人はどこかのサイトで適当に勉強してください。
基本事項
まず前提としてCコンパイラとWiringPiがインストールされていることが必要です。
前回の記事を実施したならWiringPiは入っているはずですが、GCCはもしかしたら入っていないかもしれないので、念のため apt-get -y install gcc-4.8 を実行しておいてください。(これで入っていても最新版の4.8系が入ります)
ちなみにコンパイルと実効に管理者権限が必要ですので、最初に sudo su -でrootになってください。
コーディング
ソースコード行頭に以下の行を追加してください。
#include <wiringPi.h>
#include <softPwm.h>
これでWiringPiが使用できるようになるはずです。
※ポート番号等は各自環境に合わせて置き換えてください。
#define にて各LEDのポート番号を定義しておきます。
こうすることで後から色々と編集するときに楽です。(今回はテストなので直書きしても良いんですけど。今後のためにね。)
#define LED_RED 25
#define LED_GRE 24
#define LED_BLU 23
LED_RED = 赤 LED_GRE=緑 LED_BLU=青
と言う事にしました。
次にメイン処理系に以下の1行を追加してWiringPiを初期化します。
wiringPiSetup();
(本当はこの命令の戻り値を見て初期化できているかを確認しないといけないのだけど今回は省略。実際にソフトとして完成させるときはしっかりとエラー処理をしよう!)
使用するポートを出力ポートに設定します。
pinMode(LED_RED,OUTPUT);
pinMode(LED_GRE,OUTPUT);
pinMode(LED_BLU,OUTPUT);
ポートをソフトウェアPWMモードに変更します。
softPwmCreate(LED_RED,0,100);
softPwmCreate(LED_BLU,0,100);
softPwmCreate(LED_GRE,0,100);
()の中身は ポート番号,最小値,レンジ ソフトウェアPWMのレンジは最大100。
LEDの制御なら0と100でOK。0%~100%なら明るさの把握もしやすいしね!
各LEDの明るさを入れる変数を作ります。
int r=10,g=50,b=100;
r=赤 g=緑 b=青
とりあえず今回はこの値を使います。
指定した明るさでLEDを点灯させる
softPwmWrite(LED_RED,r);
softPwmWrite(LED_GRE,g);
softPwmWrite(LED_BLU,b);
これでコーディング終わり。
一応動くコードを貼るとこんな感じ
/////////////////////////////////////////////////////
//
// Raspberry Pi 2 LED 調光テストプログラム
// ※ WiringPiインストール必須。
// ※ コンパイル時は -lwiringPi オプションを付けないとエラー
//
/////////////////////////////////////////////////////
// 必要なライブラリのインクルード
#include <stdio.h> //C言語のアレ
#include <wiringPi.h> //WiringPi
#include <softPwm.h> //ソフトウェアPWM
// ピン番号を定義
// LED_RED:赤色LEDを繋いだポート(GPIO.xのx)
// LED_GRE:緑色LEDを繋いだポート
// LED_BLU:青色LEDを繋いだポート
#define LED_RED 25
#define LED_GRE 24
#define LED_BLU 23
// メイン処理
int main(void){
//ライブラリ初期化
wiringPiSetup();
// 各ピンをOUT(出力)似設定
pinMode(LED_RED,OUTPUT);
pinMode(LED_GRE,OUTPUT);
pinMode(LED_BLU,OUTPUT);
// ソフトウェアPWMに切り替え(ポート番号,最低値,レンジ)
softPwmCreate(LED_RED,0,100);
softPwmCreate(LED_BLU,0,100);
softPwmCreate(LED_GRE,0,100);
// 明るさ設定
int r=10,g=50,b=100; //パターンA
// int r=10,g=75,b=32; //パターンB
// int r=80,g=50,b=60; //パターンC
// 発光
softPwmWrite(LED_RED,r);
softPwmWrite(LED_GRE,g);
softPwmWrite(LED_BLU,b);
for(;;){delay(10);}
// ↑無限ループ Ctrl+Cで強制終了させること
}
コンパイル
コンパイルするときには「 -lwiringPi 」オプションを付けてコンパイルします。
gcc ./(上のソースのファイル.c) -o ledtest -lwiringPi
これで ./ledtest を実行してLEDの発光色が前回の7色ではない、指定した色になっていれば成功です。
実行結果
上のソースを実行したらこんなかんじの色になります。(パターンA)
なお、上のソースコードでコメントアウトしている2つの値ではこうなります。
パターンB
パターンC
以上でフルカラーLEDの制御は終了です。
昔のマイコンみたいな3bitRGBカラーなら制御は割と簡単です。それ以外の中間色を出そうと思うと少々めんどくさいですね。だけどこれは応用すれば色々と使えると思います。何に使うかはアイデア次第ですね。