ArduinoのEthernetシールドには、ピンヘッダをそのまま上にバイパスするソケットがついており、他のシールドを重ねて装着することができます。
上記のリンク先にもXbeeシールドをEthernetシールドの上に載せて3階建てにした写真がありますが、実は単に重ねただけだとXBeeシールドが動作しません。
これは、XBeeシールドがArruinoのICSPピン(横にある小さなピンヘッダ)から電源をとっているためです。これはAVRにファームウェアを書き込んだりする際に使うものなので、シールドではあまり使わないのですが、XBeeシールドはここから、5V, GND, RESETを取り出しているようです(RESETはXBeeシールド上のスイッチを押した時にArduinoをリセットするため)。
ですから、3階建てにするためには、下のようにEthernetシールドにあるソケットから(無理やり)5V/GND/RESETを配線してから積み重ねてやれば動作します。
配線するのは以下の通りです。
Ethernetシールド | XBeeシールド(上記のように裏から見たときの位置) |
---|---|
5V | 左上 |
GND | 左下 |
RESET | 右下 |
一応、テスタで各配線がちゃんとArduino上のICSPピンの位置と対応していることを確認するとよいです。
注意点として、積み重ねると5VやGND付近にXBeeモジュールの半田面が来るため、配線とショートしないよう十分確認が必要です。
また、EthernetシールドとXBeeシールドを合わせると結構電力を食う(220〜250mA?)ので、USBの給電能力や、ACアダプタから給電する場合はArduinoの5V用3端子レギュレータの温度に注意が必要です。
さて、せっかくXBeeとEthernetが両方使えるので、XBeeとtelnetを中継するスケッチを書いてみました。一応、複数同時セッションも張れます。XBeeネットワークにPCや他のネットワーク機器を参加させるのが簡単になるかも? なおポートは23(telnet)にしてますが、自由に変えられます。コードは以下。
#include <Ethernet.h> // network configuration. gateway and subnet are optional. byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; byte ip[] = { 10, 0, 0, 177 }; byte gateway[] = { 10, 0, 0, 1 }; byte subnet[] = { 255, 255, 0, 0 }; // telnet defaults to port 23 Server server(23); void setup() { Serial.begin(9600); Ethernet.begin(mac, ip, gateway, subnet); server.begin(); } void loop() { if (Serial.available()) { server.write(Serial.read()); } Client client = server.available(); if (client) { char k = client.read(); server.write(k); Serial.write(k); } }