\r\n\r\n

初級アルドゥイーノ・プログラミング:交通信号制御プロジェクト・チュートリアル

arduinoの信号機コントローラを作ることで、基本的なコーディングスキルを身につけることができます。 まずは、...

Arduinoの交通信号機は、1時間以内で組み立てられる楽しい小プロジェクトです。Arduinoを使った自作回路と、上級者向けのバリエーション回路への変更方法をご紹介します。

このチュートリアルを動画でご覧になりたい方は、こちらでご紹介しています。

arduino信号機コントローラを作るために必要なもの

基本的なArduinoの他に、必要なものがあります。

  • 10kΩ抵抗×1
  • プッシュボタンスイッチ1個
  • 220Ω抵抗×6個
  • テストパネル
  • 接続ケーブル
  • 赤、黄、緑のLED

十分なピン数があれば、ほとんどのArduinoがこのプロジェクトに使用できます。どのモデルが必要なのかわからない場合は、Arduino購入ガイドをご覧ください。これらの部品は、すでにArduinoのスターターキットに含まれているかもしれません。

arduinoの信号機:基本編

まずは,基本的な信号機1個から始めましょう.回路は次のようになっています.

各LEDのアノード(長い方の足)をデジタルピン8,9,10に接続します(220Ωの抵抗を介する)。カソード(短い足)をArduinoのグランドに接続します。

アルドゥイーノ・トラフィックライト・コード

まず、変数の定義から始め、ライトのアドレスを番号ではなく名前で指定できるようにします。以下の行から始まる、新しいArduinoプロジェクトを開始します。

int red = 10;int yellow = 9;int green = 8;

次に、赤、黄、緑のLEDを出力として設定するセットアップ機能を追加しましょう。すでにピン番号を示す変数が作成されているので、代わりにピンの名前で参照することができるようになりました。

void setup(){ pinMode(red, OUTPUT); pinMode(yellow, OUTPUT); pinMode(green, OUTPUT);}

pinMode関数は、与えられたピンを出力として使用するようにArduinoを設定します。発光ダイオードを動作させるためには、こうする必要があるのです。では、実際の信号機のロジックを見てみましょう。これが必要なコードです。変数定義・設定機能の下に以下を追加します。

