Arduino-quick-guide

提供:Dev Guides
移動先:案内検索

Arduino-概要

Arduinoは、使いやすいハードウェアとソフトウェアに基づくプロトタイププラットフォーム(オープンソース)です。 プログラム可能な回路基板(マイクロコントローラと呼ばれます)と、Arduino IDE(統合開発環境)と呼ばれる既製のソフトウェアで構成されています。

主な機能は次のとおりです-

  • Arduinoボードは、さまざまなセンサーからのアナログまたはデジタル入力信号を読み取り、モーターの起動、LEDのオン/オフ、クラウドへの接続、その他多くのアクションなどの出力に変換できます。
  • ボードの機能を制御するには、Arduino IDEを介してボード上のマイクロコントローラーに一連の命令を送信します(アップロードソフトウェアと呼ばれます)。
  • 以前のほとんどのプログラマブル回路基板とは異なり、Arduinoは新しいコードをボードにロードするために追加のハードウェア(プログラマーと呼ばれる)を必要としません。 USBケーブルを使用するだけです。
  • さらに、Arduino IDEはC ++の簡易バージョンを使用しているため、プログラミングの習得が容易になります。
  • 最後に、Arduinoは、マイクロコントローラーの機能をよりアクセスしやすいパッケージに分割する標準フォームファクターを提供します。

ボード

ボードの種類

使用するマイクロコントローラーに応じて、さまざまな種類のArduinoボードを使用できます。 ただし、すべてのArduinoボードには1つの共通点があります。それらはArduino IDEを介してプログラムされます。

違いは、入力と出力の数(1つのボードで使用できるセンサー、LED、ボタンの数)、速度、動作電圧、フォームファクターなどに基づいています。 一部のボードは組み込み用に設計されており、プログラミングインターフェイス(ハードウェア)はありません。これらは別途購入する必要があります。 3.7Vバッテリーから直接実行できるものもあれば、少なくとも5Vが必要なものもあります。

利用可能なさまざまなArduinoボードのリストを以下に示します。

  • ATMEGA328マイクロコントローラに基づいたArduinoボード*
Board Name Operating Volt Clock Speed Digital i/o Analog Inputs PWM UART Programming Interface
Arduino Uno R3 5V 16MHz 14 6 6 1 USB via ATMega16U2
Arduino Uno R3 SMD 5V 16MHz 14 6 6 1 USB via ATMega16U2
Red Board 5V 16MHz 14 6 6 1 USB via FTDI
Arduino Pro 3.3v/8 MHz 3.3V 8MHz 14 6 6 1 FTDI-Compatible Header
Arduino Pro 5V/16MHz 5V 16MHz 14 6 6 1 FTDI-Compatible Header
Arduino mini 05 5V 16MHz 14 8 6 1 FTDI-Compatible Header
Arduino Pro mini 3.3v/8mhz 3.3V 8MHz 14 8 6 1 FTDI-Compatible Header
Arduino Pro mini 5v/16mhz 5V 16MHz 14 8 6 1 FTDI-Compatible Header
Arduino Ethernet 5V 16MHz 14 6 6 1 FTDI-Compatible Header
Arduino Fio 3.3V 8MHz 14 8 6 1 FTDI-Compatible Header
LilyPad Arduino 328 main board 3.3V 8MHz 14 6 6 1 FTDI-Compatible Header
LilyPad Arduino simple board 3.3V 8MHz 9 4 5 0 FTDI-Compatible Header
  • ATMEGA32u4マイクロコントローラに基づいたArduinoボード*
Board Name Operating Volt Clock Speed Digital i/o Analog Inputs PWM UART Programming Interface
Arduino Leonardo 5V 16MHz 20 12 7 1 Native USB
Pro micro 5V/16MHz 5V 16MHz 14 6 6 1 Native USB
Pro micro 3.3V/8MHz 5V 16MHz 14 6 6 1 Native USB
LilyPad Arduino USB 3.3V 8MHz 14 6 6 1 Native USB
  • ATMEGA2560マイクロコントローラに基づいたArduinoボード*
Board Name Operating Volt Clock Speed Digital i/o Analog Inputs PWM UART Programming Interface
Arduino Mega 2560 R3 5V 16MHz 54 16 14 4 USB via ATMega16U2B
Mega Pro 3.3V 3.3V 8MHz 54 16 14 4 FTDI-Compatible Header
Mega Pro 5V 5V 16MHz 54 16 14 4 FTDI-Compatible Header
Mega Pro Mini 3.3V 3.3V 8MHz 54 16 14 4 FTDI-Compatible Header
  • AT91SAM3X8Eマイクロコントローラーに基づくArduinoボード*
Board Name Operating Volt Clock Speed Digital i/o Analog Inputs PWM UART Programming Interface
Arduino Mega 2560 R3 3.3V 84MHz 54 12 12 4 USB native

Arduino-ボードの説明

この章では、Arduinoボードのさまざまなコンポーネントについて学習します。 Arduino UNOボードは、Arduinoボードファミリで最も人気のあるボードであるため、検討します。 さらに、電子機器とコーディングを始めるのに最適なボードです。 一部のボードは以下に示すものとは少し異なりますが、ほとんどのArduinoにはこれらのコンポーネントの大部分が共通しています。

ボードの説明

Power USB

Power USB

Arduinoボードは、コンピューターのUSBケーブルを使用して給電できます。 必要なことは、USBケーブルをUSB接続に接続することだけです(1)。

Barrel Jack

Power (Barrel Jack)

Arduinoボードは、バレルジャック(2)に接続することにより、AC主電源から直接給電できます。

Voltage Regulator

Voltage Regulator

電圧レギュレーターの機能は、Arduinoボードに与えられる電圧を制御し、プロセッサーおよびその他の要素が使用するDC電圧を安定させることです。

Crystal Oscillator

Crystal Oscillator

水晶発振器は、Arduinoが時間の問題に対処するのに役立ちます。 Arduinoはどのように時間を計算しますか? 答えは、水晶発振器を使用することです。 Arduinoクリスタルの上部に印刷されている数字は16.000H9Hです。 周波数が16,000,000ヘルツまたは16 MHzであることがわかります。

Arduino Reset

Arduino Reset

Arduinoボードをリセットできます。つまり、プログラムを最初から開始できます。 UNOボードは2つの方法でリセットできます。 まず、ボードのリセットボタン(17)を使用します。 次に、外部リセットボタンをRESETというラベルの付いたArduinoピンに接続できます(5)。

Pins

Pins (3.3, 5, GND, Vin)

  • 3.3V(6)-3.3出力ボルトを供給
  • 5V(7)-5出力ボルトを供給
  • Arduinoボードで使用されるコンポーネントのほとんどは、3.3ボルトと5ボルトで正常に動作します。
  • GND(8)(グランド)-ArduinoにはいくつかのGNDピンがありますが、いずれも回路の接地に使用できます。 *Vin(9)-このピンは、AC主電源などの外部電源からArduinoボードに電力を供給するためにも使用できます。
Analog pins
  • Analog pins*

Arduino UNOボードには、6つのアナログ入力ピンA0〜A5があります。 これらのピンは、湿度センサーや温度センサーなどのアナログセンサーから信号を読み取り、マイクロプロセッサーが読み取れるデジタル値に変換できます。

Main microcontroller

Main microcontroller

各Arduinoボードには独自のマイクロコントローラーがあります(11)。 ボードの頭脳と見なすことができます。 ArduinoのメインIC(集積回路)は、ボードごとにわずかに異なります。 マイクロコントローラーは、通常、ATMEL Companyのものです。 Arduino IDEから新しいプログラムをロードする前に、ボードのICを知っておく必要があります。 この情報は、ICの上部にあります。 ICの構造と機能の詳細については、データシートを参照してください。

ICSP pin

ICSP pin

ほとんどの場合、ICSP(12)はAVRであり、MOSI、MISO、SCK、RESET、VCC、およびGNDで構成されるArduinoの小さなプログラミングヘッダーです。 多くの場合、SPI(Serial Peripheral Interface)と呼ばれ、出力の「拡張」と見なすことができます。 実際、SPIバスのマスターに対して出力デバイスをスレーブ化しています。

Power LED indicator

Power LED indicator

Arduinoを電源に接続すると、このLEDが点灯し、ボードの電源が正しく入っていることを示します。 このライトが点灯しない場合は、接続に問題があります。

TX and RX LEDs

TX and RX LEDs

ボードには、TX(送信)とRX(受信)の2つのラベルがあります。 Arduino UNOボードの2つの場所に表示されます。 まず、デジタルピン0および1で、シリアル通信を担当するピンを示します。 次に、TXとRXが主導しました(13)。 TXは、シリアルデータの送信中に異なる速度で点滅します。 点滅の速度は、ボードが使用するボーレートによって異なります。 受信プロセス中にRXが点滅します。

Digital I/O

Digital I/O

Arduino UNOボードには14のデジタルI/Oピン(15)があります(そのうち6つはPWM(パルス幅変調)出力を提供します)。 これらのピンは、論理値(0または1)を読み取る入力デジタルピンとして、またはLED、リレーなどのさまざまなモジュールを駆動するデジタル出力ピンとして機能するように構成できます。 「〜」というラベルの付いたピンを使用して、PWMを生成できます。

AREF

AREF

AREFはアナログリファレンスの略です。 アナログ入力ピンの上限として、外部基準電圧(0〜5ボルト)を設定するために使用されることがあります。

Arduino-インストール

Arduino UNOボードの主要部分について学習した後、Arduino IDEのセットアップ方法を学習する準備が整いました。 これを学習したら、プログラムをArduinoボードにアップロードする準備が整います。

このセクションでは、コンピューターにArduino IDEをセットアップし、USBケーブルを介してプログラムを受信するためにボードを準備する方法を簡単な手順で学習します。

  • ステップ1 *-まず、Arduinoボード(お好みのボードを選択できます)とUSBケーブルが必要です。 Arduino UNO、Arduino Duemilanove、Nano、Arduino Mega 2560、またはDiecimilaを使用する場合、次の図に示すように、USBプリンターに接続する標準のUSBケーブル(AプラグからBプラグ)が必要です。

USBケーブル

Arduino Nanoを使用する場合は、次の図に示すように、代わりにAからMini-Bへのケーブルが必要です。

ミニケーブル

ステップ2-Arduino IDEソフトウェアをダウンロードします。

Arduino公式Webサイトのhttps://www.arduino.cc/en/Main/Software [ダウンロードページ]からArduino IDEのさまざまなバージョンを入手できます。 オペレーティングシステム(Windows、IOS、またはLinux)と互換性のあるソフトウェアを選択する必要があります。 ファイルのダウンロードが完了したら、ファイルを解凍します。

Arduino Nightly Windowsを開く

ステップ3-ボードの電源を入れます。

Arduino Uno、Mega、Duemilanoove、およびArduino Nanoは、コンピューターへのUSB接続または外部電源から自動的に電力を消費します。 Arduino Diecimilaを使用している場合、USB接続から電力を引き出すようにボードが構成されていることを確認する必要があります。 電源はジャンパーで選択されます。ジャンパーは、USBジャックと電源ジャックの間の3本のピンのうちの2本に合う小さなプラスチックです。 USBポートに最も近い2つのピンにあることを確認します。

USBケーブルを使用してArduinoボードをコンピューターに接続します。 緑色の電源LED(PWRのラベル)が点灯します。

ステップ4-Arduino IDEを起動します。

Arduino IDEソフトウェアをダウンロードしたら、フォルダーを解凍する必要があります。 フォルダー内には、無限大ラベル(application.exe)が付いたアプリケーションアイコンがあります。 アイコンをダブルクリックして、IDEを起動します。

Arduino IDEの起動

ステップ5-最初のプロジェクトを開きます。

ソフトウェアが起動したら、2つのオプションがあります-

  • 新しいプロジェクトを作成してください。
  • 既存のプロジェクト例を開きます。

新しいプロジェクトを作成するには、ファイル→*新規*を選択します。

ファイルの編集

既存のプロジェクト例を開くには、ファイル→例→基本→点滅を選択します。

プロジェクトを開く

ここでは、 Blink という名前のサンプルを1つだけ選択しています。 いくらかの時間遅延でLEDをオン/オフします。 リストから他の例を選択できます。

ステップ6-Arduinoボードを選択します。

プログラムをボードにアップロードする際のエラーを回避するには、コンピューターに接続されているボードと一致する正しいArduinoボード名を選択する必要があります。

[ツール]→[ボード]に移動し、ボードを選択します。

ボードの選択

ここでは、チュートリアルに従ってArduino Unoボードを選択しましたが、使用しているボードに一致する名前を選択する必要があります。

ステップ7-シリアルポートを選択します。

Arduinoボードのシリアルデバイスを選択します。 [ツール]→[シリアルポート]メニューに移動します。 これはおそらくCOM3以上です(COM1とCOM2は通常、ハードウェアシリアルポート用に予約されています)。 確認するには、Arduinoボードを切断してメニューを再度開きます。表示されなくなるエントリはArduinoボードのものです。 ボードを再接続し、そのシリアルポートを選択します。

シリアルポート

ステップ8-プログラムをボードにアップロードします。

ボードにプログラムをアップロードする方法を説明する前に、Arduino IDEツールバーに表示される各シンボルの機能を実証する必要があります。

プログラムのアップロード

*A* -コンパイルエラーがあるかどうかを確認するために使用されます。
*B* -Arduinoボードにプログラムをアップロードするために使用されます。
*C* -新しいスケッチの作成に使用されるショートカット。
*D* -サンプルスケッチの1つを直接開くために使用します。
*E* -スケッチの保存に使用されます。
*F* -ボードからシリアルデータを受信し、ボードにシリアルデータを送信するために使用されるシリアルモニター。

ここで、環境内の[アップロード]ボタンをクリックするだけです。 数秒待ちます。ボードのRXおよびTX LEDが点滅します。 アップロードが成功すると、ステータスバーに「アップロードが完了しました」というメッセージが表示されます。

-Arduino Mini、NG、またはその他のボードを使用している場合、Arduinoソフトウェアのアップロードボタンをクリックする直前に、ボード上の物理的にリセットボタンを押す必要があります。

Arduino-プログラム構造

この章では、Arduinoプログラムの構造を詳細に検討し、Arduinoの世界で使用される新しい用語を学習します。 Arduinoソフトウェアはオープンソースです。 Java環境のソースコードはGPLの下でリリースされ、C/C ++マイクロコントローラーライブラリはLGPLの下にあります。

*Sk​​etch* -最初の新しい用語は、「 *sketch* 」と呼ばれるArduinoプログラムです。

構造

Arduinoプログラムは、構造、値(変数と定数)、*関数*の3つの主要部分に分けることができます。 このチュートリアルでは、Arduinoソフトウェアプログラムについて順を追って説明し、構文エラーやコンパイルエラーなしでプログラムを作成する方法を学びます。

  • 構造*から始めましょう。 ソフトウェア構造は、2つの主な機能で構成されています-
  • Setup()関数
  • Loop()関数

構造

Void setup ( ) {

}
  • 目的-スケッチの開始時に* setup()*関数が呼び出されます。 変数の初期化、ピンモード、ライブラリの使用開始などに使用します。 セットアップ機能は、Arduinoボードの電源投入またはリセットのたびに1回だけ実行されます。
  • 入力--
  • 出力--
  • リターン--
Void Loop ( ) {

}
  • PURPOSE -初期値を初期化および設定する* setup()関数を作成した後、 loop()*関数はその名前が示すとおりに正確に実行し、プログラムを変更して応答できるように連続してループします。 Arduinoボードを積極的に制御するために使用します。
  • 入力--
  • 出力--
  • リターン--

Arduino-データ型

Cのデータ型は、さまざまな型の変数または関数を宣言するために使用される広範なシステムを指します。 変数のタイプによって、ストレージ内で占めるスペースの量と、格納されているビットパターンの解釈方法が決まります。

次の表は、Arduinoプログラミング中に使用するすべてのデータ型を示しています。

void Boolean char Unsigned char byte int Unsigned int word
long Unsigned long short float double array String-char array String-object

void

voidキーワードは、関数宣言でのみ使用されます。 関数は、呼び出し元の関数に情報を返さないと予想されることを示します。

Void Loop ( ) {
  //rest of the code
}

ブール値

ブール値は、trueまたはfalseの2つの値のいずれかを保持します。 各ブール変数は1バイトのメモリを占有します。

boolean val = false ;//declaration of variable with type boolean and initialize it with false
boolean state = true ;//declaration of variable with type boolean and initialize it with true

Char

文字値を格納するメモリの1バイトを占有するデータ型。 文字リテラルは「A」のように一重引用符で記述され、複数の文字の場合、文字列は二重引用符「ABC」を使用します。

ただし、文字は数字として保存されます。 特定のエンコーディングはhttps://www.arduino.cc/en/Reference/ASCIIchart[ASCIIチャート]で確認できます。 これは、文字の算術演算を実行できることを意味します。この場合、文字のASCII値が使用されます。 たとえば、大文字AのASCII値は65であるため、 'A' + 1の値は66です。

Char chr_a = ‘a’ ;//declaration of variable with type char and initialize it with character a
Char chr_c = 97 ;//declaration of variable with type char and initialize it with character 97

ASCII文字テーブル

符号なし文字

*Unsigned char* は、1バイトのメモリを占有する符号なしデータ型です。 unsigned charデータ型は、0〜255の数値をエンコードします。

Unsigned Char chr_y = 121 ;//declaration of variable with type Unsigned char and initialize it with character y

byte

バイトには、0〜255の8ビット符号なし数値が格納されます。

byte m = 25 ;//declaration of variable with type byte and initialize it with 25

int

整数は、数値ストレージの主要なデータ型です。 intは16ビット(2バイト)値を格納します。 これにより、-32,768〜32,767の範囲が得られます(最小値は-2 ^ 15、最大値は(2 ^ 15)-1)。

*int* サイズはボードごとに異なります。 たとえば、Arduino Dueでは、 *int* に32ビット(4バイト)値が格納されます。 これにより、-2,147,483,648から2,147,483,647の範囲が得られます(最小値は-2 ^ 31、最大値は(2 ^ 31)-1)。

int counter = 32 ;//declaration of variable with type int and initialize it with 32

符号なし整数

符号なし整数(符号なし整数)は、2バイト値を格納する方法がintと同じです。 ただし、負の数を格納する代わりに、正の値のみを格納するため、有効な範囲は0〜65,535(2 ^ 16)-1)になります。 Dueは、0〜4,294,967,295(2 ^ 32-1)の範囲の4バイト(32ビット)値を格納します。

Unsigned int counter = 60 ;//declaration of variable with
   type unsigned int and initialize it with 60

Word

Unoおよび他のATMEGAベースのボードでは、1ワードに16ビットの符号なし数値が格納されます。 Due and Zeroでは、32ビットの符号なし数値を格納します。

word w = 1000 ;//declaration of variable with type word and initialize it with 1000

Long

ロング変数は、数値ストレージ用の拡張サイズ変数で、-2,147,483,648から2,147,483,647までの32ビット(4バイト)を格納します。

Long velocity = 102346 ;//declaration of variable with type Long and initialize it with 102346

符号なしロング

符号なしlong変数は、数値ストレージ用の拡張サイズ変数であり、32ビット(4バイト)を格納します。 標準のlongとは異なり、unsigned longは負の数値を格納せず、その範囲は0〜4,294,967,295(2 ^ 32-1)になります。

Unsigned Long velocity = 101006 ;//declaration of variable with
   type Unsigned Long and initialize it with 101006

ショート

ショートは16ビットのデータ型です。 すべてのArduino(ATMegaおよびARMベース)では、shortは16ビット(2バイト)値を格納します。 これにより、-32,768〜32,767の範囲が得られます(最小値は-2 ^ 15、最大値は(2 ^ 15)-1)。

short val = 13 ;//declaration of variable with type short and initialize it with 13

浮く

浮動小数点数のデータ型は、小数点を持つ数値です。 浮動小数点数は、整数よりも解像度が高いため、アナログ値と連続値を近似するためによく使用されます。

浮動小数点数は最大3.4028235E + 38から最小-3.4028235E + 38まで可能です。 これらは32ビット(4バイト)の情報として保存されます。

float num = 1.352;//declaration of variable with type float and initialize it with 1.352

ダブル

Unoおよび他のATMEGAベースのボードでは、倍精度浮動小数点数は4バイトを占有します。 つまり、double実装はfloatとまったく同じであり、精度は向上しません。 Arduino Dueでは、doubleの精度は8バイト(64ビット)です。

double num = 45.352 ;//declaration of variable with type double and initialize it with 45.352

Arduino-変数と定数

私たちが確認する必要がある非常に重要な主題である変数のタイプの説明を始める前に、あなたは完全に理解していることを*変数スコープ*と呼びます。

可変スコープとは何ですか?

Arduinoが使用するCプログラミング言語の変数には、scopeというプロパティがあります。 スコープはプログラムの領域であり、変数を宣言できる場所は3つあります。 彼らは-

  • *ローカル変数*と呼ばれる関数またはブロック内。
  • *仮パラメータ*と呼ばれる関数パラメータの定義。
  • *グローバル変数*と呼ばれるすべての関数の外側。

ローカル変数

関数またはブロック内で宣言される変数はローカル変数です。 それらは、その関数またはコードブロック内にあるステートメントでのみ使用できます。 ローカル変数は、それ自身の外部で機能することは知られていません。 以下は、ローカル変数を使用した例です-

Void setup () {

}

Void loop () {
   int x , y ;
   int z ; Local variable declaration
   x = 0;
   y = 0; actual initialization
   z = 10;
}

グローバル変数

グローバル変数は、すべての関数の外側、通常はプログラムの上部で定義されます。 グローバル変数は、プログラムの存続期間を通じてその値を保持します。

グローバル変数には、どの関数からもアクセスできます。 つまり、グローバル変数は、宣言後、プログラム全体で使用できます。

次の例では、グローバル変数とローカル変数を使用します-

Int T , S ;
float c = 0 ; Global variable declaration

Void setup () {

}

Void loop () {
   int x , y ;
   int z ; Local variable declaration
   x = 0;
   y = 0; actual initialization
   z = 10;
}

Arduino-オペレーター

演算子は、特定の数学関数または論理関数を実行するようコンパイラーに指示する記号です。 C言語は組み込みの演算子が豊富であり、次の種類の演算子を提供します-

  • 算術演算子
  • 比較演算子
  • ブール演算子
  • ビット演算子
  • 複合演算子

算術演算子

変数Aが10を保持し、変数Bが20を保持すると仮定します-

リンク:/arduino/arduino_arithmetic_operators [例を表示]

Operator name Operator simple Description Example
assignment operator = Stores the value to the right of the equal sign in the variable to the left of the equal sign. A = B
addition PLUS Adds two operands A PLUS B will give 30
subtraction - Subtracts second operand from the first A - B will give -10
multiplication * Multiply both operands A* B will give 200
division / Divide numerator by denominator B/A will give 2
modulo % Modulus Operator and remainder of after an integer division B % A will give 0

比較演算子

変数Aが10を保持し、変数Bが20を保持すると仮定します-

link:/arduino/arduino_comparison_operators [例を表示]

Operator name Operator simple Description Example
equal to == Checks if the value of two operands is equal or not, if yes then condition becomes true. (A == B) is not true
not equal to != Checks if the value of two operands is equal or not, if values are not equal then condition becomes true. (A != B) is true
less than < Checks if the value of left operand is less than the value of right operand, if yes then condition becomes true. (A < B) is true
greater than > Checks if the value of left operand is greater than the value of right operand, if yes then condition becomes true. (A > B) is not true
less than or equal to Checks if the value of left operand is less than or equal to the value of right operand, if yes then condition becomes true. (A ⇐ B) is true
greater than or equal to >= Checks if the value of left operand is greater than or equal to the value of right operand, if yes then condition becomes true. (A >= B) is not true

ブール演算子

変数Aが10を保持し、変数Bが20を保持すると仮定します-

リンク:/arduino/arduino_boolean_operators [例を表示]

Operator name Operator simple Description Example
and && Called Logical AND operator. If both the operands are non-zero then then condition becomes true. (A && B) is true
or
Called Logical OR Operator. If any of the two operands is non-zero then then condition becomes true. (A B) is true
not ! Called Logical NOT Operator. Use to reverses the logical state of its operand. If a condition is true then Logical NOT operator will make false. !(A && B) is false

ビット演算子

変数Aが60を保持し、変数Bが13を保持すると仮定します-

link:/arduino/arduino_bitwise_operators [例を表示]

Operator name Operator simple Description Example
and & Binary AND Operator copies a bit to the result if it exists in both operands. (A & B) will give 12 which is 0000 1100
or Binary OR Operator copies a bit if it exists in either operand
(A B) will give 61 which is 0011 1101 xor ^
Binary XOR Operator copies the bit if it is set in one operand but not both. (A ^ B) will give 49 which is 0011 0001 not ~
Binary Ones Complement Operator is unary and has the effect of 'flipping' bits. (~A ) will give -60 which is 1100 0011 shift left <<
Binary Left Shift Operator. The left operands value is moved left by the number of bits specified by the right operand. A << 2 will give 240 which is 1111 0000 shift right >>

