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

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

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

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

Q&A

2回答

2587閲覧

alduinoのスケッチでお力をお貸しください

退会済みユーザー

退会済みユーザー

総合スコア0

Arduino

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

0グッド

0クリップ

投稿2019/01/13 04:32

前提・実現したいこと

電子工作やプログラムについては今回初めて挑戦する初心者です。
現在alduinoとソレノイドを用いてボタンを自動で押す装置を作りたいとおもっており、スケッチを制作中です。
ソレノイドの動作については思い通りにいっているのですが、ボタンを押した回数をキャラクタLCD(L1602)に表示させる方法がわからず苦戦しております。
現在のスケッチは下記の通りです。

使用しているもの
・alduino uno
・ソレノイド
・LCD(L1602)
・タクトスイッチ

ここに質問の内容を詳しく書いてください。
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

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

エラーメッセージ

該当のソースコード

#define TR 2 #define SW 1 #include <LiquidCrystal.h> LiquidCrystal lcd(4,5,6,7,8,9); void setup() { pinMode(TR,OUTPUT); pinMode(SW,INPUT); lcd.begin(16,2); lcd.clear(); lcd.setCursor(3, 0); lcd.print("**count**"); } void loop() { if(digitalRead(SW) == LOW) { int i = 0; while(i < 100000) { digitalWrite(TR,HIGH); delay(analogRead(0) + 200); digitalWrite(TR,LOW); delay(analogRead(0) + 200); i++; } } }

試したこと

attachInterrupt() の割り込み処理を試してみましたが、カウント自体はされるもののソレノイドの芯が戻る際にもカウントされてしまいうまく動作しませんでした。

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

タクトスイッチを長押しすると動作を停止させるようなことができるプログラムがあればそちらも教えていただけると大変有難いです。

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

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

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

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

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

guest

回答2

0

まず、

pinMode(SW,INPUT);

は、
pinMode(SW,INPUT_PULLUP);
とする必要があります

で、SW入力がLowの間は繰り返し実行するようになってますが、これは意図した動作でしょうか
analogReadしてますが、提示された前提では意味不明です

投稿2019/01/13 04:37

y_waiwai

総合スコア87719

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

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

0

割り込みを使うまでの必要はなさそうに思いますが...(もし質問に書かれていない要素があるのなら適宜教えていただかないと、役に立つ回答にならないかも知れませんね。)
小難しいことはしなくても、

Arduino

1////追加//// 2int prevSw=HIGH; //前回のスイッチ状態を記録する変数 3int count=0; //ボタンを押した回数を記録する変数 4//// //// 5void loop() { 6////変更・追加//// 7 int currentSw=digitalRead(SW); 8 if(currentSw == LOW) { 9 int i = 0; 10 if(prevSw==HIGH){ //前回は押されていなかったが今は押されている、つまり「押された」という変化が起こった 11 count++; 12// 表示位置の指定とかは適宜 13 lcd.print(count); 14 } 15//// //// 16 while(i < 100000) { 17 digitalWrite(TR,HIGH); 18 delay(analogRead(0) + 200); 19 digitalWrite(TR,LOW); 20 delay(analogRead(0) + 200); 21 i++; 22 } 23 } 24 prevSw=currentSw; //// 追加 25}

とでもすればボタンを押した回数の表示は出来るんじゃないかと思いますがいかがでしょう。

長押しすると動作を停止させる

簡易的には

Arduino

1 long t0=millis(); //現在の「時刻(動作開始からの通算時間)」を記録する 2 while(i < 100000) { 3 digitalWrite(TR,HIGH); 4 delay(analogRead(0) + 200); 5 digitalWrite(TR,LOW); 6 delay(analogRead(0) + 200); 7 i++; 8 if(millis() - t0 > 3000){//whileループに入ってから少なくとも3秒を超えている 9 while(1); //動作停止 10 } 11 } 12

なんていうのは考えられますね。

本題とは関係ないですが

while(i < 100000) {

スイッチを押しっぱなしの場合は100000万回までにソレノイドの連続動作を制限したい、ということですか? それは動作しません。Arduino Unoであればintは16ビットなので32767までしか増えません。32767+1は「オーバーフロー」して-32768になってしまうので、i < 100000 は常に真。このwhileは意味をなしません。iをlongにしたりしても、このwhileループを抜けた次のloop()の実行ですぐまた同じwhileループに入ってしまいますから、ほぼ無意味と思います。

投稿2019/01/13 13:08

編集2019/01/13 13:12
thkana

総合スコア7610

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問