coma Study Room! ! 2013.11.16! @BULLET’S! presented by coma team Contents! ! 1.! Arduino + Processing! ! ! ! ! Workshop! 2.! openFrameworks + Node.js! ! ! Workshop! ! Special Talk Session! ! ! 3.! The Breadboard Band ! ! ! !
Arduino + Processing! Workshop! ! comakumaのつくりかた! ! coma team  Eto Haruhiko 1.! イントロダクション! ! ! ! ! ! 
 2. !センサで世界を見る! ! ! ! ! ! ! 3.! Arduinoことはじめ!! ! ! ! ! ! 4.! Let’s 工作!! ! ! ! ! 6.! ソースコード解説! ! ! 5.! 遊んでみよう! 7.! OSCでデータを送ろう! ! ! ! ! ! 8.! 実用に向けてのTips! ! ! ! ! !
ねらい ・自分だけのインタラクティブなモノを作りたい! ・Arduinoに興味がある! ・ちょっと遊んだことがあるけどよくわからなくて飽きた! ・本を読んで勉強したけど応用をひろげられない! ①こうした方々が,自力で継続的にモノを作っていけるように! ②センサからのデータ取得とLEDの制御という基本を覚える! ! 心配ごと&おねがい! ! 人数が多いので,上手く動かない人が何人か出ると思います。
 ぜひともお互いに助け合って教え合ってください。
1.!! イントロダクション
What’s the comakuma? ・前回のcoma discotheque Ver.0.02で使用した!  加速度センサを内蔵したリラックマ型ガジェット! ! ・comakumaをだっこして踊る人々の動きをセンシングして   !  フロアの映像に反映! ! ・激しく目が発光! ! ・かわいい!
What’s the comakuma? comakumaのしくみ! comakuma本体 加速度度センサで
 加速度度を検出   Arduinoで   データを取得   XBeeでデータを   ワイヤレス送信   (シリアル通信) PC Processingで
 データを取得 OSCで
 データ送信 openFrameworks   で映像を描画 ※省省略略可 プロジェクション 加速度度に応じて   RGB-‐‑‒LEDを点灯
What’s the comakuma? comakumaのしくみ! comakuma本体 加速度度センサで
 加速度度を検出   Arduinoで   データを取得   シリアル通信
 (有線) PC Processingで
 データを取得 OSCで
 データ送信 openFrameworks   で映像を描画 ※省省略略可 プロジェクション 加速度度に応じて   RGB-‐‑‒LEDを点灯 本⽇日はこのシステムを作ります
2.!! センサで世界を見る
センサとは?! ! ・機械にとっての感覚器! ! ! ⾳音  光  ⼒力力  電気  磁気  化学物質   ! 温度度  湿度度  放射線   ! ! 映像  距離離  加速度度  ⾓角度度  ⽅方位   ! 圧⼒力力  振動   ! などなど   !物理理量量,化学量量   ! ! 音 ! 電気信号に変換   光 ! 力 ! 熱  センサ   感覚器 Arduino
 PC   出⼒力力装置(素⼦子) 脳みそ 手足 ・センサがあることで機械は外界に開かれたシステムとなる! ・モータ,スピーカ,LED,ディスプレイ等々使えば!  外界に反応するだけでなくセンサデータに基づいて!  外界に影響を及ぼすこともできる ! etc.
