このブログへの投稿/アップロードについて(コメントは誰でも、投稿は受講者+スタッフのみ)
コメント/投稿/ラベルについて(基本事項)投稿時間の設定(下書き/予定など)プログラム(ソースコード)を投稿する際の注意点Processingのプログラム(Applet)を表示する方法
ArduinoやProcessingについては「建築発明工作ゼミ2008」の方にまとめてあります。
秋葉原の電子工作マップ、Arduino販売店についてはこちら。 :

2010年3月22日月曜日

Arduino Mega:ピンマッピング

左がArduinoボード上のピン番号:右がATmega1280内のピン番号

[PWM]
PIN13: PIN26/PB7(OC0A/OC1C/PCINT7)
PIN12: PIN25/PB6(OC1B/PCINT6)
PIN11: PIN24/PB5(OC1A/PCINT5)
PIN10: PIN23/PB4(OC2A/PCINT4)
PIN9 : PIN18/PH6(OC2B)
PIN8 : PIN17/PH5(OC4C)

PIN7 : PIN16/PH4(OC4B)
PIN6 : PIN15/PH3(OC4A)
PIN5 : PIN5 /PE3(OC3A/AIN1)
PIN4 : PIN1 /PG5(OC0B)
PIN3 : PIN7 /PE5(OC3C/INT5)
PIN2 : PIN6 /PE4(OC3B/INT4)

[COMMUNICATION]
PIN1 : PIN3 /PE1(TXD0)
PIN0 : PIN2 /PE0(RXD0/PCINT8)

PIN14: PIN64/PJ1(TXD3/PCINT10)
PIN15: PIN63/PJ0(RXD3/PCINT9)
PIN16: PIN13/PH1(TXD2)
PIN17: PIN12/PH0(RXD2)
PIN18: PIN46/PD3(TXD1/INT3)
PIN19: PIN45/PD2(RXD1/INT2)
PIN20: PIN44/PD1(SDA/INT1)
PIN21: PIN43/PD0(SCL/INT0)

[DIGITAL]
PIN22: PIN78/PA0(AD0)
PIN23: PIN77/PA1(AD1)
PIN24: PIN76/PA2(AD2)
PIN25: PIN75/PA3(AD3)
PIN26: PIN74/PA4(AD4)
PIN27: PIN73/PA5(AD5)
PIN28: PIN72/PA6(AD6)
PIN29: PIN71/PA7(AD7)
PIN30: PIN60/PC7(A15)
PIN31: PIN59/PC6(A14)
PIN32: PIN58/PC5(A13)
PIN33: PIN57/PC4(A12)
PIN34: PIN56/PC3(A11)
PIN35: PIN55/PC2(A10)
PIN36: PIN54/PC1(A9)
PIN37: PIN53/PC0(A8)
PIN38: PIN50/PD7(TO)
PIN39: PIN70/PG2(ALE)
PIN40: PIN52/PG1(/RD)
PIN41: PIN51/PG0(/WR)
PIN42: PIN42/PL7
PIN43: PIN41/PL6
PIN44: PIN40/PL5(OC5C)
PIN45: PIN39/PL4(OC5B)
PIN46: PIN38/PL3(OC5A)
PIN47: PIN37/PL2(T5)
PIN48: PIN36/PL1(ICP5)
PIN49: PIN35/PL0(ICP4)
PIN50: PIN22/PB3(MISO/PCINT3)
PIN51: PIN21/PB2(MOSI/PCINT2)
PIN52: PIN20/PB1(SCK/PCINT1)
PIN53: PIN19/PB0(/SS/PCINT0)


[ANALOG IN]
PIN0 : PIN97/PF0(ADC0)
PIN1 : PIN96/PF1(ADC1)
PIN2 : PIN95/PF2(ADC2)
PIN3 : PIN94/PF3(ADC3)
PIN4 : PIN93/PF4(ADC4/TCK)
PIN5 : PIN92/PF5(ADC5/TMS)
PIN6 : PIN91/PF6(ADC6/TDO)
PIN7 : PIN90/PF7(ADC7/TDI)

PIN8 : PIN89/PK0(ADC8/PCINT16)
PIN9 : PIN88/PK1(ADC9/PCINT17)
PIN10: PIN87/PK2(ADC10/PCINT18)
PIN11: PIN86/PK3(ADC11/PCINT19)
PIN12: PIN85/PK4(ADC12/PCINT20)
PIN13: PIN84/PK5(ADC13/PCINT21)
PIN14: PIN83/PK6(ADC14/PCINT22)
PIN15: PIN82/PK7(ADC15/PCINT23)


Duemilanoveであれば、
PORTB
PORTC
PORTD
がありますが、Megaではそれらを合わせて
PORTA
PORTB
PORTC
PORTD
PORTE
PORTF
PORTG
PORTH
PORTJ
PORTK
PORTL
があります。

参考:
ポートマニピュレーション
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1245229578
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1241206933

Arduino Mega + Ethernet Shield

Ethernet ShieldはArduino Megaに未対応ですが、以下のサイトを参考に使用してみたいと思います。
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);\

に書き換えるようですが、その方法だと動作確認できませんでした。

Arduinoイーサネット・シールド
スイッチサイエンス
売り上げランキング: 15483

*