Etizolam

For our good night sleep.

Intel GalileoのGPIOをpythonアプリから操作してみる(基礎)

Intel Galileo(以降、Galileo)は、arduino互換のGPIOを装備しています。このGPIOを使うためにIntel社が準備してくれているのがGalileo用のArduino IDEということになります。

しかし、僕が愛用しているSDイメージではこのIDEと通信できない。更に僕は、Galileoの優位性はLinuxの有志が提供してくれている各種ソフトとarduino互換GPIOの連携と勝手に思い込んでいるので、IDEを使わずにGPIOの操作ができないかと調べた結果をまとめてみます。

Galileo GPIOの仕様もどき

Intel社みたいな大手企業なら何処かに正式な仕様書が存在していると思うのだが、googleで検索しても僕はそれらしきものを見つけることができなかった。しかしながら、次のSergey氏のサイトに書かれている内容を参照するとGPIOの動作が理解できます。

Intel Galileo – Programming GPIO From Linux

Yocto ProjectのLinuxで動作しているGalileoも、Raspberry Pi等と同じように、特定の場所のファイルに対し設定内容を書き込めば、GPIOの目的ピンに意図している設定は反映されるようになっています。

GPIOの設定内容を書き込むファイルの場所は次のディレクトリになります。

1
cd /sys/class/

まず、ディレクトリ移動して内容を見てみましょう。

1
2
3
4
5
6
7
8
root@clanton:/sys/class# ls
backlight cpuid      input     net       scsi_generic   tty
bdi   dma      mdio_bus  pci_bus       scsi_host      udc
block   firmware     mem       power_supply  spi_host     uio
bluetooth gpio       misc      pwm       spi_master     vc
bsg   i2c-adapter  mmc_host  rfkill      spi_transport  vtconsole
cln_esram_test  i2c-dev      msr       scsi_device   spidev
cln_imr_test  ieee80211    mtd       scsi_disk     thermal

GPIOピンの設定は、gpioディレクトリとpwmディレクトリ以下にあるファイルに書き込み操作をすることによって行います。

各ピンの設定詳細に関しては、先に紹介したSergey氏のサイトの図表を参照してください。

コンソール入力でGPIOピンを操作してみる

1.Digital 出力

digital 5ピンを出力として使用するための設定をしてみます。

Galileoボード上のdigital 5ピンは、gpio番号としては17番に対応してることを先に紹介した図表で確認します。 その上で、exportファイルに17を書き込みます。

1
echo -n "17" > /sys/class/gpio/export

書き込みが完了すると、gpio17ディレクトリが生成されます。このディレクトリ内に存在している各ファイルに設定を書き込んでいきます。

今回は、出力設定なのでdirectionファイルにout(出力)と書き込みます。

1
echo -n "out" > /sys/class/gpio/gpio17/direction

信号の出力モードを設定します。LEDを付けるなどの一般用途ではstrongを使います。詳細に関しては、先のサイトを参照してください。

1
echo -n "strong" > /sys/class/gpio/gpio17/drive

ピン出力のHIGH, LOWは、valueファイルへ10を書き込むことで操作します。1=HIGH, 0=LOWです。

1
echo -n "1" > /sys/class/gpio/gpio17/value

digital 5ピンにLEDを接続すれば、Lチカができます。

2.Digital 入力

digital 5ピンを入力として使用するための設定をしてみます。

Galileoボード上のdigital 5ピンは、gpio番号としては17番に対応してることを先に紹介した図表で確認します。 その上で、exportファイルに17を書き込みます。

1
echo -n "17" > /sys/class/gpio/export

書き込みが完了すると、gpio17ディレクトリが生成されます。このディレクトリ内に存在している各ファイルに設定を書き込んでいきます。

今回は、入力設定なのでdirectionファイルにin(入力)と書き込みます。

1
echo -n "in" > /sys/class/gpio/gpio17/direction

信号の出力モードを設定します。先の資料には、strongで問題と書かれていますが、僕の手元の環境では再現できませんでした。僕の環境では、hizの設定をしたときのみです。従って、ここでは、hizを書き込みます。

1
echo -n "hiz" > /sys/class/gpio/gpio17/drive