加速度センサとは?! ! ・まず,加速度とは! ! 加速度 = 速度の時間変化! ! 2秒後   ⼒力力   ! ⼿手で押す   ⾵風が吹く   アクセルを吹かす   ⽌止まっている⽟玉   5cm/秒   2秒間で⽌止まっていた⽟玉が秒速5cmの速さになった   ! 加速度度は  5cm/秒  -‐‑‒  0cm/秒     =  2.5cm/秒/秒       2秒
加速度センサとは?! ! ! ・実際には素子内部の重りの位置変化を見ている! ・鉛直方向では重力のため重りは常に床へひっぱられ,!  一定の力がはたらいている! ! ! 加速度の検出! ! ! 力の検出,モノ・人の動きの検出!  ! ! 傾き 振動 衝撃 etc.
応用のひろげかた! ! ! ・センサの原理をおさえる! ・適切なシチュエーションを設定する! ・目的から逆算する! ! (例)スイッチ!  電流のON/OFFを切り替える単純な部品だが!  これだってシチュエーション次第でセンサになる!  写真は「部屋を明るく/暗くしたい」人の動作を!  検出するセンサとしての役割を果たしている例! ! ! ! ! ! ! ! ! ! ! ! こじつけっぽいけど。。! (例)comakuma!  ぬいぐるみに入れることで間接的に人の動きを検出する !
3.!! Arduinoことはじめ
Arduinoとは?! ! ! ・手軽に使えるマイコンボードとその開発環境!  言語はC/C++をベースにしたArduino言語! ! ・接続したセンサの情報を読み取って何かを動かしたり,!  PCに情報を送ったりできる! ! ・ピン数,クロック,メモリ,サイズなどが異なる!  色んな種類があり,目的に応じて使い分ける! ・基本はArduino Uno(あまりこだわる必要なし)! ! ! オープンハードウェアなので! ! 部品を買ってきて自作も可能
Arduinoとは?! ! ! ・パソコンとUSBケーブルでつないで,専用の開発環境(IDE)!  で行わせたい処理をプログラミングする! ! ・Arduinoのプログラムはスケッチと呼ばれる! ・ピン数,クロック,メモリ,サイズなどが異なる!  色んな種類があり,目的に応じて使い分ける! ・基本はArduino Uno(あまりこだわる必要なし)! ! ! オープンハードウェアなので! ! 部品を買ってきて自作も可能
Arduinoの構成   〜~Unoの場合〜~   他も基本は同じ ・USB端⼦子     5V給電     通信  
Arduinoの構成   〜~Unoの場合〜~   他も基本は同じ   ・USB端⼦子     5V給電     通信 ・アナログ⼊入⼒力力ピン     センサの出⼒力力ピンとつなげる     今回3軸加速度度センサのx,y,zの     値を読むので     A0,A1,A2の3本を使⽤用
Arduinoの構成   〜~Unoの場合〜~   他も基本は同じ   ・デジタル出⼒力力ピン   ・〜~が付いているのは疑似アナログ出⼒力力(PWM)に使える       →  LEDの明るさを変える,モーターの回転速度度を変える   今回RGB-‐‑‒LEDの3⾊色を制御するので~∼9,~∼10,~∼11の3本を使⽤用 ・USB端⼦子     5V給電     通信 ・アナログ⼊入⼒力力ピン     センサの出⼒力力ピンとつなげる     今回3軸加速度度センサのx,y,zの     値を読むので     A0,A1,A2の3本を使⽤用
Arduinoの構成   〜~Unoの場合〜~   他も基本は同じ   ・デジタル出⼒力力ピン   ・〜~が付いているのは疑似アナログ出⼒力力(PWM)に使える       →  LEDの明るさを変える,モーターの回転速度度を変える   今回RGB-‐‑‒LEDの3⾊色を制御するので~∼9,~∼10,~∼11の3本を使⽤用 ・USB端⼦子     5V給電     通信 ・アナログ⼊入⼒力力ピン     センサの出⼒力力ピンとつなげる     今回3軸加速度度センサのx,y,zの     値を読むので   ・5Vピン,3.3Vピン     センサへの電源供給に使⽤用     今回使う加速度度センサは3.3Vで動くので3.3Vピンを使⽤用   A0,A1,A2の3本を使⽤用
Arduinoの構成   〜~Unoの場合〜~   他も基本は同じ   ・デジタル出⼒力力ピン   ・〜~が付いているのは疑似アナログ出⼒力力(PWM)に使える(0〜~5V)       →  LEDの明るさを変える,モーターの回転速度度を変える   今回RGB-‐‑‒LEDの3⾊色を制御するので~∼9,~∼10,~∼11の3本を使⽤用 ・USB端⼦子     5V給電     通信 ・アナログ基準電圧ピン
   アナログ⼊入⼒力力ピンの基準電圧を     ⼊入⼒力力する     基本的にセンサの電源電圧と     同じにすればOK     今回は3.3Vを⼊入れる   ・グランドピン(複数有)
   センサやLEDのグランドをここに接続 ・アナログ⼊入⼒力力ピン     センサの出⼒力力ピンとつなげる     今回3軸加速度度センサのx,y,zの     値を読むので   ・5Vピン,3.3Vピン     センサへの電源供給に使⽤用     今回使う加速度度センサは3.3Vで動くので3.3Vピンを使⽤用   A0,A1,A2の3本を使⽤用
