基本的なArduinoプログラミングの学習–初心者向けのチュートリアル

問題を排除するために楽器を試してください





このチュートリアルでは、サンプルコードとサンプルプログラムを通じて基本的なArduinoプログラミングを行う方法を学びます。このチュートリアルは、簡単でわかりやすい言語で基本を理解したいすべての初心者にとって非常に価値のあるコースです。

前書き

による ウィキペディア マイクロコントローラは、単一のICチップ内に構築されたミニコンピュータに相当し、独自のコアプロセッサ、プログラム可能な入力、メモリ、および出力周辺機器を備えています。



マイクロコントローラは、プロセッサ、メモリ、および入力/出力ポート(GPIOまたは汎用入力/出力ピンとも呼ばれます)を内蔵しており、ユーザーが任意の仕様に従って制御できるため、ユーザーにとって非常に便利です。

このチュートリアルでは、プログラムの学習とテストのためにArduinoUnoボードを使用します。ハードウェアアセンブリのテストと統合には、ブレッドボードを使用します。



それでは、すばやく移動して、Arduinoプログラミングを開始する方法を学びましょう。

1.2ソフトウェアのインストール(Windows)

このためにあなたは明らかにあなたがあなたのコンピュータに持っているであろうインターネットへのアクセスを必要とするでしょう。次のリンクにアクセスして、IDEソフトウェアをダウンロードしてください。

管理者以外のインストール用のWindowsZIPファイル

ダウンロード後、ダウンロードフォルダにArduinoセットアップアイコンが表示されます。これは次のようになります。

arduinoダウンロードアイコン

これを入手したら、それをダブルクリックして、Arduino統合開発環境(IDE)をコンピューターにインストールするだけです。完全なプロセスは、次のビデオで視覚化できます。

https://youtu.be/x7AMn1paCeU

1.4最初の巡回区から始める

実際のプログラミング手法を学び始める前に、初心者にとっては、LEDなどの基本的なコンポーネントから始めて、それをArduinoに接続する方法を理解しておくと便利です。

ご存知のように、LEDは極性のある発光ダイオードであり、正しい電源極に接続されていないと点灯しません。

LEDのもう1つの側面は、これらのデバイスが低電流で動作し、適切に計算された抵抗がそのピンの1つと直列に含まれていない場合、即座に損傷する可能性があることです。

経験則として、330オーム1/4ワットは、電流を必要な安全レベルに制限するために、電源入力が5V上昇するごとに非常に理想的です。したがって、5Vの場合は330オーム、10Vの場合は680オームなどになります。

組み立てにブレッドボードを使用する

使用方法を知っていることを確認してください ブレッドボード ここではすべての実験にブレッドボードを使用するため、この章で説明するチュートリアルを試す前に。

基本的なLED接続のセットアップは以下で確認できます。

Arduino付きLED

上記の3つの基本的なコンポーネントを見ることができます。

  1. 5mm、20mA LED
  2. 330オーム1/4ワット抵抗器
  3. アン Arduinoボード

図のようにシステムを組み立てるだけです。

次に、コンピューターのUSBからArduinoに5Vを接続します。これを行うとすぐに、LEDが点灯します。

それはかなり基本的なことですが、最初から始めるのは常に良いことです。私たちが前進するにつれて、物事はますます面白くなり始めますのでご安心ください。

1.5ArduinoでLEDを制御する

次に、Arduinoプログラムを使用してLEDを制御する方法を学習します。

プログラムを作成するには、各プログラムに少なくとも2つの関数が必要です。

関数は、以下に示すように、名前を割り当てることができる一連のプログラミングステートメントとして理解できます。

  1. セットアップ() これは、プログラムの開始時に呼び出されるか、実行されます。
  2. ループ() これは、Arduinoの運用期間全体にわたって繰り返し呼び出されるか実行されます。

したがって、実用的な機能はないかもしれませんが、技術的には最短の正当なArduinoプログラムは次のように書くことができます。

最も単純なプログラム

void setup()
{
}
void loop()
{
}

多くのプログラミング言語では、システムはディスプレイ画面に「Hello、World」という簡単な印刷を表示することから始まります。

マイクロコントローラーの解釈におけるこのフレーズの電子的同等物は、LEDのオンとオフを点滅させることです。

これは、システムが正しく機能していることを示すために作成および実装できる最も基本的なプログラムです。

次のコードを使用して、手順の実装と理解を試みます。

リスト1.2:led1 / led1.pde

const int kPinLed = 13
void setup()
{
pinMode(kPinLed, OUTPUT)
}
void loop()
{
digitalWrite(kPinLed, HIGH)
delay(500)
digitalWrite(kPinLed, LOW)
delay(500)
}

では、コードの各行の意味と、関数を実行するためにどのように機能するかを理解しましょう。

const int kPinLed = 13

これは定数のように機能し、プログラミングコース全体で、設定されている実際の値を使用せずに使用できます。

標準規則に従って、このような定数は開始文字で認識されます 。これは必須ではありませんが、コードの詳細を確認したいときはいつでも、物事をより明確で簡単に理解できるようになります。

void setup()
{
pinMode(kPinLed, OUTPUT)
}

このコードは、LEDが接続されている特定のピンを構成します。言い換えると、コードはArduinoに、このピンの「読み取り」ではなく「書き込み」アスペクトを制御するように指示します。

void loop()
{
digitalWrite(kPinLed, HIGH)
delay(500)
digitalWrite(kPinLed, LOW)
delay(500)
}

上記の行は、アプリケーションの実際の実行を示しています。コードは、関連するLED接続でHIGHを書き込んでレンダリングし、LEDをオンにすることから始まります。

ここで、HIGHという用語は、Arduinoの関連するピンで+ 5Vを取得することを意味します。補足項LOWは、指定されたピンのゼロまたは0Vを単に示します。

次に、delay()と呼びます。その機能は、ミリ秒(1/1000秒)の遅延を作成することです。図500が入力されているので、実装される遅延は1/2秒になります。

この1/2秒が経過するとすぐに、次の行が実行され、同じピンのLOW項でLEDがオフになります。

次の行は、LEDを1/2秒間オフのままにするために、さらに1/2秒の遅延を生成します。

そして、Arduinoに電力が供給されている限り、プロセスはコード行の実行によって無限に続きます。

次のレベルに進む前に、上記のコードをプログラムして、LED ON / OFシーケンスを正しく実装できるかどうかを確認することをお勧めします。

ArduinoのデフォルトLEDはピン#13に接続されているため、上記のプログラムにすぐに応答して点滅を開始する必要があります。ただし、外部LEDが点滅していない場合は、LEDとの接続障害が発生している可能性があります。LEDの極性を逆にして、LEDも点滅していることを確認してください。

「500」の数値を他の値に変更し、コマンドを「リッスンしている」LEDを見つけて、指定された遅延値に従って点滅させることにより、遅延時間を試すことができます。

ただし、遅延時間の変更に関係なく、LEDが一定の1秒の速度で点滅しない場合は、何らかの間違いが原因でコードが機能していない可能性があることを忘れないでください。デフォルトでは、Arduinoは1秒の点滅速度でプログラムされるためです。したがって、このレートは、正しく機能していることを確認するために、コードによって変化する必要があります。

1.7コメント

上記で理解したコード行は、コンピューターソフトウェア用に特別に作成されたものです。

ただし、ユーザーが行の意味を参照して理解できるようにするために、目的のコード行の横に説明を書くことが役立つ場合があります。

これらは呼ばれます コメント これらは人間またはユーザーの参照のみを目的として作成されており、コンピューターが安全に無視できるようにコード化されています。

これらのコメントの言語は、いくつかの形式で書かれています。

  1. コメントのブロックスタイル。コメントの説明は、開始記号/ *と終了記号* /で囲まれています。
  2. 次の例に示すように、これは1行で制限する必要はなく、コメントまたは説明の長さに応じて次の後続行に拡張できます。

/ *これはコメントです* /

/ *これもそうです* /

/ *そして
* この
* なので
* 上手 */

コメントの簡単な1行の説明を書くには、先頭に2つのスラッシュ//記号で十分です。これは、この行が実際のコードとは関係がなく、無視する必要があることをコンピューターに通知します。例えば:

