RaspberryPi 3B+でLEDの点灯・消灯・点滅のやり方 - 水瓶座列車で、
LEDの極性の見分け方や点灯、消灯について書きましたが、
今回は、RaspberryPi 3B+でLEDを徐々に点灯、消灯させる方法を書いていきたいと思います。
明るさを徐々に変化させるには、PWM機能を使用します。
その仕組みを理解するのは少し難しいですが、使用するのは簡単です。
それでは、説明していきたいと思います。
1.使用するLEDと極性の見分け方
前回の記事でも書きましたが、再度書いておきます。
使用するLEDは、OSOYOOのセンサーセットのLEDを使用しています。
そして、LEDには極性があり見分け方は、
・足の長い方をアノードと呼び+側
・足の短い方をカソードと呼び-極
に接続します。
実物は、こんな感じです。
2.RaspberryPi 3B+ ボードとLEDの接続
RaspberryPi 3B+ ボードとLEDの接続は、前回と変わらずこんな感じです。
黄色線にはGPIO18、黒線にはGNDを接続しており、
LEDのアノード側と黄色線の間に抵抗200Ωを入れます。
そしてLEDのカソード側と黒線を接続します。
そして、抵抗を入れている理由は、電流が流れすぎてLEDが壊れないようにするためです。
3.PWM(疑似的アナログ出力)
LEDの点灯/消灯は、GPIOをHigh/Lowで制御しますが、
これはRaspberryPiから見ると電圧をデジタル出力して行っています。
しかし、デジタル出力では徐々に変化させることはできません。
そこでアナログ出力ができれば、電圧を0Vか3.3Vかではなく自由に出力することができるので、
光の強弱を調整することができます。
アナログ出力とは、0Vと3.3Vを高速で切り替えながら疑似的に、
0V~3.3V間の電圧を作り出してその電圧を出力することです。
RaspberryPi 3B+でのアナログ出力の方法は、
・ソフトウェアPWM:プログラムで0Vと3.3Vを切り替えて出力する。
・ハードウェアPWM:ハードウェアで0Vと3.3Vを切り替えて出力する。
の2種類があります。
ソフトウェアPWMは、全てのGPIOで使用可能で、
ハードウェアPWMは、GPIO12,13,18,19で使用可能です。
4.LEDを徐々に点灯させる
前項を踏まえて、GPIO18を使用してLEDを徐々に点灯させるサンプルコード(C言語)が、
下記になります。
#include <wiringpi.h>
#include <stdio.h>
#include <stdlib.h>
#define LEDPIN 1
int main() {
int bright;
if( wiringPiSetup()==-1 ) {
printf("setup wiringPi failed!\n");
exit(1);
}
pinMode( LEDPIN, PWM_OUTPUT );
for(;;) {
for( bright=0; bright<1024; ++bright ) {
pwmWrite( LEDPIN,bright );
delay(2);
}
}
return 0;
}
上記コード内にあるpinMode()でPWM_OUTOUTを設定してアナログ出力するようにします。
そして、pwmWrite()で光の強さを0から1023まで1つづ上げて徐々に明るくしています。
このサンプルコードのファイル名をbreathing_lec.cとすると、
コンパイルするには、ラズパイ上で下記を実行します。
$ gcc -Wall -o breathing_led breathing_led.c -lwiringPi
RaspberryPi 3B+として、ハードウェアPWMをサポートしている端子は、
前項で書いたようにGPIO18以外にもGPIO12,13,19があります。
WiringPiのpinMode()で設定しているLEDPINの値は1ですが、
WiringPiライブラリの中ではGPIO18を指します。
これは前回説明したとおり、gpio readallで確認することができます。
ちなみに、
GPIO12は、LEDPIN = 26
GPIO13は、LEDPIN = 23
GPIO19は、LEDPIN = 24
になっています。
5.LEDを徐々に消灯させる
LEDを徐々に消灯させるのは、点灯の逆をするだけなので、
サンプルコード(C言語)としては、こんな感じです。
#include <wiringpi.h>
#include <stdio.h>
#include <stdlib.h>
#define LEDPIN 1
int main() {
if( wiringPiSetup()==-1 ) {
printf("setup wiringPi failed!\n");
exit(1);
}
pinMode( LEDPIN, PWM_OUTPUT );
for(;;) {
for( bright=1023; bright>=0; --bright ) {
pwmWrite(LEDPIN,bright);
delay(2);
}
}
return 0;
}
サンプルコードなので、説明のために前項と別々にコードを分けてますが、
同時に記述すると滑らかな徐々に点灯からの徐々に消灯になります。
ちなみに、コンパイルのやり方は、4項と同じです。
6.最後に
LEDをON/OFFすることは、GPIOピンをHigh/Lowするだけなので簡単なのですが、
「徐々に」というところで、PWMが必要だということが勉強できました。
次はまだ購入していないですが、フルカラーLEDをやろうと考えています。
<関連・おすすめ記事>
Raspberry Pi (ラズパイ)で役に立つ書籍のおすすめランキングベスト5 - 水瓶座列車
Bluetoothでマルチペアリング(複数台接続)できるマウスのおすすめランキングベスト5 - 水瓶座列車
RaspberryPi (ラズパイ)の購入時に最低限必要なものとおすすめセット - 水瓶座列車
Raspberry Pi 3B+ でI2CキャラクタLCD(1602) の動作確認 - 水瓶座列車
Raspberry Pi(ラズパイ)のOSをバックアップ・リストアする方法 - 水瓶座列車