・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 正式リリース時には、また状況が変わるかもしれません。
こんにちはjxtaharaと申します.私もArduino leonardでICSPなしのイーサーネットシールドを動かそうと苦戦しています.
返信削除SPI信号をleonardのICSPコネクタとSSをD10から引っ張りだし,イーサネットシールドのD10-13につないでいます.あとリセットと5V,GNDもつないでいます.
もしよろしければイーサネットシールドが動作した時の配線を教えてください.
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も動かないと思うので、週末にもうすこし検証してみます。
田原です.
返信削除私も新旧のetherシールドを見比べ,同様に接続しました.
思うに,leonardではD15~D14はICSPに接続されています.思うにCSのD17がRXLEDの制御に使われていて,どのコネクタにも信号が出ていません.
CS自体はどこかのDIOからL(使う)H(使わない)でやればいいはずなので
1)新しいetherシールドはどこかのコネクタがD10と接続されている.
2)ArduinoIDEが無理やりleonardの時SPIのCSをD17でなくD10に書き換えているどちらかなと考えています.
僕も今週考えてみます.
LeonardはUNOとは別物ですね.初心者には勧められないなー
あ、先のコメントで SPI の信号名を <> でくくって書いていたので、
返信削除タグと認識されて消えたようです。少し意味不明になってしまいました。
検証する前は、CS を制御しなくても、シールド側のSS をL 固定にすれば
使えるかなと思っていたのですが、それでは駄目でした。
Leonardo 旧FW/新FW の違いも分かりませんが、旧FW に戻すと動作します。
Leonardo は罠がいろいろあるので買わなかったのですが、
検証用に買った方が良さそうですね、、、
jxtaharaです.
返信削除僕もCSをLに固定したのですがその場合はかえってくる値がむちゃくちゃなので,自分のIPが0.0.0.0や255.255.255.255になってますね.うーん謎だ.
消えた部分の補足
返信削除この記事で試した時の結線
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 とする配線を試したのですが、上手く行きませんでした、、、
jxtaharaです.
返信削除先ほど新型イーサネットシールドが届きましたので,IDE1.0.1&leonardで試してみました.結果としては動作します.
しかし旧シールドで,ICSPのSPIを旧イーサネットシールドのD11~13そしてD10をシールドとLernardのD10をつなぎましたが動きませんでした.
たぶんIDE1.0.1ではD10がSSになっていないような気がします.
外出中なので、まだ自分で検証していないのですが、
返信削除先ほど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ではこの問題は発生しない)
DaVinci32U (Caterina-Leonardo.hex) とIDE 1.0.1、旧Ethernet Shield の組み合わせで動作確認しました。
返信削除上記の通り、シリアルポートにメッセージを出すことが重要でした。
また、WebSerber のサンプルのシリアル関連の行をすべてコメントアウトすれば、
シリアルポートをオープンしなくても動作することを確認できました。
プログラム転送時に、エラーなしで完了になっても、書き込めていないこともありました。
Leonardo のシリアルポートは鬼門ですね。
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」が出ませんでしたね...
シリアルをすべてコメントアウトしてやってみます.
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
}
となっているところをみると,やっぱりシリアルかな~
だめでしたか。
返信削除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 の点滅状態を観察して、駄目そうだったら再度リセット
jxtaharaです.
返信削除ありがとうございます.
Leonardはどうもリセットに問題があるみたいですね.
Arduino SPIでもやはりリセットのためか書き込めないようです....
リセットタイミングを今度ロジアナで解析してみます.
昔PC98のころPC08VMからPC98VXに変わったとき制御に使っていたADCボードがPCのリセットタイミングが違って動かなかったいやな思い出が..たしかTTLでタイミング調整したような..
結局解決に至らなかったようで、残念です。
返信削除当方の環境では、シリアルを全部消した状態では、動作する事が多いです。
Power On 直後がだめでも、リセットボタン押せばだいたい大丈夫でした。
念のため、こちらのプログラムです。
http://djgj.sub.jp/TETRASTYLE/arduino/WebServerNoSerial.txt
おかげさまで、今回のやりとりを経て、ひとつ記事が産まれました。
http://dev.tetrastyle.net/2012/08/blog-post_7.html