久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 12246|回復: 5
收起左側

Dynamixel數字舵機驅動

[復制鏈接]
ID:80436 發表于 2015-5-21 23:17 | 顯示全部樓層 |閱讀模式
好久沒更新技術類日志了,今天更新下,這是一個韓國robotics機器人Dynamixel數字舵機的驅動,采用C語言編寫,支持Dynamixel 通信協議 ,案例是AVR單片。實際上可以采用FPGA,例如SOPC系統上,可控制小型機器人。







在這也拆解下CM-5的控制器,是一片atmega128A 哦!哈哈。這PCB做工一般,感覺韓國人是科技領域爆發戶,但我們有什么資格嘲笑棒子呢,至少人家都能造CPU了,我們呢?







#include <avr/io.h>
#include <util/delay.h>
void InitUart0(void)
{  
UCSR0A = 0x02; // 設置為倍速模式
UBRR0H = 0;
UBRR0L = 1;
UCSR0B = (1<<RXEN)|(1<<TXEN);// 接收器與發送器使能
UCSR0C = (3<<UCSZ0);
DDRE &= ~_BV(PE0); // 初始化RX 端口默認方向為輸入
PORTE &= ~_BV(PE0); // 初始化RX 端口默認狀態為高阻
DDRE |= _BV(PE1); // 初始化TX 端口默認方向為輸出
PORTE |= _BV(PE1); // 初始化TX 端口默認狀態為高電平
DDRA |= _BV(PA0); // 初始化使能端口狀態方向為輸出
PORTA &= ~_BV(PA0); // 初始化使能端口狀態為RX 狀態
DDRA |= _BV(PA1); // 初始化使能端口狀態方向為輸出
PORTA |= _BV(PA1); // 初始化使能端口狀態方為TX 狀態
}
void SendUart0Byte(unsigned char data)
{   
while ( !( UCSR0A & (1<<UDRE)) );// 等待發送緩沖器為空
UDR0 = data;/* 將數據放入緩沖器,發送數據*/
}
void SetServoLimit(unsigned char id, unsigned short int cw_limit, unsigned short int ccw_limit)
{
unsigned short int temp_ccw = 0; // 臨時速度,用于進行方向判別
unsigned short int temp_cw = 0;
unsigned char temp_ccw_h = 0; // 待發送數據h 位
unsigned char temp_ccw_l = 0; // 待發送數據l 位
unsigned char temp_cw_h = 0;
unsigned char temp_cw_l = 0;
unsigned char temp_sum = 0; // 校驗和寄存變量


if (ccw_limit > 1023)
{
temp_ccw = 1023; // 限制速度值在可用范圍內
}
else
{
temp_ccw = ccw_limit;
}
if (cw_limit > 1023)
{
temp_cw = 1023;
}
else
{
temp_cw = cw_limit;
}
temp_ccw_h = (unsigned char)(temp_ccw >> 8);
temp_ccw_l = (unsigned char)temp_ccw; // 將16bit 數據拆為2個8bit 數據
temp_cw_h = (unsigned char)(temp_cw >> 8);
temp_cw_l = (unsigned char)temp_cw; // 將16bit 數據拆為2個8bit 數據
PORTA &= ~_BV(PA1);
PORTA |= _BV(PA0); // 使總線處于主機發送狀態
UCSR0A |= (1<<TXC0); // 清除UART0寫完成標志
SendUart0Byte(0xFF); // 發送啟動符號0xFF
SendUart0Byte(0xFF); // 發送啟動符號0xFF
SendUart0Byte(id); // 發送id
SendUart0Byte(7); // 發送數據長度為參數長度+2,參數長度為3
SendUart0Byte(0x03); // 命令數據為“WRITE DATA”
SendUart0Byte(0x06); // 舵機控制寄存器首地址
SendUart0Byte(temp_cw_l); // 發送順時針位置限制低位
SendUart0Byte(temp_cw_h); // 發送順時針位置限制高位
SendUart0Byte(temp_ccw_l); // 發送逆時針位置限制低位
SendUart0Byte(temp_ccw_h); // 發送逆時針位置限制高位
temp_sum = id + 7 + 0x03 + 0x06 + temp_cw_l + temp_cw_h + temp_ccw_l + temp_ccw_h;
temp_sum = ~temp_sum; // 計算校驗和
SendUart0Byte(temp_sum); // 發送校驗和
while ( !( UCSR0A & (1<<TXC0)) ) // 等待發送完成
{ // (Waiting for finishing sending)
;
}
PORTA |= _BV(PA1);
PORTA &= ~_BV(PA0); // 使總線處于主機接收狀態
_delay_ms(2); //送完成后,總線會被從機占用,反饋應答數據,所以進行延時
}
void SetServoPosition(unsigned char id, unsigned short int position, unsigned short int
velocity)
{
unsigned short int temp_velocity = 0; // 臨時速度,用于進行方向判別
unsigned short int temp_position = 0;
unsigned char temp_velocity_h = 0; // 待發送數據h 位
unsigned char temp_velocity_l = 0; // 待發送數據l 位
unsigned char temp_position_h = 0;
unsigned char temp_position_l = 0;
unsigned char temp_sum = 0; // 校驗和寄存變量
if (velocity > 1023)
{
temp_velocity = 1023; // 限制速度值在可用范圍內
}
else
{
temp_velocity = velocity;
}
if (position > 1023)
{
temp_position = 1023;
}
else
{
temp_position = position;
}
temp_velocity_h = (unsigned char)(temp_velocity >> 8);
// 將16bit 數據拆為2個8bit 數據
temp_velocity_l = (unsigned char)temp_velocity;
temp_position_h = (unsigned char)(temp_position >> 8);
// 將16bit 數據拆為2個8bit 數據
temp_position_l = (unsigned char)temp_position;
PORTA &= ~_BV(PA1);
PORTA |= _BV(PA0); // 使總線處于主機發送狀態
UCSR0A |= (1<<TXC0); // 清除UART0寫完成標志
SendUart0Byte(0xFF); // 發送啟動符號0xFF
SendUart0Byte(0xFF);
SendUart0Byte(id); // 發送id
SendUart0Byte(7); // 發送數據長度為參數長度+2,參數長度為3
SendUart0Byte(0x03); // 命令數據為“WRITE DATA”
SendUart0Byte(0x1E); // 舵機控制寄存器首地址
SendUart0Byte(temp_position_l); // 發送速度數據低位
SendUart0Byte(temp_position_h); // 發送速度數據高位
SendUart0Byte(temp_velocity_l); //發送位置低字節
SendUart0Byte(temp_velocity_h); // 發送位置高字節
temp_sum = id + 7 + 0x03 + 0x1E + temp_position_l + temp_position_h + temp_velocity_l +
temp_velocity_h;
temp_sum = ~temp_sum; // 計算校驗和
SendUart0Byte(temp_sum); // 發送校驗和 (Send the checksum)
while ( !( UCSR0A & (1<<TXC0)) ) // 等待發送完成
{ // (Waiting for finishing sending)
;
}
PORTA |= _BV(PA1);
PORTA &= ~_BV(PA0); // 使總線處于主機接收狀態
_delay_ms(2); // 發送完成后,總線會被從機占用,反饋應答數據,所以進行延時
}
void SetServoVelocity(unsigned char id, signed short int velocity)
{
unsigned char temp_sign = 0; // 臨時符號,用于進行方向判別
unsigned short int temp_velocity = 0; // 臨時速度,用于進行方向判別
unsigned char temp_value_h = 0; // 待發送數據h 位
unsigned char temp_value_l = 0; // 待發送數據l 位
unsigned char temp_sum = 0; // 校驗和寄存變量
if (velocity < 0)
{
temp_velocity = -velocity; // 如果為負數,則取絕對值
temp_sign = 1; // 設置負數符號標志
}
else
{
temp_velocity = velocity;
temp_sign = 0; // 設置正數符號標志
}
if (temp_velocity > 1023)
{
temp_velocity = 1023; // 限制速度值在可用范圍內
}
temp_velocity |= (temp_sign << 10);
temp_value_h = (unsigned char)(temp_velocity >> 8);
// 將16bit 數據拆為2個8bit 數據
temp_value_l = (unsigned char)temp_velocity;
PORTA &= ~_BV(PA1);
PORTA |= _BV(PA0); // 使總線處于主機發送狀態
UCSR0A |= (1<<TXC0); // 清除UART0寫完成標志
SendUart0Byte(0xFF); // 發送啟動符號0xFF
SendUart0Byte(0xFF); // 發送啟動符號0xFF
SendUart0Byte(id); // 發送id
SendUart0Byte(5); // 發送數據長度為參數長度+2,參數長度為3
SendUart0Byte(0x03); // 命令數據為“WRITE DATA”
SendUart0Byte(0x20); // 舵機控制寄存器首地址
SendUart0Byte(temp_value_l); // 發送速度數據低位
SendUart0Byte(temp_value_h); // 發送速度數據高位
temp_sum = id + 5 + 0x03 + 0x20 + temp_value_l + temp_value_h;
temp_sum = ~temp_sum; // 計算校驗和
SendUart0Byte(temp_sum); // 發送校驗和
while ( !( UCSR0A & (1<<TXC0)) ) // 等待發送完成
{
;
}
PORTA |= _BV(PA1);
PORTA &= ~_BV(PA0); // 使總線處于主機接收狀態
_delay_ms(2); // 發送完成后,總線會被從機占用,反饋應答數據,所以進行延時
}
int main(void)
{
InitUart0();
SetServoLimit(2,0,1023);
while(1)
  {
_delay_ms(1000); //延時1s
SetServoPosition(2, 1000, 500); //控制舵機以500的速度運動到1000的位置
_delay_ms(1000); //延時1s
SetServoPosition(2, 200, 100); //控制舵機以100的速度運動到200的位置


  }
}






