More Related Content Similar to coma Study Room vol.2 Arduino Workshop (20) coma Study Room vol.2 Arduino Workshop1. 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! ! ! ! ! !
4. coma Study Room vol.1
Arduinoで
データを取得
シリアル通信
(有線)
加速度度センサで
加速度度を検出
Processingで
データを取得
加速度センサ+Arduino PC
加速度度に応じて
RGB-‐‑‒LEDを点灯
前回のワークショップ内容
加速度度を
ビジュアライズ
・センサを使った⼯工作⼊入⾨門として,加速度度センサの情報を視覚化するシステムを作りました
!
・ベースになっているのはcomaDiscothequeVer0.02に出演したcomakumaシステムです
☆ワークショップとcomakumaの詳細は
comaページ(http://coma.io/)
にて公開しています
センサを振ると球が動く
10. ・デジタル出⼒力力ピン
・〜~が付いているのは疑似アナログ出⼒力力(PWM)に使える(0〜~5V)
→ モーターの回転速度度を変える,LEDの明るさを変えるなど
・アナログ⼊入⼒力力ピン
センサの出⼒力力ピンと接続
・5Vピン,3.3Vピン
素⼦子への電源供給に使⽤用
今回はモータードライバの電源として5Vを使⽤用
・アナログ基準電圧ピン
アナログ⼊入⼒力力ピンの基準電圧を
⼊入⼒力力する
基本的にセンサの電源電圧と
同じにすればOK
・グランドピン(複数有)
素⼦子のグランドを
ここに接続
・USB端⼦子
5V給電
通信
Arduinoの構成
〜~Unoの場合〜~
他も基本は同じ
15. モータードライバ 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 デジタルピン
①接続⽅方法
②ファンクション
21. ①モータードライバの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ミリ秒)以上の
ストップ時間を挟むことが推奨されています
24. ②回転数を変更する
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の明るさが制御できます
25. ③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/
マウスを動かすと
モーターの回転数が変わります
29. ①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
いくつか回転⾓角度度を変えてくり返し動かす
ホーンの取り付け⾓角度度を
決めるときに便便利利です
30. ②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に送信
マウスを動かすと
サーボの⾓角度度が変わります
33. ①距離センサとの連携
居眠り防⽌止ピコピコハンマーのスケッチと回路路/*距離センサはシャープ測距モジュール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)
写真のように,
邪悪な配線⾊色仕様になっているので
配線時には間違えないよう
ご注意ください
40. 必要な部品一覧!
!
①XBee シリーズ1モジュール! ! ! ! ! ! 2個!
!
②XBee エクスプローラUSBドングル! ! ! ! 1個!
またはXBee USBアダプタなど!
!
③XBee 2.54mmピッチ変換基板! ! ! ! ! 1個!
※ハンダ付け必要!
XBeeはこれを間に挟まないとブレッドボードに挿せない!
① ② ③