sfc デザイン言語ws(電子工作)第5回「led/駆動部品を使う」
TRANSCRIPT
4
出力方法
デジタルアウトプット
High(5V), Low(0V)を出力する。
digitalWrite(ピン番号, 状態);
アナログアウトプット
PWMによって0~255までの256段階の出力をする。
analogWrite(ピン番号, 状態);
5
PWM
Arduinoのピン制御はHigh(5V)かLow(0V)だけで、
無段階に電圧を変える事はできない。
段階的に制御するためには、HighとLowの時間的な割合によって、平均電圧を
コントロールする。この方法をPWM(Pulse Width Modulation / パルス幅変
調) という。
7
点灯1msec, 消灯9msec
高速で点滅するため、10%の明るさに見える。
復習 Blinkのコードを改造
void setup() {
pinMode(12, OUTPUT);
}
void loop() {
digitalWrite(12, HIGH);
delay(1);
digitalWrite(12, LOW);
delay(9);
}
12
コード解説
int led = 9;
int brightness = 0;
int fadeAmount = 5;
void setup() {
pinMode(led, OUTPUT);
}
LEDを接続するピンは9番
LEDの明るさを保持する変数
明るさの変化を表す変数
ledピンをアウトプット用に設定
13
コード解説
void loop() {
analogWrite(led, brightness);
brightness = brightness + fadeAmount;
if (brightness == 0 ¦¦ brightness == 255) {
fadeAmount = -fadeAmount ;
}
delay(30);
}
LEDの明るさを設定する。
指定したデューティ比のPWMを送る。
デューティ比は0~255の値を指定する
brightness 0=0%
brightness 127=50%
brightness 255=100%
14
コード解説
void loop() {
analogWrite(led, brightness);
brightness = brightness + fadeAmount;
if (brightness == 0 ¦¦ brightness == 255) {
fadeAmount = -fadeAmount ;
}
delay(30);
}
デューティ比を指定する変数(brightness)
に変化量(fadeAmount)を加える。
15
コード解説
void loop() {
analogWrite(led, brightness);
brightness = brightness + fadeAmount;
if (brightness == 0 ¦¦ brightness == 255) {
fadeAmount = -fadeAmount ;
}
delay(30);
}
brightnessが最大(255)、または最小(0)になったら、増
減を反転する。次のループでは、-5するので、brightness
は0から255の間を往復する。
19
サンプルコードconst int LED = 9;
const int SENSOR = A0;
void setup() {
pinMode( LED, OUTPUT );
pinMode( SENSOR, INPUT );
}
void loop() {
int value = analogRead( SENSOR );
analogWrite( LED, value/4 );
delay(10);
}
analogReadで読み込む値は1024段階。
analogWriteは256段階なので、valueの値を
1/4にする。
SENSOR(A0ピン)の値を読み込み、
変数 value に保持する。
21
フルカラーLED
赤・青・緑のLEDが1つのパッケージに
まとめた物をフルカラーLEDと呼ぶ。実
際には個々の明るさを制御し、加色混合
によってさまざまな色に見せている。
アノードを纏めているタイプ(アノード
コモン)とカソードを纏めているタイプ
がある(カソードコモン)。
キットに入っているのはアノードコモン。
端子の役割は右図参照。R(ー)
アノード(+)
G (ー)
B (ー)
27
ヒント
if( (crntBtnState == HIGH ) && (prevBtnState == LOW) ){
}
ボタンの現在の状態と、一つ前の状態を比較して、押した瞬間を検知する。
random( 最小値, 最大値 );
ランダムな値を取得する
29
サンプルコード// Pin番号を設定
const int redPin = 9;
const int greenPin = 10;
const int bluePin = 11;
const int btnPin = 2;
// 変数の定義
bool crntBtnState = false;
bool prevBtnState = false;
int redValue = 0;
int greenValue = 0;
int blueValue = 0;
void setup() {
// Pinの使用方法設定
pinMode( btnPin, INPUT );
pinMode( redPin, OUTPUT );
pinMode( greenPin, OUTPUT );
pinMode( bluePin, OUTPUT );
}
void loop() {
// ボタンの状態を読み取り
crntBtnState = digitalRead(btnPin);
// 現在のボタンの状態がHIGHで、前の状態がLOWの場合(ボタンを押した瞬間)
if( (crntBtnState == HIGH ) && (prevBtnState == LOW) ){
// 色をランダムに設定する
redValue = random( 0, 255 );
greenValue = random( 0, 255 );
blueValue = random( 0, 255 );
// 状態が安定するまで0.01秒待つ
delay(10);
}
// LED各色を出力
analogWrite( redPin, redValue );
analogWrite( greenPin, greenValue );
analogWrite( bluePin, blueValue );
// 現在のボタンの状態を過去の状態として保存しておく
prevBtnState = crntBtnState;
}
35
トランジスタ
ベース(B)
コレクタ(C)
エミッタ(E)
エミッタ(E)コレクタ(C)ベース(B)
Arduinoからの電流
たくさん流れる
トランジスタは、電気の流れをコントロールする部品。ON/OFF の切り替えや、
信号の増幅に使う。ベースの電流に応じて、残りの2本の間にも電気が流れる。
36
FET
FET(電解効果トランジスタ)は、大電流のスイッチングなどに使われる。
ゲートの電圧に応じて、残りの2本の間にも電気が流れる。
ゲート(G)
ドレイン(D)
ソース(S)
ゲート(G)
ドレイン(D)
ソース(S) Arduinoからの電圧
たくさん流れる
40
サンプル回路
たくさん流れる
モーターやソレノイドなどは、電源のON/OFF
時に逆向きの高い電圧が生じ(逆起電力)、
FETやトランジスタにダメージを与える。
これを回避するために、電流を一方通行にす
るダイオードを使う。
43
部品表
小型ソレノイド5V ROB-11015https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-0E34
FET 2SK2232http://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=7A75-4MDW
一般整流用ダイオード 1N4007http://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=3847-M54C
抵抗 1kオーム 2本http://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=7AXS-6UHC
スイッチ付き電池ボックス(単3X4)SBH-341AShttp://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=4APB-CSGT
47
モータードライバIC
Hブリッジという組み方で、4個のトランジスタが入っている。
2本のピンのHIGH/LOWで正転・逆転・停止・無制動をコントロールできる。
1 2 3 4 5 6 7 8 9 10
ピン番号 端子記号 接続先1 GND Arduino GND2 OUT1 モータの端子3 NC 無接続4 Vref 10kΩの抵抗を経て電池の+5 IN1 Arduino PIN5 6 IN2 Arduino PIN67 Vcc Arduino 5V8 VIN 電池の+9 NC 無接続10 OUT2 モータの端子
48
モータードライバIC
ArduinoのPin5/6のHigh/Lowの組み合わせにより、
モーターの動作をコントロールできる。
入力 出力
動作
IN1 (Pin5) IN2 (Pin6) OUT1 OUT2
LOW LOW ハイインピーダンス ハイインピーダンス 無制動
HIGH LOW HIGH LOW 正転
LOW HIGH LOW HIGH 逆転
HIGH HIGH LOW LOW ブレーキ
53
サンプルスケッチ
int IN1 = 5;
int IN2 = 6;
void setup(){
pinMode( IN1, OUTPUT );
pinMode( IN2, OUTPUT );
}
void loop(){
digitalWrite( IN1, HIGH );
digitalWrite( IN2, LOW );
delay( 1000 );
digitalWrite( IN1, HIGH );
digitalWrite( IN2, HIGH );
delay( 1000 );
digitalWrite( IN1, LOW );
digitalWrite( IN2, HIGH );
delay( 1000 );
digitalWrite( IN1, HIGH );
digitalWrite( IN2, HIGH );
delay( 1000 );
}
正転
ブレーキ
逆転
ブレーキ
55
左右のモーターの制御
左モーター 右モーター 動作
IN1 (Pin5) IN2 (Pin6) IN1 (Pin12) IN2 (Pin13)
HIGH LOW HIGH LOW 直進
LOW HIGH LOW HIGH 後進
HIGH LOW LOW HIGH 右旋回
LOW HIGH HIGH LOW 左旋回
HIGH HIGH HIGH HIGH ブレーキ
57
部品表
DCモーター RE260RAhttp://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=A5NX-7MK8
モータードライバー TA7291P
http://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=55HW-6SGX
抵抗 10kΩ
スイッチ付き電池ボックス(単3X2) SBH-321AShttp://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=2APN-CME5
http://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=6AJS-7UJ6
58
参考資料
Arduinoを使ったラジコン制作の記事
http://hrhrblog.blogspot.jp/2010/08/arduino-
fio-1.html
60
ステッピングモーター
A
A-
B B-
ロータ
コイル
複数のコイルとローターで構成される。コイルを交互に磁化して、ローターを
引きつける事で回転する。
ロータ コイル
A
B
A-
B-
A
B
A-
B-
61
ステッピングモーター制御方法
4本の入力(A,B,A-,B-)のHigh,Lowの組
み合わせで、Step0~3の状態になる。
Stepを順番にくりかえす事で、回転する。
A-
B-
A
B
1 2 3 4 1 2 3 4 1
Step
参考:PICで遊ぶ電子工作「ステッピングモータの制御」
http://homepage3.nifty.com/mitt/pic/pic5_19.html
2
62
ステッピングモータードライバIC
専用のドライバICを使うことで、簡単に制御することができる。
2本の信号線の組み合わせで、Step0~3の状態を出力する。
http://akizukidenshi.com/catalog/g/gI-07408/TB6674PG
IN A
HIGH LOW
IN B
HIGHStep0
(A, B = HIGH)
Step1
(A-, B = HIGH)
LOWStep3
(A, B- = HIGH)
Step2
(A-, B- = HIGH)
63
ピン配列
ピン番号 端子記号 接続先
1 Vs2 A 5V
2 Vcc 5V
3 IN A Arduino D3
4 GND GND
5 GND GND
6 IN B Arduino D2
7 PS 5V
8 Vs2 B 5V
9 Vs1 B 電池の+
10 φB モーターのB端子
11 φ-B モーターのB-端子
12 GND GND
13 GND GND
14 φ-A モーターのA-端子
15 φA モーターのA端子
16 Vs1 A 電池の-
1 2 3 4 5 6 7 8
16 15 14 13 12 11 10 9
66
サンプルスケッチ#define INAPIN (3)
#define INBPIN (2)
int stepCount;
boolean rotationDirection;
void setup(){
pinMode(INAPIN, OUTPUT);
pinMode(INBPIN, OUTPUT);
Serial.begin(9600);
stepCount = 0;
rotationDirection = true;// true = 右回り, false = 左回り
}
入力に使うピンを指定
回転方向を決める変数
67
サンプルスケッチvoid loop(){
if( rotationDirection ){//右回転の場合
stepCount++;//ステップカウントを増やす
if( stepCount >= 4 ){//オーバーしたら0に戻す
stepCount = 0;
}
}else{//左回転の場合
stepCount--;//ステップカウントを減らす
if( stepCount < 0 ){//0未満になったら3に戻す
stepCount = 3;
}
}
step_forward( 10, stepCount );//ステップを勧める
}
右回転の場合、stepCountを増やす。
右回転の場合、stepCountを減らす。
68
サンプルスケッチvoid loop(){
if( rotationDirection ){//右回転の場合
stepCount++;//ステップカウントを増やす
if( stepCount >= 4 ){//オーバーしたら0に戻す
stepCount = 0;
}
}else{//左回転の場合
stepCount--;//ステップカウントを減らす
if( stepCount < 0 ){//0未満になったら3に戻す
stepCount = 3;
}
}
step_forward( 10, stepCount );//ステップを進める
}
右回転の場合、stepCountを増やす。
10m秒毎にステップを進める。
69
サンプルスケッチvoid step_forward( int _delay, int _stepCount ){
switch( _stepCount ){
case 0:
// A,B = HIGH
digitalWrite(INAPIN, HIGH);
digitalWrite(INBPIN, HIGH);
break;
case 1:
// B,A- = HIGH
digitalWrite(INAPIN, LOW);
digitalWrite(INBPIN, HIGH);
break;
ステップ0
D2,D3にHighを出力。
ステッピングモータードライバのA
とBがHighになる。
A-
B-
A
B
0 1 2 3 0 1 2 3 0 1
70
サンプルスケッチ case 2:
// P1:off, P2:off, P1B:ON, P2B:ON
digitalWrite(INAPIN, LOW);
digitalWrite(INBPIN, LOW);
break;
case 3:
// P1:ON, P2:off, P1B:off, P2B:ON
digitalWrite(INAPIN, HIGH);
digitalWrite(INBPIN, LOW);
break;
}
delay(_delay);
}
指定した時間処理を止める。
10mSec以下では、脱調(回転が噛みあわない状態)となり、
回転しない。
72
サーボモーター
回転子(ローター)の速度や位置を計測する回転検出器(エンコーダー)を備えた
モーター。直流で動作する物をDCサーボモーターという。エンコーダーで得た
情報を利用し、回転速度や角度の指定など細かな制御ができる。
ロボットの関節 ラジコンのステアリング
73
配線
サーボからは、電源・GND・信号の3本が出ているが、配列はメーカーによっ
て違うので、それぞれのデータシートを参照。
GND
電源
信号
GWSサーボ
橙:信号、赤:電源、茶:GND
パララックス スタンダードタイプアナログサーボ
白:信号、赤:電源、黒:GND
74
サーボモーターの制御
サーボモーターは、信号端子に入力するパルスの時間で制御する。
一般的に、1ミリ秒で最小角、1.5ミリ秒で中央、2ミリ秒で最大角となる。
1msec
最小角
1.5msec
中央
2msec
最大角
15 - 20 msec周期
75
サーボライブラリ
Arduinoではサーボモーターを簡単に使えるライブラリを利用する。
角度を直接指定できるので、とても使いやすい。
#include <Servo.h>
Servo myservo;
void setup() {
myservo.attach(9);
myservo.write(90);
}
void loop() {}
90度に指定するスケッチ
80
サンプルスケッチ
#include <Servo.h>
Servo myservo;
int potpin = 0;
int val;
void setup()
{
myservo.attach(9);
}
サーボライブラリを読み込む。
利用できるライブラリは、
[Sketch]-[Import Library]から選択する。
81
サンプルスケッチ
#include <Servo.h>
Servo myservo;
int potpin = 0;
int val;
void setup()
{
myservo.attach(9);
}
Servoクラスのインスタンスを生成。
myservoという名前で、サーボの機
能を使えるようにする。
82
サンプルスケッチ
#include <Servo.h>
Servo myservo;
int potpin = 0;
int val;
void setup()
{
myservo.attach(9);
}
半固定抵抗のピン
サーボの角度を保持
83
サンプルスケッチ
#include <Servo.h>
Servo myservo;
int potpin = 0;
int val;
void setup()
{
myservo.attach(9);
}
サーボの信号線を接続するPINを指定
84
サンプルスケッチvoid loop()
{
val = analogRead(potpin);
val = map(val, 0, 1023, 0, 179);
myservo.write(val);
delay(15);
}
半固定抵抗の値を読み取る
analogReadで読み取った値(1024段階)
を角度(0°~179°)に変換。
85
サンプルスケッチvoid loop()
{
val = analogRead(potpin);
val = map(val, 0, 1023, 0, 179);
myservo.write(val);
delay(15);
}
サーボに角度を指定する
88
部品表
スタンダードサーボモータhttp://akizukidenshi.com/catalog/g/gM-06837/
電池ボックス 単3×4本用http://akizukidenshi.com/catalog/g/gP-00311/
半固定抵抗http://akizukidenshi.com/catalog/g/gP-03277/
92
電気特性について
入力
・順電流 ONにしたい時にマイコンから流す電流。
・最大定格 逆電圧 +-逆に流せる最大の電圧
出力
・実効オン電流 交流で流れる電流。100Vで80Wの機器なら0.8A
・電源電圧 交流の電圧。100Vか250Vか
93
市販品
S216S02
250V / AC16A
S108T02
125V / AC8A
G3NE220TDC12V
264V / AC20A
http://akizukidenshi.com/catalog/g/gI-05569/
http://akizukidenshi.com/catalog/g/gI-05568/
http://www.marutsu.co.jp/shohin_10378/
94
SSR キット
数カ所ハンダ付けするだけですぐに使える。
AC定格:80VAC~120VAC 最大8A。
定格が800Wなので、使用する機器は500Wくらい
に抑える。
LED電球20W、 扇風機50W、加湿器300W
トースター1000W、ドライヤー1200W、
掃除機1000W
http://akizukidenshi.com/catalog/g/gK-06009/
95
配線図
3つの端子台にArduinoから、5V, GND, DigitalOutを接続。
2つの端子台には、電球等を繋ぎコンセントへ差す。
5V
GND
AC100V
13番ピンGND
機器を繋ぐ
96
サンプルスケッチ
Arduino IDE のメニュー
[ファイル]-
[スケッチの例]-
[02.Digital]-
[Button] を開く。
Arduinoに書き込む。
LEDの制御と同じように、digitalWrite
でACをコントロールできる。
98
注意
交流は感電したり火傷すると大変危険です。
十分注意して作業し、完成品の絶縁対策も必ず行なってください。
・作業中はハンダ面に絶縁テープを貼り、
完成品はプラスチックのケースに納めるなど、ショートしないようにする。
・配線は必ず電源を切った状態で行う。
・ACのケーブルは、容量に見合った太さのものを使う。
例:125V / 7A
電線太さ:0.75 mm2(sq) ≒ AWG #18
絶縁抵抗(MΩ): DC500V、100MΩ以上
99
部品表
ソリッド・ステート・リレーキット http://akizukidenshi.com/catalog/g/gK-06009/
タクトスイッチ http://akizukidenshi.com/catalog/g/gP-03647/
抵抗 10kΩ 1本 http://akizukidenshi.com/catalog/g/gR-25103/
100V用延長コード 100円ショップなど
コンセント http://www.akaricenter.com/denzai/plug/wk1012w.htm