Raspberry Pi Pythonサンプルプログラム集

LED (DIGITAL)

タイヤに座っているフィッシャー君
import RPi.GPIO as GPIO              # GPIO のライブラリのインポート
import time                          # time をインポート

led = 23                             # LED  のピンを 23番のピンに割り当てる 

GPIO.setwarnings(False)              # 以前に実行したGPIOポートの状態が残っていた時に出力される警告文を抑制する
GPIO.setmode(GPIO.BCM)               #  ピン番号ではなく役割に記載されたGPIOの数字で指定する
GPIO.setup(led,GPIO.OUT)             # 出力

print("CTRL+C = STOP program")       # コンソール画面に出力する

try:
    while True:
        GPIO.output(led,GPIO.HIGH)                  #  ON
        time.sleep(0.5)                             # 0.5秒間停止
        GPIO.output(led,GPIO.LOW)                   #  OFF
        time.sleep(0.5)                             # 0.5秒間停止
        
except KeyboardInterrupt:                           # 例外処理   Ctrl+c で 実行される
    GPIO.cleanup()                                  # 全てのGPIOピンを解放



DIDACTA
サンプルプログラム

スイッチ&LED - MICRO SWITCH (DIGITAL)

座っている青フィッシャー君に話しかけている白フィッシャー君
import RPi.GPIO as GPIO                 # GPIO のライブラリのインポート
import time                             #time をインポート

led = 23                                # LED  のピンを 23番のピンに割り当てる 
sw1 = 26                                # sw1  のピンを 26番のピンに割り当てる 

GPIO.setwarnings(False)                                         # 以前に実行したGPIOポートの状態が残っていた時に出力される警告文を抑制する
GPIO.setmode(GPIO.BCM)                                          #  ピン番号ではなく役割に記載されたGPIOの数字で指定する

GPIO.setup(led,GPIO.OUT)                                        # 出力
GPIO.setup(sw1,GPIO.IN, pull_up_down=GPIO.PUD_UP)               # 入力
 # --  出力  --
GPIO.output(led,GPIO.LOW)                                       # OFF

print("CTRL+C = STOP program")                                  # コンソール画面に出力

try:
    while True:
        if GPIO.input(sw1) == 0:                                # スイッチ押したら
            GPIO.output(led,GPIO.HIGH)                          # ON
        else:                                                   # それ以外
            GPIO.output(led,GPIO.LOW)                           # OFF
except KeyboardInterrupt:                                       # 例外処理   Ctrl+c で 実行される
    GPIO.cleanup()                                              # 全てのGPIOピンを解放



DIDACTA
サンプルプログラム

LED1 (ANALOG)

座っている青フィッシャー君に話しかけている白フィッシャー君
import RPi.GPIO as GPIO                 # GPIO のライブラリのインポート
import time                             #time をインポート

led = 23                                # LED  のピンを 23番のピンに割り当てる 


GPIO.setwarnings(False)                                         # 以前に実行したGPIOポートの状態が残っていた時に出力される警告文を抑制する
GPIO.setmode(GPIO.BCM)                                          #  ピン番号ではなく役割に記載されたGPIOの数字で指定する

GPIO.setup(led,GPIO.OUT)                # 出力

p1 = GPIO.PWM(led, 50)                  # PWM のインスタンスをつくる  50Hz
p1.start(0)                             # PWMを開始する
print("CTRL+C = STOP program")          # コンソール画面に出力

try:
    while True:
        for n in range(0,50,10):        # 0 ~ 50 まで を 10づつループする
            p1.ChangeDutyCycle(n)       # デューティサイクルの変更
            time.sleep(0.5)             # 0.5秒間停止
        else:
            GPIO.output(led,GPIO.LOW)   # OFF
except KeyboardInterrupt:                                       # 例外処理   Ctrl+c で 実行される
    GPIO.cleanup()                                              # 全てのGPIOピンを解放



DIDACTA
サンプルプログラム

LED2 - MICRO SWITHCH (ANALOG)

地面に座りながら雑談しているフィッシャー君
import RPi.GPIO as GPIO                 # GPIO のライブラリのインポート
import time                             #time をインポート

led = 23                                # LED  のピンを 23番のピンに割り当てる 
sw1 = 26                                # sw1  のピンを 26番のピンに割り当てる 

br = 0                                  # br という変数を 0 で初期化

GPIO.setwarnings(False)                                         # 以前に実行したGPIOポートの状態が残っていた時に出力される警告文を抑制する
GPIO.setmode(GPIO.BCM)                                          #  ピン番号ではなく役割に記載されたGPIOの数字で指定する


GPIO.setup(sw1,GPIO.IN, pull_up_down=GPIO.PUD_UP)               # 出力
GPIO.setup(led,GPIO.OUT)                                        # 入力

p1 = GPIO.PWM(led, 50)                                           # PWM のインスタンスをつくる  50Hz
p1.start(0)                                                      # PWMを開始する
print("CTRL+C = STOP program")                                   # コンソール画面に出力

try:
    while True:
        if GPIO.input(sw1) == 0:                        # スイッチを押したとき
            p1.ChangeDutyCycle(br)                      # デューティサイクルの変更
            time.sleep(0.2)                             # 0.2秒間停止
            br = br + 10                                # br を +10 する
            if br > 100:                                # br の 値が 100 よりも大きいなら
                br = 0                                  # br = 0    リセットする
        else:
            GPIO.output(led,GPIO.LOW)                   # OFF
except KeyboardInterrupt:                                       # 例外処理   Ctrl+c で 実行される
    GPIO.cleanup()                                              # 全てのGPIOピンを解放



DIDACTA
サンプルプログラム

フォトトランジスタ1 - LED LIGHT (DIGITAL)

両腕を上げているフィッシャー君
import RPi.GPIO as GPIO                 # GPIO のライブラリのインポート
import time                             #time をインポート

led = 23                                # LED  のピンを 23番のピンに割り当てる 
photo1 = 26                                # photo1  のピンを 26番のピンに割り当てる 

GPIO.setwarnings(False)                                         # 以前に実行したGPIOポートの状態が残っていた時に出力される警告文を抑制する
GPIO.setmode(GPIO.BCM)                                          #  ピン番号ではなく役割に記載されたGPIOの数字で指定する

GPIO.setup(photo1,GPIO.IN, pull_up_down=GPIO.PUD_UP)               # 出力
GPIO.setup(led,GPIO.OUT)                                        # 入力

 # -- 出力  --
GPIO.output(led,GPIO.LOW)                            # OFF

print("CTRL+C = STOP program")                       # コンソール画面に出力

try:
    while True:
        if GPIO.input(photo1) == 0:                    # 明るいとき
            GPIO.output(led,GPIO.HIGH)              # ON
        else:                                       # 暗いとき
            GPIO.output(led,GPIO.LOW)               # OFF
except KeyboardInterrupt:                                       # 例外処理   Ctrl+c で 実行される
    GPIO.cleanup()                                              # 全てのGPIOピンを解放



DIDACTA
サンプルプログラム

フォトトランジスタ2 - LED LIGHT (ANALOG)

座りながら会話をしているフィッシャー君
import RPi.GPIO as GPIO                 # GPIO のライブラリのインポート
import time                             #time をインポート

from smbus import SMBus                 # smbus ライブラリを利用する    I2C通信
bus = SMBus(1)                          # コネクションオブジェクトを取得


GPIO.setwarnings(False)                                         # 以前に実行したGPIOポートの状態が残っていた時に出力される警告文を抑制する
GPIO.setmode(GPIO.BCM)                                          #  ピン番号ではなく役割に記載されたGPIOの数字で指定する


an0 = 0                                 # an0 という変数を 0 で 初期化する
led1 = 23                                # led  のピンを 23番のピンに割り当てる 
led2 = 22                               # led2  のピンを 22番のピンに割り当てる 
led3 = 25                               # led3  のピンを 25番のピンに割り当てる 

  
GPIO.setup(led1,GPIO.OUT)               # 出力
GPIO.setup(led2,GPIO.OUT)               # 出力
GPIO.setup(led3,GPIO.OUT)               # 出力
 # -- 出力  --
GPIO.output(led1,GPIO.LOW)              # OFF
GPIO.output(led2,GPIO.LOW)              # OFF
GPIO.output(led3,GPIO.LOW)              # OFF

def read_ain(i):
    global bus
    bus.write_byte(0x48, i)                     #  書き込む
    bus.read_byte(0x48)                         #  読み込む
    return bus.read_byte(0x48)

print("CTRL+C = STOP program")                       # コンソール画面に出力
try:
    while True:
        an0 = read_ain(0)                       # アナログの値を取得
        val = 160 - an0                         # 160 - 取得した値
        ledv = val + 70                         # val の値に +70を する
        print(str(an0)+" - "+str(val))          # コンソール画面に   アナログの取得した値  計算したval の値の 出力
        print("-")
        bus.write_byte_data(0x48, 0x40, ledv)   # データを送信   write_i2c_block_data(addr, ord, vals) ---  addr はデバイスアドレス -送信データのうち最初の 1バイトを ord - 残りを vals
        if val > 20 and val < 80:               # val の値が  30 < val < 69  ならば
            GPIO.output(led1,GPIO.HIGH)         # ON
        else:
            GPIO.output(led1,GPIO.LOW)          # OFF
        if val > 81 and val < 129:              #  val の値が  70 < val < 110  ならば
            GPIO.output(led2,GPIO.HIGH)         # ON
        else:
            GPIO.output(led2,GPIO.LOW)          # OFF
        if val > 130:                           # val の値が 111よりも小さければ
            GPIO.output(led3,GPIO.HIGH)         # ON
        else:
            GPIO.output(led3,GPIO.LOW)          # OFF

except KeyboardInterrupt:                                       # 例外処理   Ctrl+c で 実行される
    GPIO.cleanup()                                              # 全てのGPIOピンを解放



DIDACTA
サンプルプログラム

DCモーター1 (DIGITAL)

ファンを避けようとしているフィッシャー君
import RPi.GPIO as GPIO                 # GPIO のライブラリのインポート
import time                             #time をインポート

mot = 23                                # mot  のピンを 23番のピンに割り当てる 


GPIO.setwarnings(False)                 # 以前に実行したGPIOポートの状態が残っていた時に出力される警告文を抑制する
GPIO.setmode(GPIO.BCM)                  #  ピン番号ではなく役割に記載されたGPIOの数字で指定する



GPIO.setup(mot,GPIO.OUT)                # 出力

print("CTRL+C = STOP program")          # コンソール画面に出力

try:
    while True:
        GPIO.output(mot,GPIO.HIGH)      # ON
        time.sleep(0.1)                 # 0.1秒間停止
        GPIO.output(mot,GPIO.LOW)       # OFF
        time.sleep(1)                   # 1秒間停止

except KeyboardInterrupt:                                       # 例外処理   Ctrl+c で 実行される
    GPIO.cleanup()                                              # 全てのGPIOピンを解放



DIDACTA
サンプルプログラム

DCモーター2 - ONE WAY ROTATION (DIGITAL)

ファンの裏側を覗いているフィッシャー君
import RPi.GPIO as GPIO                 # GPIO のライブラリのインポート
import time                             #time をインポート

mot = 23                                # mot  のピンを 23番のピンに割り当てる 
sw1 = 26                                # sw1  のピンを 26番のピンに割り当てる 

GPIO.setwarnings(False)                 # 以前に実行したGPIOポートの状態が残っていた時に出力される警告文を抑制する
GPIO.setmode(GPIO.BCM)                  #  ピン番号ではなく役割に記載されたGPIOの数字で指定する

GPIO.setup(mot,GPIO.OUT)                                  #   出力
GPIO.setup(sw1,GPIO.IN, pull_up_down=GPIO.PUD_UP)         #   入力

#  -- 出力  --
GPIO.output(mot,GPIO.LOW)                                 #   OFF

print("CTRL+C = STOP program")                            # コンソール画面に出力

