質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

Q&A

解決済

3回答

1410閲覧

Arduinoプログラムについての質問

yamamoto99

総合スコア9

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

0グッド

0クリップ

投稿2020/08/26 12:16

前提・実現したいこと

ボタンを押すと、LEDが点灯するArduinoのプログラムを作ろうとしています。

発生している問題・エラーメッセージ

ボタンを押したとき、点灯しないことがあります。

エラーメッセージ

該当のソースコード

const int LED=13;
const int BUTTON=7;
int val=0;
int old_val=0;
int state=0;

void setup(){
pinMode(LED,OUTPUT);
pinMode(BUTTON,INPUT);
}
void loop(){
val=digitalRead(BUTTON);
if((val==HIGH)&&(old_val==LOW)){
state=1-state;
delay(10);
}

old_val=val;

if(state==1){
digitalWrite(LED,HIGH);
}else{
digitalWrite(LED,LOW);
}
}

試したこと

配線とボタンはすべて交換したためプログラムの問題だと思われます。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikadzuchi

2020/08/27 00:53

点灯しない時、一瞬たりとも点灯しませんか? チャタリングが原因ならdelay(10)の間点灯するのが見えると思います。
guest

回答3

0

ベストアンサー

チャタリングは、離した時にも起こります。
delay(10);
はループ最後(つまり、サンプリング間隔を10msにする)に移動すれば直ると思います。

投稿2020/08/26 17:53

nac_tnk

総合スコア463

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

「点灯しないことがある」というのは「点灯することもある」と理解します

ということは、配線やスイッチのロジックの問題では無いと理解します

y_waiwaiさんが仰っている通り、チャタリングの問題かと思いました

スイッチによっては 20~30msecの間ばたつくものもあるようなので、もう少しdelayを長めに取ってみるのも一手かと思います

あと、このコードだと HIGH と LOW を入れ替えた後、またすぐにスイッチの検出に行ってしまうような気がします

そうすると、長めに押してしまった場合、せっかく HIGH になってもまたすぐに LOW になることもあるかもしれません

一旦、LEDを切り替えたら2~3secくらい待って(delay)、上のチャタリングを解決するために長くしたdelay分、気持ち長めにスイッチを押してみてはいかがでしょうか?

違ったらごめんなさい

投稿2020/08/26 12:33

token

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamamoto99

2020/08/26 15:03

回答ありがとうございます。教えていただいたとおりにdelayを伸ばし長めにスイッチを押す方法を試してみましたが、点灯しない割合はあまり変わりませんでした。
token

2020/08/26 16:46

delayの後でもう一度if文を入れてスイッチの検出をしないと、折角待ったのに意味がないかもしれません 2度目のifの後でstateを変えてみてはいかがでしょうか また、蛇足ですが、LEDをHIGHに切り替えた後、すぐにループに戻ってスイッチの検出をしてしまうので、スイッチを押している時間が長いと、一旦HIGHになっても、またすぐLOW に戻っちゃいますので、結果として人の目には点灯したことがわかりません なのでLEDの切り替えをしたら、そこでも少し待ってみてはいかがでしょうか
guest

0

スイッチにはチャタリングというものがあります
ONからOFF、OFFからONになった場合に短時間のあいだにON/OFFを繰り返す、というもんです。
おそらくそこらへんのせいで、OFF-ONのエッジが2回カウントされたんでしょう

この場合、スイッチの状態を見る場合、10ms程度の間隔で2回スイッチの状態を見て、違う場合にはその結果を捨て、同一の場合のみ、その状態を確定として扱うようにします


って、ちょっと気がついたけど、スイッチのとこに抵抗つけてます?w

投稿2020/08/26 12:21

編集2020/08/26 12:33
y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamamoto99

2020/08/26 12:46 編集

回答ありがとうございます。 10kΩの抵抗をつけています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問