void loop(){ changeLights(); delay(15000);}void changeLights(){ // green off, yellow on for 3 seconds digitalWrite(green, LOW); digitalWrite(yellow, HIGH); delay(3000); // turn off yellow, then turn red on for 5 seconds digitalWrite(yellow, LOW); digitalWrite(red, HIGH); delay(5000); // red and yellow on for 2 seconds (red is already on though) digitalWrite(yellow, HIGH); delay(2000); // turn off red and yellow, then turn on green digitalWrite(yellow, LOW); digitalWrite(red, LOW); digitalWrite(green, HIGH); delay(3000);}

このコードをArduinoにアップロードして実行します(Tools> board and Tools> portメニューから正しいボードとポートを選択していることを確認してください)。このように15秒ごとに変化する信号機を動作させる必要があります(加速)。

コードを分解してみましょう。changeLights関数がすべてのハードワークを行っています。これにより、信号機は黄色と赤の間を回転して、緑に戻ります。ループ関数で呼び出すと、Arduinoはこのコードを永遠に実行し、一度に15秒の休止をします。

changeLightsは、4つのステップで構成されています。

  • グリーン点灯、イエロー消灯
  • 黄色オフ、赤色オン
  • ブライトイエロー、ブライトレッド
  • 緑点灯、赤消灯、黄消灯

この4つのステップは、実際の信号機で使用されるプロセスを再現しています。各ステップとも、コードは非常によく似ています。対応するLEDの点灯・消灯はdigitalWriteで行います。これはArduinoの関数で、出力ピンをハイ(ON)またはロー(OFF)に設定します。

LEDを点灯・消灯させた後、Arduinoに一定時間待機させます。

もっと深く: Arduinoの横断歩道

基本がわかったところで、歩行者がいつでも信号を変えられるようにボタンを追加して改良してみましょう:。

なお、赤と緑のランプは前の例と同じです。ボタンをデジタルピン12に接続します。 スイッチに高インピーダンスの10kΩの抵抗がついているのがわかると思いますが、なぜか不思議に思うかもしれません。プルダウン抵抗です。

スイッチは、電流を流すか流さないかのどちらかです。これは簡単なことのように思えるが、論理回路では電流は常にハイかローの状態で流れるはずである(1か0、ハイかローと覚えればよい)。押していないボタンスイッチはローレベルになると考えてよいが、実は全く電流が流れないので「フローティング」と呼ばれる。

このフローティング状態では、電気的な外乱で変動するため、誤読が発生する可能性がある。つまり、フローティングスイッチでは、信頼性の高い「高」または「低」を読み取ることはできない。プルダウン抵抗は、スイッチが閉じたときに微量の電流を流し続けるため、正確なLow状態の読み取りを可能にします。

他の論理回路では、代わりにプルアップ抵抗が使われていることがありますが、これは同じように働きますが、逆に特定の論理ゲートがデフォルトでハイになるようにするものです。

今度は、15秒ごとにライトを変えるのではなく、コードのループ部分で、ボタンスイッチの状態を読み取り、それが作動したときだけライトを変えるようにしました。

アルドゥイーノ横断歩道仕様

まず、ボタンピンを格納するための新しい変数を追加します。

int button = 12; // switch is on pin 12

さて、setup 関数の中で、switch を入力として宣言する行を新たに追加してください。赤と緑のライトを緑のステージに設定するためのラインを追加します。この初期設定をしないと、changeLightsの初回実行まで消灯します。

pinMode(button, INPUT);digitalWrite(green, HIGH);

ループ関数全体を以下のように置き換えてください。

void loop() { if (digitalRead(button) == HIGH){ delay(15); // software debounce if (digitalRead(button) == HIGH) { // if the switch is HIGH, ie. pushed down - change the lights! changeLights(); delay(15000); // wait for 15 seconds } }}

それでいいのです。ボタンチェックが2回(digitalRead(button))発生し、その間に非常に小さな遅延があることを不思議に思うかもしれません。これがデジタイズです。ボタンのプルダウン抵抗と同じように、この簡単なチェックで、ボタンが押されたときのわずかな乱れをコードが検出するのを防いでいるのです。

if文の中で15秒待つと、少なくともこの時間は信号が変化しない。15秒後にループが再スタートする。ループが再開されるたびにボタンの状態を再度読み取りますが、ボタンが押されていなければif文は発動せず、ランプは変化せず、プログラムは再び再開されます。

こんな感じです(加速度的に)。

arduinoの交差点付き信号機

より高度なモデルを試してみましょう。横断歩道ではなく、信号機が2つある回路に変更します。

2つ目の信号機をデジタルピン11,12,13に接続します。

Arduinoの交差点付き信号機コード

まず、最初の例のように、新しい信号機のピンを変数に割り当てて、出力として設定します。

// light oneint red1 = 10;int yellow1 = 9;int green1 = 8;// light twoint red2 = 13;int yellow2 = 12;int green2 = 11;void setup(){ // light one pinMode(red1, OUTPUT); pinMode(yellow1, OUTPUT); pinMode(green1, OUTPUT); // light two pinMode(red2, OUTPUT); pinMode(yellow2, OUTPUT); pinMode(green2, OUTPUT);}

ここで、ループを更新して、最初の例のコード(横断歩道の代わりに)を使用するようにします。

void loop(){ changeLights(); delay(15000);}

ここでも、すべての作業はchangeLights関数で行われます。このコードは、赤> red> yellow> greenに変化せず、赤と緑のライトが交互に点灯します。ひとつは緑、もうひとつは赤で。コードは以下の通りです。

void changeLights(){ // turn both yellows on digitalWrite(green1, LOW); digitalWrite(yellow1, HIGH); digitalWrite(yellow2, HIGH); delay(5000); // turn both yellows off, and opposite green and red digitalWrite(yellow1, LOW); digitalWrite(red1, HIGH); digitalWrite(yellow2, LOW); digitalWrite(red2, LOW); digitalWrite(green2, HIGH); delay(5000); // both yellows on again digitalWrite(yellow1, HIGH); digitalWrite(yellow2, HIGH); digitalWrite(green2, LOW); delay(3000); // turn both yellows off, and opposite green and red digitalWrite(green1, HIGH); digitalWrite(yellow1, LOW); digitalWrite(red1, LOW); digitalWrite(yellow2, LOW); digitalWrite(red2, HIGH); delay(5000);}

こんな感じです(加速度的に)。

arduino traffic light next

本日は以上です。ArduinoのLEDとボタンについての新しい理解は、様々な異なるプロジェクトに応用できます。この信号機を拡張するのであれば、多くの歩行者用横断歩道を完備した四差路(以上)の交差点を、歩行者用信号機で作ってはどうでしょうか。さまざまなArduinoボードを簡単にプログラミングできる!

また、このDIY MIDIコントローラーやXodを使ったArduinoロボットなど、より大きなプロジェクトで新しいスキルを広げてみてはいかがでしょうか。また、VS CodeやPlatformIOを使ったArduinoのコーディングも見ることができます。

画像引用元:androsvector/Shutterstock

  • 2021-03-18 03:37 に公開
  • 閲覧 ( 21 )
  • 分類:IT

あなたが興味を持っているかもしれない記事

匿名者
匿名者

0 件の投稿

作家リスト

  1. admin 0 投稿
  2. 匿名者 0 投稿

おすすめ