平成26年度熊本高専Arduino講座 第3週 DCモータの制御

28
平平 26 平平 平平平平平平平平 平平平平平 Arduino 平平平平平平平平平平平3 平平 平平 平平 平平平平平 1. 平平平平平平平平平平平 平平平平平平平平平平 平平平平平平 平平平平平平平平平平平平平 ,, LCD 平平平平 1 DC 平平平平平平 平平平平平平平平平平平平平平 2. 平平平平平平平平平平平平平平 平平平平平平平平 平 平平平平平平平 (), 平平平平平平平平平平平平平平平平平平 平平平平平平平平平

description

熊本高等専門学校が行ったH26年度社会人講座のArduinoによる実用講座 第3週で利用されたスライド資料です。電子工作入門者向けに、DCモータの制御をテーマとしています。講義担当はMI科の湯治准教授です。

Transcript of 平成26年度熊本高専Arduino講座 第3週 DCモータの制御

Page 1: 平成26年度熊本高専Arduino講座 第3週 DCモータの制御

1

平成 26 年度 熊本高等専門学校 社会人講座   Arduino によるマイコン実用講座( 3 週目) 担当:湯治

1.ミニ扇風機スイッチで風量切り替え,温度センサで自動切換え,ゆらぎ機能,液晶キャラクタディスプレイ( LCD )への表示

DC モータの制御2.ベンハムのコマと回転数の検出

可変抵抗による回転速度の制御(ベンハムのコマ),フォトリフレクタを用いたロータリーエンコーダの製作,回転数の検出と表示

Page 2: 平成26年度熊本高専Arduino講座 第3週 DCモータの制御

2

Arduino

回転方向切替え,速度指令,停止などの制御信号を作る

ドライバ IC ( TA7291P )H ブリッジ回路で正転 / 逆転の制御が可能 DC モータ

( RE-140RA )電気(電流)を力(回転力)に変換

1.ミニ扇風機

扇風機工作用プロペラ(羽)回転力を風に変換.逆に回転させると換気扇になる.(購入先:けい・くらふと)

Page 3: 平成26年度熊本高専Arduino講座 第3週 DCモータの制御

3

DC モータ( RE-140RA-2270 )の性能

使用電圧範囲 1.5 ~ 3.0V

適正電圧 1.5 V

適正負荷 0.49 mN ・ m

無負荷回転数 7,200 rpm

適正負荷時の回転数 4,700 rpm

適正負荷時の消費電流 560 mA

Page 4: 平成26年度熊本高専Arduino講座 第3週 DCモータの制御

DC モータ用フルブリッジドライバ(正・逆切り替えドライバ)  TA7291P

4

端子記号

端子番号

端子機能の説明

Vcc 7 ロジック側(回路用)電源

Vs 8 出力側(モータ用)電源Vref 4 制御電源端子

(モータ電圧調整用)GND 1 GND

IN1 5 入力端子 ← Arduino から

IN2 6 入力端子 ← Arduino から

OUT1 2 出力端子 → モータへOUT2 10 出力端子 → モータへ

Vcc = 4.5 ~ 20 V   5V を出力するマイコンで使いやすい.Vs = 0 ~ 20 V   ただし,内部ロス( Vsat )を考慮して印加すること.Vref = 0 ~ 20 V  ただし, Vref Vs≦ となるように使用する.

1 2 3 4 5 6 7 8 9 10

Page 5: 平成26年度熊本高専Arduino講座 第3週 DCモータの制御

H ブリッジとは・・・単一電源で電流の向きを変える

5

Vs

 

Vs

 

Vs

 

Vs

 

2.正転モード  ( CW )

3.逆転モード  ( CCW )

1.停止モード  (ストップ)

4.ブレーキモード (※短絡制動)

内部ロスVsat約 1V

※ 回 転 し てい る と き のみ , 短 絡 電流 が 流 れ ,こ の 電 流 によ っ て 制 動力 が 発 生 する.

