第十九回
本日のtoeファイル ← ダウンロードしておいてください
Arduinoを使う
今日はArduinoを使っていきます!導入的な部分はWebに色々あると思うので割愛
Arduinoには種類が色々ありますが、今回はaitendoのArduino互換機を使いました。 ファンデュイーノUNO
Firmataを使う
ArduinoとPCを簡単につなぐには Firmata が便利です。
FirmataはArduinoやその他の互換のボード上で動くプログラムです。PCから各IOピンの状態を設定して、ボードのプログラムを変更する必要なく色々と試すことができます。
Arduino IDEの Examples > Firmata > StandardFirmata
を開いてアップロードすると、ArduinoデバイスにFirmataのプログラムが書き込まれます。
Firmata にある Firmata Test Program を使うとプログラムが正しく書き込まれたかを確認できます。
ちゃんと動いているようならFirmataのセットアップは完了です
サーボを動かす
GWSサーボ S03N/2BBMG/JRタイプ: パーツ一般 秋月電子通商-電子部品・ネット通販
手持ちのサーボがあったので、それを動かしてみました。サーボは+5VとGND、それにFirmataからピン設定をServoに設定して接続すれば動きます。
TouchDesignerからFirmataを使う
TouchDesignerのPaletteの中にもFirmataを使うためのモジュールが入っているのですが、こちらの環境だとチョイチョイバグっててうまく動かなかったので改変したバージョンの firmata.tox
を使います。
Pin Modes
のタブから各ピンの機能を選びます。出力に設定したピンは Pin Values
から値を変更できます。入力に設定したピンの値は、analog
や digital
の CHOPアウトプットから値を見ることができます。
入力に設定したピンを使う注意点として、firmata
タブの Report Analog Pins
/ Report Digital Pins
のトグルを入り切りしないとデバイス側からの値が取得できない仕様がありました。入力に設定したのに値がアップデートされない場合はこのあたりをカチカチしてみてください。
カメラでサーボを動かす
/project1/tracking_camera
TouchDesignerでWebカメラの映像を取得して、Blob Tracking TOP
を使い対象のオブジェクトを常にセンターに捉え続けようとするカメラを作ります
ESP8266を使う
ESP8266というチップを搭載したマイコンもArduino IDEでプログラムできます。
ESP8266の特徴としては:
- 安い (1000円以下)
- Wifiが使える
- アナログ入力は1系統のみ
あたりがあります。折角なのでESP8266を使ってOSCを送るデバイスを作ってみましょう。
買ったのはこのボード HiLetgo® OTA WeMos D1 CH340 WiFi 開発ボード ESP8266 ESP-12F 810円。安い
ESP8266をArduino IDEから使うには追加ボードの設定のインストールが必要です。
http://arduino.esp8266.com/stable/package_esp8266com_index.json
をArduino IDEのPreferenceに追加して、追加のボード設定をダウンロードします。追加されたらIDEを再起動して、Tools > Board > WeMos D1 R1
を選択します。
WeMos D1は CH340
というUSB-シリアル変換チップを使っているので、環境によってはドライバのインストールが必要かもしれません。CH340 Drivers for Windows, Mac and Linux
導入についての詳しくはここのサイトによくまとまっています ESP8266 Thing Hookup Guide - learn.sparkfun.com
以下のプログラムをデバイスにインストールするとアナログピンの入力をOSCで送ってくれます。詳しくは流れで解説します。
#include <ESP8266WiFi.h>
#include <WiFiUDP.h>
#include "oscpkt.hh"
const char* ssid = "**WIFI-SSID**";
const char* password = "**WIFI-PASSWORD**";
static WiFiUDP wifiUdp;
static const char *kRemoteIpadr = "192.168.0.9";
static const int kRmoteUdpPort = 9000;
void setup() {
Serial.begin(9600);
delay(10);
Serial.println("start");
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
void loop() {
int sensorValue = analogRead(A0);
oscpkt::PacketWriter pw;
pw.init();
oscpkt::Message msg;
msg.init("/test");
msg.pushInt32(sensorValue);
pw.addMessage(msg);
if (pw.isOk())
{
wifiUdp.beginPacket(kRemoteIpadr, kRmoteUdpPort);
wifiUdp.write(pw.packetData(), pw.packetSize());
wifiUdp.endPacket();
}
delay(10);
}
UDP — ESP8266 Arduino Core 2.4.0 documentation
Node.jsでFirmataを使う
TouchDesignerでFirmataを使っていましたが、いかんせん挙動が不安定なのでもしかしたらNode.js
を通してOSC経由で使ったほうが安心して使えるかもしれません。Johnny-Five
というライブラリがサンプルもたくさんあっておもしろそうです。
node-firmata
のフォルダにサンプルを入れておきました。
みたいな感じで動くとおもわれます