Arduino Leonardo

Arduino Leonardo に関する記事です。



Arduino LEONARDO R3

Arduino LEONARDO は Arduino UNO の廉価版…というだけじゃないんだよ。

MCU は Atmel ATmega32U4 で、書き込めるスケッチの最大サイズは 28,672 バイト (約 28KB) です。

ボードサイズ 普通 小さい
書き込み装置 あり なし あり なし
ATMega328P Arduino Uno Arduino Pro Arduino Nano Arduino Pro Mini
Arduino Mini (05)
ATMega32U4 Arduino Leonardo Arduino Leonardo
(ピンソケット無し)
Arduino Micro
Da Vinci 32U*1
Pro Micro*2

*1 Strawberry Linux 社の製品で正式な Arduino ではない。    *2 SparkFun 社の製品で正式な Arduino ではない。

See Also:


購入

Amazon で買えます。

私が購入したのは SainSmart 社が発売している互換ボードです。こちらも Amazon で買えます。

私は LCD + キーパッドシールド付きのものを選びました。LCD + キーパッドシールドUNO でも使えます。この互換機は四本足の Micro USB コネクタを採用しているので強度面でも安心です。なお、私が購入した LEONARDO に付属していた MicroUSB ケーブルには HTC のタグが付いていました…何故?

See Also:


各部詳細

USB の形状を除けば、USB 側 ICSP ピンヘッダがないだけで、外観はほぼ UNO と同じです。

SPI

UNO と異なり、SPI 用のピンは D13~D10 ではありません。

また、SS ピンは TX RED に使われています。ICSP 端子を使えばピン互換にできます (SS は除く)。

LEONARDO UNO MEGA 2560
SCK ICSP 3 D13 / ICSP 3 D52 / ICSP 3
MISO ICSP 1 D12 / ICSP 1 D50 / ICSP 1
MOSI ICSP 4 D11 / ICSP 4 D51 / ICSP 4
SS (TX LED) D10 D53

I2C

UNO と異なり、I2C 用のピンは A4 / A5 ではありません。

R3 で拡張された SCL / SDA ピンを使えばピン互換にできます。

I2C LEONARDO UNO MEGA 2560
SCL D3 / SCL A5 / SCL D21 / SCL
SDA D2 / SDA A4 / SDA D20 / SDA

Timer

Arduino LEONARDO には Timer0 / Timer1 / Timer3 / Timer4 の 4 つのタイマーがあります。

Timer0 Timer1 Timer3 Timer4
D3 / D11 D5 / D9 / D10 D5 / D9 / D10 D6 / D13

Timer を使用する関数やライブラリを使用すると思わぬ落とし穴に遭遇する事があります。

See Also:


セットアップ

UNO のセットアップを参考にしてください。Arduino LEONARDO の VID は 2341、PID は 8036 です。

ボードでは Arduino Leonardo を選択します。


チュートリアル

UNO のチュートリアルを参考にしてください。LEONARDO のチュートリアルもあるにはありますが、内容が少し古いです。UNO のチュートリアルをやってみて、うまく動かない時に参考にするのがいいと思います。

See Also:


HID キーボード

「LEONARDO は UNO の廉価版というだけじゃない」 と書きましたが、LEONARDO (or ATMega32U4 搭載 Arduino) は自身を HID キーボードにする事ができ、専用の KEYBOARD ライブラリも用意されています。プッシュスイッチの片方を GND に、もう片方をデジタルピンの #8 に挿して以下のスケッチを実行してみましょう。

#include <Keyboard.h>

const int BUTTON = 8;
char shiftKey = KEY_LEFT_SHIFT;

void setup() {
  pinMode(BUTTON, INPUT_PULLUP); // 内部プルアップ抵抗を有効にして入力
  Keyboard.begin();
}