回復

使用道具 舉報

ID:130468 發表于 2016-7-14 17:13 | 顯示全部樓層
新手求教: 前輩您好,很冒昧給您消息向您求助,希望能請教一點問題,在此現向您表示感謝。對于使用舵機來說,我是一個新手,現在需要調試一個MX-28R舵機,起初使用RoboPlus連接是識別了舵機的。然后我想修改舵機ID號和波特率,我就根據pdf文檔在軟件界面操作了,但我發現設置了幾次,ID號和波特率并沒有改變;然后我就腦殘了一下,想著先關閉,重新打開軟件連接一下,再看ID號顯示是否改變,悲劇的是重啟軟件,竟然無法搜索到Dynamixel了,真不知道怎么辦,十分著急。在此冒昧向您咨詢一下,還望您能給予些許指點,不勝感激!
回復

使用道具 舉報

ID:149181 發表于 2017-1-21 23:21 來自手機 | 顯示全部樓層
FEETECH飛特舵機總線伺服驅動,采用SCS通訊協議,配有上位機操作軟件,具備溫度,位置,速度,電壓,電流反饋。寬電壓保護,堵轉過載保護,硬件采用自主研發的舵機控制板,進口零配件,性能穩定,每個舵機出廠均一一檢測。開發機器人、機械臂、工業、物流等可參考試用。
回復

