021_サンプルプログラム_revision1 - kotaproj/supportPiMotor GitHub Wiki

サンプルプログラム集_revision1


作業環境

本サンプルプログラムは、以下の環境で確認している

RaspberryPi Zero WH

  • OS
    • Raspberry Pi OS (32-bit)
      • with desktop and recommended software
      • Linux raspberrypi1 5.4.51+ #1326 Fri Jul 17 10:39:45 BST 2020 armv6l GNU/Linux
  • Python
    • Python 3.7.3 (default, Dec 20 2019, 18:57:59)

RaspberryPi4

  • OS
    • Raspberry Pi OS (32-bit)
      • with desktop and recommended software
      • Linux raspberrypi 5.4.72-v7l+ #1356 SMP Thu Oct 22 13:57:51 BST 2020 armv7l GNU/Linux
  • Python
    • Python 3.7.3 (default, Jul 25 2020, 13:03:44)

環境の構築

  • ~/pim_rev1に作業環境を構築する

venvにて環境の作成

  • python - venvにて環境を構築する
# 環境の作成
$ mkdir pim_rev1
$ cd pim_rev1/
$ python3 -m venv env_pim

# 環境に入る
$ source env_pim/bin/activate
(env_pim) $ 
  • 環境を抜ける場合は、deativate
(env_pim) $ deactivate 
$ 

モジュールのインストール

  • サンプルプログラムで使用するモジュールをインストールする
    • 一部の設定は、サンプルプログラムの動作に記載している
(env_pim) $ pip install pigpio
(env_pim) $ pip install RPi.GPIO
(env_pim) $ pip install smbus
(env_pim) $ pip install spidev
(env_pim) $ pip install smbus2
(env_pim) $ pip install adafruit-circuitpython-ssd1306
(env_pim) $ pip install pillow

ラズベリーパイピン表

pi@raspberrypi:~$ gpio readall
         +-----+-----+---------+------+---+---Pi 4B--+---+------+---------+-----+-----+
         | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
         +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
3.3V     |     |     |    3.3v |      |   |  1 || 2  |   |      | 5v      |     |     | 5V
I2C1     |   2 |   8 |   SDA.1 | ALT0 | 1 |  3 || 4  |   |      | 5v      |     |     | 5V
I2C1     |   3 |   9 |   SCL.1 | ALT0 | 1 |  5 || 6  |   |      | 0v      |     |     | GND
         |   4 |   7 | GPIO. 7 |   IN | 1 |  7 || 8  | 1 | ALT5 | TxD     | 15  | 14  |
GND      |     |     |      0v |      |   |  9 || 10 | 1 | ALT5 | RxD     | 16  | 15  |
SG90_1   |  17 |   0 | GPIO. 0 |   IN | 0 | 11 || 12 | 0 | IN   | GPIO. 1 | 1   | 18  | mdrv-AIN1
SG90_2   |  27 |   2 | GPIO. 2 |   IN | 0 | 13 || 14 |   |      | 0v      |     |     | GND
         |  22 |   3 | GPIO. 3 |   IN | 0 | 15 || 16 | 0 | IN   | GPIO. 4 | 4   | 23  | mdrv-AIN2
3.3V     |     |     |    3.3v |      |   | 17 || 18 | 0 | IN   | GPIO. 5 | 5   | 24  | mdrv-BIN2
         |  10 |  12 |    MOSI | ALT0 | 0 | 19 || 20 |   |      | 0v      |     |     | GND
         |   9 |  13 |    MISO | ALT0 | 0 | 21 || 22 | 0 | IN   | GPIO. 6 | 6   | 25  |
         |  11 |  14 |    SCLK | ALT0 | 0 | 23 || 24 | 1 | OUT  | CE0     | 10  | 8   |
GND      |     |     |      0v |      |   | 25 || 26 | 1 | OUT  | CE1     | 11  | 7   |
         |   0 |  30 |   SDA.0 |   IN | 1 | 27 || 28 | 1 | IN   | SCL.0   | 31  | 1   |
SW Red   |   5 |  21 | GPIO.21 |   IN | 1 | 29 || 30 |   |      | 0v      |     |     | GND
SW Blue  |   6 |  22 | GPIO.22 |   IN | 1 | 31 || 32 | 0 | IN   | GPIO.26 | 26  | 12  | 
mdrv-BIN1|  13 |  23 | GPIO.23 |   IN | 0 | 33 || 34 |   |      | 0v      |     |     | GND
         |  19 |  24 | GPIO.24 |   IN | 0 | 35 || 36 | 0 | IN   | GPIO.27 | 27  | 16  | LED Red
         |  26 |  25 | GPIO.25 |   IN | 0 | 37 || 38 | 0 | IN   | GPIO.28 | 28  | 20  | LED Blue
GND      |     |     |      0v |      |   | 39 || 40 | 0 | IN   | GPIO.29 | 29  | 21  | BEEP
         +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
         | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+---Pi 3B+-+---+------+---------+-----+-----+

※サンプルプログラムは、BCMピンにて指定する


LED(Lチカ)

  • LEDブロックの使い方について記載
  • Red/Blueの2色のLEDを搭載

回路図

image

使用するピン

機能 ピン BCM(Physical) 備考
RED LED 16(36) -
BLUE LED 20(38) -

使い方の例

  • 0.5秒ごとにLEDの点灯<->消灯を繰り返す
  • CTRL + cにて、終了する
import RPi.GPIO as GPIO
import time

# LEDのピン設定
PIN_RED_LED = 16
PIN_BLUE_LED = 20

LED_DICT = {
    "red" : PIN_RED_LED,
    "blue" : PIN_BLUE_LED,
}


def main():
    # BCM指定, 各ピンを出力に設定
    GPIO.setmode(GPIO.BCM)  
    for key in LED_DICT:
        GPIO.setup(LED_DICT[key], GPIO.OUT)

    try:
        for _ in range(10):
            for key in LED_DICT:
                GPIO.output(LED_DICT[key], GPIO.HIGH)
                print("LED ON - ", key)
                time.sleep(0.5)
                GPIO.output(LED_DICT[key],GPIO.LOW)
                print("LED OFF - ", key)
                time.sleep(0.5)
    except KeyboardInterrupt:
        GPIO.cleanup()
        print("stop")

if __name__ == "__main__":
    main()

スイッチ

  • スイッチブロックの使い方について
  • Red/Blueの3色のスイッチを搭載
  • ラズパイ側のプルアップ抵抗を使用する

回路図

image

使用するピン

機能 ピン BCM(Physical) 備考
REDスイッチ 5(29) -
BLUEスイッチ 6(31) -

使い方の例

  • スイッチを押している間、LEDが点灯する
import RPi.GPIO as GPIO
from time import sleep

# LEDのピン設定
PIN_RED_LED = 16
PIN_BLUE_LED = 20

LED_DICT = {
    "red" : PIN_RED_LED,
    "blue" : PIN_BLUE_LED,
}

# SWのピン設定
PIN_RED_SW = 5
PIN_BLUE_SW = 6


SW_DICT = {
    "red" : PIN_RED_SW,
    "blue" : PIN_BLUE_SW,
}

def main():
    # BCM指定, 各ピンを出力に設定
    GPIO.setmode(GPIO.BCM)  
    for key in LED_DICT:
        GPIO.setup(LED_DICT[key], GPIO.OUT)

    for key in SW_DICT:
        GPIO.setup(SW_DICT[key], GPIO.IN, pull_up_down=GPIO.PUD_UP)

    try:
        while True:
            for key in SW_DICT:
                if GPIO.input(SW_DICT[key]) == GPIO.LOW:
                    GPIO.output(LED_DICT[key],GPIO.HIGH)
                else:
                    GPIO.output(LED_DICT[key],GPIO.LOW)
            sleep(0.01)

    except KeyboardInterrupt:
        GPIO.cleanup()
        print("stop")


if __name__ == "__main__":
    main()

ディスプレイ

  • ディスプレイブロックの使い方について

回路図

oled

使用するピン

機能 ピン BCM(Physical) 備考
SCL1 2(3) -
SDA1 3(5) -

使い方の例

  • "hello world"を表示する

必要なライブラリのインストール

  • 追加で以下が必要
pip install adafruit-circuitpython-ssd1306
pip install pillow
git clone https://github.com/adafruit/Adafruit_CircuitPython_SSD1306

サンプルコードを動かしてみる

(env_pim) $ git clone https://github.com/adafruit/Adafruit_CircuitPython_SSD1306
  • ssd1306 - 128x64用にコードを修正する
    • ./Adafruit_CircuitPython_SSD1306/examples/ssd1306_pillow_demo.py

修正前:
HEIGHT = 32  # Change to 64 if needed

 ↓

修正後:
HEIGHT = 64  # Change to 64 if needed
  • 接続されているか確認をする
    • i2cdetectにて、接続されているi2cデバイスを確認できる
$ i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- 3c -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                         
 $ 
  • コードを実行する
$ python Adafruit_CircuitPython_SSD1306/examples/ssd1306_pillow_demo.py 

→"Hello World"を表示


DCモータ制御

  • DCモータの制御を行う

回路図

image

サンプルコード

import RPi.GPIO as GPIO
import time