try:
    while True:
        if GPIO.input(sw1) == 0:                          # スイッチを押したとき
            GPIO.output(mot,GPIO.HIGH)                    #   ON
        else:                                             #   それ以外
            GPIO.output(mot,GPIO.LOW)                     #   OFF

except KeyboardInterrupt:                                 #    例外処理   Ctrl+c で 実行される
    GPIO.cleanup()                                        #    全てのGPIOピンを解放



DIDACTA
サンプルプログラム

DCモーター3 - TWO WAYS ROTATION (DIGITAL)

久しぶりに会う青フィッシャー君に挨拶をしている白フィッシャー君
import RPi.GPIO as GPIO                 # GPIO のライブラリのインポート
import time                             #time をインポート

mota = 22                               # mota  のピンを 22番のピンに割り当てる 
motb = 23                               # motb  のピンを 23番のピンに割り当てる 
in26 = 26                               # in26  のピンを 26番のピンに割り当てる 
in19 = 19                               # in19  のピンを 19番のピンに割り当てる 

GPIO.setwarnings(False)                 # 以前に実行したGPIOポートの状態が残っていた時に出力される警告文を抑制する
GPIO.setmode(GPIO.BCM)                  #  ピン番号ではなく役割に記載されたGPIOの数字で指定する

GPIO.setup(mota,GPIO.OUT)                               #  出力
GPIO.setup(motb,GPIO.OUT)                               #  出力
GPIO.setup(in26,GPIO.IN, pull_up_down=GPIO.PUD_UP)      #  入力
GPIO.setup(in19,GPIO.IN, pull_up_down=GPIO.PUD_UP)      #  入力

#  --  出力  --
GPIO.output(mota,GPIO.LOW)       #  OFF
GPIO.output(motb,GPIO.LOW)       #  OFF

print("CTRL+C = STOP program")          # コンソール画面に出力

try:
    while True:
        if GPIO.input(in26) == 0:                           #  in26  を押したとき
            GPIO.output(motb,GPIO.HIGH)                     #  ON
        else:                                               #  それ以外
            GPIO.output(motb,GPIO.LOW)                      #  OFF

        if GPIO.input(in19) == 0:                           #  in19  を押したとき
            GPIO.output(mota,GPIO.HIGH)                     #  ON
        else:                                               #  それ以外
            GPIO.output(mota,GPIO.LOW)                      #  OFF

except KeyboardInterrupt:                                 #    例外処理   Ctrl+c で 実行される
    GPIO.cleanup()                                        #    全てのGPIOピンを解放



DIDACTA
サンプルプログラム

DCモーター4 - SPEED CONTROL (ANALOG)

遠い距離から会話をしているフィッシャー君
import RPi.GPIO as GPIO                 # GPIO のライブラリのインポート
import time                             #time をインポート

mota = 22                               # mota  のピンを 22番のピンに割り当てる 
motb = 23                               # motb  のピンを 23番のピンに割り当てる

GPIO.setwarnings(False)                 # 以前に実行したGPIOポートの状態が残っていた時に出力される警告文を抑制する
GPIO.setmode(GPIO.BCM)                  #  ピン番号ではなく役割に記載されたGPIOの数字で指定する

GPIO.setup(mota,GPIO.OUT)               #  OUT 
GPIO.setup(motb,GPIO.OUT)               #  OUT 

p1 = GPIO.PWM(mota, 100)                # 100Hz
p2 = GPIO.PWM(motb, 50)                 # 50Hz

print("CTRL+C = STOP program")          # コンソール画面に出力

try:
    while True:
            n = 100
            p1.start(0)
            p1.ChangeDutyCycle(n)                   # PWMのデューティー比を  100 へ 変更
            time.sleep(1)                           # 1秒間停止
            p1.stop()                               # STOP
            GPIO.output(mota,GPIO.LOW)              # OFF
            time.sleep(2)                           # 1秒間停止

            n = 30
            p2.start(0)                             # PWMのデューティー比を  30 へ 変更
            p2.ChangeDutyCycle(n)
            time.sleep(1)                           # 1秒間停止
            p2.stop()                               # STOP
            GPIO.output(motb,GPIO.LOW)              # OFF
            time.sleep(2)                           # 2秒間停止

except KeyboardInterrupt:                           #  例外処理   Ctrl+c で 実行される
    GPIO.cleanup()                                  #  全てのGPIOピンを解放



DIDACTA
サンプルプログラム

赤外線センサー1 (DIGITAL)

赤外線センサーの上に座っている青フィッシャー君と陰でそれを見つめている白フィッシャー君
import RPi.GPIO as GPIO                 # GPIO のライブラリのインポート
import time                             #time をインポート

leda = 20                               # leda  のピンを 20番のピンに割り当てる 
ledb = 21                               # ledb  のピンを 21番のピンに割り当てる 
in18 = 18                               # in18  のピンを 18番のピンに割り当てる 
in19 = 19                               # in19  のピンを 19番のピンに割り当てる
irpow = 23                              # irpow のピンを 19番のピンに割り当てる

GPIO.setwarnings(False)                 # 以前に実行したGPIOポートの状態が残っていた時に出力される警告文を抑制する
GPIO.setmode(GPIO.BCM)                  #  ピン番号ではなく役割に記載されたGPIOの数字で指定する

GPIO.setup(leda,GPIO.OUT)                               # 出力
GPIO.setup(ledb,GPIO.OUT)                               # 出力
GPIO.setup(irpow,GPIO.OUT)                              # 出力
GPIO.setup(in18,GPIO.IN, pull_up_down=GPIO.PUD_UP)      # 入力
GPIO.setup(in19,GPIO.IN, pull_up_down=GPIO.PUD_UP)      # 入力
# -- 出力  --
GPIO.output(leda,GPIO.LOW)              # OFF
GPIO.output(ledb,GPIO.LOW)              # OFF
GPIO.output(irpow,GPIO.HIGH)            # ON

print("CTRL+C = STOP program")          # コンソール画面に出力

try:
    while True:
        if GPIO.input(in18) == 1:                         #    白のとき
            GPIO.output(ledb,GPIO.HIGH)                   #    ON
        else:
            GPIO.output(ledb,GPIO.LOW)                    #    OFF

        if GPIO.input(in19) == 1:                         #    黒のとき
            GPIO.output(leda,GPIO.HIGH)                   #    ON
        else:
            GPIO.output(leda,GPIO.LOW)                    #    OFF