//これはコンピュータが無視するコメントです。

参考例を次に示します。

/*
* Program Name: Blink
* Author: Alan Smith
* Description:
* Turns an LED on for one half second, then off for one half second repeatedly.
*/

/* Pin Definitions */
const int kPinLed = 13
/*
* Function Name: setup
* Purpose: Run once when the system powers up.
*/
void setup()
{
pinMode(kPinLed, OUTPUT)
}
/*
* Function name: loop
* Purpose: Runs over and over again, as long as the Arduino has power
*/
void loop()
{
digitalWrite(kPinLed, HIGH)
delay(500)
digitalWrite(kPinLed, LOW)
delay(500)
}

1.8トラブルシューティング

コンパイル中にプログラムに「エラー」が表示されたり、その他の問題が発生したりした場合は、次のヒントを参考にして、コードを再確認してハードルを取り除いてください。

  1. プログラム言語では大文字と小文字が区別されます。たとえば、式 myVar として書くことはできません MyVar。
  2. キーボード入力によって実行される可能性のあるすべての種類の空白は、最終的には単一のスペースとしてレンダリングされ、ユーザーだけが表示または理解できるため、コンピューターはこれを考慮しません。簡単に言えば、どのような種類の空き領域もコード結果に影響を与えません。
  3. コードの各ブロックは、左右の中括弧で囲む必要があります。 '{' そして '}'
  4. 数字の数字はコンマで区切らないでください。たとえば、1000を1,000と書くことはできません。
  5. 中括弧で囲まれたすべてのコード行は、セミコロンで終了する必要があります

Arduinoで興味深いLEDライトシーケンスを作成する

前の章では、一定の遅延率でLEDのオン/オフを連続的に点滅させる方法を学びました。

次に、プログラムコードをアップグレードすることにより、同じLEDでさまざまな遅延パターンを実行する方法を学習します。

外部LEDは使用せず、ピン#13でArduinoボードに組み込まれているデフォルトのLEDを使用します。この小さなSMDLEDは、USBコネクタのすぐ後ろにあります。

2.2IFステートメントを理解する

このセクションでは、制御構造によって個々のコードを実行し、必要に応じて繰り返し実行する方法を学習します。

声明 もし 最初の制御構造になります。次の実装は、その使用方法を示しています。

const int kPinLed = 13
void setup()
{
pinMode(kPinLed, OUTPUT)
}
int delayTime = 1000
void loop()
{
delayTime = delayTime - 100
if(delayTime <= 0){ // If the delay time is zero or less, reset it.
delayTime = 1000
}
digitalWrite(kPinLed, HIGH)
delay(delayTime)
digitalWrite(kPinLed, LOW)
delay(delayTime)
}

上記のコードを段階的に理解し、これを他の同様の実行にどのように使用できるかを学習します。

1行目と7行目の間のコードは、最初のプログラムとまったく同じです。

最初の変更は実際には8行目で行われます。

int delayTime = 1000

これは1行目のコードに似ていることがわかりますが、用語が欠落しているという事実はありません。 const。

これは単に、このコードが定数ではないためです。代わりに、これは次のように定義されます 変数 、プログラミングの過程で可変値のプロパティを持っています。

上記の例では、この変数の属性が1000であることがわかります。中括弧で囲まれた変数は、中括弧のペア内でのみ厳密に記述する必要があり、「ローカル」変数と呼ばれることに注意してください。

あるいは、今説明しているような中括弧の外側にあるはずの変数は「グローバル」として認識され、プログラムコード内のほぼどこでも実行できます。

先に進むと、9行目から11行目までのコードも最初のプログラムと似ていることがわかりますが、11行目以降は興味深いものになり始めています。方法を見てみましょう。

delayTime = delayTime - 100

このコードでは、のデフォルト値が delayTime から100を引くことによって変更されています。

意味100は、初期値1000から差し引かれ、新しい値900が提供されます。

次の画像を通して、Arduino言語で使用される数学演算子のいくつかを理解しようとします。

Arduino数学演算子の記号

それでは、13行目から15行目までのコードを評価してみましょう。

if(delayTime <= 0){ // If the delay time is zero or less, reset it.
delayTime = 1000
}

上記のコードの主な目的は、LEDが中断することなく点滅し続けることを保証することです。

オリジナルから100が差し引かれているという事実のため delayTime 、LEDの点滅がゼロになるのを防ぎ、点滅を継続できるようにします。

次の画像は、コードで使用するいくつかの比較演算子を示しています。

arduinoコードの比較演算子

上記のコードでは、コードがif(delayTime == 0)になるようにテストできたはずです。

ただし、負の数値であることも同様に悪い可能性があるため、私たちはそれを選びませんでした。これは推奨される方法です。

delayTimeから100ではなく300を差し引こうとした場合、結果はどうなるでしょうか。

だから今、あなたはdelayTimeの場合に気づいたかもしれませんがゼロ以下として書き込まれると、遅延時間は元の数値1000に戻されます。

digitalWrite(kPinLed, HIGH)
delay(delayTime)
digitalWrite(kPinLed, LOW)
delay(delayTime)

上記のコードの最後の4行は、LEDを継続的にオン/オフ、オン/オフする役割を果たします。

ここでは、数字の数字を使用する代わりに、コードの操作期間中に必要に応じて調整できるように、遅延時間を割り当てるための変数を使用していることがはっきりとわかります。かっこいいですよね?

2.3ELSEステートメント

ここでは、その理由と方法を学びます もし 用語には条項がある場合があります そうしないと 場合に応じて状況を決定するように もし ステートメントは誤りです。

混乱しすぎて申し訳ありませんが、心配しないでください。次の例で理解しようとします。

const int kPinLed = 13
void setup()
{
pinMode(kPinLed, OUTPUT)
}
int delayTime = 1000
void loop()
{
if(delayTime <= 100){ // If it is less than or equal to 100, reset it
delayTime = 1000
}
else{
delayTime = delayTime - 100
}
digitalWrite(kPinLed, HIGH)
delay(delayTime)
digitalWrite(kPinLed, LOW)
delay(delayTime)
}

上記では、10行目のコードがdelayTimeの場合にのみ実行されることがよくわかります。が100以下の場合、13行目のコードが実行されますが、両方が一緒に実行されることはありません。10行目または13行目のコードのいずれかが実装され、両方が実装されることはありません。

前のセクション2.2で行ったのとは異なり、ここでは0と比較せず、100と比較したことに気付いたかもしれません。これは、この例では100を引く前に比較したのに対し、セクション2.2では逆に比較したためです。差し引かれます。 100ではなく0を比較した場合、何が起こったのかわかりますか?

2.4WHILEステートメント

一方 ステートメントは非常に似ています もし 条件が適用される限り、コードのブロック(中括弧の間にある可能性があります)に対して繰り返し実行されるという真実を除いて、これは そうしないと ステートメント。

次の例は、これをよりよく理解するのに役立ちます

const int kPinLed = 13
void setup()
{
pinMode(kPinLed, OUTPUT)
}
int delayTime = 1000
void loop()
{
while(delayTime > 0){ // while delayTime is greater than 0
digitalWrite(kPinLed, HIGH)
delay(delayTime)
digitalWrite(kPinLed, LOW)
delay(delayTime)
delayTime = delayTime - 100
}
while(delayTime <1000){ // while delayTime is less than 1000
delayTime = delayTime + 100 // do this first so we don’t have a loop with delayTime = 0
digitalWrite(kPinLed, HIGH)
delay(delayTime)
digitalWrite(kPinLed, LOW)
delay(delayTime)
}
}

上記のコードが何をするようにプログラムされているか推測できますか?まあ、それはLEDを速くそして次に遅く点滅させるように設計されています。

2.5真と偽は何ですか?

プログラミング言語では、 false ゼロ(0)を指します。実際には「true」は使用されません。代わりに、falseがない場合、含まれているものはすべてtrueであると想定されます。

それは少し奇妙に見えますが、それはかなりうまく仕事をします。

次の例で状況を把握してみます。

以下のようなコードに出くわすことがあります。

while (1){
digitalWrite(kPinLed, HIGH)
delay(100)
digitalWrite(kPinLed, LOW)
delay(100)
}