4.!! Let’s 工作!
必要な部品一覧! ! ! ! ・Arduino(Uno,Nano,Leonardo,Microなど)! 1個! ・USBケーブル! ! ! ! ! ! ! ! ! ! ! ! 1本! ・加速度センサ KXR94-2050 (秋月電子)! ! ! ! ! 1個! ・RGB-LED OSTA5131A (秋月電子)! ! ! ! ! ! 1個! ・カーボン抵抗 150Ω! ! ! ! ! ! ! ! ! ! 4個! ・ブレッドボード! ! ! ! ! ! ! ! ! ! ! 1個! ・ジャンプワイヤ! ! ! ! ! ! ! ! ! !  14本! ! ! !
今回の工作を通して身につけたいこと! ! Arduinoを使って何か作ろう。。センサやLED,モーターを買ってみよう。。! → とりあえず秋葉原へ行ってみる! ! 通販サイトを覗く! ! 眼前に広がる意味不明空間! ! ́ 加速度センサってどう使えばいいの?どれを選べばいいの? ⁝(ृʾ꒳ʿ ृ̀ )ु⁝! RGB-LEDってどう使えばいいの? ⁝(ृ ›×‹` ृ )ु⁝ ピィ! ! \\ ピイイ。゚c(゚´ω`゚)っ。イイイ //! ! 加速度センサ,RGB-LEDは今回あくまでも一例! 他の素子にも応用可能な最低限の「使い方の理解のしかた」を押さえる! ! ※知らない単語を調べる作業は頻繁に発生します
加速度センサの使い方を把握する(他のセンサでも同様の手順)! とりあえず販売元のページを見てみる
加速度センサの使い方を把握する(他のセンサでも同様の手順)! とりあえず販売元のページを見てみる 基本的な仕様が書いてある
加速度センサの使い方を把握する(他のセンサでも同様の手順)! とりあえず販売元のページを見てみる 基本的な仕様が書いてある 3.3V電源で動かしなさいということ
加速度センサの使い方を把握する(他のセンサでも同様の手順)! とりあえず販売元のページを見てみる 基本的な仕様が書いてある 3.3V電源で動かしなさいということ この電源電圧範囲なら動くよ,ということ
加速度センサの使い方を把握する(他のセンサでも同様の手順)! とりあえず販売元のページを見てみる Arduinoには3.3Vピンが あるから,そこからセンサに 電源供給すればいい! ! 電圧についてはわかったけど, どうやって使えばいいの? なんかピンがいっぱいあるし… ! マニュアル or データシート を見てみる 基本的な仕様が書いてある 3.3V電源で動かしなさいということ この電源電圧範囲なら動くよ,ということ
マニュアルを見てみる
マニュアルを見てみる ・各ピンの使い方 ・基板に対するx,y,z軸の向き  が書いてあるのでこれに従って配線する.  軸の向きを把握しておくことは作ったものとセンサの  天地が逆になったりすることを防止するために重要.     今回のワークショップではここが見れれば十分です 
マニュアルを見てみる ・各ピンの使い方 ・基板に対するx,y,z軸の向き  が書いてあるのでこれに従って配線する.  軸の向きを把握しておくことは作ったものとセンサの  天地が逆になったりすることを防止するために重要.     今回のワークショップではここが見れれば十分です  3.3V電源のところを見る. ・1gの出力振幅(感度=センサの性能)  加速度1gあたり660mVの電圧変化があるということ. ・オフセット電圧  0g,つまり加速度を検出していない状態での電圧値.  平らな台にセンサを置いたとき,   x,y軸(6番ピン,7番ピン)で出力される電圧は  大体この値になるはず.  このときz軸には重力(1g)が働いているので  1.65V+0.66V=2.31V よって2.31Vくらいになるはず まともに測れているかどうかの診断に重要な情報
マニュアルを見てみる ・各ピンの使い方 ・基板に対するx,y,z軸の向き  が書いてあるのでこれに従って配線する.  軸の向きを把握しておくことは,作ったものとセンサの  天地が逆になったりすることを防止するために重要.     今回のワークショップではここが見れれば十分です  配線について整理すると ! 1番ピン・・・Arduino 3.3Vピンとつなぐ 2番ピン・・・Arduino 3.3Vピンとつなぐ 3番ピン・・・Arduino GNDピンとつなぐ 4番ピン・・・なにもつながなくてOK 5番ピン・・・Arduino GNDピンとつなぐ 6番ピン・・・Arduino アナログ入力ピンとつなぐ 7番ピン・・・Arduino アナログ入力ピンとつなぐ 8番ピン・・・Arduino アナログ入力ピンとつなぐ ! ということがマニュアルからわかった! これで回路が組める!
RGB-LEDの使い方を把握する! とりあえず販売元のページを見てみる 基本的な仕様が書いてある
RGB-LEDの使い方を把握する! とりあえず販売元のページを見てみる 基本的な仕様が書いてある この電圧で動かしなさいということ 20mA以上の電流を 流さないでねということ LEDはダイオード 流していい電流の向きが決まってるから 逆向きに5Vかけないでねということ
RGB-LEDの使い方を把握する! とりあえず販売元のページを見てみる LEDに流す電流を20mA以下とするために 抵抗をつなげましょう。 とりあえず安全を見て10mA流すことにします。 ! アナログ出力(PWM)ピンからは最大5V出るので
 LEDに5Vがかかったときに 10mA流れるようにします。
 ! そのときの抵抗は
 
 オームの法則から R(抵抗)=V(電圧)/I(電流) なので 抵抗にかかる電圧,流れる電流を考えると ! 赤の場合 R赤=(5V-2V)/0.01A=300Ω以上ならOK 基本的な仕様が書いてある この電圧で動かしなさいということ 20mA以上の電流を 流さないでねということ ! 緑,青の場合 R緑or青=(5V-3.6V)/0.01A=140Ω以上ならOK 
 150Ωを直列に2個つなげば300Ωとなるので, 150Ωの抵抗が4個あれば良さそうです。 LEDはダイオード 流していい電流の向きが決まってるから 逆向きに5Vかけないでねということ
