BLOG

Arduino Ethernet ShieldとTLC5940を同時に使う方法

これまではPICオンリーでしたが、やっとArduinoに手を出し始めました。それで早速問題発生。Arduino UNO R3とEthernetシールドとTLC5940を使ってみようとしてArduinoの仕様を確認せずにやっていたら、UDP通信とTLC5940がどうしても両立しない。と、思っていたら海外に対処方法がありました。以下にまとめます。

今回の実験は、Arduino UNO R3にEthernet Shieldを取り付け(上図左)、Arduinoから多chPWMを制御可能なTLC5940(上図右)を動かそうというもの。LANの通信はOSC(Open Sound Control, ライブラリーはArdOSC)を使います。 ArdOSCとTLC5940を別々に実験したら動作したのですが、両方のライブラリーを読み込んで動作させようとするとArduinoがフリーズします。ググッたところ海外にもいましたね同じことやってる人

原因はEthernet ShieldとTLC5940が同じ通信規格のSPI通信でArduinoと通信しておりPIN配置がぶつかるというもの。(後日、他の条件があることがわかりました。記事最後に記載。)まあ適当に仕様とか見ずに実験していたのでこんなもんです。 では、デバイスの仕様ということで解決方法はないのか。さらにググってありました。

参照元:http://blog.andrewwei.mu/?p=19

参照元ではIDEがv0022ですが、ここではIDE 1.0.4用に修正。以下、参照ページと同じ書式で記述します。


Hardware components:
1. Arduino Ethernet Shield R3
2. Arduino Uno R3
3. TLC5940

Software components:
1. Arduino software – version 1.0.4 on Mac(原稿執筆時現在 2013/4)
2. Arduino TLC5940 library

Hardware modifications:
1. Ethernet ShieldのD10 pinの足を曲げるか切断します。
2. Ethernet ShieldのD10 pinとD8 pinをどのような方法でもいいので接続します。
3. TLC5940からの接続を変更する。

BLANK -> PB2 (D10) ※これだけ、Arduino Uno R3へ直接接続
XLAT -> PB1 (D9) ※以下は、Ethernet Shieldへの接続
SIN -> PD7 (D7)
XERR -> PD6 (D6) ※XERRは、ショートや故障したLEDをチェックするものなので、無理に使う必要はなく、初期値も無効になっている。ここでは使う前提でtlc_config.hの修正方法も掲載しています。
SCLK -> PD4 (D4)
GSCLK -> PD3 (D3)

Software modifications:
1. tlc_config.hの編集(3箇所)
(Macの場所)Arduino.app\Contents\Resources\Java\libraries\Tlc5940\tlc_config.h

1箇所目は、以下のコード(IDE1.0.4では61行目)を、

#define DATA_TRANSFER_MODE TLC_SPI

以下に修正。

#define DATA_TRANSFER_MODE TLC_BITBANG

2箇所目は、以下のコード(IDE1.0.4では116行目)を、
※XERRを使わない場合は、この修正と3箇所目の修正は必要ない。

#define XERR_ENABLED 0

以下に修正。

#define XERR_ENABLED 1

3箇所目は、以下のコード(IDE1.0.4では130行目)を、

#define XERR_PIN DEFAULT_XERR_PIN

以下に修正。

#define XERR_PIN PD6

2. w5100.hの編集

(Macの場所)Arduino.app\Contents\Resources\Java\libraries\Ethernet\utility\w5100.h

以下のコード(IDE1.0.4では338行から)を、

#else
inline static void initSS() { DDRB |= _BV(2); };
inline static void setSS() { PORTB &= ~_BV(2); };
inline static void resetSS() { PORTB |= _BV(2); };
#endif

以下に修正。

#else
inline static void initSS() { DDRB |= _BV(0); };
inline static void setSS() { PORTB &= ~_BV(0); };
inline static void resetSS() { PORTB |= _BV(0); };
#endif

3. pins_arduino.hの編集

(Macの場所)Arduino.app\Contents\Resources\Java\hardware\arduino\variants\standard\pins_arduino.h

以下のコード(IDE1.0.4では40行目)を、

static const uint8_t SS = 10;

以下に修正。

static const uint8_t SS = 8;

以上で完了。

ここで取り上げている方法は、Ethernet ShieldはHardware SPIで接続し、TLC5940にはBit-bang(ソフトウェアSPI)で接続するもの。基本的にはSPIは複数のSLAVEを使えるのだが、ここによるとTLC5940とArduino間の通信では他のデバイスをその通信に入れることができないらしい。そのため、Hardware SPIはEthernet Shield専用にして、TLC5940はBit-bangで動作させている。しかしながら、Bit-bangはHardware SPIに比べて速度が遅い。私の環境ではLEDの制御で、少しちらつく現象が起きた。どうしてもArduinoを使ってHardware SPIを2つ使いたい場合は、Ethernet Shield – SPI – Arduino – I2C – Arduino – SPI – TLC5940のようにするしかないのかもしれない。要実験。

Leave a Reply

Your email address will not be published. Required fields are marked *