これは、電力が利用可能である限り、LEDの実行が永久に循環し続けるようにコード化されています。

ただし、このタイプのコードの1つの欠点は、ユーザーが誤って==ではなく=を適用した場合に発生する可能性があります。

=は割り当てを意味します。つまり、選択した値を変数に指定するために使用され、==は、値が同じである場合にテストを実施するために使用されます。

たとえば、LEDを順次速度パターンで繰り返し点滅させる必要があるが、==ではなく=を誤って使用したとします。

コードは次のように表示されます。

int delayTime = 1000
void loop()
{
if(delayTime = 0){ // WRONG!!! the = should have been ==
delayTime = 1000
}
digitalWrite(kPinLed, HIGH)
delay(delayTime)
digitalWrite(kPinLed, LOW)
delay(delayTime)
delayTime = delayTime - 100
}

間違いはdelayTimeに0を割り当て、 もし 0が真であるかどうかをチェックするステートメント。 0はfalseを指すため、trueではないと見なし、delayTime = 1000の適用を停止しますが、代わりに関数delayTimeを停止します。 loop()の実行中は0に保持されます。

これは非常に望ましくないようです!!

したがって、常にプログラムを再確認して、そのようなばかげた間違いをしていないことを確認してください。

2.6組み合わせ

複数のものを一緒にテストする必要があると感じる場合があります。同様に、変数が2つの数値の間にあるかどうかを調べたい場合があります。これはifステートメントを複数回使用して実装できますが、読みやすくするために論理的な組み合わせを使用する方が便利な場合があります。

次の表に示すように、論理用語での組み合わせの実装は、3つの方法で実行できます。

Arduinoの組み合わせ方法を示す表

NOT演算子が、次のいずれかに指定できる変数のスイッチャーとして機能できることを知っておくと興味深いでしょう。 true または false (またはLOWまたはHIGH)。

次の例は、条件を示しています。

int ledState = LOW
void loop()
{
ledState = !ledState // toggle value of ledState
digitalWrite(kPinLed, ledState)
delay(1000)
}

ここでledState LOWになり、その後ledState = !ledStateになるとすぐにHIGHになります。次のループはledStateを引き起こしますledState = !ledStateのときにHIGHになる低い。

2.7FORステートメント

次に、別の制御構造について理解しようとします。 ために ループ。これは、何かを数回実装したい場合に非常に便利です。

次の例でこれを理解しましょう。

const int kPinLed = 13
void setup()
{
pinMode(kPinLed, OUTPUT)
}
void loop()
{
for(int i = 0 i <4 i++){
digitalWrite(kPinLed, HIGH)
delay(200)
digitalWrite(kPinLed, LOW)
delay(200)
}
delay(1000) // 1 second
}

あなたはとのラインでユニークなものを見つけることができます ために。

コードです i ++? 。これは、かなり怠惰で、便利なショートカットを使用してコーディングを実装したいプログラマーに役立ちます。

上記の用語は、ある代入演算子を別の代入演算子と組み合わせる役割を果たしているため、複合演算子として知られています。これらの中で最も人気のあるものは、次の表で視覚化できます。

arduino複合演算子

forステートメントには3つのサブステートメントがあることがわかります。以下のように構成されています。

for (statement1conditionstatement2){
// statements
}

ステートメント#1は、最初に1回だけ発生します。条件は、ループの過程で毎回テストされます。いつでも true 中括弧内では、後続のステートメント#2が適用されます。の場合 false、 システムはコードの次のブロックにジャンプします。

より多くのLEDを接続する

では、より興味深い効果を得るために、より多くのLEDを接続する方法を見ていきましょう。

以下に示すように、LEDとArduinoを接続してください。赤いワイヤーは実際には必要ありませんが、ブレッドボードに両方の供給レールを含めることは常に良い考えなので、セットアップは理にかなっています。

Arduinoの複数のLED接続

次に、ハードウェアが正しく構成されているかどうかを確認できるようにするプログラムを修正しましょう。

それぞれのハードウェアが正しく配線されているかどうかを確認するために、プログラムの小さなビットを段階的にコーディングして実行することを常にお勧めします。

これにより、発生する可能性のあるエラーをすばやくトラブルシューティングできます。

以下のコード例は、LED 2〜5を周期的に次々に回転させることにより、特定のパターンを提供します。

const int kPinLed1 = 2
const int kPinLed2 = 3
const int kPinLed3 = 4
const int kPinLed4 = 5
void setup()
{
pinMode(kPinLed1, OUTPUT)
pinMode(kPinLed2, OUTPUT)
pinMode(kPinLed3, OUTPUT)
pinMode(kPinLed4, OUTPUT)
}
void loop()
{
// turn on each of the LEDs in order
digitalWrite(kPinLed1, HIGH)
delay(100)
digitalWrite(kPinLed2, HIGH)
delay(100)
digitalWrite(kPinLed3, HIGH)
delay(100)
digitalWrite(kPinLed4, HIGH)
delay(100)
// turn off each of the LEDs in order
digitalWrite(kPinLed1, LOW)
delay(100)
digitalWrite(kPinLed2, LOW)
delay(100)
digitalWrite(kPinLed3, LOW)
delay(100)
digitalWrite(kPinLed4, LOW)
}

お気づきかもしれませんが、コードは長く見えて間違いが発生しやすいという事実を除けば、コードに問題はありません。

もちろん、上記のコードを書くためのより良い方法があります、次のセクションはそれを明らかにします。

2.9アレイの紹介

配列は、インデックス番号でインデックスを付けることができる変数のグループにすることができます。次の例は、それをよりよく理解するのに役立ちます。

const int k_numLEDs = 4
const int kPinLeds[k_numLEDs] = {2,3,4,5} // LEDs connected to pins 2-5
void setup()
{
for(int i = 0 i pinMode(kPinLeds[i], OUTPUT)
}
}
void loop()
{
for(int i = 0 i digitalWrite(kPinLeds[i], HIGH)
delay(100)
}
for(int i = k_numLEDs - 1 i >= 0 i--){
digitalWrite(kPinLeds[i], LOW)
delay(100)
}
}

では、各セクションを見て、実際にどのように機能するかを理解しましょう。

const int k_numLEDs = 4

上記のコードは、配列に含める必要のある最大要素の数を定義します。このコードは、後続のセクションで、すべてが配列内に書き込まれ、配列が終了すると何も書き込まれないようにするのに役立ちます。

const int kPinLeds[k_numLEDs] = {2,3,4,5} // LEDs connected to pins 2-5

この次の行では、配列構造を設定します。括弧内の数字は、配列内の要素の数を示しています。実際の数量を書き込むこともできますが、定数として書き込む方が適切です。値は通常、括弧内にコンマで表示され、配列に値を指定します。

番号0でインデックス付けされた配列を見つけた場合、これは、code: k_LEDPins is k_LEDPins[0]に示すように、配列の最初の要素を示します。

同様に、0から3までのカウントは4であるため、最後の要素はk_LEDPins[3]として表示されます。

void setup()
{
for(int i = 0 i pinMode(kPinLeds[i], OUTPUT)
}
}

上記のコードは、各配列要素を処理し、それらをOUTPUTSとして設定するためのループの使用を示しています。配列内の各要素に到達するために、インデックスとともに角括弧を実装します。

アレイなしでピン#2からピン#5を使用できるかどうか疑問に思っている場合、答えは「はい」です。それは可能です。しかし、この例では、そのようにしていないため、実行されていません。次のセクションでは、選択した出力ピンが一列に並んでいない場合、アレイアプローチを排除できます。

次に、次のコードブロックの機能を見てみましょう。

for(int i = 0 i digitalWrite(kPinLeds[i], HIGH)
delay(100)
}

ここで、コードは各LEDを通過して、100ミリ秒のギャップまたは遅延でLEDを順番にオンにします。

for(int i = k_numLEDs - 1 i >= 0 i--){
digitalWrite(kPinLeds[i], LOW)
delay(100)
}

上記のコードを使用すると、 forループ 逆の順序でもループ内を移動するために使用できます。

配列はゼロインデックスであるため、k_numLEDs - 1から始まります。 k_LEDPins[4]から始めませんこれは、配列の終わりを超える結果になるためです。

コードは> = 0を使用して、インデックス0の最初の要素が欠落または無視されないようにチェックします。

第3章

入力とは

それで、Arduinoを使って物事を操作する方法を学びました。この章では、外部パラメータからの入力をインターフェースすることによって実世界を感知する方法について説明します。

3.1プッシュボタンの使用

私たちは皆、押しボタンとは何か、そしてそれがどのように機能するかを知っています。これは、ある回路ステージから別の回路ステージへの信号を、押し下げた状態で瞬間的に接続し、離すと信号を遮断する一種のスイッチまたはボタンです。

3.1.11つのボタンとLED

Arduinoとのインターフェースプッシュボタン

上記の詳細に従って、ArduinoをプッシュボタンでArduinoに接続し、セットアップの基本的な動作と実装について学習します。

示された押しボタンは、マイクロスイッチ押しボタンとも呼ばれ、合計4つのピンがあります(両側に2ペア)。押すと、ピンの各ペアが内部で結合され、ピン間の接続または導通が可能になります。

この例では、これらのピンまたは接点の1つのペアのみを使用していますが、もう1つのペアは無関係であるため、無視されます。

次のコードを適用して、動作することを確認してみましょう。

const int kPinButton1 = 2
const int kPinLed = 9
void setup()
{
pinMode(kPinButton1, INPUT)
digitalWrite(kPinButton1, HIGH) // turn on pull-up resistor
pinMode(kPinLed, OUTPUT)
}
void loop()
{
if(digitalRead(kPinButton1) == LOW){
digitalWrite(kPinLed, HIGH)
}
else{
digitalWrite(kPinLed, LOW)
}
}

ここで珍しいものがいくつか見つかるかもしれません。それらを段階的に理解してみましょう。

void setup()
{
pinMode(kPinButton1, INPUT)
digitalWrite(kPinButton1, HIGH) // turn on pull-up resistor
pinMode(kPinLed, OUTPUT)
}

私たちが最初にすることは修正することです buttonPin として 入力。 それは非常に基本的なことです、私は知っています。

次に、割り当てます 高い入力 ピン。どうして入力に何かを書くことができるのだろうか?確かに、これは興味深いかもしれません。

実際、Arduino入力にHIGHを割り当てると、内部の20kオームのプルアップ抵抗がオンに切り替わります(このピンのLOWがオフに切り替わります)。

あなたがするかもしれないもう一つの質問は、プルアップ抵抗とは何ですか。私はあなたがプルアップ抵抗器に関する包括的な投稿をカバーしました ここでそれを学ぶ

では、次に進みましょう。メインループコードを見てみましょう。

void loop()
{
if(digitalRead(kPinButton1) == LOW){
digitalWrite(kPinLed, HIGH)
}
else{
digitalWrite(kPinLed, LOW)
}
}

押しボタンを押すと、有線ピンがアースに接続され、 LOW そのピンに。そして、押されていない状態では、同じピンが 高い または、20Kの内部プルアップ抵抗を介して+ 5V。

ここでは、プッシュボタンが押されたときにArduinoがLEDを点灯させたい(LOW)ので、プッシュボタンが押されている間、プッシュボタンからのLOWの応答ごとに出力にHIGHを書き込みます。

3.1.22つのボタンとLED

さて、上記のアクションはArduinoなしでも実行できたのではないかと思うかもしれません。私は理解していますが、これはプッシュボタンをArdunoで使用する方法を学ぶための急な石です。

これまで、LEDのスイッチオン(HIGH)またはスイッチオフ(LOW)のコードの記述について検討してきました。

それでは、ArduinoでLEDの明るさを制御する方法を見てみましょう。

これは、次の2つの方法を使用して実行できます。

  1. LEDへの電流量を制限することにより
  2. を使用して PWM またはパルス幅変調。LEDへの供給が非常に迅速に任意の速度でオン/オフに切り替えられ、その強度がPWMに依存する平均照明を生成します。

Arduinoボードでは、500Hz(1秒間に500回)でチルダ(〜)でマークされたピン(ピン3、4、5、9、10、および11)でPWMサポートを利用できます。ユーザーは0から255までの任意の値を指定できます。ここで、0はHIGHまたは+ 5Vがないことを示し、255はArduinoに常にHIGHまたは+ 5Vを取得するように指示します。これらのコマンドを開始するには、目的の値でanalogWrite()にアクセスする必要があります。

PWMはx / 255であると想定できます。ここで、xはanalogWrite()を介して送信する目的の値です。

ArduinoPWM制御

上記のようにArduinoと他のパラメータを設定します。

const int kPinButton1 = 2
const int kPinButton2 = 3
const int kPinLed = 9
void setup()
{
pinMode(kPinButton1, INPUT)
pinMode(kPinButton2, INPUT)
pinMode(kPinLed, OUTPUT)
digitalWrite(kPinButton1, HIGH) // turn on pullup resistor
digitalWrite(kPinButton2, HIGH) // turn on pullup resistor
}
int ledBrightness = 128
void loop()
{
if(digitalRead(kPinButton1) == LOW){
ledBrightness--
}
else if(digitalRead(kPinButton2) == LOW){
ledBrightness++
}
ledBrightness = constrain(ledBrightness, 0, 255)
analogWrite(kPinLed, ledBrightness)
delay(20)
}

ここに説明が必要な3行があります。

ledBrightness = constrain(ledBrightness, 0, 255)
25 analogWrite(kPinLed, ledBrightness)
26 delay(20)

行:ledBrightness = constrain(ledBrightness, 0, 255)は、constraint()として知られるArduino内のユニークな関数を示しています。

この内部関数は、次のようなコードで構成されています。

intconstraint(int値、int min、int max)
{
if(value > max){
value = max
}
if(value value = min
}
return value
}

これより前に説明されたすべてのコードは、 ボイド 、これは何も返さないことを意味しました(void)。上記のコードはで始まりますが int 、これは整数を返すことを示します。後のセクションで詳しく説明しますが、現時点では、整数には小数部分がないことを覚えておいてください。

そうです、これは次のコードを意味します:ledBrightness = constrain(ledBrightness, 0, 255) ledBrightness to be within the range of 0 and 255を割り当てます。

次の行はanalogWriteを採用しています選択したピンに希望の値でPWMを適用するようにArduinoに命令します。

次の行は20ミリ秒の遅延を作成します。これは、50Hzまたは1秒間に50回より速く食べたものを調整しないようにするためです。これは、人間がArduinoよりもはるかに遅い可能性があるためです。したがって、遅延が発生しない場合、プログラムは、最初のボタンを押すとLEDがオフになり、2番目のボタンを押すとLEDがオンになったと感じる可能性があります(自分で確認してみてください)。

3.2ポテンショメータ

先に進んで、使い方を学びましょう Arduinoを備えたポテンショメータ。

ポテンショメータまたはポットがどのように機能するかを知るために、これを読むことができます 論文

Arduinoでポテンショメータを使用する

上に示したように、表示されたパラメータをArduinoに接続します。

ポットには3つの端子があります。中間端子はArduinoのANALOGIN0に接続します。他の2つの外部端子は、+ 5Vおよび0V電源レールに接続できます。

プログラムして結果を確認してみましょう。

const int kPinPot = A0
const int kPinLed = 9
void setup()
{
pinMode(kPinPot, INPUT)
pinMode(kPinLed, OUTPUT)
}
void loop()
{
int ledBrightness
int sensorValue = 0
sensorValue = analogRead(kPinPot)
ledBrightness = map(sensorValue, 0, 1023, 0, 255)
analogWrite(kPinLed, ledBrightness)
}

まったく新しいように見え、以前のコードには含まれていないものがいくつかあります。

  1. 定数kPinPotはA0として割り当てられます。ここで、Aはアナログピンの1つを記述するショートカットです。ただし、A0はピン#14、A1からピン#15なども参照します。これらを使用すると、実験用のピンが不足した場合のデジタル入力/出力として使用できます。ただし、デジタルピンをアナログピンとして使用することはできません。
  2. 行:ledBrightness = map(sensorValue, 0, 1023, 0, 255)として知られているArduinoの新しい内部関数を提示します 地図()。 この機能は、特定の範囲から別の範囲に再調整されます。 マップ(値、fromLow、fromHigh、toLow、toHigh)。 analogueRead以降、これは重要になる可能性があります0〜1023の範囲の値を出力しますが、analogWriteは0〜255の値を受け入れることができます。