except KeyboardInterrupt:                                       # 例外処理   Ctrl+c で 実行される
    GPIO.cleanup()                                              # 全てのGPIOピンを解放



DIDACTA
サンプルプログラム

赤外線センサー2 (ANALOG)

ストレッチをしているフィッシャー君
import RPi.GPIO as GPIO                     # GPIO のライブラリのインポート
import time                                 #time をインポート

from smbus import SMBus                 # smbus ライブラリを利用する    I2C通信
bus = SMBus(1)                          # コネクションオブジェクトを取得

an0 = 0                                 # an0 を初期化する
an1 = 1                                 # an0 を初期化する
leda = 20                               # leda の ピンを 20番ピン を割り当てる
ledb = 21                               # ledb の ピンを 21番ピン を割り当てる
irpow = 23                              # irpow のピンを 23番のピンに割り当てる

GPIO.setwarnings(False)                 # 以前に実行したGPIOポートの状態が残っていた時に出力される警告文を抑制する
GPIO.setmode(GPIO.BCM)                  #  ピン番号ではなく役割に記載されたGPIOの数字で指定する

GPIO.setup(leda,GPIO.OUT)               # 出力
GPIO.setup(ledb,GPIO.OUT)               # 出力
GPIO.setup(irpow,GPIO.OUT)              # 出力
#  --  出力  --
GPIO.output(leda,GPIO.LOW)              # OFF
GPIO.output(ledb,GPIO.LOW)              # OFF
GPIO.output(irpow,GPIO.HIGH)            # ON

def read_ain(i):
    global bus
    bus.write_byte(0x48, i)             # 書き込む
    bus.read_byte(0x48)                 # 読み込む
    return bus.read_byte(0x48)

print("CTRL+C = STOP program")          # コンソール画面に出力

try:
    while True:
        an0 = read_ain(0)                               # アナログの値を 取得 
        an1 = read_ain(1)                               # アナログの値を 取得 

        print(str(an0)+" - "+str(an1))                 # コンソール画面に出力

        val = 60 - an0                              # 計算結果を  val へ代入
        ledv = val + 70                             # 計算結果を    ledv へ代入
        bus.write_byte_data(0x48, 0x40, ledv)         # analog LED

        if an0 > 100:                                           # an0 の値が 100 よりも大きければ
            GPIO.output(ledb,GPIO.HIGH)                         #  ON
        else:
            GPIO.output(ledb,GPIO.LOW)                          #  OFF

        if an1 > 100:                                           # an1 の値が 100 よりも大きければ
            GPIO.output(leda,GPIO.HIGH)                         # ON
        else:
            GPIO.output(leda,GPIO.LOW)                          # OFF

except KeyboardInterrupt:                                       # 例外処理   Ctrl+c で 実行される
    GPIO.cleanup()                                              # 全てのGPIOピンを解放



DIDACTA
サンプルプログラム

温度センサー (ANALOG)

青フィッシャー君の肩に手を置いている白フィッシャー君
import RPi.GPIO as GPIO                     # GPIO のライブラリのインポート
import time                                 #time をインポート

from smbus import SMBus                 # smbus ライブラリを利用する    I2C通信
bus = SMBus(1)                          # コネクションオブジェクトを取得

an0 = 0                                 # an0 を初期化する
leda = 20                               # leda の ピンを 20番ピン を割り当てる
in5 = 5                                 # in5  の ピンを  5番ピン を割り当てる
led_pow = 22                            # irpow のピンを 22番のピンに割り当てる


GPIO.setwarnings(False)                 # 以前に実行したGPIOポートの状態が残っていた時に出力される警告文を抑制する
GPIO.setmode(GPIO.BCM)                  #  ピン番号ではなく役割に記載されたGPIOの数字で指定する

GPIO.setup(leda,GPIO.OUT)                               # 出力
GPIO.setup(led_pow,GPIO.OUT)                            # 出力
GPIO.setup(in5,GPIO.IN, pull_up_down=GPIO.PUD_UP)       # 入力

#  --- 出力  ---
GPIO.output(leda,GPIO.LOW)                  # OFF


def read_ain(i):
    global bus
    bus.write_byte(0x48, i)                 # 書き込む
    bus.read_byte(0x48)                     # 読み込む
    return bus.read_byte(0x48)



print("CTRL+C = STOP program")          # コンソール画面に出力

try:
    while True:
        an0 = read_ain(0)                               # アナログの値を 取得
        print("an0= "+str(an0))                         # コンソール画面に出力
        val = 160 - an0                                 # 計算結果を  val へ代入
        ledv = val + 70                                 # 計算結果を    ledv へ代入

        bus.write_byte_data(0x48, 0x40, ledv)           # 書き込む

        if an0 < 30:                                   # an0  が 146 より小さければ
            GPIO.output(leda,GPIO.HIGH)                 # ON
        else:
            GPIO.output(leda,GPIO.LOW)                  #  OFF

        if GPIO.input(in5) == 0:                        #  スイッチを押したとき
            GPIO.output(led_pow,GPIO.HIGH)              #  ON
        else:
            GPIO.output(led_pow,GPIO.LOW)               #  OFF


except KeyboardInterrupt:                                       # 例外処理   Ctrl+c で 実行される
    GPIO.cleanup()                                              # 全てのGPIOピンを解放



DIDACTA
サンプルプログラム

マグネティックセンサー (DIGITAL)

マグネティックセンサーを持っているフィッシャー君
import RPi.GPIO as GPIO                     # GPIO のライブラリのインポート
import time                                 #time をインポート

led = 20                                    # led の ピンを 20番ピン を割り当てる
mgn1 = 6                                    # mgn1 の ピンを  6番ピン を割り当てる

GPIO.setwarnings(False)                 # 以前に実行したGPIOポートの状態が残っていた時に出力される警告文を抑制する
GPIO.setmode(GPIO.BCM)                  #  ピン番号ではなく役割に記載されたGPIOの数字で指定する


