ATMELのAT-Tiny26,ATmega,R8Cなどのワンチップマイコン,C言語,JAVAなどのプログラミング言語の入門のためのページです.サンプルプログラムを中心に紹介します.他にもLinixや数学ソフトなどの紹介も行います.

このブログを検索

あなたは 番目のお客様です.

2010年11月20日土曜日

Arduino(アルドゥイーノ)入門


Arduino(アルドゥイーノ)の使い方などまとめてみました.
(Arduinoとは)
AT-Megaをベースとしたマイコンモジュールです.起動に必要なプログラム(ブートローダー)
がプログラムされたAT-Mega+PCとシリアル通信できる回路が基本的な構成です.
PCとはUSBで接続した場合,電源供給もUSBで行えます.
Arduino本体と開発ソフト(Arduino IDE)があればすぐにプログラムを実行できます.
ATマイコンやPSOCと比べても,最初のプログラム実行(LED点滅)までのハードルは
低いと思います.
AD変換,シリアル通信,時間管理などが,ATマイコン単独のプログラミングより
とても容易です.
価格はATマイコン単独より高いです.周辺回路を含むため,ATマイコン単独より
サイズが大きく,消費電流も大きくなります.
ATマイコンの機能を最大限に引き出すのは難しいです.例えば,AT-Megaをアセンブラで
動かす場合,MHz以上のクロック単位の高速の処理ができますが,Arduinoでは難しいです.

(Arduinoの種類)
使用するAT-Megaマイコン,電源電圧,クロック,周辺機能などにより色々なバージョンがあります.
Arduino Uno:ATmega328,5V,Flash Memory32KB,SRAM2 KB,EEPROM1 KB,Clock Speed16 MHz
本体がAT-Megaを含む比較的大きなボードなので,学習用には向いていますが小回りは利きません.
ArduinoProMini:ATmega168,3.3V版と5V版あり,Flash Memory16KB,SRAM1KB,EEPROM512B,ClockSpeed8MHz(3.3V) ,16 MHz(5V)USB-シリアル変換機能は別
Arduino Fio:ATmega328P,3.3V,Flash Memory32KB,SRAM2KB,EEPROM1KB,ClockSpeed8MHz
XBEEのソケットが付いていますので,すぐに無線対応となります.
Arduino Nano 3.0:ATmega328,5V,Flash Memory32KB,SRAM2KB,EEPROM1KB,ClockSpeed16MHz

(Arduino実行の手順)
開発環境ソフト(フリー)をPCにダウンロードして,Program Files内に展開します.展開したファイルは300Mぐらいのサイズがあります.
setupは不要で,展開したフォルダ内にあるarduino.exeをダブルクリックすると起動します.ソースプログラムを記述します.Boardのオプションで使用するArduinoを選び,Verifyのボタンでコンパイルします.
ArduinoとPCをUSBで接続します.USB-シリアル変換機能のないAruduinoの場合,USB-シリアル変換モジュールと,GND,CTS,VCC,TXD,RXD,DTRの接続を行います.
ToolsのSerialPortで,USBポートを指定し,Uploadのボタンで,プログラムがシリアル通信経由でArduinoに送られ,Arduinoが動きます.

(Arduinoのソースプログラム)
Arduinoのソースプログラムは,スケッチと呼ばれます.スケッチは,C言語に似ており,setup()関数とloop()関数から構成されます.
setup()関数に入出力などの初期設定を記述し,loop()関数に通常の繰り返し動作を記述します.

(ATmega168をArduino化する)
ATmega168の設定
AVRISPmkIIまたはAVRDragonとATmega168のターゲットを接続し,
AVRStudioを起動する.
ProgramAVRを起動する.
MainタブでEraseDeviceする(そうしないとLockbitsを書き換えられない)
ブートローダー(ATmegaBOOT_168.hexやATmegaBOOT_168_diecimila.hex)をプログラムする.
ATmegaBOOT_168_diecimila.hexはArduino IDEをダウンロードすると付いてくる.
FUSESを以下のようにプログラムする
EXTENDED 0xF8
HIGH 0xDF
LOW 0xFF
LockBitsを0xCFにプログラムする
Fuseの書き換えの際.ターゲットの電圧が低いとうまく書き換えられないので注意.Programのボタンを2度押すと,うまく書き換えられることもある.

