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

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

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

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

Q&A

解決済

2回答

4319閲覧

早押しボタンの回路とプログラム

grape_ll

総合スコア83

Arduino

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

0グッド

0クリップ

投稿2021/05/22 06:46

編集2021/05/22 11:37

###実現したいこと
回路中にボタンが二つ(A, B)あり,Aを先に押したなら"player1",Bならば"player2"と表示させるもの.
片方のボタンが押されたらLEDを点灯させて,入力の受付を5秒間拒絶する.

###困っていること
次に示す二つのコードそれぞれで,ボタンによるLEDのON/OFFとLCDの表示は成功しているのだが,組み合わせた「現段階のコード」にあるものを用いると,ボタンを押してもLEDとLCDが点灯しない.(コードと配線を少し変えたらLCDの表示は成功した.LEDはボタンに関わらずずっと点灯している.これは5番につないでいたところを5Vにつないで常時供給しているからである.)
ボタンを押したときに光って,こちらも5秒経過後に消灯したいです.

コードや配線でおかしなところを教えていただきたいです.

arduino

1 2int ledPin = 5; 3int buttonApin = 9; 4int buttonBpin = 8; 5 6byte leds = 0; 7 8void setup() 9{ 10 pinMode(ledPin, OUTPUT); 11 pinMode(buttonApin, INPUT_PULLUP); 12 pinMode(buttonBpin, INPUT_PULLUP); 13} 14 15void loop() 16{ 17 if (digitalRead(buttonApin) == LOW) 18 { 19 digitalWrite(ledPin, HIGH); 20 } 21 if (digitalRead(buttonBpin) == LOW) 22 { 23 digitalWrite(ledPin, LOW); 24 } 25}

arduino

1#include <Wire.h> 2#include <LiquidCrystal_I2C.h> 3LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display 4void setup() 5{ 6lcd.init(); // initialize the lcd 7lcd.init(); 8// Print a message to the LCD. 9lcd.backlight(); 10lcd.setCursor(0,0); 11lcd.print("Hello"); 12lcd.setCursor(0,1); 13lcd.print("Hi"); 14} 15void loop() 16{ 17}

###現段階のコード(1回改訂)

arduino

1#include <Wire.h> 2#include <LiquidCrystal_I2C.h> 3LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display 4 5int ledPin = 5; 6int buttonApin = 9; 7int buttonBpin = 8; 8 9byte leds = 0; 10 11void setup() { 12 // put your setup code here, to run once: 13 lcd.init(); 14 lcd.backlight(); 15 pinMode(ledPin, OUTPUT); 16 pinMode(buttonApin, INPUT_PULLUP); 17 pinMode(buttonBpin, INPUT_PULLUP); 18} 19 20void loop() { 21 // put your main code here, to run repeatedly: 22 if (digitalRead(buttonApin) == LOW) 23 { 24 digitalWrite(ledPin, LOW); 25 // Print a message to the LCD. 26 lcd.init(); 27 lcd.setCursor(0,0); 28 lcd.print("answer"); 29 lcd.setCursor(0,1); 30 lcd.print("player1"); 31 delay(5000); 32 lcd.init(); 33 } 34 if (digitalRead(buttonBpin) == LOW) 35 { 36 digitalWrite(ledPin, LOW); 37 // Print a message to the LCD. 38 lcd.init(); 39 lcd.setCursor(0,0); 40 lcd.print("answer"); 41 lcd.setCursor(0,1); 42 lcd.print("player2"); 43 delay(5000); 44 lcd.init(); 45 } 46}

###現段階の配線
ご指摘により掲載した写真と異なり,「~5」につないでいたものを「5V」のところにつなぎました.
イメージ説明
イメージ説明
イメージ説明
次の二つの画像で示しているもので,二枚目の赤い線を一枚目の赤い線と抵抗の間に挟んでいるものとなっています.

###組み合わせようとしているもの
イメージ説明
イメージ説明

###参考にしているサイト
参考1
このLesson5と
参考2
ここのKesson26を組み合わせようとしています.

###追記1
困ったことを変更いたしました.
現段階のコードを変更いたしました.
現段階の配線に説明を付け加えました.

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

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

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

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

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

guest

回答2

0

ベストアンサー

配線について言えば、LCDのVCCが5番ピンに繋がっています。
これはLCDの電源を制御しようとしているのでしょうか?単なる間違い?
いずれにしても、5Vに繋いでください。
ピンの出力能力的に、LEDとLCDの直接制御は止めた方が良いです。

スケッチで言えば、このスケッチでどこまで行うつもりで書いたのでしょうか?
バックライトはスイッチが押された時に点く(押されるまでは消す)仕様なのでしょうか?
普通は