内部ロスVsat約 1V

Page 6: 平成26年度熊本高専Arduino講座 第3週 DCモータの制御

6

入  力 出  力

モードIN1 IN2 OUT1 OUT2Arduino

  5 番ピン

Arduino  6 番ピ

モータ(赤)

モータ(青)

0 0 ∞ ∞ ストップ

1 0 H L 正転 CW

0 1 L H 逆転 CCW

1 1 L L ブレーキ

TA7291P のファンクション

∞ :ハイインピーダンス(開放と同じ)

Page 7: 平成26年度熊本高専Arduino講座 第3週 DCモータの制御

モータに与える電圧は最大に固定し,モーターを ON にする時間( TON )と OFF にする時間( TOFF )を変える.⇒ マイコンでやりやすい

電圧

ON

OFF

TON TOFF

T は 0.001 ~ 0.01 秒程度つまり, 1 秒間に 100 ~1000 回程度繰り返す.

T (周期)

デューティー比  D =TON / T

時間

ONVmax 時間

平均

平均

平均

平均

電圧D =1.0  

D =0.75  

D =0.5  

D =0.25  

回転速度を制御するときには・・・ PWM 制御

ここでは, TA7291P の IN1 に与える信号を PWM 波にすることで,風量(回転速度)を変える.

Page 8: 平成26年度熊本高専Arduino講座 第3週 DCモータの制御

8

スイッチで風量切り替え用の配線

1 2 3 4 5 6 7 8 9 10

モータRE-140RA

4.7k

1.6k

単 34本6 V

風量SW

割込SW

Page 9: 平成26年度熊本高専Arduino講座 第3週 DCモータの制御

9

スイッチで風量切り替え用の配線

風量スイッチ

割込みスイッチ

Page 10: 平成26年度熊本高専Arduino講座 第3週 DCモータの制御

10

課題1.スイッチを押しているときだけ回転する.     回転速度は最大とする.

int IN1 = 5;   // TA7291P 5 番ピンint IN2 = 6;   // TA7291P 6 番ピンint SW = 4; // スイッチ 4 番ピン void setup() { // モーター制御用のピンモードを「出力」に設定 pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); // スイッチのピンモードを「入力(プルアップ)」に設定 pinMode(SW, INPUT_PULLUP);

// モータの初期状態(ストップ) digitalWrite(IN1,LOW); digitalWrite(IN2,LOW);}

void loop() {

if(digitalRead( ) == ){

   // 正転(風が来る)

digitalWrite(IN1, );

  digitalWrite(IN2, );

}else{ // ストップ または ブ

レーキ

digitalWrite(IN1, );

digitalWrite(IN2, );

}

}

できた人は,逆回転(換気扇)にして動作確認をしてください.

Page 11: 平成26年度熊本高専Arduino講座 第3週 DCモータの制御

11

課題2 -1 .スイッチを押す度に風量(回転速度)が切り替わる.最初は「停止」.1回押すと「弱」,2回目は「中」.3回目は「強」,4回目は「停止」 analogWrite の PWM 波( 490Hz )を利用した方法です.周波数は変えられません.int IN1 = 5; // TA7291P 5 番ピン

int IN2 = 6; // TA7291P 6 番ピンint SW = 4; // スイッチ 4 番ピンint val = 0; // 風量変数(初期値は 0 )int S = 90; // 弱int M = 170; // 中int F = 255; // 強boolean sw_now; // 現在のスイッチ状態boolean sw_before = 0; // 1 回前に読み取ったスイッチの状態 void setup() {  pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(SW, INPUT_PULLUP); digitalWrite(IN1,LOW); digitalWrite(IN2,LOW);}void loop() { // 今のスイッチ状態を読み取り, sw_now 変数へ代入する. sw_now = digitalRead(SW);   // OFF なら「1」 ,ON なら「0」が入る .

// スイッチが  OFF ( HIGH)  から  ON ( LOW)  になったら if((sw_now == 0) && (sw_before == 1)){ if(val < 4){ val++; //  風量変数を1つ進める } }

// 「弱」 if(val == 1){ analogWrite(IN1,S); digitalWrite(IN2,LOW); } // 「中」 if(val == 2){ analogWrite(IN1,M); digitalWrite(IN2,LOW); } // 「強」 if(val == 3){ analogWrite(IN1,F); digitalWrite(IN2,LOW); } // ブレーキ(またはストップ) if(val == 4){ digitalWrite(IN1,HIGH); digitalWrite(IN2,HIGH); val = 0; // 風量変数を 0 に戻す } // 今のスイッチ状態を前の状態変数へ代入 sw_before = sw_now;}

Page 12: 平成26年度熊本高専Arduino講座 第3週 DCモータの制御

12

オシロスコープで PWM 波形を見てみよう( TA7291P の 5 番端子にプローブを接続)

Page 13: 平成26年度熊本高専Arduino講座 第3週 DCモータの制御

13

課題2 - 2.スイッチを押す度に風量(回転速度)が切り替わる.最初は「停止」.1回押すと「弱」,2回目は「中」.3回目は「強」,4回目は「停止」直接, PWM 波を作る方法です.周波数を自分で変えられます.

if(0 < val && val < 4){

digitalWrite(IN2,LOW);

digitalWrite(IN1,HIGH);   delayMicroseconds(val * 3200);

digitalWrite(IN1,LOW);

delayMicroseconds(9900 - val * 3200);

} if(val == 4){ // ブレーキ digitalWrite(IN1,HIGH); digitalWrite(IN2,HIGH); val = 0; } // 今のスイッチ状態を前の状態変数へ代入

sw_before = sw_now;}

int IN1 = 5; // TA7291P 5 番ピンint IN2 = 6; // TA7291P 6 番ピンint SW = 4; // スイッチ 4番ピンint val = 0; // 風量変数(初期値は 0 )

boolean sw_now; // 現在のスイッチ状態

boolean sw_before = 0; // 1 回前に読み取ったスイッチの状態 void setup() {  pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(SW, INPUT_PULLUP); digitalWrite(IN1,LOW); digitalWrite(IN2,LOW);}void loop() { // 今のスイッチ状態を読み取り, sw_now 変数へ代入する. sw_now = digitalRead(SW);   // スイッチが  OFF ( HIGH)  から  ON ( LOW)  になったら if((sw_now == 0) && (sw_before == 1)){ if(val < 4){ val++; //  風量変数を1つ進める } }

オシロスコープで,「弱」「中」「強」それぞれの PWM 波形を観測し,周波数を調べてみよう.

Page 14: 平成26年度熊本高専Arduino講座 第3週 DCモータの制御

14

課題3.温度によって自動で風量(回転速度)が切り替わ

る.

例えば, T 25≦ ℃ では「弱」, 25℃< T< 30℃ では

「中」, 30 T℃≦ では「強」

※ 温度範囲は現在の室温に応じて自由に変更してくださ

い.

・温度センサ( LM35 )を使って温度を取得

・温度によって val を決定する.

・ストップは無し

Page 15: 平成26年度熊本高専Arduino講座 第3週 DCモータの制御

15

課題4.割り込みを使った「ゆらぎ」機能の追加.通常

の動作中に,「割込みスイッチ」を押すと,風量(パル

ス幅)が変化し,もう一度押すと元の動作(風量一定)

に戻る.

・課題2までの方法は,スイッチを押さないときもス

イッチが押されているかどうかの状態を繰り返し確認し

続けている.この定期的に状態を確認する方法を「ポー

リング」という.

・通常の動作中に,別の動作の要求があるときだけ,そ

の動作をさせたい場合には,「割り込み」を使うと便

利.

・スイッチのチャタリング防止のため,一定時間,割込

み処理を行わないようにする.

Page 16: 平成26年度熊本高専Arduino講座 第3週 DCモータの制御