void loop() {
  if (digitalRead(BUTTON) == LOW) {
    /* 記号は正しく出力されない事がある */

    Keyboard.println("program TEST;");
    Keyboard.println("");

    // {
    Keyboard.press(shiftKey);
    Keyboard.press(']');
    delay(100);
    Keyboard.releaseAll();

    Keyboard.print("$APPTYPE CONSOLE");

    // }
    Keyboard.press(shiftKey);
    Keyboard.press(0x5c);
    delay(100);
    Keyboard.releaseAll();

    Keyboard.println("");
    Keyboard.println("");
    Keyboard.println("begin");
    Keyboard.print("  writeln");

    // (
    Keyboard.press(shiftKey);
    Keyboard.press('8');
    delay(100);
    Keyboard.releaseAll();

    // '
    Keyboard.press(shiftKey);
    Keyboard.press('7');
    delay(100);
    Keyboard.releaseAll();

    // Hello, world.
    Keyboard.print("Hello, world.");

    // '
    Keyboard.press(shiftKey);
    Keyboard.press('7');
    delay(100);
    Keyboard.releaseAll();

    // )
    Keyboard.press(shiftKey);
    Keyboard.press('9');
    delay(100);
    Keyboard.releaseAll();

    // ;
    Keyboard.println(";");

    Keyboard.println("end.");
    delay(500);
  }  
}

テキストエディタを開いた状態で、プッシュボタンを押してみると…

Object Pascal なコードが自動的に入力されます。仕事で嫌な事があっても [F5] キーを連打するスケッチを書かないようにしてくださいね。

See Also:


HID マウス