GPIO.setup(led,GPIO.OUT)                                    # 出力
GPIO.setup(mgn1,GPIO.IN, pull_up_down=GPIO.PUD_UP)           # 入力

#   --- 出力 ---
GPIO.output(led,GPIO.LOW)                                   #  OFF

print("CTRL+C = STOP program")                              # コンソール画面に出力

try:
    while True:
        if GPIO.input(mgn1) == 0:                            #   磁石を近づけたら
            GPIO.output(led,GPIO.HIGH)                      #   ON
        else:
            GPIO.output(led,GPIO.LOW)                       #   OFF

except KeyboardInterrupt:                                       # 例外処理   Ctrl+c で 実行される
    GPIO.cleanup()                                              # 全てのGPIOピンを解放



DIDACTA
サンプルプログラム

カラーセンサー1 - COLORS

カラーセンサーの上に座っている白フィッシャー君とカラーコードを眺めている青フィッシャー君
import RPi.GPIO as GPIO                     # GPIO のライブラリのインポート
import time                                 #time をインポート

from smbus import SMBus                 # smbus ライブラリを利用する    I2C通信
bus = SMBus(1)                          # コネクションオブジェクトを取得

an0 = 0                                 # an0  の ピンを  0番ピン を割り当てる
led1 = 23                               # led1 の ピンを 23番ピン を割り当てる
led2 = 22                               # led2 の ピンを 22番ピン を割り当てる
led3 = 25                               # led3 の ピンを 25番ピン を割り当てる

color_pw = 20                           # color_pw 20 で初期化する
br1 = 0                                 # br1 を  0 で初期化する
br2 = 0                                 # br2 を  0 で初期化する
br3 = 0                                 # br3 を  0 で初期化する

GPIO.setwarnings(False)                 # 以前に実行したGPIOポートの状態が残っていた時に出力される警告文を抑制する
GPIO.setmode(GPIO.BCM)                  #  ピン番号ではなく役割に記載されたGPIOの数字で指定する

GPIO.setup(led1,GPIO.OUT)               #  出力
GPIO.setup(led2,GPIO.OUT)               #  出力
GPIO.setup(led3,GPIO.OUT)               #  出力
GPIO.setup(color_pw,GPIO.OUT)           #  入力

#  ---  出力  ---
GPIO.output(led1,GPIO.LOW)              # OFF
GPIO.output(led2,GPIO.LOW)              # OFF
GPIO.output(led3,GPIO.LOW)              # OFF
GPIO.output(color_pw,GPIO.HIGH)         #  color_pw の値で出力

def read_ain(i):
    global bus
    bus.write_byte(0x48, i)             #  書き込み
    bus.read_byte(0x48)                 #  読み込む
    return bus.read_byte(0x48)

print("CTRL+C = STOP program")                              # コンソール画面に出力

try:
    while True:
        an0 = read_ain(1)                               # アナログの値を 取得
        print("an0= "+str(an0))                         # コンソール画面に出力
        val = 160 - an0                                 # 計算結果を  val へ代入
        ledv = val + 70                                 # 計算結果を    ledv へ代入

        print(str(an0))
        print("-")

        bus.write_byte_data(0x48, 0x40, ledv)           # 書き込み

        if an0 > 156 and br1 > 3:                       # an0 が 156 より大きく、        br1    が 3より大きいなら
            GPIO.output(led1,GPIO.HIGH)                 #   ON
            br1 = 0                                     #  0 にする
        else:
            GPIO.output(led1,GPIO.LOW)

        if an0 < 153 and br2 > 3:                       # an0 が 153 より大きく、        br2    が 3より大きいなら
            GPIO.output(led2,GPIO.HIGH)                 #   ON
            br2 = 0                                     #  0 にする
        else:
            GPIO.output(led2,GPIO.LOW)

        if an0 == 156 and br3 > 3:                      # an0 が 153 より大きく、        br3    が 3より大きいなら
            GPIO.output(led3,GPIO.HIGH)                 #   ON
            br3 =   0                                   #  0 にする
        else:
            GPIO.output(led3,GPIO.LOW)

        if an0 == 156 or an0 == 155:                    #  an0 が 156 または  an0 が 155なら
            br3 = br3 + 1                               #  br3 を +1
        if an0 < 153:                                   #  an0 が 153 よりも小さい なら
            br2 = br2 + 1                               #  br2 を +1
        if an0 > 156:                                   #  an0 が 156 よりも大きいなら
            br1 = br1 + 1                               #  br1 を +1

except KeyboardInterrupt:                                       # 例外処理   Ctrl+c で 実行される
    GPIO.cleanup()                                              # 全てのGPIOピンを解放



DIDACTA
サンプルプログラム

カラーセンサー2 - BLACK LINE

打合わせをしているフィッシャー君
import RPi.GPIO as GPIO                     # GPIO のライブラリのインポート
import time                                 #time をインポート

from smbus import SMBus                 # smbus ライブラリを利用する    I2C通信
bus = SMBus(1)                          # コネクションオブジェクトを取得


an0 = 0                                 # an0  の ピンを  0番ピン を割り当てる
led3 = 25                               # led3 の ピンを 25番ピン を割り当てる

color_pw = 20                           # color_pw を 20 で 初期化する

GPIO.setwarnings(False)                 # 以前に実行したGPIOポートの状態が残っていた時に出力される警告文を抑制する
GPIO.setmode(GPIO.BCM)                  #  ピン番号ではなく役割に記載されたGPIOの数字で指定する

GPIO.setup(led3,GPIO.OUT)               #  出力
GPIO.setup(color_pw,GPIO.OUT)           #  出力

#   ---   出力   ---
GPIO.output(led3,GPIO.LOW)                          #    OFF
GPIO.output(color_pw,GPIO.HIGH)                     #    ON

def read_ain(i):
    global bus
    bus.write_byte(0x48, i)                         #    書き込み
    bus.read_byte(0x48)                             #    読み込む
    return bus.read_byte(0x48)

print("CTRL+C = STOP program")                     # コンソール画面に出力

