Xojo日本語ブログ

マルチプラットフォーム対応アプリが開発できるXojoのブログです。

Xojo × Raspberry Piでの開発を楽に行うテクニック

XojoはRaspberry Pi向けのビルドにも対応しています。Raspberry Piといえば、小型PCの一つでRasbianというDebianベースのOSが動きます(他のOSも出ています)。しかし現状、XojoのRaspberry Pi向けにはデバッグビルド機能がなく、ブレークポイントを差し込んだり変数をチェックするのが困難です。

また、各種センサーの値を取得するためのサンプルコードも多くないため、配線やデータの取得に苦戦するのではないでしょうか。そこで、すでに数多ある外部の資産を使いつつXojoらしい使い方を考えてみたいと思います。

Xojo × Raspberry Piの組み合わせについて

1. XojoでGPIO/I2Cを直接操作する

一つはXojoでGPIO、I2Cを操作する方法です。もちろんこれはできない訳ではありません。しかしサンプルになるコードが多くないため、新しいセンサーを使おうと思うと仕様を調べたり、Xojoでの結果の受け取り方を調べた上で計算処理が必要になります。

デジタルデータのIN/OUTといった程度であればさほど難しくありません。例えば以下はLEDを光らせるサンプルです。

GPIO.SetupGPIO
  
Const kLEDPin = 4
  
GPIO.PinMode(kLEDPin, GPIO.OUTPUT)

GPIO.DigitalWrite(kLEDPin, GPIO.ON)

しかしアナログセンサーから値をとったり、LCDにメッセージを出したりするのは複雑なコードが必要になります。そのためにはセンサーの仕様を調べたり、ビット演算の伴うコーディングが必要になるでしょう。

2. シェルを使う

センサーのデータを授受する部分についてはPythonやNode.jsで作られた既存の資産がたくさん存在します。それらをXojoにトランスコードすることもできますが、直接シェルコマンドとして実行してしまうことで簡略化可能です。

Dim sh as new Shell
sh.Execute("hostname") // コマンドを実行

// sh.ReadAll で結果が受け取れます

開発中はリモートシェルを使いましょう

シェルコマンドを実行するとして、そのまま実行するとWindowsやMac OSX(またはLinux)上で実行されてしまい、Raspberry Piに繋がったセンサーの値は取得できません。そこで、開発時にはリモートシェルを使ってRaspberry Pi上でコマンドを実行するようにします。

リモートシェルは簡単で、SSHでログインしながらコマンドを実行するだけです。

$ ssh pi@raspberrypi.local ls -al
total 40
drwxr-xr-x 5 pi   pi   4096 Aug  1 05:47 .
drwxr-xr-x 3 root root 4096 May 27 11:09 ..
-rw------- 1 pi   pi    330 Aug  1 05:54 .bash_history
-rw-r--r-- 1 pi   pi    220 May 27 11:09 .bash_logout
-rw-r--r-- 1 pi   pi   3540 Aug  1 05:35 .bashrc
drwx------ 3 pi   pi   4096 Aug  1 05:26 .emacs.d
-rw-r--r-- 1 pi   pi    675 May 27 11:09 .profile
drwxr-xr-x 2 pi   pi   4096 Aug  1 05:26 .ssh

後は開発時(デスクトップ)と本番実行時(Raspberry Pi)が区別できるように処理を追加します。なお、公開鍵認証に設定しておく必要があります(そうしないとパスワードが求められるようになります)。

// XOJO_ENVは自分で追加した環境変数です
if System.EnvironmentVariable("XOJO_ENV") = "development" then
  App.command = "ssh pi@raspberrypi.local "
end

後はコマンドを実行する際にApp.commandを追加するだけです。デフォルトでは空文字なので、

  • Mac OSX : ssh pi@raspberrypi.local hostname
  • Raspberry Pi : hostname

が実行されるようになります。

Dim sh as new Shell
sh.Execute(App.command + "hostname")

// sh.ReadAll

後は普通に開発するだけです。デスクトップで実行した結果をそのままRaspberry Piで受け取れるようになります。ブレークポイントも使えますし、実際にセンサーの値も使えますので実データを使った開発ができるようになるはずです。

ライセンスの違い

ここで挙げておきたいのがやり方によってXojoのライセンスが異なるという点です。Raspberry Pi向けのCUIアプリケーションを作る場合、Raspbery Piのライセンスが必要になります。しかし例えばRaspberry Pi上で動作するWebアプリケーションを開発するのであればWebライセンスになります。つまりすでにWeb開発のライセンスを持っているのであれば、Raspberry Pi用のライセンスを買い足すことなく、IoTに関係するプロジェクトに踏み出せるようになります。


シェルやリモートシェルを使った方法であれば、これまでの一般的なシステム開発とは少し毛色の違うIoT/センサー部分を疎結合にし、実行結果だけをこれまでのXojoらしく使えるようになります。ブレークポイントデバッグも使えますので、従来の生産性の高い方法を使ったRaspberry Piアプリケーションの開発が実現するでしょう。