2012年2月8日水曜日

ダ・ヴィンチ32U as Leonardo


前回に引き続き、ストロベリーリナックスのダ・ヴィンチ32U ボードの紹介です。

・Arduino IDE のサンプルをいくつか実行して気づいた点

 電源投入してから、ユーザープログラムが起動するまで数秒 待たされる。(D13 が明滅している)
 アナログポートとしてつかえるピンが増えている。
 SPI のポート(SS,SCK,MOSI,MISO) がD10〜D13 とは別のポートになっている。
 シリアル通信がうまくいかない?


・問題なく動いたサンプル
 1. Basics > Blink
 2. Digital > Button
 3. Analog > AnalogInput
 3. Analog > Fading
 4. Communication > PysicalPixel
 Ethernet > WebSerber

単純に28pin DIP 版のArduino Uno よりも、使えるIO が増えている。
Ethernet は D10-D13 にあった SPI のポートが別の場所に変わっているので、
そこを正しく接続すれば問題ない。

D13 はオンボードにLED がついていて、PWM ポートになっているようだが、analogWrite(13,val); ではコントロールできなかった。


・問題があったサンプル
 4. Communication > ASCIITable

これはMac 固有の問題なのかもしれないが、ASCIITable のサンプルの様に、
起動直後にSerial 出力をすると、受け取る事ができなかった。

理由を想像すると、

プログラム転送→(シリアルモニタ使えない)→転送完了→ユーザープログラム実行 →シリアル接続開始

とやっているうちに、転送が終わってしまうのが原因らしい。

それでは、と、リセットボタンを押すと、今度はUSB シリアルが死んでしまう。
(おまけに、シリアルポートをオープンしている時にリセットを押すと、高い確率でフリーズする。)

データを繰り返し送り続ける、ボタンを押したとき送る、シリアルを受信して返す、などのプログラムは問題なさそうだ。

・外部機器とのシリアル通信

Uno では別のチップだったUSB シリアル変換機能を内蔵している。
「Serial」はUSB シリアル通信専用になり、Serial.write/Serial.read の通信は外部に出力されない。

Atmega32u4 本来の UART機能を使う場合は「Serial1」を使う。
(Arduino MEGA など、複数のUART を持つボードで2つ目のシリアルを使うのと同様)
Serial1.begin / Serial1.write / Serial1.read などとすればOK。
これで、D0 をRX、D1 をTX として、外部と通信ができる。


・USB Host Shield
USB Host Shield のライブラリは、Leonardo ボードを指定すると、
コンパイル時にエラーになる。これは簡単には解決出来なさそう。
小型のADK ボードが作れるかと思っていたのに、残念。
(2/13追記)→動きました

以上、短時間動かしただけなので、実用上の問題がないかは分かりません。
Leonardo 正式リリース時には、また状況が変わるかもしれません。

