LUFA ライブラリの USB Serial 変換が Strawberry Linux の Da Vinch(ATmega32U4) で動くかやってみた

2014-06-22 09.16.19

AT90USB シリーズや ATmega の USB インタフェース付きマイコンで、USB を使いやすくするライブラリが LUFA プロジェクト にて公開されています。とりあえず USB シリアルのコードが動くかやってみたくなったので Strawberry Linux さんとこのダ・ヴィンチボードを 1 個出してきてピンヘッダもはんだ付けして、FLIP から L チカのプログラムを書き込んで動くのを確認したところ。が上の写真。

Atmel Studio 6.2 を起動して、Extentension Manager や、Atmel ギャラリーなどから LUFA を入れます。クリックすれば入るのであんまり説明するところがありません。

スクリーンショット 2014-06-22 11.12.46

Atmel Studio 6.2 を起動しなおしてから、[File] -> [New] -> [Example Project] を選択。上のハードコピーのようなサンプル選択画面になるので、USB – シリアル変換を選択して、プロジェクトというか今はソリューションでしたかね。を作成します

スクリーンショット 2014-06-22 11.22.18

プロジェクトのディレクトリが作成されてプログラム出来るようになりますが、サンプルプロジェクトのプロパティを見ますと AT90USB1287 を使用するようになっています。今回使うのは ATmega32U4 なので [Change Deivce] ボタンを押して ATmega32u4 に修正します。いろいろ確認のダイアログが出ますが OK で続行

スクリーンショット 2014-06-22 11.23.06

無事ターゲットプロセッサの修正は出来ましたがまだやることがあります。サンプルプロジェクトは、AT90USBKEY というボードを使用するようになっているため、この情報も修正しなければいけません。

スクリーンショット 2014-06-22 11.23.38

[ASF] -> [ASF Wizard] を起動すると上記のような画面が表示されます。ここで右側ペインの中にあるリストボックスが USBKEY になっているのを LEONARD にします。実際に使用するボードはダ・ヴィンチボードですが、そんなもんは定義されていないので、構成が近い Arduino Leonard を使わせてもらう意味での選択です。今回は LED とかは別に点かなくてもいいので適当です。

スクリーンショット 2014-06-22 11.24.41

次はプロジェクトをビルドする時の指定を変更します。

  • F_CPU=8000000UL と F_USB=8000000UL は 8MHz クロックの指定ですが 16MHz なので 16000000UL に修正
  • BOARD= のボード指定は BOARD=BOARD_LEONARDO だけにする

スクリーンショット 2014-06-22 11.28.25

あとはビルドして、マイコンに書き込んだら USB シリアル変換の完成です。問題なく認識すると LUFA USB to Serial(COMnn) というシリアルポートがデバイスマネージャに出ると思います。ドライバの読み込みに失敗した場合は .inf ファイルがAtmel Studio のプロジェクトディレクトリにあるので、それを使ってドライバの更新して下さい。

2014-06-22 11.57.23

どうやってテストするか考えるのが面倒だったので、ATmega32U4 の TXD/RXD をそのまま接続してループバックさせることにしました。

スクリーンショット 2014-06-22 11.59.37

TeraTerm で LUFA の COMポートをオープンして

スクリーンショット 2014-06-22 12.01.19

文字をキーボードから打ち込みまして、それがマイコンから帰ってきまして無事表示されました。

動いてよかったー

Strawberry Linux ダ・ヴィンチ32U with Arduino Bootloader のメモ

2013-08-03 09.50.29

これは、Arduino 互換ボードの一種です。ATMega32u4 というチップ搭載されています。このチップ元を辿ると AT90USB163 などの系統で元々は ISP か FLIP で書き込むタイプのマイコンです。特徴は USB のインタフェースが付いてることですかね。Arduino 本家では Leonardo や Micro が相当する製品になります。

今回は Arduino ブートローダー書き込み済みのものを購入してみて、しばらく使ってみた印象を少しだけ。

USBシリアルの仮想ポートが2つ

ブートローダー実行中と、通常稼動時で COM ポート番号が変化します。最初はドライバの設定(inf ファイルの場所を指示)しなきゃいけませんが、ブートローダーは8秒くらいで終了しちゃうので、COM ポート 2つ設定するという認識が無いとあせりました。

boards.txt の書き換え必要

Arduino IDE で開発を行なう場合は下記エントリを、arduinoのディレクトリ\hardware\arduino\boards.txt に追加します。