抵抗を変えることでLEDの明るさを制御できるので、Arduinoを使うのはポットだけで十分だったと思うかもしれません。さて、これもまた、Arduinoでポットを構成する方法を示すための基礎にすぎません。

問題ありません。Arduinoなしでは実行できないことを実行します。

この実験では、ポットのさまざまな抵抗を使用して、LEDの点滅速度または速度を制御する方法を確認します。

プログラムは次のとおりです。

const int kPinPot = A0
const int kPinLed = 9
void setup()
{
pinMode(kPinLed, OUTPUT)
}
void loop()
{
int sensorValue
sensorValue = analogRead(kPinPot)
digitalWrite(kPinLed, HIGH)
delay(sensorValue)
digitalWrite(kPinLed, LOW)
delay(sensorValue)
}

3.2.3 delay()の回避

上記のコードは良さそうですが、LEDは各フルサイクルを通過するまでポット値をチェックできません。遅延が長くなると、このプロセスは長くなり、ユーザーはポットの応答を移動するまで待つ必要があります。この遅延は、一部のインテリジェントプログラミングで回避できるため、ユーザーは最小の遅延なしで値を確認できます。これがコードです。

const int kPinPot = A0
const int kPinLed = 9
void setup()
{
pinMode(kPinLed, OUTPUT)
}
long lastTime = 0
int ledValue = LOW
void loop()
{
int sensorValue
sensorValue = analogRead(kPinPot)
if(millis() > lastTime + sensorValue){
if(ledValue == LOW){
ledValue = HIGH
}
else{
ledValue = LOW
}
lastTime = millis()
digitalWrite(kPinLed, ledValue)
}
}

では、上記のコードの違いは何ですか?違いを生むのは次の行です。

long lastTime = 0

このセクションまで、変数intについて説明してきました。ただし、アクセスできるタイプ変数は他にも多数ある可能性があります。リストは以下で読むことができます:

Arduino変数の種類

現在、比較的大きな数を格納するためにそれを知ることだけが重要かもしれません int 変数、あなたは用語を使うことができます 長いです または longint。

ここでは、と呼ばれる別の興味深い関数を見ることができます ミリス()。

これにより、Arduinoが最初から動作中に動作した期間がミリ秒単位で生成されます(これは50日ごとに0にリセットされます)。ここでは長いが返されます。 int 、長期間のカウントができない場合があります。正確にどのくらい答えてもらえますか?答えは32.767秒です。

したがって、delay()を使用する代わりに、millis()をチェックし、特定のミリ秒数が経過するとすぐにLEDを変更します。したがって、最後に変更した時間を保存します 前回 変数であるため、必要なときにいつでも再度確認できます。

3.3 RGB LED

これまで、単色LEDで遊んできました。 LEDを別の色に交換することでLEDの色を変えることができますが、RGBLEDを使用するのはどうですか LEDの色を変更するには LEDを変えずに?

RGB LEDは基本的に、赤、緑、青のLEDが埋め込まれ、1つのLEDに統合されたLEDです。グランドまたは0V電源レールに接続する1つの共通リードがあり、他の3つのリードには、目的の実装のために多様なPWM正信号が供給されます。 混色

以下に示すように、セットアップを配線できます。

ArduinoでRGBを制御する

少し複雑に見えるかもしれませんが、実際には、PWMを使用した以前のLED制御設計のレプリカです。

練習プログラムのコードは次のとおりです。

const int kPinPot1 = A0
const int kPinPot2 = A1
const int kPinPot3 = A2
const int kPinLed_R = 6
const int kPinLed_G = 10
const int kPinLed_B = 11
void setup()
{
pinMode(kPinLed_R, OUTPUT)
pinMode(kPinLed_G, OUTPUT)
pinMode(kPinLed_B, OUTPUT)
}
void loop()
{
int potValue
int ledValue
potValue = analogRead(kPinPot1)
ledValue = map(potValue, 0, 1023, 0, 255)
analogWrite(kPinLed_R, ledValue)
potValue = analogRead(kPinPot2)
ledValue = map(potValue, 0, 1023, 0, 255)
analogWrite(kPinLed_G, ledValue)
potValue = analogRead(kPinPot3)
ledValue = map(potValue, 0, 1023, 0, 255)
analogWrite(kPinLed_B, ledValue)
}

このコードをアップロードした後、ポットの調整がRGBに興味深い光の効果をどのように作成するかを確認してください。これは本当に楽しいことです。

3つのポットすべてを最大位置に移動すると、白い色ではなく、赤が表示されます。これは、3色の中で赤色が最も目立つため、この状況で支配的であるためです。ただし、この関数を試すことはできます 地図() 、より賢明なバランスを作成するために、LEDの赤い部分にそれを実行する前に。

Arduinoでのオーディオ

このセクションでは、Arduinoのセットアップに基本的なサウンドと音楽を追加する方法を学習します。

希望の周波数で接続されたスピーカーに信号を切り替える方法を見ていきます。

より正確には、440Hzの周波数の音である中央のA音が試されます。

これを行うには、中央のAノートを演奏し、方形波で正弦波信号を最適化します。

また、次の式を使用して、スピーカーがオンのままになる時間を計算します。

timeDelay = 1秒/ 2 xtoneFrequency。

timeDelay = 1秒/ 2 x 440

timeDelay = 1136マイクロ秒

4.1Arduinoボードを接続しましょう

Arduinoで効果音を使用する

4.2簡単なメモの追加

機能についてはすでに説明しました ディレイ() ここで、単位はミリ秒(秒/ 1000)ですが、さらに別の関数がありますdelayMicroseconds()ここで、単位はマイクロ秒(ミリ秒/ 1000)です。

現在のセットアップでは、スピーカーにリンクされた選択されたピンの+ 5V ON / OFFを、毎秒440パルスの速度で切り替えるコードをプログラムします。

前回の説明で、目的のオーディオノートの値を1136マイクロ秒に決定したことを思い出してください。

これがこのためのプログラムです。スピーカーを接続してarduinoをプログラムするとすぐに、440Hzのオーディオノートを聞くことができます。

const int kPinSpeaker = 9
const int k_timeDelay = 1136
void setup()
{
pinMode(kPinSpeaker, OUTPUT)
}
void loop()
{
digitalWrite(kPinSpeaker, HIGH)
delayMicroseconds(k_timeDelay)
digitalWrite(kPinSpeaker, LOW)
delayMicroseconds(k_timeDelay)
}

上記のアプリケーションを使用すると、オーディオノートを作成することができます。これは、自分で選択した音楽を作成できることも意味します。

コードから、Arduinoには音楽の作成にさらに貢献するいくつかの統合された機能が含まれていることがわかります。

最初のものは トーン() これは、2つの要素と3番目のオプションの要素で機能します。 トーン(ピン、周波数、持続時間)。 または トーン(ピン、周波数)

どちらも、あなたが割り当てた期間のそれぞれを実行するように指定されています。

期間がない場合、音楽は通話まで再生され続けます トーン() 再度実行されるか、実行するまで ない1 ()。

これは、音楽の再生が実装している唯一の基本的なことである場合に備えて、遅延機能を使用して実行する必要があります。

持続時間は、音楽が再生される時間の時間を提供できるため、重要な場合があります。そのため、他のことを自由に行うことができます。時間が経過するとすぐに音楽が停止します。

次の機能 ない1 () 単一のパラメータを処理し、特定の割り当てられたピンで選択されたトーンを停止します。

特有の警告:いつでも トーン() 機能が実装されると、ピン3と11のPWM機能が動作を停止します。

したがって、プログラムでスピーカーアタッチメントを使用する場合は、スピーカーに上記のピンを使用せず、代わりにスピーカーアタッチメントに他のピンを試してください。

さて、これはスピーカーに音楽を実装するためのプログラムですが、実際の音楽ではなく、基本音階のCノートです。

