チラシの裏からうっすら見える外枠の外のメモ書き

新聞に挟まってる硬い紙のチラシの裏からうっすら見える外枠の外に走り書きされたようなものです。思いついたときにふらふらと。

Arduinoでフィードバック機能付き360度サーボモータを制御するためのライブラリを作った

Parallaxという会社が作ったParallax Feedback 360° High Speed ServoというサーボモータArduinoで制御するためのライブラリを作りました。 最近はArduinoC++を触っていなかったのでなかなか面倒でしたがなんとかできたのでGitHubで公開しています。 よければ使ってみて下さい。

github.com

ここではこのライブラリの制作背景や使い方を紹介します。

注意事項

このライブラリはつい数時間前に完成したばかりでバグがあったり、うまく動かなかったりするかもしれません。 もしそのようなバグなどを見つけた場合はGitHubのIssuesから新しいIssueを追加してもらうか、修正していただいたものをPull Requestしていただけると大変うれしいです。 また、現段階ではArduino Unoでしか動作確認していないので他のArduinoで実行できた場合などもご連絡いただけると幸いです。

制作背景

Parallax Feedback 360° High Speed Servo

このライブラリではParallax Feedback 360° High Speed Servoというサーボモータを制御することができます。 このサーボモータは360度回転させることができ、さらに現在の角度を取得することができるという高機能なサーボモータです。

www.parallax.com

サンプルコードがない

しかしながら、Arduinoで実行できるようなサンプルコードやライブラリがないため、動かすことはできてもフィードバック機能をデータシートの仕様やC言語のコードをArduino向けに変換して使わないといけない感じになっていました。 このサーボモータを使うなら、現在の角度やモーターの回転を角度を指定するだけで動かせるようにしたいと思っていたのでライブラリを作ることにしました。
1日目にC言語のコードをArduinoで動くinoファイルに書き直して実際に問題なく動作するか確認し、
2日目でinoにしたコードをC++のライブラリ形式に書き直し、
3日目にコードのデバッグをした力作です。
データシートは以下にあります。

www.parallax.com

使い方

インストール方法

この記事冒頭にあるGitHubリポジトリにてライブラリを配布しています。 Releaseからzipファイルをダウンロードしていただき、そのままArduino IDEにインクルードしてもらえば利用できると思います。

サンプル

このライブラリにはいくつかのサンプルスケッチが含まれています。 サンプルスケッチのコードを解説していきます。

Read

このサンプルスケッチでは、接続されたサーボモータの回転角度をシリアル通信でシリアルモニタに表示します。 以下がコードです。

#include "FeedBackServo.h"
// define feedback signal pin
#define FEEDBACK_PIN 2

// set feedback signal pin number
FeedBackServo servo = FeedBackServo(FEEDBACK_PIN);

void setup() {
    // serial communication start with 115200 bps
    Serial.begin(115200);
}

void loop() {
    Serial.print("Now angle: ");
    Serial.println(servo.Angle());
}

1行目でライブラリをインクルードしています。
3行目ではフィードバック信号が送られてくる信号線が刺さっているピンの番号を定義します。ライブラリではこのピンを使って外部割り込みを受け付けるので各Arduinoにおいて外部割り込みが受付可能なピンを指定して下さい。今回は2番ピンに信号線が刺さっているものとします。
6行目では3行目で定義したピン番号をライブラリのクラスに与えています。Arduino UnoまたはArduino Leonardoではこのときにセットされるピン番号が外部割り込み可能なピンでない場合、ここでプログラムが終了してしまいます。
10行目ではシリアル通信を115200bpsで開始しています。この速度が遅いとライブラリの動作に悪影響を及ぼす場合があります。
14,15行目ではシリアル通信でシリアルモニタにデータを送信しています。
15行目のservo.Angle()では、現在のサーボモータの回転角度をint型で返しています。

Rotation

このサンプルスケッチでは、接続されたサーボモータの回転角度を見ながら、270度と-180度を1秒間隔でP制御によってサーボモータを回転します。 回転には+-4度までの誤差を許容します。 以下がコードです。

#include "FeedBackServo.h"
// define feedback signal pin and servo control pin
#define FEEDBACK_PIN 2
#define SERVO_PIN 3

// set feedback signal pin number
FeedBackServo servo = FeedBackServo(FEEDBACK_PIN);

void setup() {
    // set servo control pin number
    servo.setServoControl(SERVO_PIN);
    servo.setKp(1.0);
}

void loop() {
    // rotate servo to 270 and -180 degrees(with contains +-4 degrees error) each 1 second.
    servo.rotate(270, 4);
    delay(1000);
    servo.rotate(-180, 4);
    delay(1000);
}

1行目でライブラリをインクルードしています。
3行目ではフィードバック信号が送られてくる信号線が刺さっているピンの番号を定義します。ライブラリではこのピンを使って外部割り込みを受け付けるので各Arduinoにおいて外部割り込みが受付可能なピンを指定して下さい。今回は2番ピンに信号線が刺さっているものとします。
4行目ではサーボモータの制御信号を送るピンの番号を定義します。ライブラリではServo.hのサーボモータ制御を利用するのでどのピンも利用できます。今回は3番ピンに制御信号線が刺さっているものとします。
7行目では3行目で定義したピン番号をライブラリのクラスに与えています。Arduino UnoまたはArduino Leonardoではこのときにセットされるピン番号が外部割り込み可能なピンでない場合、ここでプログラムが終了してしまいます。
11行目では4行目で定義したピン番号をライブラリに与えています。
12行目ではP制御に使うKpの値を設定しています。ここでは、1.0をKpとしています。
17行目ではサーボモータを270度回転させます。4度までの誤差を許容するようにも設定しています。
18行目では1秒間(1000ms)のディレイを行っています。
19行目ではサーボモータを-180度回転させます。4度までの誤差を許容するようにも設定しています。
20行目では1秒間(1000ms)のディレイを行っています。

リファレンス

英語でリファレンスを書くのが面倒なのでここに走り書き程度に書いておきます。 詳しいリファレンスは気が向いたらリポジトリ上にちゃんと見やすく書くつもりです。

FeedBackServo

FeedBackServo(byte feedbackPinNumber = 2);

これはコンストラクタです。フィードバック信号を受け取ることのできるピン番号を与えます。デフォルトは2で省略可能です。 ピン番号が外部割り込み可能なものでない場合、プログラムは終了します。

setServoControl

void setServoControl(byte servoPinNumber = 3);

サーボモータの制御信号を送ることのできるピン番号を与えます。デフォルトは3で省略可能です。

setKp

void setKp(float _Kp = 1.0);

サーボモータをP制御する際に使用するKp値をセットします。

rotate

void rotate(int degree, int threshold = 4);

サーボモータをP制御で回転させます。第一引数には回転させたい角度を、第二引数には許容する角度誤差を与えます。第二引数のデフォルトは4で省略可能です。

Angle

int Angle();

サーボモータの現在の角度をint型で返します。

FAQ

Q. ~~~っていう機能を追加してほしい!などの要望がある

  1. 対応できる場合は対応しますが私も多忙なためすべての要望に対応できない場合があります。 コードはGitHub上で公開していますのでForkしていただいて機能を追加し、Pull Requestなどいただければ幸いです。

Q. ~~~がおかしいなどの不具合報告

  1. GitHub上のリポジトリにあるIssuesにてIssueを発行してもらえると管理しやすいので助かります。 Twitterでも受け付けることはできますがIssuesに書いてもらったほうが100倍以上嬉しいです。

この他に質問などあればこの記事のコメント欄やTwitterGitHubのIssuesにてぜひどうぞ。