使用道具 舉報

ID:162986 發表于 2017-1-26 21:07 | 顯示全部樓層
怎么可以下載啊
回復

使用道具 舉報

ID:300001 發表于 2018-3-31 17:27 | 顯示全部樓層
是把這段驅動程序放在程序里,就能用arduino控制AX-12A了嗎?
回復

使用道具 舉報

ID:300001 發表于 2018-3-31 17:28 | 顯示全部樓層
火狐free 發表于 2016-7-14 17:13
新手求教: 前輩您好,很冒昧給您消息向您求助,希望能請教一點問題,在此現向您表示感謝。對于使用舵機來 ...

robotplus哪里能弄到
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品一区二区三区91 | 国产 日韩 欧美 中文 在线播放 | 一级片免费网站 | 国产激情一区二区三区 | 一区二区不卡高清 | 久久伊人一区二区 | 天堂综合 | 欧美成人精品欧美一级 | 亚洲视频在线免费观看 | 久草网站 | 亚洲精品久久久 | 亚洲国产成人精品一区二区 | 五十女人一级毛片 | 伊人二区 | 成人国产在线视频 | 中文字幕一区二区三区精彩视频 | 青青草原综合久久大伊人精品 | 国产精品久久久久久久久久久免费看 | 国产精品久久久久久久久免费高清 | 国产一区二区 | jlzzjlzz欧美大全 | 一区二区中文字幕 | 亚洲国产精品成人综合久久久 | 亚洲免费在线观看视频 | 欧美中文字幕在线观看 | 亚洲成人免费观看 | 国产日韩欧美综合 | 欧美久操网 | 久久激情视频 | 日本国产精品视频 | 国产精品免费av | 日韩成人av在线 | 中文字幕丁香5月 | 日韩欧美一二三区 | 久久久久久久久久久丰满 | 99精品国产一区二区三区 | 日韩欧美网 | 国产一区二区三区日韩 | 91天堂网 | 超碰成人免费观看 | 亚洲成人精品在线 |