RGB-LEDの足の役割は?! さっきのページに図が載ってたのでそれを見る RGB-LEDは3個のLEDがグランドを共有して! 合体した構造になっている! ! ③Common Cathode = グランドです。!  一番長い足がグランド!!!! ! ③をArduinoのグランドにつなげて,! ①,②,④をそれぞれArduinoの! アナログ出力ピンにつなげてあげれば良いと! わかった! 今回はデジタル9,10,11番のピン(PWM)を! 使います! ! ただし先ほど計算して求めた抵抗を! 間に挟むことを忘れずに! ! これでようやく! 配線できる準備が整いました!
配線をしましょう! ! これまでの検討で! ・Arduinoの各ピン! ・加速度センサの各ピン! ・RGB-LEDの足! の互いの接続先がわかりました! ! 電気的に接続するために! 今回はブレッドボードを使います これ ハンダ付け不要でプロトタイピングに便利
ブレッドボードの使い方! ・配線の中継 or 分岐ができる! ・矢印の向きの列が裏側で繋がっている! ・ジャンプワイヤをぶっ挿して配線する 電源ライン! 横1列が導通 縦一列が導通 縦一列が導通 電源ライン! 横1列が導通
ブレッドボードには色々あるので注意 電源ライン(+側)が中央で切れている! 裏側を見なくても表側にプリントされている赤線と黒線を見ればわかる! 赤線だけボード中央で切れてますね このタイプのものは,次ページ以降の回路図通りに配線するとセンサへ3.3Vが給電されません! 中央をワイヤで接続するか,全ての電源線(+)を右側か左側に寄せる必要がある! たとえば3.3Vで動作する素子と5Vで動作する素子を一つのボード上で使いたい場合に便利
※回路路図エディタのライブラリに同型の加速度度センサがなく⾃自作する時間も     なかったので⾒見見た⽬目だけ似てる別の素⼦子を使ってます。許してください。 Arduino Nanoの場合 ジャンプワイヤは⽤用途ごとに⾊色を使い分けると回路路の把握がしやすく修正も楽です。   たとえば⾚赤:電源+,⿊黒:グランド;⽩白:信号線など。 8 5 1 4
Arduino Unoの場合 8 5 1 4
Arduino Microの場合 8 5 1 4
Arduino Leonardo! の場合 8 5 1 4
配線が完了したらUSBケーブルで! ArduinoとPCを接続してみましょう! Arduino Micro,Leonardoの場合! Macだとキーボード設定アシスタントが! 起動しますが何も考えず閉じてOKです! ! 興味ある人はググってください! 色々と面白いことができます! ぶっ挿す
スケッチを書き込みましょう! ! Arduino IDEを立ち上げて
 ファイル→開く(または O,Ctrl+O)で! スケッチcomaSR_RGBrandom.inoを開く!
スケッチの書き込み⼿手順   (1)シリアルポート選択   ! ! ! ・ツール→シリアルポート
   でArduinoが繋がっているポートを選ぶ   ! 間違っている状態で   書き込もうとするとエラーが出ます
スケッチの書き込み   (2)マイコンボード選択   ! ・ツール→マイコンボード
   で⾃自分のArduinoと同じものを     選ぶ   ! ・UnoならUno   ・Nanoならnano  w/ATmega328   ・LeonardoならLeonardo   ・MicroならMicro   !   間違ってる状態で書き込もう     とするとエラーが出ます   ! ここまでできたら書き込みボタン   (→ボタン)を押す   ! 書き込み完了了後,   LEDがランダムに点滅
5.!! 遊んでみよう
oscP5をインストールする! ! oscP5:ProcessingでOSCを利用するためのライブラリ! ! (1)! http://www.sojamo.de/libraries/oscP5/! ! からoscP5のzipファイルをダウンロード! ! (2) 解凍したフォルダをProcessingのスケッチフォルダ内! ! 「libraries」フォルダに移動させる! ! (3)! Processingを立ち上げていた場合は一旦再起動! ! (4) Processingメニュー → Sketch → Import Library…で! ! 表示されるライブラリ一覧にoscP5があることを確認する!
とりあえず動かしてみましょう! ! (1)! Processingを立ち上げて
 ! ファイル→開く(または O,Ctrl+O)で! ! スケッチcomaSR.pdeを開く! ! (2)! Runボタン(→ボタン)を押して実行! ! または R,Ctrl+R
