本产品是一款迷你小巧的双轴串行总线舵机,可以在300°范围内进行角度控制,能够通过程序控制,切换为可连续转动的电机/步进电机模式。可以将舵机串联起来使用,理论上可以同时控制253个总线舵机并且每个舵机都能够获取自己当前的角度、负载、电压、模式等信息。适用于机械手臂,六足机器人,人形机器人,轮式机器人等需要反馈舵机角度和负载的机器人项目。
Arduino IDE使用方法:
你可以参考\examples\arduinoIDE\SCSCL中的例程来了解如何控制舵机和获得舵机信息的反馈。 以下所介绍的功能在总线舵机驱动板中有提供图形界面例程,新手友好。
每个控制舵机的程序,都需要对舵机进行初始化,初始化后才可以使用。
#include <SCServo.h>
SCSCL sc;
void setup(){
Serial1.begin(1000000); //串口初始化,如果使用ESP32等设备也可以选择自定义串口
// Serial1.begin(1000000, SERIAL_8N1, RX, TX); // 自定义串口
sc.pSerial = &Serial1;
while(!Serial1) {}
}
串联起来的舵机中,每个ID只能对应一个舵机,否则不能正常获取舵机反馈的信息。 当更改舵机ID时,尽量保证驱动板只与一个舵机相连接,ID会被永久保存在舵机中。
#include <SCServo.h>
SCSCL sc;
int ID_ChangeFrom = 1; // 要更改ID的舵机原本ID,出厂默认为1
int ID_Changeto = 2; // 新的ID
void setup(){
Serial1.begin(1000000);
sc.pSerial = &Serial1;
while(!Serial1) {}
sc.unLockEprom(ID_ChangeFrom); //解锁EPROM-SAFE
sc.writeByte(ID_ChangeFrom, SCSCL_ID, ID_Changeto);//更改ID
sc.LockEprom(ID_Changeto); // EPROM-SAFE上锁
}
void loop(){
}
用于测试某一舵机是否正常连接。
#include <SCServo.h>
SCSCL sc;
int TEST_ID = 3; // 要测试的舵机ID
void setup()
{
Serial.begin(115200);
Serial1.begin(1000000, SERIAL_8N1, RX, TX); // 自定义串口
sc.pSerial = &Serial1;
while(!Serial1) {}
}
void loop()
{
int ID = sc.Ping(TEST_ID);
if(ID!=-1){
Serial.print("Servo ID:");
Serial.println(ID, DEC);
delay(100);
}else{
Serial.println("Ping servo ID error!");
delay(2000);
}
}
可用于控制单独舵机转动。
#include <SCServo.h>
SCSCL sc;
void setup()
{
Serial1.begin(1000000);
sc.pSerial = &Serial1;
while(!Serial1) {}
}
void loop()
{
sc.WritePos(1, 1000, 0, 1500); // 控制ID为1的舵机以1500的速度转动到1000的位置。
delay(754);//[(P1-P0)/V]*1000+100
sc.WritePos(1, 20, 0, 1500); // 控制ID为1的舵机以1500的速度转动到20的位置。
delay(754);//[(P1-P0)/V]*1000+100
}
可用于同时控制多个舵机(转动到不同的位置和不同的速度)。
#include <SCServo.h>
SCSCL sc;
byte ID[2];
u16 Position[2];
u16 Speed[2];
void setup()
{
Serial1.begin(1000000);
sc.pSerial = &Serial1;
delay(1000);
ID[0] = 1;
ID[1] = 2;
}
void loop()
{
Position[0] = 1000;
Position[1] = 1000;
Speed[0] = 1500;
Speed[1] = 1500;
sc.SyncWritePos(ID, 2, Position, 0, Speed);//Servo((ID1/ID2)) moves at max speed=1500, moves to position=1000.
delay(754);//[(P1-P0)/V]*1000+100
Position[0] = 20;
Position[1] = 20;
Speed[0] = 1500;
Speed[1] = 1500;
sc.SyncWritePos(ID, 2, Position, 0, Speed);//Servo((ID1/ID2)) moves at max speed=1500, moves to position=20.
delay(754);//[(P1-P0)/V]*1000+100
}
#include <SCServo.h>
SCSCL sc;
int ID_input = 1;
void setup()
{
Serial1.begin(1000000, SERIAL_8N1, S_RXD, S_TXD);
Serial.begin(115200);
sc.pSerial = &Serial1;
delay(1000);
}
void loop()
{
int Pos;
int Speed;
int Load;
int Voltage;
int Temper;
int Move;
if(sc.FeedBack(ID_input)!=-1){
Pos = sc.ReadPos(-1);
Speed = sc.ReadSpeed(-1);
Load = sc.ReadLoad(-1);
Voltage = sc.ReadVoltage(-1);
Temper = sc.ReadTemper(-1);
Move = sc.ReadMove(-1);
Serial.print("Position:");
Serial.println(Pos);
Serial.print("Speed:");
Serial.println(Speed);
Serial.print("Load:");
Serial.println(Load);
Serial.print("Voltage:");
Serial.println(Voltage);
Serial.print("Temper:");
Serial.println(Temper);
Serial.print("Move:");
Serial.println(Move);
delay(10);
}else{
Serial.println("FeedBack err");
delay(500);
}
Pos = sc.ReadPos(1);
if(Pos!=-1){
Serial.print("Servo position:");
Serial.println(Pos, DEC);
delay(10);
}else{
Serial.println("read position err");
delay(500);
}
Voltage = sc.ReadVoltage(1);
if(Voltage!=-1){
Serial.print("Servo Voltage:");
Serial.println(Voltage, DEC);
delay(10);
}else{
Serial.println("read Voltage err");
delay(500);
}
Temper = sc.ReadTemper(1);
if(Temper!=-1){
Serial.print("Servo temperature:");
Serial.println(Temper, DEC);
delay(10);
}else{
Serial.println("read temperature err");
delay(500);
}
Speed = sc.ReadSpeed(1);
if(Speed!=-1){
Serial.print("Servo Speed:");
Serial.println(Speed, DEC);
delay(10);
}else{
Serial.println("read Speed err");
delay(500);
}
Load = sc.ReadLoad(1);
if(Load!=-1){
Serial.print("Servo Load:");
Serial.println(Load, DEC);
delay(10);
}else{
Serial.println("read Load err");
delay(500);
}
Move = sc.ReadMove(1);
if(Move!=-1){
Serial.print("Servo Move:");
Serial.println(Move, DEC);
delay(10);
}else{
Serial.println("read Move err");
delay(500);
}
Serial.println();
}