littlewing

人間とコンピューターとメディアの接点をデザインするために考えたこと

ATmega32U4搭載マイコンボードをmacで使ってみる

スイッチサイエンスさんのATmega32U4搭載マイコンボードを購入して遊んでみました。

ATmega32U4の概要

  • Arduino Leonardo互換として扱える
  • USBでパソコンにつなげば、マウスやキーボードデバイスとして利用できる(HID対応)
  • VCCの出力は5V
  • さらに詳細はスイッチサイエンスさんのATmega32U4ブレークアウトボードのページを見てください。

ちゃんとArduino互換にするには、ブートローダーを書きかえる必要がある。けど、やらなくてもなんとかなる

  • このマイコンボードはデフォルトでDFU(Device Firmware Update)機能が有効になっており、USB経由でソフトウェアを書き換えることができます。
  • ただし、DFU機能では、ブートローダー自体は書き換えできないため、完全にArduino互換にするにはAVR ISP mkIIや、別途Arduino UNOなどを用意して、ブートローダーを書き換える必要があります。
  • UNOを利用したArduino化はこちらのサイトが参考になると思います。

今回は、ブートローダーの書き換えは行わず、DFU機能でファームウェアの転送を行いました。(UNOもってない・・)

  • この状態だと、Arduino IDE上でコンパイルはできるのですが、IDE上でマイコンへの書き込みができません。別のソフトウェア(dfu-programmer)を使うことになります。
  • ちょっとめんどくさいけど、なれれば何とかなります。

macからのファームウェア転送方法

  • Arduino IDEは1.6.9を使っています。

  • 最初にmac にdfu-programmerをインストールしておきます。ターミナルアプリで以下を実行

sudo port install dfu-programmer
  • Arduino IDE上でTools/Boardから、「Arduino Leonardo」を選択

  • Arduino IDE> Preference で「より詳細な情報を表示する」の「コンパイル」にチェック f:id:pigshape:20160725165416p:plain

  • Arduino IDE上アプリケーションを普通に開発、ビルドできるかチェック

マウスが勝手に動くサンプルはこんな感じ

#include <Mouse.h>

int phase = 0;
int full = 100;
int radius = 100;
int delay_msec = 2;

int x = radius;
int y = 0;

void setup() {
}

void loop() {
  ++phase;
  phase %= full;

  double th = 3.141592 * 2 * phase / full;
  int xx = radius * cos(th);
  int yy = radius * sin(th);
  Mouse.move(xx - x, yy - y, 0);
  x = xx;
  y = yy;
  delay(delay_msec);
}
  • ビルドすると下部のログウインドウに、/var/folders/・・.tmp/といったテンポラリファイルのパスが表示されるのでターミナルアプリでそこを開く。 以下のような感じです。 core/core.aは無視してください。
 cd  /var/folders/・・.tmp
  • このフォルダに、ファイル名.ino.hexというファイルがあるのを確認してください。

  • マイコンをUSBでmacに接続して、マイコンのリセットボタンを押してから、ターミナルから以下のコマンドを実行

dfu-programmer atmega32u4 erase
dfu-programmer atmega32u4 flash ファイル名.ino.hex
  • 書き込みが完了した後、USBを刺しなおすと、アプリが動き始めます。

ピン対応の一覧表

ピン配置はいろいろなサイトに載っていたのですが、どうも同じように動かない。

自分で調べた結果は以下の感じ。#pinの数字を指定してやれば、制御できます。(保証はしません)

#pin 表記 Function - Function 表記 #pin
? B0 SS - ADC0 F0 A5
15 B1 SCK - ADC1 F1 A4
16 B2 MOSI - TCK F4 A3
14 B3 MISO - TMS F5 A2
- RST - - TDO F6 A1
- VCC - - TDI F7 A0
? D2 INT2/RXD1 - - AREF -
? D3 INT3/TXD1 - - GND -
? D1 INT1/SDA - CLK0 C7 13
? D0 INT0/SCL/OC0B - ADC9 D6 12
24 D4 ADC8 - RTS B7 11
? C6 OC1A - ADC13 B6 10
6 D7 ADC10 - ADC12 B5 9
7 E6 - - ADC11 B4 8

Leonard 系のTips

  • setupにおいてSerial通信が始まるまで実行をまつ
setup(){
    Serial.begin(38400);
     while (!Serial) ; 
     //シリアルウインドウが開くまで何もしない
}

参考にしたサイト

続きはこちら

littlewing.hatenablog.com