「本格的にArduino/スイッチを読み取る」の編集履歴(バックアップ)一覧はこちら
追加された行は緑色になります。
削除された行は赤色になります。
*プルアップの回路
http://www.arduino.cc/en/Tutorial/Button
#image(http://www2.atpaint.jp/arduino/src/OB1236994208387.png)
スイッチがOFFの時はAの電圧がHIGHになる。
スイッチがONの時はAの電圧がLOWになる。
*プルダウンの回路
#image(http://www2.atpaint.jp/arduino/src/OB1236994483372.png)
スイッチがOFFの時はAの電圧がLOWになる。
スイッチがONの時はAの電圧がHIGHになる。
*消費電力
通常状態でスイッチがOFFの場合はプルダウンの回路の方が消費電力が少ない。
通常状態でスイッチがONの場合はプルアップの回路の方が消費電力が少ない。
まあ気にすることはないと思うけど。
*AVR内蔵のプルアップ抵抗を使える?
http://nekosan0.bake-neko.net/structure_digital_port.html
によると、
digitalWrite(pin, HIGH);
でプルアップされるようです。
#image(http://www2.atpaint.jp/arduino/src/OB1236996142792.png)
抵抗1つ省略できるので便利。
*抵抗値は?
**プルアップの場合
mega168のデータシートによるとAVR内蔵のプルアップ抵抗は20K-50Kだそうだ。
-電圧を測定する部分の抵抗値(=A)より十分小さい
-スイッチがONになってGNDに接続されても電流が多すぎない
という抵抗値である必要があるわけだから100Kではたぶん大きすぎ、1Kでは5Vで5mA。
1Kから20Kぐらいの間で適当に選べばよさそうかな。
**プルダウンの場合
-スイッチがONになってGNDに接続されても電流が多すぎない
-十分しっかりGNDに引っ張れる値
と考えると、何オーム?
**内蔵プルアップでのスケッチ
int ledPin = 13;
int inputPin = 2;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(inputPin, INPUT);
digitalWrite(inputPin, HIGH); // pull-up
}
void loop(){
int in = digitalRead(inputPin);
if(in==HIGH){
digitalWrite(ledPin, LOW); //LED OFF
}
else{
digitalWrite(ledPin, HIGH); //LED ON
}
}
*チャッタリング防止
チャッタリング防止のライブラリがある。
http://www.arduino.cc/playground/Code/Debounce
zipをダウンロードしてarduinoのインストール先のhardware/libraries/Debounceに展開する。
#include <Debounce.h> // http://www.arduino.cc/playground/Code/Debounce
int SW_YELLOW = 3;
int SW_GREEN = 2;
Debounce sw_yellow = Debounce(20, SW_YELLOW);
Debounce sw_green = Debounce(20, SW_GREEN);
void setup() {
Serial.begin(9600);
pinMode(SW_YELLOW, INPUT);
pinMode(SW_GREEN, INPUT);
digitalWrite(SW_YELLOW, HIGH); // pull-up
digitalWrite(SW_GREEN, HIGH); // pull-up
}
void loop(){
if(sw_yellow.update() && sw_yellow.read()==LOW) {
yellow_count++;
Serial.print("yellow_count=");
Serial.println(yellow_count);
}
if(sw_green.update() && sw_green.read()==LOW) { // digitalRead(SW_GREEN)==LOW
green_count++;
Serial.print("green_count=");
Serial.println(green_count);
}
}
*プルアップの回路
http://www.arduino.cc/en/Tutorial/Button
#image(http://www2.atpaint.jp/arduino/src/OB1236994208387.png)
スイッチがOFFの時はAの電圧がHIGHになる。
スイッチがONの時はAの電圧がLOWになる。
*プルダウンの回路
#image(http://www2.atpaint.jp/arduino/src/OB1236994483372.png)
スイッチがOFFの時はAの電圧がLOWになる。
スイッチがONの時はAの電圧がHIGHになる。
*消費電力
通常状態でスイッチがOFFの場合はプルダウンの回路の方が消費電力が少ない。
通常状態でスイッチがONの場合はプルアップの回路の方が消費電力が少ない。
まあ気にすることはないと思うけど。
*AVR内蔵のプルアップ抵抗を使える?
http://nekosan0.bake-neko.net/structure_digital_port.html
によると、
digitalWrite(pin, HIGH);
でプルアップされるようです。
#image(http://www2.atpaint.jp/arduino/src/OB1236996142792.png)
抵抗1つ省略できるので便利。
*抵抗値は?
**プルアップの場合
mega168のデータシートによるとAVR内蔵のプルアップ抵抗は20K-50Kだそうだ。
-電圧を測定する部分の抵抗値(=A)より十分小さい
-スイッチがONになってGNDに接続されても電流が多すぎない
という抵抗値である必要があるわけだから100Kではたぶん大きすぎ、1Kでは5Vで5mA。
1Kから20Kぐらいの間で適当に選べばよさそうかな。
**プルダウンの場合
-スイッチがONになってGNDに接続されても電流が多すぎない
-十分しっかりGNDに引っ張れる値
と考えると、何オーム?
**内蔵プルアップでのスケッチ
int ledPin = 13;
int inputPin = 2;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(inputPin, INPUT);
digitalWrite(inputPin, HIGH); // pull-up
}
void loop(){
int in = digitalRead(inputPin);
if(in==HIGH){
digitalWrite(ledPin, LOW); //LED OFF
}
else{
digitalWrite(ledPin, HIGH); //LED ON
}
}
*チャタリング防止
チャタリング防止のライブラリがある。
http://www.arduino.cc/playground/Code/Debounce
zipをダウンロードしてarduinoのインストール先のhardware/libraries/Debounceに展開する。
#include <Debounce.h> // http://www.arduino.cc/playground/Code/Debounce
int SW_YELLOW = 3;
int SW_GREEN = 2;
Debounce sw_yellow = Debounce(20, SW_YELLOW);
Debounce sw_green = Debounce(20, SW_GREEN);
void setup() {
Serial.begin(9600);
pinMode(SW_YELLOW, INPUT);
pinMode(SW_GREEN, INPUT);
digitalWrite(SW_YELLOW, HIGH); // pull-up
digitalWrite(SW_GREEN, HIGH); // pull-up
}
void loop(){
if(sw_yellow.update() && sw_yellow.read()==LOW) {
yellow_count++;
Serial.print("yellow_count=");
Serial.println(yellow_count);
}
if(sw_green.update() && sw_green.read()==LOW) { // digitalRead(SW_GREEN)==LOW
green_count++;
Serial.print("green_count=");
Serial.println(green_count);
}
}