#define NOTE_C4 262
#define NOTE_D4 294
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_G4 392
#define NOTE_A4 440
#define NOTE_B4 494
#define NOTE_C5 523
const int kPinSpeaker = 9
void setup()
{
pinMode(kPinSpeaker, OUTPUT)
}
void loop()
{
tone(kPinSpeaker, NOTE_C4, 500)
delay(500)
tone(kPinSpeaker, NOTE_D4, 500)
delay(500)
tone(kPinSpeaker, NOTE_E4, 500)
delay(500)
tone(kPinSpeaker, NOTE_F4, 500)
delay(500)
tone(kPinSpeaker, NOTE_G4, 500)
delay(500)
tone(kPinSpeaker, NOTE_A4, 500)
delay(500)
tone(kPinSpeaker, NOTE_B4, 500)
delay(500)
tone(kPinSpeaker, NOTE_C5, 500)
delay(500)
noTone(kPinSpeaker)
delay(2000)
}

上記のコードで、何か新しいことに気づいたかもしれませんが、それは #define

この用語は、コンパイルが行われている間、コンピューターの検索および置換コマンドのように機能します。

スペースの前に最初のものが見つかると、それを行の残りの部分(マクロと呼ばれます)に置き換えます。

したがって、この例では、コンピューターが NOTE_E4 すぐに数量330に置き換えられます。

その他のメモとカスタマイズについては、USBスティック内のファイルを参照してください。 ピッチ.h 、ほとんどの周波数はあなたの好みに合わせて見つけることができます。

4.4機能を備えた音楽

上記のコードは見栄えが良いですが、繰り返しが非常に多いようです。これらの繰り返しを短くする方法があるはずですよね?

これまで、Arduinoに含まれている2つの重要な機能を使用してきました。今度は、独自の関数を作成するときかもしれません。

各関数は、関連付けられている可能性のある変数のタイプで始まる必要があります。たとえば、関数 ボイド 何も返さないタイプを指します。したがって、名前はvoidです。変数のリストについては前のセクションですでに説明したので、それらを参照することをお勧めします。

その結果、特定の関数名は開き括弧を取得します '(' その後にコンマ区切りのパラメーターのリストが続きます。

各パラメーターは、名前とともにそのタイプを取得し、最後に閉じる ')' 括弧。

これらのパラメーターは、変数の形式で関数内に適用できます。

以下の例を見てみましょう。ここでは、という関数を開発しています。 ourTone() をマージするように設計されています トーン()ディレイ() 音符がトーンの再生を終了するまで関数が戻るのを停止する方法で、行。

これらの関数を前のコードで実装し、以下のプログラムを取得します。最後の行を参照してください。

#define NOTE_C4 262
#define NOTE_D4 294
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_G4 392
#define NOTE_A4 440
#define NOTE_B4 494
#define NOTE_C5 523
const int kPinSpeaker = 9
void setup()
{
pinMode(kPinSpeaker, OUTPUT)
}
void loop()
{
tone(kPinSpeaker, NOTE_C4, 500)
delay(500)
tone(kPinSpeaker, NOTE_D4, 500)
delay(500)
tone(kPinSpeaker, NOTE_E4, 500)
delay(500)
tone(kPinSpeaker, NOTE_F4, 500)
delay(500)
tone(kPinSpeaker, NOTE_G4, 500)
delay(500)
tone(kPinSpeaker, NOTE_A4, 500)
delay(500)
tone(kPinSpeaker, NOTE_B4, 500)
delay(500)
tone(kPinSpeaker, NOTE_C5, 500)
delay(500)
noTone(kPinSpeaker)
delay(2000)
}
void ourTone(int freq, int duration)
{
tone(kPinSpeaker, freq, duration)
delay(duration)
}

関数は、プログラムを理解しやすくするために非常に便利です。

以下は、2つの配列を使用して再生するトーンの選択を指定できる例です。 1つはノートを保持するための配列で、もう1つはビートを保持するためのものです。

#include 'pitches.h'
int kPinSpeaker = 9
#define NUM_NOTES 15
const int notes[NUM_NOTES] = // a 0 represents a rest
{
NOTE_C4, NOTE_C4, NOTE_G4, NOTE_G4,
NOTE_A4, NOTE_A4, NOTE_G4, NOTE_F4,
NOTE_F4, NOTE_E4, NOTE_E4, NOTE_D4,
NOTE_D4, NOTE_C4, 0
}
const int beats[NUM_NOTES] = {
1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 4 }
const int beat_length = 300
void setup()
{
pinMode(kPinSpeaker, OUTPUT)
}
void loop()
{
for (int i = 0 i if (notes[i] == 0) {
delay(beats[i] * beat_length) // rest
}
else {
ourTone(notes[i], beats[i] * beat_length)
}
// pause between notes
noTone(kPinSpeaker)
delay(beat_length / 2)
}
}
void ourTone(int freq, int duration)
{
tone(kPinSpeaker, freq, duration)
delay(duration)
}

あなたは最初の行での紹介をはっきりと見ることができます #include ステートメント。このステートメントの役割は、引用符の間のファイル全体を取得し、その位置に配置することです。 #include ステートメント。標準規則に従って、これらはプログラムの開始時に厳密に配置されます。

第5章

温度の測定

覚えておいてください。大きなプログラムを作成するのではなく、コードの小さな部分を作成して分析することをお勧めします。これは、間違いをすばやく追跡するのに役立ちます。

5.1シリアルモニター

これまで、説明したコードは、迅速なトラブルシューティングを可能にするほど簡単ではないようです。ここでは、監視しやすく、考えられる問題を簡単に解決できるようにします。

Arduinoには、コンピューターと「トークバック」できる機能があります。 pin0とpin1は、互いに隣り合ってRX、TXとしてマークされていることがわかります。これらのピンは、実際にはArduino内の別のICによって追跡され、PCに接続されている間にUSBケーブルを介して読み取るようにアップグレードされます。

以下のセクションは、本格的なプログラムを示しています。それを実行してください。その後、コードの新しいエントリについて学習します。このコードは、コード化されているものを識別できるようにするための追加データが含まれていることを除いて、セクション2.2で表現されているものと同じです。

const int kPinLed = 13
void setup()
{
pinMode(kPinLed, OUTPUT)
Serial.begin(9600)
}
int delayTime = 1000
void loop()
{
delayTime = delayTime - 100
if(delayTime <= 0){ // If it would have been zero or less, reset it.
delayTime = 1000
}
Serial.print('delayTime = ')
Serial.println(delayTime)
digitalWrite(kPinLed, HIGH)
delay(delayTime)
digitalWrite(kPinLed, LOW)
delay(delayTime)
}

ここで2つの新しいものを識別できます。 セットアップ() 関数。

Serial.begin(9600)

この行は、単に使用する必要性を表しています。 シリアル1 9600ボーでそれを強制するコード。 (ここでシリアルとは ビット 次々に送信され、ボーは送信速度を意味します)。このボー値とシリアルモニター内の値(これについては後で学習します)は等しくなければなりません。そうでない場合、シリアルモニターのデータはゴミを表示します。標準の9600がより使いやすくなります。

2番目の新しいエントリは次のとおりです

Serial.print('delayTime = ')
Serial.println(delayTime)

ここで2行目は、シリアルポートから出てくる後続のものが次の行から始まることを示しています。このように、2行目は1行目とは異なります。