複合演算子

変数Aが10を保持し、変数Bが20を保持すると仮定します-

link:/arduino/arduino_compound_operators [例を表示]

Operator name Operator simple Description Example
increment PLUSPLUS Increment operator, increases integer value by one APLUSPLUS will give 11
decrement  —  Decrement operator, decreases integer value by one A-- will give 9
compound addition PLUS= Add AND assignment operator. It adds right operand to the left operand and assign the result to left operand B PLUS= A is equivalent to B = BPLUS A
compound subtraction -= Subtract AND assignment operator. It subtracts right operand from the left operand and assign the result to left operand B -= A is equivalent to B = B - A
compound multiplication *= Multiply AND assignment operator. It multiplies right operand with the left operand and assign the result to left operand B*= A is equivalent to B = B* A
compound division /= Divide AND assignment operator. It divides left operand with the right operand and assign the result to left operand B/= A is equivalent to B = B/A
compound modulo %= Modulus AND assignment operator. It takes modulus using two operands and assign the result to left operand B %= A is equivalent to B = B % A
compound bitwise or = bitwise inclusive OR and assignment operator
A = 2 is same as A = A 2 compound bitwise and

Arduino-制御ステートメント

意思決定構造では、プログラマがプログラムで評価またはテストする1つ以上の条件を指定する必要があります。 条件が真であると判断された場合に実行される1つ以上のステートメント、およびオプションで、条件が偽であると判断された場合に実行される他のステートメントと一緒にする必要があります。

以下は、ほとんどのプログラミング言語で見られる典型的な意思決定構造の一般的な形式です-

意思決定

制御ステートメントは、プログラム実行のフローを制御するソースコードの要素です。 彼らは-

S.NO. Control Statement & Description
1

If statement

括弧で囲まれた式と、ステートメントまたはステートメントのブロックを取ります。 式が真の場合、ステートメントまたはステートメントのブロックが実行されます。それ以外の場合、これらのステートメントはスキップされます。

2

If …else statement

  • if* ステートメントの後に、オプションのelseステートメントを続けることができます。これは、式が偽の場合に実行されます。
3

If…else if …else statement

  • if* ステートメントの後にオプションの *else if ... else* ステートメントを続けることができます。これは、単一のif ... else ifステートメントを使用してさまざまな条件をテストするのに非常に便利です。
4

switch case statement

ifステートメントと同様に、 switch …​ case は、プログラマがさまざまな条件で実行される異なるコードを指定できるようにすることで、プログラムのフローを制御します。

5

Conditional Operator ? :

条件付き演算子 :はCの唯一の三項演算子です。

Arduino-ループ

プログラミング言語は、より複雑な実行パスを可能にするさまざまな制御構造を提供します。

ループステートメントを使用すると、ステートメントまたはステートメントのグループを複数回実行できます。ほとんどのプログラミング言語では、ループステートメントの一般的な形式は次のとおりです-

ループアーキテクチャ

Cプログラミング言語は、ループ要件を処理するために次のタイプのループを提供します。

S.NO. Loop & Description
1

while loop

whileループは、括弧内の式()がfalseになるまで、継続的に無限にループします。 テストされた変数を変更する必要があります。変更しないと、whileループは終了しません。

2

do…while loop

  • do…while* ループはwhileループに似ています。 whileループでは、ループ本体が実行される前に、ループの継続条件がループの開始時にテストされます。
3

for loop

  • forループ*は、事前定義された回数だけステートメントを実行します。 ループの制御式は、forループの括弧内で完全に初期化、テスト、および操作されます。
4

Nested Loop

C言語では、1つのループを別のループ内で使用できます。 次の例は、概念を示しています。

5

Infinite loop

終了条件のないループなので、ループは無限になります。

Arduino-関数

関数を使用すると、個々のタスクを実行するコードのセグメントでプログラムを構成できます。 関数を作成する一般的なケースは、プログラムで同じアクションを複数回実行する必要がある場合です。

関数へのコードフラグメントの標準化には、いくつかの利点があります-

  • 関数は、プログラマが整理された状態を保つのに役立ちます。 多くの場合、これはプログラムの概念化に役立ちます。
  • 関数は1つの場所で1つのアクションを体系化するため、関数は1回だけ考えてデバッグするだけで済みます。
  • これにより、コードを変更する必要がある場合に、変更中にエラーが発生する可能性も低くなります。
  • 関数は、コードのセクションが何度も再利用されるため、スケッチ全体をより小さく、よりコンパクトにします。
  • モジュール化することで、他のプログラムでコードを再利用しやすくなり、関数を使用するとコードが読みやすくなります。

Arduinoスケッチまたはプログラムには2つの必須機能があります。 setup()およびloop()。 他の関数は、これら2つの関数の括弧の外側に作成する必要があります。

関数を定義するための最も一般的な構文は-

関数

関数宣言

関数は、他の関数の外側、ループ関数の上または下で宣言されます。

私たちは2つの異なる方法で関数を宣言することができます-

最初の方法は、ループ関数の上に*関数プロトタイプ*と呼ばれる関数の一部を書くだけです。

  • 関数の戻り値のタイプ
  • 機能名
  • 関数の引数の型、引数名を書く必要はありません

関数プロトタイプの後にはセミコロン(;)が必要です。

次の例は、最初のメソッドを使用した関数宣言のデモを示しています。

int sum_func (int x, int y)//function declaration {
   int z = 0;
   z = x+y ;
   return z;//return the value
}

void setup () {
   Statements//group of statements
}

Void loop () {
   int result = 0 ;
   result = Sum_func (5,6) ;//function call
}

関数の定義または宣言と呼ばれる2番目の部分は、で構成されるループ関数の下で宣言する必要があります-

  • 関数の戻り値のタイプ
  • 機能名
  • 関数の引数タイプ、ここでは引数名を追加する必要があります
  • 関数本体(関数が呼び出されたときに実行される関数内のステートメント)

次の例は、2番目のメソッドを使用した関数の宣言を示しています。

int sum_func (int , int ) ;//function prototype

void setup () {
   Statements//group of statements
}

Void loop () {
   int result = 0 ;
   result = Sum_func (5,6) ;//function call
}

int sum_func (int x, int y)//function declaration {
   int z = 0;
   z = x+y ;
   return z;//return the value
}

2番目のメソッドは、ループ関数の上に関数を宣言するだけです。

Arduino-文字列

文字列はテキストの保存に使用されます。 これらは、LCDまたはArduino IDEシリアルモニターウィンドウにテキストを表示するために使用できます。 文字列は、ユーザー入力を保存するのにも役立ちます。 たとえば、ユーザーがArduinoに接続されたキーパッドで入力する文字。

Arduinoプログラミングには2種類の文字列があります-

  • Cプログラミングで使用される文字列と同じ文字の配列。
  • Arduino文字列。スケッチで文字列オブジェクトを使用できます。

この章では、文字列、オブジェクト、およびArduinoスケッチでの文字列の使用について学習します。 この章の終わりまでに、スケッチで使用する文字列の種類を学習します。

文字列文字配列

学習する文字列の最初のタイプは、 char タイプの一連の文字である文字列です。 前の章で、配列とは何かを学びました。メモリに保存された同じタイプの変数の連続したシリーズ。 文字列は、char変数の配列です。

文字列は、文字列の末尾に1つの余分な要素を含む特別な配列であり、常に0(ゼロ)の値を持ちます。 これは「ヌル終了文字列」として知られています。

文字列文字配列の例

この例では、文字列を作成してシリアルモニターウィンドウに出力する方法を示します。

  • 例 *
void setup() {
   char my_str[6];//an array big enough for a 5 character string
   Serial.begin(9600);
   my_str[0] = 'H';//the string consists of 5 characters
   my_str[1] = 'e';
   my_str[2] = 'l';
   my_str[3] = 'l';
   my_str[4] = 'o';
   my_str[5] = 0;//6th array element is a null terminator
   Serial.println(my_str);
}

void loop() {

}

次の例は、文字列の構成を示しています。印刷可能な文字と、文字列が終了する場所であることを示すための配列の最後の要素として0を含む文字配列。* Serial.println()*を使用して文字列の名前を渡すことにより、文字列をArduino IDEシリアルモニターウィンドウに出力できます。

この同じ例は、以下に示すように、より便利な方法で書くことができます-

void setup() {
   char my_str[] = "Hello";
   Serial.begin(9600);
   Serial.println(my_str);
}

void loop() {

}

このスケッチでは、コンパイラは文字列配列のサイズを計算し、文字列をゼロで自動的にnullで終了します。 長さが6要素で、5文字にゼロが続く配列は、前のスケッチとまったく同じ方法で作成されます。

文字列配列の操作

次のスケッチに示すように、スケッチ内の文字列配列を変更できます。

void setup() {
   char like[] = "I like coffee and cake";//create a string
   Serial.begin(9600);
  //(1) print the string
   Serial.println(like);
  //(2) delete part of the string
   like[13] = 0;
   Serial.println(like);
  //(3) substitute a word into the string
   like[13] = ' ';//replace the null terminator with a space
   like[18] = 't';//insert the new word
   like[19] = 'e';
   like[20] = 'a';
   like[21] = 0;//terminate the string
   Serial.println(like);
}

void loop() {

}

結果

I like coffee and cake
I like coffee
I like coffee and tea

スケッチは次のように機能します。

文字列の作成と印刷

上記のスケッチでは、新しい文字列が作成され、シリアルモニターウィンドウに表示するために印刷されます。

ひもを短くする

文字列は、文字列の14番目の文字をヌル終了ゼロ(2)に置き換えることにより短縮されます。 これは、0からカウントする文字列配列の要素番号13です。

文字列が印刷されるとき、すべての文字はゼロを終了する新しいヌルまで印刷されます。 他のキャラクターは消えません。それらはまだメモリ内に存在し、文字列配列は同じサイズのままです。 唯一の違いは、文字列を処理する関数は、最初のnullターミネーターまでの文字列のみを見るということです。

文字列内の単語を変更する

最後に、スケッチは「ケーキ」という単語を「茶」に置き換えます(3)。 文字列が最初に作成された形式に復元されるように、最初にlike [13]のヌルターミネータをスペースに置き換える必要があります。

新しい文字は、単語「cake」の「cak」を単語「tea」で上書きします。 これは、個々の文字を上書きすることによって行われます。 「ケーキ」の「e」は、新しいヌル終了文字に置き換えられます。 その結果、文字列は実際には2つのヌル文字で終了します。元の文字列は文字列の最後にあり、新しい文字は「ケーキ」の「e」を置き換えます。 文字列を印刷する関数は、最初のヌルターミネータに遭遇すると文字列文字の印刷を停止するため、これは新しい文字列を印刷するときに違いはありません。

文字列配列を操作する関数

前のスケッチでは、文字列内の個々の文字にアクセスすることにより、文字列を手動で操作しました。 文字列配列の操作を簡単にするために、独自の関数を作成してそれを行うか、 C 言語ライブラリの文字列関数の一部を使用できます。

以下は、文字列配列を操作する関数のリストです。

S.No. Functions & Description
1

String()

バージョン0019のコアの一部であるStringクラスを使用すると、文字配列よりも複雑な方法でテキストの文字列を使用および操作できます。 文字列の連結、追加、部分文字列の検索と置換などを行うことができます。 単純な文字配列よりも多くのメモリを必要としますが、より便利です。

参考のために、文字配列は小さな「s」の文字列と呼ばれ、Stringクラスのインスタンスは大文字のSの文字列と呼ばれます。 「二重引用符」で指定された定数文字列は、Stringクラスのインスタンスではなく、char配列として扱われることに注意してください。

2

charAt()

文字列の特定の文字にアクセスします。

3

compareTo()

2つの文字列を比較し、一方が他方の前後に来るかどうか、またはそれらが等しいかどうかをテストします。 文字列は、文字のASCII値を使用して、文字ごとに比較されます。 これは、たとえば、「a」が「b」の前で「A」の後に来ることを意味します。 数字は文字の前に来ます。

4

concat()

パラメータを文字列に追加します。

5

c_str()

文字列の内容をCスタイルのヌル終了文字列として変換します。 これにより、内部文字列バッファに直接アクセスできるため、注意して使用する必要があります。 特に、返されるポインターを使用して文字列を変更しないでください。 Stringオブジェクトを変更した場合、または破棄された場合、c_str()によって以前に返されたポインターは無効になるため、使用しないでください。

6

endsWith()

文字列が別の文字列の文字で終わるかどうかをテストします。

7

equals()

2つの文字列が等しいかどうかを比較します。 比較では大文字と小文字が区別されます。つまり、文字列「hello」は文字列「HELLO」と等しくありません。

8

equalsIgnoreCase()

2つの文字列が等しいかどうかを比較します。 比較では大文字と小文字が区別されません。つまり、String( "hello")はString( "HELLO")と同じです。

9

getBytes()

文字列の文字を指定されたバッファにコピーします。

10

indexOf()

別の文字列内の文字または文字列を見つけます。 デフォルトでは、文字列の先頭から検索しますが、特定のインデックスから開始することもでき、文字または文字列のすべてのインスタンスを見つけることができます。

11

lastIndexOf()

別の文字列内の文字または文字列を見つけます。 デフォルトでは、文字列の末尾から検索しますが、特定のインデックスから逆方向に動作して、文字または文字列のすべてのインスタンスを見つけることもできます。

12

length()

文字列の長さを文字数で返します。 (これには、末尾のヌル文字が含まれないことに注意してください。)

13

remove()

指定されたインデックスから文字列の末尾まで文字列を削除するか、指定されたインデックスからインデックスとカウントまでの文字列を変更します。

14

replace()

String replace()関数を使用すると、特定の文字のすべてのインスタンスを別の文字に置き換えることができます。 replaceを使用して、文字列のサブストリングを別のサブストリングに置き換えることもできます。

15

reserve()

String reserve()関数を使用すると、文字列を操作するためのバッファーをメモリに割り当てることができます。

16

setCharAt()

文字列の文字を設定します。 文字列の既存の長さ以外のインデックスには影響しません。

17

startsWith()

文字列が別の文字列の文字で始まるかどうかをテストします。

18

toCharArray()

文字列の文字を指定されたバッファにコピーします。

19

substring()

文字列の部分文字列を取得します。 開始インデックスは包含的です(対応する文字は部分文字列に含まれます)が、オプションの終了インデックスは排他的です(対応する文字は部分文字列に含まれません)。 終了インデックスが省略された場合、サブストリングはストリングの終わりまで続きます。

20

toInt()

有効な文字列を整数に変換します。 入力文字列は整数で始まる必要があります。 文字列に整数以外の数字が含まれている場合、関数は変換の実行を停止します。

21

toFloat()

有効な文字列をフロートに変換します。 入力文字列は数字で始まる必要があります。 文字列に数字以外の文字が含まれている場合、関数は変換の実行を停止します。 たとえば、文字列「123.45」、「123」、および「123fish」は、それぞれ123.45、123.00、および123.00に変換されます。 「123.456」は123.46に近似していることに注意してください。 また、フロートの精度は10進数で6〜7桁しかないため、長い文字列は切り捨てられる可能性があることに注意してください。

22

toLowerCase()

文字列の小文字バージョンを取得します。 1.0の時点では、toLowerCase()は、新しい文字列を返すのではなく、文字列をその場で変更します。

23

toUpperCase()

文字列の大文字バージョンを取得します。 1.0の時点で、toUpperCase()は新しい文字列を返すのではなく、文字列をその場で変更します。

24

trim()

先頭および末尾の空白が削除されたバージョンの文字列を取得します。 1.0の時点では、trim()は新しい文字列を返すのではなく、その場所で文字列を変更します。

次のスケッチでは、いくつかのC文字列関数を使用しています。

void setup() {
   char str[] = "This is my string";//create a string
   char out_str[40];//output from string functions placed here
   int num;//general purpose integer
   Serial.begin(9600);

  //(1) print the string
   Serial.println(str);

  //(2) get the length of the string (excludes null terminator)
   num = strlen(str);
   Serial.print("String length is: ");
   Serial.println(num);

  //(3) get the length of the array (includes null terminator)
   num = sizeof(str);//sizeof() is not a C string function
   Serial.print("Size of the array: ");
   Serial.println(num);

  //(4) copy a string
   strcpy(out_str, str);
   Serial.println(out_str);

  //(5) add a string to the end of a string (append)
   strcat(out_str, " sketch.");
   Serial.println(out_str);
   num = strlen(out_str);
   Serial.print("String length is: ");
   Serial.println(num);
   num = sizeof(out_str);
   Serial.print("Size of the array out_str[]: ");
   Serial.println(num);
}

void loop() {

}

結果

This is my string
String length is: 17
Size of the array: 18
This is my string
This is my string sketch.
String length is: 25
Size of the array out_str[]: 40

スケッチは次のように機能します。

文字列を印刷する

新しく作成した文字列は、以前のスケッチで行われたように、シリアルモニターウィンドウに出力されます。

文字列の長さを取得する

strlen()関数は、文字列の長さを取得するために使用されます。 文字列の長さは、印刷可能な文字のみであり、ヌルターミネータは含まれません。

文字列には17文字が含まれているため、[シリアルモニター]ウィンドウに17文字が印刷されています。

配列の長さを取得する

演算子sizeof()は、文字列を含む配列の長さを取得するために使用されます。 長さにはヌルターミネータが含まれるため、長さは文字列の長さよりも1つ長くなります。

sizeof()は関数のように見えますが、技術的には演算子です。 これはC文字列ライブラリの一部ではありませんが、配列のサイズと文字列のサイズ(または文字列の長さ)の違いを示すためにスケッチで使用されました。

文字列をコピーする

strcpy()関数は、str []文字列をout_num []配列にコピーするために使用されます。 strcpy()関数は、渡された2番目の文字列を最初の文字列にコピーします。 文字列のコピーがout_num []配列に存在するようになりましたが、配列の18個の要素しか使用しないため、配列には22個の空きchar要素がまだあります。 これらの空き要素は、メモリ内の文字列の後にあります。

文字列は配列にコピーされたので、スケッチの次の部分で使用する配列に余分なスペースがあり、文字列の末尾に文字列が追加されます。

文字列を文字列に追加(連結)

スケッチは1つの文字列を別の文字列に結合します。これは連結として知られています。 これは、strcat()関数を使用して行われます。 strcat()関数は、渡された2番目の文字列を、渡された最初の文字列の最後に置きます。

連結後、文字列の長さが印刷され、新しい文字列の長さが表示されます。 次に、配列の長さが出力され、40要素の配列に25文字の文字列があることが示されます。

ヌル終端ゼロのため、25文字の長い文字列は実際に配列の26文字を占めることに注意してください。

配列の境界

文字列と配列を使用する場合、文字列または配列の境界内で作業することが非常に重要です。 サンプルスケッチでは、文字列の操作に使用できるメモリを割り当てるために、40文字の配列が作成されました。

配列が小さすぎて、配列よりも大きい文字列をコピーしようとした場合、文字列は配列の最後にコピーされます。 配列の末尾を超えるメモリには、スケッチで使用される他の重要なデータが含まれている可能性があり、これらのデータは文字列によって上書きされます。 文字列の末尾を超えるメモリがオーバーランすると、スケッチがクラッシュしたり、予期しない動作が発生する可能性があります。

Arduino-文字列オブジェクト

Arduinoプログラミングで使用される2番目のタイプの文字列は、文字列オブジェクトです。

オブジェクトとは何ですか?

オブジェクトは、データと関数の両方を含む構成体です。 Stringオブジェクトは、変数と同様に作成し、値または文字列を割り当てることができます。 Stringオブジェクトには、Stringオブジェクトに含まれる文字列データを操作する関数(オブジェクト指向プログラミング(OOP)では「メソッド」と呼ばれます)が含まれています。

次のスケッチと説明により、オブジェクトとは何か、Stringオブジェクトの使用方法が明確になります。

void setup() {
   String my_str = "This is my string.";
   Serial.begin(9600);

  //(1) print the string
   Serial.println(my_str);

  //(2) change the string to upper-case
   my_str.toUpperCase();
   Serial.println(my_str);

  //(3) overwrite the string
   my_str = "My new string.";
   Serial.println(my_str);

  //(4) replace a word in the string
   my_str.replace("string", "Arduino sketch");
   Serial.println(my_str);

  //(5) get the length of the string
   Serial.print("String length is: ");
   Serial.println(my_str.length());
}

void loop() {

}

結果

This is my string.
THIS IS MY STRING.
My new string.
My new Arduino sketch.
String length is: 22

文字列オブジェクトが作成され、スケッチの上部に値(または文字列)が割り当てられます。

String my_str = "This is my string." ;

これにより、 my_str という名前のStringオブジェクトが作成され、「This is my string。」という値が与えられます。

これは、変数を作成し、整数などの値を割り当てることと比較できます-

int my_var = 102;

スケッチは次のように機能します。

文字列を印刷する

文字列は、文字配列文字列のように、シリアルモニタウィンドウに出力できます。

文字列を大文字に変換する

作成された文字列オブジェクトmy_strには、操作できる多くの関数またはメソッドがあります。 これらのメソッドは、オブジェクト名の後にドット演算子(。)を使用し、次に使用する関数の名前を使用して呼び出されます。

my_str.toUpperCase();
  • toUpperCase()関数は、String型の *my_str オブジェクトに含まれる文字列を操作し、オブジェクトに含まれる文字列データ(またはテキスト)を大文字に変換します。 Stringクラスに含まれる関数のリストは、Arduino Stringリファレンスにあります。 技術的には、Stringはクラスと呼ばれ、Stringオブジェクトの作成に使用されます。

文字列を上書きする

割り当て演算子は、古い文字列を置き換える my_str オブジェクトに新しい文字列を割り当てるために使用されます

my_str = "My new string." ;

代入演算子は文字配列文字列では使用できませんが、文字列オブジェクトでのみ機能します。

文字列内の単語を置き換える

replace()関数は、渡された最初の文字列を、渡された2番目の文字列で置き換えるために使用されます。 replace()は、Stringクラスに組み込まれている別の関数であるため、Stringオブジェクトmy_strで使用できます。

文字列の長さを取得する

文字列の長さの取得は、length()を使用して簡単に実行できます。 サンプルスケッチでは、length()によって返される結果は、中間変数を使用せずにSerial.println()に直接渡されます。

文字列オブジェクトを使用する場合

Stringオブジェクトは、文字列の文字配列よりもはるかに使いやすいです。 オブジェクトには、文字列に対して多数の操作を実行できる組み込み関数があります。

Stringオブジェクトを使用する主な欠点は、大量のメモリを使用し、ArduinosのRAMメモリをすぐに使い果たす可能性があることです。これにより、Arduinoがハング、クラッシュ、または予期せず動作する可能性があります。 Arduinoのスケッチが小さく、オブジェクトの使用が制限されている場合、問題はないはずです。

文字配列文字列の使用はより難しく、これらのタイプの文字列を操作するには独自の関数を作成する必要がある場合があります。 利点は、作成する文字列配列のサイズを制御できるため、配列を小さくしてメモリを節約できることです。

文字列配列の配列境界の終わりを超えて書き込まないようにする必要があります。 文字列オブジェクトにはこの問題はなく、操作するのに十分なメモリがあれば、文字列の境界を処理します。 Stringオブジェクトは、メモリが不足すると存在しないメモリに書き込もうとすることができますが、操作対象の文字列の末尾には上書きしません。

文字列が使用される場所

この章では、文字列、メモリ内での文字列の動作、および操作について学習しました。

文字列の実際の使用については、シリアルモニターウィンドウからユーザー入力を取得し、入力を文字列に保存する方法を学習するときに、このコースの次のパートで取り上げます。

Arduino-時間

Arduinoは4つの異なる時間操作機能を提供します。 彼らは-

S.No. Function & Description
1

delay () function

  • delay()*関数の動作方法は非常に簡単です。 単一の整数(または数値)引数を受け入れます。 この数値は時間を表します(ミリ秒単位で測定)。
2

delayMicroseconds () function

  • delayMicroseconds()*関数は、単一の整数(または数値)引数を受け入れます。 1ミリ秒には1000マイクロ秒、1秒には100万マイクロ秒があります。
3

millis () function

この関数は、Arduinoボードが現在のプログラムの実行を開始する時点のミリ秒数を返すために使用されます。

4

micros () function

micros()関数はその時点からのマイクロ秒数を返し、Arduinoボードは現在のプログラムの実行を開始します。 この数はオーバーフローします 約70分後にゼロに戻ります。

Arduino-配列

アレイは、同じタイプの連続したメモリロケーションのグループです。 配列内の特定の場所または要素を参照するには、配列の名前と配列内の特定の要素の位置番号を指定します。

