Raspberry Pi 3でpigpioを使用してpython言語のプログラムを作成します。pigpioは、µsオーダーで、レベル変化の検出ができ、PWM制御、サーボモータの制御、高時間分解能でのGPIO制御を可能とします。また,ネット越しにGPIO制御も可能です。
pigpioのインストール
次の手順でソースコードからmake & make installします。
$ wget abyz.co.uk/rpi/pigpio/pigpio.zip $ unzip pigpio.zip $ cd PIGPIO $ make $ sudo make install
pigpioをデーモンとして動作させる
サービスの登録を行い、pigpioをデーモンとして動作させます。
次のようにサービスを定義します。
$ sudo vi /lib/systemd/system/pigpiod.service [Unit] Description=Daemon required to control GPIO pins via pigpio [Service] ExecStart=/usr/bin/pigpiod -l ExecStop=/bin/systemctl kill pigpiod Type=forking [Install] WantedBy=multi-user.target
次のようにpigpioのサービスを有効化します。
$ sudo systemctl enable pigpiod Synchronizing state for pigpiod.service with sysvinit using update-rc.d... Executing /usr/sbin/update-rc.d pigpiod defaults Executing /usr/sbin/update-rc.d pigpiod enable $ sudo systemctl start pigpiod $ sudo systemctl status pigpiod ● pigpiod.service - Daemon required to control GPIO pins via pigpio Loaded: loaded (/lib/systemd/system/pigpiod.service; enabled) Active: active (running) since 火 2017-03-07 10:09:11 JST; 1 day 18h ago Main PID: 462 (pigpiod) CGroup: /system.slice/pigpiod.service mq462 /usr/bin/pigpiod -l 3月 07 10:09:11 raspberrypi systemd[1]: Started Daemon required to control.... 3月 09 04:33:17 raspberrypi systemd[1]: Started Daemon required to control.... Hint: Some lines were ellipsized, use -l to show in full.
pigpioのサービスを起動すると、次のコマンドでデーモンとしての起動していることが確認できます。
$ service --status-all ... [ + ] pigpiod ...
また次のコマンドで、8888番ポートが待受ポートとして使われているのが確認できます。
$ ss -nat State Recv-Q Send-Q Local Address:Port Peer Address:Port ... LISTEN 0 100 ::1:8888 :::*
最近のRaspberianでは、pigpioが利用できるようです。raspi-cofigを用いて、「9 Advanced Options」から入り、「AB GPIO Server」を選択すれば、pigpioが利用できます。
Raspberry Pi 3への接続
タクトスイッチとLEDをRaspberry Pi 3に次のように接続します。実際の配線については「bcm2835 ライブラリによるスイッチ入力とLEDの点滅」を参照してください。
- タクトスイッチ:GPIO14
- LED:GPIO15
実際に、Raspberry Pi 3に接続した画像を次に示します。
pigpioを使用したプログラムの作成
pigpioを使用したプログラムをPython言語で作成します。
作成したプログラムでは、LEDが点灯/消灯を繰り返します。タクトスイッチが押されると、タクトスイッチが接続されているGPIO番号「14」が端末に出力され、LEDが消灯します。以降タクトスイッチが押される毎に、LEDの輝度が増していきます。
#!/usr/bin/env python import pigpio from time import sleep # ----------- callcnt = 0 PIN = 15 FREQ = 50 RANGE = 100 pi = pigpio.pi() pi.set_mode(14, pigpio.INPUT) pi.set_pull_up_down(14, pigpio.PUD_UP) def cb_interrupt(gpio, level, tick): global callcnt print (gpio, level, tick) callcnt += 1 pi.set_PWM_frequency(PIN, FREQ) pi.set_PWM_range(PIN, RANGE) pi.set_PWM_dutycycle(PIN, callcnt*1) cb = pi.callback(14, pigpio.FALLING_EDGE, cb_interrupt) pi = pigpio.pi() pi.set_mode(PIN, pigpio.OUTPUT) try: while True: pi.write(PIN, 1) sleep(0.5) pi.write(PIN, 0) sleep(0.5) if callcnt != 0: while True: sleep(0.5) except KeyboardInterrupt: pass pi.set_mode(PIN, pigpio.INPUT) pi.stop()
プログラムを実行すると次の内容が表示されます。()内の表示は、タクトスイッチが押される毎に表示されます。
$ python pigpiodemo.py (14, 0, 4105638951L) (14, 0, 4119385191L) (14, 0, 756827449)