Closed6

ラズパイ - gpiozero調査

kotaprojkotaproj

エラーメモ

チュートリアル実施時、以下の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 に記載されている
https://gpiozero.readthedocs.io/en/stable/api_pins.html

kotaprojkotaproj

モータ関連

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指定。

kotaprojkotaproj

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を設定する必要がある
kotaprojkotaproj

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にすればできる????

このスクラップは2021/10/28にクローズされました