シリアルポートの設定(Processing 1.5,2.0)! ! 実行後Processingのコンソールに! シリアルポート一覧が表示される! ! Arduinoが接続されているポート番号を! ここに書き込む! int Arduino = ポート番号 ; とする! ! シリアルポート 一覧
シリアルポートの設定(Processing 2.1)! ! 実行後Processingのコンソールに! シリアルポート一覧が表示される! ! Arduinoが接続されているポート番号を! ここに書き込む! int Arduino = ポート番号 ; とする! ! ポート番号は0から始まるので注意! ! シリアルポート 一覧
遊んでみる! ! シリアルポートを設定後再度実行! ! こんな画面が出てくるので画面上をクリック! 3Dの球が表示される! 画面上をどこでもいいのでクリック! ! (クリックでArduinoとの通信開始)! 回路を指でつついたり! 手に持って振ってみると! ・球が動く & 色が変わる! ・振る方向でLEDの色が変わる 停止したいときはEscを押すかProcessingの停止ボタン(■ボタン)を押す
他のスケッチをためす! ※変更のたびArduinoに書き込みが必要! ! ! ! ! 対応するProcessingスケッチ! ・comaSR_RGBthreshold.ino! ! ! ・comaSR.pde! ! ・comaSRminim.pde! Arduinoスケッチ! ! ! ! ! ①加速度が閾値を超えるとLEDが発光! ②加速度の値に応じて色が変化! ! ! ・comaSR_minim.ino! ! ! ! ①マイク入力の音量が閾値を超えると!  LEDが発光(声や音楽に連動して光る)! ②加速度の値に応じて色が変化! ! !
遊びを終えるとき! ! ! ! ①Processingのスケッチを停止する! (EscキーまたはProcessingの停止ボタン■を押す)! ! ②ArduinoのUSBケーブルをPCから抜く! ! !  一度書き込んだスケッチはArduinoのメモリに保存されるので,!  電源を切っても(=PCとの接続を切っても)消えません。! !  次回遊ぶ際はProcessingスケッチを実行するだけでOKです。! !
6.!! ソースコード解説
Arduinoスケッチの基本的構造! ! ! 変数 = 数や文字の入れ物 使う変数はまず宣言しておくことが必要 (データを記憶するメモリを確保) void setup(){! ! ! 関数外で宣言された変数はすべての関数で使用可能(グローバル変数) 逆に関数内で宣言された変数はその関数でしか使えない(ローカル変数) 使う変数の宣言! 初期設定! ! }! ! void loop(){! ! 繰り返し処理! ! }! 今回は ・Arduinoで読み取った加速度の値 ・シリアル通信でProcessingに送る加速度の値 ・LEDの明るさパラメータ ・LED点滅パラメータ が必要なのでこれらを宣言しています
Arduinoスケッチの基本的構造! ! 使う変数の宣言! ! void setup(){! ! 初期設定! ! }! ! void loop(){! ! 繰り返し処理! ! }! setup()関数 一度だけ実行され,初期設定を行う ! 今回のスケッチでは 何番のピンを何に使うかの設定,シリアル通信の開始を行っています ! ! 関数とは? データ(引数)を受け取って 決まった処理を実行し,結果(戻り値)を返す命令のまとまり { }の中に処理を書く ! 引数がない=括弧()の中が空 戻り値がない=void型 ! !
Arduinoスケッチの基本的構造! ! 使う変数の宣言! ! void setup(){! ! 初期設定! ! }! ! void loop(){! ! 繰り返し処理! ! }! loop()関数 { }内部に書かれた内容を永遠に繰り返す ! 今回のスケッチでは ・センサからの加速度データ取得 ・シリアル通信で送るために数値のスケールを変換 ・シリアル通信で加速度の値を送信 ・RGB-LEDの発光を制御 を行っています !
comaSR_RGBrandom.ino 変数の宣言
comaSR_RGBrandom.ino setup()関数:初期設定 analogReference(アナログ入力基準電圧タイプ); アナログ入力の基準電圧を設定する  ・EXTERNAL:AREFピンの電圧を基準電圧とする  今の場合3.3V ! pinMode(ピン番号,モード); ピンの入出力モードを設定  ・pinMode(9, OUTPUT):   デジタル9番ピンを出力モードに(LED点灯用) ! Serial.begin(シリアル通信データ転送レート); 任意の転送速度でシリアルポートをオープン  ・Serial.begin(9600):9600bpsで通信開始
comaSR_RGBrandom.ino loop()関数:繰り返し処理 analogRead(ピン番号); 任意のアナログ入力ピンの電圧を取得  ・analogRead(0):アナログ入力0番ピンの電圧を取得 ! map(変数,元の最小値,元の最大値,変換後の最小値,変換後の最大値)  ・map(inX, 0, 1023, 0, 255):   0から1023までの値を取るinXを,   0から255までの値に変換 ! 何故こんなことをするのかというと ・analogReadの読値は0∼1023の1024段階となっている ・一方,シリアル通信で一度に送信できる値は0∼255まで なので,analogReadで読み取った値(inX, inY, inZ)を 0∼255の値にスケーリングしてやる必要がある ! アナログ入力で読み取った値 inX, inY, inZ 0 スケーリング 1024 255 0 シリアル通信で送信する値 outX, outY, outZ ※分解能を落としたくない場合 ビット演算 でググってみてください
comaSR_RGBrandom.ino loop()関数:繰り返し処理 if (Serial.available()>0){ }  ・Processingから送られてきたデータがあれば{ }内を実行   同期通信のため,ProcessingがArduinoからデータを受け取ると   受信完了信号をArduinoへ送るようにしている。   つまりArduinoはProcessingがデータを受け取ったことを   確認してから新たな加速度データを送る。 ! Serial.write(変数);  ・( )内の値をシリアル通信で送信
comaSR_RGBrandom.ino loop()関数:繰り返し処理 random(最小値,最大値);  ・最小値から最大値までの範囲でランダムな値を生成  ・ここではLED点滅の時間間隔に使用 ! analogWrite(ピン番号,値);  ・アナログ出力ピンに値を出力  ・ここではLEDの明るさを指定している !
Processingスケッチの基本的構造! ! 使う変数の宣言! Arduinoと同じ構造をしているので ! 詳細は省略 void setup(){! ! ! ProcessingはArduinoと違い
 初期設定! Javaベース ! }! ! void draw(){! ! 繰り返し処理! ! }!
