映像音響処理概論 2018

第十九回

本日の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 から値を変更できます。入力に設定したピンの値は、analogdigital の 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 のフォルダにサンプルを入れておきました。

みたいな感じで動くとおもわれます

comments powered by Disqus