正規のオンライン小売業者:

AMAZON
AMAZON
amzuk

概要

前回のレッスンでは、Raspberry Piを使って1つのLEDを制御する方法を学びました。今回は、Raspberry Piを使って8つのLEDを制御し、順番に点滅させるプロジェクトを少し複雑にしてみましょう。

ハードウェアの準備:

1台のRaspberry Pi
1つのブレッドボード
8つのLED(赤2つ、緑2つ、白2つ、黄2つ)
8つの抵抗器(200Ω)
いくつかのジャンパーワイヤー
1つのT-拡張ボード
1つの40ピンケーブル

ソフトウェアの準備
注:今回のレッスンでは、PC上のPuTTyを使用してRaspberry Piをリモートで制御します。Raspberry Piの設定方法については、 lesson 1: getting started with raspberry piをご覧ください。

実験原理
LED(発光ダイオード)は、2つのリードを持つ半導体光源です。これは、活性化されたときに光を放出するp-n接合ダイオードです。適切な電圧がリードに印加されると、デバイス内の電子が電子ホールと再結合し、フォトンの形でエネルギーを放出します。この効果は電気発光と呼ばれ、光の色(フォトンのエネルギーに対応する)は、半導体のエネルギーバンドギャップによって決定されます。

8つのLED(正極)を抵抗器(200Ω)に接続して電流を制限し、負極をそれぞれB17、B18、B28、B22、B23、B24、B25、B4に接続します。BはBCM(Broadcomピン番号)を意味します。BCMピン#とは何かわからない場合は、 lesson 3: Introduction Of Raspberry Pi GPIO を参照してください。

抵抗器は3.3V電源に接続されており、負極に低電圧(0V)が印加されると、LEDが点灯します。回路図は以下のようになります:

Step 1: ハードウェアのセットアップ
以下の接続グラフに従って回路を組み立てます。

Step 2:ソフトウェア
C言語のユーザー向けに、2種類のコードを提供します。Python言語のユーザー向けのものもあります。

C言語のユーザー向けの手順は以下のとおりです:


まず、wiringPiライブラリがインストールされていることを確認してください。インストール方法がわからない場合は、以下のリンクを参照してください:https://osoyoo.com/ja/?p=7027

1) 次のコマンドを入力して、OSOYOOからCサンプルコードflow_led.cをダウンロードします:
cd  ~
sudo  wget  http://osoyoo.com/driver/pi3_start_learning_kit_lesson_5/flow_led.c
注:sudoはスーパーユーザーの権限で実行することを意味します。wgetは「web get」を表し、ネットワーク上からファイルをダウンロードすることを意味します。 sudo  wget  http://osoyoo.com/driver/flow_led.c は、OSOYOOからflow_led.cファイルをスーパーユーザーの許可でpiにダウンロードするためのものです。

サンプルコードファイルをカスタマイズしたい場合は、以下のコマンドを入力してnanoエディタを使用してソースコードを編集できます。

sudo   nano  flow_led.c

そうすると、flow_led.cファイルに移動し、コードをコピーして、Ctrl+Xを押して終了し、「Y」を入力してファイルを保存します。

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

gcc -Wall  -o  flow_led flow_led.c   -lwiringPi
注:

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

5) プログラムの実行

以下のコマンドを入力してプロジェクトを実行します。

sudo ./flow_led

6) 実行結果

プログラムを実行すると、LEDが左から右に点滅し、次に右から左に逆順に点滅します。プログラムを停止するには、ターミナルに移動してコマンド「Ctrl + C」を入力し、「Enter」を押します。また、このコードを編集するためにnanoを使用できるため、上記のコードをカスタマイズして個人的なニーズに合わせたり、LEDの選択方法や点灯方法を変更したりすることができます。

C言語コード解析

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

a) プロジェクトで使用するヘッダーファイル(.hファイル)をコードの先頭に追加します。
注:WiringPiはRaspberry Pi用のGPIOインターフェースライブラリであり、コマンドラインユーティリティgpioを含みます。これを使用してGPIOピンをプログラムや設定できます。これを使用してピンを読み書きすることができ、さらにシェルスクリプトからそれらを制御することもできます。
stdioは、CのシステムI/Oライブラリです。C/C++では、printf()、scanf()、cout、cinなどのI/O関数はstdioライブラリに属します。そのため、これらのI/O関数を使用するには、ヘッダーファイルを含める必要があります。

