2024年12月21日土曜日

Luckfox Pico MiniでGPIOを使ってみた。

 Luckfox Pico MiniをWiFiに繋いだり、USBのカメラを使ってみたり、Linuxマシンとして使ってみたけど、せっかくGPIOがついてるのでGPIOを使用してみた。

LuckfoxのGPIOはファイルシステム上で通常のファイルのようにいじれるデバイスドライバが入っているので/sys/class/gpio/の中でcatコマンドとかechoコマンドでGPIOを操作できる。Linuxが動くSBCなら結構普通の実装かも。

とりあえずLuckfox Pico MiniにはLEDが2つついていて、片方はステータス表示用のLEDになっているけど、もう片方は未使用なのでLEDがつながってるGPIOを操作してみる。

LuckfoxのGPIOは公式Wikiで紹介されてるピンアサインを見るとわかりやすいかも。使われてない方のLEDはGPIO1_A2につながっていて、Linux上だとGPIO34になっている。図には両方書いてあるんだけど。Linux上のデバイスファイル名の算出方法も下の方に書いてあった。GPIO1_A2の場合は"バンク1 x 32 + (グループ0 x 8 + 2)"で34になってるっぽい。グループはA、B、C、Dと4つあってそれぞれ0、1、2、3。

さっそくGPIO34を操作してみる。

echo 34 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio34/direction
echo 1 > /sys/class/gpio/gpio34/value
こんな感じでGPIOを有効にして、出力に変更して、HIGHを出力するとLEDが点灯した。一旦出力に消灯する場合は
echo 0 > /sys/class/gpio/gpio34/value
とすればLEDが消灯する。
シェルスクリプト内に入れて実行すれば動作確認用LEDとして使用できるので、とりあえず起動時にudevadm triggerをするスクリプトが動いてるかどうか確認するために使用してみた。やっぱりLEDが点灯するとわかりやすいので便利。
他のピンもluckfox-configでペリフェラルに設定していなければこんな感じで普通のGPIOとして使用できる。

次は入力を試してみる。
Luckfox Pico MiniにはUSBで書き込みするためのBOOTボタンが一つ付いてるのでそれを使えないかどうか試してみた。起動時にボタンを押すと書き込みモードで起動するけど、起動したあとは何も使われていないのでもったいないし。
回路図がダウンロードできるのでLuckfox Pico Miniの回路図を確認するとBootボタンはRecoveryとして表記されていて、GPIO4_C0_z(SARADC_IN0)につながってるっぽい。先程の計算式だとGPIO4_C0は"バンク4 x 32 + (グループ2 x 8 + 0)"でGPIO144としてBuildroot上で使用できるはず…
echo 144 > /sys/class/gpio/export
cat /sys/class/gpio/gpio144/value
としてみると1が帰ってきた。確かに回路図上1.8Vにプルアップされているのでボタンを押していない状態は1になるはず。デフォルトでinだったのでdirectionは変更していない。
ボタンを押したまま、もう一度
cat /sys/class/gpio/gpio144/value
してみると0が帰ってきた。ちゃんとボタンが使えてる!

BOOTボタンをシャットダウンボタンとして使ってみた。

#!/bin/sh

GPIO_PIN=144

echo "$GPIO_PIN" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio$GPIO_PIN/direction
echo "1" > /sys/class/gpio/gpio$GPIO_PIN/active_low

while true; do
    VALUE=$(cat /sys/class/gpio/gpio$GPIO_PIN/value)
    
    if [ "$VALUE" -eq 1 ]; then
        echo "$GPIO_PIN" > /sys/class/gpio/unexport
        halt
        exit 0
    fi
  
    sleep 0.1
done

これをpower.shとして保存して"chmod 755 power.sh"して実行可能にする。とりあえず動作することを確認。自動起動させてからミスると永遠にシャットダウンするスクリプトになりかねないので注意。

自動起動させるためにこの前WiFiに繋いだときに作った/etc/init.d/S99xの中にこのシェルスクリプトのパスを追加した。
これで常時ボタンの状態をポーリングして押されたらhaltしてくれる。

とりあえずBootボタンをシャットダウンボタンとして使えるようにできた。

Pythonのほうでもperiphery使ってGPIOをポーリングでは使えたんだけど、メモリ使用量がシェルスクリプトの3倍ぐらいだったので今回はシェルスクリプトにしてみた。Eventが使えるとまた違うのかもしれないけどpollしか使えなかったので…

0 件のコメント:

コメントを投稿