キーボード同様、LEONARDO (or ATMega32U4 搭載 Arduino) は自身を HID マウスにする事ができ、専用の MOUSE ライブラリも用意されています。変なスケッチを作ってしまって暴走状態になったら、慌てず騒がず USB ケーブルを抜きましょう…また挿したら暴走しますが (w

暴走状態に陥っても回避できるように、緊急停止用のボタンを用意するなりして対策を講じておきましょう。恐らく、現在のファームウェアではリセットボタンをダブルクリックすれば新しいスケッチを書き込む時間はあるかと思います。

以下のスケッチは LCD + キーパッドシールドを使った HID マウスです。上下左右のキーでマウスカーソルが移動し、SELECT ボタンでクリックします。

#include <Mouse.h>
#include <LiquidCrystal.h>

const int NUM_KEYS = 5;
const int DIST = 8;
char msgs[NUM_KEYS][17] = 
                   {"Mouse: Right",
                    "Mouse: Up   ",
                    "Mouse: Down ",
                    "Mouse: Left ",
                    "Click       "};
int adc_key_val[NUM_KEYS] ={70240420620880};
int adc_key_in;
int key = -1;

LiquidCrystal lcd(894567);

void setup() {
  lcd.begin(162);
  lcd.clear();
  Mouse.begin();
}

void loop() {
  adc_key_in = analogRead(0);
  key = get_key(adc_key_in);
  if (key < 0)
    return;
  lcd.setCursor(00);
  lcd.print(msgs[key]);
  switch (key) {
   case 0:
     Mouse.move(DIST, 00);
     break;         
   case 1:
     Mouse.move(0, -DIST, 0);
     break;         
   case 2:
     Mouse.move(0, DIST, 0);
     break;         
   case 3:
     Mouse.move(-DIST, 00);
     break;         
   case 4:
     Mouse.click();
     break;         
  }
  if (key <= 3)
    delay(50);
  else
    delay(500);
  lcd.clear();
}

int get_key(unsigned int input)
{
  int k;
  for (k = 0; k < NUM_KEYS; k++)
    if (input < adc_key_val[k])
      return k;
  if (k >= NUM_KEYS)
    k = -1;
  return k;
}

See Also:


HID ジョイスティック

Arduino IDE 1.66 以降であれば、 Arduino Joystick Library を使って LEONARDO (or ATMega32U4 搭載 Arduino) を HID ジョイスティックにする事もできます。

Ver.2 のライブラリと Arduboy で (デジタル) ジョイスティックを作ってみました。スケッチは以下のようになります。

#include <Joystick.h>

Joystick_ Joystick;

/* GENERAL */
const int ARROW_MIN = 0;
const int ARROW_MAX = 1023;
const int ARROW_NEUTRAL = ARROW_MAX / 2;
const int BUTTON_UP = 0;
const int BUTTON_DOWN = 1;
const int BUTTON_LEFT = 2;
const int BUTTON_RIGHT = 3;

/* ARROWS */
const int NUM_OF_ARROWS = 4;
const int PIN_UP = A0;
const int PIN_DOWN = A3;
const int PIN_LEFT = A2;
const int PIN_RIGHT = A1;

const int ArrowPin[NUM_OF_ARROWS] = {PIN_UP, PIN_DOWN, PIN_LEFT, PIN_RIGHT};
int lastArrowState[NUM_OF_ARROWS] = {0000};

/* BUTTONS */
const int NUM_OF_BUTTONS = 2;
const int PIN_A = 7;
const int PIN_B = 8;

const int ButtonPin[NUM_OF_BUTTONS] = {PIN_A, PIN_B};
int lastButtonState[NUM_OF_BUTTONS] = {00};

void setup() {
  for (int index = 0; index < NUM_OF_ARROWS; index++)
    pinMode(ArrowPin[index], INPUT_PULLUP);
  for (int index = 0; index < NUM_OF_BUTTONS; index++)
    pinMode(ButtonPin[index], INPUT_PULLUP);
  Joystick.begin();
  Joystick.setXAxis(ARROW_NEUTRAL);
  Joystick.setYAxis(ARROW_NEUTRAL);
  Joystick.setZAxis(ARROW_NEUTRAL);
}

void loop() {
  /* ARROWS */
  for (int index = 0; index < NUM_OF_ARROWS; index++)
    lastArrowState[index] = !digitalRead(ArrowPin[index]);
  if (lastArrowState[BUTTON_UP] == lastArrowState[BUTTON_DOWN])
    Joystick.setYAxis(ARROW_NEUTRAL);
  else
    Joystick.setYAxis((lastArrowState[BUTTON_UP]) ? ARROW_MIN : ARROW_MAX); 
  if (lastArrowState[BUTTON_LEFT] == lastArrowState[BUTTON_RIGHT])
    Joystick.setXAxis(ARROW_NEUTRAL);
  else
    Joystick.setXAxis((lastArrowState[BUTTON_LEFT]) ? ARROW_MIN : ARROW_MAX); 

  /* BUTTONS */
  for (int index = 0; index < NUM_OF_BUTTONS; index++)
  {
    int currentButtonState = !digitalRead(ButtonPin[index]);
    if (currentButtonState != lastButtonState[index])
    {
      Joystick.setButton(index, currentButtonState);
      lastButtonState[index] = currentButtonState;
    }
  }
  delay(10);  
}

スケッチの転送が終わると、コントロールパネルの [デバイスとプリンター] に "Arduino Leonardo" という名前のジョイスティックが現れます。

アイコンを右クリックして [ゲームコントローラーの設定] を選択します。

[状態] が OK になっていれば、とりあえずは HID ジョイスティックとして認識されています。

[プロパティ] ボタンを押せばボタンをテストできます。

適当なスイッチを接続し、ピン番号を任意に変更すれば、LEONARDO や Micro (Da Vinci 32U) でもジョイスティック化できます。最大で 32 ボタンのジョイスティックが作れるみたいですね。アナログジョイスティックのレバーを接続すれば、アナログジョイスティックも簡単に作れそうです。

See Also:


トラブルシューティング

LEONARDO で新しくスケッチを書き込めなくなってしまう事がありますが、その解消法です。

"Caterina" ブートローダー

現行の LEONARDO (を含む ATMega32U4 搭載 Arduino) のブートローダーは Caterina Bootloader と呼ばれているもので、リセットボタンを押すと 8 秒間だけブートローダーモードになり、この一瞬だけシリアルポートが出現します。

このタイミングで空のスケッチを書き込めば元に戻る事があります。なお、カテリーナ (Caterina) とはレオナルド (LEONARDO)・ダ・ヴィンチのお母さんの名前です (w

Pro Micro のブートローダー

同じ ATMega32U4 搭載製品であっても Pro Micro には SparkFun オリジナルのブートローダーが書き込まれています。 Caterina の短所は、理屈上、ハードウェアリセットされてから 8 秒間はユーザープログラムが実行されないという事でした。

Pro Micro でブートローダーモードにするにはリセットボタンをダブルクリックします。

単にリセットボタンが押された場合にはハードウェアリセットされ、ユーザープログラムが即実行されます。

See Also:

ブートローダーを破壊してしまった場合

間違ったボードを選択した状態で LEONARDO にスケッチを書き込んだり、容量を超えるユーザープログラムを転送したりすると、書き込んだユーザープログラムがブートローダー領域を破壊してしまう事があります。こうなってしまうとブートローダーモードが機能しません。 別の Arduino を使うか、USBasp 等を使ってブートローダーを書き込む必要があります。

ブートローダーを書き換えたら、ブートローダーモードにして空のスケッチを書き込んでみてください。

See Also:


ここにある情報が役に立って、「調べる手間が省けたからオマイに飯でもおごってやるよ」 というハートウォーミングな方がいらっしゃいましたら、下のボタンからどうぞ。

メニュー: