サンプルプログラム集_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)
環境の構築
venvにて環境の作成
# 環境の作成
$ mkdir pim_rev1
$ cd pim_rev1/
$ python3 -m venv env_pim
# 環境に入る
$ source env_pim/bin/activate
(env_pim) $
(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を搭載
回路図

使用するピン
機能 |
ピン 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色のスイッチを搭載
- ラズパイ側のプルアップ抵抗を使用する
回路図

使用するピン
機能 |
ピン BCM(Physical) |
備考 |
REDスイッチ |
5(29) |
- |
BLUEスイッチ |
6(31) |
- |
使い方の例
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()
ディスプレイ
回路図

使用するピン
機能 |
ピン BCM(Physical) |
備考 |
SCL1 |
2(3) |
- |
SDA1 |
3(5) |
- |
使い方の例
必要なライブラリのインストール
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モータ制御
回路図

サンプルコード
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)の使い方について
回路図

使用するピン
機能 |
ピン BCM(Physical) |
備考 |
SCL1 |
2(3) |
- |
SDA1 |
3(5) |
- |
サンプルコード
- 下記のレポジトリより、bme280_sample.py をダウンロードする
- bme280_sample.pyは、Python2.7で書かれているため、以下を修正する
- print => print() : compensate_P()/compensate_T()/compensate_H()の箇所
- 実行結果
(env_pim) pi@raspberrypi:~/pim_rev1 $ python bme280_sample.py
temp : 29.90 ℃
pressure : 994.20 hPa
hum : 17.63 %
サーボモータ(SG90)
#init
... servo.start(0.0)
servo.ChangeDutyCycle(7.25)
GPIO.cleanup()
回路図

使用するピン
機能 |
ピン 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()
圧電ブザー
回路図

使用するピン
機能 |
ピン 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)