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

AMAZON
AMAZON
amzuk

紹介
前回の2回のレッスンでは、Raspberry Piのプログラムを使って信号を出力し、LEDを点灯させる方法を紹介しました。今回のレッスンでは、ボタンスイッチから入力信号を取得し、プログラムを介してLEDを点灯させる方法を紹介します。

ハードウェアの準備

1 * Raspberry Pi

1 * ブレッドボード

1 * LED 1 * ボタン

1 * 抵抗器 (200Ω)

1 * 抵抗器 (10KΩ)

ジャンパーワイヤー

1 * T-Extension Board with 40-Pin Cable

ソフトウェアの準備

注: 今回のレッスンでは、PC上のPuTTyを使用してRaspberry Piをリモート制御します。Raspberry Piの設定方法については、レッスン1「Raspberry Piのはじめ方」を参照してください。 lesson 1: getting started with raspberry pi.

実験原理

ボタンは一般的な部品で、回路をオン/オフするスイッチとして機能します。当キットのボタンには4つのピンがあり、写真に示されています。

ピン1とピン2は導電性であり、ピン3とピン4も導電性です。ボタンを押すと、ピン1とピン3が導通し、ピン2とピン4が導通します。写真に示されている通りです。

ボタンを押していない場合

ボタンを押した場合

このプロジェクトでは、ボタンをB17に接続し、LEDをB18に接続します。回路グラフは以下の通りです。



回路グラフのB17は、BCM GPIO#17または物理ピン#11またはwiringPi#0(ゼロ)を意味し、B18はBCM GPIO#18または物理ピン#12またはwiringPi#1を意味します。

注:BはBCM(Broadcomピン番号)を意味します。BCMピン#、物理ピン#、wiringPi#がわからない場合は、レッスン2「Raspberry Pi GPIOの紹介」を確認してください: Introduction Of Raspberry Pi GPIO

ボタンが押されていない場合、B17(wiringPi#0(ゼロ))の入力電圧は、10KΩの抵抗器を介して3.3Vに引き上げられます。サンプルコードがB17から高電圧を読み取った場合、LEDを消すためにB18(wiringPi#1)に高レベルを出力します。

ボタンが押されている場合、B17(wiringPi#0(ゼロ))の入力がゼロに設定され、サンプルコードはB18(wiringPi#1)にゼロ電圧を出力し、LEDを点灯させます。

ハードウェアの設定

以下の接続グラフに従って回路を組み立てます。

ソフトウェア

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

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


注意:必ずwiringpiをインストールしてください。hereをクリックして、wiringpiがインストールされているかどうかを確認し、wiringpiをインストールする方法について詳しく学ぶことができます。

 

Step 1) ターミナルで以下のコマンドを入力して、osoyoo.comからbutton_led.cのサンプルコードをダウンロードしてください。
pi@raspberry:~ $ cd  ~
pi@raspberry:~ $ sudo  wget http://osoyoo.com/driver/pi3_start_learning_kit_lesson_7/button_led.c

 

注: サンプルコードファイルをカスタマイズしたい場合は、以下のコマンドをターミナルで入力してnanoエディタを使用してソースコードを編集できます。
pi@raspberry:~ $ sudo  nano button_led.c

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

Step 3) プログラムを実行する
pi@raspberry:~ $ sudo  ./button_led

Step 4) プログラムの結果
プログラムが実行されると、ターミナルに最初にコードを表示するメッセージが表示され、その後LEDがオフになります。ボタンを押すと、LEDが点灯し、ターミナルにLED Onと表示されます。ボタンを離すと、LEDが消灯し、ターミナルにLED Offと表示されます。プログラムを停止する場合は、ターミナルに移動してCtrl + Cと入力してください。

C言語のサンプルコードと解説コメント

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

//setup wirping#0(BCM_GPIO17) as Button pin
#define  ButtonPin   0
//setup wiringPi#1(BCM_GPIO18) as LED pin
#define  LedPin      1

