※因改造引起的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); }
留言列表