020_サンプルプログラム_revision0 - kotaproj/supportPiMotor GitHub Wiki
サンプルプログラム集_revision0
作業環境
本サンプルプログラムは、以下の環境で確認している
- モデル
- RaspberryPi4
- OS
- Raspberry Pi OS (32-bit)
- with desktop and recommended software
- Version:May 2020
- Release date:2020-05-27
- Kernel version:4.19
- Raspberry Pi OS (32-bit)
- Python
- 3.7.3 (default, Dec 20 2019, 18:57:59)
環境の構築
- ~/pijigに作業環境を構築する
venvにて環境の作成
- python - venvにて環境を構築する
# 環境の作成
$ mkdir pijig
$ cd pijig/
$ python3 -m venv env_pijig
# 環境に入る
$ source env_pijig/bin/activate
(env_pijig) $
- 環境を抜ける場合は、deativate
(env_pijig) $ deactivate
$
モジュールのインストール
- サンプルプログラムで使用するモジュールをインストールする
- 一部の設定は、サンプルプログラムの動作に記載している
(env_pijig) $ pip install pigpio
(env_pijig) $ pip install RPi.GPIO
(env_pijig) $ pip install smbus
(env_pijig) $ pip install spidev
ラズベリーパイピン表
pi@raspberrypi:~$ gpio readall
+-----+-----+---------+------+---+---Pi 3B+-+---+------+---------+-----+-----+
| 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
SR501 | 4 | 7 | GPIO. 7 | IN | 1 | 7 || 8 | 1 | ALT5 | TxD | 15 | 14 |
GND | | | 0v | | | 9 || 10 | 1 | ALT5 | RxD | 16 | 15 |
IR Send | 17 | 0 | GPIO. 0 | IN | 0 | 11 || 12 | 0 | IN | GPIO. 1 | 1 | 18 | Buzzer
SR4 ECHO | 27 | 2 | GPIO. 2 | IN | 0 | 13 || 14 | | | 0v | | | GND
SR4 TRG | 22 | 3 | GPIO. 3 | IN | 0 | 15 || 16 | 0 | IN | GPIO. 4 | 4 | 23 |
3.3V | | | 3.3v | | | 17 || 18 | 0 | IN | GPIO. 5 | 5 | 24 |
SPI | 10 | 12 | MOSI | ALT0 | 0 | 19 || 20 | | | 0v | | | GND
SPI | 9 | 13 | MISO | ALT0 | 0 | 21 || 22 | 0 | IN | GPIO. 6 | 6 | 25 |
SPI | 11 | 14 | SCLK | ALT0 | 0 | 23 || 24 | 1 | OUT | CE0 | 10 | 8 | SPI
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 Green | 6 | 22 | GPIO.22 | IN | 1 | 31 || 32 | 0 | IN | GPIO.26 | 26 | 12 | SG90(PWM)
SW Blue | 13 | 23 | GPIO.23 | IN | 0 | 33 || 34 | | | 0v | | | GND
IR Recv | 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 Green
GND | | | 0v | | | 39 || 40 | 0 | IN | GPIO.29 | 29 | 21 | LED Blue
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+---------+------+---+---Pi 3B+-+---+------+---------+-----+-----+
※サンプルプログラムは、BCMピンにて指定する
LED(Lチカ)
- LEDブロックの使い方について記載
- Red/Green/Blueの3色のLEDを搭載
回路図
使用するピン
機能 | ピン BCM(Physical) | 備考 |
---|---|---|
RED LED | 16(36) | - |
GREEN LED | 20(38) | - |
BLUE LED | 21(40) | - |
使い方の例
- 0.5秒ごとにLEDの点灯<->消灯を繰り返す
- CTRL + cにて、終了する
import RPi.GPIO as GPIO
import time
# LEDのピン設定
PIN_RED_LED = 16
PIN_GREEN_LED = 20
PIN_BLUE_LED = 21
LED_DICT = {
"red" : PIN_RED_LED,
"green" : PIN_GREEN_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(100):
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/Green/Blueの3色のスイッチを搭載
- ラズパイ側のプルアップ抵抗を使用する
回路図
使用するピン
機能 | ピン BCM(Physical) | 備考 |
---|---|---|
REDスイッチ | 5(29) | - |
GREENスイッチ | 6(31) | - |
BLUEスイッチ | 26(37) | - |
使い方の例
- スイッチを押している間、LEDが点灯する
import RPi.GPIO as GPIO
from time import sleep
# LEDのピン設定
PIN_RED_LED = 16
PIN_GREEN_LED = 20
PIN_BLUE_LED = 21
LED_DICT = {
"red" : PIN_RED_LED,
"green" : PIN_GREEN_LED,
"blue" : PIN_BLUE_LED,
}
# SWのピン設定
PIN_RED_SW = 5
PIN_GREEN_SW = 6
PIN_BLUE_SW = 26
SW_DICT = {
"red" : PIN_RED_SW,
"green" : PIN_GREEN_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_kota_handson) $ 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"が表示されたでしょうか?
- 補足
- 他にもいろいろなサンプルがある
- qiita - ラズパイでOLEDディスプレイを制御する
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()