Neopixel と サーボモータの共存
以前、サーボモータとテープLEDのNeopixelを一緒に使った際にサーボがガチャガチャと変な挙動を示していたのですが、コレを解決する記事を見つけたので試してみました。
以下がNeopixelとArduino公式 Servoライブラリを共存させた際の不具合の原因と解決するサーボのライブラリを紹介した記事です。勉強になりました!
目次
構成
部品
- Arduino UNO
- サーボモータ SG90
- LEDテープ Neopixel
不具合の原因概要
NeoPixelライブラリは、データ送信中にすべての割り込みを無効にし、発光データ送信後に再度割り込みを有効にします。
Arduino公式 Servoライブラリは割り込みを使用して任意のデューティ比のパルスを生成しているので割り込みを無効にするNeoPixelライブラリと共存は難しいとのこと。
従来Servoライブラリでの動作
Arduinoコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
#include <Servo.h> #include <Adafruit_NeoPixel.h> Servo myservo; #define PIN A0 #define NUMPIXELS 17 Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); int pos = 0; void setup() { myservo.attach(9); pixels.begin(); } void loop() { //myservo.write(90); for (pos = 0; pos <= 180; pos += 1) { myservo.write(pos); int i = pos/10; pixels.setPixelColor(i, pixels.Color(0,150,100)); pixels.show(); delay(15); } for (pos = 180; pos >= 0; pos -= 1) { myservo.write(pos); int i = pos/10; pixels.setPixelColor(i, pixels.Color(0,0,0)); pixels.show(); delay(15); } } |
動作
ちょっと分かりにくいのですが、サーボが左側(角度0°側)にいくとガチャガチャと振動しています。サーボの角度が小さくなると入力するPWM信号のデューティ比は小さくなるのでLEDテープNeopixelの割り込み無効の影響を相対的に大きく受けるためと考えられます。
改善版Servoライブラリでの動作
この問題を解決したサーボライブラリが以下です。
https://github.com/adafruit/Adafruit_TiCoServo
マイコン内部のタイマー/カウンタレジスタ出力でPWMを生成・出力しサーボを制御するので割り込みの影響を受けずNeopixelと共存が可能です。
動作保証しているマイコンや出力ピンはこちらをご確認ください。
コードはライブラリを所定のフォルダに保存後に上記コードに以下の修正を施すのみです。
- 1行目を以下に修正
1#include <Adafruit_TiCoServo.h> - 4行目を以下に修正
4Adafruit_TiCoServo myservo;
動作
スムーズにサーボが動いています。
以上!もっと早く知りたかった便利ライブラリの紹介でした!