ラズパイ - gpiozero調査

エラーメモ
チュートリアル実施時、以下のwarning
>>> from gpiozero import LED
>>>
>>> led = LED(16)
/home/pi/study_gpiozero/env_gpiozero/lib/python3.7/site-packages/gpiozero/devices.py:290: PinFactoryFallback: Falling back from rpigpio: No module named 'RPi'
'Falling back from %s: %s' % (name, str(e))))
/home/pi/study_gpiozero/env_gpiozero/lib/python3.7/site-packages/gpiozero/devices.py:290: PinFactoryFallback: Falling back from lgpio: No module named 'lgpio'
'Falling back from %s: %s' % (name, str(e))))
/home/pi/study_gpiozero/env_gpiozero/lib/python3.7/site-packages/gpiozero/devices.py:290: PinFactoryFallback: Falling back from rpio: No module named 'RPIO'
'Falling back from %s: %s' % (name, str(e))))
/home/pi/study_gpiozero/env_gpiozero/lib/python3.7/site-packages/gpiozero/devices.py:290: PinFactoryFallback: Falling back from pigpio: No module named 'pigpio'
'Falling back from %s: %s' % (name, str(e))))
/home/pi/study_gpiozero/env_gpiozero/lib/python3.7/site-packages/gpiozero/devices.py:285: NativePinFactoryFallback: Falling back to the experimental pin factory NativeFactory because no other pin factory could be loaded. For best results, install RPi.GPIO or pigpio. See https://gpiozero.readthedocs.io/en/stable/api_pins.html for more information.
warnings.warn(NativePinFactoryFallback(native_fallback_message))
>>> led.on()
>>> led.off()
>>> led.on()
>>> led.off()
>>> from gpiozero import Device
>>> print(Device.pin_factory)
<gpiozero.pins.native.NativeFactory object at 0xb67272b0>
>>> led.pin_factory
<gpiozero.pins.native.NativeFactory object at 0xb67272b0>
>>>
内部で上記のライブラリを使っている。
cleanインストールした状態からだと、NaviveFactoryが参照されている。
23.1. Changing the pin factory
ーーーー
クリーンインストールした状態では、
servo.pyはエラーとなる
from gpiozero import Servo
from time import sleep
servo = Servo(17)
while True:
servo.min()
sleep(2)
servo.mid()
sleep(2)
servo.max()
sleep(2)
→
gpiozero.exc.PinPWMUnsupported: PWM is not supported on pin GPIO17
nativeの場合は、ハードpwmピンないとダメ???
pigpioをいれて、確認する
→
$ sudo apt install pigpio
$ sudo service pigpiod start
$ sudo systemctl enable pigpiod.service
$ pip install pigpio
→実行できるようになった。
また、
from gpiozero.pins.pigpio import PiGPIOFactory
factory = PiGPIOFactory()
servo = Servo(17, pin_factory=factory)
と明示的にfactoryを指定すると、warningがでないことも確認。
↑の概念は、公式 api_pins に記載されている

モータ関連
10.4. PWM (Pulse-width modulation)
にて、PWMが記載。
from gpiozero import PWMLED
from time import sleep
led = PWMLED(2)
for b in range(101):
led.value = b / 100.0
sleep(0.01)
みたいな感じで指定する
Other devices can make use of PWM, such as motors (for variable speed) and servos. See the Motor, Servo and AngularServo classes for information on those. Motor and Robot default to using PWM, but it can be disabled with pwm=False at initialization. Servos cannot be used without PWM. Devices containing LEDs default to not using PWM, but pwm=True can be specified and any LED objects within the device will be initialized as PWMLED objects.
となっており、Motorは,デフォルトはPWM。
```bash
>>> motor.value = 1
>>> motor.value = -1
>>> motor.value = 0.5
>>> motor.value = 0.1
>>> motor.value = 0.2
>>> motor.value = 0.3
>>> motor.value = 0.4
>>> motor.value = 0
でpwm指定。

Mockの使い方メモ
通常の使い方(LED)
from time import sleep
from gpiozero import Device, LED
from gpiozero.pins.mock import MockFactory
Device.pin_factory = MockFactory()
led = LED(2)
print(">>> led.value", led.value)
# 0
led.on()
sleep(0.5)
print(">>> led.value", led.value)
# 1
- メモ:
- led.on()の後に、sleepをいれているのは、内部的に遷移するまでに時間がかかるため
- 内部的にスレッドで管理しているようだ
PWM時の使い方
from time import sleep
from gpiozero import Device
from gpiozero import Motor
from gpiozero.pins.mock import MockFactory, MockPWMPin
motor_left = Motor(forward=1, backward=2, pin_factory=MockFactory(pin_class=MockPWMPin))
print("motor_left.forward()")
motor_left.forward()
print("motor_left.forward()")
motor_left.forward()
print("motor_left.stop()")
motor_left.stop()
- メモ
- 明示的に、pin_class=MockPWMPinを設定する必要がある

buzzer処理
ブザー制御は、LEDPWMクラスでもつくれるが、ブザー用のクラスTonalBuzzerが用意されている。
サンプルコード
from gpiozero import TonalBuzzer
from gpiozero.tones import Tone
from gpiozero.pins.pigpio import PiGPIOFactory
from time import sleep
# BUZZERのピン設定
BUZZER_PIN = 21
buzzer_pins = {
"0": BUZZER_PIN,
}
def main():
# 各ピンをbuzzer設定
factory = PiGPIOFactory()
buzzers = {}
for key, pin in buzzer_pins.items():
buzzers[key] = TonalBuzzer(pin, pin_factory=PiGPIOFactory())
# 音を鳴らす
try:
for _ in range(5):
for key, buzzer in buzzers.items():
buzzer.play(Tone("A4"))
sleep(0.5)
buzzer.play(Tone(220.0)) # Hz
sleep(0.5)
buzzer.play(Tone(60)) # middle C in MIDI notation
sleep(0.5)
buzzer.stop()
except KeyboardInterrupt:
print("stop")
return
if __name__ == "__main__":
main()
トラブルメモ
16 65.406 ド2 C2 <=ok
18 73.416 レ2 D2 <=ok
20 82.407 ミ2 E2 <=ng (range内にはいらないみたい)
21 87.307 ファ2 F2
23 97.999 ソ2 G2
25 110.000 ラ2 A2
27 123.471 シ2 B2
28 130.813 ド3 C3
=>ハードPWMにすればできる????

だいたいの使い方は、
にまとめた