スイッチについて
2024-01-13
スイッチの基本
スイッチを押したら電気は流れ、離すと電気は流れないのが基本となる。この場合押し続けなければ電気は流れない。押して離した後も流れるトグル式のスイッチもある。
チャタリング
理論的にはスイッチを押したら通電、もう一度押したら不通にすることはできそうである。しかし、理論上の制御では可能でもスイッチの機械側の制御がそれについてこれない場合がある。スイッチの切り替えは接点が触れ合うか触れ合わないかの機械的な物でちょっとした加減で接点が狂い、プログラム側の接触判定を間違ってしまうのである。
以下のコードはボタンが押される(通電する)たびにtrue
もしくはfalse
に値がスイッチする。delay()
で通信速度の5%くらい処理を止めて、止めた時間だけ長くボタンを押せばスイッチングの確実性が増す。
#define BUTTON1 8
#define SERIAL 9600
bool b = false;
void setup()
{
Serial.begin(SERIAL);
pinMode(BUTTON1, INPUT_PULLUP);
}
void loop()
{
// delay(SERIAL/100*5);
if (digitalRead(BUTTON1) == LOW)
{
// 通電時(電圧降下時)
if (b)
{
b = false;
}
else
{
b = true;
}
}
if (b)
{
Serial.println(1e0);
}
else
{
Serial.println(1e-8);
}
}
さらに確実性を求めるならスイッチを2個使う必要がある。反応も最大限引き出せることになる。一方のスイッチで値をtrue
に、もう一方で値をfalse
にする。
#define BUTTON1 7
#define BUTTON2 8
#define SERIAL 9600
bool b = false;
void setup()
{
Serial.begin(SERIAL);
pinMode(BUTTON1, INPUT_PULLUP);
pinMode(BUTTON2, INPUT_PULLUP);
}
void loop()
{
if (digitalRead(BUTTON1) == LOW)
{
// 通電時(電圧降下時)
b = true;
}
if (digitalRead(BUTTON2) == LOW)
{
// 通電時(電圧降下時)
b = false;
}
if (b)
{
Serial.println(1e0);
}
else
{
Serial.println(1e-8);
}
}
プルアップ抵抗
上記のコードで入力ピンのモードをINPUT_PULLUP
としている。この理由はスイッチが押された時電圧が降下して電気が流れたことを確実にするためのモードになる。抵抗がなければ電圧の値に関わらず常にHIGH
であるが、抵抗があれば元の電圧より確実に降下した電圧のLOW
になる。
スイッチの種類