comaSR.pde! 前半:setup()関数の内容まで ! ライブラリのインポート ! オブジェクト変数の宣言 ! OSC通信で使うアドレスの設定(後述) 使用するシリアルポートの設定 変数の宣言 oFとのOSC通信で使用する端末ID(無視してOK) ライブラリに関する文は
 ライブラリを使用する上での「決まり文句」 として理解してもいいですが 気になる人はJavaでのライブラリの使い方, オブジェクト指向について調べてみてください
comaSR.pde! 前半:setup()関数の内容まで setup()関数:初期設定 frameRate(コマ数); 1秒間に描画するコマ数 (=draw()関数が実行されるレート)を設定 ! size(幅,高さ); 画面サイズを設定  ・P3D:これを付け足すことで3Dモデルを描画 ! inX = inY = inZ = 0; Arduinoから送られてきたデータを格納する変数の
 初期値をゼロに ! println(Serial.list()); シリアルポート一覧をコンソールに表示
comaSR.pde! 前半:setup()関数の内容まで setup()関数:初期設定 ! myPort = new Serial(this, シリアルポート, 9600); 任意のシリアルポートを9600bpsでオープン  ・Serial.list()[Arduino]:上で設定したポート番号を使う
comaSR.pde! 前半:setup()関数の内容まで setup()関数:初期設定 ! OSC通信の設定(後述)
comaSR.pde! 後半:draw()関数以降 draw()関数:繰り返し処理 background(背景色); 画面背景色を設定 0∼255の値を指定 draw()関数内で最初に実行することで 前のフレームの球を塗りつぶしている   ・値が一つの場合グレースケールで描画   ・background(R, G, B, α):とすれば    RGB三色とアルファチャンネル(透過度)を設定 ! translate(左右,上下,奥行き); translate()以降に描画する図形を移動   ・2次元の場合はtranslate(左右,上下); ! fill(R, G, B); fill()以降に描画する図形の描画色を設定   ・色の指定方法はbackground関数と同じ ! sphere(半径); 半径を指定して3Dの球を描画 ! println(値 or 文字列); コンソールに( )内の内容を出力   ・文字列は で囲む   ・数値はそのまま   ・+ で複数の値を結合
comaSR.pde! 後半:draw()関数以降 serialEvent()関数:シリアル通信処理 if (myPort.available()>2){ } シリアル通信で送られてきたデータの個数が3個以上で
 あれば{ }内の処理を実行 ! myPort.read(); シリアル通信で送られてきたデータを読み込む  ・このスケッチでは順番に受信した加速度の値を   inX, inY, inZに格納している ! myPort.write(); シリアル通信でデータを送る  ・このスケッチではArduinoとの同期通信のために   受信完了の合図として255を送ることで   Arduinoに伝えている
comaSR.pde! 後半:draw()関数以降 mousePressed()関数: マウスボタンが押されたときの処理 myPort.clear(); バッファ内に溜まっているデータを消去  ・Arduinoから送られてくるデータが一方的にバッファに
   溜まっていくことを防止   今回は同期通信をしているため,なくてもOK    myPort.write(); シリアル通信でデータを送る  ・このスケッチでは画面上でマウスボタンをクリックする   ことでデータの送受信をスタートさせている