# LEDのピン設定
PIN_AIN1 = 18
PIN_AIN2 = 23
PIN_BIN1 = 13
PIN_BIN2 = 24

def stop():
    GPIO.output(PIN_AIN1, GPIO.LOW)
    GPIO.output(PIN_AIN2, GPIO.LOW)
    GPIO.output(PIN_BIN1, GPIO.LOW)
    GPIO.output(PIN_BIN2, GPIO.LOW)
    return


def main():
    # BCM指定, 各ピンを出力に設定
    GPIO.setmode(GPIO.BCM)  
    GPIO.setup(PIN_AIN1, GPIO.OUT)
    GPIO.setup(PIN_AIN2, GPIO.OUT)
    GPIO.setup(PIN_BIN1, GPIO.OUT)
    GPIO.setup(PIN_BIN2, GPIO.OUT)

    stop()

    print("PIN_AIN1 - HIGH")
    GPIO.output(PIN_AIN1, GPIO.HIGH)
    time.sleep(3)
    stop()

    print("PIN_AIN2 - HIGH")
    GPIO.output(PIN_AIN2, GPIO.HIGH)
    time.sleep(3)
    stop()

    print("PIN_BIN1 - HIGH")
    GPIO.output(PIN_BIN1, GPIO.HIGH)
    time.sleep(3)
    stop()

    print("PIN_BIN2 - HIGH")
    GPIO.output(PIN_BIN2, GPIO.HIGH)
    time.sleep(3)
    stop()

    GPIO.cleanup()

    return

if __name__ == "__main__":
    main()


I2C接続のセンサー

  • 温湿度/大気センサー(BME280)の使い方について

回路図

image

使用するピン

機能 ピン BCM(Physical) 備考
SCL1 2(3) -
SDA1 3(5) -

サンプルコード

(env_pim) pi@raspberrypi:~/pim_rev1 $ python bme280_sample.py 
temp : 29.90  ℃
pressure :  994.20 hPa
hum :  17.63 %

サーボモータ(SG90)

  • サーボモータ(SG90)の使い方について

#init ... servo.start(0.0)

servo.ChangeDutyCycle(7.25) GPIO.cleanup()

回路図

image

使用するピン

機能 ピン BCM(Physical) 備考
PWM 17 SG90 - 1
PWM 27 SG90 - 2

サンプルプログラム

import RPi.GPIO as GPIO
import time

INTERVAL = 0.6
PIN = 17  # SG90-1
# PIN = 27 # SG90-2
FREQ = 50

GPIO.setmode(GPIO.BCM)

GPIO.setup(PIN, GPIO.OUT)
servo = GPIO.PWM(PIN, FREQ)

#init
servo.start(0.0)

for i in range(2):
    servo.ChangeDutyCycle(2.5)
    time.sleep(INTERVAL)

    servo.ChangeDutyCycle(12.0)
    time.sleep(INTERVAL)

GPIO.cleanup()

圧電ブザー

  • 圧電ブザーの使い方について

回路図

image

使用するピン

機能 ピン BCM(Physical) 備考
PWM 21 SOFT PWM使用-

サンプルプログラム

import pigpio
import time

BUZZER_PIN = 21
FREQ = 100

OTO_FREQ = [
    1000,
    5000,
    10000,
    20000,
    30000,
    40000,
]

def main():
    pi1 = pigpio.pi()
    pi1.set_mode(BUZZER_PIN, pigpio.OUTPUT)
    pi1.set_PWM_range(BUZZER_PIN, 40000)
    pi1.set_PWM_dutycycle(BUZZER_PIN, FREQ)
    
    try:
        for v in OTO_FREQ:
            pi1.set_PWM_dutycycle(BUZZER_PIN, v)
            time.sleep(1.0)
    
    except KeyboardInterrupt:
        pass
    
    print("done.")
    
    # cleanup
    pi1.set_PWM_dutycycle(BUZZER_PIN, FREQ)
    pi1.set_mode(BUZZER_PIN, pigpio.INPUT)
    pi1.stop()


if __name__ == "__main__":
    main()

import RPi.GPIO as GPIO
import time

# LEDのピン設定
PIN_AIN1 = 18
PIN_AIN2 = 23

# BCM指定, 各ピンを出力に設定
GPIO.setmode(GPIO.BCM)  
GPIO.setup(PIN_AIN1, GPIO.OUT)
GPIO.setup(PIN_AIN2, GPIO.OUT)

GPIO.output(PIN_AIN1, GPIO.HIGH)
GPIO.output(PIN_AIN2, GPIO.HIGH)
GPIO.output(PIN_AIN1, GPIO.LOW)
GPIO.output(PIN_AIN2, GPIO.LOW)