RaspberryPi3 で シェル上から GPIO 機能を制御する方法
20.12.16
【情報】
今日は、RaspberryPi3 の GPIO の制御を XOJO からシェル・コマンドで実行する方法を紹介をしたいと思います。
◎まず始めに、「wiringPi」をインストールします
https://tool-lab.com/2013/12/raspi-gpio-controlling-command-2/
http://wiringpi.com/download-and-install/
sudo apt-get install libi2c-dev
sudo apt-get install i2c-tools
git clone git://git.drogon.net/wiringPi
cd wiringPi
./build
◎「wiringPi」が正常に動作しているか確認します(表がテキストで表示されたらOK。)
gpio readall
◎GPIO13(Physical 33 pin)を出力モードにする。
gpio -g mode 13 out
◎GPIO13(33 pin)をONにする。(Hight を出力)
gpio -g write 13 1
◎GPIO13(33 pin)をOFFにする。(Low を出力)
gpio -g write 13 0
"gpio -g mode 13 out" は、「GPIO 13」を出力モードに設定する・・・という意味。
"gpio -g write 13 0" は、「GPIO 13」へロジック・レベル・"Low"を出力するという意味。
上図の「BCM」という列に表示されている番号が「GPIO」の番号になります。
下図はピンヘッダーですが、GPIO 番号で「BCM」の列で13となっているのが、「GPIO13」となります。
(大変参考になったURL : http://elinux.org/File:Pi-GPIO-header.png)
動作が確認出来たら、次は XOJO からシェル・コマンドを呼び出して実行してみます。
◎RaspberryPi 側の準備が出来たら、XOJO のソースコード中に以下の様なシェル呼び出しのためのコードを記述して実行します。
(下記は次期リリース予定の「Easy MCUser for RaspberryPi」のピン配置でスレーブMCU との接続に使用する予定の信号です。)
sh.Execute("gpio -g mode 5 out") // CS_SLV_0
sh.Execute("gpio -g mode 6 out") // CS_SLV_1
sh.Execute("gpio -g mode 13 out") // CS_SLV_2
sh.Execute("gpio -g mode 19 out") // CS_SLV_3
sh.Execute("gpio -g mode 26 out") // CS_SLV_4
sh.Execute("gpio -g mode 12 out") // CS_SLV_5
sh.Execute("gpio -g mode 16 out") // CS_SLV_6
sh.Execute("gpio -g mode 20 out") // CS_SLV_7
sh.Execute("gpio -g write 5 0") // CS_SLV_0
sh.Execute("gpio -g write 6 1") // CS_SLV_1
sh.Execute("gpio -g write 13 1") // CS_SLV_2
sh.Execute("gpio -g write 19 1") // CS_SLV_3
sh.Execute("gpio -g write 26 1") // CS_SLV_4
sh.Execute("gpio -g write 12 1") // CS_SLV_5
sh.Execute("gpio -g write 16 1") // CS_SLV_6
sh.Execute("gpio -g write 20 1") // CS_SLV_7
サンプルコードを掲載します。(下記をクリックしてダウンロード出来ます。)
test_rp3_gpio_xojo.zip
XOJO のRaspberryPi デスクトップ・ライセンスをお持ちの方でもし興味がある方は、お試しください。(12/23/2016 追記)
(RaspberryPi デスクトップ・ライセンスは、ビルドした後でしか動作の確認が出来ないので、ライセンスをお持ちでない方は、XOJO の開発環境を開いて、どうやったら WiringPi を使ってシェルから GPIO を制御するのかの例を確認するところまでしか出来ません。ビルド済みのものも圧縮していますので、「test_rp3_gpio_xojo」フォルダーをそのままコピーして、コピーが完了したら、「test_rp3_gpio」のパーミッションを実行可能状態にして使用出来ます。
説明書は簡単なので添付していません。注意点としては、GPIO には、とりあえず何も繋がない状態で試してください。ピンの競合状態を避けるため。)
【追加情報】
XOJO の内部コマンドで GPIO.XXXX というコマンドがありますが、これがなぜかうまく動作してくれません。。。なので、今回は「wiringPi」を使わせて頂き、RaspberryPi3 の GPIO を制御する様にしました。試行した事を以下に書き記しておきます。(いつか、役に立つ時のために)
・XOJO側のコードで注意すべき点は、以下のコマンドを「Event Handlers」で一回だけ宣言するという事。
#if TargetLinux Then
GPIO.SetupGPIO
GPIO.DigitalWrite(CS_SLV0, GPIO.ON)
#endif
コンパイル・ターゲットを記述して、「Linux ARM 32bit」がターゲットの時だけこのコードが動作する様にしてコンパイルを実施する。
#if TargetLinux Then
:
:
:
#endif
なぜか、これが NG でした。。。
また、XOJO の2016年リリース2.1から4.1 にアップデートしたところ、せっかく動作が早かった Windows 版のXOJO でコンパイルしたソフトが、デグレードされていて、描画がからんでくる動作は速度が低下しています。ディスプレーの高解像度化に対応したという事が原因というか理由なのかもしれませんが、体感速度で数倍以上は違ってくるので、GUI で処理中のデータの推移などを表示するアプリを作成される方でXOJO をアップデートされる方は、要注意です。(もう少し、頑張って欲しい、、XOJO。。。)
良い事もあるので、これも掲載します。RaspberryPi のデスクトップ・アプリをビルドされる方にとっては、ビルドにかかる時間が大幅に短縮されています。ちなみに、本サイトで掲載させて頂いている「Easy MCUser」のRaspberryPi 版のビルドにかかる時間は、XOJO の2016年リリース2.1では約30分近くかかっていましたが、XOJO の2016年リリース4.1にアップデートしたところ、1分ちょっとで完了する様になりました。
今日は、RaspberryPi3 の GPIO の制御を XOJO からシェル・コマンドで実行する方法を紹介をしたいと思います。
◎まず始めに、「wiringPi」をインストールします
https://tool-lab.com/2013/12/raspi-gpio-controlling-command-2/
http://wiringpi.com/download-and-install/
sudo apt-get install libi2c-dev
sudo apt-get install i2c-tools
git clone git://git.drogon.net/wiringPi
cd wiringPi
./build
◎「wiringPi」が正常に動作しているか確認します(表がテキストで表示されたらOK。)
gpio readall
◎GPIO13(Physical 33 pin)を出力モードにする。
gpio -g mode 13 out
◎GPIO13(33 pin)をONにする。(Hight を出力)
gpio -g write 13 1
◎GPIO13(33 pin)をOFFにする。(Low を出力)
gpio -g write 13 0
"gpio -g mode 13 out" は、「GPIO 13」を出力モードに設定する・・・という意味。
"gpio -g write 13 0" は、「GPIO 13」へロジック・レベル・"Low"を出力するという意味。
上図の「BCM」という列に表示されている番号が「GPIO」の番号になります。
下図はピンヘッダーですが、GPIO 番号で「BCM」の列で13となっているのが、「GPIO13」となります。
(大変参考になったURL : http://elinux.org/File:Pi-GPIO-header.png)
動作が確認出来たら、次は XOJO からシェル・コマンドを呼び出して実行してみます。
◎RaspberryPi 側の準備が出来たら、XOJO のソースコード中に以下の様なシェル呼び出しのためのコードを記述して実行します。
(下記は次期リリース予定の「Easy MCUser for RaspberryPi」のピン配置でスレーブMCU との接続に使用する予定の信号です。)
sh.Execute("gpio -g mode 5 out") // CS_SLV_0
sh.Execute("gpio -g mode 6 out") // CS_SLV_1
sh.Execute("gpio -g mode 13 out") // CS_SLV_2
sh.Execute("gpio -g mode 19 out") // CS_SLV_3
sh.Execute("gpio -g mode 26 out") // CS_SLV_4
sh.Execute("gpio -g mode 12 out") // CS_SLV_5
sh.Execute("gpio -g mode 16 out") // CS_SLV_6
sh.Execute("gpio -g mode 20 out") // CS_SLV_7
sh.Execute("gpio -g write 5 0") // CS_SLV_0
sh.Execute("gpio -g write 6 1") // CS_SLV_1
sh.Execute("gpio -g write 13 1") // CS_SLV_2
sh.Execute("gpio -g write 19 1") // CS_SLV_3
sh.Execute("gpio -g write 26 1") // CS_SLV_4
sh.Execute("gpio -g write 12 1") // CS_SLV_5
sh.Execute("gpio -g write 16 1") // CS_SLV_6
sh.Execute("gpio -g write 20 1") // CS_SLV_7
サンプルコードを掲載します。(下記をクリックしてダウンロード出来ます。)
test_rp3_gpio_xojo.zip
XOJO のRaspberryPi デスクトップ・ライセンスをお持ちの方でもし興味がある方は、お試しください。(12/23/2016 追記)
(RaspberryPi デスクトップ・ライセンスは、ビルドした後でしか動作の確認が出来ないので、ライセンスをお持ちでない方は、XOJO の開発環境を開いて、どうやったら WiringPi を使ってシェルから GPIO を制御するのかの例を確認するところまでしか出来ません。ビルド済みのものも圧縮していますので、「test_rp3_gpio_xojo」フォルダーをそのままコピーして、コピーが完了したら、「test_rp3_gpio」のパーミッションを実行可能状態にして使用出来ます。
説明書は簡単なので添付していません。注意点としては、GPIO には、とりあえず何も繋がない状態で試してください。ピンの競合状態を避けるため。)
【追加情報】
XOJO の内部コマンドで GPIO.XXXX というコマンドがありますが、これがなぜかうまく動作してくれません。。。なので、今回は「wiringPi」を使わせて頂き、RaspberryPi3 の GPIO を制御する様にしました。試行した事を以下に書き記しておきます。(いつか、役に立つ時のために)
・XOJO側のコードで注意すべき点は、以下のコマンドを「Event Handlers」で一回だけ宣言するという事。
#if TargetLinux Then
GPIO.SetupGPIO
GPIO.DigitalWrite(CS_SLV0, GPIO.ON)
#endif
コンパイル・ターゲットを記述して、「Linux ARM 32bit」がターゲットの時だけこのコードが動作する様にしてコンパイルを実施する。
#if TargetLinux Then
:
:
:
#endif
なぜか、これが NG でした。。。
また、XOJO の2016年リリース2.1から4.1 にアップデートしたところ、せっかく動作が早かった Windows 版のXOJO でコンパイルしたソフトが、デグレードされていて、描画がからんでくる動作は速度が低下しています。ディスプレーの高解像度化に対応したという事が原因というか理由なのかもしれませんが、体感速度で数倍以上は違ってくるので、GUI で処理中のデータの推移などを表示するアプリを作成される方でXOJO をアップデートされる方は、要注意です。(もう少し、頑張って欲しい、、XOJO。。。)
良い事もあるので、これも掲載します。RaspberryPi のデスクトップ・アプリをビルドされる方にとっては、ビルドにかかる時間が大幅に短縮されています。ちなみに、本サイトで掲載させて頂いている「Easy MCUser」のRaspberryPi 版のビルドにかかる時間は、XOJO の2016年リリース2.1では約30分近くかかっていましたが、XOJO の2016年リリース4.1にアップデートしたところ、1分ちょっとで完了する様になりました。