ジャンル不定の日記です。

Orange Pi ZeroでGPIO使ってみた

XR819がうまく行かないOrange Pi Zeroだが、
とりあえずシリアルコンソールで制御してGPIO触ってみることにした。
ピンヘッダーはさっきくっつけた。

ピン配列だが、
https://gist.github.com/probonopd/97f6826cc5aa3c0c0950682b0bc266bc
画像検索したら上のページが出てきた。
画像無くなったときのために画像は転載しておく。

LANコネクタある側の外側がGNDで、対角に5Vが2本、外側が3.3V。
テスタで測ったらそんな感じだった。

Raspberry Piの情報だが、
https://www.jtp.co.jp/techport/2016-08-31-002/
↑にファイルアクセスでGPIO制御する方法載ってたんで参考にした。
ググるとPython使ったやり方が出てきたりするがファイルアクセスだけで制御できる。Pythonなんか入れてない。

# cd /sys/class/gpio
# ls -al
total 0
drwxr-xr-x    2 root     root             0 Jan  1 00:00 .
drwxr-xr-x   43 root     root             0 Jan  1 00:00 ..
--w-------    1 root     root          4096 Jan  1 00:00 export
lrwxrwxrwx    1 root     root             0 Jan  1 00:00 gpiochip0 -> ../../devices/platform/soc/1c20800.pinctrl/gpio/gpiochip0
lrwxrwxrwx    1 root     root             0 Jan  1 00:00 gpiochip352 -> ../../devices/platform/soc/1f02c00.pinctrl/gpio/gpiochip352
--w-------    1 root     root          4096 Jan  1 00:00 unexport
/sys/class/gpio/export にピン番号を書き込めば有効になってunexportに書き込むと無効になるらしい。
だが、ピン番号がわからない。

https://github.com/orangepi-xunlong/wiringOP
↑にあるWiringOPというコマンドを使うと番号が確認できるみたい。これはwiringPiというRaspberry Pi用のコマンドのOrange Pi用みたい。
BuildrootにもOrange Pi用に使えそうなコマンドがなかったんで上のをビルドしようと思ったが、これクロスコンパイルできない感じ?
なので、上のページに出力結果が載ってるんで信じることにした。
 +------+-----+----------+------+---+  OPi H2  +---+------+----------+-----+------+
 | GPIO | wPi |   Name   | Mode | V | Physical | V | Mode | Name     | wPi | GPIO |
 +------+-----+----------+------+---+----++----+---+------+----------+-----+------+
 |      |     |     3.3V |      |   |  1 || 2  |   |      | 5V       |     |      |
 |   12 |   0 |    SDA.0 | ALT2 | 0 |  3 || 4  |   |      | 5V       |     |      |
 |   11 |   1 |    SCL.0 | ALT2 | 0 |  5 || 6  |   |      | GND      |     |      |
 |    6 |   2 |    PWM.1 |  OFF | 0 |  7 || 8  | 0 | ALT2 | TXD.1    | 3   | 198  |
 |      |     |      GND |      |   |  9 || 10 | 0 | ALT2 | RXD.1    | 4   | 199  |
 |    1 |   5 |    RXD.2 | ALT2 | 0 | 11 || 12 | 0 | OFF  | PA07     | 6   | 7    |
 |    0 |   7 |    TXD.2 | ALT2 | 0 | 13 || 14 |   |      | GND      |     |      |
 |    3 |   8 |    CTS.2 |  OFF | 0 | 15 || 16 | 0 | ALT3 | SDA.1    | 9   | 19   |
 |      |     |     3.3V |      |   | 17 || 18 | 0 | ALT3 | SCK.1    | 10  | 18   |
 |   15 |  11 |   MOSI.1 | ALT2 | 1 | 19 || 20 |   |      | GND      |     |      |
 |   16 |  12 |   MISO.1 | ALT2 | 0 | 21 || 22 | 0 | OFF  | RTS.2    | 13  | 2    |
 |   14 |  14 |   SCLK.1 | ALT2 | 0 | 23 || 24 | 0 | ALT2 | CE.1     | 15  | 13   |
 |      |     |      GND |      |   | 25 || 26 | 0 | OFF  | PA10     | 16  | 10   |
 +------+-----+----------+------+---+----++----+---+------+----------+-----+------+
 | GPIO | wPi |   Name   | Mode | V | Physical | V | Mode | Name     | wPi | GPIO |
 +------+-----+----------+------+---+  OPi H2  +---+------+----------+-----+------+
