IN-12B ニキシー管8桁ユニットのテスト

と言いましても、電源入れたまま使用するという簡単な条件なのですが、その後数十秒でハング状況が多発する事象が発生。JTAG でデバッグすれば固まってる場所の特定も出来そうなもんですが Arduino IDE じゃどうにもなりませんわな。というところ。一度、USB CDC(Serial クラス)を使用しているところバッサリ消去して安定するか試してみたいと思っています。

で、USB を使わないようコンパイルするしても下記のように、自分でコーディングしたもの以外にブートローダーとの兼ね合いでしょうが USB 関係のファイルはコピーされてますねぇ。まぁ、これでもハングするようなら Atmel Studio で完全に USB 使用しない形でコンバートかけたいと思います。

C:\...\AppData\Local\Temp\build2719134002796884758.tmp\EEPROM
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\SPI
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\Wire
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\CDC.cpp.d
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\CDC.cpp.o
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\core.a
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\HardwareSerial.cpp.d
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\HardwareSerial.cpp.o
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\HID.cpp.d
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\HID.cpp.o
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\IN_12Control_32u4_rtc8564.cpp
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\IN_12Control_32u4_rtc8564.cpp.d
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\IN_12Control_32u4_rtc8564.cpp.eep
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\IN_12Control_32u4_rtc8564.cpp.elf
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\IN_12Control_32u4_rtc8564.cpp.hex
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\IN_12Control_32u4_rtc8564.cpp.o
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\IPAddress.cpp.d
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\IPAddress.cpp.o
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\main.cpp.d
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\main.cpp.o
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\malloc.c.d
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\malloc.c.o
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\new.cpp.d
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\new.cpp.o
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\Print.cpp.d
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\Print.cpp.o
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\realloc.c.d
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\realloc.c.o
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\rtc8564.cpp
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\rtc8564.cpp.d
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\rtc8564.cpp.o
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\rtc8564.h
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\Stream.cpp.d
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\Stream.cpp.o
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\Tone.cpp.d
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\Tone.cpp.o
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\USBCore.cpp.d
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\USBCore.cpp.o
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\WInterrupts.c.d
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\WInterrupts.c.o
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\wiring.c.d
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\wiring.c.o
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\wiring_analog.c.d
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\wiring_analog.c.o
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\wiring_digital.c.d
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\wiring_digital.c.o
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\wiring_pulse.c.d
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\wiring_pulse.c.o
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\wiring_shift.c.d
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\wiring_shift.c.o
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\WMath.cpp.d
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\WMath.cpp.o
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\WString.cpp.d
C:\...\AppData\Local\Temp\build2719134002796884758.tmp\WString.cpp.o

USB シリアル変換必須になっちゃいそう…

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<

Arduino Ethernet Shield の動作確認

朝食をいただきつつ、先日買ってきた Arduino Ethernet Shield が視線のスミにチラチラという状態。とにかく買ってきたのが壊れてないかだけでも確認ということで、ごはんの後早速セットアップ。今回は Arduino UNO R3 に Ethernet Shield を付けました。あと用意するのは PC と接続するための USB ケーブルと LAN ケーブルです。

早速 Arduino IDE を起動して、サンプルスケッチの Twitter クライアントをコピペしてコンパイル。その後書き込みをしたら自動的に Arduino はリセットがかかり再起動されます。

書き込みが終れば、Arduino IDE からシリアルモニタを起動して、何が出力されている確認。今回は

Attempting to get an IP address using DHCP:
My address:192.168.24.4
connecting to server...
making HTTP request...
>@binarylegit yes correct!

yes correct! という Tweet が表示されました。一応本当かどうか Web ブラウザからもアドレスを入力して確認です。

はい、間違い無いようですね。ということで買ってきたボードは正常と。とりあえず、セットアップ始めてこの blog 更新まで1時間かかりませんでした。便利なもんです。

Arduino Ethernet Shield 買うてきた

今日は日本橋まで行ってました。特に買い物というわけでは無くネタ探しということです。で、結局買って来たのは Arduino Ethernet Shield です。それも純正。Sparkfun だったかに1枚物のがあったように思ったのですが、たまたま無かったのでこれでもいいというというやつです。IDE のサンプルに Twitter クライアントの例などがあるようなのでまたサンプルのソース見て見ましょう。

物としては WIZNET W5100 の Ethernet アダプタで、TCP/IP のところはチップ側でやってくれます。このためマイコン側はシリアル伝送でチップとやりとりすればいいというやつです。ちょっと前までとかはカニさんチップを一生懸命たたいて動かしていたのが懐しいですね。おまけにライブラリまで提供されているので楽すぎます。

ちなみに、写真が横向きになっていますが WordPress 3.4 にしたら取り込みした写真のピクセル長いほうが横向きになります。これはうちとこだけかも知れない。