try:
    while True:
        an0 = read_ain(1)                               # アナログの値を 取得
        val = 160 - an0                                 # 計算結果を  val へ代入
        ledv = val + 70                                 # 計算結果を    ledv へ代入

        print(str(an0))                                 # コンソール画面に出力
        print("-")
        bus.write_byte_data(0x48, 0x40, ledv)           #  書き込み

        if an0 > 150:                                   #    an0 が 150  よりも  小さいならば
            GPIO.output(led3,GPIO.HIGH)                 #    出力
            br3 = 0                                     #    0  にする
        else:
            GPIO.output(led3,GPIO.LOW)                  #   OFF

except KeyboardInterrupt:                                       # 例外処理   Ctrl+c で 実行される
    GPIO.cleanup()                                              # 全てのGPIOピンを解放



DIDACTA
サンプルプログラム

超音波センサー1 (DIGITAL)

両腕を持ち上げているフィッシャー君
import RPi.GPIO as GPIO                     # GPIO のライブラリのインポート
import time                                 #time をインポート


led = 25                                    # led の ピンを 25 で割り当てる

GPIO.setwarnings(False)                 # 以前に実行したGPIOポートの状態が残っていた時に出力される警告文を抑制する
GPIO.setmode(GPIO.BCM)                  #  ピン番号ではなく役割に記載されたGPIOの数字で指定する

GPIO_TRIGGER = 5                        #  5番ピンに割り当てる
GPIO_ECHO = 6                           #  6番ピンに割り当てる

GPIO.setup(GPIO_TRIGGER, GPIO.OUT)          # 出力
GPIO.setup(GPIO_ECHO, GPIO.IN)              # 入力
GPIO.setup(led,GPIO.OUT)                    #     出力

# ---  出力  ---
GPIO.output(led,GPIO.LOW)                   #     OFF

def distance():
    GPIO.output(GPIO_TRIGGER, HIGH)                 #  ON
    time.sleep(0.00001)                             #  スリープ
    GPIO.output(GPIO_TRIGGER, LOW)                #  OFF

    StartTime = time.time()                         #  開始時刻の取得 する
    StopTime = time.time()                          #  終了時刻の格納用

    while GPIO.input(GPIO_ECHO) == 0:               #  0  の間
        StartTime = time.time()                     #  時間の計測開始

    while GPIO.input(GPIO_ECHO) == 1:               #  1  の間
        StopTime = time.time()                      #  終了時刻を取得

    TimeElapsed = StopTime - StartTime              # 終了時刻 - 開始時刻

    distance = (TimeElapsed * 34300) / 2            #  距離の計算

    return distance

print("CTRL+C = STOP program")                      # コンソール画面に出力

if __name__ == '__main__':
    try:
        while True:
            dist = distance()                       #  関数の呼び出し
            print("Distance = %.1f cm" % dist)      #  # コンソール画面に出力
            time.sleep(0.1)
            if dist < 7:                            #  dist が 7 よりも 小さいとき
                GPIO.output(led,GPIO.HIGH)          #  ON
            else:
                GPIO.output(led,GPIO.LOW)           #  OFF

except KeyboardInterrupt:                                       # 例外処理   Ctrl+c で 実行される
    GPIO.cleanup()                                              # 全てのGPIOピンを解放



DIDACTA
サンプルプログラム

超音波センサー2 (ANALOG)

片腕を持ち上げているフィッシャー君
import RPi.GPIO as GPIO                     # GPIO のライブラリのインポート
import time                                 #time をインポート


led = 25                                     # led の ピンを 25 で割り当てる

GPIO.setwarnings(False)                      # 以前に実行したGPIOポートの状態が残っていた時に出力される警告文を抑制する
GPIO.setmode(GPIO.BCM)                       #  ピン番号ではなく役割に記載されたGPIOの数字で指定する

GPIO_TRIGGER = 5                        #  5番ピンに割り当てる
GPIO_ECHO = 6                           #  6番ピンに割り当てる

GPIO.setup(GPIO_TRIGGER, GPIO.OUT)      #  出力
GPIO.setup(GPIO_ECHO, GPIO.IN)          #  入力
GPIO.setup(led,GPIO.OUT)                #  出力

#  ---  出力  ---
GPIO.output(led,GPIO.LOW)               #   OFF

p1 = GPIO.PWM(led, 50)                  #   50Hz
p1.start(0)                             #   開始

def distance():
    GPIO.output(GPIO_TRIGGER, HIGH)                             #   ON

    time.sleep(0.00001)
    GPIO.output(GPIO_TRIGGER, LOW)                              #   OFF

    StartTime = time.time()                                     #  開始時刻の取得 する
    StopTime = time.time()                                      #  終了時刻の格納用

    while GPIO.input(GPIO_ECHO) == 0:
        StartTime = time.time()                                 #  時間の計測開始

    while GPIO.input(GPIO_ECHO) == 1:                           #  1 の 間
        StopTime = time.time()                                  #  終了時刻の取得

    TimeElapsed = StopTime - StartTime                          #  計算結果を代入
    distance = (TimeElapsed * 34300) / 2                        #  距離を求め、代入

    return distance

print("CTRL+C = STOP program")                                   # コンソール画面に出力

if __name__ == '__main__':
    try:
        while True:
            dist = distance()                                   #  関数の呼び出し
            print(("Distance = %.1f cm" % dist))                #  コンソール画面に出力
            if dist > 100:                                      #  dist  の値が 100 よりも 大きいとき
                dist = 100                                      #  dist   の 値を 100 にする
            p1.ChangeDutyCycle(dist)                            #
            time.sleep(0.1)

except KeyboardInterrupt:                                       #  例外処理   Ctrl+c で 実行される
    GPIO.cleanup()                                              #  全てのGPIOピンを解放



DIDACTA
サンプルプログラム

サーボモーター

ダンスしているフィッシャー君
import RPi.GPIO as GPIO                     # GPIO のライブラリのインポート
import time                                 #time をインポート

servo1PIN = 8                               # servo1PIN の ピンを 8 で割り当てる


