モーション コントロール用に arduino Mega 2650 にリミット スイッチを取り付けました。リミット スイッチの 2 つのノーマル オープン接点は、Arduino ピンとグランドに接続されているため、リミット スイッチが作動すると、Arduino ピンがグランドに短絡します。
予想どおり、このセットアップにはバウンスの問題があります。ISR のカウンターを使用して確認しました。最後に、特定の時点でリミット スイッチがオンになっているかオフになっているかを確実に識別する次のコードを作成しました。
const int lsOuterLeftIn = 18; // lsOuterLeftIn is my Limit Switch
const int LED = 9;
volatile bool lsEngaged = false; // flag for limit switch engaged
void setup() {
pinMode(lsOuterLeftIn, INPUT_PULLUP);
pinMode(LED, OUTPUT);
attachInterrupt(digitalPinToInterrupt(lsOuterLeftIn), ISR1, FALLING);
attachInterrupt(digitalPinToInterrupt(lsOuterLeftIn), ISR2, RISING);
}
void loop() {
if (lsEngaged) digitalWrite(LED, HIGH);
else digitalWrite(LED, LOW);
}
void ISR1(){
delay(100);
lsEngaged = (digitalRead(lsOuterLeftIn));
}
void ISR2(){
delay(100);
lsEngaged = (digitalRead(lsOuterLeftIn));
}
しかし、ここに私の問題があります。このArduino documentation pageにたどり着きました、そしてそれは言います
「delay() が機能するには割り込みが必要なため、ISR 内で呼び出された場合は機能しません。」
しかし、私はdelay()
内部の ISR を利用していますが、うまくいっているようですが、何が起こっているのでしょうか? delay()
ドキュメントに記載されているように、機能が誤動作する可能性があるため、現時点では機能しているが、簡単に壊れる可能性がありますか?