認定オンライン販売店:

AMAZON
AMAZON
amzuk

概要

前回のレッスンではLEDの制御方法を学びましたが、今回の記事ではRaspberry Piを使ってLEDを「呼吸する」ように明滅させる方法を紹介します。光の強度がゼロから徐々に最大値に増加し、LEDが呼吸しているかのようにゼロに戻ります。

ハードウェアの準備

1つのRaspberry Pi

1つのブレッドボード

1つのLED

1つの抵抗器(200Ω)

いくつかのジャンパーワイヤー

1つのT-Extension Board

1つの40ピンケーブル

ソフトウェア

getting started for raspberry piを参照してください。

PWM信号を使ってLEDの明るさを変える

PWM信号を使ってLEDの明るさを変える
このレッスンでは、LEDの明るさを制御して変えるためにPWM信号を使います。PWM(パルス幅変調)は非常に重要な信号であり、今後のレッスンでもよく使うことになります。

簡単に言えば、PWMはデジタル信号で、ソフトウェアの指示に従って電力量を変えられます。つまり、LEDの明るさやモーターの速度など、デバイスの電力と制御をプログラムする場合に、PWM信号を使う必要があります。

Raspberry Pi Official website   Raspberry Piの公式ウェブサイトによると、PiボードにはGPIO12、GPIO13、GPIO18、GPIO19の4つのピンがあり、これらのピンを使ってプログラム可能なハードウェアPWM信号を生成できます。ただし、Raspberrypi.orgではBCMシステムを使っているため、これら4つのPWMピンの物理的なピン番号は、次の図で示されている32、33、12、35です。

:

PWM の詳細については、hereをご覧ください。

このレッスンでは、LED を BCM GPIO ピン 18 に接続して、PWM テストを行います。

回路グラフ:

Step 1: ハードウェア接続

Step 2: コード

C言語ユーザーとPython言語ユーザー向けに、2種類のコードを提供します。

C言語ユーザーの場合、次の手順に従ってください。

まず、wiringPiライブラリがインストールされていることを確認してください。インストール方法がわからない場合は、以下のウェブサイトを訪問してください:: www.https://osoyoo.com/ja/2017/06/22/intall-wiringpi/

1 ) 次のコマンドを入力して、breathing_led.cという新しい.cファイルを作成してください。

cd  ~

sudo  nano  breathing_led.c

https://osoyoo.com/driver/pi3_start_learning_kit_lesson_6/breathing_led.cからコードをコピーし、上記の写真のようにファイルに貼り付けて、Ctrl+Xで終了してファイルを保存するには「Y」と入力してください。

また、以下のコマンドを使用して、当社のウェブサイトからbreathing_led.cを直接ダウンロードすることもできます。

sudo wget http://osoyoo.com/driver/pi3_start_learning_kit_lesson_6/breathing_led.c

2) コードのコンパイル
C言語は高水準言語です。プロジェクトを実行する前に、コードを実行可能ファイルとしてコンパイルする必要があります。以下のコマンドを入力してください。

gcc  -Wall  -o  breathing_led  breathing_led.c  -lwiringPi

gcc: はGNUコンパイラコレクションです。自分でCコードを書いてコンパイルして実行するには、gccをマスターする必要があります。gccについての詳細はこちらをご覧ください  here
-Wall: コードをコンパイルするときにエラーが発生した場合、詳細なエラーを取得するためのものです。
-o: コンパイル後のファイル名を任意で指定できます。ここでは、flow_ledという名前を指定します。
flow_led.c: コンパイル元のファイルを意味します。
-lwiringPi: ライブラリwiringPiをロードするためのもので、lはlibrary(ライブラリ)の略です。

3)プログラムの実行
以下のコマンドを入力して、プロジェクトを実行してください。

sudo  ./breathing_led

注:このプロジェクトではPWM機能を使用しているため、ルート権限でsudo(superuser do)コマンドを使用する必要があります。そうしない場合、piがクラッシュする可能性があります。

4) 実行結果

プログラムを実行すると、LEDが「呼吸」していることが見えるはずです。プログラムを停止したい場合は、端末に移動してコマンド「Ctrl + C」をタイプし、「Enter」を押して終了してください。前述のように、コードを編集するためにnanoを使用できます。次に、コードについて詳しく説明し、コードを完全に理解し、上記のコードを個人的にカスタマイズして試すことができるようにします。

