はじめてArduinoを動かす場合、IDEのスケッチ例を使用すると簡単にプログラムが作れます。例えば、LEDの点滅・ボタン・シリアル通信など。Arduinoにはいくつかのモデルがあります。ここではUnoモデルとMegaモデルを取り上げます。両者の最大の違いは、速度、メモリ量、ピンの数と種類です。USBで接続するものはTypeBのUSB接続のものもあれば、TypeBのMicro-USB接続のものもあります。また、リセットボタンやLEDの位置もモデルやバージョンによって異なります。今回は、どのモデルにも共通するピンや機能を使用します。
Arduino Uno
- 電源および通信のための USBポート
- 代替電源(9V~12V、センターピンは+)
- 電源ピン(出力と入力)。
- アナログ入力端子(デジタルとして使用可能)
- デジタル入力/出力ピン(〜はPWMデジタル出力を意味します)
- プロセッサ。
- リセットボタン
- LED を表示します。RXとTXはシリアル通信(USBポート)、Lは13番ピンの値を示します。
ブレッドボード
ブレッドボードは、部品やジャンパー線を挿して、回路のプロトタイプを開発する時に使用します。
スケッチ例を使用したハローワールド
Arduino IDE(https://Arduino.CC/en/Main/Software)をインストールし、USBケーブルで接続したら、接続されているシリアルポートを選択することから始めます(通常は1つしかないでしょう)。
次に、Arduinoのモデルを選択します。場合によっては(Arduino Megaなど)、バージョンを選択する必要もあります。
Blink
Arduino IDEにはいくつかの例が付属しています。まずは、13番ピンに接続されているLED基板上の内蔵LED(L)を点滅させるBlinkの例から見ていきましょう。この例では、2つの関数を使用しています。
// the setup function runs once when you press reset or power the board void setup() { // initialize digital pin LED_BUILTIN as an output. pinMode(LED_BUILTIN, OUTPUT); } // the loop function runs over and over again forever void loop() { digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second }
Setup()
この関数では、使用しているハードウェアを初期化します。この関数はArduinoの電源が入っているときに一度実行されます。
Loop()
この関数には、目的の関数を実行するプログラムを入れます。この関数の最後には、再びこの関数が呼び出されます(つまり、無限に繰り返されます)。
プログラムを作成した後、プログラム記述の検証をしなければなりません。検証は、ツールバーのチェックマークのボタンを押すと実行されます。プログラムをArduinoに書き込むには、ツールバーの矢印マーク(→)のボタンを使います。書き込み中は、IDEの下部にいくつかのメッセージが表示され、ボード上のRXとTXのLEDが点滅します。アップロードが完了すると、プログラムは自動的に開始されます。この場合、ボード上のLED Lが点滅します。また、13番ピンGND間に、LEDと10kΩ抵抗を入れると、同様に点滅します。delay()を調整して、LEDの各状態(オン/オフ)の持続時間を変更することができます。delay()の単位はミリ秒です。
Button
ボタンを押してLEDを点灯させる回路を作ります。まず、ボタンと10kΩ抵抗で以下の回路を実装します。ボタンを押していないときは、2番ピンとGNDピンが10kΩ抵抗を通して接続されています(このような抵抗をプルダウン抵抗という)。ボタンが押されたときは、5Vラインと接続されます。
続いてButtonの例を開きます。アップロード後、ボタンが動作してLEDが点灯します。
// constants won't change. They're used here to set pin numbers: const int buttonPin = 2; // the number of the pushbutton pin const int ledPin = 13; // 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); } }
DigitalReadSerial
先ほどの回路を使用して、USB / シリアル接続を介してボタンの状態をコンピュータに送信します。DigitalReadSerialの例を開きましょう。
// digital pin 2 has a pushbutton attached to it. Give it a name: int pushButton = 2; // the setup routine runs once when you press reset: void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(9600); // make the pushbutton's pin an input: pinMode(pushButton, INPUT); } // the loop routine runs over and over again forever: void loop() { // read the input pin: int buttonState = digitalRead(pushButton); // print out the state of the button: Serial.println(buttonState); delay(1); // delay in between reads for stability }
Arduinoにプログラムを送った後、メニューのツール→シリアルポートを使ってUSB / シリアルポートに何が送られてくるか見てみましょう。
この機能は、プログラムをデバッグするときにも利用できます。デバッグテキストを送信する場合は、たとえば、次のような行を追加します(常に大文字と小文字を区別します)。
if ( buttonState ) Serial.println ( "ON" ); else Serial.println ( "OFF" ); delay( 1 );
スイッチ
前の回路にリレー(外部機器を制御できるスイッチとして機能する)を追加してみましょう。
関数 setup() の後に追加します。
pinMode ( 12 , OUTPUT );
関数 loop() の後に追加します。
digitalWrite ( 12 , ! buttonState )
// constants won't change. They're used here to set pin numbers: const int buttonPin = 2; // the number of the pushbutton pin // variables will change: int buttonState = 0; // variable for reading the pushbutton status void setup() { // initialize the pushbutton pin as an input: pinMode(buttonPin, INPUT); // Relay pinMode ( 12 , OUTPUT ); } void loop() { // read the state of the pushbutton value: buttonState = digitalRead(buttonPin); // Relay digitalWrite ( 12 , ! buttonState ); }
12番ピン(リレー)の値が逆になっているのはなぜでしょうか?これから使用するリレーは、信号ピンが0Vを受信するとアクティブになり、5Vを受信すると(または電源が入っていない)非アクティブになります。すべてのリレーがこのようになるわけではありませんので、使用する前にテストしてみてください。
センサ
前の回路を使用して、ピン A0 にアナログ温度センサーを追加します。次に、サンプルの AnalogReadSerial をロードします。センサーの値を見るために、再びシリアル・モニターを開きます。アナログ・ピンの読み取り(A0、A1など)は、0から1023の間の値を返します(つまり、0Vから5Vの間の直線的な値)。しかし、選択したセンサーは、この範囲の一部の値しか表示しない可能性があります。センサーの最小値と最大値を記録して、プログラムを調整してください。
前の回路を使って、リレーを作動させるためのルールを定義します。例えば、温度センサーを使用している場合、温度が高くなったときに、リレーを有効にしてランプを点灯させたいとします。関数loop()の最後に追加します。
if ( sensorValue > 500 || digitalRead ( 2 )) { // Relay On digitalWrite ( 12 , LOW ); } else { // Relay Off digitalWrite ( 12 , HIGH ); }
// constants won't change. They're used here to set pin numbers: const int buttonPin = 2; // the number of the pushbutton pin void setup() { // initialize the pushbutton pin as an input: pinMode(buttonPin, INPUT); // Relay pinMode ( 12 , OUTPUT ); } void loop() { int sensorValue = analogRead(A0); // Relay if ( sensorValue > 100 || digitalRead ( 2 )) { // Relay On digitalWrite ( 12 , LOW ); } else { // Relay Off digitalWrite ( 12 , HIGH ); } }
閾値(ここでは100)と演算子( >or <)はセンサーによって異なる場合があります。期待した動作をしない場合は、センサーのデータシートで特性を確認し、プログラムを修正してください。
コメントを残す