「Arduino」を使ったマイコンプログラミングを子供と一緒に学習するブログ。本日はLesson 13 ジョイスティック編です。2軸ジョイスティックを利用してX軸、Y軸、電圧値を読み取ることで2軸ジョイスティックの動作を理解します。ジョイスティックの基本を理解して応用につなげていきましょう! 楽しみながら、電子回路を作って、動くものを作ります。電子回路の簡単な動きも学べます。すこしの応用ができるようにします。 LTspiceを自由に使いこなして、はんだ付けしなくても電子回路を試せます。 ArduinoやRaspberry Piなどの小さなマイコンを活用する応用をたくさん取り上げます。 はじめに 3. 関連記事 2. 前回はArduinoでLEDを光らせる、というアウトプットを行いました。今回は逆にスイッチを使ってArduinoを制御する、というのに挑戦してみましょう。, Arduino本体 (今回はArduino Uno互換機)Akizuki : http://akizukidenshi.com/catalog/g/gM-07385/, LED(今回は青色LED)Akizuki : http://akizukidenshi.com/catalog/g/gI-01321/, タクタイルスイッチAkizuki : http://akizukidenshi.com/catalog/g/gP-03647/, 抵抗(220Ω)Akizuki : http://akizukidenshi.com/catalog/g/gR-25221/, 抵抗(10kΩ)Akizuki : http://akizukidenshi.com/catalog/g/gR-25103/, ブレッドボードとケーブルAkizuki : http://akizukidenshi.com/catalog/g/gP-00315/Akizuki : http://akizukidenshi.com/catalog/g/gC-05371/, 今回は上のように接続します。左側半分は前回のLチカと同様のものです。右半分が今回追加されたスイッチです。抵抗は10kΩ。, この10kΩの抵抗はプルダウン抵抗と呼ばれとても大切な抵抗です。この抵抗を入れないと適切に動かなくなるので、覚えておいてください。プルダウン抵抗に関しては別記事を書きますのでそちらを参照してください。, プログラム側で説明しますが、7番ピンをINPUT(入力用)のピンにした場合、基本的にはそのピンに電流が流れないような電圧に調整されArduinoがその電圧を読み取ります。今回はスイッチを押していない状態では、7番ピンはGND(0V)ピンにつながっているのでLOW(0V)値を取ります。逆にスイッチを押した場合は7番ピンは5Vに繋がるのでHIGH値(5V)を取ります(スイッチを押している間5V – GND間は電流が流れ続けますね)。, このようにスイッチでI/Oピンを5VとGNDに切り替えるようにすることで、I/Oピンを操作することができるようになるというわけですね。, ここで、スイッチの方式には2種類あり、「押している開いただけON / 離すとOFF」というようなゲートスイッチと「押すたびに ON / OFFが入れ替わる」というようなトグルスイッチがあります。, ゲートスイッチ、トグルスイッチどちらも重要なスイッチングなので今回はそれぞれについてコーディングしていきましょう。, 例によって必要に応じて、公式のリファレンスガイド ( https://www.arduino.cc/reference/en/ )や、日本語のリファレンスガイド ( http://www.musashinodenpa.com/arduino/ref/ )などを利用するのが良いかと思います。, 今回はタクタイルスイッチを7番ピンに繋げるので、7番にbuttonという変数を割り当てました。定数ではないのでconstはつけません。, pinModeにpinMode(button, INPUT);を追加します。OUTPUTはArduino側からLEDなどを操作するのに対して、INPUTはスイッチなどからArduinoを操作するのに使います。, loop()関数内にはじめに出てくるif()関数ですが、これは引数の中の値が真(正しい)ならば、if文内の処理を行い、偽(間違っている)ならif文の処理を行わない、というものです。さらにelse文を加えると、if文が処理されない場合のみ(つまり偽の場合のみ)else内の処理が行われます。, つまり、digitalRead(button) == HIGH が正しいときにはdigitalWrite(LED,HIGH);が処理され、正しくないときにはdigitalWrite(LED,LOW);が処理されるというわけですね。, ついでながら if の日本語訳は「もし〜なら」、elseは「そうでなければ」という意味ですね。, ですが、digitalRead()はdigitalWrite()の逆で、いまそのI/Oピンに電圧がかかっているかどうか(5Vか0Vか)を読み取る命令です。この命令はINPUTピンに対して有効です。, == HIGHは HIGHに等しい(5Vがかかっている)という意味。=と==は全く違うものなので注意してください。, これでボタンを押している間だけLEDが光るというゲートスイッチの実装ができました。, int val という新しい変数を用意し、val = digitalRead(button);でvalに値を格納するようにします。特に実際の動作に影響はありませんが、少しだけわかりやすくなったかと思います。, 基本はゲートスイッチから持ってきていますが、stateという変数が増えていると思います。トグルスイッチはスイッチが押されているかどうかに加えて、今のスイッチの状態(ONかOFFか)も記録しないといけません。それを格納する変数がstateです。, そのため、スイッチが押されるたびにこのstateの情報を入れ替えることでトグルの動作を行なっているわけですね。ここで、!は否定「ではない」をしめす論理演算子で 0と1しかとらない(boolean型)のstateの状態を入れ替えて代入する、という意味ですね。, 後半のif文で、トグルがONの時にLEDは点いて、トグルがOFFのときにはLEDが消える、というわけです。, ここで、これで良いと思って実際にコンパイルと書き込みを行なっても、きちんと思ったような動作が起きないです。なぜかというと、loop()が繰り返し実行されるからで、Arduinoの実行速度(クロック数)が人の動きよりもずっと早く、スイッチを押している間もこのloop()関数がひたすら周り続けているためです。そのためボタンを押している間ひたすらにstateは1と0を切り替えてしまう、というわけですね。そこで、ボタンを押したら必ず1回だけstateの状態を入れ替える、というようにしないといけません。, ここで、新しい変数valOldが出てきました。ボタンを押した一周目は val == HIGHでvalOld == LOW なので (val == HIGH)&&(valOld == LOW)は真になります。if文の処理ののちにvalOld = val となるので、ボタンを押した2周目以降はvalOld == HIGH なのでif文は実行されなくなります。, このようにすることでif文は意図されたタイミングで必ず1回だけおきるようになりますね。, これで完璧かと思いきやまだ思うように動いていないかと思います。これはボタンのチャタリングとよばれる現象が原因です。チャタリングに関しては調べればいっぱい出てくるので、一度調べて見てください。こちらもそのうち記事にまとめようかと思います。, ただし、delay()関数は極力使わない方が良いということは覚えておいてください。そのため、スイッチのチャタリング対策はハード面・ソフト面において様々な方法で行われています。, 前回のLチカでOUTPUTの基礎、今回のボタン処理でINPUTの基礎を学ぶことができました。小さな組み合わせを複雑に行うことで、大きなプロジェクトを作ることができるので、こういった基礎を覚えるのは大切ですね。, 目次 1. Blinkのスケッチは、勝手にLEDのON/OFFを繰り返しました。現実は、何かの指示でONしたりOFFするというのが一般的です。ここでは、スイッチを押すと、LEDが光るという動作を想定します。, 筆者は最初に就職した会社で高周波溶解炉を仕事で使っていました。約1kgのニッケル合金が溶けると、でっかくて赤い色をしたストップ・スイッチをグーでたたきます。絶対に止まってくれないと困ります。スイッチの内部は、銀合金の接点で構成されています。リレーも銀合金の接点が使われています。数mAぐらいの大きな電流をON/OFFさせる回路では確実に動作しますが、電流が少ないと、正しく動かないことがあります。, 接点を見ると、カチッとスイッチが入ったとき、OFFからONに、もしくはONからOFFに遷移するように思えますが、約10msの間、ON/OFFが繰り返すという現象が頻繁に起こります。チャタリングという現象です。, 電子デバイスの入力回路は、何もつながれないとき、電波などのノイズを拾ってしまい、かってにON/OFFすることがあります。なので、使用していない端子はGNDにつないだり電源にプルアップして中途半端な電圧を避けます。入力に使う場合は、通常プルアップ抵抗を入れ、常に電源電圧レベルにしておき、スイッチをGNDとの間に入れ、確実にスイッチONで入力端子が0Vになるように設計します。, まとめると、次の3項目になりますが、対応しなくても動く場合があります。Arduinoの場合は、3番目の対応だけは忘れずにします。, 電子機器のあらゆるところで使われるのが、押しボタン・スイッチの「タクト・スイッチ」です。ふつうは下の図の押すところの上に、「電源」とか▼の名前の印刷された薄い板がのっかっているので、直接見ることはありません。電源スイッチも、最近では直接電池やACラインをON/OFFすることはなくなっています。タクト・スイッチが押されると、プログラムで必要な終了処理をしてから、リレーなどで電源を切ります。, タクト・スイッチは、タクタイル・スイッチ、タクティール・スイッチ、プッシュ・モーメンタリ・スイッチとも呼ばれます。プッシュ・スイッチに分類され、押したときだけ接点がつながるので、モーメンタリ・スイッチの分類でもあります。, 接点は一組ですが、リード線は4本あります(2本脚の製品もある)。安定で配線しやすいです。外見を正方形に見てしまうと、どちら側がつながっているかが判別できません。じっくりと見ると長方形です。長辺側がつながっています。, ブレッドボード(正式にはソルダーレス・ブレッドボード)に挿して配線します。Arduinoの2番ピンに接点の一方を、もう一つの接点はGNDへつなぎました。タクト・スイッチの見えている側は短辺です。, タクト・スイッチを少し長押し0.5秒ほど押します。LEDは消えますが、消えたままになります。もう一度押すと点灯します。どうも思ったような動作になっていません。, スケッチをプルアップ抵抗ありに変更します。今度は、長押しすればLEDはいったん消え、約1秒後に点灯し、想定通りの動きをします。, タクト・スイッチは現代の電子機器には欠かせない部品になりました。しかし、押しずらいです。そこで、アマゾンで大きめのスイッチを探しました。, digitalWrite()の実行時間は連続して実行したときの差から約3.8usでした。入力の関数digitalRead()はどのくらいの時間で読み取るのでしょうか。次のスケッチで推測しました。, 上の波形が入力なしの場合です。約3.4usのパルス幅です。下の波形はリードを追加した上記のスケッチです。約7.4usなので、リードにかかる時間は約4.0usです。, 何度かタクト・スイッチを押してみたのですが、チャタリングの現象をほとんど観測できませんでした。, ほかのスナップ・スイッチや大きな押しボタンは、ほぼすべてのタイミングでチャタリングが起きています。次の図はスナップ・スイッチの観測例です。, 上記のように明確にON/OFFが発生する場合以外に、中途半端な電圧が発生することもあります。次の観測例は、大きな押しボタンの例です。マイコンの入力がLOWとHIGHを判断する電圧はデータシートに書かれています。ATMega328を電源電圧5Vで利用するときは、LOWは1.5V以下、HIGHは3.0V以上です。, チャタリングの対策には、ハードウェアとソフトウェアのどちらか、もしくは併用があります。一番簡単なハードはコンデンサをGND間につなげます。, シュミット・トリガ回路を入れて、ヒステリシス機能で中途半端な電圧のひげ状のノイズを取り去る回路もありますが、ATMega328のディジタル入力にはすでに入っているので、外部につける必要性は低いです。0.1uFのように時定数が大きいとチャタリングは除去できても電圧がms単位でゆっくり変化するのは望ましくありませんが、シュミット・トリガがあれば、HIGH/LOWはきっちりと判断できます。, ソフトウェアの対策は、一度読んだ数ms後に再度読み、同じレベルであれば、そのレベルは正しいと判断します。しかし、スイッチを押したこと以外でLOWになることはあり得ません。人のスイッチを押すスピードは連続で100ms前後です。そうすると、スイッチが押されたかの判定、押された回数をカウントするようなスケッチでは、チャタリングを考慮する必要はないと思われます。, しかし、OFF時、つまり、LOWからHIGHになるときにもチャタリングは生じるので、HIGHになったらLEDを消灯するスケッチであれば、5から10msのタイムラグを置いたのちにスイッチを読みに行きHIGHであれば、間違ってLEDが点灯することを避けられます。, ESP32入門 通信機能が標準搭載されたマイコン・ボード (2) Arduino IDEでLチカ(LED点滅)プログラムを作る. はじめに 2. どうすればいいのでしょうか。, teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。, 評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。, 上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。, ソースは恐らくprocessing側だと思われますが、arduino側も掲示して頂ければ。, arduino側はfirmateのstandardFirmateの例を書き込んでおります。, ①タップ検出時(val==0)の一回だけ「count++」を処理。 ここで先ほどのサンプルスケッチの説明をします。 スケッチの内容は以下のようになります。 ①変数定義 int led = 13; 74HC165 の動作 2.2.1. })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) 工具類 3. 使用するもの (必要なものとあると便利なもの) 3.1. 0, 回答 『denshi.club』はクリエイティブ・コモンズ 表示 4.0 国際 ライセンスで提供されています。 手袋に導電糸をつけて、手のひらが合わさると、信号がProcessingに流れるようになっています。 ※:コードを他人に見てもらう時は特にコメントを入れた方が見えもらえる率が上がりますよ。 全体の流れは「スイッチを押すとledがついたり消えたりする」です。 ここで、スイッチの方式には2種類あり、「押している開いただけon / 離すとoff」というようなゲートスイッチと「押すたびに on / offが入れ替わる」というようなトグルスイッチがあります。 0, 【募集】 QMKにおけるMIDI機能 3.1. ②2回目以降「count++」を実行されないようにすれば良いという理解で良いでしょうか? キーボードキットとパーツ 3.2. いつもお世話になっております。 関連記事 2. Processingでスイッチ化 いつもお世話になっております。 現在、ProcessingとArduinoを連携させてリズムゲームを作成しております。 手袋に導電糸をつけて、手のひらが合わさると、信号がProcessingに流れるようになっています。 ※Arduinoでプルアップ式で、通電したら 1 / クリップ 74HC165を使う時の処理まとめ […], 目次 1. ここまでできたらArduinoとPCを繋げてみましょう。 下の写真のようにLEDが光れば成功です。 プログラムからLEDを点灯させてみよう. Arduinoの2番ピンに接点の一方を、もう一つの接点はGNDへつなぎました。タクト・スイッチの見えている側は短辺です。 ルール「プルアップは必須」を無視してスケッチを動かします。 #define inputSwitch 2 #define outputLED 13 void setup() {pinMode(inputSwitch, INPUT); コメントがないので間違っていたらごめんなさい。 黒枠にボールが落ちてきた際に、タイミングよくスイッチを押すと点数が+1つき、失敗すると-1になる仕組みを作っております。, しかし、手の平を合わせている間ずっと+1の処理がされてしまいます。 […], 次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。, http://akizukidenshi.com/catalog/g/gM-07385/, http://akizukidenshi.com/catalog/g/gI-01321/, http://akizukidenshi.com/catalog/g/gP-03647/, http://akizukidenshi.com/catalog/g/gR-25221/, http://akizukidenshi.com/catalog/g/gR-25103/, http://akizukidenshi.com/catalog/g/gP-00315/, http://akizukidenshi.com/catalog/g/gC-05371/, http://www.musashinodenpa.com/arduino/ref/, WeAct STM32F411CE (Black Pill) の書き込み (備忘録), Arduino Uno / MegaのMIDIコントローラー化 (dual Moco LUFA) / TeensyのMIDIデバイス化. コードは以下のようになるでしょうか? teratailを一緒に作りたいエンジニア, //if(y > (height - diameter/2) ||y < diameter/2){, // prev_valは、この関数から抜けても消えずに継続して使用するためstatic領域宣言, // prev_valは、またval判定の初回時に無効になるのを防ぐため0以外に初期設定しておく, // val=0かつ前回値と違う時だけ処理する(つまりval=0でpre_val=1の時). 概要 2.2. (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ → 「count--」側も同じように繰り返し実行されてしまいますね。, それであれば、「前回のval値」を消されないよう保存しておいて、前回と同じ(val==0)なら「count処理」しないという風に考えてみましょう。 現在、ProcessingとArduinoを連携させてリズムゲームを作成しております。

ロマンスドール 主題歌 歌詞 5, プライオリティパス アプリ デジタル会員証 楽天 5, Vba Powerpoint Animation 5, キャビネット 鍵 後付け アスクル 4, メール 署名 ミッキー 5, 虚空 英語 Apex 22, 月 ごと 売上 Sql 12, 250cc 高速 怖い 4, Espoir 日焼け止め 緑 7, Mybatis Batch Insert 8, R32 Sr20 ハーネス 6, 佐藤健 渡邊圭祐 表紙 5, 面接 退職理由 うつ病 8, Con Spirito 音楽用語 9, Dvr Bz350 Hdd換装 7, Microsoft Script Editor Office 2016 4, カネカ リクセル プライミング 16, 宅地建物取引士 法定講習 効果測定 5, Dmr Brt1060 Hdd交換 17, コミュファ光 Au 解約 4, Gensokyo Arena Roblox 4, 表札 漢字 木 4, 都跡 中学校 バスケ 25, ドッカンバトル 技上げ Lr 4, プロトピック 副作用 ブログ 13, Aspire 5740 分解 10, スカパー Bs 映らない 4, Ps4 チート Ban 12, 荒野行動 無料ガチャ 引けない 10, 忘年会 不参加 メール 返信 6,