EthernetとServoは相性が悪い?
Arduinoを使って、まず多くの人がやってみようと思うであろう事として、ネットワークを使って何かを物理的に「動かす」という事があるかと思います。ちょっとした動作ならばEthernetシールドとサーボがあれば簡単にできてしまいます。ところがこの組み合わせ、なぜかうまく動いてくれない事があります。それを確認してしみました。同じようなトラブルに遭遇している方の参考になれば。
単純にサーボ制御を入れただけなのに
スケッチは、EthernetシールドのWebサーバーのサンプルにサーボ制御を入れただけです。
何かアクセスがあるとSERVO_ONで定義されている角度に制御し、0.5秒後にSERVO_OFFの角度に戻します。それだけです。
// ほとんどEthernetのWebサーバーのサンプルと同じ。 #define SERVO_OFF 10 #define SERVO_ON 24 #define SERVO_PIN 2 #include <SPI.h> #include <Ethernet.h> #include <Servo.h> // 以下、XXの部分は適宜書き換えてください。 byte mac[] = { 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX }; IPAddress ip(XX,XX,XX,XX); EthernetServer server(80); Servo theServo; void setup() { theServo.attach(SERVO_PIN); theServo.write(SERVO_OFF); Ethernet.begin(mac, ip); server.begin(); } void loop() { // ほとんど定番です。 EthernetClient client = server.available(); if (client) { boolean currentLineIsBlank = true; while (client.connected()) { if (client.available()) { char c = client.read(); if (c == '\n' && currentLineIsBlank) { client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(); client.println("<html>"); client.println("Control!"); client.println("</html>"); // ここでサーボの制御。 theServo.write(SERVO_ON); delay(500); theServo.write(SERVO_OFF); break; } if (c == '\n') { // you're starting a new line currentLineIsBlank = true; } else if (c != '\r') { // you've gotten a character on the current line currentLineIsBlank = false; } } } delay(1); client.stop(); } }
ところがこれだけの事なのに、Arduino UNOとEthernetシールドの組み合わせでは正常に動作してくれなかったのです。最初の1回だけはうまく動きますが、その後アクセスできなくなってしまいました。リセットすれば再度復活します。
結論から言ってしまえば、原因は「電源」でした。
Servoはかなり電源を食う
まず以下が、Arduino UNOとEthernetシールドとの組み合わせで電源をUSBバスパワーから供給し、サーボの電源をArduinoの+5V端子から供給した場合の、サーボが動いた瞬間のArduinoの5V電源の波形です。
かなり落ちていることがわかります。Ethernetシールド上のW5100はこの電圧から3.3Vが作られ、その電圧で動いているので誤動作する可能性は充分にあります。実際、ATMega328は正常に動作しているようなので、誤動作を起こしたのはW5100であろうと思われます。
電源として9VのAVアダプターを利用したら正常に動作しました。その時の5Vの様子が以下。
全然違います。この程度のノイズであれば問題ないでしょう。
他の例として、SparkFanの Pro Ethernet で確認してみました。Pro EthernetはPCとの接続はUSBではなく6ピンのシリアル端子ですが、変換としてFTDIのUSB-6ピンシリアル変換ケーブルを使いました。結果は以下。
形としてはUNO+Ethernetシールドと同じような感じですが、落ちる電圧は若干改善されています。動作としてはとりあえず正常に動いてますが、この波形を見てしまうとトラブルが発生する可能性もあるかな、と思えてしまいます。
さらに、その Pro Ethernet を9Vで駆動してみたのが以下。
UNO+Ethernetシールドを9Vで駆動したものとあまり違わない結果でした。
結論
たぶんこれはEthernetシールドに限った事ではないと思いますが、サーボは瞬間的に結構電力を消費するため、他のデバイスに悪影響を及ぼす可能性があるという事がわかりました。
サーボを使う際には、その電源を甘く見ないほうが良さそうです。