valueファイルに、HIGH=1, LOW=0で値が書かれているのを確認してみます。

1
cat /sys/class/gpio/gpio17/value

digital 5ピンにボタンスイッチ等を接続し、ON/OFFしファイルを状態をcatしてみましょう。

3.Analog 出力

digital 5ピンをPWM出力として使用するための設定をしてみます。

次の4ステップは、Digital出力を準備するのと同じです。

1
echo -n "17" > /sys/class/gpio/export
1
echo -n "out" > /sys/class/gpio/gpio17/direction
1
echo -n "strong" > /sys/class/gpio/gpio17/drive

PWMの設定する前は、該当ピンの出力が確実にLOWでなっているように設定しておきます。

1
echo -n "0" > /sys/class/gpio/gpio17/value

PWM出力の準備を始めます。Digital 5ピンのPWMチャネルが5番であることを、先の対応図表で確認します。 (以下の各コマンド内の5は、PWMチャネル番号です。)

/sys/class/pwm/pwmchip0/exportに対して、pwmチャネル番号5を書き込みます。

1
echo -n "5" > /sys/class/pwm/pwmchip0/export

/sys/class/pwm/pwmchip0/enableに対して、1(有効)を書き込みます。 1=有効,0=無効です。

1
echo -n "1" > /sys/class/pwm/pwmchip0/pwm5/enable

PWMの周期時間をナノ秒で/sys/class/pwm/pwmchip0/pwm5/periodへ書き込みます。1900000は、IDEがPWMに設定していた周期時間です。

1
echo -n "1900000" > /sys/class/pwm/pwmchip0/pwm5/period

PWMのHIGHの時間をナノ秒で/sys/class/pwm/pwmchip0/pwm5/duty_cycleへ書き込みます。800000は、50%の仕事率を設定しています。

1
echo -n "800000" > /sys/class/pwm/pwmchip0/pwm5/duty_cycle

一通りPWMの設定が済んだところで、/sys/class/gpio/gpio17/valueをHIGHにします。(PWMが動作している間にvalueをcatしてみると、10が出力されます。)

1
echo -n "1" > /sys/class/gpio/gpio17/value

digital 5ピンにLEDを接続すれば、LEDが50%の照度で点灯ができます。 duty_cycleの数値を変更すると、LEDの照度が変わります。

4.Analog 入力

Analog A0ピンを出力として使用するための設定をしてみます。

Galileoボード上のanalog A0ピンは、複数の機能をMUXで切り替えるようになっています。 gpio番号としては37番に書き込みをすることによって、A0ピンをAD7298 ADCのICに接続することができます。

今までと同じように、exportファイルに37を書き込みます。

1
echo -n "37" > /sys/class/gpio/export

MUXを設定するためのgpio37/directionout(出力)に設定します。

1
echo -n "out" > /sys/class/gpio/gpio37/direction

gpio37/valueを、0(LOW)にしAD7298 ADCにA0入力を接続します。

1
echo -n "0" > /sys/class/gpio/gpio37/value

/sys/bus/iio/devices/iio\:device0/in_voltage0_rawをcatすることで、A0入力を読み取ります。

1
cat /sys/bus/iio/devices/iio\:device0/in_voltage0_raw

ボリューム抵抗等をA0に接続し、catを繰り返すと数値が変化していることが確認できます。

5.使用したピンの後処理

ピンの利用解除は、次に示すようにgpioディレクトリかpwmのディレクトリの unxport ファイルに、該当GPIO番号かPWMチャネル番号の書き出して処理します。

1
echo -n "17" > /sys/class/gpio/unexport
1
echo -n "5" > /sys/class/pwm/pwmchip0/unexport

まとめ

arduino等の組み込みプログラムと違って、registerの特定番地をHIGH,LOW設定すのではなく、ファイルへの書き込みのみでGPIO操作の確認できたと思います。そして、一般的なプログラミング言語からもGPIOが簡単に操作できる理由が提示できたと思います。次は、この原理をベースにしたライブラリー使って、実際のプログラムを書いてみることにします。

この続きはIntel GalileoのGPIOをpythonアプリから操作してみる(実践)です。合わせて、参照していただけると幸いです。