※因改造引起的Robi故障,本人及本站都不負賠償任,進行改造前需有小朋友出走的覺悟。
Robi用的伺服馬達,除了和其他伺服馬達一樣,可使用單向的PWM控制之外,
還可以使用雙向的TTL Packet控制,可以詢問馬達,目前的溫度,位移量等等,詳情請參考伺服馬達說明書
今天要作的測試是更改maximum torque的值,對於伺服馬達轉動的影響。
什麼是TORQUE呢?維基百科的定義是:Torque, moment or moment of force (see the terminology below), is the tendency of a force to rotate an object about an axis,[1] fulcrum, or pivot. Just as a force is a push or a pull, a torque can be thought of as a twist to an object.
簡而言之:一種力量的傾向,可使一個物體繞著軸轉。
Maximum Torque的值越大,馬達的轉動速度就越快,當然也越吵。
為了方便DEMO,影片中加入了一個1602的LCD螢幕,使用I2C介面控制,詳細資訊請參考Cooper Maa的網誌。
線路接法
[伺服馬達]S接Arduino Digital 3。電源就接+5V&GND。不曉得S、+、-三隻腳位的,可以看一下第三期的控制機板,上面有印。
[I2C LCD] SCL接Arduino Analog A5。SDA接Arduino Analog A4。電源就接+5V&GND。
程式碼如下:程式碼下載處https://box.nctu.edu.tw/public.php?service=files&t=be41e58220d32a386b98c58d2a5a07b5
// for RS308MD(Robi) singl servo test
#include
#include
#include <LiquidCrystal_I2C.h>
SoftwareSerial robi = SoftwareSerial(2,3); //RX , TX pin D3 for tranfer DATA
byte set[]={0X01,0x00,0X1E,0X02,0X01}; //ID,Flag,Adress,Length,Count,
byte Max_Torque[]={0x01,0x00,0x23,0x01}; //ID,Flag,Adress,Length,Count,
byte Sum;
byte on[]={0x01,0x00,0x24,0x01,0x01,0x01,0x24}; //Torque Enable DATA
byte tx_Head_H=0XFA;
byte tx_Head_L=0XAF;
byte rx_Head_H=0XFD; //rx_Header's are reserved for checking rx pkt.
byte rx_Head_L=0XAF;
int i=1;
byte CheckSum=0;
LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display
void setup()
{
robi.begin(115200);
delay(500);
lcd.init(); // initialize the lcd
// Print a message to the LCD.
lcd.backlight();
set_Max_Torque(0x64);
Torque_on();
move_s(0);
}
void loop()
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Maxium Torque=");
lcd.setCursor(0, 1);
lcd.print(i*0x14,DEC);
set_Max_Torque(0x16*i);
delay(500);
move_s(450);
delay(2000);
move_s(900);
delay(4000);
move_s(0);
delay(2000);
move_s(-450);
delay(2000);
move_s(-900);
delay(4000);
move_s(0);
delay(2000);
if (i<=4)
{i+=1;}
else
{i=1;}
}
void Servo_Send_Short_Pkt(byte Pkt_Head_H, byte Pkt_Head_L, byte Servo_ID, byte Flag, byte Address, byte Length,byte Count, int Data)
{
byte Pkt_Data[Length];
for (int i=0;i<Length;i++)
{
Pkt_Data[i]=lowByte(Data);
Data=Data>>8;
}
robi.write(Pkt_Head_H);
robi.write(Pkt_Head_L);
robi.write(Servo_ID);
robi.write(Flag);
robi.write(Address);
robi.write(Length);
robi.write(Count);
//robi.write(Data);
CheckSum= Servo_ID ^ Flag ^ Address ^ Length ^ Count;
for (int i=0;i<Length;i++)
{
robi.write(Pkt_Data[i]);
CheckSum=CheckSum^Pkt_Data[i];
}
robi.write(CheckSum);
}
void Torque_on()
{
Servo_Send_Short_Pkt(tx_Head_H,tx_Head_L,on[0],on[1],on[2],on[3],on[4],on[5]);
}
void move_s(int pos)
{
Servo_Send_Short_Pkt(tx_Head_H,tx_Head_L,set[0],set[1],set[2],set[3],set[4],pos);
}
void set_Max_Torque(int pos)
{
Servo_Send_Short_Pkt(tx_Head_H,tx_Head_L, Max_Torque[0], Max_Torque[1],Max_Torque[2],Max_Torque[3],Max_Torque[4],pos);
}