あなたが見ることができるもう一つのことは引用符( ')です。これは文字列と呼ばれ、ここでは定数のようにのみ使用されます。これは、このトピックに関する詳細な説明が複雑すぎて範囲を超えている可能性があるためです。

これで、上記のコードをArduinoにアップロードして、何が起こるかを確認できます。

何も起こらなかったようです。Arduinoのピン#13 LEDが点滅して停止しましたが、TxLEDは点滅したままでした。

それは、シリアルモニターウィンドウがまだ修正されていないためです。

上記のように、IDEの[シリアルモニター]ボックスをクリックする必要があります。右下にあるボーレートを確認することを忘れないでください。デフォルトでは9600であり、コードと一致します。わからない場合は、必ず9600を選択してください。

次のビデオクリップは、それがどのように行われるかを説明しています。

https://youtu.be/ENg8CUyXm10

それでは、先に進んで、上記のシリアルモニター機能がどのように処理を支援できるかを学びましょう。 Arduinoを使用した温度の測定

摂氏-40度から150度の範囲の温度センサーとしてICTMP36を使用します。

セットアップは以下のとおりです。

温度測定用のArduinoを搭載したTMP36

次のコードは、TMP36センサーからの出力を読み取り、それらをIDのシリアルモニターに送信することにより、温度の測定を開始します。

const int kPinTemp = A0
void setup()
{
Serial.begin(9600)
}
void loop()
{
float temperatureC = getTemperatureC()
Serial.print(temperatureC)
Serial.println(' degrees C')
// now convert to Fahrenheit
float temperatureF = convertToF(temperatureC)
Serial.print(temperatureF)
Serial.println(' degrees F')
delay(500)
}
float getTemperatureC()
{
int reading = analogRead(kPinTemp)
float voltage = (reading * 5.0) / 1024
// convert from 10 mv per degree with 500mV offset
// to degrees ((voltage - 500mV) * 100)
return (voltage - 0.5) * 100
}
float convertToF(float temperatureC)
{
return (temperatureC * 9.0 / 5.0) + 32.0
}

コードを上から理解しましょう。

float temperatureC = getTemperatureC()

ここで、変数タイプが含まれていることがわかります 浮く。

これは、整数(小数部または小数部のない数値)を除くすべてを格納する機能を備えた唯一の変数タイプです。

float変数の精度は、最大6〜7桁です。

隣接するコードgetTemperatureC()は、TMP36センサーから検出された電圧差を数学的に計算して摂氏に変換する独自の関数です。

float getTemperatureC()
{
int reading = analogRead(kPinTemp)
float voltage = (reading * 5.0) / 1024
// convert from 10 mv per degree with 500mV offset
// to degrees ((voltage - 500mV) * 100)
return (voltage - 0.5) * 100
}

コードの次のセクションでは、用語analogIn()が1から1023までの数値を返すように割り当てられている場合、読み取り値に5を掛け、次に1024で割ることにより、センサーからの電圧を評価することが可能になります。

センサーTMP36は、摂氏0度で0.5Vを生成し、その後、摂氏1度上昇するごとに10mVを生成するように指定されています。

計算によって生成できる近似値は次のとおりです。

Arduinoの温度校正

何らかの値を返す最初の関数と見なすことができます(これまでの残りのすべての関数は、タイプが型であるため、値を返さなかったことに注意してください) ボイド )。

関数から値を取得するには、単に追加する必要があることを理解できます 戻る その後に、返却したい番号が続きます。

私たちが言うとき 戻る これは、関数が呼び出されるたびに応答または応答を返すことを意味し、変数に適用できます。

これがシリアルモニターに送信されると、読み取り値は華氏に変換されます。 convertToF()。

float convertToF(float temperatureC)
{
return (temperatureC * 9.0 / 5.0) + 32.0
}

この関数は摂氏範囲を取得し、華氏に変換します。

華氏を摂氏に変換するために、式を実装します 華氏= 9 / 5(摂氏)+32。

5.3LCDとのインターフェース

それでは、インターフェースまたは接続する方法を学びましょう。 LCDディスプレイ 必要な出力の視覚的表示を取得するためのArduinoを使用します。

このアプリケーションでは、水平方向に84ピクセルまたはドット、垂直方向に48ピクセルの解像度を持つ84x48のグラフィカルLCDを使用します。すべてのLCDに専用のコントローラーが不可欠になるため、本デバイスにはPCD8544コントローラーの形式のコントローラーも組み込まれています。

このチュートリアルでは、上記で指定したLCDモジュールをArduinoに接続し、特定のルーチンを適用してディスプレイにテキストメッセージを作成します。

次の図では、LCDのインターフェースに関する詳細と、小さな 3.3V電圧レギュレータ 。 LCDは3.3V電源で動作するように指定されているため、このレギュレータが必要です。

LCDモジュールから8つのピン配列を確認することもできます。ピン配列の仕様は、次の表から調べることができます。

LCDピン配列の詳細

次に、LCDと関連パラメーターをArduinoに接続する方法を見てみましょう。詳細は、以下の図で視覚化できます。

Arduinoの基本的な学習

5.4LCDとの通信

ArduinoからLCDと対話するための精巧なコードを書くことは可能ですが、ライブラリを使用して同じことを行う方法を学びます。

ライブラリは、選択したArduinoプログラムにすばやく適用できるさまざまなコードで構成されています。

これにより、ユーザーは複雑なコーディング作業を行うことなく、簡単に関数を呼び出すことができます。

5.4.1ライブラリのインストール方法

このためには、説明されているように、コンピュータArduinoIDEにライブラリと呼ばれるディレクトリを作成する必要があります ここに

5.4.2LCD操作の実装

以前のアプローチと同じように、最初にコード全体をチェックアウトしてから、個々の行の詳細を理解しようとします。

#include
const int kPin_CLK = 5
const int kPin_DIN = 6
const int kPin_DC = 7
const int kPin_RESET = 8
PCD8544 lcd(kPin_CLK, kPin_DIN, kPin_DC, kPin_RESET)
void setup()
{
lcd.init()
lcd.setCursor(0,0)
lcd.print('Hello, World!')
}
void loop()
{
lcd.setCursor(0,1)
lcd.print(millis())
}

この行にはコード#include が含まれています

コード#includeは、プログラムのコンパイル中に、前述のファイルを取得し、#include要素をファイルの内容に置き換えるようにPCに指示します。

#include要素は、ライブラリディレクトリでの検索を示す山かっこを使用できます。あるいは、プログラムが配置されている同じディレクトリ内での検索を示す引用符を使用することもできます。

後続のコード行はLCDのピン配置を表し、新しい形式の変数を記述します。

PCD8544 lcd(kPin_CLK, kPin_DIN, kPin_DC, kPin_RESET)

ここでは、タイプPCD8544のlcdという名前の変数を表現し、Arduinoに関連付けられたピン配置をPCに再グレードするように指示しています。

このプロセスでは、ピンclk、din、dc、およびresetがArduinoとどのようにインターフェースされるかを指示することにより、PCに変数を記述します。

void setup()
{
lcd.init()
lcd.setCursor(0,0)
lcd.print('Hello, World!')
}

lcd.init() LCD動作を初期化します。これが実行されると、次の行はディスプレイの左上にカーソルを強制します。そして、次の次の行は、「Hello、World」というメッセージを出力するように努めています。

これは、シリアルモニターを介してメッセージを送信した手法とまったく同じように見えます。唯一の違いは、コードの使用ですlcd.print serial.printの代わりに。

コードの次のブロックは、実際には繰り返し呼び出されます。

void loop()
{
lcd.setCursor(0,1)
lcd.print(millis())
}

この行を使用するlcd.setCursor(0,1) LCDディスプレイの上の1行目の左端にある0列目にカーソルを固定します。

次の行はショートカットを採用しています:lcd.print(millis())

あなたが思い出すなら、私たちはmillis()と協力してきました以前のコードでは、コードを介してここでも同じことを適用できました。

long numMillis = millis()
lcd.print(numMillis)

ただし、ここではミリ秒単位の期間が含まれていないため、millis()を送信するだけで実行できます。 lcd.print()に直接機能します

5.5すべてを組み合わせる

では、LCD温度回路を作成するために上記で学習したすべてのコードを組み合わせて、どのように見えるかを見てみましょう。

#include
const int kPin_CLK = 5
const int kPin_DIN = 6
const int kPin_DC = 7
const int kPin_RESET = 8
const int kPin_Temp = A0
PCD8544 lcd(kPin_CLK, kPin_DIN, kPin_DC, kPin_RESET)
void setup()
{
lcd.init()
lcd.setCursor(10,0)
lcd.print('Temperature:')
}
void loop()
{
float temperatureC = getTemperatureC()
// now convert to Fahrenheit
float temperatureF = convertToF(temperatureC)
lcd.setCursor(21,1)
lcd.print(temperatureC)
lcd.print(' C')
lcd.setCursor(21,2)
lcd.print(temperatureF)
lcd.print(' F')
delay(100)
}
float getTemperatureC()
{
int reading = analogRead(kPin_Temp)
float voltage = (reading * 5.0) / 1024
// convert from 10 mv per degree with 500mV offset
// to degrees ((voltage - 500mV) * 100)
return (voltage - 0.5) * 100
}
float convertToF(float temperatureC)
{
return (temperatureC * 9.0 / 5.0) + 32.0
}

