やること
の続きです。
JR PROPOブランドのXBUSServoをシリアルコマンドで動かしますが、ESP32などのSerial1,Serial2などで使えるようにします。
作業環境
- Arduino UNO
- Arduino IDE
- ESP32DevkitC
ライブラリの導入
今回はESP32などのSerial2などでも使える様にしたバージョンをテスト用としてGithubにアップしておきました。
XBUSServoEX とライブラリ名を変更しました。
から、前回の要領でライブラリをインポートしてください。
ESP32との接続
サーボ線 | 機能 | ESP32 |
---|---|---|
外側の黒線 | GND | GNDピン |
中央の黒線 | Vcc | 5Vピン |
外側の白線 | 信号線 | 17番ピン(Serial2) |
今回はハードウェアシリアルとサーボシリアルは別系統になります。
サーボを接続したままでも書き込みはできるはずですが、サーボが暴れる可能性があるので書き込み時はサーボの電源を抜いておくと安心です。
サンプルコード
メニューから「ファイル」→「スケッチ例」→「XBusServoEX」→「ESP32_demo」
ESP32_demo.ino
#include <XBusServoEx.h>
#define kMaxServoNum 1 // XBusサーボの接続数 : 1 - 50
#define kDirPinNum -1 // 送受信切り替えピンの番号. -1 で送信のみ.
XBusServoEx myXBusServo(kDirPinNum, kMaxServoNum); // ライブラリのインスタンス化
unsigned int servoValue = 32767;// サーボ位置の値. 0x7FFF がXBusServoのサーボ位置の中央値
float radiansval = 0.0; // サインカーブ算出用のラジアン値
float radiansIncrement = 0.03; // ループ毎のラジアン値の増加量
void setup()
{
myXBusServo.begin2();
myXBusServo.addServo(0x01, kXbusServoNeutral); // 最初のサーボID. 今回は1番(0x01)のみ.
}
void sendPacket()
{
myXBusServo.sendChannelDataPacket2();
}
void loop()
{
// サインカーブ用の値を算出
radiansval += radiansIncrement; //ラジアン値を増加
radiansval = (radiansval > 2 * PI) ? 0 : radiansval; //ラジアン値が2πを超えたら0にリセット
// サーボの値をセットする
servoValue = 32767 + int(sin(radiansval) * 30426); // サーボ位置の上限下限の許容範囲でサイン揺動させる
myXBusServo.setServo(1, servoValue); //サーボ値をセットする
myXBusServo.sendChannelDataPacket2(); //データを送信する
delay(10); //10ミリ秒ディレイ. 14ミリ秒以下の必要がある.
}
起動と動作結果
1秒間隔ぐらいでサーボが加減速しながら左右に回転すれば実験成功です。
Teensy4.0では?
Teensy4.0でもSerial5まで使えることが確認できました。(送信のみですが)
さいごに
コマンドを使ってデータをとったりいろいろ試してみたいと思います。
複数のサーボを使った時にうまく動くかもテストが必要です。
よき電子工作ライフを〜