こんな感じで出力されるらしい。
なお、ピン配列の画像のページにもこのコマンドの結果が載ってるが番号が違う。よく見るとh3用をビルドしてるんで違うpiの結果を出力しちゃってるぽい。
H2(ZeroとR1)の配列は上の通りと思われる。
ピンヘッダーの配置と同じ感じの出力になってるわけね。
これのGPIOの欄に書かれている数字が /sys/class/gpio へのアクセスで使う数字ぽい。

# echo "12">export
# ls -al
total 0
drwxr-xr-x    2 root     root             0 Jan  1 00:00 .
drwxr-xr-x   43 root     root             0 Jan  1 00:00 ..
--w-------    1 root     root          4096 Jan  1 01:18 export
lrwxrwxrwx    1 root     root             0 Jan  1 01:18 gpio12 -> ../../devices/platform/soc/1c20800.pinctrl/gpiochip0/gpio/gpio12
lrwxrwxrwx    1 root     root             0 Jan  1 00:00 gpiochip0 -> ../../devices/platform/soc/1c20800.pinctrl/gpio/gpiochip0
lrwxrwxrwx    1 root     root             0 Jan  1 00:00 gpiochip352 -> ../../devices/platform/soc/1f02c00.pinctrl/gpio/gpiochip352
--w-------    1 root     root          4096 Jan  1 00:00 unexport
3.3Vの隣りにある12番ピンを使うことにした。
exportにechoで"12"を書き込めば /sys/class/gpio/gpio12 が出てくる。
なお、echoのダブルクォート要らないんじゃね?思ったが要るみたい。(改行が入っちゃうとかか?)

# ls -alL gpio12
total 0
drwxr-xr-x    3 root     root             0 Jan  1 01:18 .
drwxr-xr-x    3 root     root             0 Jan  1 01:18 ..
-rw-r--r--    1 root     root          4096 Jan  1 01:19 active_low
drwxr-xr-x    4 root     root             0 Jan  1 00:00 device
-rw-r--r--    1 root     root          4096 Jan  1 01:19 direction
-rw-r--r--    1 root     root          4096 Jan  1 01:19 edge
drwxr-xr-x    2 root     root             0 Jan  1 01:19 power
drwxr-xr-x    2 root     root             0 Jan  1 00:00 subsystem
-rw-r--r--    1 root     root          4096 Jan  1 01:18 uevent
-rw-r--r--    1 root     root          4096 Jan  1 01:19 value
/sys/class/gpio/gpio12 には上記のファイルがある。
directionがin outの向きの確認と変更ができるみたい。
valueで値が確認できる。

# cat gpio12/direction
in
最初はinになってる。

# echo "out">gpio12/direction
# cat gpio12/direction
out
"out"を書き込むとoutになる。

# cat gpio12/value
0
valueの値は0。
この状況でテスタで電圧を測ってみたら0V強だった。
なお、inの状態でのテスタは3V強だった。active_lowだから?

# echo "1">gpio12/value
# cat gpio12/value
1
valueに"1"を書き込んだら1になった。
この状況でテスタで電圧を測ってみたら3V強だった。

テスタ当てるだけで制御できてることが確認できてるわけだが、一応LEDもくっつけてみた。
手元にVf2前後の緑LEDがあったんで20mA程度流せば光るだろうと計算したところ3.3Vに65Ωの抵抗で20mAになることがわかった。
100Ωの抵抗で光るだろうと判断して100Ω抵抗とLEDを直列でGPIO12とGNDの間につないでみた。
で、
# echo "0">gpio12/value
# echo "1">gpio12/value
# echo "0">gpio12/value
と交互に"0"と"1"をvalueに書き込んだら点滅した。

シリアルコンソールだとKonsoleのウインドウいっぱいに表示されないからSSHで接続して制御したいと思ってたが、
# stty rows 30
みたいにすると行数変えれるから画面いっぱいでシリアルコンソール使えるんであまり困らんかも。
# stty -a
で現在の行数とか確認できる。

でも最終的にプログラムでモーターを制御したいと思ってるんで、プログラムの転送にネットつながってないと不便か。
Raspberry PiではPython使う例が多いみたいだが、今はSDカードにシステム入れてるがSPIフラッシュに入れたいんでPython入れる容量はもったいないんでC言語かなと思ってる。