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

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

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

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

Q&A

解決済

2回答

1377閲覧

ArduinoのArduBlockの「set digital variable」の意味について

natuy

総合スコア1

Arduino

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

0グッド

0クリップ

投稿2021/09/20 13:35

youtubeを見ながら、Arduinoを勉強しています。
野球関係でArduinoを使って何かできないかと思っています。

下記記のURLの野球のスコアボードのボールの設定に関してです。
https://www.youtube.com/watch?v=7ee_kbTqm8A&t=2769s

スイッチを押すと、ボールのLEDの点灯が増えて行くという過程の話で「set digital variable」がでてきました。
英語表記の説明書がありましたが、そもそものどんな理由で使われるかが分からなかったため諦めました。

どのような理由で使われているか、また、よく使われるパターンなどあれば教えていただけると幸いです。

動画では31:40に「スイッチを押すとずっと押しっぱなしになるので、前の値をとって、前の値がついてたのに、今ついていない、今電気パワーがさっきあったのになくなっちゃったからその瞬間だけを捉える」と表現されていました。

素人では難しすぎて理解が追い付いていないです。

ピンについては、
pin2:ボール1
pin3:ボール2
pin4:ボール3
pin5:ストライク1
pin6:ストライク2
pin7:アウト1
pin8:アウト2
pin9:ボールのボタン
pin10:ストライクのボタン
pin11:アウトのボタン
pin12:ストライク、ボールリセットのボタン
pin13:ストライク、ボール、アウトのリセットボタン
pin9のボールボタンを押すと、pin2~4までのボールのLEDが増えて行くという流れです。
イメージ説明

初めての質問で、どの程度情報を載せればよいかわかりません。
よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

素人では難しすぎて

というか、ツールが(2017年で開発が止まっているだけあって)あまり出来が良くない気もします。使う側の「簡単さ」が中途半端というか、ツールを作る側があまり練り込んでいない感がなんとなく。

で。"set digital variable"の話と、スイッチを「押した」検索は直接には関係ありません。

この命名も良くないと思うのですが、set digital variableは、普通のC++で言えばbool型の変数に代入というところで、つまりtrue(実体としては通常は値1)かfalse(値0)しか取り得ない値を、その型を受け入れる変数に代入するというブロックのようです。
今回は、デジタル入力ピンの状態を受けるので、HIGH(1)かLOW(0)しか値がありえないのでその値をBall_button変数に代入します、というだけのこと。

スイッチを「押した」ことの検出はすでに解決しているようですね。
ピンの状態を調べることはつまりスイッチが「押された」という動作ではなくて「今、押されているかどうか」という状態の検出でしかありません。では「押された」という動作はどうやって知るのか...「動作」ですから、時間の要素が絡んできます。「過去には押されていなかった。今は押されている。」これを調べればいいわけです。過去はどうやって知るか...変数に記録しておきましょう、というのを先のset digital variableで実現しているということ。

ということをちゃんと考えると、質問のプログラムは「良くない(まれとはいえ誤動作の可能性がある)」ことがちょっと見えるかも知れません。
「過去には押されていなかった、今は押されている」を検査する時に、「今」の状態を保存していないので、
「過去の変数と、今押されているかピンを調べて」押されたかどうか判断...A
<間に処理を挟んで>...B
「今押されているかどうかピン状態を変数に保存する」...C
Bの処理の間にスイッチの状態が変化したら、その変化を検出できないことになります。
完璧を期すなら、
今押されているか状態を変数に入れる
「過去の変数と、今回の変数を調べて」押されたかどうか判断
<間に処理を挟んで>
「今回の変数を過去の変数に代入する」
とでもしないといけませんね。

もともと動画中で「PullupしないとArduinoによくない」とか怪しいことを言っている人なので、その程度の信用しか置いちゃいけないのかも知れませんが。

投稿2021/09/20 23:44

thkana