16

Arduino の外部割込み  attachInterrupt

() 

注意・割り込みで呼び出される関数の中においてはdelay() は機能しない.

・関数内で値が変化する変数には, volatile をつけて宣言する. 

・ Leonardo では,2番ピン( int.1 )と3番ピン( int.0 )を使う.( UNO は 2 番ピンが ( int.0 ) で 3 番ピンが ( int.1 ))課題フォルダのスケッチをコピーして実行して

ください.

Page 17: 平成26年度熊本高専Arduino講座 第3週 DCモータの制御

17

コントラスト調整用

液晶キャラクタディスプレイ

( LCD )マイコンで測定値を表示するために,7セグ LED や LCD がよく用いられる.

Page 18: 平成26年度熊本高専Arduino講座 第3週 DCモータの制御

No. 記号 機能 No. 記号 機能1 VSS GND 9 DB2 Data Bit 22 Vdd 電源電圧 5V 10 DB3 Data Bit 3

3 VO コントラスト調整

11 DB4 Data Bit 4

4 RS レジスター選択

12 DB5 Data Bit 5

5 R/W Read/Write 選択 13 DB6 Data Bit 6

6 E 動作起動信号 14 DB7 Data Bit 7

7 DB0 Data Bit 0 15 A バックライト(+)

8 DB1 Data Bit 1 16 K バックライト(-)

LCD ( SD1602V)のピン割り

当て

Arduino と接続する端子は,青枠で囲んだ6本(最も少ない配線)だけでよい.

Page 19: 平成26年度熊本高専Arduino講座 第3週 DCモータの制御

19

A0 A1 A2 A3 A4 A5

VREF

GND

~13 12

~11

~10

~9 8 7

~6

~5 4

~3 2 1 0

DIGITAL (PWM ~)

ANALOG INPOWER

3.3V

5V GND

GND

Vin

14 13 12 11 10 9 8 7 6 5 4 3 2 1 16 15

LCD の配線

10010k

変則的なピン配置なので注意する

Page 20: 平成26年度熊本高専Arduino講座 第3週 DCモータの制御

20

課題5.温度を LCD に表示す

る.温度センサを使った温度計測のスケッチに以下を追加する.

#include <LiquidCrystal.h>// 構文 LiquidCrystal(rs, enable, d4, d5, d6, d7) LiquidCrystal lcd(8, 9, 10, 11, 12, 13);

void setup() {   lcd.begin(16, 2); // 桁数と行数を設定}

void loop(){ 温度センサの部分は省略 , Serial.println(temp) のところに以下を追加  lcd.setCursor(0, 0); // カーソル位置を1行目に設定 lcd.print(“T = ”);

lcd.print(temp, 1); // 少数点以下1桁まで表示   delay ( 500 ) ;

Page 21: 平成26年度熊本高専Arduino講座 第3週 DCモータの制御

21

課題6.温度と風量の状態を LCD に表示

する.

・1行目に温度

・2行目に風量(数値または文字)

Page 22: 平成26年度熊本高専Arduino講座 第3週 DCモータの制御

22

2.ベンハムの独楽と回転数の検出

白黒模様のコマ(円盤)で回転させると,色が見えてくるという不思議なコマ.様々な模様がある.

Page 23: 平成26年度熊本高専Arduino講座 第3週 DCモータの制御

23

課題7.可変抵抗で風量,回転方向を変化する.

1 2 3

1

3

つまみ  2

10kΩ  

• 可変抵抗の 2 番端子を Arduino のアナログ端子( A1 )へ接続する.void loop() { int vol_val = analogRead(A1) ; // 可変抵抗の値を取得 // 可変抵抗の値( 0 ~ 1023 )をアナログ出力( PWM )の値(- 255 ~ 255 )に変換 int speed_val = map(vol_val, 0, 1023, -255, 255); // PWM の値が「 5 」より大きいとき「正転」 if( speed_val > 5){ analogWrite(IN1, speed_val); digitalWrite(IN2, LOW); // PWM の値が「- 5 」より小さいとき「逆転」 } else if(speed_val < -5){ digitalWrite(IN1, LOW); analogWrite(IN2, -speed_val); // それ以外( ±5 の間)のとき「ブレーキ」 } else { digitalWrite(IN1, HIGH); digitalWrite(IN2, HIGH); }}

中央の位置にあそび( ±5 )を持たせ

Page 24: 平成26年度熊本高専Arduino講座 第3週 DCモータの制御

24

モータの回転数を検出するロータリーエンコーダ

• ロータリー( Rotary) ⇒  回転する  • エンコーダ( encoder) ⇒  符号化する装置

出典:ロータリーエンコーダ Ver2 資料(ジャパンマイコンカーラリー実行委員会)

Page 25: 平成26年度熊本高専Arduino講座 第3週 DCモータの制御

25

フォトインタラプタを用いたロータリーエンコーダの原理

Page 26: 平成26年度熊本高専Arduino講座 第3週 DCモータの制御

26

反射型フォトマイクロセンサ

EE-SF5 ( OMRON )

AB

++

--V+

Out

A

GN

D

1 2 3 4

8 7 6 5コンパレータ(LM393)

AK

E C

100 10k

5 V

GND

(外部割込み)D2 番

フォトインタラプタを用いたロータリーエンコーダの回路

基準電圧調整用10k

動作確認1.ベンハムのコマをモータに取り付け,回転させながらフォトセンサの上にかざす.2.フォトセンサの出力(コレクタ端子)の波形を観測(波の下限の電圧を確認)する.3.コンパレータ3番端子の電圧がフォトセンサ出力電圧の下限よりも高くなるように基準電圧調整用抵抗を変える(およそ3~4 V ).4.コンパレータ1番端子の電圧がきれいなパルス波形になっていればOK .

10k

※D 2番をプルアップに設定すると青の抵抗は削除できる

Page 27: 平成26年度熊本高専Arduino講座 第3週 DCモータの制御

27

課題8.ベンハムのコマを利用して,回転数( RPM )を検出し, LCD に表示する.

・パルスの変化は早いため,外部割込みで 0→ 1の変化を検出する(ポーリング処理では取りこぼす).

・フォトセンサの出力が安定しない(ふらつきが大きい)ため,コンパレータの出力も,ノイズの影響でチャタリングが生じる.ハードウェアで解決するには,ヒステリシスを設けるが,ここでは,割込み関数内で,一定時間は割込み処理を行わない方法で対応する(課題4と同じ).

・今回のコマは,白黒が4組あるため,1回転すると4パルス発生する.したがって,1秒間パルスの立ち上がりをカウントし,それを4で割ると1秒間当たりの回転数( RPS )が求まるので,これを 60倍して( RPM )に変換する.

課題フォルダのスケッチをコピーして実行してください

Page 28: 平成26年度熊本高専Arduino講座 第3週 DCモータの制御

参考図書( WEB )・購入先

• Massimo Banzi著,船田巧訳:Arduinoをはじめよう第2版,㈱オライリージャパン,2000円+税 

• 河連庸子,山崎文徳,神原健著:Arduinoスーパーナビゲーション,リックテレコム,3600円+税

• 建築発明工作ゼミ2008  基本から応用まで詳しく解説されています.

 http://kousaku-kousaku.blogspot.jp/2008/07/arduino.html

• アイデア・ハック !! Arduinoで遊ぼう(7):白黒なのにカラーに見える !? モーターを制御して「ベンハムのコマ」を作ろう!

 http://monoist.atmarkit.co.jp/mn/articles/1401/07/news003.html

• 部品の購入先

  Arduino:スイッチサイエンス http://www.switch-science.com/

  電子部品:秋月電子通商 http://akizukidenshi.com/catalog/

皆様お疲れさまでした.28