coma Study Room!!
2014.03.22! @BULLET’S!
presented by coma team
Arduino! Workshop!
!
おもちゃハック ∼動くものをつくろう!∼!
!
coma team  Eto Haruhiko
1.! イントロダクション! ! ! ! ! ! 

2. ! Arduinoとは! ! ! ! ! ! !
3.! DCモーターことはじめ! ! ! ! ! ! !
4.! サーボモーターことはじめ! ! ! !
5.! 応用例!
6.! 実用に向けてのTips! ! ! ! ! !
1.!! イントロダクション
comaとは
coma = communication art project

・Webページ:http://coma.io/!
!
・Technologyを使った作品を通して,!
 人の間にコミュニケーションをつくりだすことを目的としています。!
!
・毎月1回、西麻布Bullet’sにて開催しています。
comaDiscotheque coma Study Room coma Creator’s Session
coma Study Room vol.1
Arduinoで  
データを取得  
シリアル通信

(有線)
加速度度センサで

加速度度を検出  
Processingで

データを取得
加速度センサ+Arduino PC
加速度度に応じて  
RGB-‐‑‒LEDを点灯
前回のワークショップ内容
加速度度を

ビジュアライズ
・センサを使った⼯工作⼊入⾨門として,加速度度センサの情報を視覚化するシステムを作りました  
!
・ベースになっているのはcomaDiscothequeVer0.02に出演したcomakumaシステムです
☆ワークショップとcomakumaの詳細は  
  comaページ(http://coma.io/)  
  にて公開しています
センサを振ると球が動く  
今回のワークショップ内容
動くものを作ろう!
・現実世界でものが動くのはそれだけでおもしろい!  
!
・ArduinoによるDCモーターとサーボモーターの動かし⽅方の基本を学んで,  
  ⾃自ら運動する謎の存在を制作していきましょう
カメラ搭載ラジコン ⾳音楽にあわせて踊るぬいぐるみ 居眠り防⽌止ピコピコハンマー
既存のおもちゃをハックしたり,  
センサと組み合わせれば可能性はいろいろ
上野公園で! クラブで! ⾃自宅宅で!
アクチュエータとは?!
!
・機械にとっての運動器
・センサ(感覚器)と出力装置(身体)があることで,!
 機械は外界に開かれたインタラクティブなシステムになる!
!
・モーターなどのアクチュエータは,!
 力や運動を実現し,機械にとっての筋肉の役割をもつ
エネルギー変換  
センサ   Arduino

PC  
出⼒力力装置
感覚器 脳みそ 身体
⾳音  光  ⼒力力    
電気  磁気    
化学物質  
温度度  湿度度  
放射線  
映像  
距離離  加速度度  
⾓角度度  ⽅方位  
圧⼒力力  振動  
などなど  
物理理量量,化学量量  
!
音
!
光
!
力
!
熱 
!
etc.
外
!
!
!
!
界
外
!
!
!
!
界
!
!
!
!
!
!
!
!
エネルギー変換  
2.!! Arduinoとは
Arduinoとは?! !
!
・手軽に使えるマイコンボードとその開発環境!
 言語はC/C++をベースにしたArduino言語!
!
・接続したセンサの情報を読み取って何かを動かしたり,!
 PCに情報を送ったりできる!
!
Arduinoとは?! !
!
・パソコンとUSBケーブルでつないで,専用の開発環境(IDE)!
 で行わせたい処理をプログラミングする!
!
・Arduinoのプログラムはスケッチと呼ばれる!
・ピン数,クロック,メモリ,サイズなどが異なる!
 色んな種類があり,目的に応じて使い分ける!
・基本はArduino Uno(あまりこだわる必要なし)!
!
! オープンハードウェアなので!
! 部品を買ってきて自作も可能
・デジタル出⼒力力ピン  
・〜~が付いているのは疑似アナログ出⼒力力(PWM)に使える(0〜~5V)    
  →  モーターの回転速度度を変える,LEDの明るさを変えるなど
・アナログ⼊入⼒力力ピン  
  センサの出⼒力力ピンと接続
・5Vピン,3.3Vピン  
  素⼦子への電源供給に使⽤用  
  今回はモータードライバの電源として5Vを使⽤用
・アナログ基準電圧ピン

  アナログ⼊入⼒力力ピンの基準電圧を  
  ⼊入⼒力力する  
  基本的にセンサの電源電圧と  
  同じにすればOK
・グランドピン(複数有)

  素⼦子のグランドを  
  ここに接続
・USB端⼦子  
  5V給電  
  通信
Arduinoの構成  
〜~Unoの場合〜~     
他も基本は同じ
3.!! DCモーターことはじめ
DCモーターとは
・永久磁⽯石に囲まれてコイルが⼊入ってます  
・磁場中では電流流に⼒力力が働きます  
・この⼒力力を回転⼒力力に利利⽤用しています  
!
・電流流を流流せば(電池に繋げば)とにかく回る  
・電流流の向きを逆転させると回転⽅方向も逆転
・ホビー⽤用途にはマブチモーターの製品が主流流です  
・⼯工作にはタミヤ製品(ギヤボックス等,付属モーターはマブチ製)が便便利利です  
・モーターの回転数,回転⽅方向を制御できると⾊色んな⼯工作への道が広がります
ひたすら回転するためだけに⽣生まれた存在
幼い頃  ミニ四駆を通じて  
モーターに親しんだ⼈人は多いはず…
直接ArduinoでDCモーターは回せない
⼀一⽅方,ArduinoのDC出⼒力力電流流は40mAまで
モーターFA-‐‑‒130RAのデータシートを⾒見見てみると…
マブチモーター株式会社  http://www.mabuchi-‐‑‒motor.co.jp/en_̲US/cat_̲files/fa_̲130ra.pdf  より引⽤用
無負荷状態で0.15A=150mA以上,

定格で0.56A=560mA以上も電流が流れる ストール時(もう限界…状態)の値
Arduinoに直接モーターを接続すると過電流流でArduinoが死ぬ  
だからといって電池で回すと回転⽅方向や回転数の制御が⾯面倒!
そこで外部電源とモータードライバを使います
回転⽅方向と回転数を指⽰示
モーターへの給電
指⽰示に従って  
電流流量量と⽅方向を制御
モーター駆動⽤用
バッテリー モーター
Arduino
モータードライバ
Arduinoとモーターは  
モータードライバによって切切り離離されているので  
Arduinoに⼤大電流流が流流れることはありません
Arduinoからモーターの回転⽅方向と回転数を制御できる!
モータードライバ TA7267BP の使い方
・データシートによるとVcc=6〜~18Vなので,本当はArduinoの5Vだと⾜足りないのですが,  
  ⼀一応動いてくれるのでArduinoから供給することにします  
!
・本来は回転数制御機能は保証されていませんのでIN1とIN2はデジタル出⼒力力(HIGH/LOW)をつなぎます.  
  しかし実際にはPWMで回転数を変えられるので,今回はPWMを⼊入⼒力力します.



・PWM端⼦子が独⽴立立しているTA7291P(http://akizukidenshi.com/catalog/g/gI-‐‑‒02001/)の⽅方が電圧条件的にも使いやすいかも  
    Q:じゃあなんで今回TA7291Pを使わなかったの?  A:というか当初そうしようと思っていたのですが,イベント告知の際に間違えましたすみません
1  2  3  4  5  6  7
秋⽉月電⼦子商品ページ(http://akizukidenshi.com/download/ta7267bp.pdf)から引⽤用
←Arduino  5Vピン
←単三電池×2  の+側
←モーターにつなぐ
←モーターにつなぐ
←グランドにつなぐ
←Arduino  デジタルピン
←Arduino  デジタルピン
①接続⽅方法
②ファンクション
ブレッドボードの使い方

・ハンダ付け不要で配線の中継 or 分岐ができる!
・矢印の向きの列が裏側で繋がっている!
・ジャンプワイヤをぶっ挿して配線する
電源ライン!
横1列が導通
電源ライン!
横1列が導通
縦一列が導通
縦一列が導通
ブレッドボードには色々あるので注意
電源ライン(+側)が中央で切れている!
裏側を見なくても表側にプリントされている赤線と黒線を見ればわかる!
赤線だけボード中央で切れてますね
たとえば3.3Vで動作する素子と5Vで動作する素子を一つのボード上で使いたい場合に便利
回路を組もう!
PWMならどれを使ってもいいです  
回路路図では5番と6番を使ってます
Arduinoと電池の  
グランドをボード上で  
導通させておきましょう
必要なもの:  
・Arduino,ブレッドボード,ジャンプワイヤ  
・モータードライバ  
・単三電池2本  ※4本でもOK,回転速度度(トルク)が増します  
・DCモーター
FA-‐‑‒130RA,RE-‐‑‒260RAなど
TA7267BP
単三電池  with  電池ボックス
回路を組もう!
PWMならどれを使ってもいいです  
回路路図では5番と6番を使ってます
Arduinoと電池の  
グランドをボード上で  
導通させておきましょう
・モーターのリード線をそのままブレッドボードに挿すのは難しいので,  
  ジャンプワイヤを⼀一緒に挿してあげるとよいです  
   ①リード線をしっかり撚撚って(ねじねじして)尖らせる

   ②リード線の先端をブレッドボードの挿し⼝口に少し⼊入れる  
   ③その状態でジャンプワイヤを挿し込む
FA-‐‑‒130RA,RE-‐‑‒260RAなど
TA7267BP
単三電池  with  電池ボックス
⼩小技
配線が完了したらUSBケーブルで!
ArduinoとPCを接続してみましょう!
ぶっ挿す
①モータードライバの4つのファンクションを試す
void	
  setup(){	
  
}	
  
	
  	
  
void	
  loop(){	
  
	
  	
  //モーターを回転させる	
  
	
  	
  digitalWrite(5,	
  HIGH);	
  
	
  	
  digitalWrite(6,	
  LOW);	
  
	
  	
  delay(1000);	
  	
  //1秒間状態を維持する	
  
	
  	
  
	
  	
  //ブレーキをかける	
  
	
  	
  digitalWrite(5,	
  HIGH);	
  
	
  	
  digitalWrite(6,	
  HIGH);	
  
	
  	
  delay(1000);	
  	
  //1秒間状態を維持する	
  
	
  	
  	
  
	
  	
  //モーターを逆回転させる	
  
	
  	
  digitalWrite(5,	
  LOW);	
  
	
  	
  digitalWrite(6,	
  HIGH);	
  
	
  	
  delay(1000);	
  	
  //1秒間状態を維持する	
  
	
  	
  	
  
	
  	
  //モーターを停止させる	
  
	
  	
  digitalWrite(5,	
  LOW);	
  
	
  	
  digitalWrite(6,	
  LOW);	
  
	
  	
  delay(1000);	
  	
  //1秒間状態を維持する	
  	
  	
  
}
dcmotor_̲1.ino  
ドライバの4つのファンクションを試すスケッチ
・Arduino IDEを立ち上げて新規スケッチを開き,下記のコードを記述します

・degitalWrite(ピン番号,HIGHまたはLOW)で!
 指定したピンにHIGH = 5VまたはLOW = 0Vの電圧を出力します
モータードライバのデータシートによると,  
逆転させる際には100マイクロ秒(0.1ミリ秒)以上の  
ストップ時間を挟むことが推奨されています
スケッチの書き込み⼿手順  
(1)シリアルポート選択  
!
!
!
・ツール→シリアルポート

  でArduinoが繋がっているポートを選ぶ  
!
間違っている状態で  
書き込もうとするとエラーが出ます
スケッチの書き込み  
(2)マイコンボード選択  
!
・ツール→マイコンボード

  で⾃自分のArduinoと同じものを  
  選ぶ  
!
・UnoならUno  
・Nanoならnano  w/ATmega328  
・LeonardoならLeonardo  
・MicroならMicro  
!
  間違ってる状態で書き込もう  
  とするとエラーが出ます  
!
ここまでできたら書き込みボタン  
(→ボタン)を押す  
②回転数を変更する
void	
  setup(){	
  
}	
  
	
  	
  
void	
  loop(){	
  
	
  	
  //モーター回転数MAX	
  
	
  	
  analogWrite(5,	
  255);	
  
	
  	
  digitalWrite(6,	
  LOW);	
  
	
  	
  delay(1000);	
  	
  //1秒間状態を維持する	
  
	
  	
  
	
  	
  //ブレーキをかける	
  
	
  	
  digitalWrite(5,	
  HIGH);	
  
	
  	
  digitalWrite(6,	
  HIGH);	
  
	
  	
  delay(1000);	
  	
  //1秒間状態を維持する	
  
	
  	
  	
  
	
  	
  //モーター回転数を大体半分に	
  
	
  	
  analogWrite(5,	
  128);	
  
	
  	
  digitalWrite(6,	
  LOW);	
  
	
  	
  delay(1000);	
  	
  //1秒間状態を維持する	
  
	
  	
  	
  
	
  	
  //モーターを停止させる	
  
	
  	
  digitalWrite(5,	
  LOW);	
  
	
  	
  digitalWrite(6,	
  LOW);	
  
	
  	
  delay(1000);	
  	
  //1秒間状態を維持する	
  	
  	
  
}	
  
!
!
dcmotor_̲2.ino  
回転数を2段階に変更更するスケッチ
・ArduinoはPWMを使って擬似的なアナログ出力が行えます!
・analogWrite(ピン番号,0∼255)を使って!
 0から255までの256段階でモーターの回転数やLEDの明るさが制御できます

 ③Processingから回転数を変更する
int	
  speed;	
  
	
  	
  
void	
  setup(){	
  
	
  	
  Serial.begin(9600);	
  	
  //シリアル通信を9600bpsで開始	
  	
  	
  	
  	
  
}	
  
	
  	
  
void	
  loop(){	
  
//シリアル通信で送られてきたデータがあれば以下を実行
	
  	
  if	
  (Serial.available()>0){	
  
	
  	
  	
  	
  speed	
  =	
  Serial.read();	
  	
  	
  	
  	
  	
  //変数speedに受信した値を入れる	
  
	
  	
  	
  	
  analogWrite(6,	
  speed);	
  	
  	
  	
  	
  	
  //回転数=speedでモーターを回転させる	
  
	
  	
  	
  	
  digitalWrite(5,	
  LOW);	
  	
  
	
  	
  }	
  
}	
  
!
!
Arduino  
dcmotor_̲3.ino  
シリアルで受信した値を回転数に使うスケッチ
・シリアル通信でProcessingからモーターの回転数を制御してみます

・Processingを使うことでキーやGUIによる制御が簡単にできます
import	
  processing.serial.*;	
  //シリアル通信ライブラリのインポート	
  
Serial	
  myPort;	
   	
   	
   //オブジェクト変数の宣言	
  
int	
  ArduinoPortNum	
  =	
  5;	
   	
   //コンソールに表示されたポート番号に設定	
  
int	
  speed;	
  	
   	
   //回転数の変数	
  
	
  	
  
void	
  setup(){	
  
	
  	
  frameRate(30);	
  	
   //画面のフレームレートを30fpsに	
  
	
  	
  size(255,	
  300);	
   	
   //画面サイズの設定	
  
	
  	
  println(Serial.list());	
   //コンソールにポート一覧を表示	
  
	
  	
  //ポート番号ArduinoPortNumを9600bpsでオープンする	
  
	
  	
  myPort	
  =	
  new	
  Serial(this,	
  Serial.list()[ArduinoPortNum],	
  9600);	
  
}	
  
	
  	
  
void	
  draw(){	
  
	
  	
  background(100,250,250);	
  	
  	
  
	
  	
  stroke(255);	
  
	
  	
  line(0,235,250,235);	
  
	
  	
  //マウスX座標を回転数の値に使う	
  
	
  	
  speed	
  =	
  mouseX;	
   	
   	
  
	
  	
  //スライダーとして円を表示	
  	
  	
  
	
  	
  fill(0,110,220);	
  
	
  	
  ellipse(mouseX,235,10,10);	
  
	
  	
  //画面に回転数の値を表示する	
  
	
  	
  textAlign(CENTER,	
  CENTER);	
  
	
  	
  text("speed",width/2,80);	
  	
  	
  
	
  	
  text(speed,width/2,100);	
  
	
  	
  //回転数の値を送信	
  
	
  	
  myPort.write(speed);	
  
}	
  
! !
!
Processing  
dcmotorController.pde  
マウス座標をArduinoに送信するスケッチ
シリアル通信については前回ワークショップ資料により詳細な説明があります!
ので参考にしてみてください

http://coma.io/coma-study-room-vol-1/
マウスを動かすと

モーターの回転数が変わります
4.!! サーボモーターことはじめ
サーボモーター(RCサーボ)とは
・エンコーダ(⾓角度度センサ)付きのモータ  
・制御回路路を内蔵しておりマイコンからの命令令  
  に従って回転⾓角度度が決められる  
・⾓角度度範囲は⼤大体0〜~180°  
・ケーブルは電源線2本と信号線1本の計3本
分解すると…
⾓角度度検出⽤用の  
ポテンショメータ
DCモーター
制御回路路
ホーン
・ホビー⽤用途ではラジコンのステアリング,  
  ロボットの関節などに使われています  
!
・「RCサーボ」で検索索すると⾊色んな商品が⾒見見付かります  
!
・物を動かすときは使⽤用するサーボのトルク仕様を  
  確認しておきましょう  
!
・⾦金金属ギヤと樹脂ギヤの⼆二種類あり,  
  ⾦金金属ギヤの⽅方が丈夫でトルクも⼤大きいです
回路を組もう!
・外部バッテリーと信号線をつなぐだけ  
・実はサーボ1個程度度であれば外部電源なしでArduinoだけで操作できますが,  
  DCモーターの場合と同じで電流流負荷が⼤大きいのでおすすめはしません
⾚赤:外部電源の+に  
⿊黒:外部電源の-‐‑‒に

その他の⾊色(⽩白やオレンジだったりします):Arduinoのデジタルピンに
デジタル2番ピンに接続しています
⼤大体のRCサーボで必要電圧は5V程度度です  
今回単三電池2本=3Vなので  
実はちょっと⾜足りないです  
Arduinoと電池のグランド(-‐‑‒側)は導通させます  
①RCサーボを動かしてみよう
#include	
  <Servo.h>	
   //サーボライブラリを使用する	
  
Servo	
  servo0;	
   	
   //インスタンスの作成	
  
/*複数のサーボを扱う場合は,異なる名前のインスタンスを準備	
  
Servo	
  servo1;	
   	
   //2個目のサーボ	
  
Servo	
  servo2;	
   	
   //3個目のサーボ	
  
*/	
  
	
  	
  
void	
  setup(){	
  
	
  	
  servo0.attach(2);	
   //サーボモータ信号線をつなぐピンを2番
ピンに指定	
  
}	
  
	
  	
  
void	
  loop(){	
  
	
  	
  servo0.write(90);	
   //回転角度を0°∼180°の範囲で指定	
  
}	
  
!
!
Servo_̲1.ino  
回転⾓角度度を1つだけセットする
・Arduino IDEを立ち上げて新規スケッチを開き,下記のコードを記述します

・Servoライブラリを使うことで0∼180°の範囲で角度を指定できます
#include	
  <Servo.h>	
  	
  //サーボライブラリを使用する	
  
Servo	
  servo0;	
  	
  	
  	
  	
  	
  	
  //インスタンスの作成	
  
	
  	
  
void	
  setup(){	
  
	
  	
  servo0.attach(2);	
  	
  //サーボモータ信号線をつなぐピンを2番
ピンに指定	
  
}	
  
	
  	
  
void	
  loop(){	
  
	
  	
  servo0.write(90);	
  	
  //回転角度を90°にセット	
  
	
  	
  delay(500);	
  	
  	
  	
  	
  	
  	
  	
  //500ミリ秒待つ	
  
	
  	
  	
  
	
  	
  servo0.write(180);	
  //回転角度を180°にセット	
  
	
  	
  delay(500);	
  	
  	
  	
  	
  	
  	
  	
  //500ミリ秒待つ	
  
	
  	
  	
  
	
  	
  servo0.write(0);	
  	
  	
  //回転角度を0°にセット	
  
	
  	
  delay(500);	
  	
  	
  	
  	
  	
  	
  	
  //500ミリ秒待つ	
  
}	
  
!
!
Servo_̲2.ino  
いくつか回転⾓角度度を変えてくり返し動かす
ホーンの取り付け⾓角度度を  
決めるときに便便利利です
②Processingからサーボを動かす
#include	
  <Servo.h>	
   //サーボライブラリを使用する	
  
Servo	
  servo0;	
   	
   //インスタンスservo0を作る	
  
	
  	
  
int	
  deg;	
   	
   //角度の変数degを宣言	
  
	
  	
  
	
  	
  
void	
  setup(){	
  
	
  	
  servo0.attach(2);	
   //サーボモータ信号線をつなぐピンを2番ピンに指定	
  
	
  	
  Serial.begin(9600);	
  //シリアル通信を9600bpsで開始	
  	
  	
  
}	
  
	
  	
  
void	
  loop(){	
  
	
  	
  //シリアル通信で送られてきたデータがあれば以下を実行	
  
	
  	
  if	
  (Serial.available()>0){	
  
	
  	
  	
  	
  deg	
  =	
  Serial.read();	
  	
  //シリアル通信で送られてきたデータをdegに代入	
  
	
  	
  	
  	
  servo0.write(deg);	
  	
  	
  	
  //サーボモータの回転角度をdegにセット	
  
	
  	
  }	
  
}	
  
!
!
・DCモーターでやったことと基本的に一緒です
import	
  processing.serial.*;	
   //シリアル通信ライブラリのインポート	
  
Serial	
  myPort;	
   	
   	
   //オブジェクト変数の宣言	
  
int	
  ArduinoPortNum	
  =	
  5;	
   	
   //コンソールに表示されたポート番号に設
定	
  
int	
  degree;	
   	
   	
   //角度の変数	
  
	
  	
  
void	
  setup(){	
  
	
  	
  frameRate(30);	
   	
   //画面のフレームレートを30fpsに	
  
	
  	
  size(220,	
  300);	
   	
   //画面サイズの設定	
  
	
  	
  println(Serial.list());	
  //コンソールにポート一覧を表示	
  
	
  	
  //ポート番号ArduinoPortNumを9600bpsでオープンする	
  
	
  	
  myPort	
  =	
  new	
  Serial(this,	
  Serial.list()[ArduinoPortNum],	
  9600);	
  
}	
  
	
  	
  
void	
  draw(){	
  
	
  	
  background(100,250,250);	
  	
  	
  
	
  	
  stroke(255);	
  
	
  	
  line(0,235,250,235);	
  
	
  	
  fill(0,110,220);	
  	
  	
  
	
  	
  textAlign(CENTER,	
  CENTER);	
  
	
  	
  text("degree",width/2,80);	
  
	
  	
  //マウス座標をサーボの回転角度に使う	
  
	
  	
  if(20<=mouseX	
  &&	
  mouseX<=200){	
  
	
  	
  	
  	
  degree	
  =	
  mouseX-­‐20;	
  
	
  	
  	
  	
  ellipse(mouseX,235,10,10);	
  
	
  	
  	
  	
  text(degree,width/2,100);	
  
	
  	
  }	
  	
  	
  
	
  	
  if(20>mouseX){	
  
	
  	
  	
  	
  degree	
  =	
  0;	
  
	
  	
  	
  	
  ellipse(20,235,10,10);	
  
	
  	
  	
  	
  text(degree,width/2,100);	
  
	
  	
  }	
  	
  	
  
	
  	
  if(200<mouseX){	
  
	
  	
  	
  	
  degree	
  =	
  180;	
  
	
  	
  	
  	
  ellipse(200,235,10,10);	
  
	
  	
  	
  	
  text(degree,width/2,100);	
  
	
  	
  }	
  
	
  	
  myPort.write(degree);	
   //回転角度degreeを送信	
  
}	
  
Arduino  
servo_̲3.ino  
シリアルで受信した値を回転⾓角度度に使うスケッチ
Processing  
servoController.pde  
マウス座標を0〜~180の範囲でArduinoに送信
マウスを動かすと

サーボの⾓角度度が変わります
5.!! 応用例
①距離センサとの連携
例例:居眠り防⽌止ピコピコハンマー
距離離センサ

(机の上に設置)
RCサーボ
ピコピコ  
ハンマー
Arduino

⾒見見切切れてます
照明⽤用スタンド
・頭が垂れる動作を距離離センサで検出する居眠り検出システム  
!
・距離離センサと頭との距離離が⼀一定値以下になるとサーボが動作  
!
・インチキくさい⽅方法ですが(まぁインチキなのですが),  
  ガチな居眠り検出法においても  
  眠気そのものを計測しているのではなく,  
  眠気と相関のある物理理量量を計測しています  
  (⾞車車の操縦パターンや⼼心拍,⾎血圧,呼吸や眼球運動など)  
!
・10分あれば作成可能
居眠りすると頭を叩いて起こしてくれます
叩く!
①距離センサとの連携
居眠り防⽌止ピコピコハンマーのスケッチと回路路/*距離センサはシャープ測距モジュールGP2Y0A21YKを使用*/	
  
#include	
  <Servo.h>	
  	
  //サーボライブラリのインポート	
  
Servo	
  servo0;	
  	
  //インスタンスservo0を作成	
  
int	
  sensorPin	
  =	
  0;	
  	
  //アナログ0番ピン(A0)を距離センサと接続	
  
int	
  sensorValue	
  =	
  0;	
  	
  //センサの読み取り値を入れる変数	
  
int	
  tempValue	
  =	
  0;	
  	
  //センサの読み取り値を入れる変数	
  
	
  	
  
void	
  setup(){	
  
	
  	
  Serial.begin(9600);	
  	
  //シリアル通信を開始	
  
	
  	
  servo0.attach(2);	
  	
  //デジタル2番ピンにサーボをつなぐ	
  
}	
  
	
  	
  
void	
  loop(){	
  
	
  	
  sensorValue	
  =	
  analogRead(sensorPin);	
  	
  //センサ値の読み取り	
  
	
  	
  tempValue	
  =	
  sensorValue;	
  	
  //tempValueに値を保管	
  
	
  	
  
	
  	
  /*距離が近過ぎたときセンサの値が発散することを無視*/	
  
	
  	
  if	
  (sensorValue	
  <	
  70){	
  
	
  	
  	
  	
  sensorValue	
  =	
  70;	
  
	
  	
  }	
  
	
  	
  else{	
  
	
  	
  	
  	
  sensorValue	
  =	
  tempValue;	
  
	
  	
  }	
  
	
  	
  /*距離センサの読み取り値を距離[cm]に変換*/	
  
	
  	
  int	
  range	
  =	
  (6787	
  /	
  (	
  sensorValue	
  -­‐	
  3))	
  -­‐	
  4;	
  
	
  	
  /*シリアルモニタに変換後の距離[cm]と生データを表示*/	
  
	
  	
  Serial.print(range);	
  
	
  	
  Serial.print("	
  ,	
  ");	
  
	
  	
  Serial.print(sensorValue);	
  
	
  	
  Serial.print("na");	
  
	
  	
  /*対象物とセンサとの距離が20cm以下のときサーボを動作*/	
  	
  	
  
	
  	
  if	
  (range	
  <	
  20){	
  
	
  	
  	
  	
  servo0.write(110);	
  
	
  	
  	
  	
  delay(500);	
  
	
  	
  	
  	
  servo0.write(10);	
  
	
  	
  	
  	
  delay(1500);	
  
	
  	
  	
  	
  servo0.write(110);	
  
	
  	
  	
  	
  delay(100);	
  
	
  	
  }	
  
	
  	
  else{	
  
	
  	
  	
  	
  servo0.write(90);	
  
	
  	
  }	
  
}
距離離センサ:シャープ測距モジュールGPY0A21YK  
さきほど組んだRCサーボの回路路をそのまま使います  
距離離センサはシャープ測距モジュールGPY0A21YK(1個400円)を使⽤用
⽩白:センサ出⼒力力  
⾚赤:グランド  
!
⿊黒:Vcc(5V)  
写真のように,  
邪悪な配線⾊色仕様になっているので  
配線時には間違えないよう  
ご注意ください
②音との連携
例例:おどるぬいぐるみ
・RGB-‐‑‒LEDも使⽤用したためArduino1台ではピン数が⾜足りず,  
  2台のArduinoを同期させることで対応しました  
  他にもっとスマートなやり⽅方はあるかもしれません  
・Processingでのオーディオライブラリminimの使⽤用については  
  前回ワークショップ資料料に記述しています
両⼿手・両⾜足にRCサーボをセット  
DCモーター1個で動くおどるおもちゃをハック  
(デフォルトでは⼀一定のテンポでしかおどれない)  
I2Cで同期  
シリアル通信  
マイクからの⾳音⼊入⼒力力を

オーディオライブラリを使って分析  
サーボ制御  
DCモーター制御  
③ちょっとだけ複雑な制御
例例:対象を追尾するロボットアーム
・ProcessingのサンプルReach  2  http://www.processing.org/examples/reach2.html  
・先端がマウス座標を追いかける多関節モデル  
!
!
!
!
!
!
!
!
!
!
中⾝身を以下のように改造:  
・実際のRCサーボの個数と関節数を⼀一致させて  
  隣隣り合うサーボ間の相対的な⾓角度度[°]を取得し,  
  シリアルでArduinoへ送信  
!
・カメラで認識識した対象を追わせたり,  
  KinectやLeapと連携させてアバターロボットを作ることが可能

  (⾃自分が⼿手を振ると⼿手を振りかえすロボットなど)  
!
・Processingには他にもメカを作る上で便便利利なサンプルがたくさんあります
RCサーボとアイスの棒で制作した例例  
6.!! 実用に向けてのTips
1. 工作に便利な工具!
!
・先述のハンダごてやワイヤストリッパはホームセンターなどで買えます!
 !
・最近は100均ショップも工具コーナーが充実!!
 大体必要なものは100均で うかも?!
!
あったら便利なもの!
・接着系:セロハンテープ,ビニールテープ,アロンアルファ,ホットボンド!
・ニッパ,ラジオペンチ!
・ドライバー!
・ハンドドリル,電動ドリル!
・金属ノコギリ!
・ニプリングツール(金属板が簡単に切れます)!
・ベンディングツール(金属板が簡単に曲げられます)!
・金属ヤスリ,紙ヤスリ
2. 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個!
 またはXBee USBアダプタなど!
!
③XBee 2.54mmピッチ変換基板! ! ! ! ! 1個!
 ※ハンダ付け必要!
 XBeeはこれを間に挟まないとブレッドボードに挿せない!
① ② ③
必要なソフトウェア!
!
・XBeeモジュールの設定変更のためにターミナルソフトウェアが必要!
 WindowsだとTeraTerm,MacだとCoolTermなど

・公式設定プログラムX-CTUは現在のバージョンからMacでも利用可能に!
 http://www.digi.com/support/productdetail?pid=3352!
!
・Baud Rate,ネットワークID,自分のアドレス,相手のアドレス!
 を設定すればOK!
!
細かいところはググってください 難しくないです
3. 回路の耐久性を上げる!
!
ブレッドボードの長所 短所!
!
ジャンプワイヤを簡単に抜き差しして回路を変更可能なため!
実験,プロトタイピングに便利!
!
!
!
ラジコンのように回路自体が運動する場合,

運動の勢いや衝撃によって配線が外れてしまうおそれがある!
!
厳密には短所というより,そもそも試作を意図したブレッドボードの使い方として不適切。。
3. 回路の耐久性を上げる!
!
解決法①!
!
ブレッドボードでも配線が外れなければ良いんでしょという考え方!
!
!
!
接続部をガチガチに固める!
!
!
!
ホットボンドという便利なものがある
3. 回路の耐久性を上げる!
!
ホットボンド (グルーガン)!
秋葉原,ハンズなどで1000円以下で販売!
先端が高温になるので注意交換用スティック
熱で接着材を溶かして固めたい場所に
ニュニュニュッとつける 
3. 回路の耐久性を上げる!
!
ホットボンドで固めた例!
見た目さえ気にしなければ手軽で便利,わりと丈夫!
一度固めてしまうと引き返すのはかなり難しいので
回路に間違いがないことを十分確認しておきましょう
3. 回路の耐久性を上げる!
!
解決法②!
!
ブレッドボードに別れを告げてより強固にする!
!
!
!
基板にハンダ付けする!
!
!
!
ユニバーサル基板という便利なものがある
3. 回路の耐久性を上げる!
!
ユニバーサル基板 & ハンダ付け!
ハンダ,ハンダごて,こて台
高温に注意
ユニバーサル基板
ビニール被覆導線
3. 回路の耐久性を上げる!
!
あったら作業がはかどる!
ワイヤストリッパ
導線の被覆が簡単に取れる
ニッパ
導線などを簡単に切断
ArduinoやProcessing,!
電子工作などでつまづいたら!
!
・人に相談する(comacafeで情報共有しましょう!)!
!
・公式リファレンスを見る(メニュー → ヘルプ → リファレンス)!
!
・公式フォーラムを見る!
!
・ググる!
!
・秋葉原に行く,通販サイトをサーフィンする!
!
・よく分からないけど気になるので買ってみる!
!
・気になる単語,知らない単語は調べてみる!
 Wikipediaで2∼3行だけ読んで頭に入れておけば実用上は事足りるケースが!
 意外にあったりする(もちろんしっかり体系的に学ぶに越した事はなし)!
!
新しいものを作ったら発表・公開しましょう!
!
!
・モーターやセンサの組み合わせで色んなものを作ってみてください!
!
!
・「こんなのつくった!」とcomacafe ( https://www.facebook.com/groups/659703957384006/ )

 で公開したりcomaの会場に持って来てもらえると嬉しいです!!
!
!
・仕組み,技術,トラブル,色んな情報を共有しましょう!
!
!
・本資料が皆様のものづくりに少しでも役立てばこの上ない喜びです!
!
!
・資料中に間違い,気になったことあればEtoまでご指摘ください

coma Study Room vol.2 Arduino Workshop