以下の図は、11個の要素を含むCという整数配列を示しています。 これらの要素のいずれかを参照するには、配列名の後に角括弧([])で特定の要素の位置番号を指定します。 位置番号は、正式には添え字またはインデックスと呼ばれます(この番号は、配列の先頭からの要素の数を指定します)。 最初の要素の添え字は0(ゼロ)であり、ゼロ要素と呼ばれることもあります。

したがって、配列Cの要素はC [0](「C sub zero」と発音)、C [1]、C [2]などです。 配列Cの最高の添え字は10で、これは配列の要素数(1)より1少ない値です。 配列名は、他の変数名と同じ規則に従います。

配列の要素

添え字は、整数または整数式(整数型を使用)でなければなりません。 プログラムが式を添え字として使用する場合、プログラムは式を評価して添え字を決定します。 たとえば、変数aが5に等しく、変数bが6に等しいと仮定すると、ステートメントは配列要素C [11]に2を追加します。

添え字付き配列名は左辺値であり、配列以外の変数名と同様に、代入の左側で使用できます。

与えられた図の配列Cをより詳しく調べてみましょう。 配列全体の名前はCです。 その11個の要素は、C [0]〜C [10]と呼ばれます。 C [0]の値は-45、C [1]の値は6、C [2]の値は0、C [7]の値は62、C [10]の値は78。

配列Cの最初の3つの要素に含まれる値の合計を印刷するには、次のように書きます-

Serial.print (C[ 0 ] + C[ 1 ] + C[ 2 ] );

C [6]の値を2で除算し、結果を変数xに割り当てるには、次のように記述します-

x = C[ 6 ]/2;

配列の宣言

配列はメモリ内のスペースを占有します。 配列に必要な要素の型と要素の数を指定するには、次の形式の宣言を使用します-

type arrayName [ arraySize ] ;

コンパイラは適切な量のメモリを確保します。 (メモリを予約する宣言は、定義としてより適切に知られていることを思い出してください)。 arraySizeは、ゼロより大きい整数定数でなければなりません。 たとえば、整数配列Cの11個の要素を予約するようにコンパイラに指示するには、宣言を使用します-

int C[ 12 ];//C is an array of 12 integers

配列は、非参照データ型の値を含むように宣言できます。 たとえば、文字列型の配列を使用して文字列を格納できます。

配列を使用した例

このセクションでは、配列を宣言、初期化、操作する方法を示す多くの例を示します。

例1:配列を宣言し、ループを使用して配列の要素を初期化する

プログラムは、10要素の整数配列 n を宣言します。 行a〜bは、配列要素をゼロに初期化するために For ステートメントを使用します。 他の自動変数と同様に、自動配列は暗黙的にゼロに初期化されません。 最初の出力ステートメント(行c)は、後続のforステートメント(行d〜e)で印刷された列の列見出しを表示し、表形式で配列を印刷します。

int n[ 10 ] ;//n is an array of 10 integers

void setup () {

}

void loop () {
   for ( int i = 0; i < 10; ++i )//initialize elements of array n to 0 {
      n[ i ] = 0;//set element at location i to 0
      Serial.print (i) ;
      Serial.print (‘\r’) ;
   }
   for ( int j = 0; j < 10; ++j )//output each array element's value {
      Serial.print (n[j]) ;
      Serial.print (‘\r’) ;
   }
}

結果-次の結果が生成されます-

Element Value

0

1

2

3

4

5

6

7

8

9

0

0

0

0

0

0

0

0

0

0

例2:初期化子リストを使用した宣言での配列の初期化

配列の要素は、配列名の後に等号と括弧で区切られたコンマ区切りの初期化子のリストを続けることにより、配列宣言で初期化することもできます。 このプログラムは、初期化リストを使用して10個の値で整数配列を初期化し(行a)、配列を表形式(行b〜c)で出力します。

//n is an array of 10 integers
int n[ 10 ] = { 32, 27, 64, 18, 95, 14, 90, 70, 60, 37 } ;

void setup () {

}

void loop () {
   for ( int i = 0; i < 10; ++i ) {
      Serial.print (i) ;
      Serial.print (‘\r’) ;
   }
   for ( int j = 0; j < 10; ++j )//output each array element's value {
      Serial.print (n[j]) ;
      Serial.print (‘\r’) ;
   }
}

結果-次の結果が生成されます-

Element Value

0

1

2

3

4

5

6

7

8

9

a

32

27

64

18

95

14

90

70

60

37

例3:配列の要素を合計する

多くの場合、配列の要素は、計算で使用される一連の値を表します。 たとえば、配列の要素が試験の成績を表す場合、教授は配列の要素を合計し、その合計を使用して試験のクラス平均を計算できます。 プログラムは、10要素の整数配列 a に含まれる値を合計します。

const int arraySize = 10;//constant variable indicating size of array
int a[ arraySize ] = { 87, 68, 94, 100, 83, 78, 85, 91, 76, 87 };
int total = 0;

void setup () {

}
void loop () {
  //sum contents of array a
   for ( int i = 0; i < arraySize; ++i )
      total += a[ i ];
   Serial.print (“Total of array elements : ”) ;
   Serial.print(total) ;
}

結果-次の結果が生成されます-

Total of array elements: 849

配列はArduinoにとって重要であり、さらに注意が必要です。 配列に関連する次の重要な概念は、Arduinoに明確である必要があります-

S.NO. Concept & Description
1

Passing Arrays to Functions

関数に配列引数を渡すには、角括弧なしで配列の名前を指定します。

2

Multi-Dimensional Arrays

2次元の配列(つまり、添字)は、多くの場合、行と列に配置された情報で構成される値のテーブルを表します。

Arduino-I/O関数

Arduinoボードのピンは、入力または出力として構成できます。 これらのモードでのピンの機能について説明します。 Arduinoアナログピンの大部分は、デジタルピンとまったく同じ方法で構成および使用できることに注意することが重要です。

INPUTとして構成されたピン

Arduinoピンはデフォルトで入力として構成されているため、入力として使用する場合、* pinMode()*で入力として明示的に宣言する必要はありません。 このように構成されたピンは、高インピーダンス状態にあると言われます。 入力ピンは、ピンの前の100メガオームの直列抵抗に相当する、サンプリングする回路に対して非常に小さな要求を行います。

これは、入力ピンをある状態から別の状態に切り替えるのにほとんど電流がかからないことを意味します。 これにより、ピンは静電容量式タッチセンサーの実装や、LEDのフォトダイオードとしての読み取りなどのタスクに役立ちます。

何も接続されていない、または他の回路に接続されていないワイヤが接続されたpinMode(pin、INPUT)として構成されたピンは、ピン状態のランダムな変化を報告し、環境からの電気ノイズを拾い、または状態を容量結合します近くのピンの。

プルアップ抵抗

プルアップ抵抗は、入力が存在しない場合に入力ピンを既知の状態に導くのに役立ちます。 これは、入力にプルアップ抵抗(+ 5V)またはプルダウン抵抗(グランドへの抵抗)を追加することで実行できます。 10K抵抗は、プルアップまたはプルダウン抵抗に適した値です。

入力として構成されたピンでビルトインプルアップ抵抗を使用する

Atmegaチップには20,000個のプルアップ抵抗が組み込まれており、ソフトウェアからアクセスできます。 これらの組み込みプルアップ抵抗器にアクセスするには、* pinMode()*をINPUT_PULLUPとして設定します。 これにより、INPUTモードの動作が効果的に反転します。HIGHはセンサーがオフ、LOWはセンサーがオンであることを意味します。 このプルアップの値は、使用するマイクロコントローラーによって異なります。 ほとんどのAVRベースのボードでは、値は20kΩ〜50kΩであることが保証されています。 Arduino Dueでは、50kΩ〜150kΩです。 正確な値については、ボード上のマイクロコントローラーのデータシートを参照してください。

INPUT_PULLUPで構成されたピンにセンサーを接続する場合、もう一方の端をグランドに接続する必要があります。 単純なスイッチの場合、これにより、スイッチが開いているときにピンがHIGHになり、スイッチが押されるとLOWになります。 プルアップ抵抗は、入力として構成されたピンに薄暗く接続されたLEDを点灯するのに十分な電流を提供します。 プロジェクトのLEDが機能しているように見えても、非常に薄暗い場合は、これが起こっている可能性があります。

ピンがHIGHかLOWかを制御する同じレジスタ(内部チップメモリ​​位置)がプルアップ抵抗を制御します。 その結果、ピンがINPUTモードのときにプルアップ抵抗がオンになるように構成されたピンは、pinMode()を使用してピンをOUTPUTモードに切り替えると、ピンがHIGHに構成されます。 これは他の方向でも機能し、pinMode()で入力に切り替えられた場合、HIGH状態のままになっている出力ピンにはプルアップ抵抗が設定されます。

pinMode(3,INPUT) ;//set pin to input without using built in pull up resistor
pinMode(5,INPUT_PULLUP) ;//set pin to input using built in pull up resistor

OUTPUTとして構成されたピン

pinMode()でOUTPUTとして設定されたピンは、低インピーダンス状態にあると言われます。 これは、他の回路に相当量の電流を提供できることを意味します。 Atmegaピンは、最大40 mA(ミリアンペア)の電流を他のデバイス/回路に供給(正電流を供給)またはシンク(負電流を供給)できます。 これは、LEDを明るく点灯するのに十分な電流(直列抵抗を忘れないでください)、または多くのセンサーを実行しますが、リレー、ソレノイド、またはモーターを実行するのに十分な電流ではありません。

出力ピンから高電流デバイスを実行しようとすると、ピン内の出力トランジスタを損傷または破壊したり、Atmegaチップ全体を損傷したりする可能性があります。 多くの場合、これによりマイクロコントローラーのピンが「デッド」になりますが、残りのチップは依然として適切に機能します。 このため、特定のアプリケーションでピンからの最大電流が必要な場合を除き、出力ピンを470Ωまたは1k抵抗を介して他のデバイスに接続することをお勧めします。

pinMode()関数

pinMode()関数は、特定のピンが入力または出力として動作するように構成するために使用されます。 モードINPUT_PULLUPを使用して、内部プルアップ抵抗を有効にすることができます。 さらに、INPUTモードは内部プルアップを明示的に無効にします。

pinMode()関数の構文

Void setup () {
   pinMode (pin , mode);
}
  • pin -モードを設定するピンの番号
  • mode -INPUT、OUTPUT、またはINPUT_PULLUP。

int button = 5 ;//button connected to pin 5
int LED = 6;//LED connected to pin 6

void setup () {
   pinMode(button , INPUT_PULLUP);
  //set the digital pin as input with pull-up resistor
   pinMode(button , OUTPUT);//set the digital pin as output
}

void setup () {
   If (digitalRead(button ) == LOW)//if button pressed {
      digitalWrite(LED,HIGH);//turn on led
      delay(500);//delay for 500 ms
      digitalWrite(LED,LOW);//turn off led
      delay(500);//delay for 500 ms
   }
}

digitalWrite()関数

  • digitalWrite()*関数は、デジタルピンにHIGHまたはLOW値を書き込むために使用されます。 ピンがhttps://www.arduino.cc/en/Reference/PinMode [pinMode()]で出力として設定されている場合、その電圧は対応する値に設定されます:5V(または3.3Vボードでは3.3V )HIGHの場合、0V(グランド)LOWの場合。 ピンがINPUTとして設定されている場合、digitalWrite()は入力ピンの内部プルアップを有効(HIGH)または無効(LOW)にします。 内部プルアップ抵抗を有効にするには、https://www.arduino.cc/en/Reference/PinMode [pinMode()]をINPUT_PULLUPに設定することをお勧めします。

pinMode()をOUTPUTに設定せずにLEDをピンに接続すると、digitalWrite(HIGH)を呼び出すときにLEDが暗く見える場合があります。 pinMode()を明示的に設定しないと、digitalWrite()は内部プルアップ抵抗を有効にします。これは、大きな電流制限抵抗のように機能します。

digitalWrite()関数の構文

Void loop() {
   digitalWrite (pin ,value);
}
  • pin -モードを設定するピンの番号
  • -高、または低。
  • 例 *
int LED = 6;//LED connected to pin 6

void setup () {
   pinMode(LED, OUTPUT);//set the digital pin as output
}

void setup () {
   digitalWrite(LED,HIGH);//turn on led
   delay(500);//delay for 500 ms
   digitalWrite(LED,LOW);//turn off led
   delay(500);//delay for 500 ms
}

analogRead()関数

Arduinoは、ピンの1つに電圧が印加されているかどうかを検出し、digitalRead()関数を通じて報告できます。 オン/オフセンサー(オブジェクトの存在を検出する)と値が連続的に変化するアナログセンサーには違いがあります。 このタイプのセンサーを読み取るには、異なるタイプのピンが必要です。

Arduinoボードの右下部分には、「アナログ入力」とマークされた6つのピンがあります。 これらの特別なピンは、電圧が印加されているかどうかだけでなく、その値も示します。* analogRead()*関数を使用すると、ピンの1つに印加された電圧を読み取ることができます。

この関数は、0〜5ボルトの電圧を表す0〜1023の数値を返します。 たとえば、ピン番号0に2.5 Vの電圧が印加されている場合、analogRead(0)は512を返します。

analogRead()関数の構文

analogRead(pin);
  • pin -読み込むアナログ入力ピンの番号(ほとんどのボードでは0〜5、ミニおよびナノでは0〜7、メガでは0〜15)

int analogPin = 3;//potentiometer wiper (middle terminal)
  //connected to analog pin 3
int val = 0;//variable to store the value read

void setup() {
   Serial.begin(9600);//setup serial
}

void loop() {
   val = analogRead(analogPin);//read the input pin
   Serial.println(val);//debug value
}

Arduino-高度なI/O機能

この章では、いくつかの高度な入出力関数について学習します。

analogReference()関数

アナログ入力に使用される基準電圧を設定します(つまり、 入力範囲の上限として使用される値)。 オプションは-

  • DEFAULT -5ボルト(5V Arduinoボード上)または3.3ボルト(3.3V Arduinoボード上)のデフォルトアナログリファレンス
  • 内部-ATmega168またはATmega328では1.1ボルト、ATmega8では2.56ボ​​ルトに等しい組み込みリファレンス(Arduino Megaでは使用不可)
  • INTERNAL1V1 -組み込みの1.1Vリファレンス(Arduino Megaのみ)
  • INTERNAL2V56 -組み込みの2.56Vリファレンス(Arduino Megaのみ)
  • EXTERNAL -AREFピンに印加される電圧(0〜5Vのみ)が基準として使用されます

analogReference()関数の構文

analogReference (type);
*type* -以下の任意のタイプを使用できます(DEFAULT、INTERNAL、INTERNAL1V1、INTERNAL2V56、EXTERNAL)

AREFピンの外部リファレンス電圧に0V未満または5Vを超えるものを使用しないでください。 AREFピンで外部リファレンスを使用している場合、* analogRead()*関数を呼び出す前に、アナログリファレンスをEXTERNALに設定する必要があります。 そうしないと、アクティブな基準電圧(内部生成)とAREFピンが短絡し、Arduinoボードのマイクロコントローラーが損傷する可能性があります。

マイクロコントローラー

または、5Kの抵抗を介して外部基準電圧をAREFピンに接続し、外部基準電圧と内部基準電圧を切り替えることができます。

AREFピンには内部32K抵抗があるため、抵抗はリファレンスとして使用される電圧を変更することに注意してください。 2つは分圧器として機能します。 たとえば、抵抗を介して2.5Vを印加すると、AREFピンで2.5 * 32/(32&plus; 5)=〜2.2Vになります。

int analogPin = 3;//potentiometer wiper (middle terminal) connected to analog pin 3
int val = 0;//variable to store the read value

void setup() {
   Serial.begin(9600);//setup serial
   analogReference(EXTERNAL);//the voltage applied to the AREF pin (0 to 5V only)
     //is used as the reference.
}

void loop() {
   val = analogRead(analogPin);//read the input pin
   Serial.println(val);//debug value
}

Arduino-キャラクター関数

すべてのデータは、文字、数字、さまざまな特殊記号を含む文字としてコンピューターに入力されます。 このセクションでは、個々の文字を調べて操作するためのC ++の機能について説明します。

文字処理ライブラリには、文字データの有用なテストと操作を実行するいくつかの関数が含まれています。 各関数は、intとして表される文字、または引数としてEOFを受け取ります。 文字はしばしば整数として操作されます。

EOFの値は通常–1であり、一部のハードウェアアーキテクチャでは負の値をchar変数に格納できないことを思い出してください。 したがって、文字処理関数は文字を整数として操作します。

次の表は、文字処理ライブラリの機能をまとめたものです。 文字処理ライブラリの関数を使用する場合、 <cctype> ヘッダーを含めます。

S.No. Prototype & Description
1

int isdigit( int c )

cが数字の場合は1を返し、それ以外の場合は0を返します。

2

int isalpha( int c )

cが文字の場合は1を返し、そうでない場合は0を返します。

3

int isalnum( int c )

cが数字または文字の場合は1を返し、そうでない場合は0を返します。

4

int isxdigit( int c )

cが16進数字の場合は1を返し、そうでない場合は0を返します。

(2進数、8進数、10進数、16進数の詳細な説明については、付録D「番号システム」を参照してください。)

5

int islower( int c )

cが小文字の場合は1を返し、そうでない場合は0を返します。

6

int isupper( int c )

cが大文字の場合、1を返します。それ以外の場合は0。

7

int isspace( int c )

cが空白文字(改行( '\ n')、スペース)の場合、1を返します

)、フォームフィード( '\ f')、キャリッジリターン( '\ r')、水平タブ( '\ t')、または垂直タブ( '\ v')—それ以外の場合は0。

8

int iscntrl( int c )

cが改行( '\ n')、フォームフィード( '\ f')、復帰( '\ r')、水平タブ( '\ t')、垂直タブ( 'などの制御文字の場合、1を返します。 \ v ')、アラート(' \ a ')、またはバックスペース(' \ b ')—それ以外の場合は0。

9

int ispunct( int c )

cがスペース、数字、または文字以外の印刷文字の場合は1を返し、それ以外の場合は0を返します。

10

int isprint( int c )

cがスペース( )を含む印刷文字の場合は1を返し、そうでない場合は0を返します。

11

int isgraph( int c )

cがスペース( )以外の印刷文字の場合は1を返し、そうでない場合は0を返します。

次の例は、関数 isdigit、isalpha、isalnum および isxdigit の使用法を示しています。 関数 isdigit は、引数が数字(0〜9)かどうかを判別します。 関数 isalpha は、引数が大文字(A-Z)であるか小文字(a–z)であるかを決定します。 関数 isalnum は、引数が大文字、小文字、または数字のいずれであるかを決定します。 関数 isxdigit は、引数が16進数(A〜F、a〜f、0〜9)であるかどうかを判別します。

例1