C 言語コードの解析

a)#include コードの先頭にこのプロジェクトで使用されるヘッダーファイル(.hファイル)を含めます。

#include < wiringPi.h>
#include < stdio.h>
#include < stdlib.h>

//pin 1(BCM GPIO 18) is PWM  port
#define  LEDPIN   1

wiringPi GPIOライブラリを使用する前に、プログラムにそのヘッダーファイルを含める必要があります。

WiringPiは、Raspberry PiのGPIOインターフェイスライブラリであり、GPIOピンをプログラムして設定するために使用できるコマンドラインユーティリティgpioを含みます。これを使用して、ピンを読み書きし、シェルスクリプトから制御することもできます。

Stdioは、CのI/Oライブラリです。C / C ++では、printf()、scanf()、cout、cinなどの関数を使用します。

 

#define  LEDPIN   1 

上記の文は、wiringPiピン1(BCM GPIO 18)をPWMポートとして定義しています。

BMW 18が唯一、ハードウェアPWM機能を持つRaspberry Piピンであることに注意してください。 LEDPINの定義をピン1から他のピン番号に変更すると、明るさ関数pwmWrite(LEDPIN、bright)が機能せず、LEDが点滅しなくなります(明るさが変化しなくなります)。

PWM出力にBCM 18以外の他のピンを使用したい場合は、ソフトウェアPWMライブラリが必要になる場合があります。この場合、明るさ関数はもはやpwmWrite(LEDPIN、bright)ではありません。ソフトウェアPWMライブラリの詳細については、http://wiringpi.com/reference/software-pwm-library/を参照してください。

 int main(){
    int bright;
    if(wiringPiSetup()==-1){
        printf("setup wiringPi failed!\n");
        printf("please check your setup\n");
        exit(1);
    }
    
    pinMode(LEDPIN,PWM_OUTPUT);

    printf("\n");
    printf("\n");
    printf("********************************|\n");
    printf("|         Breath LED            |\n");
    printf("|   ------------------------    |\n");
    printf("|                               |\n");
    printf("|   LED_R1 connect to GPIO1     |\n");
    printf("|                               |\n");
    printf("|                               |\n");
    printf("|                         OSOYOO|\n");
    printf("********************************|\n");
    for(;;){
         printf("|*****************|\n");
         printf("|   breatf off    |\n"); 
         printf("|*****************|\n");
         for(bright=0;bright<1024;++bright){ pwmWrite(LEDPIN,bright); delay(2); } printf("|*****************|\n"); printf("| breath on |\n"); printf("|*****************|\n"); for(bright=1023;bright>=0;--bright){
            //USE pwmWrite function defined in wiringPito control LED brightness

            pwmWrite(LEDPIN,bright);
            delay(2);
            }
        }
    return 0;
 }

上記コードの2つの重要な関数の説明:
pinMode(LEDPIN、PWM_OUTPUT)は、BCM 18ピンを出力モードに設定し、PWM信号を出力できるようにします。

pwmWrite(LEDPIN、bright)は、変数brightに基づいてPWM信号値を設定し、輝度を適宜変更するために使用されます。

*******************************************************************************************

Python言語を使用する方へ:

1) 以下のコマンドを入力して、新しいbreathing_led.pyファイルを作成してください。

cd   ~

sudo  nano breathing_led.py

次に、上の写真のようにコードをコピーしてファイルに貼り付け、Ctrl+Xを押して終了し、ファイルを保存するために「Y」とタイプします。

2)以下のコマンドを使用して、breathing_led.pyファイルを直接ダウンロードできます:

sudo wget http://osoyoo.com/driver/pi3_start_learning_kit_lesson_6/breathing_led.py

3)プログラムを実行する
以下のコマンドを入力して、プロジェクトを実行してください。
sudo python ./breathing_led.py

4) 実行結果

プログラムを実行すると、LEDが「呼吸」しているのが見えるはずです。プログラムを停止したい場合は、ターミナルに移動してCtrl+Cを入力し、「Enter」を押して終了してください。コードを編集するにはnanoを使用できることを説明しましたので、次にコードの詳細な説明を以下に示します。これにより、コードを完全に理解し、カスタマイズして個人的なものにすることができます。

Python 言語解析

a)Python GPIOライブラリとtimeライブラリをインポートします。GPIOライブラリは、PythonでGPIOとやり取りするためのライブラリです。プロセスを簡素化する役割を果たします。timeライブラリは、遅延を入れるために必要です。さもないと、点滅が速すぎて気付かれない可能性があります。

import RPi.GPIO as GPIO
import time

#set BCM_GPIO 18(GPIO1) as LED pin
LEDPIN = 18

b)LEDとGPIOの接続を表示する関数を定義します。

#print message at the begining ---custom function
def print_message():
    print ('|**********************************|')
    print ('|           Breath LED             |')
    print ('|  ----------------------------    |')
    print ('|      LED Connect to GPIO1        |')
    print ('|  ----------------------------    |')
    print ('|                                  |')
    print ('|                            OSOYOO|')
    print ('|**********************************|\n')
    print ('Program is running...')
    print ('Please press Ctrl+C to end the program...')
    pass

c)setup()関数を使用してLEDPINをPWM出力に設定し、初期レベルをLOW LEVEL(0V)に設定し、PWM周波数は100Hzに設定します。RPI.GPIO関数の詳細については、こちらをご覧ください here

#setup function for some setup---custom function
def setup():
    global p
    GPIO.setwarnings(False)
    #set the gpio modes to BCM numbering
    GPIO.setmode(GPIO.BCM)
    #set all LedPin's mode to output,and initial level to HIGH(3.3V)
    GPIO.setup(LEDPIN,GPIO.OUT,initial=GPIO.LOW)

    #set LEDPIN as PWM output,and frequency=100Hz
    p = GPIO.PWM(LEDPIN,100)
    #set p begin with ualue 0
    p.start(0)
    pass

d) iwhileループで、 for 文を使用してLEDの光度を0から100に、4ずつ増加させ、次に100から0に、4ずつ減少させます。

 def main():
    #print info
    print_message()
    while True:
        print("|****************************|")
        print("|    Increase duty cycle     |")
        print("|****************************|")
        #increase duty cycle from 0 to 100
        for dc in range(0,101,4):
            #chang duty cycle to dc
            p.ChangeDutyCycle(dc)
            time.sleep(0.1)
            pass
        print("|****************************|")
        print("|    Decrease duty cycle     |")
        print("|****************************|")
        #decrease duty cycle from 100 to 0
        for dc in range(100,-1,-4):
            #change duty cycle to dc
            p.ChangeDutyCycle(dc)
            time.sleep(0.1)
            pass
        pass
    pass

Pythonのgpiozeroライブラリを使用した、より簡単な解決策もあります。

Pythonのgpiozeroライブラリには、LEDのPWM信号を生成するための単純なLEDPWM関数があります。この解決策に興味がある場合は、以下の手順に従ってください。

1)gpiozero pythonライブラリがインストールされていない場合は、インストールしてください。
通常、最新のRaspberry Pi pythonに付属していますが、OSにインストールされていない場合は、以下のコマンドを実行してインストールしてください。

sudo apt update 
sudo apt install python3-gpiozero

2)以下のコマンドに従って、Pythonコードをダウンロードし、実行します。

wget http://osoyoo.com/driver/pi3_start_learning_kit_lesson_6/breathing_led2.py
python breathing_led2.py

元のPythonコードと同じ結果が得られます。プログラムの簡単なコードは以下の通りです。

from gpiozero import PWMLED
from time import sleep

led = PWMLED(18)

 
while True:
    
    print("|****************************|")
    print("|    Increase duty cycle     |")
    print("|****************************|")
    #increase duty cycle from 0 to 100
    for dc in range(0,101,4):
    	#chang duty cycle to dc *0.01
        led.value = dc *0.01
        sleep(0.1)
        pass
    print("|****************************|")
    print("|    Decrease duty cycle     |")
    print("|****************************|")
    #decrease duty cycle from 100 to 0
    for dc in range(100,-1,-4):
        #change duty cycle to dc*0.01
        led.value = dc *0.01
        sleep(0.1)
        pass
    pass
pass