BLOG

Arduino LeonardoとWIZ820ioの接続

Arduino UNO R3とWIZ820ioの接続に関しては、スイッチサイエンスのサイトの通りで問題ないが、Leonardoになってからは接続方法をかえる必要がある。UNOからLeonardoの仕様の変更点はココを参照。基本的な情報はスイッチサイエンスのサイトにまかせて、ここでは変更点のみ記載する。

前半に無理やり配線する方法を掲載しているが、最後にライブラリの修正のみでできる方法を紹介している。そちらのほうがスマートなので、おすすめする。

配線

Arduino Leonardo ⇔ WIZ820io

Rx-LED → nSS
ICSP 4 (MOSI) → MOSI
ICSP 1 (MISO) ← MISO
ICSP 3 (SCK) → SCLK
ICSP 5 (Reset) → nRESET
GND ⇔ GND (どこでもいい)
5V→「5V→3.3V変換」→VIN3.3 (スイッチサイエンスサイト参照

LeonardoではSPIに関する信号線がICSPコネクタのにみ集約された。ピンアサインは下図。

問題なのは、SSへの信号線だ。Leonardoでは標準ではこのSS線がピンヘッダに出力されていない。回路図を見るとなんとRx-LEDに接続されているだけだ。(下図)

そこで、Rx-LEDの片側に直結する。(下図)

 

ライブラリの修正

そして、これだけではまだ動作しないので、ライブラリを一部修正する。(スイッチサイエンスのライブラリの修正をした後で)

w5100.hの以下の黄色部分を

private:
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
  inline static void initSS()    { DDRB  |=  _BV(4); };
  inline static void setSS()     { PORTB &= ‾_BV(4); };
  inline static void resetSS()   { PORTB |=  _BV(4); };
#elif defined(__AVR_ATmega32U4__)
  inline static void initSS()    { DDRB  |=  _BV(6); };
  inline static void setSS()     { PORTB &= ‾_BV(6); };
  inline static void resetSS()   { PORTB |=  _BV(6); }; 
#elif defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB162__)
  inline static void initSS()    { DDRB  |=  _BV(0); };
  inline static void setSS()     { PORTB &= ‾_BV(0); };
  inline static void resetSS()   { PORTB |=  _BV(0); }; 
#else
  inline static void initSS()    { DDRB  |=  _BV(2); };
  inline static void setSS()     { PORTB &= ‾_BV(2); };
  inline static void resetSS()   { PORTB |=  _BV(2); };
#endif

以下のように修正する。

private:
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
inline static void initSS() { DDRB |= _BV(4); };
inline static void setSS() { PORTB &= ‾_BV(4); };
inline static void resetSS() { PORTB |= _BV(4); };
#elif defined(__AVR_ATmega32U4__)
inline static void initSS() { DDRB |= _BV(6); };
inline static void setSS() { PORTB &= ‾_BV(6); };
inline static void resetSS() { PORTB |= _BV(6); };
#elif defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB162__)
inline static void initSS() { DDRB |= _BV(0); };
inline static void setSS() { PORTB &= ‾_BV(0); };
inline static void resetSS() { PORTB |= _BV(0); };
#else
inline static void initSS() { DDRB |= _BV(0); };
inline static void setSS() { PORTB &= ‾_BV(0); };
inline static void resetSS() { PORTB |= _BV(0); };
#endif

 


上記の方法は配線がスマートではない。そこでググッてみると、ライブラリを修正することで実現している人がいた。

ここの方法を参考にして、ここからデータをダウンロードしてライブラリのみ使って入れ替えることで動作させることができた。

SSもLeonardoの10ピンから出力させることができた。