ラズベリーパイ gpiozeroの使い方

RPi.GPIOと比較して,gpiozeroは少ないコード数でいろいろなことができます.
初めて勉強する人には,おすすめのライブラリです.

1.LEDを点灯させる

GPIO 16番につないだLEDを1秒点灯、その後消灯する場合

In [ ]:
from gpiozero import LED 
from time import sleep

led =LED(16)

led.on()
sleep(1)
led.off()

2個以上点灯させたい場合は,「led2=LED(XX)」のような形で接続しているGPIOピン(XX)を指定する].
ちなみに,名前からするとLED専用のように思えるが,RPi.GPIOの「GPIO.output(16,True)」と同じ意味.
そのため,この方法でモータドライバなどを使うこともできる.

Arduinoとは異なり,上記の書き方だと1回しかLEDが点灯しない.繰り返したいときはfor文,while文を使う必要がある.(当たり前だけど・・・)
繰り返す数が決まっているならfor文,ある条件を満たすまでならwhile文を使うのが一般的.
for文,while文の詳しい使い方は,http://www.me.cit.nihon-u.ac.jp/lab/yanagisawa/for_student/Python2.html .

In [ ]:
from gpiozero import LED 
from time import sleep

led =LED(16)

for t in range(0,5):
    led.on()
    sleep(1)
    led.off()
    sleep(1)

2.LEDの明るさを制御する(アナログ出力)

最初の例では,LEDのONとOFFの二つの状態しか作り出すことができない(デジタル出力).
LEDの明るさを制御するにはアナログ信号を出力する必要がある.

In [ ]:
from gpiozero import PWMLED 
from time import sleep

led = PWMLED(16)#16番にLEDを接続

led.value = 0.25#デューティ比25%で信号を出力
print("25%")
sleep(3)

led.value = 1
print("100%")
sleep(3)

led.value = 0.#デューティ比0%で信号を出力
print("0%")
print("end")

PWMLEDがアナログ出力を実現する方法.
これもLEDという名前だが,RPi.GPIOの「GPIO.PWM(18,60)」と同じでモータドライバの速度調整などにも使える.
ちなみに,わざわざ周波数を設定しなくても動くが,設定したいときはPWMLED(16,frequency=XXX)で設定できる.

3.モータを動かす

1,2のデジタル信号,アナログ信号の出力方法が理解できていれば,一般的なモータドライバ(例えば, ta7291p)などは制御できる.
以下はta7291pの例.

番号 記号 役割
1  GND グラウンド
2  OUT1 モータにつなぐ
3  NC 使わない
4  Vref PWMを入力して回転数を制御
5  IN1 IN2み合わせて,正転,逆転,ストップ,ブレーキを制御
6  IN2 IN1と組み合わせて,正転,逆転,ストップ,ブレーキを制御
7  Vcc モータドライバ用電源(ラズベリーパイから取る) 5V
8  Vs モータ用電源 0~20V
9  NC 使わない
10  OUT2 モータにつなぐ

3.1 PWMを使わない場合(ONとOFFしかない場合)

In [ ]:
from gpiozero import LED
from time import sleep

m1 = LED(21)##方向制御1(IN1)
m2 = LED(20)##方向制御2(IN2)
m3 = LED(16)##速度調節(Vref)

print("start")
m1.on()
m2.off()
m3.on()
sleep(2)

m1.on()
m2.off()
m3.off()

print("end")

3.2 PWMを使って速度を調整する場合

下の例では,段階的にモータの速度を早くしています.

In [ ]:
from gpiozero import LED
from gpiozero import PWMLED
from time import sleep

m1 = LED(21)
m2 = LED(20)
m3 = PWMLED(16)

print("start")
m1.on()
m2.off()
for n in range(0,10):
    m3.value=n/10
    sleep(1)

m1.on()
m2.off()
m3.value=0

print("end")

3.3 gpiozeroのMotorを使う場合

gpiozeroには「Motor」という便利なモジュールがある.これを使うとさらに短いコードでモータを制御できる.
ただし,配線を以下のように変更すること.(モータドライバ4番のみ変更する必要がある.)

番号 記号 役割:接続先
1  GND グラウンド
2  OUT1 モータにつなぐ
3  NC 使わない
4  Vref 10kΩの抵抗を介してモータ用電源に接続
5  IN1 IN2み合わせて,正転,逆転,ストップ,ブレーキを制御
6  IN2 IN1と組み合わせて,正転,逆転,ストップ,ブレーキを制御
7  Vcc モータドライバ用電源(ラズベリーパイから取る) 5V
8  Vs モータ用電源 0~20V
9  NC 使わない
10  OUT2 モータにつなぐ
In [ ]:
from gpiozero import Motor
from time import sleep

motor = Motor(forward=20, backward=21) ##IN1,IN2をそれぞれGPIO20,21番に接続

print("start")
motor.forward()
sleep(2)

motor.backward()
sleep(2)

motor.stop()
print("end")

速度を調整したい(PWMを使いたい)ときは,「motor.forward(0.5)」のように書けばOK!

3.4 Robot

さらには,ロボットで2個のモータを制御して前進,後退,右左折をするような場合は,「Robot」というモジュールを使うことができる!

In [ ]:
from gpiozero import Robot
from time import sleep

robot = Robot(left=(4, 14), right=(17, 18))

for i in range(4):
    robot.forward()
    sleep(10)
    robot.right()
    sleep(1)
    robot.left()
    sleep(1)
    robot.backward()
    sleep(1)
    robot.stop()

4.AD変換(SPI通信)

例えばMCP3008を使う場合,gpiozeroでは驚くほど簡単なコードで値を取得できる!
配線は以下を参考に
http://www.me.cit.nihon-u.ac.jp/lab/yanagisawa/for_student/raspberry_pi_gpio.html

MCP3008を使って,センサの値をAD変換して10回分の値を表示する場合.

In [ ]:
from gpiozero import MCP3008

ch1 = MCP3008(channel=0)

for n in range(0,10):
    print(ch1.value)