気の向くままに辿るIT/ICT/IoT
IoT・電子工作

ProcessingとArduinoでLチカ

ホーム前へ次へ
Arduinoって?

ProcessingとArduinoでLチカ

ProcessingとArduinoでLチカ

2018/02/26

 ProcessingとArduinoでLチカを実行してみるページ。

 Arduino IDEは、C/C++ベースですが、このIDEには、ArduinoとPCやRaspberry Piなどとの間をシリアル通信で接続して操作できるFirmataプロトコルを使ったサンプルスケッチ群があり、例えば、これをArduinoボードに書き込んでおけば、ProcessingPythonRubyPerl、JavaScript...などのスクリプトやC/C#などのプログラミング言語からでもArduinoを操作・制御することができるようになる模様。

 ここでは、この中からProcessingを使ってArduino界のHello World!であるLチカ(blink)を実行するまでの手順を書きます。

 基本的には、Arduino and Processingに書いてある通りですが、そこにあるProcessing用のFirmataライブラリは、古いであろうこともあり、このインストールをProcessing上で行なったり、Linux上で作業したらスケッチ上のシリアルポートを固定値にする必要があったりと多少異なる部分もありました。

ArduinoボードにStandardFirmataをアップロード

 もちろん、後でもよいですが、今回は、まず、ArduinoボードにArduino IDEのサンプルスケッチStandardFirmataをアップロードしておくものとします。

 サンプルスケッチStandardFirmataは、Arduino IDEの[ファイル/File] => [スケッチ例/Examples] => [Firmata]にあります。

Processingのインストール

 公式サイトのDownload Processingから使用中のOS用のProcessingをインストールします。

 ちなみに自身は、Debian(Linux)を使っていますが、macOSの他、Windows/Linuxについては32bit/64bit、Linuxはこれに加えてARMv6hf版もあります。

Arduino(Firmata)ライブラリのインストール

 Processingを起動、[ファイル] => [サンプル]をクリック、[サンプルを追加...]ボタンをクリック、[libraries]タブを選択、[Arduino(Firmata)]を選び、[↓Install]ボタンをクリックしてProcessingにArduino(Firmata)ライブラリをインストールします。

 当初、playground.arduino.ccのリンク先にあったライブラリを展開したのですが、いまいち展開先がわからず、いくつかの場所に置いて試してみましたが、どうやっても実行時に"cc does not..."となってしまったのでProcessingのメニューを眺めていたら見つけた次第。

スクリプトを書く

// example.pde
import processing.serial.*;
import cc.arduino.*;
 
Arduino arduino;
int ledPin = 13;
 
void setup()
{
 //println(Arduino.list());
// arduino = new Arduino(this, Arduino.list()[0], 57600);
 arduino = new Arduino(this, "/dev/ttyUSB0", 57600);
 arduino.pinMode(ledPin, Arduino.OUTPUT);
}
 
void draw()
{
 arduino.digitalWrite(ledPin, Arduino.HIGH);
 delay(1000);
 arduino.digitalWrite(ledPin, Arduino.LOW);
 delay(1000);
}

 Arduino and Processingの下の方にある[Example]のスケッチをコピー&ペーストします。

 ただし、自身は、Debian(Linux)上で作業を行なったのですが、インスタンス[Arduino]生成時の引数に[Arduino.list()[0]]を使うと、なぜか正しいポート名が得られず、このように固定値に置き換える必要がありました。

 ここでは、ファイル名を仮にexample.pdeとしたので任意のディレクトリ・フォルダにProcessingが想定する同名のexampleディレクトリ(フォルダ)を作成し、そこにexample.pdeを置きます。

[2018/03/04:訂正・追記]

 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点灯というのも容易にできる模様。

// example_1.pde
import processing.serial.*;
import cc.arduino.*;
 
Arduino arduino;
 
int led = 13;
boolean value = false;
PImage bg1, bg2;
 
void setup() {
 size(100 ,100);
 println(Arduino.list());
 arduino = new Arduino(this , Arduino.list()[4] , 57600);
 arduino.pinMode(led, Arduino.OUTPUT);
 bg1 = loadImage("/path/to/switch_on_image.jpg");
 bg2 = loadImage("/path/to/switch_off_image.jpg");
}
 
void draw() {
 if (value) {
   background(bg1);
 } else {
   background(bg2);
 }
}
 
void mousePressed() {
 value = !value;
 if (value) {
  arduino.digitalWrite(led , Arduino.HIGH);
 } else {
  arduino.digitalWrite(led , Arduino.LOW);
 }
 println(value);
}
[2018/03/20]

 マウス押下時のイベントを拾った一例がこれです。

 Arduino側は、やはり、StandardFirmataで、Processing側で、このようにON/OFFそれぞれのスイッチ画像ファイル(少なくとも.jpgは可)を使うとProcessing側のスイッチでArduino側のLEDをON/OFFできます。(後段リンクのJavaSriptを使ったブラウザからのLED ON/OFF参照。)

 ちなみにsize();で指定したピクセル値と画像ファイルのサイズは縦横ぴったり一致させる必要があります。

ArduinoとProcessingは旧知の仲

 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ベースやアプリとしてスマホ上でも利用できるような仕組みも登場している模様なので尚更。

ホーム前へ次へ