http://mcukits.com/2009/04/06/arduino-ethernet-shield-mega-hack/
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1252386632
一つ目のサイトでは、Ethernet Shieldシールドの10~13ピンを外側に折り曲げ、それら4本のピンをMegaに差し込まないようにしながらマウントしています。後半の説明(April 14th, 2009 UPDATE)では、11~13ピンの3本だけを折り曲げる方法に改良してあるので、その方法で使用してみたいと思います。
3本のピンをMegaには差し込まないように折り曲げてマウントしたら、以下のようにMegaのピンへジャンプワイヤでつないで下さい。
Ethernet Shield 11ピンとMega 51ピン
Ethernet Shield 12ピンとMega 50ピン
Ethernet Shield 13ピンとMega 52ピン
そして、Ethernet Library内の「spi.h」の内容を多少書き換える必要があります。
二つ目のサイト(Forum)には、Megaで使用する際の訂正箇所だけでなく、Megaとそれ以外のボードに対応可能な内容が記載してあるので、それを使いたいと思います。
「spi.h」は、Macならアプリケーション内の「Arduino.app」(バージョン0018)を右クリック(control+クリック)して「パッケージの内容を表示」し、
Arduino.app>Contents>Resouces>Java>libraries>Ethernet>utility>spi.h
にあります。「spi.h」をテキストエディタなどで開き、以下の内容に書き換えます。念のため「spi.h」バックアップをとっておいて下さい。
//-----------------------------------------------------------------------------
//AVR Mega168 SPI HAL
// MODIFIED by Roy Kniskern to handle the Mega pins 7/19/09
#define BIT0 0x01
#define BIT1 0x02
#define BIT2 0x04
#define BIT3 0x08
#define BIT4 0x10
#define BIT5 0x20
#define BIT6 0x40
#define BIT7 0x80
// __AVR_ATmega1280__ will be automatically #defined if the Arduino Mega board is selected
// the ATmega1280 is the chip used in the Mega
#ifdef __AVR_ATmega1280__
// use this to use Ethernet Shield with Arduino Mega
#define SPI0_SS_BIT BIT4
#define SPI0_SCLK_BIT BIT1
#define SPI0_MOSI_BIT BIT2
#define SPI0_MISO_BIT BIT3
#else
// use this for smaller Arduinos (Original version)
#define SPI0_SS_BIT BIT2
#define SPI0_SCLK_BIT BIT5
#define SPI0_MOSI_BIT BIT3
#define SPI0_MISO_BIT BIT4
#endif
#define SPI0_SS_DDR DDRB
#define SPI0_SS_PORT PORTB
#define SPI0_SCLK_DDR DDRB
#define SPI0_SCLK_PORT PORTB
#define SPI0_MOSI_DDR DDRB
#define SPI0_MOSI_PORT PORTB
#define SPI0_MISO_DDR DDRB
#define SPI0_MISO_PORT PORTB
#define SPI0_WaitForReceive()
#define SPI0_RxData() (SPDR)
#define SPI0_TxData(Data) (SPDR = Data)
#define SPI0_WaitForSend() while( (SPSR & 0x80)==0x00 )
#define SPI0_SendByte(Data) SPI0_TxData(Data);SPI0_WaitForSend()
#define SPI0_RecvBute() SPI0_RxData()
#ifdef __AVR_ATmega1280__
// use this to use Ethernet Shield with Arduino Mega
#define SPI0_Init() DDRB |= SPI0_SS_BIT|SPI0_SCLK_BIT|SPI0_MOSI_BIT;\
PORTB |= SPI0_SS_BIT | BIT0; PORTB &= ~(SPI0_SCLK_BIT|SPI0_MOSI_BIT);\
SPCR = 0x50
#else
// use this for smaller Arduinos (Original version)
#define SPI0_Init() DDRB |= SPI0_SS_BIT|SPI0_SCLK_BIT|SPI0_MOSI_BIT;\
PORTB |= SPI0_SS_BIT; PORTB &= ~(SPI0_SCLK_BIT|SPI0_MOSI_BIT);\
SPCR = 0x50
#endif
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//IInChip SPI HAL
#define IINCHIP_SpiInit SPI0_Init
#define IINCHIP_SpiSendData SPI0_SendByte
#define IINCHIP_SpiRecvData SPI0_RxData
#ifdef __AVR_ATmega1280__
// use this to use Ethernet Shield with Arduino Mega
#define IINCHIP_CS_BIT BIT4
// use this for smaller Arduinos (Original version)
#else
#define IINCHIP_CS_BIT BIT2
#endif
#define IINCHIP_CS_DDR DDRB
#define IINCHIP_CS_PORT PORTB
#define IINCHIP_CSInit() (IINCHIP_CS_DDR |= IINCHIP_CS_BIT)
#define IINCHIP_CSon() (IINCHIP_CS_PORT |= IINCHIP_CS_BIT)
#define IINCHIP_CSoff() (IINCHIP_CS_PORT &= ~IINCHIP_CS_BIT)
//-----------------------------------------------------------------------------
赤色の部分が変更してある内容です。「#ifdef __AVR_ATmega1280__」で条件分けしてくれています。
まとめ:
(1)Ethernet Shield 11,12,13ピンを折り曲げてMegaにマウントする。
(2)Ethernet Shield 11,12,13ピンとMega 51,50,52ピンをジャンプワイヤでつなぐ。
(3)「spi.h」の内容を書き換える。
上記方法では動作確認できましたが、一つ目のサイト
http://mcukits.com/2009/04/06/arduino-ethernet-shield-mega-hack/
の後半の返答欄に:
シールドの10番ピンだけ曲げてMegaにマウントし10番ピンと8番ピンを連結し「spi.h」を、
#define SPI0_SS_BIT BIT0
…
#define SPI0_SCLK_BIT BIT5
…
#define SPI0_MOSI_BIT BIT3
…
#define SPI0_MISO_BIT BIT4
…
#define IINCHIP_CS_BIT BIT0
…
PORTB |= SPI0_SS_BIT | BIT2; PORTB &= ~(SPI0_SCLK_BIT|SPI0_MOSI_BIT);\
に書き換えるようですが、その方法だと動作確認できませんでした。
0 件のコメント:
コメントを投稿