int main(void){
    // When initialize wiring failed, print messageto screen
    if(wiringPiSetup() == -1){
        printf("setup wiringPi failed!");
        exit(1); 
    }
    //set LedPin BCM18 working at OUTPUT mode
    pinMode(LedPin, OUTPUT); 
    //set ButtonPin BCM17 working at INPUT mode
    pinMode(ButtonPin, INPUT);

    // Pull up to 3.3V,make GPIO1 a stable level
    pullUpDnControl(ButtonPin, PUD_UP);

    printf("\n");
    printf("|**************************************|\n");
    printf("|          Button control LED          |\n");
    printf("|    ------------------------------    |\n");
    printf("|         LED connect to GPIO1         |\n");
    printf("|        Button connect to GPIO0       |\n");
    printf("|                                      |\n");
    printf("|     Press button to turn on LED.     |\n");
    printf("|                                      |\n");
    printf("|                                OSOYOO|\n");
    printf("|**************************************|\n");
    printf("\n");

    digitalWrite(LedPin, HIGH);
    printf("|****************|\n");
    printf("|   LED off...   |\n");
    printf("|****************|\n");

    for(;;){
        // Indicate that button has pressed down
        if(digitalRead(ButtonPin) == 0){
            // Led on
            digitalWrite(LedPin, LOW);
            printf("|****************|\n");
            printf("|   ...LED on    |\n");
            printf("|****************|\n");
            delay(400);
        }
        else{
            // Led off
            digitalWrite(LedPin, HIGH);
            printf("|****************|\n");
            printf("|   LED off...   |\n");
            printf("|****************|\n");
            delay(400);
        }
    }
    return 0;
}

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


Python言語でプログラミングする場合、通常はRasbian Jessie OSに付属するGPIOライブラリであるRPi.GPIOを使用します。ここをクリックすると、RPI.GPIOとPythonについて詳しく学ぶことができます。

Step 1) ターミナルコマンドに従って、サンプルのPythonコードを/home/piにダウンロードしてください。
 pi@raspberry:~ $ cd   ~
 pi@raspberry:~ $ sudo  wget http://osoyoo.com/driver/pi3_start_learning_kit_lesson_7/button_led.py

注意:
サンプルコードファイルをカスタマイズする場合は、ターミナルで以下のコマンドを入力してソースコードを編集することができます。
pi@raspberry:~ $ sudo  nano button_led.py

Step 2) プログラムを実行します。
 pi@raspberry:~ $  sudo  python  ./button_led.py

Step 3) プログラムの結果
プログラムが実行されると、ターミナルに最初にコードの印刷メッセージが表示されます。ボタンを押すと、LEDが点灯し、ターミナルにLED Onと表示されます。再度ボタンを押すと、LEDが消灯し、ターミナルにLED Offと表示されます。プログラムを停止したい場合は、ターミナルに移動し、Ctrl + Cコマンドを入力してください。

Pythonコードの説明

import RPi.GPIO as GPIO
import time

#set BCM_GPIO 17(GPIO0) as button pin
ButtonPin = 17
#set BCM_GPIO 18(GPIO1) as LED pin
LedPin = 18

#set led status to True(OFF)
led_status = True

a.Python GPIOライブラリとtimeライブラリをインポートします。GPIOライブラリは、PythonでGPIOとのやり取りをするためのライブラリです。処理を簡素化するための役割を果たします。timeライブラリは、遅延を設定できるようにするために必要です。さもないと、点滅が速すぎて気づかないかもしれません。LEDとボタンのGPIOを定義します(ここではBCM#を使用)。

 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(LedPin,GPIO.OUT,initial=GPIO.HIGH)
    #set ButtonPin's mode to input,and pull up to high(3.3v)
    GPIO.setup(ButtonPin,GPIO.IN,pull_up_down = GPIO.PUD_UP)
    #set up a falling detect on ButtonPin,and callback function to ButtonLed
    GPIO.add_event_detect(ButtonPin,GPIO.FALLING,callback = ButtonLed)
    pass

b. pinMode(ButtonPin, INPUT)とpullUpDnControl(ButtonPin, PUD_UP)は、ButtonPinをプルアップ入力に設定します。プログラムはボタンピンからレベルを何度も取得します。ボタンが押されている間は、プログラムは低レベルを取得し、LEDPinに低レベルを出力するため、LEDが点灯します。それ以外の場合、LedPinは高レベルになり、LEDは消灯します。setup関数は、LEDPinを出力モード、ボタンをプルアップ入力モードに設定し、ButtonPinでの落下を検出するように設定します。Raspberry PiがButtonPinの落下を検出すると、プログラムはコールバック関数に戻って、終了コードを実装します。

 def ButtonLed(ev=None):
    global led_status
    # Switch led status(on-->off; off-->on)
    led_status = not led_status
    GPIO.output(LedPin, led_status)
    if led_status:
        print('|*************|')
        print('|  LED OFF... |')
        print('|*************|')
        print('\n')
    else:
        print('|*************|')
        print('|  ...LED ON  |')
        print('|*************|')
        print('\n')

c. コールバック関数では、LedPinのレベルが反転します。つまり、LedPinのレベルがオフの場合、LEDはオンになり、LedPinのレベルがオンの場合、LEDはオフになります。

 def main():
    # Print messages
    print_message()
    while True:
        # Don't do anything.
        time.sleep(1)

d. main関数は、終了を待つ以外の何もしない関数です。