Arduinoの開発環境の使い方

Arduino互換機、SparkFun Pro Microを例に環境の設定、書き込みまでの説明。

ProMicro.jpg

もし書き込みが出来ない場合

・Arduinoをリセット
リセット.jpg
・8秒以内にIDEのシリアルポートを選択しなおす
・書き込みを行う。ここで書き込みのリトライをしている箇所で、もう一度Arduinoをリセット
・以降は普通に利用可能

ツール

■開発環境のツールをインストール
 Arduino IDEのダウンロードリンク

・上記リンクのWindowsのインストーラーを選択
・募金を求められるけど、灰色文字の「JUST DOWNLOAD」をクリック
IdeDownload.jpg
・インストールは標準でOK、何度かUSBシリアルドライバの許可が求められるけど全てOK

Arduino IDEの設定

■まずはツールの初期設定
・[ファイル]-[環境設定]を開く
・[環境設定]の[設定]タブの下の方の"追加のボードマネージャのURL"に以下を追加
 https://raw.githubusercontent.com/sparkfun/Arduino_Boards/master/IDE_Board_Manager/package_sparkfun_index.json
 (digisparkの場合はhttp://digistump.com/package_digistump_index.json)
・好みもあるけど、"より詳細な情報を表示する"の"コンパイル"と"書き込み"にチェックを入れる
環境設定.jpg

■ボードの設定(SparkFun Pro Microの場合)
・[ツール]-[ボード]を選択して、一番上の"ボードマネージャ"を選択
・ボードマネージャウインドウが開くので、検索欄に"sparkfun avr"と入力して表示された項目の「インストール」ボタンを押す。インストールが終わったら閉じる
ボードの設定.jpg
・[ツール]-[ボード]を選択すると、選べるボードが増えているんで、[SparkFun Pro Micro]を選択★
ボード選択.jpg
・[ツール]-[プロセッサ]の中の[ATmega32U4(5V,16MHz]を選択★
プロセッサ選択.jpg
 ★この2つは注意して必ず設定。間違えると動かなくなるかも。。

■ライブラリの設定
・[ツール]-[ライブラリを管理]を開く
・ライブラリマネージャウインドウが開くので、検索欄に"adafruit neo"と入力して表示された項目のうち「Adafruit NeoPixel by Adafruit」の「インストール」ボタンを押す。インストールが終わったら閉じる
ライブラリ.jpg

プログラムの確認

・何かのプログラムを開いておいて、Ctrl+Rを押す(もしくはツールバーの✔ボタン)
 エラーが出るならなんとか対処。。
コンパイル.jpg

プログラムの書き込み

・まずボードのUSBをパソコンに繋ぐ
・[ツール]-[シリアルポート]の中のCOMxxを選択(これは一度選択すると基本的には覚えてるはず)
 普通は1個しかないと思うけど複数あるならデバイスマネージャで確認
・基本的にはツールに保存されているけど、ボードの設定の★を再確認!
 ウインドウの右下にもボード情報が出てるのでそこで確認しても良い
・何かのプログラムを開いておいて、Ctrl+Uを押す(もしくはツールバーの➡ボタン)
書き込み.jpg

終わり



====サンプル====
※もっとシンプルなキーを送るプログラムは以下を参照
 一番シンプルなキーボードプログラム

サンプル.jpg

//-------------------------------------------------- // マクロ:機能の有効無効 #define _USE_LED_STRIP_ 1 //1でLED制御あり、それ以外はなし //-------------------------------------------------- //-------------------------------------------------- // ヘッダ //-------------------------------------------------- //HID keyboard(OS起動後のみ利用可) #include "Keyboard.h" #if _USE_LED_STRIP_ == 1 #include <Adafruit_NeoPixel.h> #ifdef __AVR__ #include <avr/power.h> #endif #endif //-------------------------------------------------- // 定義:処理 //-------------------------------------------------- #define LOOP_WAIT 10 //メインループのウェイト //コピペのキーコードを変えるため #define OSTYPE_MAC 0 #define OSTYPE_WIN 1 #define OSTYPE_LINUX 2 //winと同じだが一応 int platform = OSTYPE_WIN; //Windows用 //-------------------------------------------------- // 定義:LED //-------------------------------------------------- #define TXLED_ON TXLED1 #define TXLED_OFF TXLED0 #define RXLED_ON digitalWrite(RXLED_PIN, HIGH) #define RXLED_OFF digitalWrite(RXLED_PIN, LOW) #define RXLED_PIN 17 // ProMicroだとTX=13,RX=17 //-------------------------------------------------- // 定義:LEDストリップ //-------------------------------------------------- #if _USE_LED_STRIP_ == 1 #define LEDPIN 15 //LED制御デジタルピン番号 #define LEDNUM 9 //LEDの数 #define LEDLoopTime 150 //色変更時間 Adafruit_NeoPixel pixels = Adafruit_NeoPixel(LEDNUM, LEDPIN, NEO_GRB + NEO_KHZ800); const int ledTable[20][LEDNUM] = { {200, 80, 25, 0, 0 }, { 80,200, 0, 0, 0 }, { 25, 80,200, 0, 0 }, { 0, 25, 80,200, 0 }, { 0, 0, 25, 80,200 }, { 0, 0, 0,200, 80 }, { 0, 0,200, 80, 25 }, { 0,200, 80, 25, 0 }, }; const int ledPatNum = 8; const int ledPatTbl[ledPatNum] = { 2,3,4,5,6,7,0,1}; unsigned long ledPatTick = 0; //前回描画時のTickTime int ledPatCounter = 0; #endif //-------------------------------------------------- // 定義:キーボード //-------------------------------------------------- #define BUTTON_NUM 2 //チェックするキー数 #define PinCopy 3 //pin番号:コピーキー #define PinPaste 5 //pin番号:ペーストキー #define WAIT_CONT 100 //キー入力毎のウェイト:ms指定 #define WAIT_REPEAT_START 500 //キー長押しのリピート開始時間 :ms指定 #define WAIT_REPEAT_LOOP 100 //キー長押しのリピートループ時間:ms指定 #define BtnNULL 0 // 押下中のpinヘッダを保持 int holdButton = BtnNULL; //ボタン押下時のピン番号 unsigned long holdTick = 0; //ボタン押下時のtickカウンタ unsigned long tickKeyRepeat = 0; //長押しでのキーリピート時間 //ピン番号のテーブル const int tbButton[BUTTON_NUM] = { PinCopy, PinPaste }; //-------------------------------------------------- // 処理:セットアップ //-------------------------------------------------- void setup() { pinMode(RXLED_PIN, OUTPUT); //TXはもうOUTPUTになっているのでRXだけpinMode指定 RXLED_OFF;TXLED_OFF; //LEDをいったんオフ //スイッチを繋げるDピンヘッダ for (int i = 0; i < BUTTON_NUM; i++) { pinMode(tbButton[i], INPUT_PULLUP); //PULLUPは内部抵抗利用、押下でLOW、なしでHIGHになる } Keyboard.begin(); #if _USE_LED_STRIP_ == 1 pixels.begin(); // This initializes the NeoPixel library. pixels.show(); // いったん真っ暗で開始 //これはsetupで一度切り使う事を想定したAPI。フェードとかは駄目) //0-255, 255で1LEDあたり60mA, 0でも8mA食うらしい。 //8x144をフル点灯で1.15Aか。。点灯確認は分けてやな。) pixels.setBrightness(255); #endif } //-------------------------------------------------- // 処理:メインループ //-------------------------------------------------- void loop() { unsigned long ticknow = 0; unsigned long tickpass = 0; //ボタン押下後の経過時間 ticknow = millis(); //現在のtickカウンタを保持 //---------------------------------------- // キーが押されていない場合 if (holdButton == BtnNULL) { for (int i = 0; i < BUTTON_NUM; i++) { if(digitalRead(tbButton[i]) == LOW) { holdButton = tbButton[i]; holdTick = ticknow; //チャタリング防止 tickKeyRepeat = WAIT_REPEAT_START; //キーリピート開始までの時間 keyPush(holdButton); break; //keyは一個ずつ判定 } } //---------------------------------------- //キー押下中 } else { tickpass = ticknow - holdTick; //キー押下からの経過時間を求める if ((digitalRead(holdButton) != LOW)) { // -----押下中のキーは離された? //チャタリング防止用のウェイトを経過している? if (tickpass > WAIT_CONT) { holdButton = BtnNULL; keyRelease(); } } else { // ----キーは押しっぱなし //キーリピート用のウェイトを経過している? if (tickpass > tickKeyRepeat) { holdTick = ticknow; //チャタリング防止をもう一回 tickKeyRepeat = WAIT_REPEAT_LOOP; //キーリピートループの時間を再設定 keyRelease(); //いったんキーをリリース keyPush(holdButton); //もう一回キー押下 } } } #if _USE_LED_STRIP_ == 1 ledNightRider(ticknow); #endif delay(LOOP_WAIT); } //-------------------------------------------------- // 関数群 //-------------------------------------------------- //ピン番号に対してキーイベントを送る void keyPush(int no) { TXLED_ON; //確認用LEDオン switch (no) { //コピー case PinCopy: switch (platform) { case OSTYPE_MAC: Keyboard.press(KEY_LEFT_GUI); //CMDキー break; case OSTYPE_WIN: case OSTYPE_LINUX: default: Keyboard.press(KEY_LEFT_CTRL); //Ctrlキー break; } Keyboard.press('c'); break; //ペースト case PinPaste: switch (platform) { case OSTYPE_MAC: Keyboard.press(KEY_LEFT_GUI); //CMDキー break; case OSTYPE_WIN: case OSTYPE_LINUX: default: Keyboard.press(KEY_LEFT_CTRL); //Ctrlキー break; } Keyboard.press('v'); break; default: break; } } //キーイベントのリリース void keyRelease() { TXLED_OFF; //確認用LEDオフ Keyboard.releaseAll(); } #if _USE_LED_STRIP_ == 1 //---------------------------------------- void ledNightRider(unsigned long tick) { unsigned long tickpass = 0; //ボタン押下後の経過時間 tickpass = tick - ledPatTick; if (tickpass > LEDLoopTime) { for(int i=0;i < LEDNUM;i++){ pixels.setPixelColor(i, pixels.Color(ledTable[ledPatTbl[ledPatCounter]][i], 0, 0)); } pixels.show(); // This sends the updated pixel color to the hardware. ledPatCounter++; ledPatCounter = ledPatCounter % ledPatNum; ledPatTick = tick; } } #endif