Arduinoで遊ぶページ

Arduinoで遊んだ結果を残すページです。
garretlab
プログラムの基本

プログラミング言語

Arduino上で動作するプログラムは、通常Arduinoソフトウェアを用いて作成します。Arduinoソフトウェアで利用するプログラミング言語はC++/Cです。Arduinoで利用する言語のことを「Arduino言語」や「Arduino programming language」、「Arduino Language」という表現をされることもありますが、「Arduino言語」の実体は、Arduino用のAPI(C++のクラス、Cの関数)を追加したC++/C言語です。Arduino用のAPIは、AVRマイコン等の操作に必要な、レジスタ操作などを隠蔽し、簡単にプログラムを書くための機能を提供しています。

Arduinoソフトウェアは、C++/Cの簡易なプリプロセッサの役割も果たします。詳細は、コンパイルプロセスにまとめています。初期のC++言語は、C言語のプリプロセッサとして実装されていましたが、そこまで大げさな変換ではなく関数プロトタイプの宣言を追加する程度の変換です。

C++/Cコンパイラには、AVRアーキテクチャのチップ(例:Arduino Uno)の場合はavr-g++/avr-gccを利用し、avr-libcがリンクされます。ARMアーキテクチャのチップ(例:Arduino Due)の場合は、arm-none-eabi-gcc/arm-none-eabi-g++を利用しています。このレイヤでは、AVRのレジスタなどが直接見えています。

Arduinoソフトウェアには、Arduinoを制御するためのAPIや特定の機器向けのライブラリが付属しています(公式に配布されているライブラリ以外にも、Web上にはさまざまな機器向けのライブラリや使い方についての情報が公開されています)。

このため、avr-g++/avr-gccやarm-none-eabi-g++/arm-none-eabi-gccが提供するC++/Cの機能を利用することができます。残念ながらavr-g++にはlibstdc++が付属しないようです。arm-none-eabi-g++のほうには付属しています。

言語やライブラリの関係は以下の通りです。アプリケーションプログラムは、g++/gccの言語としての機能、avr-libcなど言語系が提供するライブラリ、Arduinoが提供するライブラリを利用することができます。もちろん、自分で必要に応じてライブラリを作成することもできます。

簡単に図示すると以下のようになります。g++/gccが提供している、「直接プロセッサを操作するインターフェイス」も操作しようと思えば操作することもできます。

Arduinoではプログラムのことはスケッチと呼びます。

ファイルと利用される言語の関係

Arduinoで利用される言語はファイルにより異なるようです。特にライブラリや複数ファイルを取り扱う際には注意が必要です。

ファイルの拡張子 言語
.ino C++
.c C
.cpp C++

実験のページはこちら

プログラムの基本構造

Arduinoのプログラム(スケッチ)では、2つの関数をユーザが定義(記述)する必要があります。一つはsetup()で、もう一つはloop()です。setup()は、最初に一度だけ実行される関数です。その後、loop()が無限に実行され続けます。

C++/C言語では、通常、main()という関数を定義する必要があります(Arduinoはフリースタンディング環境なのでmain()が存在する必要はありませんが)。Arduinoでは、Arduinoソフトウェア自身がmain()関数を定義しているため、利用者はmain()関数を定義する必要はありません。Arduinoソフトウェアによりmain()関数は以下のように定義されています。

int main(void)
{
	init();

	initVariant();

#if defined(USBCON)
	USBDevice.attach();
#endif
	
	setup();
    
	for (;;) {
		loop();
		if (serialEventRun) serialEventRun();
	}
        
	return 0;
}

setup()では、プログラムの最初で一度だけ実行する必要のある初期設定などを行います。たとえば、ピンのモードを設定したり、外部に接続した機器の初期化などを行うプログラムを記述します。loop()では、基本的な考え方のページに記述した通り、外部の状況把握、処理決定、機器操作を行うプログラムを記述していきます。setup()やloop()で実際に行う処理がない場合でも、これらの関数を定義する必要があります。定義しない場合は、リンク時にエラーが発生します。

init()は、Arduino環境が定義している関数で、マイクロコントローラの初期設定を行なっています。この関数も利用者は定義してはいけません。

setup()やloop()に対して引数を渡すことはできません。これらの関数はそれぞれ、void setup(void)、void loop(void)と宣言されています。

また、loop()を実行後、serialEventRun()という関数が呼び出されます。この関数は、シリアルバッファにデータがあるときに、serialEvent()という関数を呼び出す関数です。このため、serialEvent()という関数を定義しておけば、シリアル通信の処理を行うことができます。ただし、割り込みベースではなく、ループの中での検査なので、あまり有用ではないような気がします(必要ならば、自分でloop()の中に処理を書けばいいので)。

Arduino-1.5.2からは、新規ファイルを作成するときに、以下のコードが自動でエディタに挿入されるようになりました。

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly: 
  
}

setup()の中で初期化を行い、loop()の中で実際の処理を記述するという性質上、グローバル変数を多用することが多くなると思います。また、プロトタイプ宣言を行う必要がありません。このため、C++/C言語によるプログラミングの習得を目的としてArduinoを利用することはお勧めしません。あくまで、Arduinoを使って何かをするために利用するのがいいと思います。

Blinkの解説

ここでは、インストールのページで出てきた、Arduinoソフトウェアにサンプルとしてついてきた、Blinkについて、簡単に解説します。このスケッチでは、単にLEDを点滅させるだけなので、外部の状況把握については、何も行っていません。

プログラムの仕様

Arduino Unoに搭載されているLEDを1秒周期で点滅させます。

プログラムの実装

Arduino Unoに搭載されているLEDは、デジタルの13番ピンに接続されています。13番ピンをデジタルの出力で利用するようArduinoに指示します。この処理は最初に1回だけ行えばいいので、setup()の中で実行します。20行目が該当する命令です。

13番ピンをHIGHにすればLEDは点灯し、LOWにすれば消灯します。1秒周期でLEDを点滅させるためには、HIGHにした1秒後にLOWに切り替え、LOWにした1秒後にHIGHに切り替えるということを繰り返します。この処理は無限に実行するため、loop()の中に記述します。

20行目で、13番ピンをHIGHにし、LEDを点灯します。26行目で1000ミリ秒(=1秒)待ちます。27行目では、13番ピンをLOWにし、LEDを消灯します。28行目ではまた1000ミリ秒待ちます。loop()自身は、Arduino自身が無限に実行するため、結果として、1秒周期でLEDが点滅します。

26行目と28行目の待ち時間を変更することで、LEDの点滅周期を自由に設定することができます。

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

  Most Arduinos have an on-board LED you can control. On the Uno and
  Leonardo, it is attached to digital pin 13. If you're unsure what
  pin the on-board LED is connected to on your Arduino model, check
  the documentation at http://www.arduino.cc

  This example code is in the public domain.

  modified 8 May 2014
  by Scott Fitzgerald
 */


// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin 13 as an output.
  pinMode(13, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);              // wait for a second
  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);              // wait for a second
}

バージョン

Arduino 1.6.7



メニューを表示するためにJavaScriptを有効にしてください。

Arduinoで遊ぶページ
Copyright © 2011 garretlab all rights reserved.
inserted by FC2 system