101
Makoto Hirahara 第5回 LED/駆動部品を使う 5.8 2015 DIY ELECTRONICS デザイン言語ワークショップ(電子工作)

SFC デザイン言語WS(電子工作)第5回「LED/駆動部品を使う」

Embed Size (px)

Citation preview

Makoto Hirahara

第5回 LED/駆動部品を使う

5.8 2015

DIY ELECTRONICSデザイン言語ワークショップ(電子工作)

2

今日の内容

• Analog Output(PWM)

• フルカラーLED

• ソレノイド

• DCモータ

• ステッピングモーター

• サーボモーター

• SSR

ANALOG OUTPUT

4

出力方法

デジタルアウトプット

High(5V), Low(0V)を出力する。

digitalWrite(ピン番号, 状態);

アナログアウトプット

PWMによって0~255までの256段階の出力をする。

analogWrite(ピン番号, 状態);

5

PWM

Arduinoのピン制御はHigh(5V)かLow(0V)だけで、

無段階に電圧を変える事はできない。

段階的に制御するためには、HighとLowの時間的な割合によって、平均電圧を

コントロールする。この方法をPWM(Pulse Width Modulation / パルス幅変

調) という。

6

PWM

0%

ずっと消えている

H

L

1%

1/100 の明るさ

50%

1/2の明るさ

100%

点灯し続ける

どれくらいの割合で点灯しているか = デューティー比

7

点灯1msec, 消灯9msec

高速で点滅するため、10%の明るさに見える。

復習 Blinkのコードを改造

void setup() {

pinMode(12, OUTPUT);

}

void loop() {

digitalWrite(12, HIGH);

delay(1);

digitalWrite(12, LOW);

delay(9);

}

8

ArduinoにはPWMを行うハードウェア

が備わっている。

3, 5, 6, 9, 10, 11ピン。

PWMに使えるピン

9

サンプル回路

330Ω(橙橙茶金)

10

サンプル回路

11

サンプルスケッチ

[ファイル]-

[スケッチの例]-

[01.Basics]-

[Fade] を開く。

Arduinoに書き込む。

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の間を往復する。

16

【練習】

可変抵抗で、LEDの明るさを変える。

次ページ以降、回路図・サンプルコード載せていますが、まずは自分でやって

みてください。

17

サンプル回路

18

サンプル回路

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 に保持する。

FULL COLOR LED

21

フルカラーLED

赤・青・緑のLEDが1つのパッケージに

まとめた物をフルカラーLEDと呼ぶ。実

際には個々の明るさを制御し、加色混合

によってさまざまな色に見せている。

アノードを纏めているタイプ(アノード

コモン)とカソードを纏めているタイプ

がある(カソードコモン)。

キットに入っているのはアノードコモン。

端子の役割は右図参照。R(ー)

アノード(+)

G (ー)

B (ー)

22

サンプル回路

R:510Ω(緑茶茶金)

G,B:330Ω(橙橙茶金)

23

サンプル回路

24

サンプルスケッチ

授業ページから、サンプルスケッチ

をダウンロードし、

FullColor_Sampleを

Arduinoに書き込む。

それぞれのLEDが段階的に変化し、

色が変わる。

25

参考動画

https://youtu.be/xqZk-TV1uqA

26

【練習】スイッチを押すたびに、ランダムな色を表示する。

https://youtu.be/ld7z6ybrjQ8

27

ヒント

if( (crntBtnState == HIGH ) && (prevBtnState == LOW) ){

}

ボタンの現在の状態と、一つ前の状態を比較して、押した瞬間を検知する。

random( 最小値, 最大値 );

ランダムな値を取得する

28

サンプル回路

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;

}

SOLENOID

31

ソレノイド

ソレノイドとは密に巻いたコイル。

コイルに電流を流し磁場を発生させて、金属棒を作動させるソレノイドアクチュ

エーターをさす場合が多い。 押し出すタイプと引っ張るタイプがある。

32

サンプル回路 こうしたくなるところですが、

それぞれのピンは40mAまでしか電流を流せない。

LEDを点灯するには20mAなので十分だが、ソレ

ノイドを駆動するには電力が足りない。

33

増幅回路

小さい電力で、大きな電力をコントロールする仕組みが必要。

水門を開けると、

水路を水が流れる。

34

増幅回路

トランジスタ FET

小さい電力で、大きな電力をコントロールする部品。