void setup () {
   Serial.begin (9600);
   Serial.print ("According to isdigit:\r");
   Serial.print (isdigit( '8' ) ? "8 is a": "8 is not a");
   Serial.print (" digit\r" );
   Serial.print (isdigit( '8' ) ?"# is a": "# is not a") ;
   Serial.print (" digit\r");
   Serial.print ("\rAccording to isalpha:\r" );
   Serial.print (isalpha('A' ) ?"A is a": "A is not a");
   Serial.print (" letter\r");
   Serial.print (isalpha('A' ) ?"b is a": "b is not a");
   Serial.print (" letter\r");
   Serial.print (isalpha('A') ?"& is a": "& is not a");
   Serial.print (" letter\r");
   Serial.print (isalpha( 'A' ) ?"4 is a":"4 is not a");
   Serial.print (" letter\r");
   Serial.print ("\rAccording to isalnum:\r");
   Serial.print (isalnum( 'A' ) ?"A is a" : "A is not a" );

   Serial.print (" digit or a letter\r" );
   Serial.print (isalnum( '8' ) ?"8 is a" : "8 is not a" ) ;
   Serial.print (" digit or a letter\r");
   Serial.print (isalnum( '#' ) ?"# is a" : "# is not a" );
   Serial.print (" digit or a letter\r");
   Serial.print ("\rAccording to isxdigit:\r");
   Serial.print (isxdigit( 'F' ) ?"F is a" : "F is not a" );
   Serial.print (" hexadecimal digit\r" );
   Serial.print (isxdigit( 'J' ) ?"J is a" : "J is not a" ) ;
   Serial.print (" hexadecimal digit\r" );
   Serial.print (isxdigit( '7' ) ?"7 is a" : "7 is not a" ) ;

   Serial.print (" hexadecimal digit\r" );
   Serial.print (isxdigit( '$' ) ? "$ is a" : "$ is not a" );
   Serial.print (" hexadecimal digit\r" );
   Serial.print (isxdigit( 'f' ) ? “f is a" : "f is not a");

}

void loop () {

}

結果

According to isdigit:
8 is a digit
# is not a digit
According to isalpha:
A is a letter
b is a letter
& is not a letter
4 is not a letter
According to isalnum:
A is a digit or a letter

8 is a digit or a letter
# is not a digit or a letter
According to isxdigit:
F is a hexadecimal digit
J is not a hexadecimal digit
7 is a hexadecimal digit

$ is not a hexadecimal digit
f is a hexadecimal digit

各関数で条件演算子*(?:)を使用して、文字列 "が"であるか、文字列 "が非"であるかを、テストする各文字の出力に出力する必要があるかどうかを判断します。 たとえば、行 *a は、「8」が数字の場合、つまり isdigit が真(ゼロ以外)の値を返す場合、文字列「8 is a」が出力されることを示します。 「8」が数字でない場合(つまり、 isdigit が0を返す場合)、文字列「8 is not a」が出力されます。

例2

次の例は、関数 islower および isupper の使用方法を示しています。 関数 islower は、引数が小文字(a〜z)であるかどうかを判別します。 関数 isupper は、引数が大文字(A〜Z)であるかどうかを判別します。

int thisChar = 0xA0;

void setup () {
   Serial.begin (9600);
   Serial.print ("According to islower:\r") ;
   Serial.print (islower( 'p' ) ? "p is a" : "p is not a" );
   Serial.print ( " lowercase letter\r" );
   Serial.print ( islower( 'P') ? "P is a" : "P is not a") ;
   Serial.print ("lowercase letter\r");
   Serial.print (islower( '5' ) ? "5 is a" : "5 is not a" );
   Serial.print ( " lowercase letter\r" );
   Serial.print ( islower( '!' )? "! is a" : "! is not a") ;
   Serial.print ("lowercase letter\r");

   Serial.print ("\rAccording to isupper:\r") ;
   Serial.print (isupper ( 'D' ) ? "D is a" : "D is not an" );
   Serial.print ( " uppercase letter\r" );
   Serial.print ( isupper ( 'd' )? "d is a" : "d is not an") ;
   Serial.print ( " uppercase letter\r" );
   Serial.print (isupper ( '8' ) ? "8 is a" : "8 is not an" );
   Serial.print ( " uppercase letter\r" );
   Serial.print ( islower( '$' )? "$ is a" : "$ is not an") ;
   Serial.print ("uppercase letter\r ");
}

void setup () {

}

結果

According to islower:
p is a lowercase letter
P is not a lowercase letter
5 is not a lowercase letter
! is not a lowercase letter

According to isupper:
D is an uppercase letter
d is not an uppercase letter
8 is not an uppercase letter
$ is not an uppercase letter

実施例3

次の例は、関数 isspace、iscntrl、ispunct、isprint および isgraph の使用を示しています。

  • 関数 isspace は、引数がスペース( )、フォームフィード( '\ f')、改行( '\ n')、キャリッジリターン( '\ r')などの空白文字であるかどうかを決定します。水平タブ( '\ t')または垂直タブ( '\ v')。
  • 関数 iscntrl は、引数が水平タブ( '\ t')、垂直タブ( '\ v')、フォームフィード( '\ f')、アラート( '\ a')などの制御文字であるかどうかを決定します。バックスペース( '\ b')、キャリッジリターン( '\ r')または改行( '\ n')。
  • 関数 ispunct は、引数がスペース、数字、文字以外の印刷文字($、#、(、)、[、]、\ {、}、;、:、%など)かどうかを決定します。
  • 関数 isprint は、引数が画面に表示できる文字(スペース文字を含む)かどうかを判別します。
  • 関数 isgraph は、isprintと同じ文字をテストしますが、スペース文字は含まれません。
void setup () {
   Serial.begin (9600);
   Serial.print ( " According to isspace:\rNewline ") ;
   Serial.print (isspace( '\n' )? " is a" : " is not a" );
   Serial.print ( " whitespace character\rHorizontal tab") ;
   Serial.print (isspace( '\t' )? " is a" : " is not a" );
   Serial.print ( " whitespace character\n") ;
   Serial.print (isspace('%')? " % is a" : " % is not a" );

   Serial.print ( " \rAccording to iscntrl:\rNewline") ;
   Serial.print ( iscntrl( '\n' )?"is a" : " is not a" ) ;
   Serial.print (" control character\r");
   Serial.print (iscntrl( '$' ) ? " $ is a" : " $ is not a" );
   Serial.print (" control character\r");
   Serial.print ("\rAccording to ispunct:\r");
   Serial.print (ispunct(';' ) ?"; is a" : "; is not a" ) ;
   Serial.print (" punctuation character\r");
   Serial.print (ispunct('Y' ) ?"Y is a" : "Y is not a" ) ;
   Serial.print ("punctuation character\r");
   Serial.print (ispunct('#' ) ?"# is a" : "# is not a" ) ;
   Serial.print ("punctuation character\r");

   Serial.print ( "\r According to isprint:\r");
   Serial.print (isprint('$' ) ?"$ is a" : "$ is not a" );
   Serial.print (" printing character\rAlert ");
   Serial.print (isprint('\a' ) ?" is a" : " is not a" );
   Serial.print (" printing character\rSpace ");
   Serial.print (isprint(' ' ) ?" is a" : " is not a" );
   Serial.print (" printing character\r");

   Serial.print ("\r According to isgraph:\r");
   Serial.print (isgraph ('Q' ) ?"Q is a" : "Q is not a" );
   Serial.print ("printing character other than a space\rSpace ");
   Serial.print (isgraph (' ') ?" is a" : " is not a" );
   Serial.print ("printing character other than a space ");
}

void loop () {

}

結果

According to isspace:
Newline is a whitespace character
Horizontal tab is a whitespace character
% is not a whitespace character
According to iscntrl:
Newline is a control character
$ is not a control character
According to ispunct:
; is a punctuation character
Y is not a punctuation character
# is a punctuation character
According to isprint:
$ is a printing character
Alert is not a printing character
Space is a printing character
According to isgraph:
Q is a printing character other than a space
Space is not a printing character other than a space

Arduino-数学ライブラリ

Arduino Mathライブラリ(math.h)には、浮動小数点数を操作するための便利な数学関数が多数含まれています。

ライブラリマクロ

以下は、ヘッダーmath.hで定義されているマクロです-

以下の____は、ヘッダーmath.hで定義されているマクロのリストです。

Macros Value Description
M_E 2.7182818284590452354 The constant e.
M_LOG2E

1.4426950408889634074

/log_2 e/

The logarithm of the e to base 2
M_1_PI

0.31830988618379067154

/1/pi/

The constant 1/pi
M_2_PI

0.63661977236758134308

/2/pi/

The constant 2/pi
M_2_SQRTPI

1.12837916709551257390

/* 2/sqrt(pi) */

The constant 2/sqrt(pi)
M_LN10

2.30258509299404568402

/* log_e 10 */

The natural logarithm of the 10
M_LN2

0.69314718055994530942

/* log_e 2 */

The natural logarithm of the 2
M_LOG10E

0.43429448190325182765

/* log_10 e */

The logarithm of the e to base 10
M_PI

3.14159265358979323846

/* pi */

The constant pi
M_PI_2

3.3V1.57079632679489661923

/* pi/2 */

The constant pi/2
M_PI_4

0.78539816339744830962

/* pi/4 */

The constant pi/4
M_SQRT1_2

0.70710678118654752440

/* 1/sqrt(2) */

The constant 1/sqrt(2)
M_SQRT2

1.41421356237309504880

/* sqrt(2)*/

The square root of 2
acosf - The alias for acos() function
asinf - The alias for asin() function
atan2f - The alias for atan2() function
cbrtf - The alias for cbrt() function
ceilf - The alias for ceil() function
copysignf - The alias for copysign() function
coshf - The alias for cosh() function
expf - The alias for exp() function
fabsf - The alias for fabs() function
fdimf - The alias for fdim() function
floorf - The alias for floor() function
fmaxf - The alias for fmax() function
fminf - The alias for fmin() function
fmodf - The alias for fmod() function
frexpf - The alias for frexp() function
hypotf - The alias for hypot() function
INFINITY - INFINITY constant
isfinitef - The alias for isfinite() function
isinff - The alias for isinf() function
isnanf - The alias for isnan() function
ldexpf - The alias for ldexp() function
log10f - The alias for log10() function
logf - The alias for log() function
lrintf - The alias for lrint() function
lroundf - The alias for lround() function

ライブラリ関数

次の関数は、ヘッダー math.h で定義されています-

以下に示すのは、ヘッダーmath.hで定義されている関数のリストです。

S.No. Library Function & Description
1

double acos (double __x)

acos()関数は、__ xの逆余弦の主値を計算します。 返される値の範囲は[0、pi]ラジアンです。 [-1、+ 1]の範囲外の引数に対してドメインエラーが発生します。

2

double asin (double __x)

asin()関数は、__ xの逆正弦の主値を計算します。 返される値の範囲は[-pi/2、pi/2]ラジアンです。 [-1、+ 1]の範囲外の引数に対してドメインエラーが発生します。

3

double atan (double __x)

atan()関数は、__ xの逆正接の主値を計算します。 返される値の範囲は[-pi/2、pi/2]ラジアンです。

4

double atan2 (double y, doublex)

atan2()関数は、両方の引数の符号を使用して戻り値の象限を決定し、y/xのアークタンジェントの主値を計算します。 返される値の範囲は[-pi、+ pi]ラジアンです。

5

double cbrt (double __x)

cbrt()関数は、__ xのキューブルートを返します。

6

double ceil (double __x)

ceil()関数は、__ x以上の浮動小数点数で表された最小の整数値を返します。

7

static double copysign (double x, doubley)

copysign()関数はxを返しますが、 yの符号を使用します。 xまたはyがNaNまたはゼロの場合でも機能します。

8

double cos(double __x)

cos()関数は、ラジアンで測定された__xのコサインを返します。

9

double cosh (double __x)

cosh()関数は、__ xの双曲線余弦を返します。

10

double exp (double __x)

exp()関数は、__ xの指数値を返します。

11

double fabs (double __x)

fabs()関数は、浮動小数点数__xの絶対値を計算します。

12

double fdim (double x, doubley)

fdim()関数はmax(x-y、0)を返します。 xまたはyまたは両方がNaNの場合、NaNが返されます。

13

double floor (double __x)

floor()関数は、__ x以下の最大の整数値を浮動小数点数で返します。

14

double fma (double x, doubley, double __z)

fma()関数は、浮動小数点乗算加算を実行します。 これは操作(x *y)+ __zですが、中間結果は宛先タイプに丸められません。 これにより、計算の精度が向上する場合があります。

15
  • double fmax (double x, doubley)*

fmax()関数は、2つの値xとyの大きい方を返します。 引数がNaNの場合、他の引数が返されます。 両方の引数がNaNの場合、NaNが返されます。

16

double fmin (double x, doubley)

fmin()関数は、2つの値xとyのうち小さい方を返します。 引数がNaNの場合、他の引数が返されます。 両方の引数がNaNの場合、NaNが返されます。

17

double fmod (double x, doubley)

関数fmod()は、x/yの浮動小数点剰余を返します。

18

double frexp (double x, int *pexp)

frexp()関数は、浮動小数点数を正規化された小数と2の整数乗に分割します。 pexpが指すintオブジェクトに整数を格納します。xが通常の浮動小数点数の場合、frexp()関数は値vを返します。vの間隔は[1/2、1)またはゼロで、xはvに2を掛けたpexpに等しいです。 xがゼロの場合、結果の両方の部分がゼロになります。xが有限数でない場合、frexp()はxをそのまま返し、 pexpで0を格納します。

注意-この実装では、指数の格納をスキップするディレクティブとしてゼロポインターを許可します。

19

double hypot (double x, doubley)

hypot()関数は、sqrt(x ' x + y' y)を返します。 これは、長さxおよびyの辺を持つ直角三角形の斜辺の長さ、または原点からの点(x、 y)の距離です。 エラーがはるかに小さいため、直接式の代わりにこの関数を使用するのが賢明です。 小さなxおよびyでアンダーフローはありません。 結果が範囲内にある場合はオーバーフローしません。

20

static int isfinite (double __x)

isfinite()関数は、__ xが有限の場合にゼロ以外の値を返します。プラスまたはマイナスの無限大ではなく、 NaN でもありません。

21

int isinf (double __x)

関数isinf()は、引数xが正の無限大の場合1を返し、 xが負の無限大の場合-1を返し、そうでない場合は0を返します。

-GCC 4.3は、この関数を、両方の無限大に対して1の値を返すインラインコードに置き換えることができます(gccバグ#35509)。

22

int isnan (double __x)

関数isnan()は、引数__xが "not-a-number"( NaN )オブジェクトを表す場合は1を返し、それ以外の場合は0を返します。

23

double ldexp (double x, intexp )

ldexp()関数は、浮動小数点数に2の整数乗を乗算します。 xに2を乗じた値expの値を返します。

24

double log (double __x)

log()関数は、引数__xの自然対数を返します。

25

double log10(double __x)

log10()関数は、引数__xの対数を基数10に返します。

26

long lrint (double __x)

lrint()関数は、__ xを最も近い整数に丸め、途中の場合を偶数の整数方向に丸めます。 (1.5と2.5の両方の値は2に丸められます)。 この関数はrint()関数に似ていますが、戻り値のタイプが異なり、オーバーフローが発生する可能性があります。

  • 戻り値 *

丸められた長整数値。 __xが有限数でもオーバーフローでもない場合、この認識はLONG​​_MIN値(0x80000000)を返します。

27
  • long lround (double __x)*

lround()関数は、__ xを最も近い整数に丸めますが、ゼロから(最も近い偶数の整数の代わりに)途中で丸めます。 この関数はround()関数に似ていますが、戻り値のタイプが異なり、オーバーフローが発生する可能性があります。

  • 戻り値 *

丸められた長整数値。 __xが有限数でない場合、またはオーバーフローがあった場合、この認識はLONG​​_MIN値(0x80000000)を返します。

28
  • double modf (double x, double *iptr )*

modf()関数は、引数xを整数部分と小数部分に分割します。各部分は引数と同じ符号を持ちます。iptrが指すオブジェクトに、整数部分をdoubleとして格納します。

modf()関数は、__ xの符号付き小数部を返します。

-この実装は、ゼロポインターによる書き込みをスキップします。 ただし、GCC 4.3では、この関数を、保存を避けるためにNULLアドレスを使用することを許可しないインラインコードに置き換えることができます。

29

float modff (float x, float *iptr)

modf()のエイリアス。

30

double pow (double x, doubley)

関数pow()は、xの値を指数yに返します。

31

double round (double __x)

round()関数は__xを最も近い整数に丸めますが、ケースをゼロから(最も近い偶数の整数ではなく)丸めます。 オーバーフローは不可能です。

戻り値

丸められた値。 xが整数または無限の場合、 x自体が返されます。 __xが NaN の場合、 NaN が返されます。

32

int signbit (double __x)

xの値に符号ビットが設定されている場合、signbit()関数はゼロ以外の値を返します。 IEEE 754浮動小数点ではゼロに署名できるため、これは `x <0.0 'とは異なります。 比較「-0.0 <0.0」は偽ですが、「signbit(-0.0)」はゼロ以外の値を返します。

33

double sin (double __x)

sin()関数は、ラジアンで測定された__xのサインを返します。

34

double sinh (double __x)

sinh()関数は、__ xの双曲線正弦を返します。

35

double sqrt (double __x)

sqrt()関数は、__ xの非負の平方根を返します。

36

double square (double __x)

関数square()はx *xを返します。

-この関数はC標準定義に属していません。

37

double tan (double __x)

tan()関数は、ラジアンで測定された__xのタンジェントを返します。

38

double tanh ( double __x)

tanh()関数は、__ xの双曲線正接を返します。

39

double trunc (double __x)

trunc()関数は、__ xを絶対値が大きくない最も近い整数に丸めます。

次の例は、最も一般的なmath.hライブラリ関数を使用する方法を示しています-

double double__x = 45.45 ;
double double__y = 30.20 ;

void setup() {
   Serial.begin(9600);
   Serial.print("cos num = ");
   Serial.println (cos (double__x) );//returns cosine of x
   Serial.print("absolute value of num = ");
   Serial.println (fabs (double__x) );//absolute value of a float
   Serial.print("floating point modulo = ");
   Serial.println (fmod (double__x, double__y));//floating point modulo
   Serial.print("sine of num = ");
   Serial.println (sin (double__x) ) ;//returns sine of x
   Serial.print("square root of num : ");
   Serial.println ( sqrt (double__x) );//returns square root of x
   Serial.print("tangent of num : ");
   Serial.println ( tan (double__x) );//returns tangent of x
   Serial.print("exponential value of num : ");
   Serial.println ( exp (double__x) );//function returns the exponential value of x.
   Serial.print("cos num : ");

   Serial.println (atan (double__x) );//arc tangent of x
   Serial.print("tangent of num : ");
   Serial.println (atan2 (double__y, double__x) );//arc tangent of y/x
   Serial.print("arc tangent of num : ");
   Serial.println (log (double__x) ) ;//natural logarithm of x
   Serial.print("cos num : ");
   Serial.println ( log10 (double__x));//logarithm of x to base 10.
   Serial.print("logarithm of num to base 10 : ");
   Serial.println (pow (double__x, double__y) );//x to power of y
   Serial.print("power of num : ");
   Serial.println (square (double__x));//square of x
}

void loop() {

}

結果

cos num = 0.10
absolute value of num = 45.45
floating point modulo =15.25
sine of num = 0.99
square root of num : 6.74
tangent of num : 9.67
exponential value of num : ovf
cos num : 1.55
tangent of num : 0.59
arc tangent of num : 3.82
cos num : 1.66
logarithm of num to base 10 : inf
power of num : 2065.70

Arduino-三角関数

移動するオブジェクトの距離や角速度を計算するのと同じように、三角法を実際に使用する必要があります。 Arduinoは、プロトタイプを書くことで要約できる従来の三角関数(sin、cos、tan、asin、acos、atan)を提供します。 Math.hには、三角関数のプロトタイプが含まれています。

三角関数の正確な構文

double sin(double x);//returns sine of x radians
double cos(double y);//returns cosine of y radians
double tan(double x);//returns the tangent of x radians
double acos(double x);//returns A, the angle corresponding to cos (A) = x
double asin(double x);//returns A, the angle corresponding to sin (A) = x
double atan(double x);//returns A, the angle corresponding to tan (A) = x

double sine = sin(2);//approximately 0.90929737091
double cosine = cos(2);//approximately -0.41614685058
double tangent = tan(2);//approximately -2.18503975868

Arduino-Due&Zero

Arduino Dueは、Atmel SAM3X8E ARM Cortex-M3 CPUベースのマイクロコントローラーボードです。 32ビットARMコアマイクロコントローラーをベースにした最初のArduinoボードです。

重要な機能-

  • 54個のデジタル入力/出力ピンがあります(そのうち12個をPWM出力として使用できます)。
  • 12個のアナログ入力
  • 4 UART(ハードウェアシリアルポート)
  • 84 MHzクロック、USB OTG対応接続
  • 2 DAC(デジタル-アナログ)、2 TWI、電源ジャック、SPIヘッダー、JTAGヘッダー
  • リセットボタンと消去ボタン

Arduino Due

Arduino Due Boardの特徴

Operating volt CPU speed Analog in/out Digital IO/PWM EEPROM [KB] SRAM [KB] Flash [KB] USB UART
3.3 Volt 84 Mhz 12/2 54/12 - 96 512 2 micro 4

コミュニケーション

  • 4つのハードウェアUART
  • 2 I2C
  • 1 CANインターフェイス(自動車通信プロトコル)
  • 1 SPI
  • 1つのインターフェースJTAG(10ピン)
  • 1個のUSBホスト(Leonardoなど)
  • 1つのプログラミングポート

ほとんどのArduinoボードとは異なり、Arduino Dueボードは3.3Vで動作します。 I/Oピンが許容できる最大電圧は3.3Vです。 I/Oピンに3.3Vを超える電圧を印加すると、ボードが損傷する可能性があります。

ボードには、マイクロコントローラをサポートするために必要なものがすべて含まれています。 micro-USBケーブルでコンピューターに接続するか、AC-DCアダプターまたはバッテリーで電源を入れるだけで開始できます。 Dueは、3.3Vで動作するすべてのArduinoシールドと互換性があります。

Arduino Zero

Zeroは、UNOによって確立されたプラットフォームのシンプルで強力な32ビット拡張です。 Zeroボードは、パフォーマンスの向上、デバイスのさまざまなプロジェクト機会の提供によりファミリを拡張し、32ビットアプリケーション開発について学習するための優れた教育ツールとして機能します。

重要な機能は-

  • Zeroアプリケーションは、スマートIoTデバイス、ウェアラブルテクノロジー、ハイテクオートメーションから、クレイジーなロボット工学にまで及びます。
  • ボードは、32ビットARMCortex®M0 +コアを搭載したAtmelのSAMD21 MCUを搭載しています。
  • 最も重要な機能の1つはAtmelの組み込みデバッガー(EDBG)です。これは、ハードウェアを追加することなく完全なデバッグインターフェイスを提供し、ソフトウェアデバッグの使いやすさを大幅に向上させます。
  • EDBGは、デバイスとブートローダーのプログラミングに使用できる仮想COMポートもサポートしています。

Arduino Zero

Arduino Zeroボードの特性

Operating volt CPU speed Analog in/out Digital IO/PWM EEPROM [KB] SRAM [KB] Flash [KB] USB UART
3.3 Volt 48 Mhz 6/1 14/10 - 32 256 2 micro 2

ほとんどのArduinoおよびGenuinoボードとは異なり、Zeroは3.3Vで動作します。 I/Oピンが許容できる最大電圧は3.3Vです。 I/Oピンに3.3Vを超える電圧を印加すると、ボードが損傷する可能性があります。

ボードには、マイクロコントローラをサポートするために必要なものがすべて含まれています。 micro-USBケーブルでコンピューターに接続するか、AC-DCアダプターまたはバッテリーで電源を入れるだけで開始できます。 Zeroは、3.3Vで動作するすべてのシールドと互換性があります。

Arduino-パルス幅変調

パルス幅変調またはPWMは、パルス列のパルスの幅を変更するために使用される一般的な手法です。 PWMには、サーボや速度コントローラーの制御、モーターやLEDの有効電力の制限など、多くのアプリケーションがあります。

PWMの基本原理

パルス幅変調は、基本的に、さまざまな高低の時間を持つ方形波です。 基本的なPWM信号を次の図に示します。

PWM

PWMに関連するさまざまな用語があります-

  • オンタイム-時間信号の持続時間が長い。
  • オフ時間-時間信号の持続時間が短い。
  • 期間-PWM信号のオン時間とオフ時間の合計として表されます。
  • デューティサイクル-PWM信号の期間中にオンのままになる時間信号の割合として表されます。

期間

図に示すように、T〜on〜はオン時間を示し、T〜off〜は信号のオフ時間を示します。 期間はオンとオフの両方の時間の合計であり、次の式に示すように計算されます-

デューティサイクル

デューティサイクルは、期間のオンタイムとして計算されます。 上記で計算された期間を使用して、デューティサイクルは次のように計算されます-

analogWrite()関数

  • analogWrite()*関数は、アナログ値(PWM波)をピンに書き込みます。 さまざまな明るさでLEDを点灯したり、さまざまな速度でモーターを駆動したりするために使用できます。 analogWrite()関数の呼び出し後、ピンは、同じピンで次にanalogWrite()を呼び出すか、digitalRead()またはdigitalWrite()を呼び出すまで、指定されたデューティサイクルの安定した方形波を生成します。 ほとんどのピンのPWM信号の周波数は約490 Hzです。 Unoおよび同様のボードでは、ピン5と6の周波数は約980 Hzです。 Leonardoのピン3と11も980 Hzで動作します。

ほとんどのArduinoボード(ATmega168またはATmega328を搭載)では、この機能はピン3、5、6、9、10、11で動作します。 Arduino Megaでは、ピン2-13および44-46で動作します。 ATmega8を搭載した古いArduinoボードは、ピン9、10、11で* analogWrite()*のみをサポートします。

UNO PWMピン

Arduino Dueは、ピン2〜13、およびピンDAC0とDAC1で* analogWrite()*をサポートします。 PWMピンとは異なり、DAC0およびDAC1はデジタルアナログコンバーターであり、真のアナログ出力として機能します。

analogWrite()を呼び出す前に、pinMode()を呼び出してピンを出力として設定する必要はありません。

analogWrite()関数の構文

analogWrite ( pin , value ) ;

-デューティサイクル:0(常にオフ)〜255(常にオン)の間。

int ledPin = 9;//LED connected to digital pin 9
int analogPin = 3;//potentiometer connected to analog pin 3
int val = 0;//variable to store the read value

void setup() {
   pinMode(ledPin, OUTPUT);//sets the pin as output
}

void loop() {
   val = analogRead(analogPin);//read the input pin
   analogWrite(ledPin, (val/4));//analogRead values go from 0 to 1023,
     //analogWrite values from 0 to 255
}

Arduino-乱数

乱数を生成するには、Arduinoの乱数関数を使用できます。 私たちには2つの機能があります-

  • randomSeed(シード)
  • ランダム()

randomSeed(シード)

関数randomSeed(seed)は、Arduinoの擬似乱数ジェネレーターをリセットします。 random()によって返される数値の分布は本質的にランダムですが、シーケンスは予測可能です。 ジェネレーターをランダムな値にリセットする必要があります。 接続されていないアナログピンがある場合、周囲の環境からランダムノイズを拾う可能性があります。 これらは、電波、宇宙線、携帯電話からの電磁干渉、蛍光灯などです。

randomSeed(analogRead(5));//randomize using noise from analog pin 5

ランダム()

ランダム関数は、擬似乱数を生成します。 構文は次のとおりです。

random()ステートメントの構文

long random(max)//it generate random numbers from 0 to max
long random(min, max)//it generate random numbers from min to max

long randNumber;

void setup() {
   Serial.begin(9600);
  //if analog input pin 0 is unconnected, random analog
  //noise will cause the call to randomSeed() to generate
  //different seed numbers each time the sketch runs.
  //randomSeed() will then shuffle the random function.
   randomSeed(analogRead(0));
}

void loop() {
  //print a random number from 0 to 299
   Serial.print("random1=");
   randNumber = random(300);
   Serial.println(randNumber);//print a random number from 0to 299
   Serial.print("random2=");
   randNumber = random(10, 20);//print a random number from 10 to 19
   Serial.println (randNumber);
   delay(50);
}

ビットやバイトなどの基本的な概念についての知識を更新しましょう。

Bits

ビットは単なる2進数です。

  • バイナリシステムは2桁の0と1を使用します。
  • 数字の数字が同じ値を持たない10進数システムと同様に、ビットの「重要性」は2進数での位置に依存します。 たとえば、10進数666の数字は同じですが、値が異なります。

ビット

バイト

1バイトは8ビットで構成されます。

  • ビットが数字の場合、バイトが数字を表すのは論理的です。
  • それらに対してすべての数学演算を実行できます。
  • バイト内の数字も同じ意味を持ちません。
  • 左端のビットには、最上位ビット(MSB)と呼ばれる最大値があります。
  • 右端のビットの値は最小であるため、最下位ビット(LSB)と呼ばれます。
  • 1バイトの8つのゼロと1は256通りの方法で結合できるため、1バイトで表すことができる最大の10進数は255です(1つの組み合わせはゼロを表します)。

Arduino-割り込み

割り込みは、Arduinoの現在の作業を停止して、他の作業を実行できるようにします。

あなたが家に座って誰かとおしゃべりをしているとします。 突然電話が鳴ります。 チャットを停止し、電話を取り、発信者に話しかけます。 電話での会話が終了したら、電話が鳴る前に相手とチャットに戻ります。

同様に、メインルーチンは誰かとチャットしていると考えることができます。電話が鳴るとチャットが停止します。 割り込みサービスルーチンは、電話で話すプロセスです。 電話での会話が終了したら、チャットのメインルーチンに戻ります。 この例では、割り込みがプロセッサを動作させる方法を正確に説明します。

メインプログラムが実行されており、回路で何らかの機能を実行しています。 ただし、割り込みが発生すると、別のルーチンが実行されている間、メインプログラムは停止します。 このルーチンが終了すると、プロセッサは再びメインルーチンに戻ります。

割り込み

重要な機能

ここに割り込みに関するいくつかの重要な機能があります-

  • 割り込みはさまざまなソースから発生します。 この場合、デジタルピンの1つの状態変化によってトリガーされるハードウェア割り込みを使用しています。
  • ほとんどのArduino設計には、デジタルI/Oピン2および3にそれぞれ配線された2つのハードウェア割り込み(「interrupt0」および「interrupt1」と呼ばれる)があります。
  • Arduino Megaには、ピン21、20、19、および18の追加の割り込み(「interrupt2」から「interrupt5」)を含む6つのハードウェア割り込みがあります。
  • 「割り込みサービスルーチン」(通常ISRとして知られる)と呼ばれる特別な関数を使用して、ルーチンを定義できます。
  • ルーチンを定義し、立ち上がりエッジ、立ち下がりエッジ、またはその両方で条件を指定できます。 これらの特定の条件では、割り込みが処理されます。
  • 入力ピンでイベントが発生するたびに、その機能を自動的に実行させることができます。

割り込みの種類

割り込みには2種類あります-

  • ハードウェア割り込み-外部割り込みピンがハイまたはローになるなど、外部イベントに応答して発生します。
  • ソフトウェア割り込み-ソフトウェアで送信された命令に応じて発生します。 「Arduino言語」がサポートする唯一のタイプの割り込みは、attachInterrupt()関数です。

Arduinoで割り込みを使用する

割り込みは、タイミングの問題の解決に役立つため、Arduinoプログラムで非常に役立ちます。 割り込みの適切なアプリケーションは、ロータリーエンコーダーの読み取りまたはユーザー入力の監視です。 一般に、ISRはできるだけ短く、高速である必要があります。 スケッチで複数のISRを使用している場合、一度に実行できるのは1つだけです。 他の割り込みは、現在の割り込みが終了した後に、優先度に応じた順序で実行されます。

通常、グローバル変数は、ISRとメインプログラムの間でデータを渡すために使用されます。 ISRとメインプログラム間で共有される変数が正しく更新されるようにするには、それらをvolatileとして宣言します。

attachInterruptステートメントの構文

attachInterrupt(digitalPinToInterrupt(pin),ISR,mode);//recommended for arduino board
attachInterrupt(pin, ISR, mode) ;//recommended Arduino Due, Zero only
//argument pin: the pin number
//argument ISR: the ISR to call when the interrupt occurs;
  //this function must take no parameters and return nothing.
  //This function is sometimes referred to as an interrupt service routine.
//argument mode: defines when the interrupt should be triggered.

次の3つの定数は、有効な値として事前定義されています-

  • LOW 。ピンがローの場合に割り込みをトリガーします。
  • ピンが値を変更するたびに割り込みをトリガーする CHANGE
  • ピンがHighからLowに変化するたびに Falling になります。

int pin = 2;//define interrupt pin to 2
volatile int state = LOW;//To make sure variables shared between an ISR
//the main program are updated correctly,declare them as volatile.

void setup() {
   pinMode(13, OUTPUT);//set pin 13 as output
   attachInterrupt(digitalPinToInterrupt(pin), blink, CHANGE);
  //interrupt at pin 2 blink ISR when pin to change the value
}
void loop() {
   digitalWrite(13, state);//pin 13 equal the state value
}

void blink() {
  //ISR function
   state = !state;//toggle the state when the interrupt occurs
}

Arduino-コミュニケーション

このデータ交換を実現するために、数百の通信プロトコルが定義されています。 各プロトコルは、パラレルまたはシリアルの2つのカテゴリのいずれかに分類できます。

パラレル通信

入出力ポートを介したArduinoと周辺機器間の並列接続は、数メートルまでの短い距離に最適なソリューションです。 ただし、2つのデバイス間で長距離通信を確立する必要がある他のケースでは、パラレル接続を使用することはできません。 パラレルインターフェイスは、複数のビットを同時に転送します。 通常、データのバスが必要です-8本、16本、またはそれ以上のワイヤで送信します。 データは1と0の巨大なクラッシュ波で転送されます。

パラレルコミュニケーション

パラレル通信の利点と欠点

パラレル通信には確かに利点があります。 シリアルより高速で、簡単で、比較的簡単に実装できます。 ただし、多くの入出力(I/O)ポートと回線が必要です。 プロジェクトを基本的なArduino UnoからMegaに移動する必要があった場合、マイクロプロセッサーのI/Oラインは貴重で数少ないことがわかっています。 したがって、ピン通信の潜在的な速度を犠牲にして、シリアル通信を優先します。

シリアル通信モジュール

現在、ほとんどのArduinoボードは、シリアル通信用のいくつかの異なるシステムを標準装備しています。

これらのシステムのどれが使用されるかは、次の要因に依存します-

  • マイクロコントローラーがデータを交換しなければならないデバイスはいくつですか?
  • データ交換の速度はどれくらいですか?
  • これらのデバイス間の距離はどのくらいですか?
  • データを同時に送受信する必要がありますか?

シリアル通信に関する最も重要なことの1つは*プロトコル*であり、厳密に遵守する必要があります。 これは一連のルールであり、デバイスが相互に交換するデータを正しく解釈できるように適用する必要があります。 幸いなことに、Arduinoはこれを自動的に処理するため、プログラマ/ユーザーの作業は単純な書き込み(送信されるデータ)と読み取り(受信データ)に削減されます。

シリアル通信の種類

シリアル通信はさらに分類することができます-

  • 同期-同期されるデバイスは同じクロックを使用し、それらのタイミングは互いに同期しています。
  • 非同期-非同期のデバイスには独自のクロックがあり、前の状態の出力によってトリガーされます。

デバイスが同期しているかどうかは簡単にわかります。 接続されているすべてのデバイスに同じクロックが与えられている場合、それらは同期しています。 クロックラインがない場合、非同期です。

たとえば、UART(Universal Asynchronous Receiver Transmitter)モジュールは非同期です。

非同期シリアルプロトコルには、多くの組み込みルールがあります。 これらのルールは、堅牢でエラーのないデータ転送を保証するメカニズムに他なりません。 これらのメカニズムは、外部クロック信号を回避するために取得します-

  • 同期ビット
  • データビット
  • パリティビット
  • ボーレート

同期ビット

同期ビットは、データの各パケットで転送される2つまたは3つの特別なビットです。 それらは開始ビットと停止ビットです。 その名の通り、これらのビットはそれぞれパケットの始まりと終わりを示します。

開始ビットは常に1つだけですが、停止ビットの数は1つまたは2つに設定できます(通常は1つのままです)。

スタートビットは常に1から0までのアイドルデータラインで示され、ストップビットはラインを1に保持することでアイドル状態に戻ります。

同期ビット

データビット

各パケットのデータ量は、5〜9ビットの任意のサイズに設定できます。 確かに、標準のデータサイズは基本的な8ビットバイトですが、他のサイズにも用途があります。 7ビットのデータパケットは、特に7ビットのASCII文字を転送するだけの場合、8よりも効率的です。

パリティビット

ユーザーは、パリティビットを使用するかどうかを選択できます。使用する場合は、パリティを奇数にするか偶数にするかを選択できます。 データビット間の1の数が偶数の場合、パリティビットは0です。 奇数パリティは正反対です。

ボーレート

ボーレートという用語は、1秒間に転送されるビット数[bps]を示すために使用されます。 バイトではなくビットを参照することに注意してください。 通常、プロトコルでは、各バイトがいくつかの制御ビットとともに転送される必要があります。 これは、シリアルデータストリームの1バイトが11ビットで構成されることを意味します。 たとえば、ボーレートが300 bpsの場合、1秒あたり最大37バイトと最小27バイトが転送されます。

Arduino UART

次のコードは、起動時にArduinoにHello Worldを送信させます。

void setup() {
   Serial.begin(9600);//set up serial library baud rate to 9600
   Serial.println("hello world");//print hello world
}

void loop() {

}

ArduinoスケッチがArduinoにアップロードされたら、Arduino IDEの右上のセクションでシリアルモニターSearchを開きます。

シリアルモニターの上部のボックスに何かを入力し、キーボードの[送信]または[Enter]を押します。 これにより、一連のバイトがArduinoに送信されます。

次のコードは、入力として受け取ったものをすべて返します。

次のコードは、提供された入力に応じてArduinoに出力を配信させます。

void setup() {
   Serial.begin(9600);//set up serial library baud rate to 9600
}

void loop() {
   if(Serial.available())//if number of bytes (characters) available for reading from {
      serial port
      Serial.print("I received:");//print I received
      Serial.write(Serial.read());//send what you read
   }
}
*Serial.print* と *Serial.println* は実際のASCIIコードを送り返し、 *Serial.write* は実際のテキストを送り返します。 詳細については、ASCIIコードを参照してください。

Arduino-集積回路間

Inter-integrated circuit(I2C)は、マイクロコントローラと新世代の専用集積回路との間でシリアルデータを交換するためのシステムです。 それらの間の距離が短い場合に使用されます(受信機と送信機は通常同じプリント基板上にあります)。 接続は2本の導体を介して確立されます。 1つはデータ転送に使用され、もう1つは同期(クロック信号)に使用されます。

次の図に示すように、1つのデバイスが常にマスターです。 通信を開始する前に、1つのスレーブチップのアドレス指定を実行します。 このようにして、1つのマイクロコントローラーが112の異なるデバイスと通信できます。 ボーレートは通常、100 Kb/秒(標準モード)または10 Kb/秒(低速ボーレートモード)です。 ボーレートが3.4 Mb/秒のシステムが最近登場しました。 I2Cバスで通信するデバイス間の距離は数メートルに制限されています。

I2C

ボードI2Cピン

I2Cバスは、SCLとSDAの2つの信号で構成されています。 SCLはクロック信号で、SDAはデータ信号です。 現在のバスマスターは常にクロック信号を生成します。 スレーブデバイスの中には、マスターがより多くのデータを送信するのを遅らせるために(またはマスターがクロックアウトを試みる前にデータを準備するためにより多くの時間を必要とするために)クロックを時々低くするものがあります。 これは「クロックストレッチング」として知られています。

以下は、さまざまなArduinoボードのピンです-

  • Uno、Pro Mini A4(SDA)、A5(SCL)
  • メガ、期限20(SDA)、21(SCL)
  • レオナルド、ユン2(SDA)、3(SCL)

Arduino I2C

I2Cを使用して2つのArduinoボードを接続するには、マスターコードとスレーブコードの2つのモードがあります。 彼らは-

  • マスター送信機/スレーブ受信機
  • マスターレシーバー/スレーブトランスミッター

マスター送信機/スレーブ受信機

ここで、マスター送信機とスレーブ受信機を見てみましょう。

マスター送信機

以下の関数は、Wireライブラリを初期化し、I2Cバスをマスターまたはスレーブとして参加させるために使用されます。 通常、これは一度だけ呼び出されます。

  • * Wire.begin(address)*-アドレスは、マスターが指定されておらず、バスとしてマスターとして参加するため、この例では7ビットのスレーブアドレスです。
  • * Wire.beginTransmission(address)*-指定されたアドレスでI2Cスレーブデバイスへの送信を開始します。
  • * Wire.write(value)*-マスターからスレーブデバイスへの送信(beginTransmission()とendTransmission()の呼び出しの間に)のバイトをキューに入れます。
  • * Wire.endTransmission()*-beginTransmission()によって開始されたスレーブデバイスへの送信を終了し、wire.write()によってキューに入れられたバイトを送信します。

#include <Wire.h>//include wire library

void setup()//this will run only once {
   Wire.begin();//join i2c bus as master
}

short age = 0;

void loop() {
   Wire.beginTransmission(2);
  //transmit to device #2
   Wire.write("age is = ");
   Wire.write(age);//sends one byte
   Wire.endTransmission();//stop transmitting
   delay(1000);
}

スレーブ受信機

次の機能が使用されます-

  • * Wire.begin(address)*-アドレスは7ビットのスレーブアドレスです。
  • * Wire.onReceive(received data handler)*-スレーブデバイスがマスターからデータを受信したときに呼び出される関数。
  • * Wire.available()*-Wire.read()で取得できるバイト数を返します。これはWire.onReceive()ハンドラー内で呼び出す必要があります。

#include <Wire.h>//include wire library

void setup() { //this will run only once
   Wire.begin(2);//join i2c bus with address #2
   Wire.onReceive(receiveEvent);//call receiveEvent when the master send any thing
   Serial.begin(9600);//start serial for output to print what we receive
}

void loop() {
   delay(250);
}

//-----this function will execute whenever data is received from master-----//

void receiveEvent(int howMany) {
   while (Wire.available()>1)//loop through all but the last {
      char c = Wire.read();//receive byte as a character
      Serial.print(c);//print the character
   }
}

マスターレシーバー/スレーブトランスミッター

ここで、マスターレシーバーとスレーブトランスミッターを見てみましょう。

マスターレシーバー

マスターは、一意にアドレス指定されたスレーブArduinoから送信されるデータのバイトを要求し、読み取るようにプログラムされています。

次の機能が使用されます-

  • Wire.requestFrom(address、number of bytes)*-マスターがスレーブデバイスからバイトを要求するために使用します。 次に、関数wire.available()およびwire.read()関数を使用してバイトを取得できます。

#include <Wire.h>//include wire library void setup() {
   Wire.begin();//join i2c bus (address optional for master)
   Serial.begin(9600);//start serial for output
}

void loop() {
   Wire.requestFrom(2, 1);//request 1 bytes from slave device #2
   while (Wire.available())//slave may send less than requested {
      char c = Wire.read();//receive a byte as character
      Serial.print(c);//print the character
   }
   delay(500);
}

スレーブ送信機

以下の機能が使用されます。

  • Wire.onRequest(handler)*-マスターがこのスレーブデバイスからデータを要求すると、関数が呼び出されます。

#include <Wire.h>

void setup() {
   Wire.begin(2);//join i2c bus with address #2
   Wire.onRequest(requestEvent);//register event
}

Byte x = 0;

void loop() {
   delay(100);
}

//function that executes whenever data is requested by master
//this function is registered as an event, see setup()

void requestEvent() {
   Wire.write(x);//respond with message of 1 bytes as expected by master
   x++;
}

Arduino-シリアル周辺機器インターフェース

シリアルペリフェラルインターフェイス(SPI)バスは、シリアル通信用のシステムで、最大4本(通常は3本)の導体を使用します。 1つの導体はデータ受信、1つはデータ送信、1つは同期、もう1つは通信するデバイスの選択に使用されます。 これは全二重接続です。つまり、データは同時に送受信されます。 最大ボーレートは、I2C通信システムよりも高くなっています。

ボードSPIピン

SPIは次の4本のワイヤを使用します-

  • SCK -これはマスターによって駆動されるシリアルクロックです。
  • MOSI -これは、マスターによって駆動されるマスター出力/スレーブ入力です。
  • MISO -これは、マスターによって駆動されるマスター入力/スレーブ出力です。
  • SS -これはスレーブ選択線です。

以下の機能が使用されます。 SPI.hを含める必要があります。

  • * SPI.begin()*-SCK、MOSI、およびSSを出力に設定し、SCKおよびMOSIをLowに、SSをHighに設定することにより、SPIバスを初期化します。
  • * SPI.setClockDivider(divider)*-システムクロックに対してSPIクロック分周器を設定します。 AVRベースのボードでは、利用可能な仕切りは2、4、8、16、32、64または128です。 デフォルト設定はSPI_CLOCK_DIV4で、SPIクロックをシステムクロックの4分の1の周波数(20 MHzのボードでは5 Mhz)に設定します。
  • 分周器-(SPI_CLOCK_DIV2、SPI_CLOCK_DIV4、SPI_CLOCK_DIV8、SPI_CLOCK_DIV16、SPI_CLOCK_DIV32、SPI_CLOCK_DIV64、SPI_CLOCK_DIV128)の可能性があります。
  • * SPI.transfer(val)*-SPI転送は同時送信および受信に基づいています。受信データはreceivedValに返されます。
  • * SPI.beginTransaction(SPISettings(speedMaximum、dataOrder、dataMode))*-speedMaximumはクロック、dataOrder(MSBFIRSTまたはLSBFIRST)、dataMode(SPI_MODE0、SPI_MODE1、SPI_MODE2、またはSPI_MODE3)です。

SPIには次の4つの動作モードがあります-

  • モード0(デフォルト)-クロックは通常ロー(CPOL = 0)で、データはローからハイへの遷移(リーディングエッジ)でサンプリングされます(CPHA = 0)。
  • *モード1 *-クロックは通常ロー(CPOL = 0)で、データはハイからローへの遷移(トレーリングエッジ)でサンプリングされます(CPHA = 1)。
  • *モード2 *-クロックは通常High(CPOL = 1)で、データはHighからLowへの遷移(リーディングエッジ)でサンプリングされます(CPHA = 0)。
  • *モード3 *-クロックは通常ハイ(CPOL = 1)で、データはローからハイへの遷移(トレーリングエッジ)でサンプリングされます(CPHA = 1)。
  • * SPI.attachInterrupt(handler)*-スレーブデバイスがマスターからデータを受信したときに呼び出される関数。

次に、2つのArduino UNOボードを接続します。 1つはマスター、もう1つはスレーブです。

  • (SS):ピン10
  • (MOSI):ピン11
  • (MISO):ピン12 *(SCK):ピン13

グラウンドは一般的です。 以下は、両方のボード間の接続の図表示です-

ボードの接続

SPIをマスターとして、SPIをスレーブとして使用する例を見てみましょう。

マスターとしてのSPI

#include <SPI.h>

void setup (void) {
   Serial.begin(115200);//set baud rate to 115200 for usart
   digitalWrite(SS, HIGH);//disable Slave Select
   SPI.begin ();
   SPI.setClockDivider(SPI_CLOCK_DIV8);//divide the clock by 8
}

void loop (void) {
   char c;
   digitalWrite(SS, LOW);//enable Slave Select
  //send test string
   for (const char* p = "Hello, world!\r" ; c = *p; p++) {
      SPI.transfer (c);
      Serial.print(c);
   }
   digitalWrite(SS, HIGH);//disable Slave Select
   delay(2000);
}

スレーブとしてのSPI

#include <SPI.h>
char buff [50];
volatile byte indx;
volatile boolean process;

void setup (void) {
   Serial.begin (115200);
   pinMode(MISO, OUTPUT);//have to send on master in so it set as output
   SPCR |= _BV(SPE);//turn on SPI in slave mode
   indx = 0;//buffer empty
   process = false;
   SPI.attachInterrupt();//turn on interrupt
}
ISR (SPI_STC_vect)//SPI interrupt routine {
   byte c = SPDR;//read byte from SPI Data Register
   if (indx < sizeof buff) {
      buff [indx++] = c;//save data in the next index in the array buff
      if (c == '\r')//check for the end of the word
      process = true;
   }
}

void loop (void) {
   if (process) {
      process = false;//reset the process
      Serial.println (buff);//print the array on serial monitor
      indx= 0;//reset button to zero
   }
}

Arduino-点滅LED

LEDは、多くの異なるアプリケーションで使用される小型で強力なライトです。 まず、マイクロコントローラーのHello WorldであるLEDの点滅に取り組みます。 ライトをオン/オフするのと同じくらい簡単です。 この重要なベースラインを確立することにより、より複雑な実験に向けて努力する際の強固な基盤が得られます。

必要なコンポーネント

次のコンポーネントが必要になります-

  • 1×ブレッドボード
  • 1×Arduino Uno R3
  • 1×LED
  • 1×330Ω抵抗
  • 2×ジャンパー

手順

以下の画像に示すように、回路図に従って、ブレッドボード上のコンポーネントを接続します。

ブレッドボード

-LEDの極性を調べるには、よく見てください。 電球の平らな端に向かう2本の脚のうち短い方がマイナス端子を示します。

LED

抵抗器などのコンポーネントは、ブレッドボードソケットに適切に適合するために、端子を90°の角度に曲げる必要があります。 端子を短く切断することもできます。

抵抗器

スケッチ

コンピューターでArduino IDEソフトウェアを開きます。 Arduino言語でコーディングすると、回路が制御されます。 [新規]をクリックして、新しいスケッチファイルを開きます。

スケッチ

Arduinoコード

/*
   Blink
   Turns on an LED on for one second, then off for one second, repeatedly.
*/

//the setup function runs once when you press reset or power the board

void setup() { //initialize digital pin 13 as an output.
   pinMode(2, OUTPUT);
}

//the loop function runs over and over again forever

void loop() {
   digitalWrite(2, HIGH);//turn the LED on (HIGH is the voltage level)
   delay(1000);//wait for a second
   digitalWrite(2, LOW);//turn the LED off by making the voltage LOW
   delay(1000);//wait for a second
}

注意すべきコード

  • pinMode(2、OUTPUT)*-Arduinoのピンのいずれかを使用する前に、Arduino Uno R3がINPUTかOUTPUTかを伝える必要があります。 これを行うには、pinMode()と呼ばれる組み込みの「関数」を使用します。
  • digitalWrite(2、HIGH)*-ピンをOUTPUTとして使用している場合、HIGH(出力5ボルト)またはLOW(出力0ボルト)になるように命令できます。

結果

LEDのオンとオフが表示されるはずです。 必要な出力が表示されない場合は、回路が正しく組み立てられていることを確認し、コードを検証してボードにアップロードします。

Arduino-フェージングLED

この例は、LEDをフェードオフする際にanalogWrite()関数を使用する方法を示しています。 AnalogWriteは、パルス幅変調(PWM)を使用して、デジタルピンをオンとオフの異なる比率で非常に迅速にオンとオフにし、フェージング効果を作成します。

必要なコンポーネント

次のコンポーネントが必要になります-

  • 1×ブレッドボード
  • 1×Arduino Uno R3
  • 1×LED
  • 1×330Ω抵抗
  • 2×ジャンパー

手順

以下の画像に示すように、回路図に従って、ブレッドボード上のコンポーネントを接続します。

ブレッドボード上のコンポーネント

-LEDの極性を調べるには、よく見てください。 電球の平らな端に向かう2本の脚のうち短い方がマイナス端子を示します。

LED

抵抗器などのコンポーネントは、ブレッドボードソケットに適切に適合するために、端子を90°の角度に曲げる必要があります。 端子を短く切断することもできます。

抵抗器

スケッチ

コンピューターでArduino IDEソフトウェアを開きます。 Arduino言語でコーディングすると、回路が制御されます。 [新規]をクリックして、新しいスケッチファイルを開きます。

スケッチ

Arduinoコード

/*
   Fade
   This example shows how to fade an LED on pin 9 using the analogWrite() function.

   The analogWrite() function uses PWM, so if you want to change the pin you're using, be
   sure to use another PWM capable pin. On most Arduino, the PWM pins are identified with
   a "~" sign, like ~3, ~5, ~6, ~9, ~10 and ~11.
*/

int led = 9;//the PWM pin the LED is attached to
int brightness = 0;//how bright the LED is
int fadeAmount = 5;//how many points to fade the LED by
//the setup routine runs once when you press reset:

void setup() {
  //declare pin 9 to be an output:
   pinMode(led, OUTPUT);
}

//the loop routine runs over and over again forever:

void loop() {
  //set the brightness of pin 9:
   analogWrite(led, brightness);
  //change the brightness for next time through the loop:
   brightness = brightness + fadeAmount;
  //reverse the direction of the fading at the ends of the fade:
   if (brightness == 0 || brightness == 255) {
      fadeAmount = -fadeAmount ;
   }
  //wait for 30 milliseconds to see the dimming effect
   delay(300);
}

注意すべきコード

ピン9をLEDピンとして宣言した後、コードのsetup()関数で行うことは何もありません。 コードのメインループで使用するanalogWrite()関数には2つの引数が必要です。1つは関数に書き込むピンを指定し、もう1つは書き込むPWM値を指定します。

LEDをオフおよびオンにフェードするには、PWM値を0(完全にオフ)から255(完全にオン)に徐々に増やし、次に0に戻し、サイクルを完了します。 上記のスケッチでは、PWM値は明るさと呼ばれる変数を使用して設定されます。 ループを通るたびに、変数 fadeAmount の値だけ増加します。

輝度がその値の極端な値(0または255)である場合、fadeAmountはその負に変更されます。 つまり、fadeAmountが5の場合、-5に設定されます。 -5の場合、5に設定されます。 次回のループでは、この変更により、輝度も方向を変更します。

  • analogWrite()*はPWM値を非常に高速に変更できるため、スケッチの最後の遅延がフェードの速度を制御します。 遅延の値を変更して、フェーディング効果がどのように変化するかを確認してください。

結果

LEDの輝度が徐々に変化します。

Arduino-アナログ電圧の読み取り

この例では、アナログピン0のアナログ入力を読み取る方法を示します。 入力はanalogRead()から電圧に変換され、Arduino Software(IDE)のシリアルモニターに出力されます。

必要なコンポーネント

次のコンポーネントが必要になります-

  • 1×ブレッドボード
  • 1×Arduino Uno R3
  • 1×5K可変抵抗器(ポテンショメーター)
  • 2×ジャンパー

手順

以下の画像に示すように、回路図に従って、ブレッドボード上のコンポーネントを接続します。

アナログブレッドボード

ポテンショメータ

ポテンショメータ(またはポット)は、単純な電気機械式トランスデューサです。 入力オペレータからの回転運動または直線運動を抵抗の変化に変換します。 この変更は、ハイファイシステムのボリュームから巨大なコンテナ船の方向に至るまで、あらゆるものを制御するために使用されます(または使用することができます)。

私たちが知っているポットは、元々レオスタット(本質的に可変巻線抵抗器)として知られていました。 現在利用できるポットの種類は非常に驚くべきものであり、初心者が(特に)どのタイプが特定のタスクに適しているかを判断するのは非常に困難です。 同じタスクにすべて使用できるいくつかの異なる種類のポットは、仕事を難しくします。

ポテンショメーター

左側の画像は、ポットの標準的な回路図記号を示しています。 右の画像はポテンショメーターです。

スケッチ

コンピューターでArduino IDEソフトウェアを開きます。 Arduino言語でコーディングすると、回路が制御されます。 [新規]をクリックして、新しいスケッチファイルを開きます。

スケッチ

Arduinoコード

/*
   ReadAnalogVoltage
   Reads an analog input on pin 0, converts it to voltage,
   and prints the result to the serial monitor.
   Graphical representation is available using serial plotter (Tools > Serial Plotter menu)
   Attach the center pin of a potentiometer to pin A0, and the outside pins to +5V and ground.
*/

//the setup routine runs once when you press reset:

void setup() {
  //initialize serial communication at 9600 bits per second:
   Serial.begin(9600);
}

//the loop routine runs over and over again forever:

void loop() {
  //read the input on analog pin 0:
   int sensorValue = analogRead(A0);
  //Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
   float voltage = sensorValue *(5.0/1023.0);
  //print out the value you read:
   Serial.println(voltage);
}

注意すべきコード

以下に示すプログラムまたはスケッチでは、セットアップ機能で最初に行うことは、ラインとボードとコンピューターの間で、9600ビット/秒でシリアル通信を開始することです-

Serial.begin(9600);

コードのメインループでは、ポテンショメーターからの抵抗値(intデータ型に最適な0〜1023の間)を格納する変数を確立する必要があります-

int sensorValue = analogRead(A0);

値を0-1023から電圧に対応する範囲に変更するには、ピンが読み取り中です。別の変数、フロートを作成し、少し計算する必要があります。 0.0と5.0の間で数値をスケーリングするには、5.0を1023.0で割り、sensorValueで乗算します-

float voltage= sensorValue* (5.0/1023.0);

最後に、この情報をシリアルウィンドウに印刷する必要があります。 あなたは、コードの最後の行でコマンドSerial.println()でこれを行うことができます-

Serial.println(voltage)

次に、上部の緑色のバーの右側にあるアイコンをクリックするか、Ctrl + Shift + Mを押して、Arduino IDEでシリアルモニターを開きます。

シリアルモニター

結果

0.0〜5.0の範囲の数の安定したストリームが表示されます。 ポットを回すと、ピンA0の電圧に対応して値が変化します。

Arduino-LED棒グラフ

この例では、アナログピン0のアナログ入力を読み取り、analogRead()の値を電圧に変換し、Arduino Software(IDE)のシリアルモニターに出力する方法を示します。

必要なコンポーネント

次のコンポーネントが必要になります-

  • 1×ブレッドボード
  • 1×Arduino Uno R3
  • 1×5kオーム可変抵抗器(ポテンショメーター)
  • 2×ジャンパー
  • 8×LEDまたは使用可能(下の画像に示すようにLEDバーグラフ表示)

手順

以下の画像に示すように、回路図に従って、ブレッドボード上のコンポーネントを接続します。

バーブレッドボード

バーブレッドボードへの接続

スケッチ

コンピューターでArduino IDEソフトウェアを開きます。 Arduino言語でコーディングすると、回路が制御されます。 [新規]をクリックして、新しいスケッチファイルを開きます。

スケッチ

10セグメントLED棒グラフ

LEDバーグラフ

これらの10セグメント棒グラフLEDには多くの用途があります。 コンパクトな設置面積とシンプルな接続により、プロトタイプや完成品を簡単に作成できます。 基本的に、10個の個別の青色LEDが一緒に収容され、それぞれ個別のアノードとカソードの接続があります。

また、黄色、赤、緑の色も用意されています。

-これらの棒グラフのピン配置は、データシートに記載されているものと異なる場合があります。 デバイスを180度回転させると、変更が修正され、ピン11が最初のピンになります。

Arduinoコード

/*
   LED bar graph
   Turns on a series of LEDs based on the value of an analog sensor.
   This is a simple way to make a bar graph display.
   Though this graph uses 8LEDs, you can use any number by
      changing the LED count and the pins in the array.
   This method can be used to control any series of digital
      outputs that depends on an analog input.
*/

//these constants won't change:
const int analogPin = A0;//the pin that the potentiometer is attached to
const int ledCount = 8;//the number of LEDs in the bar graph
int ledPins[] = {2, 3, 4, 5, 6, 7, 8, 9};//an array of pin numbers to which LEDs are attached

void setup() {
  //loop over the pin array and set them all to output:
   for (int thisLed = 0; thisLed < ledCount; thisLed++) {
      pinMode(ledPins[thisLed], OUTPUT);
   }
}

void loop() {
  //read the potentiometer:
   int sensorReading = analogRead(analogPin);
  //map the result to a range from 0 to the number of LEDs:
   int ledLevel = map(sensorReading, 0, 1023, 0, ledCount);
  //loop over the LED array:
   for (int thisLed = 0; thisLed < ledCount; thisLed++) {
     //if the array element's index is less than ledLevel,
     //turn the pin for this element on:
      if (thisLed < ledLevel) {
         digitalWrite(ledPins[thisLed], HIGH);
      }else {//turn off all pins higher than the ledLevel:
         digitalWrite(ledPins[thisLed], LOW);
      }
   }
}

注意すべきコード

スケッチは次のように機能します。最初に、入力を読み取ります。 入力値を出力範囲(この場合は10個のLED)にマップします。 次に、出力を反復処理する for-loop を設定します。 シリーズ内の出力の番号がマッピングされた入力範囲よりも小さい場合は、オンにします。 そうでない場合は、オフにします。

結果

アナログ読み取り値が増加するとLEDが1つずつ点灯し、読み取り値が減少している間に1つずつ消灯します。

Arduino-キーボードログアウト

この例では、キーボードライブラリを使用して、ARDUINO UNOのピン2が接地されたときにコンピューターのユーザーセッションからログアウトします。 スケッチは、2つまたは3つのキーのシーケンスで同時にキープレスをシミュレートし、少し遅れてリリースします。

警告-* Keyboard.print()*コマンドを使用すると、Arduinoがコンピューターのキーボードを引き継ぎます。 この機能を使用してスケッチを実行しているときにコンピューターの制御が失われないようにするには、Keyboard.print()を呼び出す前に信頼できる制御システムをセットアップします。 このスケッチは、ピンが接地された後にのみキーボードコマンドを送信するように設計されています。

必要なコンポーネント

次のコンポーネントが必要になります-

  • 1×ブレッドボード
  • 1×Arduino Leonardo、Micro、またはDueボード
  • 1×プッシュボタン
  • 1×ジャンパー

手順

以下の画像に示すように、回路図に従って、ブレッドボード上のコンポーネントを接続します。

キーボードブレッドボード

スケッチ

コンピューターでArduino IDEソフトウェアを開きます。 Arduino言語でコーディングすると、回路が制御されます。 [新規]をクリックして、新しいスケッチファイルを開きます。

この例では、Arduino IDE 1.6.7を使用する必要があります

スケッチ

-Arduinoライブラリファイルにキーボードライブラリを含める必要があります。 次のスクリーンショットに示すように、ライブラリ内のキーパッドライブラリファイルをコピーして、ライブラリ名(強調表示)を付けて貼り付けます。

Arduinoライブラリファイル

Arduinoコード

/*
   Keyboard logout
   This sketch demonstrates the Keyboard library.
   When you connect pin 2 to ground, it performs a logout.
   It uses keyboard combinations to do this, as follows:
   On Windows, CTRL-ALT-DEL followed by ALT-l
   On Ubuntu, CTRL-ALT-DEL, and ENTER
   On OSX, CMD-SHIFT-q
   To wake: Spacebar.
   Circuit:
 *Arduino Leonardo or Micro
  * wire to connect D2 to ground.
*/

#define OSX 0
#define WINDOWS 1
#define UBUNTU 2

#include "Keyboard.h"

//change this to match your platform:
int platform = WINDOWS;

void setup() {
  //make pin 2 an input and turn on the
  //pullup resistor so it goes high unless
  //connected to ground:

   pinMode(2, INPUT_PULLUP);
   Keyboard.begin();
}

void loop() {
   while (digitalRead(2) == HIGH) {
     //do nothing until pin 2 goes low
      delay(500);
   }

   delay(1000);

   switch (platform) {
      case OSX:
      Keyboard.press(KEY_LEFT_GUI);

     //Shift-Q logs out:
      Keyboard.press(KEY_LEFT_SHIFT);
      Keyboard.press('Q');
      delay(100);

     //enter:
      Keyboard.write(KEY_RETURN);
      break;

      case WINDOWS:
     //CTRL-ALT-DEL:
      Keyboard.press(KEY_LEFT_CTRL);
      Keyboard.press(KEY_LEFT_ALT);
      Keyboard.press(KEY_DELETE);
      delay(100);
      Keyboard.releaseAll();

     //ALT-l:
      delay(2000);
      Keyboard.press(KEY_LEFT_ALT);
      Keyboard.press('l');
      Keyboard.releaseAll();
      break;

      case UBUNTU:
     //CTRL-ALT-DEL:
      Keyboard.press(KEY_LEFT_CTRL);
      Keyboard.press(KEY_LEFT_ALT);
      Keyboard.press(KEY_DELETE);

      delay(1000);
      Keyboard.releaseAll();

     //Enter to confirm logout:
      Keyboard.write(KEY_RETURN);
      break;
   }

  //do nothing:
   while (true);
}

Keyboard.releaseAll();

  //enter:
      Keyboard.write(KEY_RETURN);
      break;
      case WINDOWS:

  //CTRL-ALT-DEL:
      Keyboard.press(KEY_LEFT_CTRL);
      Keyboard.press(KEY_LEFT_ALT);
      Keyboard.press(KEY_DELETE);
      delay(100);
      Keyboard.releaseAll();

  //ALT-l:
      delay(2000);
      Keyboard.press(KEY_LEFT_ALT);
      Keyboard.press('l');
      Keyboard.releaseAll();
      break;

   case UBUNTU:
     //CTRL-ALT-DEL:
      Keyboard.press(KEY_LEFT_CTRL);
      Keyboard.press(KEY_LEFT_ALT);
      Keyboard.press(KEY_DELETE);
      delay(1000);
      Keyboard.releaseAll();

     //Enter to confirm logout:
      Keyboard.write(KEY_RETURN);
      break;
   }

//do nothing:
   while (true);
}

注意すべきコード

ボードにプログラムをアップロードする前に、現在使用している正しいOSをプラットフォーム変数に必ず割り当ててください。

スケッチの実行中にボタンを押すと、ピン2がグランドに接続され、ボードはログアウトシーケンスをUSB接続されたPCに送信します。

結果

ピン2をアースに接続すると、ログアウト操作が実行されます。

次のキーボードの組み合わせを使用してログアウトします-

  • Windows では、CTRL-ALT-DELに続いてALT-l
  • Ubuntu 、CTRL-ALT-DEL、およびENTER
  • OSX では、CMD-SHIFT-q

Arduino-キーボードメッセージ

この例では、ボタンが押されると、テキスト文字列がキーボード入力としてコンピューターに送信されます。 文字列は、ボタンが押された回数を報告します。 Leonardoのプログラミングと接続が完了したら、お気に入りのテキストエディターを開いて結果を確認します。

警告-* Keyboard.print()コマンドを使用すると、Arduinoがコンピューターのキーボードを引き継ぎます。 この機能を使用してスケッチを実行しているときにコンピューターの制御が失われないようにするには、 Keyboard.print()*を呼び出す前に、信頼できる制御システムをセットアップします。 このスケッチには、キーボードを切り替えるプッシュボタンが含まれているため、ボタンが押された後にのみ実行されます。

必要なコンポーネント

次のコンポーネントが必要になります-

  • 1×ブレッドボード
  • 1×Arduino Leonardo、Micro、またはDueボード
  • 1×瞬間押しボタン
  • 1×10kオーム抵抗

手順

以下の画像に示すように、回路図に従って、ブレッドボード上のコンポーネントを接続します。

キーボードメッセージブレッドボード

スケッチ

コンピューターでArduino IDEソフトウェアを開きます。 Arduino言語でコーディングすると、回路が制御されます。 [新規]をクリックして、新しいスケッチファイルを開きます。

スケッチ

Arduinoコード

/*
   Keyboard Message test For the Arduino Leonardo and Micro,
      Sends a text string when a button is pressed.
   The circuit:
 *pushbutton attached from pin 4 to +5V
  * 10-kilohm resistor attached from pin 4 to ground
*/

#include "Keyboard.h"
const int buttonPin = 4;//input pin for pushbutton
int previousButtonState = HIGH;//for checking the state of a pushButton
int counter = 0;//button push counter

void setup() {
   pinMode(buttonPin, INPUT);//make the pushButton pin an input:
   Keyboard.begin();//initialize control over the keyboard:
}

void loop() {
   int buttonState = digitalRead(buttonPin);//read the pushbutton:
   if ((buttonState != previousButtonState)&& (buttonState == HIGH))//and it's currently pressed: {
     //increment the button counter
      counter++;
     //type out a message
      Keyboard.print("You pressed the button ");
      Keyboard.print(counter);
      Keyboard.println(" times.");
   }
  //save the current button state for comparison next time:
   previousButtonState = buttonState;
}

注意すべきコード

プッシュボタンの一方の端子をArduinoのピン4に取り付けます。 もう一方のピンを5Vに接続します。 抵抗をプルダウンとして使用し、ピン4からグランドに接続することにより、グランドへのリファレンスを提供します。

ボードをプログラムしたら、USBケーブルを抜き、テキストエディターを開いて、テキストカーソルを入力領域に置きます。 ボードをもう一度USB経由でコンピューターに接続し、ボタンを押して文書に書き込みます。

結果

任意のテキストエディターを使用して、Arduino経由で送信されたテキストを表示します。

Arduino-マウスボタンコントロール

マウスライブラリを使用すると、Arduino Leonardo、Micro、またはDueを使用してコンピューターの画面上のカーソルを制御できます。

この特定の例では、5つのプッシュボタンを使用して画面上のカーソルを移動します。 4つのボタンは方向(上、下、左、右)で、1つはマウスの左クリック用です。 Arduinoからのカーソルの動きは常に相対的です。 入力が読み取られるたびに、カーソルの位置は現在の位置に対して相対的に更新されます。

方向ボタンの1つが押されるたびに、Arduinoはマウスを動かし、HIGH入力を適切な方向の5の範囲にマッピングします。

5番目のボタンは、マウスの左クリックを制御するためのものです。 ボタンを離すと、コンピューターはイベントを認識します。

必要なコンポーネント

次のコンポーネントが必要になります-

  • 1×ブレッドボード
  • 1×Arduino Leonardo、MicroまたはDueボード
  • 5×10kオーム抵抗
  • 5×瞬間押しボタン

手順

以下の画像に示すように、回路図に従って、ブレッドボード上のコンポーネントを接続します。

マウスボタンブレッドボード

スケッチ

コンピューターでArduino IDEソフトウェアを開きます。 Arduino言語でコーディングすると、回路が制御されます。 [新規]をクリックして、新しいスケッチファイルを開きます。

この例では、Arduino IDE 1.6.7を使用する必要があります

スケッチ

Arduinoコード

/*
   Button Mouse Control
   For Leonardo and Due boards only .Controls the mouse from
   five pushbuttons on an Arduino Leonardo, Micro or Due.
   Hardware:
   * 5 pushbuttons attached to D2, D3, D4, D5, D6
   The mouse movement is always relative. This sketch reads
   four pushbuttons, and uses them to set the movement of the mouse.
   WARNING: When you use the Mouse.move() command, the Arduino takes
   over your mouse! Make sure you have control before you use the mouse commands.
*/

#include "Mouse.h"
//set pin numbers for the five buttons:
const int upButton = 2;
const int downButton = 3;
const int leftButton = 4;
const int rightButton = 5;
const int mouseButton = 6;
int range = 5;//output range of X or Y movement; affects movement speed
int responseDelay = 10;//response delay of the mouse, in ms

void setup() {
  //initialize the buttons' inputs:
   pinMode(upButton, INPUT);
   pinMode(downButton, INPUT);
   pinMode(leftButton, INPUT);
   pinMode(rightButton, INPUT);
   pinMode(mouseButton, INPUT);
  //initialize mouse control:
   Mouse.begin();
}

void loop() {
  //read the buttons:
   int upState = digitalRead(upButton);
   int downState = digitalRead(downButton);
   int rightState = digitalRead(rightButton);
   int leftState = digitalRead(leftButton);
   int clickState = digitalRead(mouseButton);
  //calculate the movement distance based on the button states:
   int xDistance = (leftState - rightState) *range;
   int yDistance = (upState - downState)* range;
  //if X or Y is non-zero, move:
   if ((xDistance != 0) || (yDistance != 0)) {
      Mouse.move(xDistance, yDistance, 0);
   }

  //if the mouse button is pressed:
   if (clickState == HIGH) {
     //if the mouse is not pressed, press it:
      if (!Mouse.isPressed(MOUSE_LEFT)) {
         Mouse.press(MOUSE_LEFT);
      }
   } else {                          //else the mouse button is not pressed:
     //if the mouse is pressed, release it:
      if (Mouse.isPressed(MOUSE_LEFT)) {
         Mouse.release(MOUSE_LEFT);
      }
   }
  //a delay so the mouse does not move too fast:
   delay(responseDelay);
}

注意すべきコード

マイクロUSBケーブルでボードをコンピューターに接続します。 ボタンは、ピン2〜6のデジタル入力に接続されます。 必ず10kプルダウン抵抗を使用してください。

Arduino-キーボードシリアル

この例では、シリアルポートからのバイトをリッスンします。 ボードは、受信するとキーストロークをコンピューターに送り返します。 送信されたキーストロークは受信したものよりも1つ高いため、シリアルモニターから「a」を送信すると、コンピューターに接続されたボードから「b」を受信します。 「1」は「2」などを返します。

警告-* Keyboard.print()*コマンドを使用すると、Leonardo、Micro、またはDueボードがコンピューターのキーボードを引き継ぎます。 この機能を使用してスケッチを実行しているときにコンピューターの制御が失われないようにするには、Keyboard.print()を呼び出す前に信頼できる制御システムをセットアップします。 このスケッチは、ボードがシリアルポート経由でバイトを受信した後にのみキーボードコマンドを送信するように設計されています。

必要なコンポーネント

次のコンポーネントが必要になります-

  • 1×Arduino Leonardo、Micro、またはDueボード

手順

USBケーブルを使用してボードをコンピューターに接続するだけです。

キーボードシリアルブレッドボード

スケッチ

コンピューターでArduino IDEソフトウェアを開きます。 Arduino言語でコーディングすると、回路が制御されます。 [新規]をクリックして、新しいスケッチファイルを開きます。

スケッチ

-Arduinoライブラリファイルにキーパッドライブラリを含める必要があります。 ファイル内のキーパッドライブラリファイルをコピーして、「ライブラリ」という名前を黄色で強調表示して貼り付けます。

Arduinoライブラリファイル

Arduinoコード

/*
   Keyboard test
   For the Arduino Leonardo, Micro or Due Reads
      a byte from the serial port, sends a keystroke back.
   The sent keystroke is one higher than what's received, e.g. if you send a, you get b, send
      A you get B, and so forth.
   The circuit:
   * none
*/

#include "Keyboard.h"

void setup() {
  //open the serial port:
   Serial.begin(9600);
  //initialize control over the keyboard:
   Keyboard.begin();
}

void loop() {
  //check for incoming serial data:
   if (Serial.available() > 0) {
     //read incoming serial data:
      char inChar = Serial.read();
     //Type the next ASCII value from what you received:
      Keyboard.write(inChar + 1);
   }
}

注意すべきコード

プログラムが完了したら、シリアルモニターを開いてバイトを送信します。 ボードはキーストロークで応答します。これは1桁上の数字です。

結果

ボードは、バイトを送信するとArduino IDEシリアルモニター上で1桁高いキーストロークで応答します。

Arduino-湿度センサー

このセクションでは、Arduinoボードをさまざまなセンサーと接続する方法を学習します。 私たちは次のセンサーについて説明します-

  • 湿度センサー(DHT22)
  • 温度センサー(LM35)
  • 水検知センサー(簡易水トリガー)
  • PIRセンサー
  • 超音波センサー
  • GPS

湿度センサー(DHT22)

DHT-22(AM2302とも呼ばれる)は、デジタル出力、相対湿度、温度センサーです。 容量性湿度センサーとサーミスターを使用して周囲の空気を測定し、データピンにデジタル信号を送信します。

この例では、このセンサーをArduino UNOで使用する方法を学習します。 室温と湿度がシリアルモニターに出力されます。

DHT-22センサー

DHT-22センサー

接続は簡単です。 左の最初のピンは3〜5V電源、2番目のピンはデータ入力ピン、右端のピンはグランドです。

技術的な詳細

  • 電源-3-5V
  • 最大電流-2.5mA
  • 湿度-0-100%、2-5%の精度
  • 温度-40〜80°C、±0.5°Cの精度

必要なコンポーネント

次のコンポーネントが必要になります-

  • 1×ブレッドボード
  • 1×Arduino Uno R3
  • 1×DHT22 *1×10Kオーム抵抗

手順

以下の画像に示すように、回路図に従って、ブレッドボード上のコンポーネントを接続します。

湿度センサー回路接続

湿度センサーブレッドボード

スケッチ

コンピューターでArduino IDEソフトウェアを開きます。 Arduino言語でコーディングすると、回路が制御されます。 [新規]をクリックして、新しいスケッチファイルを開きます。

スケッチ

Arduinoコード

//Example testing sketch for various DHT humidity/temperature sensors

#include "DHT.h"
#define DHTPIN 2//what digital pin we're connected to
//Uncomment whatever type you're using!
//#define DHTTYPE DHT11//DHT 11
#define DHTTYPE DHT22//DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21//DHT 21 (AM2301)
//Connect pin 1 (on the left) of the sensor to +5V
//NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1
//to 3.3V instead of 5V!
//Connect pin 2 of the sensor to whatever your DHTPIN is
//Connect pin 4 (on the right) of the sensor to GROUND
//Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor
//Initialize DHT sensor.
//Note that older versions of this library took an optional third parameter to
//tweak the timings for faster processors. This parameter is no longer needed
//as the current DHT reading algorithm adjusts itself to work on faster procs.
DHT dht(DHTPIN, DHTTYPE);

void setup() {
   Serial.begin(9600);
   Serial.println("DHTxx test!");
   dht.begin();
}

void loop() {
   delay(2000);//Wait a few seconds between measurements
   float h = dht.readHumidity();
  //Reading temperature or humidity takes about 250 milliseconds!
   float t = dht.readTemperature();
  //Read temperature as Celsius (the default)
   float f = dht.readTemperature(true);
  //Read temperature as Fahrenheit (isFahrenheit = true)
  //Check if any reads failed and exit early (to try again).
   if (isnan(h) || isnan(t) || isnan(f)) {
      Serial.println("Failed to read from DHT sensor!");
      return;
   }

  //Compute heat index in Fahrenheit (the default)
   float hif = dht.computeHeatIndex(f, h);
  //Compute heat index in Celsius (isFahreheit = false)
   float hic = dht.computeHeatIndex(t, h, false);
   Serial.print ("Humidity: ");
   Serial.print (h);
   Serial.print (" %\t");
   Serial.print ("Temperature: ");
   Serial.print (t);
   Serial.print ("* C ");
   Serial.print (f);
   Serial.print (" *F\t");
   Serial.print ("Heat index: ");
   Serial.print (hic);
   Serial.print (" *C ");
   Serial.print (hif);
   Serial.println (" *F");
}

注意すべきコード

DHT22センサーには、次のようにボードに接続される4つの端子(V〜cc〜、DATA、NC、GND)があります-

  • DATAピンからArduinoピン番号2
  • V〜cc〜ピンから5ボルトのArduinoボード
  • ArduinoボードのグランドへのGNDピン
  • DATAとV〜cc〜ピンの間に10kオームの抵抗(プルアップ抵抗)を接続する必要があります

ハードウェア接続が完了したら、前述のとおり、DHT22ライブラリをArduinoライブラリファイルに追加する必要があります。

結果

シリアルポートモニターに温度と湿度が表示され、2秒ごとに更新されます。

Arduino-温度センサー

温度センサーLM35シリーズは、摂氏温度に直線的に比例する出力電圧を備えた高精度の集積回路温度デバイスです。

LM35デバイスは、便利な摂氏スケーリングを得るために出力から大きな定電圧を差し引く必要がないため、ケルビンで較正された線形温度センサーよりも優れています。 LM35デバイスは、室温で±¼°C、-55°Cから150°Cの全温度範囲で±¾°Cの標準精度を提供するために、外部キャリブレーションまたはトリミングを必要としません。

LM35デバイス

技術仕様

  • 摂氏で直接校正(摂氏)
  • 線形&plus; 10 mV/°Cのスケール係数
  • 0.5°Cで確度を確保(25°Cで)
  • -55°C〜150°Cの全範囲の定格
  • リモートアプリケーションに適しています

必要なコンポーネント

次のコンポーネントが必要になります-

  • 1×ブレッドボード
  • 1×Arduino Uno R3 *1×LM35センサー

手順

以下の画像に示すように、回路図に従って、ブレッドボード上のコンポーネントを接続します。

温度センサー回路接続

スケッチ

コンピューターでArduino IDEソフトウェアを開きます。 Arduino言語でコーディングすると、回路が制御されます。 [新規]をクリックして、新しいスケッチファイルを開きます。

スケッチ

Arduinoコード

float temp;
int tempPin = 0;

void setup() {
   Serial.begin(9600);
}

void loop() {
   temp = analogRead(tempPin);
  //read analog volt from sensor and save to variable temp
   temp = temp* 0.48828125;
  //convert the analog volt to its temperature equivalent
   Serial.print("TEMPERATURE = ");
   Serial.print(temp);//display temperature value
   Serial.print("*C");
   Serial.println();
   delay(1000);//update sensor reading each one second
}

注意すべきコード

LM35センサーには、V〜s〜、V〜out〜、GNDの3つの端子があります。 次のようにセンサーを接続します-

  • Arduinoボードの&plus; V〜s〜を&plus; 5vに接続します。
  • V〜out〜をArduinoボードのAnalog0またはA0に接続します。
  • GNDをArduinoのGNDに接続します。

アナログ-デジタルコンバーター(ADC)は、式ADC値=サンプル* 1024/基準電圧(&plus; 5v)に基づいてアナログ値をデジタル近似値に変換します。 したがって、+ 5ボルトの基準では、デジタル近似は入力電圧* 205に等しくなります。

結果

シリアルポートモニターに温度が表示され、毎秒更新されます。

Arduino-水検知器/センサー

水センサーレンガは、雨量、水位、さらには漏水の検知に広く使用できる水検知用に設計されています。

水検知器/センサー

水センサーをArduinoに接続すると、漏れ、流出、洪水、雨などを検出するのに最適な方法です。 水の存在、レベル、量、および/または不在を検出するために使用できます。 これは、植物に水をやるように思い出させるために使用できますが、より良いグローブセンサーがあります。 センサーには露出したトレースの配列があり、水が検出されるとLOWを読み取ります。

この章では、水センサーをArduinoのデジタルピン8に接続し、非常に便利なLEDを使用して、水センサーが水源と接触したときを識別するのに役立ちます。

必要なコンポーネント

次のコンポーネントが必要になります-

  • 1×ブレッドボード
  • 1×Arduino Uno R3
  • 1×水センサー
  • 1×LED
  • 1×330オーム抵抗

手順

以下の画像に示すように、回路図に従って、ブレッドボード上のコンポーネントを接続します。

水センサー回路接続

スケッチ

コンピューターでArduino IDEソフトウェアを開きます。 Arduino言語でコーディングすると、回路が制御されます。 [新規]をクリックして、新しいスケッチファイルを開きます。

スケッチ

Arduinoコード

#define Grove_Water_Sensor 8//Attach Water sensor to Arduino Digital Pin 8
#define LED 9//Attach an LED to Digital Pin 9 (or use onboard LED)

void setup() {
   pinMode(Grove_Water_Sensor, INPUT);//The Water Sensor is an Input
   pinMode(LED, OUTPUT);//The LED is an Output
}

void loop() {
  /*The water sensor will switch LOW when water is detected.
   Get the Arduino to illuminate the LED and activate the buzzer
   when water is detected, and switch both off when no water is present*/
   if( digitalRead(Grove_Water_Sensor) == LOW) {
      digitalWrite(LED,HIGH);
   }else {
      digitalWrite(LED,LOW);
   }
}

注意すべきコード

水センサーには、S、V〜out〜(&plus;)、GND(-)の3つの端子があります。 次のようにセンサーを接続します-

  • Arduinoボードの&plus; V〜s〜を&plus; 5vに接続します。
  • SをArduinoボードのデジタルピン番号8に接続します。
  • GNDをArduinoのGNDに接続します。
  • LEDをArduinoボードのデジタルピン番号9に接続します。

センサーが水を検出すると、Arduinoのピン8がLOWになり、ArduinoのLEDがオンになります。

結果

センサーが水を検出すると、表示LEDが点灯します。

Arduino-PIRセンサー

PIRセンサーを使用すると、動きを感知できます。 これらは、人間がセンサーの範囲内または範囲外に移動したかどうかを検出するために使用されます。 彼らは一般的に家庭や企業で使用される電化製品やガジェットに見られます。 多くの場合、PIR、「受動赤外線」、「焦電」、または「IRモーション」センサーと呼ばれます。

PIRセンサーの利点は次のとおりです-

  • 小さいサイズ
  • 広いレンズ範囲
  • インターフェースが簡単
  • 安価な
  • 低電力
  • 使いやすい
  • 摩耗しないでください

PIRセンサー

PIRは焦電センサーで作られており、中央に長方形の結晶が入った丸い金属缶で、赤外線のレベルを検出できます。 すべてが低レベルの放射線を放出し、何かがより熱いほど、より多くの放射線が放出されます。 モーション検出器のセンサーは2つに分割されています。 これは、平均IRレベルではなく、動き(変化)を検出するためです。 2つの半分は互いに相殺されるように接続されています。 半分の赤外線放射が他の赤外線放射よりも多い場合、または少ない場合、出力は上下にスイングします。

PIR

PIRには調整可能な設定があり、3ピンの接地/出力/電源パッドにヘッダーが取り付けられています。

PIR調整可能設定

人がエリアを出入りしたことを検出する必要がある多くの基本的なプロジェクトまたは製品にとって、PIRセンサーは優れています。 PIRは、周囲の人数やセンサーへの近さを通知しないことに注意してください。 レンズは、ある距離を置いて特定のスイープに固定されることが多く、家の中のペットによって引き離されることもあります。

必要なコンポーネント

次のコンポーネントが必要になります-

  • 1×ブレッドボード
  • 1×Arduino Uno R3
  • 1×PIRセンサー(MQ3)

手順

回路図に従って、次の図に示すように接続します。

PIRセンサー回路接続

スケッチ

コンピューターでArduino IDEソフトウェアを開きます。 Arduino言語でコーディングすると、回路が制御されます。 [新規]をクリックして、新しいスケッチファイルを開きます。

スケッチ

Arduinoコード

#define pirPin 2
int calibrationTime = 30;
long unsigned int lowIn;
long unsigned int pause = 5000;
boolean lockLow = true;
boolean takeLowTime;
int PIRValue = 0;

void setup() {
   Serial.begin(9600);
   pinMode(pirPin, INPUT);
}

void loop() {
   PIRSensor();
}

void PIRSensor() {
   if(digitalRead(pirPin) == HIGH) {
      if(lockLow) {
         PIRValue = 1;
         lockLow = false;
         Serial.println("Motion detected.");
         delay(50);
      }
      takeLowTime = true;
   }
   if(digitalRead(pirPin) == LOW) {
      if(takeLowTime){
         lowIn = millis();takeLowTime = false;
      }
      if(!lockLow && millis() - lowIn > pause) {
         PIRValue = 0;
         lockLow = true;
         Serial.println("Motion ended.");
         delay(50);
      }
   }
}

注意すべきコード

PIRセンサーには、V〜cc〜、OUT、GNDの3つの端子があります。 次のようにセンサーを接続します-

  • Arduinoボード上の&plus; V〜cc〜を&plus; 5vに接続します。
  • OUTをArduinoボードのデジタルピン2に接続します。
  • GNDをArduinoのGNDに接続します。

センサーボードの下部にある2つの可変抵抗器を使用して、センサーの感度と遅延時間を調整できます。

遅延時間調整

センサーが動きを検出すると、Arduinoはシリアルポート経由で動きが検出されたことを伝えるメッセージを送信します。 PIR検知モーションは、新しいモーションがあるかどうかを確認するために一定時間遅延します。 モーションが検出されない場合、Arduinoはモーションが終了したことを示す新しいメッセージを送信します。

結果

モーションが検出されるとシリアルポートにメッセージが表示され、モーションが停止すると別のメッセージが表示されます。

Arduino-超音波センサー

HC-SR04超音波センサーは、SONARを使用して、コウモリのように物体の距離を決定します。 2 cm〜400 cmまたは1インチ〜13フィートの使いやすいパッケージで、高精度で安定した読み取り値を備えた優れた非接触範囲検出を提供します。

音響的には布のような柔らかい素材は検出が難しい場合がありますが、操作は日光や黒い素材の影響を受けません。 超音波送信機および受信機モジュールが付属しています。

超音波センサー

超音波センサー放射

技術仕様

  • 電源-&plus; 5V DC
  • 静止電流-<2mA
  • 動作電流-15mA
  • 有効角度-<15°
  • レンジング距離-2cm – 400 cm/1″ – 13ft
  • 解像度-0.3 cm
  • 測定角度-30度

必要なコンポーネント

次のコンポーネントが必要になります-

  • 1×ブレッドボード
  • 1×Arduino Uno R3
  • 1×超音波センサー(HC-SR04)

手順

回路図に従って、以下の画像に示すように接続します。

超音波回路接続

スケッチ

コンピューターでArduino IDEソフトウェアを開きます。 Arduino言語でコーディングすると、回路が制御されます。 [新規]をクリックして、新しいスケッチファイルを開きます。

スケッチ

Arduinoコード

const int pingPin = 7;//Trigger Pin of Ultrasonic Sensor
const int echoPin = 6;//Echo Pin of Ultrasonic Sensor

void setup() {
   Serial.begin(9600);//Starting Serial Terminal
}

void loop() {
   long duration, inches, cm;
   pinMode(pingPin, OUTPUT);
   digitalWrite(pingPin, LOW);
   delayMicroseconds(2);
   digitalWrite(pingPin, HIGH);
   delayMicroseconds(10);
   digitalWrite(pingPin, LOW);
   pinMode(echoPin, INPUT);
   duration = pulseIn(echoPin, HIGH);
   inches = microsecondsToInches(duration);
   cm = microsecondsToCentimeters(duration);
   Serial.print(inches);
   Serial.print("in, ");
   Serial.print(cm);
   Serial.print("cm");
   Serial.println();
   delay(100);
}

long microsecondsToInches(long microseconds) {
   return microseconds/74/2;
}

long microsecondsToCentimeters(long microseconds) {
   return microseconds/29/2;
}

注意すべきコード

超音波センサーには4つの端子があります-5V、トリガー、エコー、およびGNDは次のように接続されています-

  • &plus; 5VピンをArduinoボードの&plus; 5vに接続します。
  • Arduinoボードのデジタルピン7にトリガーを接続します。
  • EchoをArduinoボードのデジタルピン6に接続します。
  • GNDをArduinoのGNDに接続します。

このプログラムでは、センサーによって測定された距離をシリアルポート経由でインチとcmで表示しました。

結果

Arduinoシリアルモニターでは、センサーで測定された距離がインチとcmで表示されます。

Arduino-接続スイッチ

押しボタンまたはスイッチは、回路内の2つのオープン端子を接続します。 この例では、ピン8に接続された押しボタンスイッチを押すと、ピン2のLEDが点灯します。

接続スイッチ

プルダウン抵抗

外部デバイスが切断されているか、高インピーダンスになっている場合、Arduinoへの入力が期待されるロジックレベルに安定するように、プルダウン抵抗が電子論理回路で使用されます。 入力ピンには何も接続されていないため、論理ゼロであることを意味しません。 プルダウン抵抗は、グランドとデバイスの適切なピンの間に接続されています。

デジタル回路のプルダウン抵抗の例を次の図に示します。 プッシュボタンスイッチは、電源電圧とマイクロコントローラピンの間に接続されています。 このような回路では、スイッチが閉じているとき、マイクロコントローラーの入力は論理的に高い値ですが、スイッチが開いているとき、プルダウン抵抗は入力電圧をグランド(論理ゼロ値)に引き下げ、入力での未定義状態。

プルダウン抵抗は、論理回路のインピーダンスよりも大きな抵抗値を持っている必要があります。そうしないと、スイッチの位置に関係なく、電圧が下がりすぎてピンの入力電圧が一定の論理低値のままになります。

プルダウン抵抗

必要なコンポーネント

次のコンポーネントが必要になります-

  • 1×Arduino UNOボード
  • 1×330オーム抵抗
  • 1×4.7Kオーム抵抗(プルダウン)
  • 1×LED

手順

回路図に従って、以下の画像に示すように接続します。

回路図の接続

スケッチ

コンピューターでArduino IDEソフトウェアを開きます。 Arduino言語でコーディングすると、回路が制御されます。 [新規]をクリックして、新しいスケッチファイルを開きます。

スケッチ

Arduinoコード

//constants won't change. They're used here to
//set pin numbers:
const int buttonPin = 8;//the number of the pushbutton pin
const int ledPin = 2;//the number of the LED pin
//variables will change:
int buttonState = 0;//variable for reading the pushbutton status

void setup() {
  //initialize the LED pin as an output:
   pinMode(ledPin, OUTPUT);
  //initialize the pushbutton pin as an input:
   pinMode(buttonPin, INPUT);
}

void loop() {
  //read the state of the pushbutton value:
   buttonState = digitalRead(buttonPin);
  //check if the pushbutton is pressed.
  //if it is, the buttonState is HIGH:
   if (buttonState == HIGH) {
     //turn LED on:
      digitalWrite(ledPin, HIGH);
   } else {
     //turn LED off:
      digitalWrite(ledPin, LOW);
   }
}

注意すべきコード

スイッチが開いている(プッシュボタンが押されていない)場合、プッシュボタンの2つの端子間に接続がないため、ピンは(プルダウン抵抗を介して)グランドに接続され、LOWが読み取られます。 スイッチを閉じると(プッシュボタンを押すと)、2つの端子間が接続され、ピンが5ボルトに接続されるため、HIGHが読み取られます。

結果

LEDは、押しボタンを押すとオンになり、離すとオフになります。

Arduino-DCモーター

この章では、さまざまなタイプのモーターをArduinoボード(UNO)に接続し、モーターを接続してボードから駆動する方法を示します。

モーターには3つの異なるタイプがあります-

  • DCモーター
  • サーボモーター
  • ステッピングモーター

DCモーター(直流モーター)は、最も一般的なタイプのモーターです。 DCモーターには通常、プラスとマイナスの2本のリードしかありません。 これら2本の導線をバッテリーに直接接続すると、モーターが回転します。 リード線を切り替えると、モーターは反対方向に回転します。

DC Motor

警告-Arduinoボードのピンから直接モーターを駆動しないでください。 これにより、ボードが損傷する可能性があります。 ドライバ回路またはICを使用してください。

この章を3つの部分に分けます-

  • モーターを回転させるだけ
  • モーター速度の制御
  • DCモーターのスピンの方向を制御する

必要なコンポーネント

次のコンポーネントが必要になります-

  • 1x Arduino UNOボード
  • PN2222トランジスターx 1
  • 1x小型6V DCモーター
  • 1N1400ダイオードx 1
  • 270Ω抵抗1個

手順

回路図に従って、以下の画像に示すように接続します。

DCモーター接続

注意事項

接続中は、次の予防措置を講じてください。

  • まず、トランジスタが正しい方法で接続されていることを確認してください。 配置のように、トランジスタの平らな面をArduinoボードに向ける必要があります。
  • 次に、ダイオードのストライプ状の端は、画像に示されている配置に従って、+ 5Vの電力線に向かっている必要があります。

スピン制御Arduinoコード

int motorPin = 3;

void setup() {

}

void loop() {
   digitalWrite(motorPin, HIGH);
}

注意すべきコード

トランジスタはスイッチのように機能し、モーターへの電力を制御します。 Arduinoピン3は、トランジスタのオンとオフを切り替えるために使用され、スケッチでは「motorPin」という名前が付けられています。

結果

Arduinoのピン番号3が高くなると、モーターはフルスピードで回転します。

モーター速度制御

以下は、Arduinoボードに接続されたDCモーターの概略図です。

モーター速度制御

Arduinoコード

int motorPin = 9;

void setup() {
   pinMode(motorPin, OUTPUT);
   Serial.begin(9600);
   while (! Serial);
   Serial.println("Speed 0 to 255");
}

void loop() {
   if (Serial.available()) {
      int speed = Serial.parseInt();
      if (speed >= 0 && speed <= 255) {
         analogWrite(motorPin, speed);
      }
   }
}

注意すべきコード

トランジスタはスイッチのように機能し、モーターの電力を制御します。 Arduinoピン3は、トランジスタのオンとオフを切り替えるために使用され、スケッチでは「motorPin」という名前が付けられています。

プログラムが起動すると、モーターの速度を制御する値を指定するように求められます。 シリアルモニターに0〜255の値を入力する必要があります。

コマンドウィンドウ

「ループ」機能では、コマンド「Serial.parseInt」を使用して、シリアルモニターにテキストとして入力された番号を読み取り、それを「int」に変換します。 ここに任意の番号を入力できます。 次の行の「if」ステートメントは、番号が0〜255の場合、この番号でアナログ書き込みを行います。

結果

DCモーターは、シリアルポート経由で受信した値(0〜250)に応じて異なる速度で回転します。

スピン方向制御

リード線を交換せずにDCモーターのスピンの方向を制御するには、* Hブリッジ*と呼ばれる回路を使用できます。 Hブリッジは、モーターを両方向に駆動できる電子回路です。 Hブリッジは多くの異なるアプリケーションで使用されます。 最も一般的なアプリケーションの1つは、ロボットのモーターを制御することです。 回路図が「H」に見えるように接続された4つのトランジスタを使用するため、Hブリッジと呼ばれます。

ここでは、L298 HブリッジICを使用します。 L298は、DCモーターとステッピングモーターの速度と方向を制御でき、2つのモーターを同時に制御できます。 その電流定格は、各モーターで2Aです。 ただし、これらの電流では、ヒートシンクを使用する必要があります。

スピン方向制御

必要なコンポーネント

次のコンポーネントが必要になります-

  • 1×L298ブリッジIC
  • 1×DCモーター
  • 1×Arduino UNO
  • 1×ブレッドボード
  • 10×ジャンパー線

手順

以下は、Arduino UnoボードへのDCモーターインターフェイスの概略図です。

スピン方向制御接続

上の図は、L298 ICを接続して2つのモーターを制御する方法を示しています。 各モーターには3つの入力ピンがあり、Motor1にはInput1(IN1)、Input2(IN2)、Enable1(EN1)、Motor2にはInput3、Input4、Enable2があります。

この例では1つのモーターのみを制御するため、ArduinoをL298 ICのIN1(ピン5)、IN2(ピン7)、およびEnable1(ピン6)に接続します。 ピン5と7はデジタルです。 ONまたはOFF入力。ピン6は、モーター速度を制御するためにパルス幅変調(PWM)信号を必要とします。

次の表は、IN1とIN2のデジタル値に基づいてモーターが回転する方向を示しています。

IN1 IN2 Motor Behavior
BRAKE
1 FORWARD
1 BACKWARD
1 1 BRAKE

IC L298のピンIN1はArduinoのピン8に接続され、IN2はピン9に接続されます。 Arduinoのこれら2つのデジタルピンは、モーターの方向を制御します。 ICのEN Aピンは、ArduinoのPWMピン2に接続されています。 これにより、モーターの速度が制御されます。

Arduinoピン8および9の値を設定するには、digitalWrite()関数を使用し、ピン2の値を設定するには、analogWrite()関数を使用する必要があります。

接続手順

  • 5VとICのグランドをそれぞれ5VとArduinoのグランドに接続します。
  • モーターをICのピン2および3に接続します。
  • ICのIN1をArduinoのピン8に接続します。
  • ICのIN2をArduinoのピン9に接続します。
  • ICのEN1をArduinoのピン2に接続します。
  • ICのSENS Aピンをグランドに接続します。
  • Arduino USBケーブルを使用してArduinoを接続し、Arduino IDEソフトウェアを使用してプログラムをArduinoにアップロードします。
  • 電源、バッテリー、またはUSBケーブルを使用してArduinoボードに電力を供給します。

Arduinoコード

const int pwm = 2 ;//initializing pin 2 as pwm
const int in_1 = 8 ;
const int in_2 = 9 ;
//For providing logic to L298 IC to choose the direction of the DC motor

void setup() {
   pinMode(pwm,OUTPUT) ;//we have to set PWM pin as output
   pinMode(in_1,OUTPUT) ;//Logic pins are also set as output
   pinMode(in_2,OUTPUT) ;
}

void loop() {
  //For Clock wise motion , in_1 = High , in_2 = Low
   digitalWrite(in_1,HIGH) ;
   digitalWrite(in_2,LOW) ;
   analogWrite(pwm,255) ;
  /*setting pwm of the motor to 255 we can change the speed of rotation
   by changing pwm input but we are only using arduino so we are using highest
   value to driver the motor*/
  //Clockwise for 3 secs
   delay(3000) ;
  //For brake
   digitalWrite(in_1,HIGH) ;
   digitalWrite(in_2,HIGH) ;
   delay(1000) ;
  //For Anti Clock-wise motion - IN_1 = LOW , IN_2 = HIGH
   digitalWrite(in_1,LOW) ;
   digitalWrite(in_2,HIGH) ;
   delay(3000) ;
  //For brake
   digitalWrite(in_1,HIGH) ;
   digitalWrite(in_2,HIGH) ;
   delay(1000) ;
}

結果

モーターは最初に3秒間時計回り(CW)方向に作動し、次に3秒間反時計回り(CCW)に作動します。

Arduino-サーボモーター

サーボモーターは、出力軸を備えた小さなデバイスです。 このシャフトは、サーボにコード化された信号を送信することにより、特定の角度位置に配置できます。 コード化された信号が入力ラインに存在する限り、サーボはシャフトの角度位置を維持します。 コード化された信号が変化すると、シャフトの角度位置が変化します。 実際には、ラジコン飛行機でサーボを使用して、エレベーターや舵などの操縦翼面を配置します。 また、ラジコンカー、パペット、そしてもちろんロボットにも使用されています。

サーボモーター

サーボはロボット工学に非常に役立ちます。 モーターは小さく、制御回路が内蔵されており、サイズが非常に強力です。 Futaba S-148などの標準的なサーボは42オンス/インチのトルクを持ち、そのサイズに強いです。 また、機械的負荷に比例して電力を消費します。 したがって、軽負荷のサーボは多くのエネルギーを消費しません。

サーボモーターの内部構造を次の図に示します。 制御回路、モーター、ギアのセット、およびケースを見ることができます。 また、外界に接続する3本のワイヤを見ることができます。 1つは電源(+5ボルト)、接地用で、白い線は制御線です。

サーボモーター制御回路

サーボモーターの働き

サーボモーターには、出力軸に接続されたいくつかの制御回路とポテンショメーター(可変抵抗器、別名ポット)があります。 上の写真では、ポットは回路基板の右側にあります。 このポットにより、制御回路はサーボモーターの現在の角度を監視できます。

シャフトが正しい角度にある場合、モーターは停止します。 回路が角度が正しくないと判断した場合、モーターは目的の角度になるまで回転します。 サーボの出力軸は、約180度のどこかに移動できます。 通常、それは210度の範囲内のどこかにありますが、メーカーによって異なります。 通常のサーボを使用して、0〜180度の角運動を制御します。 メイン出力ギアに機械式ストップが組み込まれているため、機械的にそれ以上回転することはできません。

モーターに加えられる電力は、移動に必要な距離に比例します。 したがって、シャフトが長い距離を回転する必要がある場合、モーターは最高速度で動作します。 ほんの少しだけ回す必要がある場合、モーターはより遅い速度で動作します。 これは*比例制御*と呼ばれます。

サーボが回転する角度をどのように伝えますか?

制御ワイヤは、角度を伝えるために使用されます。 角度は、制御ワイヤに適用されるパルスの持続時間によって決まります。 これは「パルス符号化変調」と呼ばれます。 サーボは、20ミリ秒(.02秒)ごとにパルスを検出することを想定しています。 パルスの長さは、モーターの回転距離を決定します。 たとえば、1.5ミリ秒のパルスは、モーターを90度の位置(通常、ニュートラル位置と呼ばれます)に回転させます。 パルスが1.5ミリ秒より短い場合、モーターはシャフトを0度に近づけます。 パルスが1.5ミリ秒より長い場合、シャフトは180度近くに回転します。

アングルターン

必要なコンポーネント

次のコンポーネントが必要になります-

  • 1×Arduino UNOボード
  • 1×サーボモーター
  • 1×ULN2003駆動IC
  • 1×10KΩ抵抗

手順

回路図に従って、以下の画像に示すように接続します。

サーボモーター接続

スケッチ

コンピューターでArduino IDEソフトウェアを開きます。 Arduino言語でコーディングすると、回路が制御されます。 [新規]をクリックして、新しいスケッチファイルを開きます。

スケッチ

Arduinoコード

/*Controlling a servo position using a potentiometer (variable resistor)*/

#include <Servo.h>
   Servo myservo;//create servo object to control a servo
   int potpin = 0;//analog pin used to connect the potentiometer
   int val;//variable to read the value from the analog pin

void setup() {
   myservo.attach(9);//attaches the servo on pin 9 to the servo object
}

void loop() {
   val = analogRead(potpin);
  //reads the value of the potentiometer (value between 0 and 1023)
   val = map(val, 0, 1023, 0, 180);
  //scale it to use it with the servo (value between 0 and 180)
   myservo.write(val);//sets the servo position according to the scaled value
   delay(15);
}

注意すべきコード

サーボモーターには、電源、アース、信号の3つの端子があります。 電源線は通常赤であり、Arduinoの5Vピンに接続する必要があります。 アース線は通常黒または茶色で、ULN2003 ICの1つの端子(10 -16)に接続する必要があります。 Arduinoボードを損傷から保護するには、そのためのドライバーICが必要です。 ここでは、サーボモーターを駆動するためにULN2003 ICを使用しました。 信号ピンは通常黄色またはオレンジ色であり、Arduinoピン番号9に接続する必要があります。

ポテンショメーターの接続

分圧器/電位分割器は、出力電圧を入力電圧の特定の比率にスケーリングする直列回路の抵抗器です。 以下は回路図です-

ポテンショメーターの接続

V _ \ {out} =(V _ \ {in} \ times R _ \ {2})/(R _ \ {1} + R _ \ {2})

V〜out〜は出力電位であり、直列の印加入力電圧(V〜in〜)および抵抗器(R〜1〜およびR〜2〜)に依存します。 これは、R〜1〜を流れる電流が分割されずにR〜2〜にも流れることを意味します。 上記の式では、R〜2〜の値が変化すると、V〜out〜は入力電圧V〜in〜に応じてスケーリングします。

通常、ポテンショメータは分圧器であり、ノブを使用してスケーリングされる可変抵抗器の値に基づいて回路の出力電圧をスケーリングできます。 次の図に示すように、GND、信号、+ 5Vの3つのピンがあります-

ポテンショメーターと説明

結果

ポットのNOP位置を変更すると、サーボモーターの角度が変わります。

Arduino-ステッピングモーター

ステッピングモーターまたはステップモーターは、ブラシレスの同期モーターで、1回転を複数のステップに分割します。 固定DC電圧が印加されると連続的に回転するブラシレスDCモーターとは異なり、ステップモーターは離散的なステップ角で回転します。

したがって、ステッピングモーターは、1回転あたり12、24、72、144、180、および200のステップで製造され、ステップごとに30、15、5、2.5、2、および1.8度のステッピング角が得られます。 ステッピングモーターは、フィードバックの有無にかかわらず制御できます。

RC飛行機のモーターを想像してください。 モーターはある方向または別の方向に非常に高速で回転します。 モーターに与えられる力の量で速度を変えることはできますが、特定の位置で停止するようにプロペラに伝えることはできません。

プリンタを想像してください。 モーターを含め、プリンター内部には多くの可動部品があります。 このようなモーターの1つは、紙送りとして機能し、インクが印刷されるときに紙を移動させるローラーを回転させます。 次のテキスト行または画像の次の行を印刷するには、このモーターが用紙を正確な距離だけ移動できる必要があります。

プリントヘッドを前後に動かすねじ付きロッドに取り付けられた別のモーターがあります。 繰り返しますが、そのねじ棒は、文字を次々に印刷するために正確な量だけ移動する必要があります。 これは、ステッピングモーターが便利な場所です。

ステッピングモーター

ステッピングモーターの仕組み

通常のDCモーターは一方向にのみ回転しますが、ステッパーモーターは正確な増分で回転できます。

ステッピングモーターは、必要に応じて正確な角度(またはステップ)で回転できます。 これにより、モーターを完全に制御できるため、モーターを正確な位置に移動してその位置を保持できます。 これは、モーター内のコイルに非常に短い時間だけ電力を供給することにより行われます。 欠点は、モーターを必要な位置に維持するために常にモーターに電力を供給しなければならないことです。

現時点で知っておく必要があるのは、ステッピングモーターを動かすために、一定数のステップをある方向または別の方向に動かし、その方向にステップする速度を伝えることです。 ステッピングモーターにはさまざまな種類があります。 ここで説明する方法は、このチュートリアルで言及されていない他のモーターとドライバーの使用方法を推測するために使用できます。 ただし、お使いのモデルに固有のモーターとドライバーのデータシートとガイドを参照することを常にお勧めします。

インナーステッピングモーター

必要なコンポーネント

次のコンポーネントが必要になります-

  • 1×Arduino UNOボード
  • 以下の画像に示すように、1×小型バイポーラステッピングモーター
  • 1×LM298駆動IC

LM298駆動IC

手順

回路図に従って、以下の画像に示すように接続します。

ステッピングモーター接続

スケッチ

コンピューターでArduino IDEソフトウェアを開きます。 Arduino言語でコーディングすると、回路が制御されます。 [新規]をクリックして、新しいスケッチファイルを開きます。

スケッチ

Arduinoコード

/*Stepper Motor Control*/

#include <Stepper.h>
const int stepsPerRevolution = 90;
//change this to fit the number of steps per revolution
//for your motor
//initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);

void setup() {
  //set the speed at 60 rpm:
   myStepper.setSpeed(5);
  //initialize the serial port:
   Serial.begin(9600);
}

void loop() {
  //step one revolution in one direction:
   Serial.println("clockwise");
   myStepper.step(stepsPerRevolution);
   delay(500);
  //step one revolution in the other direction:
   Serial.println("counterclockwise");
   myStepper.step(-stepsPerRevolution);
   delay(500);
}

注意すべきコード

このプログラムは、ユニポーラまたはバイポーラステッピングモーターを駆動します。 モーターはArduinoのデジタルピン8-11に取り付けられています。

結果

モーターは、一方向に1回転してから、反対方向に1回転します。

Arduino-トーンライブラリ

この章では、Arduino Tone Libraryを使用します。 Arduinoピンに指定された周波数(および50%のデューティサイクル)の方形波を生成するArduinoライブラリに他なりません。 オプションで期間を指定できます。指定しない場合、stop()関数が呼び出されるまでウェーブが継続します。 ピンをピエゾブザーまたはスピーカーに接続して、トーンを再生できます。

警告-ピンをオーディオ入力に直接接続しないでください。 電圧は標準のラインレベル電圧よりもかなり高く、サウンドカード入力などを損傷する可能性があります。 分圧器を使用して、電圧を下げることができます。

必要なコンポーネント

次のコンポーネントが必要になります-

  • 1×8オームスピーカー
  • 1×1k抵抗器
  • 1×Arduino UNOボード

手順

回路図に従って、以下の画像に示すように接続します。

トーンライブラリ接続

スケッチ

コンピューターでArduino IDEソフトウェアを開きます。 Arduino言語でコーディングすると、回路が制御されます。 [新規]をクリックして、新しいスケッチファイルを開きます。

スケッチ

pitches.hファイルを作成するには、シリアルモニターアイコンのすぐ下にあるボタンをクリックして[新しいタブ]を選択するか、Ctrl + Shift + Nを使用します。

新しいタブ

その後、次のコードを貼り付けます-

/*************************************************
* Public Constants
*************************************************/

#define NOTE_B0 31
#define NOTE_C1 33
#define NOTE_CS1 35
#define NOTE_D1 37
#define NOTE_DS1 39
#define NOTE_E1 41
#define NOTE_F1 44
#define NOTE_FS1 46
#define NOTE_G1 49
#define NOTE_GS1 52
#define NOTE_A1 55
#define NOTE_AS1 58
#define NOTE_B1 62
#define NOTE_C2 65
#define NOTE_CS2 69
#define NOTE_D2 73
#define NOTE_DS2 78
#define NOTE_E2 82
#define NOTE_F2 87
#define NOTE_FS2 93
#define NOTE_G2 98
#define NOTE_GS2 104
#define NOTE_A2 110
#define NOTE_AS2 117
#define NOTE_B2 123
#define NOTE_C3 131
#define NOTE_CS3 139
#define NOTE_D3 147
#define NOTE_DS3 156
#define NOTE_E3 165
#define NOTE_F3 175
#define NOTE_FS3 185
#define NOTE_G3 196
#define NOTE_GS3 208
#define NOTE_A3 220
#define NOTE_AS3 233
#define NOTE_B3 247
#define NOTE_C4 262
#define NOTE_CS4 277
#define NOTE_D4 294
#define NOTE_DS4 311
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_FS4 370
#define NOTE_G4 392
#define NOTE_GS4 415
#define NOTE_A4 440
#define NOTE_AS4 466
#define NOTE_B4 494
#define NOTE_C5 523
#define NOTE_CS5 554
#define NOTE_D5 587
#define NOTE_DS5 622
#define NOTE_E5 659
#define NOTE_F5 698
#define NOTE_FS5 740
#define NOTE_G5 784
#define NOTE_GS5 831
#define NOTE_A5 880
#define NOTE_AS5 932
#define NOTE_B5 988
#define NOTE_C6 1047
#define NOTE_CS6 1109
#define NOTE_D6 1175
#define NOTE_DS6 1245
#define NOTE_E6 1319
#define NOTE_F6 1397
#define NOTE_FS6 1480
#define NOTE_G6 1568
#define NOTE_GS6 1661
#define NOTE_A6 1760
#define NOTE_AS6 1865
#define NOTE_B6 1976
#define NOTE_C7 2093
#define NOTE_CS7 2217
#define NOTE_D7 2349
#define NOTE_DS7 2489
#define NOTE_E7 2637
#define NOTE_F7 2794
#define NOTE_FS7 2960
#define NOTE_G7 3136
#define NOTE_GS7 3322
#define NOTE_A7 3520
#define NOTE_AS7 3729
#define NOTE_B7 3951
#define NOTE_C8 4186
#define NOTE_CS8 4435
#define NOTE_D8 4699
#define NOTE_DS8 4978

上記のコードを pitches.h として保存します

Arduinoコード

#include "pitches.h"
//notes in the melody:
int melody[] = {
NOTE_C4, NOTE_G3,NOTE_G3, NOTE_GS3, NOTE_G3,0, NOTE_B3, NOTE_C4};
//note durations: 4 = quarter note, 8 = eighth note, etc.:

int noteDurations[] = {
   4, 8, 8, 4,4,4,4,4
};

void setup() {
  //iterate over the notes of the melody:
   for (int thisNote = 0; thisNote < 8; thisNote++) {
     //to calculate the note duration, take one second
     //divided by the note type.
     //e.g. quarter note = 1000/4, eighth note = 1000/8, etc.
      int noteDuration = 1000/noteDurations[thisNote];
      tone(8, melody[thisNote],noteDuration);
     //pause for the note's duration plus 30 ms:
      delay(noteDuration +30);
   }
}

void loop() {
  //no need to repeat the melody.
}

注意すべきコード

コードは、追加のファイルpitches.hを使用します。 このファイルには、一般的なノートのピッチ値がすべて含まれています。 たとえば、NOTE_C4は中央のCです。 NOTE_FS4はFシャープなどです。 このノートテーブルは元々Brett Hagmanによって作成されたもので、その仕事に基づいてtone()コマンドが作成されました。 音符を作成したいときはいつでも便利です。

結果

pitches.hに保存された音符が聞こえます。 ファイル。

Arduino-ワイヤレス通信

ワイヤレストランスミッターとレシーバーモジュールは315 Mhzで動作します。 ブレッドボードに簡単に収まり、マイクロコントローラーとうまく機能して、非常にシンプルなワイヤレスデータリンクを作成できます。 1組の送信機と受信機では、モジュールは一方向のデータ通信のみを行いますが、送信機/受信機のペアとして機能するには2つのペア(異なる周波数)が必要です。

-これらのモジュールは無差別であり、かなりの量のノイズを受け取ります。 送信機と受信機は両方とも共通の周波数で動作し、IDはありません。

ワイヤレス通信

受信機モジュールの仕様

  • 製品モデル-MX-05V
  • 動作電圧-DC5V
  • 静止電流-4mA
  • 受信周波数-315Mhz
  • レシーバー感度—​105DB サイズ-30 14 * 7mm

送信機モジュールの仕様

  • 製品モデル-MX-FS-03V
  • 発射距離-20-200メートル(異なる電圧、異なる結果)
  • 動作電圧-3.5-12V 寸法− 19 19mm
  • 動作モード-AM
  • 転送速度-4KB/S
  • 送信電力-10mW
  • 送信周波数-315Mhz
  • 外部アンテナ-25cmの通常のマルチコアまたはシングルコアライン
  • 左から右へのピン配列-(DATA; V〜CC〜; GND)

必要なコンポーネント

次のコンポーネントが必要になります-

  • 2×Arduino UNOボード
  • 1×Rfリンク送信機
  • 1×Rfリンクレシーバー

手順

回路図に従って、以下の画像に示すように接続します。

ワイヤレス通信接続

スケッチ

コンピューターでArduino IDEソフトウェアを開きます。 Arduino言語でコーディングすると、回路が制御されます。 [新規]をクリックして、新しいスケッチファイルを開きます。

スケッチ

注意-Arduinoライブラリファイルにキーパッドライブラリを含める必要があります。 以下のスクリーンショットで強調表示されているように、ライブラリフォルダーにVirtualWire.libファイルをコピーして貼り付けます。

Arduinoライブラリファイル

トランスミッターのArduinoコード

//simple Tx on pin D12
#include <VirtualWire.h>
char *controller;

void setup() {
   pinMode(13,OUTPUT);
   vw_set_ptt_inverted(true);
   vw_set_tx_pin(12);
   vw_setup(4000);//speed of data transfer Kbps
}

void loop() {
   controller="1" ;
   vw_send((uint8_t *)controller, strlen(controller));
   vw_wait_tx();//Wait until the whole message is gone
   digitalWrite(13,1);
   delay(2000);
   controller="0" ;
   vw_send((uint8_t *)controller, strlen(controller));
   vw_wait_tx();//Wait until the whole message is gone
   digitalWrite(13,0);
   delay(2000);
}

注意すべきコード

これは簡単なコードです。 まず、文字「1」を送信し、2秒後に文字「0」などを送信します。

レシーバーのArduinoコード

//simple Rx on pin D12
#include <VirtualWire.h>

void setup() {
   vw_set_ptt_inverted(true);//Required for DR3100
   vw_set_rx_pin(12);
   vw_setup(4000);//Bits per sec
   pinMode(5, OUTPUT);
   vw_rx_start();//Start the receiver PLL running
}

void loop() {
   uint8_t buf[VW_MAX_MESSAGE_LEN];
   uint8_t buflen = VW_MAX_MESSAGE_LEN;
   if (vw_get_message(buf, &buflen))//Non-blocking {
      if(buf[0]=='1') {
         digitalWrite(5,1);
      }
      if(buf[0]=='0') {
         digitalWrite(5,0);
      }
   }
}

注意すべきコード

Arduinoボードのピン番号5に接続されているLEDは、文字「1」を受信するとオンになり、文字「0」を受信するとオフになります。

Arduino-ネットワーク通信

Texas InstrumentsのCC3000 WiFiモジュールは小さな銀色のパッケージで、最終的にArduinoプロジェクトに使いやすく手頃な価格のWiFi機能をもたらします。

通信にSPI(UARTではありません!)を使用するため、データを必要な速度でプッシュしたり、必要に応じて低速でプッシュしたりできます。 IRQピンを備えた適切な割り込みシステムを備えているため、非同期接続が可能です。 802.11b/g、open/WEP/WPA/WPA2セキュリティ、TKIPおよびAESをサポートしています。 「BSDソケット」インターフェースを備えた組み込みTCP/IPスタックは、クライアントモードとサーバーモードの両方でTCPとUDPをサポートします。

ネットワーク通信

必要なコンポーネント

次のコンポーネントが必要になります-

  • 1×Arduino Uno
  • 1×Adafruit CC3000ブレイクアウトボード
  • 1×5Vリレー
  • 1×整流ダイオード
  • 1×LED
  • 1×220オーム抵抗
  • 1×ブレッドボードといくつかのジャンパー線

このプロジェクトには、通常のArduino IDE、AdafruitのCC3000ライブラリ、およびCC3000 MDNSライブラリが必要です。 また、aRESTライブラリを使用して、WiFi経由でリレーにコマンドを送信します。

手順

回路図に従って、以下の画像に示すように接続します。

ネットワーク通信接続

このプロジェクトのハードウェア構成は非常に簡単です。

  • CC3000ボードのIRQピンをArduinoボードのピン番号3に接続します。
  • VBATをピン5に、CSをピン10に。
  • SPIピンをArduinoボードに接続します:MOSI、MISO、およびCLKをそれぞれピン11、12、および13に接続します。
  • V〜in〜はArduino 5Vに接続され、GNDはGNDに接続されます。

リレーを接続しましょう。

ブレッドボードにリレーを配置した後、リレーの2つの重要な部分、つまりリレーを制御するコイル部分とLEDを取り付けるスイッチ部分の識別を開始できます。

  • まず、Arduinoボードのピン番号8をコイルの1つのピンに接続します。
  • もう一方のピンをArduinoボードのグランドに接続します。

また、リレーのスイッチング時に回路を保護するために、コイルのピンの上に整流ダイオード(グランドピンに接続されたアノード)を配置する必要があります。

  • Arduinoボードの+ 5Vをリレーのスイッチの共通ピンに接続します。
  • 最後に、スイッチのもう一方のピン(通常、リレーがオフのときは接続されていないピン)の一方を220Ω抵抗と直列のLEDに接続し、LEDのもう一方をArduinoのグランドに接続しますボード。

個々のコンポーネントのテスト

次のスケッチでリレーをテストできます-

const int relay_pin = 8;//Relay pin

void setup() {
   Serial.begin(9600);
   pinMode(relay_pin,OUTPUT);
}

void loop() {
  //Activate relay
   digitalWrite(relay_pin, HIGH);
  //Wait for 1 second
   delay(1000);
  //Deactivate relay
   digitalWrite(relay_pin, LOW);
  //Wait for 1 second
   delay(1000);
}

注意すべきコード

コードは一目瞭然です。 それをボードにアップロードするだけで、リレーは毎秒状態を切り替え、それに応じてLEDがオンとオフに切り替わります。

WiFi接続の追加

CC3000 WiFiチップを使用して、リレーをワイヤレスで制御します。 このプロジェクトのソフトウェアは、TCPプロトコルに基づいています。 ただし、このプロジェクトでは、Arduinoボードが小さなWebサーバーを実行するため、コンピューターからのコマンドを「リッスン」できます。 最初にArduinoスケッチの面倒を見てから、サーバー側コードの記述方法と素敵なインターフェイスの作成方法を見ていきます。

まず、Arduinoのスケッチ。 ここでの目標は、WiFiネットワークに接続し、Webサーバーを作成し、着信TCP接続があるかどうかを確認し、それに応じてリレーの状態を変更することです。

コードの重要な部分

#include <Adafruit_CC3000.h>
#include <SPI.h>
#include <CC3000_MDNS.h>
#include <Ethernet.h>
#include <aREST.h>

構成に固有のものをコード内で定義する必要があります。 Wi-Fiの名前とパスワード、およびTCP通信用のポート(ここでは80を使用しています)。

//WiFi network (change with your settings!)
   #define WLAN_SSID "yourNetwork"//cannot be longer than 32 characters!
   #define WLAN_PASS "yourPassword"
   #define WLAN_SECURITY WLAN_SEC_WPA2//This can be WLAN_SEC_UNSEC, WLAN_SEC_WEP,
  //WLAN_SEC_WPA or WLAN_SEC_WPA2

//The port to listen for incoming TCP connections
   #define LISTEN_PORT 80

その後、CC3000インスタンス、サーバー、およびaRESTインスタンスを作成できます-

//Server instance
   Adafruit_CC3000_Server restServer(LISTEN_PORT);//DNS responder instance
   MDNSResponder mdns;//Create aREST instance
   aREST rest = aREST();

スケッチのsetup()部分で、CC3000チップをネットワークに接続できます-

cc3000.connectToAP(WLAN_SSID, WLAN_PASS, WLAN_SECURITY);

コンピューターは、データの送信先をどのように知るのですか? 1つの方法は、スケッチを1回実行してから、CC3000ボードのIPアドレスを取得し、サーバーコードを再度変更することです。 しかし、私たちはもっとうまくやることができます、そしてそれがCC3000 MDNSライブラリーが出番するところです。 このライブラリを使用してCC3000ボードに固定名を割り当てるため、この名前をサーバーコードに直接書き留めることができます。

これは、次のコード片で行われます-

if (!mdns.begin("arduino", cc3000)) {
   while(1);
}

また、着信接続をリッスンする必要があります。

restServer.begin();

次に、連続して実行されるスケッチのloop()関数をコーディングします。 最初にmDNSサーバーを更新する必要があります。

mdns.update();

Arduinoボードで実行されているサーバーは、着信接続を待機し、要求を処理します。

Adafruit_CC3000_ClientRef client = restServer.available();
rest.handle(client);

WiFi経由でプロジェクトをテストするのは非常に簡単です。 自分のWiFi名とパスワードでスケッチを更新したことを確認し、Arduinoボードにスケッチをアップロードします。 Arduino IDEシリアルモニターを開き、ボードのIPアドレスを探します。

ここでは、192.168.1.103のようなものであると仮定します。

次に、単にお気に入りのWebブラウザーに移動して、次のように入力します-

192.168.1.103/digital/8/1

リレーが自動的にオンになることがわかります。

リレーインターフェイスの構築

次に、プロジェクトのインターフェースをコーディングします。 ここには、インターフェースを含むHTMLファイルと、インターフェースのクリックを処理するクライアント側のJavaScriptファイルの2つの部分があります。 ここのインターフェイスは、コンピューターからWiFiデバイスを簡単に制御するために作成された aREST.js プロジェクトに基づいています。

まず、インターフェースと呼ばれるHTMLファイルを見てみましょう。 最初の部分は、インターフェイスに必要なすべてのライブラリをインポートすることで構成されます-

<head>
   <meta charset = utf-8/>
   <title> Relay Control </title>
   <link rel = "stylesheet" type = "text/css"
      href = "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">
   <link rel="stylesheet" type = "text/css" href = "style.css">
   <script type = "text/javascript"
      src = "https://code.jquery.com/jquery-2.1.4.min.js"></script>
   <script type = "text/javascript"
      src = "https://cdn.rawgit.com/Foliotek/AjaxQ/master/ajaxq.js"></script>
   <script type = "text/javascript"
      src = "https://cdn.rawgit.com/marcoschwartz/aREST.js/master/aREST.js"></script>
   <script type = "text/javascript"
      src = "script.js"></script>
</head>

次に、インターフェイス内に2つのボタンを定義します。1つはリレーをオンにし、もう1つは再びオフにします。

<div class = 'container'>
   <h1>Relay Control</h1>
   <div class = 'row'>
      <div class = "col-md-1">Relay</div>
      <div class = "col-md-2">
         <button id = 'on' class = 'btn btn-block btn-success'>On</button>
      </div>
      <div class = "col-md-2">
         <button id = 'off' class = 'btn btn-block btn-danger'>On</button>
      </div>
   </div>
</div>

また、ボタンのクリックを処理するためのクライアント側のJavascriptファイルも必要です。 また、ArduinoデバイスのmDNS名にリンクするデバイスを作成します。 Arduinoコードでこれを変更した場合は、ここでも変更する必要があります。

//Create device
var device = new Device("arduino.local");
//Button

$('#on').click(function() {
   device.digitalWrite(8, 1);
});

$('#off').click(function() {
   device.digitalWrite(8, 0);
});

このプロジェクトの完全なコードは、 GitHub リポジトリにあります。 インターフェイスフォルダーに移動し、お好みのブラウザーでHTMLファイルを開きます。 あなたはあなたのブラウザの中に似たようなものを見るはずです-

リレー制御

Webインターフェースのボタンをクリックしてみてください。リレーの状態をほぼ瞬時に変更する必要があります。

あなたがそれをうまく機能させることができたなら、ブラボー! Wi-Fi制御のライトスイッチを作成しました。 もちろん、このプロジェクトではライトよりもはるかに多くを制御できます。 リレーが制御するデバイスに必要な電力をサポートしていることを確認するだけで、準備完了です。