14 件のコメント:

  1. こんにちはjxtaharaと申します.私もArduino leonardでICSPなしのイーサーネットシールドを動かそうと苦戦しています.
    SPI信号をleonardのICSPコネクタとSSをD10から引っ張りだし,イーサネットシールドのD10-13につないでいます.あとリセットと5V,GNDもつないでいます.

    もしよろしければイーサネットシールドが動作した時の配線を教えてください.

    返信削除
  2. jxtahara さんこんにちは。
    とりあえず、質問のピン配置ですが、記事の写真ではこうなっています。
    (これと +5V,Reset,GND)

    ダヴィンチ32U <> Ethernet Shield(旧)
    PB0 D10
    PB1 D13
    PB2 D11
    PB3 D12

    ダヴィンチはLeonardo よりピンが多いので、ここで使っているピンは Leonardo では
    IO として出ていない様です。
    http://arduino.cc/en/Main/ArduinoBoardLeonardo
    http://arduino.cc/en/uploads/Main/arduino-leonardo-schematic_3b.pdf

    Arduino Leonardo
    D17/RXLED
    D15
    D16
    D14

    さらに、この記事では Arduino IDE 1.0 と一緒に配布されていたLeonardo 用の
    ファームウェア(DiskLoader-Leonardo.hex/2011-11-29)を使用しましたが、
    Leonardo に正式対応した最新版 Arduino IDE 1.0.1 付属のファームウェア
    (Caterina-Leonardo.hex/2012-5-22)で試した所、上記配線では上手く行きませんでした。

    製品版 Leonardo はCaterina だと思います。
    しかし、これでは純正Ethernet Shieldも動かないと思うので、週末にもうすこし検証してみます。

    返信削除
  3. 田原です.
    私も新旧のetherシールドを見比べ,同様に接続しました.
    思うに,leonardではD15~D14はICSPに接続されています.思うにCSのD17がRXLEDの制御に使われていて,どのコネクタにも信号が出ていません.
    CS自体はどこかのDIOからL(使う)H(使わない)でやればいいはずなので

    1)新しいetherシールドはどこかのコネクタがD10と接続されている.
    2)ArduinoIDEが無理やりleonardの時SPIのCSをD17でなくD10に書き換えているどちらかなと考えています.

    僕も今週考えてみます.
    LeonardはUNOとは別物ですね.初心者には勧められないなー

    返信削除
  4. あ、先のコメントで SPI の信号名を <> でくくって書いていたので、
    タグと認識されて消えたようです。少し意味不明になってしまいました。

    検証する前は、CS を制御しなくても、シールド側のSS をL 固定にすれば
    使えるかなと思っていたのですが、それでは駄目でした。

    Leonardo 旧FW/新FW の違いも分かりませんが、旧FW に戻すと動作します。

    Leonardo は罠がいろいろあるので買わなかったのですが、
    検証用に買った方が良さそうですね、、、

    返信削除
  5. jxtaharaです.
    僕もCSをLに固定したのですがその場合はかえってくる値がむちゃくちゃなので,自分のIPが0.0.0.0や255.255.255.255になってますね.うーん謎だ.

    返信削除
  6. 消えた部分の補足
    この記事で試した時の結線
    PB0 [SS] D10
    PB1 [SCK] D13
    PB2 [MOSI] D11
    PB3 [MISO] D12

    Arduino Leonardo
    [SS] D17/RXLED
    [SCK] D15
    [MOSI] D16
    [MISO] D14

    その後、libraries > Ethernet > utility > w5100.h
    の中で、Ethernet Shield の SS ピンを指定していることがわかりました。
    IDE 1.0 では 32u4 のPB0(D17) を、IDE1.0.1 では32u4 のPB6(D10) を、それぞれ SS ピンにしています。

    よって、新シールド & Leonardo の組み合わせは問題なさそうです。
    しかし、手元の DaVinci で、PB6 をSS とする配線を試したのですが、上手く行きませんでした、、、

    返信削除
  7. jxtaharaです.
    先ほど新型イーサネットシールドが届きましたので,IDE1.0.1&leonardで試してみました.結果としては動作します.

    しかし旧シールドで,ICSPのSPIを旧イーサネットシールドのD11~13そしてD10をシールドとLernardのD10をつなぎましたが動きませんでした.

    たぶんIDE1.0.1ではD10がSSになっていないような気がします.

    返信削除
  8. 外出中なので、まだ自分で検証していないのですが、
    先ほどLeonardo & 新・旧Ethernet Shield を持っている友人から連絡ありました。
    これでどうでしょうか?

    ==========================================
    Leonardo + Arduino IDE 1.0.1 + 新Ethernet Shieldの組み合わせで、
    問題無くWebServerサンプルは動作しました。

    Leonardo + Arduino IDE 1.0.1 + 旧Ethernet Shieldの組み合わせでは、
    以下の結線で動作しました。(シールドはスタックせず、ジャンパで結線)

    LEONARDO→旧Ether Shield
    ICSP(1)→12 (MISO)
    ICSP(2)→5V (+5V)
    ICSP(3)→13 (SCK)
    ICSP(4)→11 (MOSI)
    ICSP(5)→RESET (RESET)
    ICSP(6)→GND (GND)
    10→10(SS)

    ただし、両パターンとも、最初にターミナルで接続して、
    server is at xxx.xxx.xxx.xxx
    を表示させないと動作しません。
    ※USBシリアルの問題だと思います(UNOではこの問題は発生しない)

    返信削除
  9. DaVinci32U (Caterina-Leonardo.hex) とIDE 1.0.1、旧Ethernet Shield の組み合わせで動作確認しました。

    上記の通り、シリアルポートにメッセージを出すことが重要でした。
    また、WebSerber のサンプルのシリアル関連の行をすべてコメントアウトすれば、
    シリアルポートをオープンしなくても動作することを確認できました。

    プログラム転送時に、エラーなしで完了になっても、書き込めていないこともありました。
    Leonardo のシリアルポートは鬼門ですね。

    返信削除
  10. jxtaharaです.そういえは,
    LEONARDO→旧Ether Shield
    ICSP(1)→12 (MISO)
    ICSP(2)→5V (+5V)
    ICSP(3)→13 (SCK)
    ICSP(4)→11 (MOSI)
    ICSP(5)→RESET (RESET)
    ICSP(6)→GND (GND)
    10→10(SS)
    では「server is at xxx.xxx.xxx.xxx」が出ませんでしたね...

    シリアルをすべてコメントアウトしてやってみます.

    返信削除
  11. jxtaharaです.
    やっぱり動かないですね...

    server is at 0.0.0.0

    です.

    LeonardではWebServerでは

    while (!Serial) {
    i=i+1; ; // wait for serial port to connect. Needed for Leonardo only
    }
    となっているところをみると,やっぱりシリアルかな~

    返信削除
  12. だめでしたか。

    Leonardo の場合、その while 文の記述がないと、USB シリアルが OS に認識される前に
    送信し終わってしまって、表示されないのだと思います。

    シリアル関連では、リセット後のシリアルポートの認識がおかしい(一度はずして差し直した方が良い)
    こともありましたが、server is at ... のメッセージが来ているのであれば、シリアルの問題ではないような気もします。

    シールドのリセットが上手くいっていないのかもしれませんね。
    新旧シールドの回路図を見ると、リセット用のIC が追加されています。

    (旧)http://arduino.cc/en/uploads/Main/arduino-ethernet-shield-schematic.pdf
    (新)http://arduino.cc/en/uploads/Main/arduino-ethernet-shield-06-schematic.pdf


    手順はこれくらいしか思い付きませんが、
    1) シリアル関連を全部消して、シリアルポートをオープンしないでも、プログラムが動作するようにする
    2) Leonardo 側のリセットボタンをしっかり押す
    3) シールドの LINK LED の点滅状態を観察して、駄目そうだったら再度リセット

    返信削除
  13. jxtaharaです.
    ありがとうございます.
    Leonardはどうもリセットに問題があるみたいですね.
    Arduino SPIでもやはりリセットのためか書き込めないようです....
    リセットタイミングを今度ロジアナで解析してみます.

    昔PC98のころPC08VMからPC98VXに変わったとき制御に使っていたADCボードがPCのリセットタイミングが違って動かなかったいやな思い出が..たしかTTLでタイミング調整したような..

    返信削除
  14. 結局解決に至らなかったようで、残念です。

    当方の環境では、シリアルを全部消した状態では、動作する事が多いです。
    Power On 直後がだめでも、リセットボタン押せばだいたい大丈夫でした。
    念のため、こちらのプログラムです。
    http://djgj.sub.jp/TETRASTYLE/arduino/WebServerNoSerial.txt


    おかげさまで、今回のやりとりを経て、ひとつ記事が産まれました。
    http://dev.tetrastyle.net/2012/08/blog-post_7.html

    返信削除