Arduino Leonardo

Arduino Leonardo に関する記事です。



Arduino LEONARDO R3

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

MCU は Atmel ATmega32U4 で、書き込めるスケッチの最大サイズは 28,672 バイト (約 28KB) です。フラッシュメモリが 32KB で、うちブートローダーが 5KB となっています。

See Also:


購入

Amazon で買えます。

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

私は既に UNO を持っていたので LCD + キーパッドシールド付きのものを選びました。LCD + キーパッドシールドは UNO でも使えますし、逆に UNO 用のものも LEONARDO で使えます。

Leonardo 互換の超小型製品もあります。Leonardo だから "Da Vinci (ダ・ヴィンチ)"、と。KUMA でもよかったんじゃないかなぁ…(^^;A

この製品に限らないのですが MicroUSB コネクタを採用しているボードは、一通りの動作確認が終わったら MicroUSB コネクタにエポキシ接着剤を盛るなりハンダを増量するのが吉かと (個人的には) 思います。

ちなみに、私が購入した LEONARDO に付属していた MicroUSB ケーブルには HTC のタグが付いていました…何故?


各部詳細

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

Leonardo R3 のピン配置図は以下にあります。


セットアップ

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


チュートリアル

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

See Also:


HID キーボード

「LEONARDO は UNO の廉価版というだけじゃない」 と書きましたが、LEONARDO は 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 は 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 を 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:


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

メニュー: