26
川上 博 2013/11/21 digitalReadとスイッチ Arduinoをはじめよう

Arduinoをはじめようcms.db.tokushima-u.ac.jp/DAV//person/S10723/Arduinoで...9 + + − − 10k SW 5V 27 GND 330 LED Arduino 最初に使う回路 スイッチを押したらLEDが点灯するプログラムを書く

  • Upload
    ngodat

  • View
    213

  • Download
    0

Embed Size (px)

Citation preview

川上 博

2013/11/21

digitalReadとスイッチ

Arduinoをはじめよう

今日の内容 2

第3回: 2種類のスイッチとそれらを使ったプログラム

digitalRead( )

+ +

− −

10k

SW

5V

GND

330

10k

10k

LED

TrB

C

E

ArduinodigitalWrite( )

3

「スイッチを押したらLEDが点灯する回路」をブレッドボードに作りなさい

「もともと点灯していたLEDがスイッチを押したら消える回路」を作りなさい

クイズ

4

5V

(b)(a) (c)

+

− −

VCC

GND

220

LED

SW

220

LED

SWSW

220

LED

クイズ:答え

5

active high vs active low

(b)(a)

+ +

− −

10k

SW

Vcc

10k

SW

6

タクトスイッチの接続法:active high

1 5 1010 1515 2020

ED

CBA

ED

CBA

1JI

HGF

JI

HGF

5 10 15 20

X X

Y Y

+

−10k

A B

BA

Arduinoのディジタルピンへ

7

トランジスタ・スイッチを使った点灯

1 5 1010 1515 2020

ED

CBA

ED

CBA

1JI

HGF

JI

HGF

5 10 15 20

X X

Y Y

+

LED

220

Tr C1815

10k

10k

B C E

8

最初に使う回路

9

+ +

− −

10k

SW

5V

2 7

GND

330

LED

Arduino

最初に使う回路

スイッチを押したらLEDが点灯するプログラムを書く

スイッチを押したらLEDが消灯するプログラムを書く

10

// Filename:SW01!!const int led=7;!const int sw=2;!int state=LOW;!!void setup(){! pinMode(led, OUTPUT);! pinMode(sw, INPUT);!}!!void loop(){! state=digitalRead(sw);! digitalWrite(led, state);!}!

sketchの例

11

+ +

− −

10k

SW

5V

2 7

GND

330

LED

Arduino

toggle動作のプログラムを書く

最初にスイッチを押したらLEDが点灯し, 次に押すと消える動作を繰り返すプログラムを書く

12

// Filename:SW02!!const int led=7;!const int sw=2;!int currentState, previousState=LOW;!int ledState=LOW;!!void setup(){! pinMode(led, OUTPUT);! pinMode(sw, INPUT);!}!!void loop(){! currentState=digitalRead(sw);! if(currentState == HIGH) {! ledState = !ledState; // toggle action! delay(20);! }! digitalWrite(led, state);!}!

どこかおかしいsketchの例

13

// Filename:SW03!!const int led=7;!const int sw=2;!int currentState, previousState=LOW;!int ledState=LOW;!!void setup(){! pinMode(led, OUTPUT);! pinMode(sw, INPUT);!}!!void loop(){! currentState=digitalRead(sw);! if(currentState != previousState){//edge detecter! previousState=currentState; ! if(currentState == HIGH) {! ledState = !ledState; // toggle action! digitalWrite(led, ledState); ! }! } !}

14

// Filename:SW04!!const int led=7;!const int sw=2;!volatile int state = LOW;!!void setup(){! pinMode(led, OUTPUT);! digitalWrite(sw, HIGH);! attachInterrupt(0, blink, RISING);!}!!void loop(){! digitalWrite(led, state);!}!!void blink(){! state = !state;!}

高度なテクニック:割り込み

15

2つのスイッチを使う

16

RLED

SW

SW LEDON

点灯OFF

OFF OFFOFF ONON OFFON ON

消灯

E

(b)

RLED

SW1E

(c)

SW2

RLED

SW1 SW2E

(d)

SW2SW1 LEDOFF OFFOFF ONON OFFON ON

SW2SW1 LED

RLED

SW

SW LEDON

消灯OFF

点灯

E

(a)

スイッチを使ったLEDの点灯回路

17

Y = A

Buffer(論理肯定)

A B Y0 0 00 1 01 0 01 1 1

A Y0 01 1

A B Y0 0 00 1 11 0 11 1 1

Y = A × B

AND(論理積)

Y = A + B

OR(論理和)演算

論理回路図

真理値表

ベン図

A

A A B A BA

AB

ABY Y Y

_

Y = A

NOT(論理否定)

A Y0 11 0

A

AA

Y

_

_

基本的な論理演算1

18

演算

論理回路図

真理値表

ベン図

A B Y0 0 10 1 11 0 11 1 0

Y = A × B

NAND(否定論理積)

A B

AB Y

A B

A B Y0 0 00 1 11 0 11 1 0

Y = A + B

EX-OR(排他的論理和)

AB Y

A B Y0 0 10 1 01 0 01 1 0

Y = A + B

NOR(否定論理和)

A B

AB Y

A B Y0 0 10 1 01 0 01 1 1

EX-NOR(一致:否定排他和)

A B

AB Y

Y = A + B

基本的な論理演算2

19

普通の代数 論理代数

1 + A = 1 0 × A = 0

0 + A = A 1 × A = A

A + A = A A × A = A

A + B = B + A A × B = B × A

A + A = 1

A = A

A × A = 0

1 + A = A + 1 0 × A = 0

0 + A = A 1 × A = A

A + A = 2A A × A = A2

A + B = B + A A × B = B × A

A + (-A) = 0

-(-A) = A

A × (-A) = -A2

ド・モルガンの定理A + B = A × B A × B = A + B

普通の代数と論理代数(ブール代数)の違い

20

+ +

− −

10k

A

5V

2

4

7

GND

330

LED

10k

BArduino

2つのスイッチを使う:論理プログラム

21

22

(1) OR operation: ||! if(A || B){!! analogWrite(ledPin, HIGH);! }!!(2) AND operation: &&! if(A && B){!! analogWrite(ledPin, HIGH);! }!!(3) NOT operation: !! if(!A){!! analogWrite(ledPin, HIGH);! }!

Cの論理(Boole)演算

注意:よく似た演算にビット演算なるものがある. | (OR), & (AND), ~ (NOT), ^ (NOR), <<, >> (shift)

23

int led = 7;!int swA = 2, swB=4;!int stateA = 0, stateB=0;!!void setup(){! pinMode(led, OUTPUT);! pinMode(swA, INPUT);! pinMode(swB, INPUT);!}!!void loop(){! stateA = digitalRead(swA);! stateB = digitalRead(swB);! if(stateA || stateB){! digitalWrite(led, HIGH);! }else{! digitalWrite(led, LOW); ! }!}

論理和で点灯させる

24

int led = 7;!int swA = 2, swB=4;!int stateA = 0, stateB=0;!!void setup(){! pinMode(led, OUTPUT);! pinMode(swA, INPUT);! pinMode(swB, INPUT);!}!!void loop(){! stateA = digitalRead(swA);! stateB = digitalRead(swB);! if(stateA && stateB){! digitalWrite(led, HIGH);! }else{! digitalWrite(led, LOW); ! }!}

論理積で点灯させる

25

int led = 7;!int swA = 2, swB=4;!int stateA = 0, stateB=0;!!void setup(){! pinMode(led, OUTPUT);! pinMode(swA, INPUT);! pinMode(swB, INPUT);!}!!void loop(){! stateA = digitalRead(swA);! stateB = digitalRead(swB);! if((!stateA && stateB)||(stateA && !stateB)){! digitalWrite(led, HIGH);! }else{! digitalWrite(led, LOW); ! }!}

排他的論理和(EX-OR)で点灯させる

26

お疲れさまでした