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
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
ファイルへ1
と0
を書き込むことで操作します。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してみると、1
か0
が出力されます。)
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/direction
をout
(出力)に設定します。
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アプリから操作してみる(実践)です。合わせて、参照していただけると幸いです。