スケッチをいじってみよう! ! ArduinoスケッチcomaSR_RGBrandom.inoで! ・random()の数値を変えるとLEDの点滅の様子はどう変わるか?! ! ProcessingスケッチcomaSR.pdeで! ・size()の数値を変えるとどうなるか?! ・background()の数値を変えるとどうなるか?!  draw関数内ではなくsetup関数内に移動させるとどうなるか?!  background(R, G, B, α)としてαの値を変えるとどうなるか?! ・translate()の数値を変えるとどうなるか?! ・fill()の数値を変えるとどうなるか?! ・sphere()の数値を変えるとどうなるか?! ! 変更は一つずつ試してみましょう
残り2つのスケッチ解説! ! ! ! ! ! 対応するProcessingスケッチ! ・comaSR_RGBthreshold.ino! ! ! ・comaSR.pde! ! ・comaSRminim.pde! Arduinoスケッチ! ! ! ! ! ①加速度が閾値を超えるとLEDが発光! ②加速度の値に応じて色が変化! ! ! ・comaSR_minim.ino! ! ! ! ①マイク入力の音量が閾値を超えると!  LEDが発光(声や音楽に連動して光る)! ②加速度の値に応じて色が変化! ! !
comaSR_RGBthreshold.ino comaSR_RGBrandom.inoとの違いは loop()関数内のRGB-LED制御部分 RGB-LED制御部分 if文を使って 加速度の値が180より大きければLEDを発光させる   ・閾値を180から小さくしたり大きくすると    LEDの発光はどのように変わるでしょうか?
comaSR_minim.ino 他2つのスケッチとの違いは loop()関数内のデータ送受信部分&RGB-LED制御部分 ProcessingスケッチcomaSR_minim.pdeは 閾値以上の音量のマイク入力があると Arduinoに a を送信する(次ページ参照) データ送受信部分 Processingから送られてきたデータをsに代入 RGB-LED制御部分 Processingから送られてきたデータが a であれば
 LEDを発光させる
comaSRminim.pde! 前半:setup()関数の内容まで オーディオライブラリであるminimを使う ! minimライブラリのインポート ! オブジェクト変数の宣言
comaSRminim.pde! 前半:setup()関数の内容まで オーディオライブラリであるminimを使う minim = new Minim(this); インスタンス化    audioIn = minim.getLineIn(Minim,MONO); モノラルライン入力を取得
comaSRminim.pde! 後半:draw()関数以降 if (audioIn.left.get(0)>0.001) {  myPort.write( a );  myPort.clear();  } 左チャンネルのマイク入力の値が0.001より大きければ Arduinoに a を送信して バッファ内のデータを消去   ・audioIn.left.get(0)は-1から1までの値をとる 閾値を0.001から変えるとどうなるか?
7.!! OSCでデータを送ろう
OSCで別のアプリケーション,
 別の端末に加速度データを送ってみよう! ! ここまでで! ・加速度センサとArduinoで加速度データを取得! ・Processingで加速度データを視覚化! することができた! ! 加速度やその他の情報を別の端末,! またはoFやMax,Pure Dataなど別のアプリケーションと! やり取りできればさらに応用が広がりそう! ! OSC(Open Sound Countrol)プロトコルを使う!
OSCで遊んでみる! ! 1台のPC内で,2つのProcessingスケッチ間でOSC通信する! ! これまで使ったProcessingスケッチとcomaSRreceiver.pdeを同 時に実行する! 今までのスケッチ! comaSRreceiver! comaSRreceiverのボックスが! 球の動きと連動しているはず!
comaSR.pde (送信側)! 前半:setup()関数の内容まで ! ライブラリのインポート ! オブジェクト変数の宣言 ! OSC通信で使うアドレスの設定(後述) oFとのOSC通信で使用する端末ID(無視してOK) IDによって描画するグラフィックを変更するため 自らのポート番号を8000番とする 接続先を同じPC内(localhost), ポート番号を9000番とする 同じネットワークにいる別端末に送る場合 接続先のIPとポート番号を指定 コメントアウトしているので実行されない
comaSR.pde (送信側)! 後半:draw()関数以降 上で設定したアドレスで OSCメッセージをインスタンス化 加速度の値x, y, zをOSCメッセージとして送信
comaSRreceiver.pde (受信側) 上で設定したアドレスと送信側で設定したアドレスが 同一であれば{ }内を実行 OSCメッセージの内容をコンソールに出力 送られてきた値を読み込んでボックスの位置変数
 x, y, zに代入