davinci.name=Da Vinci 32U
davinci.upload.protocol=avr109
davinci.upload.maximum_size=28672
davinci.upload.speed=57600
davinci.upload.disable_flushing=true
davinci.bootloader.low_fuses=0xff
davinci.bootloader.high_fuses=0xd8
davinci.bootloader.extended_fuses=0xcb
davinci.bootloader.path=caterina
davinci.bootloader.file=davinci.hex
davinci.bootloader.unlock_bits=0x3F
davinci.bootloader.lock_bits=0x2F
davinci.build.mcu=atmega32u4
davinci.build.f_cpu=16000000L
davinci.build.vid=0x1774
davinci.build.pid=0x8032
davinci.build.core=arduino
davinci.build.variant=leonardo

Serial クラス使用時の注意

本家の Guide to the Arduino Leonardo and Micro に細かいことが書かれていますが、USBシリアル使うとき

Serial.begin(9600);
while(!Serial) ;

のようにコーディングしてね、とサンプルが記述されています。この場合 PC 側で Arduino IDE のシリアルモニタ、もしくは Tera Term などの端末ソフトを立ち上げて COM ポートをオープンしないとこの while ループから抜けません。これすなわち PC 接続が条件となっちゃうイヤなパターンなのです。

マイコン単体でも稼動させたいけど、必要な時に USB 差してマイコンに指示を送りたいなどどうすればいいのでしょうかね。私は暫定的に

  // USB ポートのアドレスが変った
  if(udaddrOld != UDADDR) {
    Serial1.println("USB Serial changed");
    udaddrOld = UDADDR;
    if(UDADDR == 0) {
      Serial.end();
    } else {
      Serial.begin(9600);
    }
  }

のような方法で、Serial.end(), Serial.begin() するようにはしています。このとき while(!Serial); は書きません。プログラミング上は Serial.available() でデータ有る無しの判定で済ませています。CPU と USB 部分は別れているので、USB ケーブルの抜き差しするときなどは、30秒から1分程度放置して、32u4 側のエンドポイントがタイムアウトのような形でリセットされるとうまく行くことが多いように思われます。これは Arduino UNO みたいに常時稼動する USBシリアルと決定的に違うところなのであきらめています。

Arduino IDE からのアップロードにしょっちゅう失敗する

ブートローダー起動されたら仮想COMポート番号も変化するのですが、USBシリアルのところはいろいろタイミングとかあるのかして、Arduino IDE から 2~3回書き込みすると次からは書き込みエラーとなって駄目なことが多いです。

こうなるとお手上げなので、Arduino IDE 終了、USBケーブル抜く。マイコン電源 OFF/ON で対応。結構最悪な操作ですな。

結構クセあります。また、このボードは USB 給電と外部給電をセパレートしていないので、組込み時には設計上の注意必要です。

ストロベリー・リナックスの「ダ・ヴィンチ32U with Arduino Bootloader」でタイマー割り込みの確認

2013-08-03 09.50.29

IN-12 ニキシー管8桁表示ユニットのマイコンをどうしようかと日本橋ウロウロしてまして見つけたのがこれです。お値段も 1,260円なり。これなら、マイコンと PC と USB シリアル出来て 32ピン 600mil 幅の大きさです。シリアル通信は Arduino Leonard 同様 Serial クラスが USB, Serial1 クラスが I/O ポート使うらしく、シリアル2ポートはありがたいし、USB シリアル接続してもボードリセットかからないのもよろしい感じです。 Arduino Micro というのがほぼ同じものに見えます。電源回路内蔵されてたりと部品はちょっと多い目についているのですが 2800円くらいなのが微妙なところ。

正直言いますと ARM マイコンボード(評価用)のほうが安いのあったのですが、地味に大きかったりしたのと開発環境構築と開発に時間かかりそうだったので使い慣れてる AVR マイコンにしました。また、このボードはポリスイッチ1個外してしまえば USB からの 5V 切れそうなので、そういう改造も楽そうなのであります。

データシート見まして8ビットカウンタは MEGA328 と変わらんかなということで、早速コーディングして割り込み版 LED チカチカを作成。1ms 毎にポートをパタパタさせたのを測定。500Hz と出ているので正解です。(波形立ち上がり後 1ms で立ち下げ、また 1ms 後に立ち上がりなので1サイクル合計 2ms かかっているため 500Hz です)

あとは、シリアル通信のライブラリが問題なく動けば楽出来るので今後そっちのほうを確認していきます。

#include

boolean led01 = false;

ISR(TIMER0_COMPA_vect) {

if(led01 == false) {
led01 = true;
digitalWrite(13, HIGH);
} else {
led01 = false;
digitalWrite(13, LOW);
}
// set interrupt mask
TIFR0 |= (1<