//turn on LED --- custom function
void turn_on(int channel){
    digitalWrite(channel,LOW);
}

//turn off LED --- custom function
void turn_off(int channel){
    digitalWrite(channel,HIGH);
}

上記の2つのカスタム関数は、LEDをオン/オフにするために定義されています。ここでは、WiringPiライブラリ内の関数を使用しています。WiringPiとAPIに関する詳細については、次のリファレンスをご覧ください。

Reference

 void setup(){
    int i;
    for(i=0;i<8;i++){
        pinMode(i,OUTPUT); //i is the wiringPi GPIO code
        digitalWrite(i,HIGH);//i is the wiringPi GPIO code

    } 
}

上記のステートメントは、GPIOをBCM番号スキームに設定し、ピンを出力モードに設定し、初期レベルを高レベル(3.3V)に設定するものです。 pinMode(i、OUTPUT)およびdigitalWrite(i、HIGH)関数内の変数iは、wiringPi GPIOピンコードを意味します。 i = 0はwiringPiピン0またはBCM17を意味し、i = 1はwiringPi#1またはBCM#18を意味します... wiringPiピン#とBCMピン#の関係の詳細については、  Introduction Of Raspberry Pi GPIO を参照してください。

 int main(){
    int i;
    if(wiringPiSetup()==-1){
        printf("setup wiringPi failed!\n");
        printf("please check your setup\n");
        return -1;
    }
    
    setup();
    printf("\n");
    printf("\n");
    printf("********************************|\n");
    printf("|         Flow LED              |\n");
    printf("|   ------------------------    |\n");
    printf("|                               |\n");
    printf("|   LED_R1 connect to GPIO0     |\n");
    printf("|   LED_R2 connect to GPIO1     |\n");
    printf("|   LED_G1 connect to GPIO2     |\n");
    printf("|   LED_G2 connect to GPIO3     |\n");
    printf("|   LED_Y1 connect to GPIO4     |\n");
    printf("|   LED_Y2 connect to GPIO5     |\n");
    printf("|   LED_W1 connect to GPIO6     |\n");
    printf("|   LED_W2 connect to GPIO7     |\n");
    printf("|                               |\n");
    printf("|                               |\n");
    printf("|                         OSOYOO|\n");
    printf("********************************|\n");

    while(1){
        //turn led from left to right
        printf("|****************************|\n");
        printf("|         ----->>            |\n");
        printf("|    From Left To Right!     |\n");
        printf("|                            |\n");
        printf("|****************************|\n");
        for(i=0;i<8;i++){
            turn_on(i);
            delay(150);
            turn_off(i);
        } 
        //turn on from righ to left
        printf("|****************************|\n");
        printf("|         <); printf("| From Right To Left! |\n"); printf("| |\n"); printf("|****************************|\n"); for(i=7;i>=0;i--){
            turn_on(i);
            delay(150);
            turn_off(i);
        }
    }
    return 0;
}

メイン関数main()は、プログラムにグローバル関数として名前付けられたmain関数を含む必要があります。main関数は、GPIOを初期化するためにsetup()関数を呼び出し、次にフォーマットされた出力を画面に表示します。while()関数は、左から右にLEDを点滅させ、次に右から左に逆順に点滅させるために使用されます。


Python言語を使用する場合は、以下の手順に従ってください:

もしRaspberry PiがHDMIケーブルを介してモニターに接続されている場合、Python 3(IDLE) GUI環境で直接プログラムを記述することができます。詳細については、こちらをご覧ください: https://osoyoo.com/ja/2017/06/23/python-light-led/

もしPiがモニターに接続されていない場合は、sshクライアントを使用してコマンドラインからPiにリモートアクセスすることができます。詳細については、こちらをご覧ください:https://osoyoo.com/ja/2017/06/20/raspberry-pi-3-basic-tutorial/

この例では、sshクライアントPuttyを使用してコマンドラインからPiにリモートアクセスすることにします。
1) 以下のコマンドを入力して、osoyooからPythonサンプルコードをダウンロードします。
cd  ~

sudo  wget  http://osoyoo.com/driver/pi3_start_learning_kit_lesson_5/flow_led.py

サンプルコードファイルをカスタマイズしたい場合は、ターミナルで以下のコマンドを入力してnanoエディタを使用してソースコードを編集することができます。

sudo nano  flow_led.py

注:cdは現在のパスから意図したディレクトリに移動することを意味します。簡単に言うと、cd ~はパス/home/pi/に移動することを意味します。Nanoはエディタです。flow_led.pyはファイル名であり、任意の名前を付けることができます。

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


注意:sudoは、スーパーユーザーの権限で実行することを意味し、wgetは「web get」の略で、ネットワークを介してファイルをダウンロードすることを意味します。sudo  wget  http://osoyoo.com/driver/flow_led.py は、osoyooからflow_led.pyファイルをスーパーユーザーの権限でpiにダウンロードするためのコマンドです。

3) プログラムの実行

以下のコマンドを入力して、プロジェクトを実行します

sudo python ./flow_led.py

4)実行結果

このプログラムは、左から右に順番にLEDが点滅し、その後右から左に逆順に点滅します。

Python言語のコード解析

import RPi.GPIO as GPIO 
import time

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

# set 8 pins for 8 leds.
LedPins = [17,18,27,22,23,24,25,4]

F8つのLED用に8つのピンを設定します。hereここではLedPins()を使用してGPIOピンを定義し、LedPinsはリスト名です。リストには、それぞれ17、18、22、23、24、25、4にLEDが接続されていることがわかります(GPIOをブロードコム番号システムに設定します)。

#print message at the begining ---custom function
def print_message():
    print ('******************************')
    print ('|            flow leds       |')
    print ('|     ---------------------  |')
    print ('|   LED_R1 connect to GPIO0  |')
    print ('|   LED_R2 connect to GPIO1  |')
    print ('|   LED_G1 connect to GPIO2  |')
    print ('|   LED_G2 connect to GPIO3  |')
    print ('|   LED_Y1 connect to GPIO4  |')
    print ('|   LED_Y2 connect to GPIO5  |')
    print ('|   LED_W1 connect to GPIO6  |')
    print ('|   LED_W2 connect to GPIO7  |')
    print ('|        ----------------    |')
    print ('|                            |')
    print ('|                      OSOYOO|')
    print ('****************************\n')
    print ('Program is running...')
    print ('Please press Ctrl+C to end the program...')

LEDとGPIOの接続を印刷するための関数を定義します。関数の定義方法については、ここを参照してください。

#setup function for some setup---custom function
def setup():
    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(LedPins,GPIO.OUT,initial=GPIO.HIGH)


ここでは、RPI.GPIO関数をいくつか使用しています。GPIO.setwarnings(False)は、誤った警告を無効にするためです。GPIO.setmode(GPIO.BCM)は、GPIOポートをBCM番号に設定するためです。GPIO.setup(LedPins,GPIO.OUT,initial=GPIO.HIGH)は、8つのGPIOポートを出力モードに設定し、初期レベルをHIGHに設定するためです。RPI.GPIO関数について詳しくは、ここを参照してくださいhere

 def main():
    #print info
    print_message()
    while True:
        #turn LED on from left to right
        print("***********************")
        print("       ----->>         ")
        print("  From Left To Right!  ")
        print("***********************")
        for pin in LedPins:
            GPIO.output(pin,GPIO.LOW)
            time.sleep(0.2)
            GPIO.output(pin,GPIO.HIGH)
            pass

        #turn LED on from right to left
        print("***********************")
        print("       <)
        print("  From Right To Left!  ")
        print("***********************")
        for pin in reversed(LedPins):
            GPIO.output(pin,GPIO.LOW)
            time.sleep(0.2)
            GPIO.output(pin,GPIO.HIGH)

メイン関数 main() は最初に print_message() 関数を呼び出して、画面にメッセージを表示します。whileループでは、 for 文を使用してLEDを左から右に順番に点滅させ、reverse()を使用して右から左に点滅させます。reversed()についての詳細は、こちらを参照してください。 here