Etizolam

For our good night sleep.

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

Intel GalileoのGPIOをpythonアプリから操作してみる(基礎)の続きです。GalileoのGPIOの基礎知識は、プログラムのDebugに必要です。

GPOIを便利に使うためのラッパーライブラリー

やるべきことの内容的を理解すれば簡単な操作ですが、毎回同じ操作をプログラム内で書くのも気が引けるので、ライブラリーがないか調べてみました。

Galileoには、Node.jsとPythonが既に実装されているので、これら二つのプログラミング言語について掲載します。

Node.js:

  • galileo-gpio (Lチカでつまずいて、JSが得意でない僕は先を断念)
  • virginia-io (未だ動作テストしていません)

Python:

Intelさん正式版のGPIOの仕様書の参照先を教えてください。jhottaの自力修正版に反映したいと思います〜。

Pythonスクリプトの例

僕は、Node.jsでのプログラミングは得意ではないので先に紹介したライブラリーを使いこなせていません。従って、ここからはpyGalileoを使って進めることにします。

1. 準備

これから書いていくプログラムを管理するディレクトリを作りし、pyGalileoをDLし、解凍しておきます。

1
2
3
4
mkdir myapps
cd myapps
wget --no-check-certificate https://github.com/jhotta/pyGalileo/archive/master.zip
unzip master.zip

Pythonのライブラリーとしてimportする際に、-masterは不要なので、ディレクトリ名前を変更しておきます。

1
mv pyGalileo-master/ pyGalileo

2. 外部からコールできるpyGalileoの関数

次にpyGalileoが準備している関数を紹介します。

  • pinMide(pin, direction)

    digitalピンの設定を書き込むファイルの準備と、出力又は入力でのピン利用を設定する。

  • digitalWrite(pin, value)

    digitalピンのHIGH,LOW設定。文字列”HIGH”,“LOW”をvalueに設定する。

  • digitalRead(pin)

    digitalピンのIGH,LOWを読み込む。

  • analogWrite(pin, value)

    digitalピンのPWM出力を使って、出力を制御する。0~255のintをvalueに設定する。

  • analogRead(pin)

    analogピンの値を読み込む。

  • delay(msTime)

    ミリ秒の遅延設定する。

  • micros()

    マイクロ秒単位で現在時刻を表示する。

  • millis()

    ミリ秒単位で現在時刻を表示する。

3. Pythonで書くGPIO経由のLチカ(Digital input & LED)

D4に接続したボタンスイッチで、D5に接続したLEDを点灯する例です。ボタンスイッチを押すと、LEDが点灯します。

プログラムを記述するためのファイルを準備します。

1
2
cd myapps
vi digital.py

digital.pyの内容は次のようになります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/env python
import sys
from pyGalileo import *

buttonPin = 4
ledPin = 5
buttonState = 0

def setup():
  pinMode(ledPin, OUTPUT)
  pinMode(buttonPin, INPUT)

def loop():
  while True:
    buttonState = digitalRead(buttonPin)
    if buttonState == HIGH:
      digitalWrite(ledPin, HIGH)
    else:
      digitalWrite(ledPin, LOW)

if __name__ == "__main__":
  setup()
  loop()

実行してみます。

1
python ./digital.py

4. Pythonで書くGPIO経由のLチカ(Analog input & LED)

A2に接続したボリューム抵抗で、D5に接続したLEDの点灯間隔を変化させる例です。ボユームを回すと、LEDの点灯間隔が変化します。

プログラムを記述するためのファイルを準備します。

1
2
cd myapps
vi analog.py

analog.pyの内容は次のようになります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/env python
import sys
from pyGalileo import *

sensorPin = A2
ledPin = 5
sensorValue = 0

def setup():
  pinMode(ledPin, OUTPUT)

def loop():
  while True:
    sensorValue = analogRead(sensorPin)
    digitalWrite(ledPin, HIGH)
    delay(sensorValue)
    digitalWrite(ledPin, LOW)
    print("sensorValue:" + str(sensorValue))
    delay(sensorValue)

if __name__ == "__main__":
  setup()
  loop()

実行してみます。

1
python ./analog.py

5. Pythonで書くGPIO経由のPWM

D5に接続したLEDの照度を、duty_cycle(仕事率)を変化させることで変化させる例です。LEDが照度が上り/下がる状態を繰り返します。

プログラムを記述するためのファイルを準備します。

1
2
cd myapps
vi pwm.py

pwm.pyの内容は次のようになります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/env python
import sys
from pyGalileo import *

led = 5
brightness = 0
fadeAmount = 5    # フェード量

def setup():
  pinMode(led, OUTPUT)

def loop():
  while True:
    analogWrite(led, brightness)
    brightness = brightness + fadeAmount
    # フェード方向の反転
    if brightness == 0 or brightness == 255:
      fadeAmount = -fadeAmount
    delay(30)

if __name__ == "__main__":
  setup()
  loop()

実行してみます。

1
python ./pwm.py

まとめ

一般的なプログラミング言語によるGalileoのGPIOの操作は、IDEで開発するのと大差がないのが提示できたと思います。

ポストの最初にも書いたようにGalileoのメリットは、既存のLinux資産を活かしGPIOをどのように使っていくかだと思います。 Linuxベースの開発経験を持ったエンジニアもGPIOを操作して、IoTの世界で僕らの未来を作るような開発をしてもらえると幸いです。