PINE A64でI2CとGPIOを使ってみた

2022.05.11

こんにちは。CX事業本部IoT事業部のakkyです。今回は、PINE A64でI2CとGPIOを使う方法をご紹介します。

実験環境

  • SBC: PINE A64 (RAM 1GB版)
  • OS: Armbian 22.05.0-trunk.0005 with Linux 5.15.26-sunxi64
  • I2Cディスプレイ: AE-AQM0802+PCA9515

OSの設定(armbian-config)

I2CとGPIOを使用する前に、armbian-configでハードウェアを有効にする必要があります。

$ sudo armbian-config

を実行し、System→Hardwareからi2c1とpps-gpioを有効にする(スペースキーで有効・無効の切り替え)を行い、再起動します。

一般ユーザがI2Cを利用できるようにするには、以下のコマンドで対象ユーザをi2cグループに追加する必要があります(sudoを使用する場合は不要です)。設定後再起動してください。

$ sudo adduser akky i2c

同様に、一般ユーザがGPIOを利用できるようにするには、以下のコマンドを実行します。

$ sudo chmod o+wr /dev/gpiochip*

I2Cの使用方法

Raspberry Pi用のコマンドやライブラリがそのまま使用できました。

実験として、秋月電子で販売されているRaspberry Pi用のI2Cキャラクタ液晶AE-AQM0802+PCA9515を使用しました。キャラクタ液晶をPI-2 ConnectorのRaspberry Piと同じ位置に差し込みます。

i2cdetectコマンドで接続を確認します。3eがデバイスのアドレスです。

$ /sbin/i2cdetect 1
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-1.
I will probe address range 0x08-0x77.
Continue? [Y/n] y
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 3e --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

その後、Pythonでpipでlcd-st7032をインストールした後、サンプルを参考に以下のコードを実行すると、きちんと文字列が表示されることが確認できました。

from lcd_st7032 import ST7032
lcd = ST7032()
lcd.write("Hello   ")
lcd.setCursor(1,0)
lcd.write("   World")

また、bashを使った実装であるTakeru-chan/bash-de-aqm0802も同様に動作することを確認できました。

GPIOの使用方法

バックライトも制御したいので、GPIOの操作も試してみます。

過去の資料では/sys/class/gpioを使用する方法が紹介されていますが、Kernel 4.8以降この方法は非推奨となり、現在はlibgpiodを使用します。 GPIO操作には、以下のURLに記載されているコマンドを使用します。 https://git.kernel.org/pub/scm/libs/libgpiod/libgpiod.git/tree/README

これらのコマンドに指定する番号とGPIO名との対応は、/sys/kernel/debug/pinctrl/*/pinsに記載されています。

具体的には、以下の3種類のGPIOデバイスがあります。

  • 1c20800.pinctrl
  • 1f02c00.pinctrl
  • axp20x-gpio

それぞれ確認すると、1c20800.pinctrlはPB、PC、PD、PE、PF、PG、PHのポート、1f02c00.pinctrlはPLであることがわかります。Raspberry PiのGPIO04に対応するのはPL10ですから、1f02c00.pinctrlの10番を制御します。

1f02c00.pinctrlがgpiochip0~2のどれに対応すればよいかは実際に試してみるしかないのですが、gpiochip0であることがわかりました。以下のコマンドを実行すると、バックライトを制御できました。

$ gpioset gpiochip0 10=0 #LOWにする(消灯)
$ gpioset gpiochip0 10=1 #HIGHにする(点灯)

参考資料

  1. https://linux-sunxi.org/GPIO
  2. https://files.pine64.org/doc/Pine%20A64%20Schematic/Pine%20A64%20Pin%20Assignment%20160215.pdf