レッスン17/31:Arduinoで遅延を中断する方法と、光依存抵抗LDR | Robojax
このガイドでは、Arduinoの2つの重要な概念、割り込みと光依存抵抗器(LDR)について解説します。コード内の遅延を中断して、ボタン押下に即座に応答できるようにする方法を学び、その後、夜間に自動でブザーやライトをオンにする光感知回路を構築します。このプロジェクトは、基本的なLED点滅スケッチを超えて、応答性の高い実用的な自動化プロジェクトを作り始めたい人に最適です。これらのスキルを応用して、廊下用のスマートナイトライト、ドアが開くと鳴る簡単なセキュリティアラーム、夕暮れ時に作動するソーラー式ガーデンライト、日没時に閉まる自動カーテンなどを作成できます。このレッスンはSunFounder 3-in-1 Arduinoキットに基づいていますが、概念は標準的なArduinoボードにも適用できます。

ハードウェアと部品
このプロジェクトに沿って進めるには、以下の部品が必要です。標準的なArduino UnoまたはNanoがこの構築に最適です。
- Arduino UnoまたはNano
- 光依存抵抗器(LDR)、例:Kweeds KM601
- 10kオーム抵抗
- 押しボタン
- ブザー
- ブレッドボードとジャンパーワイヤー
Arduinoの割り込みを理解する
標準的なArduinoスケッチでは、loop()関数が連続的に実行され、タスクを1行ずつ処理します。delay()を使用すると、その間Arduinoは他のことを一切停止します。これは、別のタスクの実行中にボタン押下などの重要なイベントに応答する必要がある場合に問題となります。例えば、LEDを点滅させるために1秒の遅延がある場合、ボタン押下が最大1秒間認識されず、応答性が悪く感じられます(ビデオの08:13参照)。
Arduinoの割り込みはこの問題を解決します。割り込みはハードウェア機能であり、特定のピンがメインプログラムを「中断」し、実行中の処理を一時停止して、割り込みサービスルーチン(ISR)と呼ばれる特別な関数を実行できるようにします。これにより、他の処理が何であっても、Arduinoは優先度の高いイベントに即座に応答できます。すべてのピンが割り込みをサポートしているわけではないことに注意することが重要です。Arduino UnoとNanoでは、ピン2と3のみがこの目的に使用できます(ビデオの02:37参照)。Megaなどの他のボードにはより多くのオプションがありますが、このプロジェクトではピン2を使用します。
割り込みは、ピンの状態変化によってトリガーできます:LOW、CHANGE、RISING、FALLING。CHANGEモードは、ピンの状態がHIGHからLOW、またはLOWからHIGHに変化するたびに割り込みをトリガーします。これはボタン押下のトグルに最適です。
配線ガイド
このレッスンでは2つの回路を構築します。1つ目はボタンとブザーを使った割り込みのデモで、2つ目はLDRを使って光のレベルを感知します。まず割り込み回路から始めましょう。
回路1:割り込みデモ用のボタンとブザー
この回路は簡単です。ボタンは割り込みピンであるピン2に接続されています。10kオームのプルダウン抵抗により、ボタンが押されていないときはピンがLOW、押されているときはHIGHを読み取ります。ブザーはピン8に接続されています。
割り込みデモでは、以下のようにコンポーネントを接続します:
- 押しボタン:一方の足を5Vに、もう一方の足をデジタルピン2に接続します。ピン2からGNDに10kオームの抵抗を接続します。
- ブザー:マイナスリードをGNDに、プラスリードをデジタルピン8に接続します。
回路2:光感知用のLDRとブザー
LDR回路では、分圧回路構成を使用します。LDRの抵抗は光によって変化し、アナログピンの電圧を変えます。暗いときはLDRの抵抗が高く(約10kオーム)、明るいときは抵抗が大幅に低下します(ビデオの16:25参照)。この抵抗の変化を測定します。
Arduinoは抵抗ではなく電圧のみを読み取ることができるため、分圧回路が必要です。LDRを固定の10kオーム抵抗と直列に配置することで、それらの間のポイントの電圧がLDRの抵抗に比例して変化します。この電圧はArduinoのアナログ-デジタル変換器(ADC)によって読み取られます。
LDRデモでは、以下のようにコンポーネントを接続します:
- LDR:一方の足を5Vに、もう一方の足をアナログピンA0に接続します。
- 10kオーム抵抗:A0に接続されたLDRの足からGNDに接続します。これにより分圧回路が作成されます。
- ブザー:マイナスリードをGNDに、プラスリードをデジタルピン8に接続します。
注:正確なピン割り当てはコードで定義されており、セットアップに合わせて変更できます。
コードの説明
プロジェクトの動作を制御する、提供されたコードのユーザー設定可能な部分に焦点を当てます。完全なプログラムは記事の下からダウンロードできます。
コードは簡単に変更できるように設計されています。スケッチの先頭に、調整できる主要な変数があります。
const byte buzzerPin = 8;
const byte interruptPin = 2;
volatile byte state = LOW;
int count=0;
ここで、buzzerPinはピン8に設定されており、ブザーを接続する場所です。interruptPinはピン2に設定されており、ボタン押下を監視するピンです。state変数はvolatileなbyte型で、ブザーの現在の状態(HIGHまたはLOW)を保持します。これは割り込みサービスルーチン(ISR)内で変更されるためvolatileとマークされており、このキーワードによりArduinoが常に最新の値を読み取ることが保証されます。count変数は、メインループ内でインクリメントされる単純なカウンタで、割り込みがアクティブな間もループが実行され続けていることを示します。
setup()関数では、ブザーピンがOUTPUTとして設定され、割り込みピンがINPUTとして設定されます。重要な行はattachInterrupt()で、ここで割り込みを設定します。この関数はArduinoにどのピンを監視するか、割り込み発生時にどの関数を呼び出すか、そしてどのトリガー条件を使用するかを指示します。
attachInterrupt(digitalPinToInterrupt(interruptPin), noisy, CHANGE);
この行は指定されたピンに割り込みを接続します。digitalPinToInterrupt()関数はピン番号を正しい割り込み番号に変換します。noisyは割り込みがトリガーされたときに呼び出される関数の名前です。最後に、CHANGEはモードで、ピンの状態変化があれば割り込みをトリガーします。必要に応じてこれをRISING、FALLING、またはLOWに変更できます。
noisy()関数はISRです。これはブザーの状態を反転させる単純なトグル関数です。ボタンが押されると、割り込みがこの関数をトリガーし、state変数を反転させてブザーピンに書き込みます。これにより、メインループがカウントや遅延で忙しい間でも、ボタンを押すたびにブザーをオン/オフできます。
プロジェクトの動作を日中ではなく夜間にブザーを起動するように変更するには、メインループ内の条件ロジックを変更し、HIGHとLOW状態のdigitalWrite()コマンドを入れ替えます。
ライブプロジェクトとデモンストレーション
デモでは、2つの重要な実験が行われます。まず、割り込みコードなしで割り込み回路を実行し、ループ内の遅延によりボタン応答が遅くなる様子を示します。これは割り込みが解決する問題を強調します。
次に、割り込みコードを読み込んだ状態では、シリアルモニタにカウンタが毎秒インクリメントされる様子が表示されます。ボタンが押されると、メインループの遅延に関係なく、ブザーが即座にオンまたはオフに切り替わります。これは割り込みが待機時間をバイパスし、タスクを即座に実行することを証明します(ビデオの14:07で確認)。
LDRの部分では、シリアルモニタが生のアナログ値を出力します。明るい光の下では値が高く(約960)、センサーを覆うと大幅に低下(約400以下)することがわかります。これはLDRの抵抗が光の強度に応じて変化することを示しています。コードはしきい値を使用して「昼」か「夜」かを判断し、それに応じてブザーを制御します。センサーを覆って夜をシミュレートするとブザーが鳴り、光にさらすとオフになります。
チャプター
- [00:00] Arduino割り込みとLDRの紹介
- [01:43] Arduinoコードにおける遅延の問題
- [03:37] 割り込みピンとモードの理解
- [04:20] ボタンとブザー回路の配線
- [06:22] 遅延デモのコード解説
- [07:48] 遅延問題のデモンストレーション
- [09:26] 割り込みの実装とコーディング
- [11:50] 割り込み関数の仕組み
- [14:26] 光依存抵抗器(LDR)の紹介
- [15:44] マルチメータでのLDR抵抗測定
- [17:22] LDRとブザー回路の配線
- [19:55] LDR値読み取りのコード
- [20:49] LDR値変化のデモンストレーション
- [22:08] 昼と夜のしきい値設定
- [23:40] LDRでブザーを制御するコード
- [25:21] 自動夜間ライトのデモンストレーション
/*
Lesson 20/31: interrupt a delay in Arduino and Light Dependent Resistor LDR
Get this code and watch video Download and resource page https://robojax.com/RJT600
YouTube video https://www.youtube.com/watch?v=N_L11m1v_yk
* This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.*
* This code has been download from Robojax.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
const byte buzzerPin = 8;
const byte interruptPin = 2;
volatile byte state = LOW;
int count=0;
void setup() {
pinMode(buzzerPin, OUTPUT);
pinMode(interruptPin, INPUT);
attachInterrupt(digitalPinToInterrupt(interruptPin), noisy, CHANGE);
Serial.begin(9600);
digitalWrite(buzzerPin, state);
}
void loop() {
count++;
Serial.println(count);
delay(1000);
}
void noisy() {
state = !state;
digitalWrite(buzzerPin, state);
}
Common Course Links
Common Course Files
必要かもしれないもの
-
アマゾンSunFounder Arduino Learning Kit on AliExpresss.click.aliexpress.com
-
アマゾン
-
アマゾン
-
アマゾン
リソースと参考文献
-
ドキュメンテーションSunFounder 3 in 1 IoT/スマートカー/学習キットのドキュメントdocs.sunfounder.com
-
外部SunFounderの3-in-1スマートカー学習キットを購入するsunfounder.com
ファイル📁
Arduinoライブラリ(zip)
-
SunFounderの3-in-1スマートカー学習キットソースコード
3in1-kit-main-v2.zip12.80 MB