8.!! 実用に向けてのTips
1. XBee:キットを無線化する! ! ! ・有線では可動域が制限されており!  ぶんぶん動かせない! ! ! ・USBケーブルをなくすことができれば!  自由な人の動きを取得することができる! ! ・加速度センサに限らず無線化はプロジェクトの可能性を拡げる! ! ! どうやって無線化する?! XBeeモジュールを使う
XBeeとは! ! ・安価な無線モジュール 1個2000円くらい! ! ・シリーズ1(IEEE 802.15.4プロトコル)と!  シリーズ2(ZigBeeプロトコル)がある! ! ・今回のシステムを単純に無線化するだけであれば!  シリーズ1,2どちらでもOK! ! XBee シリーズ1モジュール ! 左:PCBアンテナタイプ 右:ワイヤアンテナタイプ
必要な部品一覧! ! ①XBee シリーズ1モジュール! ! ! ! ! ! 2個! ②XBee エクスプローラUSBドングル! ! ! ! 1個! ! ! 1個! !  またはXBee USBアダプタなど! ! ③XBee 2.54mmピッチ変換基板! ! !  ※ハンダ付け必要!  XBeeはこれを間に挟まないとブレッドボードに挿せない! ① ② ③
必要なソフトウェア! ! XBeeモジュールの設定変更のためにターミナルソフトウェアが必要! ! WindowsだとTeraTerm,MacだとCoolTermなど
 公式設定プログラムX-CTUは現在のβ版からMacでも利用可能に! http://www.digi.com/blog/community/xctu-sneak-peek-sign-up/! ! ! Baud Rate,ネットワークID,自分のアドレス,相手のアドレス! を設定すればOK! ! 細かいところはググってください! 難しくないです
Arduino Unoの場合の配線図! ! XBee! !    Arduino! ! 1ピン ・・・  3.3V! 2ピン ・・・ デジタル1(TX)! 3ピン ・・・ デジタル0(RX)! 10ピン ・・・ GND! ! 今まではUSBポートからArduinoへ! 電源供給していた! ! 無線化するなら! バッテリー(7∼12V)が必要! ! VinピンとGNDピンに! 電池の+,-をつなげる! (図は9Vの006P電池)
! ! XBeeモジュールの設定ができたら! 1個をPCのUSBポートに接続する! ! これで無線化完了! Arduino Nanoの例 センサ側XBee PC側XBee
2. 回路の耐久性を上げる! ! ブレッドボードの長所 短所! ! ジャンプワイヤを簡単に抜き差しして回路を変更可能なため! 実験,プロトタイピングに便利! ! ! ! 回路自体が運動する場合,運動の勢いや衝撃によって! 配線が外れてしまうおそれがある! comakumaのように回路自体が振り回されるケースでは致命的! ! 厳密には短所というより,そもそも試作を意図したブレッドボードの使い方として不適切。。
2. 回路の耐久性を上げる! ! 解決法①! ! ブレッドボードでも配線が外れなければ良いんでしょという考え方! ! ! ! 接続部をガチガチに固める! ! ! ! ホットボンドという便利なものがある
2. 回路の耐久性を上げる! ! ホットボンド (グルーガン)! 秋葉原,ハンズなどで1000円以下で販売! 交換用スティック 先端が高温になるので注意 熱で接着材を溶かして固めたい場所に ニュニュニュッとつける 
2. 回路の耐久性を上げる! ! ホットボンドで固めた例! 見た目さえ気にしなければ手軽で便利,わりと丈夫! 一度固めてしまうと引き返すのはかなり難しいので 回路に間違いがないことを十分確認しておきましょう
2. 回路の耐久性を上げる! ! 解決法②! ! ブレッドボードに別れを告げてより強固にする! ! ! ! 基板にハンダ付けする! ! ! ! ユニバーサル基板という便利なものがある
2. 回路の耐久性を上げる! ! ユニバーサル基板 & ハンダ付け! ユニバーサル基板 ビニール被覆導線 ハンダ,ハンダごて,こて台 高温に注意
2. 回路の耐久性を上げる! ! あったら作業がはかどる! ワイヤストリッパ 導線の被覆が簡単に取れる ニッパ 導線などを簡単に切断
ArduinoやProcessing,! 電子工作などでつまづいたら! ! ・人に相談する(comacafeで情報共有しましょう!)! ! ・公式リファレンスを見る(メニュー → ヘルプ → リファレンス)! ! ・公式フォーラムを見る! ! ・ググる! ! ・秋葉原に行く,通販サイトをサーフィンする! ! ・よく分からないけど気になるので買ってみる! ! ・気になる単語,知らない単語は調べてみる!  Wikipediaで2∼3行だけ読んで頭に入れておけば実用上は事足りるケースが!  意外にあったりする(もちろんしっかり体系的に学ぶに越した事はなし)! !
新しいものを作ったら発表・公開しましょう! ! ! ・加速度センサ,LEDを別の素子に変更して色んなものを作ってみてください! ! ! ・「こんなのつくった!」とcomacafeで公開したり!  comaの会場に持って来てもらえると嬉しいです!! ! ! ・仕組み,技術,トラブル,色んな情報を共有しましょう! ! ! ・本資料が皆様のものづくりに少しでも役立てばこの上ない喜びです! ! ! ・資料中に間違い,気になったことあればEtoまでご指摘ください

coma Study Room Arduino Workshop