振動マイク試作 (ピエゾマイク)
ピエゾマイク試作 from poipoi on Vimeo.
ピエゾ素子を使った振動マイクの試作。 紙をペンでなぞる音など、微かな音を増幅させて取得できる。
Today's Document

Discoholic 🪩
let's talk about Bridgerton tea, my ask is open

if i look back, i am lost

No title available
Xuebing Du
ojovivo
Sweet Seals For You, Always

ellievsbear
PUT YOUR BEARD IN MY MOUTH

Jar Jar Binks Fan Club
noise dept.

Product Placement

roma★
One Nice Bug Per Day
No title available

No title available
🩵 avery cochrane 🩵

❣ Chile in a Photography ❣
Noah Kahan

seen from United States
seen from Brazil

seen from Colombia

seen from United States

seen from Switzerland

seen from Bangladesh

seen from Malaysia

seen from Philippines
seen from Nepal

seen from United States
seen from United States

seen from Switzerland
seen from United States
seen from India
seen from Türkiye
seen from France
seen from United States

seen from Switzerland
seen from Vietnam
seen from Ukraine
@poipoi-lab
振動マイク試作 (ピエゾマイク)
ピエゾマイク試作 from poipoi on Vimeo.
ピエゾ素子を使った振動マイクの試作。 紙をペンでなぞる音など、微かな音を増幅させて取得できる。
Skeleton Display (ディスプレイトラッキングシステム)
Skeleton Display from poipoi on Vimeo.
ディスプレイをトラッキングするテスト。 手動で自由にディスプレイを動かしても表示される内容が追従されるシステム。
Full Color LED Matrix Arduino Shield
Arduino 用 Full Color LED Matrix シールド Arduino UNO R3 に接続することで Arduino から LED Matrix を制御することができる。
Water Living Things (水のタッチセンサ)
Water Living Things from poipoi on Vimeo.
水のタッチセンサを使ったインスタレーション。 水に触れたことをタッチセンサでセンシングし、透明フィルムに投影されたプロジェクション画像に演出を与えている。
【openFrameworks】 Windows + VC++ ofxUI の導入
ひさびさの投稿ですが oF ネタです。
openFrameworks で設定画面を作成したく、 ofxUI というアドオンを導入しました。
…が、Windows + VC++ 環境ではちょっとしたワナがいくつかあってハマりかけたので 備忘録的な意味で導入How to をメモっときます。
ちなみに環境は以下の通り
Windows 8
Microsoft Visual C++ 2010 Express
openFrameworks v0.7.4 VS2010 版
1.ofxUI アドオンをゲットする 以下のGitHub ページから「ZIP」の項目を選択してダウンロード。 https://github.com/rezaali/ofxUI 解凍してできたディレクトリを「ofxUI-master」→「ofxUI」に名称を変更しておく。
2.Addons 置き場へ置く (oF ディレクトリ)\addons に上記ディレクトリをコピー。 なかにサンプルプログラムも一緒に入っているので、 気になる人はそれらを(oF ディレクトリ)\examples 以下にでも移動しておく。
3.新規ソリューション作成 とりあえず、新規ソリューションを作成してみる。 (oF ディレクトリ)\apps\myApps 内の「emptyExample」をコピーして任意の名前に変更。 ディレクトリ内の「emptyExample.sln」を起動。
4.インクルードパスの設定 ソリューションエクスプローラ内の「emptyExample」を右クリック→「プロパティ」を選択。 「構成プロパティ」→「C/C++」→「全般」を選択。 「追加のインクルード ディレクトリ」の欄に以下の3つを追加
..\..\..\addons\ofxUI\src
..\..\..\addons\ofxXmlSettings\src
..\..\..\addons\ofxXmlSettings\libs
※ ofxUI は内部で ofxXmlSettings を使用しているようなので、そっちにもインクルードパスを通しておく必要あり。
5.アドオンソースの登録 ソリューションエクスプローラ内の「emptyExample」以下に下記のようにフィルター(ディレクトリ?)作成。(作らなくても動くと思うケド。。。) [addons] ├[ofxUI] └[ofxXmlSettings] で、作成した [ofxUI] に (oF ディレクトリ)\addons\ofxUI\src の中身をすべてドラッグ&ドロップ。 同様に、ofxXmlSettings に (oF ディレクトリ)\addons\ofxXmlSettings\src と (of ディレクトリ)\addons\ofxXmlSettings\lib の中身をすべてドラッグ&ドロップ。
6.動確用ソースを書いてみる で、とりあえずテストとして以下のようにソースを変更してみる。
【testApp.h】 #pragma once #include "ofMain.h" #include "ofxUI.h" class testApp : public ofBaseApp{ public: void setup(); void update(); void draw(); void keyPressed(int key); void keyReleased(int key); void mouseMoved(int x, int y); void mouseDragged(int x, int y, int button); void mousePressed(int x, int y, int button); void mouseReleased(int x, int y, int button); void windowResized(int w, int h); void dragEvent(ofDragInfo dragInfo); void gotMessage(ofMessage msg); private: ofxUICanvas *p_gui; }; 【testApp.cpp】 #include "testApp.h" //-------------------------------------------------------------- void testApp::setup(){ ofEnableSmoothing(); ofBackground(0x80); int canvasWidth = 300; int widgetWidth = canvasWidth - (OFX_UI_GLOBAL_WIDGET_SPACING * 2) - 1; p_gui = new ofxUICanvas(canvasWidth, ofGetHeight()); p_gui->addSlider("Slider1", 0.0, 255.0, 0.0, widgetWidth, 15); p_gui->addSlider("Slider2", 0.0, 255.0, 0.0, widgetWidth, 15); p_gui->addSlider("Slider3", 0.0, 255.0, 0.0, widgetWidth, 15); }
7.エラー修正 で、ビルドしてみるとたぶんエラーが出ます(笑) エラー箇所を見てみると「ofxUICanvas.h」の以下のコードの部分でテンプレート系っぽいごちゃごちゃっとしたエラーが出てます。
//for the map map<string, ofxUIWidget*>::iterator it; it=widgets_map.find(widget->getName());
これを以下のように変更します。
//for the map multimap<string, ofxUIWidget*>::iterator it; it=widgets_map.find(widget->getName());
(どうも std::multimap 用イテレータを を std::map 用イテレータ に変換しようとして怒られてるらしいので、multimap 用イテレータに合わせてあげる)
8.フォントを追加する あと、実行形式があるディレクトリ内の所定の位置にフォントデータを入れてあげないと文字が表示されないので、 サンプルの example-ofxAllWidgets\bin\data\GUI あたりから「NewMedia Fett.ttf」をもってきて、 今作成中のソリューションディレクトリ以下の \bin\data\GUI\ にコピーする。
これで一応動くようになるはずです。
ご参考までにー
【Arduino x Processing】 A/D 値まとめて取り込み → GitHub にあげてみた
昨日投稿した、Arduino と Processing を使った A/D 取り込みのソース、 GitHub にあげてみました!
…いや、ね。わかってますよ。公開するほどのソースじゃないって。 でもね、GitHub 使ってみたかったのですよ。 結構前にアカウント取得してからずっと放置だったので。。。
ということで、以下!
Arduino 側 https://github.com/poipoi/AnalogSerialRead
Processing 側 https://github.com/poipoi/BasicSerialReceiveClass
参考サイトはこちら Subversion ユーザーが Git を使ってみた
元 Subversion 使いの私には非常にわかりやすかったです!
ということで、本日は以上です。
【Arduino x Processing】 A/D 値まとめて読み込み
# 2013/04/05 追記 ソースコード、GitHubに公開してみました!→こちら
--------------------
前回、Arduino 側の AnalogRead -> Serial 転送をサンプルそのまんまでやってました。 でも、Processing 側の文字列→数値変換のためのコードが結構複雑になってきて、 これ文字列に変換して送信するよりも数値データとして送信しちゃったほうがなにやらいい感じなのでは?と思い始めました。 したがって今回はそこらへんの実装を。
まず、Arduino 側で数値データで転送するような仕組みを追加。 ただし、そのまま何も考えずにやると Processing 側でデータを取得した時に、データの境目が不明になってしまいます。 なので、Host 側からある特定のデータを受信したときのみ、データ転送を1度行うような処理に変更。 参考は以下 建築発明工作ゼミ2008: Arduino-Processing シリアル通信1 あと、いちいちセンサ類を追加したときに Arduino 側に変更を入れるのがメンドクサイ保守性に欠けるので、Analog Read 用 Port のデータを全転送するような処理に変更。 ということで完成したコードは以下。
void setup() { Serial.begin(9600); } void loop() { if (Serial.available() > 0) { int recVal = Serial.read(); if (recVal == 0x11) { // 測定開始 uint8_t buff[12]; // 4byte * 6 for (int i = 0; i < 6; i++) { int sensorValue = analogRead(i); buff[i * 2 + 0] = (sensorValue >> 8) & 0xFF; buff[i * 2 + 1] = sensorValue & 0xFF; } Serial.write(buff, sizeof(buff)); } } delay(1); }
この簡潔なコードで済むとか、Arduino すごいですね。
で、つぎは動作確認用にProcessing側の実装を。。。 ポイントは上でも書いたとおり、
受信データは数値データとして扱う
受信開始用データを通信開始時と受信完了時に投げる。
受信データ用のクラスを用意してデータを取得しやすくする
あと、最新データ取得用 (getLatestData)、最古データ取得用(getData)、受信バッファ丸ごと取得用 (getDataBuff)、の3種類のデータ取得方法を実装してみた。 コードは以下。 MainClass
import processing.serial.*; SerialNumReceiver receiver; void setup() { receiver = new SerialNumReceiver(this); } void draw() { } void serialEvent(Serial p) { receiver.receive(); } void keyPressed() { SerialReceiveData data; switch (key) { case 's': // "start" Test receiver.start(); println("start"); break; case 'g': // "getData" Test data = receiver.getData(); if (data == null) { println("null"); } else { printAnalogData(data); } break; case 'G': // "getDataBuff" Test SerialReceiveData[] datas = receiver.getDataBuff(); if (datas == null) { println("null"); } else { for (SerialReceiveData eachData : datas) { printAnalogData(eachData); } } break; case 'l': // "getLatestData" Test data = receiver.getLatestData(); if (data == null) { println("null"); } else { printAnalogData(data); } break; } } void printAnalogData(SerialReceiveData data) { int[] analogDatas = data.getAnalogDatas(); for (int analogData : analogDatas) { print(analogData); print(","); } println(); }
SerialNumReceivera
import processing.serial.*; // シリアル受信データ用クラス public class SerialReceiveData { private static final int ANALOG_PORT_MAX_NUM = 6; private int analog[] = new int[ANALOG_PORT_MAX_NUM]; public SerialReceiveData(byte[] dataBuff) { setData(dataBuff); } public void setData(byte[] dataBuff) { for (int i = 0; i < ANALOG_PORT_MAX_NUM; i++) { analog[i] = (dataBuff[i * 2 + 0] << 8) & 0xFF00; analog[i] += dataBuff[i * 2 + 1] & 0xFF; } } public int getAnalogData(int portNum) { if ((portNum >= 0) && (portNum < ANALOG_PORT_MAX_NUM)) { return analog[portNum]; } else { return 0; } } public int[] getAnalogDatas() { return analog; } } // シリアル受信用クラス public class SerialNumReceiver { private Serial serial; private ArrayList dataBuff = new ArrayList(); public SerialNumReceiver(PApplet app) { String[] portStrs = Serial.list(); serial = new Serial(app, portStrs[0], 9600); } public boolean isReady() { return (dataBuff.size() > 0); } public SerialReceiveData getLatestData() { if (isReady()) { return dataBuff.get(dataBuff.size() - 1); } else { return null; } } public SerialReceiveData getData() { if (isReady()) { SerialReceiveData data= dataBuff.get(0); dataBuff.remove(0); return data; } else { return null; } } public SerialReceiveData[] getDataBuff() { if (isReady()) { SerialReceiveData[] datas = dataBuff.toArray(new SerialReceiveData[0]); dataBuff.clear(); return datas; } else { return null; } } public void start() { serial.write(0x11); } public void receive() { int len = serial.available(); if (len >= 12) { byte[] buff = new byte[12]; serial.readBytes(buff); serial.clear(); /* // --- FOR_DEBUG--- print("Rec:"); for (byte data : buff) { print(Integer.toHexString(data & 0xFF)); print(","); } println(); // --- FOR_DEBUG --- */ dataBuff.add(new SerialReceiveData(buff)); if (dataBuff.size() > 100) { dataBuff.remove(0); } serial.write(0x11); } } }
と、こんな感じでとりあえず実装完了。(ちょっと冗長な部分あるかも…) テストも良好でした。
今回は文字だらけの内容になってしまいました…。 なにか、もっとビジュアル的にかっこいいことしたいなぁ。。。
Arduino さわってみた
さて、はじめての Lab 投稿ですが、 先日買った Arduino UNO をさわってみた状況をリポートしてみます。
まず、自宅に届いたときの写メ
なかなかオシャレな箱に入っておりました。 しかも、想像よりだいぶ小さい! たばこのパッケージの半分くらいの面積。 マイコンの評価ボードってアホみたいにごついの多いから、よくまとまってるなーっていう印象でした。
で、本日。 さっそく開発環境を整えてみました。
・・・といっても、やることは
・Arduino 開発環境のダウンロード&解凍
・Driver インストール(Windows なので)
のみ。
唯一ちょっと面倒だったのは、環境が Windows 8 64bit だったので Driver のインストール方法が少し特殊でした。 でも、Switch Science で解説記事があったので参考にしてすぐインストール完。
Windows 8でArduino Unoを使ってみた。
開発環境はこれだけで準備完了!簡単すぎです。
で、せっかくなのでためしになにか作りたいなーとなったので、 Arduino で A/D 値取得して、Processing で受け取ろうかなーなどと画策。。。
で、これもものすごく簡単でした。
まずは適当にブレッドボードで回路作成 (とりあえず単純に 100k の抵抗と 100k の可変抵抗で分圧) で、これを Arduino のA0 端子に接続。
こんな感じで。
で、じつは Arduino の開発環境に AnalogRead して Serial で Host に送るっていうサンプルがすでにある(!)ので、それを開きます。 (「ファイル」→「スケッチの例」→「01.Basics」→「AnalogReadSerial」)
で、コンパイル→書き込み。
ためしに Tera term で COM Port 開いてみると…
というかんじで値が読めてる! もちろん、可変抵抗動かすと 0 ~ 512 付近まで値がうごきます。
(Arduino の AnalogRead が 0 ~ 1024 までで、同じ抵抗値で電圧を2分割してるので真ん中の 512 付近までの出力になります。 ちなみに微妙に抵抗と可変抵抗の値に多少誤差があるので 512 少しオーバーするくらいまで値は出ました)
これで Arduino 側は終了。 簡単すぎます。
で Processing 側。
これも、Serial 通信用ライブラリがすでにあるので、それを読み込んで値を表示するだけ。 以下のサイトを参考にしつつちょっと手を加えて、1Line 読み込むごとに値を整形して、それを Interger に変換するようにしました。
建築発明工作ゼミ2008: Arduino-Processing シリアル通信1
で、Console に出力してみたのが以下。
いい感じに読めてます。
ちなみに最初 Processing 2.0 Beta 8 でやったのですが 「serial does not run in 64-bit mode.」とかっていうエラーが出てなぜか動かず。 Arduino の Forum に同じような質問をみつけ、どうやら Ver. 1.5.1 ではできるようなのでそちらで実行。 無事動きました。
Processing on Windows 7 64 bit - Arduino Forum
さて、ここまで来たので以前遊びで作った 値が増えると画面上のカラーバーが上下する Processing スケッチと合体。
結果、こんな感じです。
とまあこんな感じです。
開発環境そろえてからここまでで経過時間1時間ちょっと! 普通のマイコン開発ボードとかじゃ開発環境整えるだけで1日がかりとかですよ。 どれだけ楽なんだよ Arduino!
ということで、とりあえずまずは初レポート終了。
次回はなにかセンサーでもつなげてみたいなぁと思ってます。