ProcessingとArduinoでLチカを実行してみるページ。
Arduino IDEは、C/C++ベースですが、このIDEには、ArduinoとPCやRaspberry Piなどとの間をシリアル通信で接続して操作できるFirmataプロトコルを使ったサンプルスケッチ群があり、例えば、これをArduinoボードに書き込んでおけば、ProcessingやPython、Ruby、Perl、JavaScript...などのスクリプトやC/C#などのプログラミング言語からでもArduinoを操作・制御することができるようになる模様。
ここでは、この中からProcessingを使ってArduino界のHello World!であるLチカ(blink)を実行するまでの手順を書きます。
基本的には、Arduino and Processingに書いてある通りですが、そこにあるProcessing用のFirmataライブラリは、古いであろうこともあり、このインストールをProcessing上で行なったり、Linux上で作業したらスケッチ上のシリアルポートを固定値にする必要があったりと多少異なる部分もありました。
もちろん、後でもよいですが、今回は、まず、ArduinoボードにArduino IDEのサンプルスケッチStandardFirmataをアップロードしておくものとします。
サンプルスケッチStandardFirmataは、Arduino IDEの[ファイル/File] => [スケッチ例/Examples] => [Firmata]にあります。
公式サイトのDownload Processingから使用中のOS用のProcessingをインストールします。
ちなみに自身は、Debian(Linux)を使っていますが、macOSの他、Windows/Linuxについては32bit/64bit、Linuxはこれに加えてARMv6hf版もあります。
Processingを起動、[ファイル] => [サンプル]をクリック、[サンプルを追加...]ボタンをクリック、[libraries]タブを選択、[Arduino(Firmata)]を選び、[↓Install]ボタンをクリックしてProcessingにArduino(Firmata)ライブラリをインストールします。
当初、playground.arduino.ccのリンク先にあったライブラリを展開したのですが、いまいち展開先がわからず、いくつかの場所に置いて試してみましたが、どうやっても実行時に"cc does not..."となってしまったのでProcessingのメニューを眺めていたら見つけた次第。
Arduino and Processingの下の方にある[Example]のスケッチをコピー&ペーストします。
ただし、自身は、Debian(Linux)上で作業を行なったのですが、インスタンス[Arduino]生成時の引数に[Arduino.list()[0]]を使うと、なぜか正しいポート名が得られず、このように固定値に置き換える必要がありました。
ここでは、ファイル名を仮にexample.pdeとしたので任意のディレクトリ・フォルダにProcessingが想定する同名のexampleディレクトリ(フォルダ)を作成し、そこにexample.pdeを置きます。
Firmataではないし、このスケッチでは試していないものの、続編のシリアル通信Arduino側センサ値をProcessingでグラフ化デモで、たまたま、検出できることがわかったのですが、[Arduino.list()[0]]の配列要素を0ではなく、4にしたところ、/dev/ttyUSB0も検出されました(というか一致しました)。
また、Processingのスケッチにprintln(Serial.list());と書けば、下部のウィンドウに配列要素に格納されているシリアルポートが列挙されることがわかりました。
Arduino IDEのサンプルスケッチStandardFirmataをアップロードしたArduinoボードをPCにUSB接続しておきます。
ファイルマネージャ上などでexample.pdeのあるフォルダを開き、ダブルクリックするか、右クリックするなりしてProcessingを起動。
横三角の実行ボタンをクリックすると何も表示されていない小さなポップアップ画面が開き、少なくともUno/Nano/Pro MiniならArduinoボード上のLEDが点滅しているはず。
終了するには、実行ボタン右横にある四角い停止ボタンをクリックします。
マウスイベントも拾うことができるようなのでクリック時にLED点灯というのも容易にできる模様。
マウス押下時のイベントを拾った一例がこれです。
Arduino側は、やはり、StandardFirmataで、Processing側で、このようにON/OFFそれぞれのスイッチ画像ファイル(少なくとも.jpgは可)を使うとProcessing側のスイッチでArduino側のLEDをON/OFFできます。(後段リンクのJavaSriptを使ったブラウザからのLED ON/OFF参照。)
ちなみにsize();で指定したピクセル値と画像ファイルのサイズは縦横ぴったり一致させる必要があります。
ProcessingはJavaベース、Arduino IDEは、C/C++風であるものの、Arduinoのプログラミング言語は、電子アートとビジュアルデザインのためのプログラミング言語かつ統合開発環境(IDE)であるProcessingから派生したアーティストがマイクロコントローラをプログラムできるようにすることを目的としたプロジェクトであるWiringベースとなっています。(What is Arduino?)
また、Processingでは、IDEをsketchbook、個々のプログラムファイルをスケッチと呼び、スケッチの基本形は、setup()関数とdraw()関数から成り、学生向けのロボット製造用コントロールデバイスの選択肢の1つとして、より安価なプロトタイピングデバイスを製造することを目的としたArduinoのIDEは、Processingを元に作られたもので、やはり、そのプログラムファイルをスケッチと呼び、スケッチの基本形は、setup()関数とloop()関数から成ります。
そんな関係にあるArduinoとProcessingは、主に前者を比較的容易にビジュアル化するべく、後者を使用するプロジェクトが既に多々存在します。
そういった意味でProcessingとArduino間におけるFirmataライブラリの利用やシリアル通信プログラミングは、他のスクリプトなどとは違う目的において最も相性の良い組み合わせと言えるでしょう。
Processingは、元々は、PCを前提としたものでしたが、後にWebベースやアプリとしてスマホ上でも利用できるような仕組みも登場している模様なので尚更。