総合スコア7703

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

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

natuy

2021/09/21 02:25

素人にもわかりやすいご説明ありがとうございます。 2017年で開発が止まってるんですね! C言語は難しそうだったので子供用のプログラミング学習で使われるScratchみたいで、使いやすいのかなと思っていました。 しっかり勉強します、ありがとうございました。
thkana

2021/09/21 13:17

Arduino単独で動かしたいということでなければPC上の本家Scratch (+Firmata)からArduinoを制御できたりもするみたいですね。'Scratch Arduino'で検索すれば情報が見つかると思います。 "Arduino"ではなくてESP32を使ったボードであればUI Flow( https://flow.m5stack.com/ )とか、micro:bitであればMakeCode( https://microbit.org/code/ )とかをつかうなんていうことも考えられます。こいつらは、Micro-pythonやJavascriptでのプログラミングもできたりしますし、Arduino IDEも使えます。C言語がイヤというだけなら、これらを考えてもよいのではないでしょうか。 マイナーな環境を選ぶなら、非力なArduino (UNO)を入門に使うメリットはほとんどないのではないでしょうか。
natuy

2021/09/23 09:41

ScratchからArduinoを制御できるんですね!調べてみます。 プログラミング言語はとりあえず、Arduinoが動かしたいのでC言語もできないといけないですね。 上達したらラズパイとかも触ってみたいです。 素人すぎるので、沢山のご指導ほんとうに助かります。
thkana

2021/09/23 10:02

> 上達したらラズパイとかも あまり手を広げすぎない、という意味なら順番でもいいですけれど、別にRaspberry Piの方がムツカシイとかそういうことでもないので、遠慮せずに手を出してしまってもよいかも知れません。 ArduinoとRaspberryPiは、いわば自転車と中型バイクの違いみたいなイメージでしょうか。どちらも街なかの買い物に「いい感じ」に使えますけれど、乗りこなしやそれ以外の用途には違いがある、というところ。
natuy

2021/09/28 08:50

ありがとうございます。 C言語の入門書、電子工作大図鑑、電子工作パーフェクトガイド、ESP32&Arduino・・・ 教材は買ったはいいんですが、入門書なのに難しすぎて・・・。 Youtube、ネット、teratailで少しずつ勉強します。
guest

0

ベストアンサー

動画も画像も見てませんが、スイッチの処理について解説しときます

GPIOを入力に設定してスイッチをGNDの間につなぎます。
これで、スイッチを離しているときはGPIOはHighレベル(5V)に、スイッチを押しているときはLowレベル(0V)となります。
これを単純に、Lowになったら押されたと判定して、ボールを+1する、という処理を書くと、スイッチを押しているあいだ、コードのそこを通るたびに+1されてしまい、押しているあいだじゅうボールが増え続けてしまう、ということになります

それをどうにかするには、変数を一個用意しておいて、スイッチの状態を見るときに必ずその状態をそこに保存しておく、という処理を行います。
そうしておいて、その変数がHighで、かつGPIOがLowのときにだけボールを+1する処理を実行する、ってことをすると、スイッチを押したときに一回だけ+1する、という動作が実装できます

#もひとつ、チャタリング除去処理、ってのも実装したいところですが。。

投稿2021/09/20 14:36

編集2021/09/20 14:47
y_waiwai

総合スコア88042

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

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

natuy

2021/09/20 15:03 編集

早々の返信ありがとうございます。 つまりこれがないと、ボタンを長押しする(押したままにする)と、ループが繰り返されてボールのLEDが意図せず勝手に増えてしまうという事でしょうか? 長押ししてしまって誤作動が起こらないような処理がされたと認識すれば良いのでしょうか?
y_waiwai

2021/09/20 15:11

そいつがどういう動作してるのかわからんけど、たぶんそういうことじゃないかと。
natuy

2021/09/20 15:14

ありがとうございました。 もっと勉強致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問