FT232モジュールとMega168を接続する
VCC-VCC
GND-GND
TXD RXD
RXD TXD
Mega168のRESETピンは,10kΩでVCCに接続し,0.1μFでDTR(またはRTS)と接続する.
Mega168に16MHz発振子を接続する.(20pFのコンデンサは使わなくても動作する)セラロックでもOK.
Arduino IDEでBoardの選択をArudinoDiecimila or Duemilanove w/ATMEGA 168にすれば動きます.

(液晶表示)
Arduino化したAT-Mega168で液晶モジュールに表示するプログラムです.
DMC16117Aなどの横1列のピン配列のモジュールに対応しています.
接続リード線の数を減らすため,DB4-7をAT-Mega168の15-18ピンに対応させました.
液晶モジュールのコントラスト(Vo,VLC)とR/WはGNDに接続しています.
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);の行は,液晶表示のオブジェクト生成のようなもので,
ここでは名前をlcd(たぶん任意)にしています.ここで引数の数で,対応するピンが変わるので注意が必要です.引数が6個の場合,R/WはGNDに接続していますが,引数を7個にした場合,(rs, rw, enable, d4, d5, d6, d7) の順で,R/WとArduinoの接続が必要になります.

//testLCD
//LCD:Arduino(Mega168)
//VSS:GND
//VCC:VCC
//Vo:GND
//RS:D7(PIN13)
//R/W:GND
//E:D8(PIN14)
//DB0-3:NC
//DB4:D9(PIN15)
//DB5:D10(PIN16)
//DB6:D11(PIN17)
//DB7:D12(PIN18)
#include
//ATMega168 13,14,15,16,17,18PIN
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print("Arduino");
}
void loop() {
lcd.setCursor(0, 1);
// print the number of seconds since reset:
lcd.print(millis()/1000);
}

(学研のJapanino)
学研の大人の科学を入手し,付録のJapanino(Arduino互換)を試してみました.Japaninoは,内部発振8MHzのmaga168を使っています.多くの人が指摘していますが,回路には8MHz水晶発振子が入っているのに,なぜか内部発振で動いています.またUSB-シリアル変換が,CP210Xという,純正Arduinoとは異なる会社のものを使っています.税込み3360円という値段で,Arduino互換が楽しめるのでお買い得だと思います.
学研のサイトからArduino IDEをダウンロードします.またCP210Xドライバをインストールします.書き込みの際,Boardの選択でGakkenJapaninoを選択します.
すでにArduino IDEをインストール済みの人は,Boardの選択でArduino Pro or Pro Mini (3.3V,8MHz) w/ATmega168 を選択すれば,書き込み実行ができます.

(電子オルゴール)
Japaninoには,圧電サウンダも付いているので,簡単に電子オルゴールが作れます.関数を使った電子オルゴールのプログラムを作ってみました.Japaninoのサンプルプログラムでは,音程,音符で異なる配列を使っています.また音階のためのpitches.hをインクルードしています.インクルードを使わず,play()という関数を使いました.#define文で,A5はすでにピン名として定義済みですので,AA5としています.キーと長さのplay関数を並べるだけなので,サンプルプログラムより簡単に音楽を編集できると思います.

#define C5 523
#define CS5 554
#define D5 587
#define DS5 622
#define E5 659
#define F5 698
#define FS5 740
#define G5 784
#define GS5 831
#define AA5 880

void play(unsigned int note, int t){
tone(14, note, 2000.0/t);
delay(2000.0/t*1.10);
noTone(14);
}
void setup() {
}
void loop() {
play(G5,4);play(E5,4);play(E5,2);
play(F5,4);play(D5,4);play(D5,2);
play(C5,4);play(D5,4);play(E5,4);play(F5,4);
play(G5,4);play(G5,4);play(G5,2);
play(G5,4);play(E5,4);play(E5,4);play(E5,4);
play(F5,4);play(D5,4);play(D5,4);play(D5,4);
play(C5,4);play(E5,4);play(G5,4);play(G5,4);
play(E5,4);play(E5,4);play(E5,2);
play(D5,4);play(D5,4);play(D5,4);play(D5,4);
play(D5,4);play(E5,4);play(F5,2);
play(E5,4);play(E5,4);play(E5,4);play(E5,4);
play(E5,4);play(F5,4);play(G5,2);
play(G5,4);play(E5,4);play(E5,4);play(E5,4);
play(F5,4);play(D5,4);play(D5,2);
play(C5,4);play(E5,4);play(G5,4);play(G5,4);
play(E5,4);play(E5,4);play(E5,2);
delay(1000);
}