GPIO.setwarnings(False)                      # 以前に実行したGPIOポートの状態が残っていた時に出力される警告文を抑制する
GPIO.setmode(GPIO.BCM)                       #  ピン番号ではなく役割に記載されたGPIOの数字で指定する



GPIO.setup(servo1PIN, GPIO.OUT)              #    出力

p1 = GPIO.PWM(servo1PIN, 50)                 #    50Hz

p1.start(2.5)                                #      PWM 開始


try:
  while True:
    p1.ChangeDutyCycle(2.5)                   # デューティ比の変更
    time.sleep(0.5)
    
    p1.ChangeDutyCycle(5)                 # デューティ比の変更
    time.sleep(0.5)
    
    p1.ChangeDutyCycle(7.5)                 # デューティ比の変更
    time.sleep(0.5)
    
    p1.ChangeDutyCycle(10)                 # デューティ比の変更
    time.sleep(0.5)
    
    p1.ChangeDutyCycle(12.5)                 # デューティ比の変更
    time.sleep(0.5)
    
    p1.ChangeDutyCycle(10)                 # デューティ比の変更
    time.sleep(0.5)
    
    p1.ChangeDutyCycle(7.5)                 # デューティ比の変更
    time.sleep(0.5)
    
    p1.ChangeDutyCycle(5)                 # デューティ比の変更
    time.sleep(0.5)
    
    p1.ChangeDutyCycle(2.5)                 # デューティ比の変更
    time.sleep(0.5)
    

except KeyboardInterrupt:                                       #  例外処理   Ctrl+c で 実行される
    p1.stop()                         #  PWM  停止
    GPIO.cleanup()                                              #  全てのGPIOピンを解放



DIDACTA
サンプルプログラム

エンコーダーモーター1 - STEP - LESS PRECISE

ギアの上に乗りながら空を見上げているフィッシャー君
import RPi.GPIO as GPIO                     # GPIO のライブラリのインポート
import time                                 #time をインポート

mota = 22                                   # mota の ピンを 22 で割り当てる
motb = 23                                   # mota の ピンを 23 で割り当てる

sig = 27                                    # sig の ピンを 27 で割り当てる
ele_pow = 20                                # ele_pow  のピンを 27 で割り当てる
stp = 0                                     # stp  の値を 20  で初期化する
ids = 0                                     # ids  の値を 20  で初期化する

GPIO.setwarnings(False)                      # 以前に実行したGPIOポートの状態が残っていた時に出力される警告文を抑制する
GPIO.setmode(GPIO.BCM)                       #  ピン番号ではなく役割に記載されたGPIOの数字で指定する

GPIO.setup(mota,GPIO.OUT)                                       #  出力
GPIO.setup(motb,GPIO.OUT)                                       #  出力
GPIO.setup(sig,GPIO.IN, pull_up_down=GPIO.PUD_UP)               #  入力
GPIO.setup(ele_pow,GPIO.OUT)                                    #  出力

#   ---  出力  ---
GPIO.output(ele_pow,GPIO.HIGH)                              #  ON

p2 = GPIO.PWM(motb, 50)                                     # 50Hz

num_steps = 74                                              # num_steps という 変数を作成
print("CTRL+C = STOP program")                              # コンソール画面に出力
p2.start(0)                                                 #  PWM 開始

try:
    while True:
        n = 20                                      #  n という 変数を作成
        p2.ChangeDutyCycle(n)                       #  デューティ比の変更
        while stp < num_steps:

            if GPIO.input(sig) == 1:                #  sig が 1  なら 
                if ids == 0:                            #  ids が 0  なら
                    stp = stp + 1                       #  stp の値を +1する
                    print((stp))                        #  コンソール画面に出力

                    ids = 1                             # ids の値を 1 にする
            if GPIO.input(sig) == 0:                # sig が 0  なら
                ids = 0                                 #  ids の値を 0 にする

        p2.ChangeDutyCycle(0)                      #  デューティ比の変更
        time.sleep(2)
        stp = 0                                    #  stp の値を 0 にする

except KeyboardInterrupt:                                       #  例外処理   Ctrl+c で 実行される
    GPIO.cleanup()                                              #  全てのGPIOピンを解放



DIDACTA
サンプルプログラム

エンコーダーモーター2 - HALF STEP - BETTER PRECISION

こちらを見上げているフィッシャー君
import RPi.GPIO as GPIO                     # GPIO のライブラリのインポート
import time                                 #time をインポート

mota = 22                                   # mota の ピンを 22 で割り当てる
motb = 23                                   # mota の ピンを 23 で割り当てる

sig = 27                                    # sig の ピンを 27 で割り当てる
ele_pow = 20                                # ele_pow  のピンを 27 で割り当てる
stp = 0                                     # stp  の値を 20  で初期化する
ids = 0                                     # ids  の値を 20  で初期化する

GPIO.setwarnings(False)                     # 以前に実行したGPIOポートの状態が残っていた時に出力される警告文を抑制する
GPIO.setmode(GPIO.BCM)                      #  ピン番号ではなく役割に記載されたGPIOの数字で指定する

GPIO.setup(mota,GPIO.OUT)                                       #  出力
GPIO.setup(motb,GPIO.OUT)                                       #  出力
GPIO.setup(sig,GPIO.IN, pull_up_down=GPIO.PUD_UP)               #  入力
GPIO.setup(ele_pow,GPIO.OUT)                                    #  出力

#   ---  出力  ---
GPIO.output(ele_pow,GPIO.HIGH)                              #  ON

p2 = GPIO.PWM(motb, 50)                     # 50Hz

num_steps = 148                                              # num_steps という 変数を作成
print("CTRL+C = STOP program")                              # コンソール画面に出力

p2.start(0)                                 #  PWM 開始

try:
    while True:
        n = 20                              # n という 変数を作成
        p2.ChangeDutyCycle(n)               # デューティ比の変更
        while stp < num_steps:                              # stp の 値 num_steps の値 よりも  小さい  なら
            if GPIO.input(sig) == 1 and ids == 0:               # sig が 1   かつ   ids が  0   なら
                stp = stp + 1                                       # stp を +1 する
                ids = 1                                             # ids を 1にする
                print(stp)                                          # コンソール画面に出力

            if GPIO.input(sig) == 0 and ids == 1:               # sig が 0   かつ   ids が  1   なら
                stp = stp + 1                                       # stp を +1 する
                ids = 0                                             # ids を 0  にする
                print(stp)                                          # コンソール画面に出力
        p2.ChangeDutyCycle(0)                               # デューティ比の変更
        time.sleep(2)
        stp = 0                                             # stp を 0  にする

