【スタックチャン】Feetech SCS0009をArduinoフレームワークで使いこなす。
こちらはスタックチャン(Stack-chan) Advent Calendar 2023 4日目の記事です。スタックチャンはSG90系のPWMサーボを使うことが多いですが、Feetechのシリアルサーボ SCS0009を使うと回転や可動範囲が広いのでより多彩な動きが可能です。
もくじ(Index)M5Stack関連の目次へ戻る
シリアルサーボとPWMサーボの違い
PWMサーボは、サーボ毎にGPIOを使ってPWMで制御します。Feetechのシリアルサーボはシリアル接続でデイジーチェーンで繋ぐことができるので2つのGPIO(RX, TX)で複数のサーボを制御することが可能です。
Feetech SCS0009 シリアルサーボはID書き換え作業が必要
シリアルサーボは、デイジーチェーンで繋ぐことが可能なのですが、サーボ複数使用する場合、判別ためにIDを付け直す必要があります。購入時は全部IDが1です。そのためスタックチャンで使う場合は2つ目のIDを書き換える作業が必要です。
Feetech SCS0009の入手方法
スイッチサイエンスかAliExpressのFeetech Official Storeで購入できます。
FDツールでIDを付ける
スタックチャンでFeetech SCS0009を使用する場合はID:1のサーボとID:2のサーボを設定する必要があります。WindowsPCが必要です。
①準備するもの
- ハードウェア
FE-URT1、もしくはStack-chan_TakaoBase_SCS0009とM5Stackを用意します。
初心者の方はFE-URT1を1つ持っておくと良いでしょう。 - ソフトウェア
- FDツール
下記のいずれかからダウンロードしておきます。- Gitee(中国のGitHubのようなサイト) FD1.9.8.2(220714).7z
- 秋月電子通商のFE-URT1のページ FT-SCServo Debug V1.9.8(FD1.9.8-EN_200923.zip)
- ★Stack-chan_TakaoBase_SCS0009のみ
M5StackとSCS0009を接続してシリアル通信をパススルーするために下記のSCS0009Testを書きこんでおきます。
https://github.com/akita11/Stack-chan_Takao_Base_SCS0009
- FDツール
②FE-URT1と接続
FE-URT1はV1に6V~9Vの電源を接続する必要があるのですが、X(Twitter)でわししさんとししかわさんから5Vでもいいよとの情報を得たので下記の画像の赤いジャンパーワイヤのように5VとV1を接続すると楽です。買ってきた状態(ID:1)で2つ接続すると認識できませんので1つだけ接続します。
③FDツールでIDを書き換える
FDツールは、たまにウィルス対策ソフトで隔離されてしまう場合があります。実行して隔離されてしまった場合はスキャンから除外してください。詳しい手順は下記のPostを参照してください。
- 垂直方向(Tilt)に使用するサーボをID:2に書き換えます。
間違えやすいので、シールを貼ってIDを書きこむことをお勧めします。(もしくはコネクタにマジックでIDを書く。)
Arduinoフレームワークで使う(SCServo)
角度指定だけだと、Arduinoライブラリに SCServoというライブラリが公開されています。しかし、回転モードに対応していないため今回はカスタマイズした私のリポジトリを使用してください。
https://github.com/mongonta0716/SCServo
サンプルのリンク
https://github.com/mongonta0716/Stack-chan-tester-SCS0009
モードの切り替え PWMMode(ID, Mode)
絶対位置を指定して動かすモード(false)と回転モード(true)の2種類あります。初期値は位置決めモード(false)です。
sc.PWMMode(1, true); // ID:1のサーボを回転モードにする。
sc.PWMMode(1, false); // ID:1のサーボを位置決めモードにする。
絶対位置を指定して動かす。 WritePos(ID, Position, time(millisec))
SCS0009は0~300°の範囲で位置決めをすることが可能です。Posの値は0(0°)~1023(300°)の値で設定可能です。※ FDツールによるとセンターの位置は511のようです。
sc.WritePos(1, 0, 2000); // ID:1のサーボを0°まで2,000ミリ秒で移動する。
sc.WritePos(2, 511, 1,000); // ID:2のサーボを90°まで1,000ミリ秒で移動する。
回転モードを利用する。 WritePWM(ID, Running Time)
SCS0009を回転させる場合、下記のように1~2000の値を設定すると回転します。下記のようにスピードを変更することができます。
- 時計回り(遅:1001~2000:速)
- 反時計回り(遅:1~1000:速)
sc.WritePWM(1, 1100); // ID:1のサーボを時計回りで回転させる。
delay(1000); // 回転させる秒数を指定
sc.WritePWM(1, 100);
delay(1000); // 回転させる秒数を指定
回転と位置決めのサンプル
下記のようにプログラミングするとボタンAを押したときに水平サーボが動きます。
#include <Arduino.h>
#include <M5Unified.h>
#include <SCServo.h>
#include <Avatar.h>
using namespace m5avatar;
Avatar avatar;
SCSCL sc;
void setup() {
M5.begin();
M5.Display.println("Feetech SCS0009 Test");
avatar.init();
Serial2.begin(1000000, SERIAL_8N1, 33, 32); // Core2のポートAを使用
sc.pSerial = &Serial2;
sc.WritePos(1, 511, 0, 1500);
sc.WritePos(2, 511, 0, 1500);
}
void loop() {
M5.update();
if (M5.BtnA.wasClicked()) {
sc.PWMMode(1, true); // 回転モード
sc.WritePWM(1, 500);
delay(1500);
sc.WritePWM(1, 1500);
delay(1500);
sc.PWMMode(1, false); // 位置決めモードに戻す
sc.WritePos(1, 0, 1000);
delay(1000);
sc.WritePos(1, 511, 1000);
delay(1000);
sc.WritePos(1, 1024, 1000);
delay(1000);
sc.WritePos(1, 511, 1000);
delay(1000);
}
}
課題
360°回転させるとケーブルが絡まる。
USBケーブルを接続した状態だと絡まってしまうため、QIで電源供給するような工夫が必要です。
まとめ
Feetech SCS0009は動きもしっかりしているため、他のサーボよりもきびきび動きます。SG90系のPWMサーボよりも多彩な動きができるようになるので是非挑戦してみてください。