関数の使用を除いて、上記のプログラムではすべてが標準に見えます setCursor() 。これは、テキストをディスプレイの中央付近にできるだけ配置するために使用されます。

すごい!おめでとうございます。Arduinoを使用して独自の小さなLCD温度インジケーターをプログラムしました。

実用的なArduinoアプリケーション

この時点で、さまざまなプログラミング手法を詳細に包括的にカバーしたので、いくつかの有用な実用的な実装にそれらを適用することによって、それらを理解する時が来ました。

センサーから始めて、いくつかのサンプルコードを実行することにより、センサーデバイスをArduinoでどのように使用できるかを見ていきます。

7.1センサーの概要

このチュートリアルでは、Arduinoで使用できるさまざまなセンサーについて学習します。これらには、光センサーLDR、磁気ホール効果センサー、傾斜センサー、振動センサー、圧力センサーなどのデバイスが含まれる場合があります。

のインターフェースから始めましょう 光センサーLDR 次の図に示すように、Arduinoを使用します。

ArduinoでLDRを使用する

ご存知のとおり、LDRは光に依存する抵抗デバイスであり、その抵抗はその表面に入射する周囲の強度に依存します。

光の強度は、LDRの抵抗値に反比例します。

ここでは、このプロパティをArduinoと統合して、便利なアプリケーションを実行する方法を学習します。

完全なプログラムコードは、以下のように視覚化できます。

const int kPin_Photocell = A0
void setup()
{
Serial.begin(9600)
}
void loop()
{
int value = analogRead(kPin_Photocell)
Serial.print('Analog Reading = ')
Serial.print(value)
if(value <200){
Serial.println(' - Dark')
}else if(value <400){
Serial.println(' - Dim')
}
else if(value <600){
Serial.println(' - Light')
}
else if(value <800){
Serial.println(' - Bright')
}
else{
Serial.println(' - Very Bright')
}
delay(1000)
}

コードで使用されるすべてのパラメーターは、これまでに学習したコースですでに説明されています。関連するセクションを参照して、行を確認できます。

値はランダムに選択されたため、好みに応じて簡単に変更できます。

傾斜センサー

傾斜センサーは、設置されているあらゆる物体の傾斜動作を検出するために使用できるシンプルなデバイスです。デバイスは基本的に内部に金属製のボールを備えており、傾斜すると一対の接点上を転がり、それらの接点間で伝導を引き起こします。チルトスイッチのリードとして終端されているこれらの接点は、チルト動作による導通を検出し、目的の出力アプリケーションをアクティブにするための外部回路とともに使用されます。

では、どのように 傾斜センサー デバイスが配線されている可能性があります。以下の画像は、完全な構成に関するアイデアを示しています。

Arduinoとのインターフェース傾斜センサー

const int kPin_Tilt = 3
const int kPin_LED = 13
void setup()
{
pinMode(kPin_Tilt, INPUT)
digitalWrite(kPin_Tilt, HIGH) // turn on built-in pull-up resistor
pinMode(kPin_LED, OUTPUT)
}
void loop()
{
if(digitalRead(kPin_Tilt) == HIGH){
digitalWrite(kPin_LED, LOW)
}
else{
digitalWrite(kPin_LED, HIGH)
}
}

この例では、デフォルトのピン#13LEDが傾斜インジケーターとして使用されています。

セクション3.1で行ったのと非常によく似た、プルアップ抵抗がここに含まれていることがはっきりとわかります。したがって、LOWという用語は、傾斜機能がトリガーされていないことを示します。

7.4リードスイッチリレー(ミニチュアマグネット作動リレー)

それでは、リレースイッチまたは磁場センサーをArduinoに接続する方法を見てみましょう。リードリレーは、磁場または磁石が近づくと作動または導通する一種のスイッチです。基本的に、それは、磁気がそれに近接しているときはいつでも、磁気の引っ張りによって結合または接触する小型のガラス筐体内に一対の強磁性接触を持っています。これが発生すると、接点の端子が接点の閉鎖により導通を示します。

ここでも、応答を示すためにピン#13LEDを使用します。以前の説明に従って、必要に応じてこのピンから外部LEDを接続できます。

const int kPinReedSwitch = 2
const int kPinLed = 13
void setup()
pinMode(kPinReedSwitch, INPUT)
digitalWrite(kPinReedSwitch, HIGH) // turn on pullup resistor
pinMode(kPinLed, OUTPUT)
}
void loop()
{
if(digitalRead(kPinReedSwitch) == LOW){
digitalWrite(kPinLed, HIGH)
}
else{
digitalWrite(kPinLed, LOW)
}
}

コード用語は、よく知られていて自明である必要があります。

7.5ピエゾトランスデューサーを使用した振動センサー

次のサンプルプログラムでは、 ピエゾトランスデューサ Arduinoを介してLEDを照らす振動センサーとして使用できます。

ピエゾ素子は、実際には、端子間に周波数が印加されたときに振動または振動を発生させるデバイスです。ただし、同じピエゾを逆のプロセスで使用することもできます。 電気パルスの生成 その体に加えられた振動に応じて。この振動は、ピエゾの表面をノックまたはヒットする形で発生する可能性があります。

次の図に示すように、Arduinoとピエゾ素子をセットアップします

Arduinoで振動センサーとしてピエゾを使用

const int kPinSensor = A5
const int kPinLed = 13
const int k_threshold = 100
int ledState = LOW // variable used to store the last LED status, to toggle the light
void setup()
{
pinMode(kPinLed, OUTPUT) // declare the ledPin as as OUTPUT
}
void loop()
{
int val = analogRead(kPinSensor)
if (val >= k_threshold) {
ledState = !ledState // toggle the value of ledState
digitalWrite(kPinLed, ledState)
delay(20) // for debouncing
}
}

しきい値100は、Arduinoがノックによる本物の振動にのみ応答し、大きな音やホーンなどの他の小さな振動には応答しないようにするために導入されています。

A5ピンの選択は必須ではありません。好みに応じて、プログラムコードで一致させることにより、他のアナログ入力を選択できます。

Arduinoでサーボモーターを使用する

サーボモーターは、特定のアプリケーションの要求に応じて正確な角度に回転できるDCモーターの一種です。これは、計算されたコマンドをモーターの関連する入力に適用して、モーターの180度の範囲内で正確な回転角度または回転角度を生成することによって実行できます。

通常、サーボモーターには3本のワイヤーまたは入力があります。プラス線は通常赤色で、マイナス線またはアース線は黒で、コマンド線または信号線は通常白または黄色です。

Arduinoは、サーボモーターの制御を非常に便利で理想的なものにする組み込みのサポート言語を通じてサーボモーターの制御を容易にします。

次の例は、Arduinoを介してサーボモーター制御を実装するための基本的なセットアッププログラムを示しています。

Arduinoサーボモーター制御

コードを以下に示します。

#include
Servo servo1
const int kPinPot = A0
const int kPinServo1 = 9
void setup()
{
servo1.attach(kPinServo1)
}
void loop()
{
int val = analogRead(kPinPot)
val = map(val, 0, 1023, 0, 180)
servo1.write(val)
delay(15)
}

ここにいくつかの新しいエントリがあります。サーボの接続線をどのピンに割り当てているかを伝えるもの。もう1つは、サーボの回転角を決定するために、ピンに0〜180の値を提供するコードです。

結論

Arduinoの主題は無限に長くなる可能性があるため、この記事の範囲を超えています。ただし、上記のチュートリアルが、Arduinoの非常に基本的なことを学び、さまざまなサンプルアプリケーションコードを通じて重要なパラメーターを理解するのに確かに役立つことを願っています。

うまくいけば、それが利用可能であるときはいつでも、ここでより多くの情報が時々更新されるかもしれません。

それまでの間、プログラミングコースをお楽しみください。HappyArduinoingtoyou !!




前:MQ-3センサーモジュールを使用したアルコール検出器メーター回路 次へ:携帯電話制御の犬用フィーダー回路