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

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

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

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

Q&A

解決済

4回答

3409閲覧

aruduinoのタクトスイッチのことを教えてください

OtoMura

総合スコア22

Arduino

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

0グッド

0クリップ

投稿2018/03/26 14:05

タクトスイッチで音のモードを変えられるようにしたいのですがどうしてもわからなくて教えていただけないでしょうか。

3つのタクトスイッチをそれぞれ押すと”ド” ”レ” ”ミ”と鳴りもう一つのタクトスイッチを押すと3つの音が”ファ” ”ソ” ”ラ”と鳴るようにプログラムをしているのですが、切り替えに使うタクトスイッチの初めの切り替えはできたのですが、元に戻す時のプログラムがどうしてもわかりません。どんな仕組みにすればいいですか?
まだ始めたばかりでわからないことも多いのですが教えていただけないでしょうか。

作ったプログラム

void setup() { pinMode(A2,INPUT_PULLUP); pinMode(A3,INPUT_PULLUP); pinMode(A4,INPUT_PULLUP); pinMode(A5,INPUT_PULLUP); } int a = 0; int aqw[] = {262,294,330,349,392,440,494}; void loop() { if (digitalRead(A2)==LOW) tone(13,aqw [a],30); if (digitalRead(A3)==LOW) tone(13,aqw [a+1],30); if (digitalRead(A4)==LOW) tone(13,aqw [a+2],30); if (digitalRead(A5)==LOW) a=3;    //ここからが分かりません }

試したこと

IFやWHILE、FORなどでやってみたりしたのですが、A=1にした時何を条件にして切り替えれば良いのか分かりません.

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

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

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

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

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

y_waiwai

2018/03/26 14:09

タクトスイッチは4つあるんでしょうか?
OtoMura

2018/03/26 14:11

4つ目で変換したいんです。
guest

回答4

0

ベストアンサー

こんなかなー。

Arduino

1void setup() 2{ 3 pinMode(A2,INPUT_PULLUP); 4 pinMode(A3,INPUT_PULLUP); 5 pinMode(A4,INPUT_PULLUP); 6 pinMode(A5,INPUT_PULLUP); 7} 8 9int a = 0; 10int aqw[] = {262,294,330,349,392,440,494}; 11 12void loop() 13{ 14 if (digitalRead(A2)==LOW) tone(13,aqw [(a * 3) + 0],30); 15 if (digitalRead(A3)==LOW) tone(13,aqw [(a * 3) + 1],30); 16 if (digitalRead(A4)==LOW) tone(13,aqw [(a * 3) + 2],30); 17 18 if (digitalRead(A5)==LOW) 19 { 20 a++; 21 if(a > 1) { a = 0; } 22 } 23}

投稿2018/03/26 14:22

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

OtoMura

2018/03/26 14:39

if (digitalRead(A2)==LOW) tone(13,aqw [(a * 3) + 0],30); if (digitalRead(A3)==LOW) tone(13,aqw [(a * 3) + 1],30); if (digitalRead(A4)==LOW) tone(13,aqw [(a * 3) + 2],30); ここは何を表しているのですか?
OtoMura

2018/03/26 14:44

出来ました!
退会済みユーザー

退会済みユーザー

2018/03/26 14:44

最初は a = 0 でイニシャライズされているので aqw[(a * 3) + 0]の結果はaqw[0]と同じになり、ドです。 A5が押されるとaがインクリメントされて0から1になります。 すると、aqw[(a * 3) + 0]の結果はaqw[3]と同じになり、ファの音になります。 もう一回A5を押すとaがインクリメントされて1から2になりますが、 if(a > 1) { a = 0; } により、0に再設定されます。 結果、aqw[(a * 3) + 0]の結果はaqw[0]と同じになり、ドです。 以後、繰り返しです。 なお、チャタリング対応は趣旨が変わってくるので今回は考慮していません。
退会済みユーザー

退会済みユーザー

2018/03/26 14:48 編集

このようにすると、たとえば int aqw[] = {262,294,330, 349,392,440, 494,523,554}; として、ドレミ、ファソラ、シドレに仕様変更しても if(a > 2) { a = 0; } のようにするだけで対応できるわけです。 これが、“決め打ちしない”コードになります。
OtoMura

2018/03/26 14:53

なるほど。ありがとうございます。 2回押されたかを見るということですよね。
退会済みユーザー

退会済みユーザー

2018/03/26 14:56

2回というか、何回目か、ですね。 他の人は直で3を代入して足したりしているのですが、それはあまり良いやり方ではありません。
OtoMura

2018/03/26 14:58

できる時と出来ない時があるのですがなぜですか?
退会済みユーザー

退会済みユーザー

2018/03/26 15:00

ところで、そのプログラムでA5のスイッチを押しっぱなしにすると(というか一瞬でスイッチを離さなかったとしたら)なにが起こるでしょう?
退会済みユーザー

退会済みユーザー

2018/03/26 15:01

出来ないときというのは恐らく、ほかの方が書いているチャタリングの問題でしょう。 1回押しただけのつもりでも、何度もA5=LOWのイベントが発生して実は偶数回押されたことになっていて、a++、a++、a>1 → a=0 となって、元に戻ってしまっている状態だと想像します。
退会済みユーザー

退会済みユーザー

2018/03/26 15:02

>THOR_V6 >なお、チャタリング対応は趣旨が変わってくるので今回は考慮していません。 何が起きると思っているんですか?
退会済みユーザー

退会済みユーザー

2018/03/26 15:04

致命的な問題は起きないように考慮してあるはずですが、お分かりにならない?
OtoMura

2018/03/26 15:11

すみません理解不足でした。1回目と2回めで分けるということですね。
退会済みユーザー

退会済みユーザー

2018/03/26 15:17

そうですね。他の人のように、3を直接代入するとなると、仕様変更では今度は6を代入、9を代入となっていきます。 数が少ない時はよいのですが、例えば100セットくらい必要になってきたとき、 動作がおかしいからデバッガを使ってaの値をトレースしてみたら、a=69でした、この69って、一体どういう状態?となってしまいます。 aがボタンを押した回数になっていれば、a=23が返り、ああ、23回押されたところで挙動がおかしいから、そこに絞ってデバッグしよう、という判断ができるわけです。 プログラムは、できるだけ状態がシンプルになるようにするのがコツです。
退会済みユーザー

退会済みユーザー

2018/03/26 15:18

ただ、組み込みですと速度重視なので必ずしもそうでないこともあるかもしれません。
退会済みユーザー

退会済みユーザー

2018/03/26 15:20

いやぁ、なんか怖いなぁ。私悪いことしたのかな? チャタリングじゃありません。それは「ロシアンルーレット」プログラムになっているからです。そのプログラムは、スイッチを押している間loop()実行毎に(つまり超高速で)aが1/0で切り替わっているのです。だから、スイッチを押してから離すまでのタイミングによって1と0とがどちらになるか...という運試しプログラムになっています。
退会済みユーザー

退会済みユーザー

2018/03/26 15:21

この場合、それ、なんか関係ありますか?
退会済みユーザー

退会済みユーザー

2018/03/26 15:22

起こる現象、同じでしょう。 というか、あなた、なんでそんなにムキになってるんです? 指摘された内容が理解できてないんですか?
退会済みユーザー

退会済みユーザー

2018/03/26 15:24

書きましたよね? そのへんの問題は、今回の質問とは趣旨が外れるから考慮しないって。 あなたのはプログラムの基礎ができていないから指摘したんです。
退会済みユーザー

退会済みユーザー

2018/03/26 15:27

う~ん。困ったなぁ。きちんと動いていないプログラムと、定数を埋め込んだプログラムと、どっちがましかという議論ですか?
退会済みユーザー

退会済みユーザー

2018/03/26 15:28

それは、質問内容を見てみればわかるんじゃないですか? あなた、頭おかしいですね。
退会済みユーザー

退会済みユーザー

2018/03/26 15:29

近くの美味しいラーメン屋の場所を聞いてきた外人観光客に塩分摂取による高血圧のリスクを説明しようとするつもりですか?
退会済みユーザー

退会済みユーザー

2018/03/26 15:29

どちらになるか決まらないのは、チャタリングのせいじゃありません。
退会済みユーザー

退会済みユーザー

2018/03/26 15:30

あっそ。 一生言っててください。
退会済みユーザー

退会済みユーザー

2018/03/26 15:30

いやいや、そもそもの質問の機能が出来ていないでしょ、ということです。
退会済みユーザー

退会済みユーザー

2018/03/26 15:31

う~ん、だれか、第三者的に見てみてくれませんかねぇ。
mituha

2018/03/27 01:04

通りすがりですが、a5 が押されている間、aは0,1,0,1,... を繰り返すことになると思われます。 a5のスイッチの使用方法(押したときだけが、トグルか)にかかわらず正しくは動作しないように思えますね。
退会済みユーザー

退会済みユーザー

2018/03/27 01:13

本当に通りすがり過ぎて、再コメントするのめんどくさいです。
mituha

2018/03/27 02:03

不勉強で申し訳ありません。「if (digitalRead(A5)==LOW)」 は押し下げが発生したかの割り込み等のイベントではなく、その時の入力状態を読むと考えたのですが、「何度もA5=LOWのイベントが発生して」と描かれているのが気になります。何かarduino特有の動作や書き方等があるのでしょうか?
退会済みユーザー

退会済みユーザー

2018/03/27 02:47

いいえ、そうではなく、今回の質問の焦点はそこには無いのでノイズになるから省いただけです。 そうしたら、他の下等なコードを書いている二人がいちゃもんを付けてきたのでコメントの嵐になってしまったというわけです。
mituha

2018/03/27 03:09

コメントありがとうございます。背景は理解しました。ただ、aruduinoの動作速度、および、押す人のタイミング依存で動作が不安定になると思われます。今後、このコードを参考にする人(コメントまで読まずに)もいると思われますので、本文中に注釈等、入れておいていただけますと幸いです。
退会済みユーザー

退会済みユーザー

2018/03/27 03:15

コメントに書いてあるんですよ、最初の方に。本来ならそれで済んだんですが、 下等なコードを書いてる方が頭に血が上っちゃって延々とそれに絡んできたせいで、埋もれてしまってますけどね。 コメント読まずに参考にして動かなかったらそこで「なんでだ?」となって新たな学習のきっかけになるでしょう。実際、今回の質問者もまず、僕のコードで切り替わることを確認し、その次に「うまくいかない時があるのはなぜか?」と質問しています。 この段階にきて、初めて「それはね…」と話ができるんです。 学習というのは正しいステップを踏んで行っていくのが一番効率が良いです。
退会済みユーザー

退会済みユーザー

2018/03/27 03:23

例えば、他の方の下等なコードの場合数値が決め打ちなのですが、あるミスでa=1とか予期しない値になるコードが紛れ込んだ場合、 おかしな挙動になってそこから一切ぬけだせなくなりますし、aが100等配列要素数を超えるとinvalid accessで落ちます。 こんな簡単なコードならその心配はないかもしれませんが、規模が大きくなってくればいくらでもありえます。 そういう事にならないよう、まず、絶対的な安全を確保するコードの書き方を覚える方が先決です。
mituha

2018/03/27 03:49

質問者も回答者も様々ですので、全員納得するのは難しいところもあると思います。 このコードの場合、 例えば、loopが10ms間隔で動作しており、ボタンを10ms以下だけ押して離した場合、A5 == LOW 部分は1回通り、a=1 で 以降、ファゾラで鳴り、11-20msで押して離した場合、A5 == LOW 部分は 2回通り、a=0 に戻って、以降、ドレミが鳴り、押した回数だけではなく、押した時間にも依存する。 ような動作をすると思われます(机上での想像ですが)。 段階を踏んで確認してもらうのは対面学習的に非常に良いと考えますが、 この動作は動かなかった場合の確認、デバッグとして初心者には難しいように思えます。
退会済みユーザー

退会済みユーザー

2018/03/27 03:57

で、わからなかったから「何故ですか?」と聞いて、それにこたえるわけですよ。 フルコース料理、一度に全部出すシェフのとこで食べたいですか?
mituha

2018/03/27 04:20

シェフや隣の客とも色々喋りながら食べられる、teratailは好きです。 通りすがりの一見さんに長々お付き合いくださりありがとうございました。
guest

0

全部タクトスイッチですか? 「切り替え」用のスイッチは最初はトグルスイッチとかシーソースイッチの方がわかりやすいようにも思いますけれど。

タクトスイッチで「切り替え」をおこなうには、手を離すと接点も離れちゃいますから、「押されている」ことを調べても駄目で「押された」ことを検出して、押された瞬間だけ切り替え動作を行うことになります。

さて、「押された」ってどういうこと? 直前までは押されていなくて、今は押されている、ということ。

C++

1//setupとかは変更なし 2int prevA5=HIGH;//直前のA5の状態を記憶するための変数。最初は「押されていなかった」設定。 3void loop(){ 4 if (digitalRead(A2)==LOW) tone(13,aqw [a],30); 5 if (digitalRead(A3)==LOW) tone(13,aqw [a+1],30); 6 if (digitalRead(A4)==LOW) tone(13,aqw [a+2],30); 7 8 int curA5=digitalRead(A5);//プログラム中で何度もdigitalRead(A5)で状態を調べると、もしかしたら途中でスイッチの状態が変わってしまっていることもあるかも知れないので検査は一回だけにする 9 if ( (prevA5==HIGH) && (curA5==LOW) ){ //直前は押されていませんでした、そして今は押されています...つまり、スイッチが今まさに押されました、ということを検出する 10 if(a==0){//今までがa==0だったらaを3に、そうでなっかたらaを0に設定する 11 a=3; 12 }else{ 13 a=0; 14 } 15 delay(50); //簡易「チャタリング」避けで時間をおく 16 } 17 prevA5=curA5; //今の状態は、次の瞬間には「過去」になる 18} 19

投稿2018/03/26 14:33

編集2018/03/27 12:41
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/03/26 14:35

なんで決め打ちすんですか…
退会済みユーザー

退会済みユーザー

2018/03/26 14:41

「決め打ち」って? (そういえば、シフトキー的動作、という考え方はあったな)
退会済みユーザー

退会済みユーザー

2018/03/26 14:49

僕の回答の方に書きました。 プログラミングの基礎です。
退会済みユーザー

退会済みユーザー

2018/03/26 14:58

「このくらいのサンプルプログラム」と気を使わなかっただけで。説明としては手落ちだったかも知れません。
OtoMura

2018/03/26 15:00

なるほど!
退会済みユーザー

退会済みユーザー

2018/03/26 15:37

とりあえず、この(最初の方の)プログラムはA5のスイッチを押す度に「ドレミ」と「ファソラ」が切り替わっていると思います(といいつつ自分では確認実行してないのだけれど...大丈夫だろうな...)
退会済みユーザー

退会済みユーザー

2018/03/26 15:38

なんでそんなに必死なんだろうな…
退会済みユーザー

退会済みユーザー

2018/03/26 15:42

だって、そもそもが「スイッチで切り替えたい」という要求だから、それがまともに動かないと意味ないでしょ。
退会済みユーザー

退会済みユーザー

2018/03/26 15:49

まだ言ってるし… ロボだなぁ…
OtoMura

2018/03/26 15:53

回答していただけるのはありがたいのですがあまりケンカをしすぎると僕が必要としている回答がわからないんですが
退会済みユーザー

退会済みユーザー

2018/03/26 15:55

“試練”だと思ってください。大体技術系サイトはこんなもんです。
退会済みユーザー

退会済みユーザー

2018/03/26 15:55

ごめんなさいね。
退会済みユーザー

退会済みユーザー

2018/03/26 15:57

一応、「どうすればいいか」は元の回答に一通り書いてあるつもりなので読んでみて下さい。わからないところがあれば聞いていただければお答えしますから。
OtoMura

2018/03/26 15:58

こちらこそ夜遅くにありがとうございます
OtoMura

2018/03/26 16:05

prevA5=curA5 ここが保持するというやつですか?
OtoMura

2018/03/26 16:12

今度はこっちを詳しく教えてください
退会済みユーザー

退会済みユーザー

2018/03/26 16:13

です! prevA5はグローバル変数(関数の外で宣言している変数)なので、関数から抜けても値を保持しています。そうすると、次にloop変数に入った時に、「前回の値」といういみになるわけです。
OtoMura

2018/03/26 16:14

初めて知りました!
OtoMura

2018/03/26 16:15

ありがとうございます
退会済みユーザー

退会済みユーザー

2018/03/26 16:16

結構必須テクですので覚えといて下さい。 タクトスイッチを押した回数を数える、なんてことをやろとするときにも出てきます。 (今回も2回まで数えている、と言えなくもない)
退会済みユーザー

退会済みユーザー

2018/03/26 16:19

単純に if (digitalRead(A5)==LOW) { a++; なんてやっちゃうと、ちょんと押しただけですんごい沢山値が増えちゃって呆然とすることになります。
退会済みユーザー

退会済みユーザー

2018/03/26 16:21

事実を歪曲するヴァカと…
退会済みユーザー

退会済みユーザー

2018/03/26 16:22

別に、俺には関係ないから質問者が誤解して無駄な努力をするのは構わないけどね。
退会済みユーザー

退会済みユーザー

2018/03/26 16:22

一応、言ったから、後は知らない。
OtoMura

2018/03/26 16:22

なるほど
退会済みユーザー

退会済みユーザー

2018/03/26 16:25

まぁ、プログラムを試してみればわかることですから。あなたのArduino君を信じましょう。
退会済みユーザー

退会済みユーザー

2018/03/26 16:26

あいかわらず、論点が違うことに気付かないのがロボなんだよなぁ…
OtoMura

2018/03/26 16:26

すみません 謎のエラーが
退会済みユーザー

退会済みユーザー

2018/03/26 16:29

え~っと、「エラー」だとわからないのでエラーメッセージを教えて下さいな。
OtoMura

2018/03/26 16:31

/Users/oto/Documents/Arduino/_____r/_____r.ino: In function 'void loop()': _____r:17: error: expected ')' before '{' token if ( (prevA5==HIGH) && (curA5==LOW){ //直前は押されていませんでした、そして今は押されています...つまり、スイッチが今まさに押されました、ということを検出する ^ exit status 1 expected ')' before '{' token
退会済みユーザー

退会済みユーザー

2018/03/26 16:33

...ごめんなさい、カッコの数があってなかった...
退会済みユーザー

退会済みユーザー

2018/03/26 16:34

なにしてんですか…
退会済みユーザー

退会済みユーザー

2018/03/26 16:34

if( (prevA5==HIGH) && (curA5==LOW) ) { {の前に閉じカッコが一個たりないですね。せめてコンパイルは通すべきでした。ごめんなさい
OtoMura

2018/03/26 16:35

出来ました
退会済みユーザー

退会済みユーザー

2018/03/26 16:36

ということでArduino IDEを立ち上げてみる
OtoMura

2018/03/26 16:36

このプログラム完璧ですね!!!
退会済みユーザー

退会済みユーザー

2018/03/26 16:38

えぇ、定数を埋め込んでいる以外は、ということですが。
退会済みユーザー

退会済みユーザー

2018/03/26 16:39

こういうとすんげー起こられるかも知れないけど、ソフトエンジニアじゃなくて電子工作の「部品」としてArduinoを使う人はあまり細かいこと気にしなくてもいいんじゃないか、と私は思ってたりする...
退会済みユーザー

退会済みユーザー

2018/03/26 16:41

あなただけで完結するならそれでいいですよ。
OtoMura

2018/03/26 16:47

prevA5==HIGH このHIGH等しいとはどういう意味ですか
退会済みユーザー

退会済みユーザー

2018/03/26 16:53

スイッチは、プルアップしているのでOFF状態だとdigitalRead(A5)でHIGH, ON状態でLOWが返りますよね。 prevA5はdigitalRead(A5)がLOWだったかHIGHだったかを記憶しているわけです。 なので、スイッチがOFFである(prevA5なのでOFFであった、という方が正確か)、ということを調べています。
退会済みユーザー

退会済みユーザー

2018/03/26 17:13

じゃぁ、こっちはとりあえず動いたみたいなんで寝ますね...(って、こんなチャットみたいに使う欄なのか、ここは?)
OtoMura

2018/03/26 23:26

ありがとうございました。
guest

0

Arduinoはやったことありませんが、ブール型を利用すれば簡潔に記述できるのでは?
という内容で記述してみました。
Arduino 日本語リファレンス【ブール型】
Arduino 日本語リファレンス【true/false (論理レベルを定義する定数)】

あくまで、false=0 true=1 という値を取ればという前提ですが。

動くかどうかも、いや、コンパイルさえ通るかどうかも分かりませんけど。

Arduino

1void setup() { 2 pinMode(A2,INPUT_PULLUP); 3 pinMode(A3,INPUT_PULLUP); 4 pinMode(A4,INPUT_PULLUP); 5 pinMode(A5,INPUT_PULLUP); 6} 7boolean A5switch = false; 8int aqw[] = {262,294,330,349,392,440,494}; 9void loop() { 10 if (digitalRead(A2)==LOW) tone(13,aqw [(A5switch * 3) + 0],30); 11 if (digitalRead(A3)==LOW) tone(13,aqw [(A5switch * 3) + 1],30); 12 if (digitalRead(A4)==LOW) tone(13,aqw [(A5switch * 3) + 2],30); 13 if (digitalRead(A5)==LOW) { 14 delay(100); // バウンシング対策 15 A5switch = !A5switch; // ブール変数でオンオフ切替 16 }

投稿2018/03/27 02:06

sazi

総合スコア25138

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

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

mituha

2018/03/27 02:24

実用上はそれほど困りませんが、この場合も、delay(100)以上の時間A5を長押しした場合の問題が残ると思います。
sazi

2018/03/27 02:32 編集

コメントありがとうございます。 はい、その点については、考慮外です。(というか知識がありません) 他の回答されている方(THOR_V6さんとか)のロジックが正しいなら、それと組み合わせて貰えば良いかと。 フラグ反転とそれを利用した値の取得というのが主眼です。
guest

0

ああ、スイッチは4つあるのね。
4つ目のスイッチ押したときに、交互にaを1と0にして、
aの値で3つのスイッチの動作を切り替えればいい


訂正。
きちんと配列で音の高さ変えるようにしてるのね。
そしたら修正は最後の a の代入のところで、
aが0だったら aに3を入れ、
aが0以外だったら、aに0を入れるようにすればいい

投稿2018/03/26 14:12

編集2018/03/26 14:19
y_waiwai

総合スコア87719

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

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

OtoMura

2018/03/26 14:15

お手数をかけるのですが具体的なプログラムを描いてもらえませんか?
y_waiwai

2018/03/26 14:20

回答を修正しました
OtoMura

2018/03/26 14:28

int a = 0; int aqw[] = {262,294,330,349,392,440,494}; void loop() { if (digitalRead(A1)==LOW) tone(13,aqw [a],30); if (digitalRead(A2)==LOW) tone(13,aqw [a+1],30); if (digitalRead(A3)==LOW) tone(13,aqw [a+2],30); if (a=0) a=3; else a=0; } こんなかんじですか?
y_waiwai

2018/03/26 14:31 編集

・A4のスイッチ押したという条件が入っていない ・if(a=0) { これ間違い。代入したらアカンがなw
OtoMura

2018/03/26 14:31

押されたらになってないですね
y_waiwai

2018/03/26 14:32

しかし、スイッチ押しっぱなしにしたら破綻するなこれ。。 変数ふやさんとあかんか。
退会済みユーザー

退会済みユーザー

2018/03/26 14:34

何してんですか…
y_waiwai

2018/03/26 14:36

うむー、なにしてんだろw
y_waiwai

2018/03/26 14:38

まー、チャタリング処理して、押されたときだけのエッジ検出して、、となるとなかなか大規模改修にw
y_waiwai

2018/03/26 15:20 編集

A4を押しっぱなしにしたときになにが起こるかコードを追いかけてみよう。 これ次の課題ねw A4じゃねーわw A5のスイッチね
OtoMura

2018/03/26 15:23

押しっぱなしにすると++がおこって繰り返すんじゃないですか?
y_waiwai

2018/03/26 15:27

正解。 そうなると、aがどういう状態になるかわからんというはなしにw
y_waiwai

2018/03/26 15:29

さて、次の課題は、押したときだけ、aを操作するようにすることだねw 押しっぱなしのときは操作しない、ようにするにはどうすればいいのか考えよう
退会済みユーザー

退会済みユーザー

2018/03/26 15:32

こんどは教室はじめたんすか…
y_waiwai

2018/03/26 15:33

ここはそういうところでしょw
OtoMura

2018/03/26 15:33

ifを2つ作ったらどうですか?
y_waiwai

2018/03/26 15:35

実際にやってみてどうなるのかを確認しようw
退会済みユーザー

退会済みユーザー

2018/03/26 15:37

今日、まだ月曜日(火になった)なんですけど…
OtoMura

2018/03/26 15:40

a++; if(a = 1) if(a = 2) { a = 0; } こうしたんですけどうまくいきません。 どうしたらいいですか?
OtoMura

2018/03/26 15:42 編集

2になったらすぐ変わるんだ!
OtoMura

2018/03/26 15:43

結局なにも変わらない。
退会済みユーザー

退会済みユーザー

2018/03/26 15:44

あー、それはね、多分ですけど、 まず、等しい事を示すときは = じゃなくて == です。 = 一つだと代入になっちゃいます。 で、 if(a == 1) みたいにして、そのあとブロックを作らなかった場合 (ブロックとは { } で囲んだもの) そのあとの1ステートメントだけ実行する仕様なんです。 だから if(a == 1) if(a == 2) { a = 0; } っていうのは if(a == 1) { if(a == 2) { a = 0; } } と同じ意味になって、a==1 かつ a == 2 のとき aを0にするという意味になって、絶対に実行されないです。 結構ね、この辺が初心者には難しい“決まり事”ですね。
y_waiwai

2018/03/26 15:46

スイッチを押していない状態から、押した状態になったとき、だけその処理をするようにすればいい ということは、スイッチの状態を保持する変数を作っておいて、前回のloop関数実行のときのスイッチ状態がわかるようにすればいい、ということになりますね
OtoMura

2018/03/26 15:47

なるほど
y_waiwai

2018/03/26 15:48

そうすれば、前回の状態が押していない、で、今回の状態が押している、ときにそれを実行。というふうにすればいい
OtoMura

2018/03/26 15:49

すみません 保持はどのようなコマンド、プログラムにすれば良いですか?
退会済みユーザー

退会済みユーザー

2018/03/26 15:50

よし、y_waiwai先生の教え方を見てみよう。
退会済みユーザー

退会済みユーザー

2018/03/26 15:51

私の回答、全然読んで貰ってなかったのね(泣)
y_waiwai

2018/03/26 15:51

保持って、たんにスイッチの状態を変数に入れるだけでいい
退会済みユーザー

退会済みユーザー

2018/03/26 15:54

>THOR_V6 あなた、全然質問者の立場になっていないので、聞く耳なんか、普通持たないです。
y_waiwai

2018/03/26 15:55

ループの最後にこれいれとくw b = digitalRead(A5);
OtoMura

2018/03/26 15:55

a = 0 こんな感じでいいんですか?
退会済みユーザー

退会済みユーザー

2018/03/26 15:57

>y_waiwai 先生、変数名は意味を持った名前が良いと思います!
y_waiwai

2018/03/26 15:59

a は音程切り替え用に使ってるので、スイッチ状態用の変数 b を増やすのだw そっちのもうひとりの生徒は、きちんと動くコードを作っておくようにw
y_waiwai

2018/03/26 16:00

他の生徒にケンカ売らないようにな。先生との約束だぞw
退会済みユーザー

退会済みユーザー

2018/03/26 16:01

他の先生には喧嘩売ってもいいんですよね?
退会済みユーザー

退会済みユーザー

2018/03/26 16:02

つーか、お二方は物事には順序ってものがあるって事を全く理解してないよね? だから指摘してあげてるんだけど。
退会済みユーザー

退会済みユーザー

2018/03/26 16:03

は~い先生(とよゐこを演じてみる)
y_waiwai

2018/03/26 16:03

こらこら、まともに動くコードも作れないのにケンカ売って回らない。 さっさときちんと動くコード作ってきなさいww
退会済みユーザー

退会済みユーザー

2018/03/26 16:04

(って、遊んじゃ質問者に迷惑だな、ごめんなさい)
OtoMura

2018/03/26 16:04

先生ー 変数bを作ることでどんなプログラムになるんですかーw
退会済みユーザー

退会済みユーザー

2018/03/26 16:05

そしてプログラムにはロジックというものがあるのです、よね。大先生。
y_waiwai

2018/03/26 16:05

あなたはどんなプログラムにしたいのだ?w どういう動作をするのかきっちり決める、のが、プログラムの設計というものだよ。
退会済みユーザー

退会済みユーザー

2018/03/26 16:06

まじ、この二人、ロボだな。救いようねーな。
退会済みユーザー

退会済みユーザー

2018/03/26 16:06

(お願い、私の回答見てみて...prevA5がつまりbに相当する変数。)
y_waiwai

2018/03/26 16:06

それが明確に決められていないと、今作ったみたいなどっちに転ぶかわからないコードになるということになる。
退会済みユーザー

退会済みユーザー

2018/03/26 16:08

あのさ、この流れで指示代名詞が何を指すのか分かると思ってんのかな? このロボは
退会済みユーザー

退会済みユーザー

2018/03/26 16:08

質問の大命題も理解できないロボ
退会済みユーザー

退会済みユーザー

2018/03/26 16:09

物事の優先順位も理解できないロボ
y_waiwai

2018/03/26 16:10

おお、模範解答がすでに出ていたかw>THOR_V6
退会済みユーザー

退会済みユーザー

2018/03/26 16:11

はっきり書いてやらないと理解できないの? それとも書いても理解できないほどロボなの?
y_waiwai

2018/03/26 16:12

こらこら、動かないコードを組んでしまったからと言ってケンカ売らないw>lucker
退会済みユーザー

退会済みユーザー

2018/03/26 16:12

今頃この馬鹿 y_waiwai は何言ってんだよ…
退会済みユーザー

退会済みユーザー

2018/03/26 16:12

おまえ、本当にどうしようもないな。
退会済みユーザー

退会済みユーザー

2018/03/26 16:13

読んでよ~(大泣)
OtoMura

2018/03/26 16:13

やめてくれーーーえい
y_waiwai

2018/03/26 16:14

ということで、THER_V6のコードを試してみたまえ>OtoMura
退会済みユーザー

退会済みユーザー

2018/03/26 16:15

だから、“物事には順序というものがある”と何度も言っているのに理解できないバカ先生2人
y_waiwai

2018/03/26 16:15

まー、ひがんでる生徒は放置しておこう。授業の邪魔だw
退会済みユーザー

退会済みユーザー

2018/03/26 16:16

おまえ、本当にヴァカだろ?
退会済みユーザー

退会済みユーザー

2018/03/26 16:17

int a = 0; int aqw[] = {262,294,330,349,392,440,494}; void loop() { if (digitalRead(A1)==LOW) tone(13,aqw [a],30); if (digitalRead(A2)==LOW) tone(13,aqw [a+1],30); if (digitalRead(A3)==LOW) tone(13,aqw [a+2],30); if (a=0) a=3; else a=0; } こんなかんじですか? やっぱヴァカだった。
退会済みユーザー

退会済みユーザー

2018/03/26 16:22

もしかして、お酒召されてます? (プロフィールをみると...)
OtoMura

2018/03/26 16:24

いいえ 学生です
退会済みユーザー

退会済みユーザー

2018/03/26 16:25

それ、物事の順序を無視したあなたの下等なプログラム的には、なんか関係あるんすか?
退会済みユーザー

退会済みユーザー

2018/03/26 16:26

(あ、ごめんなさい、OtoMuraさんじゃなくて)
OtoMura

2018/03/26 16:27 編集

なんだーーーーw
y_waiwai

2018/03/26 16:27

コンパイラ、C99だっけw
退会済みユーザー

退会済みユーザー

2018/03/26 16:27

その程度の文脈も正しく伝わるように書けないロボ。
y_waiwai

2018/03/26 16:31

ああ、C++だからいいのか
退会済みユーザー

退会済みユーザー

2018/03/26 16:32

(横から口出し)ArduinoはC++ベースです。gccだけど、C++11とかではなかったような。
y_waiwai

2018/03/26 16:34

うんうん、了解
退会済みユーザー

退会済みユーザー

2018/03/26 16:36

OtoMuraさんに言っとくと、基本的に技術者ってのは頭おかしいのでそういうもんだと思って対処してもらうのがいいんですが、 組み込み系の人のプログラムはめちゃくちゃなので、ほんと、見るのが嫌になるんですよね。 今回の質問だと、とりあえずドレミの押し分けについては疑問を抱いていないんだから あとはファソラの切り替えがつまづいているところとなるので、 普通の人は、あんまり範囲を広げると質問者が混乱するから、では、そこに絞って回答しようかとなるんです。 だから、「考慮してません」と注釈をそえてるわけです。 ところが他の二人って、じゃぁ押し続けたらどうなるの?みたいな、質問と関係ないことまで織り込んでくるんですよね。 もちろん、実務では必要なことなんですが、学習段階でそれやるとあれもこれもになって混乱するでしょう? だからこっちはそこを省いて回答してるんですが、そういう事が理解できないんですよ、ロボだから。 何度も「物事には順序ってものがある」と言っているのに「お前のコード動かないだろー」と喜んでいる。 頭おかしいんですよ、この二人。 何というか、相手の立場に立てないんですよね。
退会済みユーザー

退会済みユーザー

2018/03/26 16:48 編集

もっと分かりやすい言い方をすると、 僕が書いた方法に、あとは押しっぱなしの状態への対応を追加すればあらゆるケースに対応するプログラムが完成します。とても簡単です。 他の方のコードの場合、押しっぱなしのコードには対応しているけど、仕様が変わったら都度プログラムコード書き換えです。 どっちがマトモかって話ですよね。 プログラムって、人間の手間を省くために書くものなんですけど、組み込み系の人って、現在の事象をそのままコードにするので仕様が変わったら都度事象を作り替えなんですよね。 無駄でしょう? だからまぁ、あの人たちとは一生分かり合えないと思っていますけどね。
OtoMura

2018/03/26 16:51

ありがとうございました
y_waiwai

2018/03/26 16:54

うごかしてみた?
OtoMura

2018/03/27 14:12

はい。 完璧です!
OtoMura

2018/03/27 14:13

ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問