except KeyboardInterrupt:                                       #  例外処理   Ctrl+c で 実行される
    GPIO.cleanup()                                              #  全てのGPIOピンを解放



DIDACTA
サンプルプログラム

USBカメラ - LED CONTROL (OPEN CV)

隣り合ってカメラを見ているフィッシャー君
import cv2                          #OpneCV というライブラリのインポート
import RPi.GPIO as GPIO             # GPIO のライブラリのインポート

cap = cv2.VideoCapture(1)           #  オブジェクトを生成
                                    #  引数 --  0もしくは -1をデバイス番号として指定します 1やそれ以上の番号を指定することも可能
                                    #  カメラが1台なら 「0」   複数なら「1」など    ※うまくいかない場合は変更をしてみる
last_img = None       # 前回の画像を記憶
red = (0, 0, 255)     # 四角の外枠の色      BGR の並び


led = 5              # led の ピンを 5 で割り当てる

GPIO.setwarnings(False)                  # 以前に実行したGPIOポートの状態が残っていた時に出力される警告文を抑制する
GPIO.setmode(GPIO.BCM)                   #  ピン番号ではなく役割に記載されたGPIOの数字で指定する

GPIO.setup(led,GPIO.OUT)                 #  出力

while True:
    # 画像  (フレーム)を取得
    _, frame = cap.read()
    # サイズの変更
    frame = cv2.resize(frame, (500, 300))

    # グレースケール (白黒へ)
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    gray = cv2.GaussianBlur(gray, (9, 9), 0)
    img_b = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY)[1]

    # 変化を確認
    if last_img is None:
        last_img = img_b
        GPIO.output(led,GPIO.LOW)
        continue

    frame_diff = cv2.absdiff(last_img, img_b)

    cnts = cv2.findContours(frame_diff,
            cv2.RETR_EXTERNAL,
            cv2.CHAIN_APPROX_SIMPLE)[0]

    # 変化を画面に描画 (四角の描画)
    for pt in cnts:
        x, y, w, h = cv2.boundingRect(pt)
        if w < 30:
            GPIO.output(led, GPIO.LOW)      #  OFF
            continue# 50以下を反映しない
        else:
            GPIO.output(led,GPIO.HIGH)      #  ON
        cv2.rectangle(frame, (x, y), (x+w, y+h), red, 2)

    # 上書き
    last_img = img_b

    # 画面に表示
    cv2.imshow("VIDEO", frame)
    cv2.imshow("DIFF", frame_diff)

    #  Enterキー を押したら
    if cv2.waitKey(1) == 13: break

# キャプチャを解放する
cap.release()
cv2.destroyAllWindows()     #現在までに作られた全てのウィンドウを閉じる関数



DIDACTA
サンプルプログラム

ゲート開閉プログラム - GUI

こちらを見上げているフィッシャー君
# import
import RPi.GPIO as GPIO
import time
import tkinter  #  GUIの作成に使用

# ピンの割り当て
mota = 22
motb = 23
in6 = 5
in7 = 6

GPIO.setwarnings(False)   # 以前に実行したGPIOポートの状態が残っていた時に出力される警告文を抑制する
GPIO.setmode(GPIO.BCM)    #  ピン番号ではなく役割に記載されたGPIOの数字で指定する

#  出力に設定
GPIO.setup(mota,GPIO.OUT)
GPIO.setup(motb,GPIO.OUT)
#  入力に設定
GPIO.setup(in6,GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(in7,GPIO.IN, pull_up_down=GPIO.PUD_UP)

#  モーター停止
GPIO.output(mota,GPIO.LOW)
GPIO.output(motb,GPIO.LOW)

# ゲート上昇の関数
def arm_up():
    while GPIO.input(in6) != 0:  # スイッチが押されるまで
        GPIO.output(mota,GPIO.HIGH)  # モーターを回転(上昇)
        print("-----------")
        time.sleep(0.1)
    GPIO.output(mota,GPIO.LOW)   # モーター停止

# ゲート下降の関数
def arm_down():
    while GPIO.input(in7) != 0:     #スイッチが押されるまで
        GPIO.output(motb,GPIO.HIGH) #モーターを回転(下降)
        print("-----------")
        time.sleep(0.1)
    GPIO.output(motb,GPIO.LOW)      #モーター停止

# GUIの作成
root = tkinter.Tk()          # ウインドウのオブジェクトを作成
root.title("PARKING SYSTEM") # タイトル作成
root.resizable(False, False) # ウインドウサイズ固定

# キャンバスの作成
canvas = tkinter.Canvas(root, width=800, height=480)
canvas.pack()  #配置

img = tkinter.PhotoImage(file="parking.png")  # 画像を変数へと格納
canvas.create_image(400, 240, image=img)      # 画像を描画

button = tkinter.Button(root,           # ボタンの作成
                        text="OPEN",    # ボタンのテキスト
                        font=("Times New Roman", 20),  # フォントの指定
                        command=arm_up, # ボタンを押された時に呼ばれる関数
                        fg="black")     # カーソルをのせた時の色

button2 = tkinter.Button(root,           # ボタンの作成
                        text="CLOSE",    # ボタンのテキスト
                        font=("Times New Roman", 20),  # フォントの指定
                        command=arm_down,# ボタンを押された時に呼ばれる関数
                        fg="black")      # カーソルをのせた時の色

button.place(x=350,y=295)  #ボタンの配置
button2.place(x=343,y=355) #ボタンの配置

# ---  メイン ---
try:
    while True:
        time.sleep(0.1)
        root.mainloop() #ウインドウを表示


except KeyboardInterrupt:
    GPIO.cleanup()  # 全てのGPIOピンを開放



サンプルプログラム