京都市立芸術大学 美術学部 構想設計
Arduinoワークショップ
2015.06.11-12 長嶋洋一
こんな人にとって嬉しいです(概要)
(事前のリクエスト打診のやりとりより一部転載) > 昨年、Arduino、スピーカー、加圧センサーを使用した作品をつくったのですが > センサーや情報量などの要素を増やしていくと制御がうまくいかず失敗してしまいまいた。 > 基本的なことが分かっていないので基礎から解説していただけると嬉しいです。 これは貴重な情報で、まさに、このあたりが多くの学生の引っかかってくる、いいテーマです。(^_^) Arduinoのサイトなどのサンプルは、話を簡単にするために、 「1個のLEDを点灯させる」 「1個のセンサを監視する」 みたいになっていますが、実際に具体的な作品に応用しようとすると、 ・たくさんのLEDを点灯させたい ・たくさんのセンサに反応したい ・プログラミングが下手で重く(遅く)なる というあたりの「壁」に突き当たります。ここにある、色々なテクニックとコツを伝授しましょう。 上記の状況だと、まずはおそらく、たくさんの要素(入力[センサ]、出力[LED、スピーカ等])を 組み合わせてリアルタイムに動作させるという「時分割多重化」というものが大きな壁になっている ものと思います。半日*2だと、そこを突破するだけでもその半分ぐらいかかります。 あと、標準的なArduino Uno(http://www.arduino.cc/en/Main/ArduinoBoardUno)は、 ・センサ(アナログ電圧) 6チャンネル ・ディジタルポート 12ビット (うちPWM[連続値]のLED出力が6ビット) です。「たくさん使いたい」については、「標準的なArduino Unoが持っているポート数の範囲内で、 それらを同時にたくさん使いたい」という範囲にします。それ以上の拡張はちょっとAdvencedです。 > また、LEDの制御について理解できず昨年の作品では光を使用できなかったので、 これはたぶん、例えばArduinoのポートとしてPWM出力で連続値制御(ON/OFFでなく、じわーっと変化) して、そこにLEDリポンのように多数のLEDがあるやつを繋いで一斉に同じようにじわーっと変化させたい・・・と いうような事ではないかと思います。こういう感じです。 http://www.youtube.com/watch?v=Af210cqoh5c http://www.youtube.com/watch?v=991jm_JEWIQ http://www.youtube.com/watch?v=Z4fgXdpbkmY http://www.youtube.com/watch?v=ZC_pI9Q-O8Q http://nagasm.org/1106/installation3/kabayama.mp4 これは、Arduinoに直接LEDを繋ぐと、ドライブできる電流の制限からポートごとにLEDを1個程度しか 繋げないので、ドライブ回路(トランジスタ1個でOK)を入れれば、一気に表現力が拡大します。 ちょうど上のYouTubeの作品のような感じで、最大6個の赤外線距離センサで体験者の近接を検知して、 最大6系統のPWMポートからドライブ回路を経て、6種類の別々に光る多数のLED、というようなことであれば、 半日*2でもなんとか伝授できると思います。2日間のメニュー
- 「Arduino+電子回路」の電源をどうするか
- LEDを確実に点灯させる「定電流ダイオード」
- 多数のLEDを点灯させる電流ドライブ回路
- センサとスイッチの繋ぎ方と調べ方
- 同時にいくつもの処理を行うプログラム手法
「Arduino+電子回路」の電源をどうするか
- 電子回路の電源は大きく4種類あるが今回は3種類を紹介する
- ACアダプター + 5V安定化レギュレータ
- スイッチングACアダプター
- (アルカリ)乾電池 or エネループ + 5V安定化レギュレータ
- 充電式リチウム電池モジュール → ▲危険性を考慮して今回は扱わない
- ACアダプター + 5V安定化レギュレータ
- 表示された電圧よりも高い電圧が出て来る
- 消費電流によって電圧が低下してくる
- 「3端子レギュレータIC」によって+5Vに安定化する必要がある
- 消費電流が多い場合 → 放熱板が必要になるのでスイッチングタイプを推奨
- 消費電流が少ない場合 → Arduinoの「外部電圧」に直結してArduino上の3端子レギュレータからの「+5V安定化電源出力」を外付回路に利用する手もある
- スイッチングACアダプター
- (アルカリ)乾電池 or エネループ + 5V安定化レギュレータ
- 携帯したいシステムでACコードが邪魔なのではバッテリが必須
- アルカリでないマンガン乾電池、ノーブランド(made in China)乾電池は使わないこと
- 充電したいならエネループ(専用充電器が危険防止)、ただし乾電池の1.5Vと違って1.2Vなので6〜8本が必要
- 通常の「3端子レギュレータIC」で+5Vを得るには入力に+9V(電池6本)ほど必要
- アルカリ単3×4本の場合には特殊な「低ドロップ3端子レギュレータIC」を使う必要がある
- アルカリ単3より軽くて8〜9倍もつエナジャイザーという優れものがある。ただし1本400円ほどする(^_^;)
LEDを確実に点灯させる「定電流ダイオード」
- LEDには「向き」があり、逆向きに繋いでも点灯しない(壊れないので安心)
- ArduinoとLEDを直結する場合の2つのタイブ - 「負論理」(推奨)と「正論理」
- 半導体は電流を「流し出す」よりは「吸い込む」のが得意なので「負論理」を推奨する
- LEDを電源に直結すると壊れる(電流が流れ過ぎる)
- LEDには「電流制限抵抗」を直列接続する必要があり、数式でその値を計算する必要がある
- LEDや抵抗には製造上の誤差があり、点灯させた時に光り方がばらつくのは仕方ない
- 「定電流ダイオード」は電圧に関わらず一定電流を供給するので超推奨。抵抗よりちょっとだけ高い(1本30円。長嶋は500本入り13000円を愛用)が、使ってみると利便性と安定性は抜群(^_^)
多数のLEDを点灯させる電流ドライブ回路
- 2SC1815
- 最大150mAまでのドライブであれば2SC1815が定番。YでもGRでも同じ
- エミッタは接地
- Arduinoなどのディジタル出力から10kΩを経てベースに入れる
- +5Vラインから定電流ダイオードを経てLEDをコレクタに繋ぐ
- 安全係数をみて15mAのLEDを8個までは1個の2SC1815でドライブできる
- 2SD1415
- 最大120V7Aなのでどれだけでもドライブ可能(^_^)
- エミッタは接地
- Arduinoなどのディジタル出力から10kΩを経てベースに入れる
- +5V/+9V/+12Vラインから定電流ダイオードを経てLEDをコレクタに繋ぐ
- 車載用の+12V系のテープLEDを同時にたくさん点灯させる時に活用できる
- 場合によってはそれなりに発熱するのでヒートシンク(放熱器)を付けること
- 多チャンネルをまとめたトランジスタアレイICもある
センサとスイッチの繋ぎ方と調べ方
- Arduinoの2種類の入力
- ディジタル入力 - LかHがはっきりしたスイッチ入力を与えること
- アナログ入力 - 0V〜5Vの電圧を検出
- 受動センサ - 抵抗値が変わるだけ(外部に抵抗1本が必要)
- 能動センサ - 電源を与えて電圧を出力するICの電子回路になっているもの
- センサには「シリアル」出力タイプも多いが、Arduinoで扱うのはちょっとAdvancedなので今回は扱わない (出来ないわけではないが、まずはアナログで慣れてから)
- スイッチ入力
- ディジタルは「open」に弱い(→静電気などのノイズ)
- スイッチ入力は「負論理」が基本
- スイッチは2極双投タイプでも入力には「単極」として使う
- +5V電源から10kΩのプルアップ抵抗を経てArduinoのディジタル入力へ
- そこに単極スイッチを繋ぎ、スイッチの反対側を接地
- スイッチ「OFF」で「H」、スイッチ「ON」で「L」がArduinoの入力となる「負論理」
- スイッチの状態に関わらず確実に電圧(+5V/0V)が与えられているのでノイズに強い
- 受動センサ
- アナログジョイスティック
- 直行した2つのボリュームの抵抗値として、2次元平面上のノブの位置を検出する
- ボリュームの抵抗値は定番の10kΩ
- 手を話すとスプリングで中央に戻る
- ボリュームの両端に+5V〜0Vを与えると中点の電圧がそのまま得られる
- コンデンサマイク(音センサ)
- 手を叩いたり騒音に反応するためのセンサ
- 簡単なアンプ回路、整流平滑回路を外付けするとArduinoのアナログ入力に与えられるレベルとなる
- 屋外で仕使用する場合には風よけが必要
- リードスイッチ
- 磁石に反応する対向する金属電極が細いガラス管に封入されているスイッチ
- スイッチなのでプルアップ抵抗によってON/OFFに電圧を2値化できる
- 超小型で強力なネオジム磁石を近付けたり遠ざけたりをON/OFFで検出可能
- 傾斜スイッチ
- 傾けるとONになるスイッチ
- スイッチなのでプルアップ抵抗によってON/OFFに電圧を2値化できる
- 中には金属球体が入っていて、傾くと電極の間に移動してショートする→ON
- 圧力センサ
- 圧力により抵抗値が変化する高分子厚膜フィルム
- 実際には連続値というより「押された」「当たった」ことの判定に使われる
- リファレンス抵抗とで+5V〜0Vを分圧したアナログ電圧を得る
- 何度も曲げていると断線しやすい
- CdS(硫化カドミウムセル)
- もっとも古典的な定番センサ
- 街路灯が周囲の明るさに対応して点灯/消灯するのはコレ
- 受けている光の量で抵抗値が変化
- リファレンス抵抗とで+5V〜0Vを分圧したアナログ電圧を得る
- UVセンサ
- 紫外線に反応する光センサ(光トランジスタ)
- 人間に気付かれずに検出できるが、高出力のUV LEDは直視すると健康被害となるので注意が必要
- UV蛍光塗料とともに作品に使用した事例はあるがいろいろと大変
- 能動センサ (秋月電子のリンク例は全て電源を供給してアナログ電圧出力するタイプ)
- ジャイロセンサ
- 「角速度」のセンサ
- 回転し始める、あるいは回転が止まりかける、など回転が変化する量を検出
- 回転数は得られない。止まっていても一定速度で回転していても出力はゼロ
- ビデオカメラの手振れ防止やカーナビの地下移動(GPSが届かない)検出に使われている
- 検出回転軸を直行させた「2軸」や「3軸」のものもある。上の例は2軸
- フォトインタラプタ
- 発光素子と受光素子が対面していて、ここを遮る情報をON/OFFで出力する
- 円周上に等間隔に穴の明いた円板を回転させるとその回転数を検出できる
- DJターンテーブルの回転速度と回転方向を検出した作品事例あり
- 方位センサ
- 地球の地場からその地点の方位を検出してくれる「コンパス」(方位磁石)
- 4ビットディジタルで16分割した方位を出力する
- (赤外線)距離センサ
- 赤外線を出し、反射して戻ってくる距離を電圧として出力
- 長嶋は色々な作品で活用しまくり
- 測距範囲は10cm〜80cm。10cmより近いと無効データが出るので注意
- ドップラーレーダセンサ
- ギガヘルツ帯の電磁波の反射型センサ
- クルマの衝突防止システムにも使われる
- 外部に電圧変換回路が必要なのでちょっと難易度が高い
- 加速度センサ
- 移動し始める、あるいは移動が止まりかける、など移動方向が変化する量を検出
- 移動速度は得られない。止まっていても一定速度で直進していても出力はゼロ
- 検出方向を直行させた「2軸」や「3軸」のものもある。上の例は3軸
- 物体に加わる衝撃センサとして使える→ゲーセンのパンチグローブ
- 指揮棒の先端に付けると指揮の動作を検出できる
- ダンサーの足首に付けると地面を蹴るタップを検出できる
- (超音波)距離センサ
- 超音波を出し、反射して戻ってくる距離を電圧として出力
- 長嶋は類似センサを使った事例あり
- 最大測距範囲は約15cm〜約6メートル
- 温度センサ
- 摂氏(℃)に比例した電圧出力
- 温度係数は10.0mV/℃
- 外部に電圧増幅回路が必要なのでちょっと難易度が高い
- 磁気センサ(ホール素子)
- 超小型の磁力(磁束密度)センサ
- 電源は他の能動センサと同じように +5V
- 超小型で強力なネオジム磁石を近付けたり遠ざけたりした距離を検出可能
- 湿度センサ
- この例では電極を土壌に入れてその土壌の湿度環境を計測する
- +5V電源でアナログ電圧出力は0〜4.2V
- においセンサ
- メチルメルカプタン◎、硫化水素◎、エタノール○、アンモニア○に反応する
- ヒーターに指定デューティの電源を供給して数分してデータが得られる
- 焦電センサ
- 動物の発する赤外線の移動からON/OFF出力する、主として防犯用途のセンサ
- 反応の時定数がきわめて大きい(素早い反応は無理)ので使いにくい(いったんONしたら10〜30秒はその状態が続く)
- ギャラリーの入口に置いて、来場者が来たら照明とかビデオ上映の自動スタートに、という例が多い
同時にいくつもの処理を行うプログラム手法
- Arduinoでインタラクティブなシステムを実現するのは「無限ループ」
- Arduinoサイトにある、時間合わせのためのdelay()を使っては駄目(^_^;)
- タイマ処理は変数インクリメントの「ソフトタイマ」とする
- 処理の時間密度は「ソフトタイマ」の最大値で調整する
- Arduinoは人間の動作に比べて相当に十分に高速、という背景を活用する
- 人間の様子を見るシステムではだいたい「1万回に1回」とか「10万回に1回」で十分、高速反応する
- LEDのPWM制御はお手軽なanalogWrite()を使う
- 複数のサブルーチンに分割(階層化・構造化)してメインを見やすくする
- 変数は全て広域変数として馬鹿正直に定義する
- センサに特有の処理も活用する
- ノイズ除去のための移動平均
- レンジの変換はスケーリング
- 「不応期」の活用
参考情報リンク1
参考情報リンク2
- 長嶋洋一サイト
- 長嶋洋一研究室
- センサとマイクロエレクトロニクスの概要
- Arduino日記
- ジャミネータと遊ぼう
- SUACインスタレーション(1)
- SUACインスタレーション(2)
- SUACインスタレーション(3)
- SUACインスタレーション(4)
- Propeller日記
- Raspberry Pi日記
- mbed日記
- Processing日記
- SuperCollider日記
- Max日記
- PureData日記
- Myo日記
- Xcode日記
- スケッチングとは? SUACの事例紹介など
- 新楽器「GHI2014」
- 電子十二影坊
- 「靄夜」(もや)
- 電気刺激フィードバック装置
- 筋電センサ関係
- 作るサウンドエレクトロニクス
1日目の様子
2日目の様子