lcd.init(); lcd.backlight();

の2行はsetup関数内に書けばいいです。loop関数でわざわざ初期化まではしません。
※現在のスケッチでは押されたら数十回loop関数が回って初期化する事になります。
バックライトを制御したいのなら
nobacklight()?関数あたりとセットで行う事になります。

現在のスケッチが早押しにはなっていないのは判りますよね?

「5秒間拒絶」は単にdelay(5000);をそれぞれの最期に付ければ実現できるでしょうけど、
あまり良くない仕様だと思います。
出題者がリセットする。或いは回答者にリセットさせる(プレートが立ちあがる仕様など)、が普通だと思います。

もう少し仕様を考えた方が良いです。

投稿2021/05/22 08:46

編集2021/05/22 08:47
nac_tnk

総合スコア494

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

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

grape_ll

2021/05/22 11:09

配線についてですが,撮影の角度が良くありませんでした.実際は5番に正しく入っています.見づらい撮影で申し訳ございません. 5Vにつなぐと ``` pinMode(ledPin, OUTPUT); ``` などは意味のないものとなってしまうのですが,常時5Vを流してもよいのでしょうか. スケッチは,現段階ではひとまずボタンを押したらLCDに出力,LEDが点灯してくれればいいなと思って書きました. まだいじり始めたばかりで,何ができるのかが良くわかっていないため,あまりいい仕様となっていないのは自分でもわかります.ひとまず, ボタンを押したらLCDとLEDが点く→早押し機能を入れる という順で1つずつ片づけていこうと思っています.
nac_tnk

2021/05/22 11:24

LCDのVCC?或いは5V?(電源の+ピン)の事です。 上の一番下のイラスト図での赤ケーブルです。
nac_tnk

2021/05/22 11:26

LEDを操作する部分はそのままです。 何故かそこに、LCDの電源ピンが刺さっている、という事です。
grape_ll

2021/05/22 11:33

状態が改善したので質問内容を編集しました. 変えたことは,コードのloop部分と5Vにつなぐというものです. ご指摘いただいたように修正させていただいたところ,ボタンを押した方のplayerを表示させることは出来ました.しかし,LEDが常時ついた状態です.これを,ボタンを押したとき~5秒後までの間に制限したいのですが,何か案はございますでしょうか.
nac_tnk

2021/05/22 11:59

何か変な事をしたのでは? 元の写真から言えば、LEDの右にある濃灰(又は或いは黒)のケーブルを抜いて、それを5Vに挿し直すだけです。 ※常時、LEDがついているのなら多分LED部も5Vに繋いでしまっているのでしょう。 上のスケッチでは digitalWrite(ledPin, LOW); ですから光る事はありません。→そこはHIGHでは?
grape_ll

2021/05/22 12:59

LEDの方を5Vにさしてました. 点灯の方もHIGHにしたら光りました. 質問点はすべて解決しました.ありがとうございました.
guest

0

考えたアルゴリズム
片方のボタンが押されたらLEDを点灯させて,入力の受付を5秒間拒絶する.

それは「アルゴリズム」(処理手順)というものではないでしょう?期待する動作を記述しているだけで、「どうやってそれを実現する」という話を書いて初めてアルゴリズムと呼べると思います。

配線については...
LED/スイッチ/LCDはそれぞれ独立しているのですから、配線は最新版でそれぞれのテスト用のスケッチが動作するかどうか試してみましょう。「動かなくなった」ところがあればそれについて変更したところが間違いだということです。

スケッチについては...言ってしまえば、やりなおし。
いろいろな要素をいっぺんに詰め込まないで、
・Aが押されたら/Bが押されたらそれぞれがLCDに表示される(A/Bの識別)
・Aを押して離す前にBを押しても、逆にBを押して離す前にAを押しても表示が変化しないようにする(早押し検出の実現)
・Aを押して(Bを押して)離してから5秒以内にAまたはBを押しても反応しないようにする
を順次取り込んでプログラムを「育てて」行ったらどうでしょう。

投稿2021/05/22 07:27

thkana

総合スコア7703

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

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

grape_ll

2021/05/22 11:11

アルゴリズムについて,おっしゅる通りですね.あまりにも大ざっぱすぎました. これも何をしたいのか,ですね 段階的にプログラムを書くのは基本ですよね. arduinoでプログラムを書いた経験がほとんどなく,理解に乏しいためこのようになってしまいました. もう一度悉皆読んでみようと思います.
grape_ll

2021/05/22 11:35

少し改善したので質問を編集させていただきました.
thkana

2021/05/22 12:28 編集

全然別の結線図で、たまたま同じ色だったから、と線を繋ぎ合わせていませんか。 ちゃんと回路の意味を考えて接続してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問