35

トランジスタ

ベース(B)

コレクタ(C)

エミッタ(E)

エミッタ(E)コレクタ(C)ベース(B)

Arduinoからの電流

たくさん流れる

トランジスタは、電気の流れをコントロールする部品。ON/OFF の切り替えや、

信号の増幅に使う。ベースの電流に応じて、残りの2本の間にも電気が流れる。

36

FET

FET(電解効果トランジスタ)は、大電流のスイッチングなどに使われる。

ゲートの電圧に応じて、残りの2本の間にも電気が流れる。

ゲート(G)

ドレイン(D)

ソース(S)

ゲート(G)

ドレイン(D)

ソース(S) Arduinoからの電圧

たくさん流れる

37

増幅回路

トランジスタ:ベース(B)

FET:ゲート(G)

トランジスタ:コレクタ(C)

FET:ドレイン(D)

トランジスタ:エミッタ(E)

FET:ソース(S)

38

サンプル回路

39

サンプル回路

たくさん流れる

40

サンプル回路

たくさん流れる

モーターやソレノイドなどは、電源のON/OFF

時に逆向きの高い電圧が生じ(逆起電力)、

FETやトランジスタにダメージを与える。

これを回避するために、電流を一方通行にす

るダイオードを使う。

41

サンプルプログラム

授業ページから

サンプルスケッチをダウンロードし、

Solenoid_Sampleを

Arduinoに書き込む。

42

参考動画

https://youtu.be/zWRb3bdZBtM

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

DC MOTOR

45

DCモーター

電流が流れると磁束と力が発生し回転する。

+/-を逆にすると、逆に回転する。電圧が高いと早く回転する。

DCモーター 振動モーター

46

基本回路

基本的には、ソレノイドと同じようにトランジスタ・FETを使う。

しかし、正転・逆転・静止を制御するためには、電流の向きを変える必要があ

り、回路が複雑になる。

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 ブレーキ

49

参考動画

https://youtu.be/JYWfEbgQ0mo

50

サンプル回路

51

サンプル回路

52

サンプルスケッチ

授業ページから

サンプルスケッチをダウンロードし、

DCMotor_Sampleを

Arduinoに書き込む。

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 );

}

正転

ブレーキ

逆転

ブレーキ

54

ラジコン

+

タミヤ ツインモーターギヤーボックス 70103タミヤ タンク工作基本セット

左右の車輪を個別のモーターに繋ぐ

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 ブレーキ

56

参考動画

https://vimeo.com/14960556

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

STEPPER MOTOR

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

64

サンプル回路

A, A-, B, B-ステッピングモーターのコードが、

どの入力になっているかは、

データシートを確認する。

65

サンプルプログラム

授業ページからサンプルスケッチをダウンロードして、

「StepperMotorDrive.ino」をArduinoにインストール。

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以下では、脱調(回転が噛みあわない状態)となり、

回転しない。

SAVO MOTOR

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度に指定するスケッチ

76

参考動画

https://youtu.be/CVWlMpQ9Q4s

77

サンプル回路

78

79

サンプルスケッチ

[ファイル]-

[スケッチの例]-

[Servo]-

[Knob] を開く。

Arduinoに書き込む。

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);

}

サーボに角度を指定する

86

サンプル回路

負荷を加える場合には、Arduinoから

の電力では足りたいため、乾電池やAC

アダプタなどの外部電源を用いる。

87

サンプル回路

88

部品表

スタンダードサーボモータhttp://akizukidenshi.com/catalog/g/gM-06837/

電池ボックス 単3×4本用http://akizukidenshi.com/catalog/g/gP-00311/

半固定抵抗http://akizukidenshi.com/catalog/g/gP-03277/

SSR

90

リレー

リレーとは電気信号でコントロールするスイッチ。

機械式リレー

入力電流により電磁石から磁力が発生し、スイッチが引き寄せられ通電する。

ソリッドステートリレー

入力電流により内部でLEDを光らせ、フォトトランジスタを反応させて通電す

る。機械部品が無いため、動作が高速・長寿命などのメリットがある。

91

ソリッドステートリレー

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をコントロールできる。

97

参考動画

https://youtu.be/VJGxJLRr4SQ

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

NEXT

101

次回の内容

• コンピュータとの連携

• Processing

• Unity 3D

• Arduinoで音を鳴らす