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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 12264|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

Dynamixel數(shù)字舵機(jī)驅(qū)動(dòng)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:80436 發(fā)表于 2015-5-21 23:17 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
好久沒(méi)更新技術(shù)類日志了,今天更新下,這是一個(gè)韓國(guó)robotics機(jī)器人Dynamixel數(shù)字舵機(jī)的驅(qū)動(dòng),采用C語(yǔ)言編寫(xiě),支持Dynamixel 通信協(xié)議 ,案例是AVR單片。實(shí)際上可以采用FPGA,例如SOPC系統(tǒng)上,可控制小型機(jī)器人。







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







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


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


  }
}






分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:130468 發(fā)表于 2016-7-14 17:13 | 只看該作者
新手求教: 前輩您好,很冒昧給您消息向您求助,希望能請(qǐng)教一點(diǎn)問(wèn)題,在此現(xiàn)向您表示感謝。對(duì)于使用舵機(jī)來(lái)說(shuō),我是一個(gè)新手,現(xiàn)在需要調(diào)試一個(gè)MX-28R舵機(jī),起初使用RoboPlus連接是識(shí)別了舵機(jī)的。然后我想修改舵機(jī)ID號(hào)和波特率,我就根據(jù)pdf文檔在軟件界面操作了,但我發(fā)現(xiàn)設(shè)置了幾次,ID號(hào)和波特率并沒(méi)有改變;然后我就腦殘了一下,想著先關(guān)閉,重新打開(kāi)軟件連接一下,再看ID號(hào)顯示是否改變,悲劇的是重啟軟件,竟然無(wú)法搜索到Dynamixel了,真不知道怎么辦,十分著急。在此冒昧向您咨詢一下,還望您能給予些許指點(diǎn),不勝感激!
回復(fù)

使用道具 舉報(bào)

板凳
ID:149181 發(fā)表于 2017-1-21 23:21 來(lái)自手機(jī) | 只看該作者
FEETECH飛特舵機(jī)總線伺服驅(qū)動(dòng),采用SCS通訊協(xié)議,配有上位機(jī)操作軟件,具備溫度,位置,速度,電壓,電流反饋。寬電壓保護(hù),堵轉(zhuǎn)過(guò)載保護(hù),硬件采用自主研發(fā)的舵機(jī)控制板,進(jìn)口零配件,性能穩(wěn)定,每個(gè)舵機(jī)出廠均一一檢測(cè)。開(kāi)發(fā)機(jī)器人、機(jī)械臂、工業(yè)、物流等可參考試用。
回復(fù)

使用道具 舉報(bào)

地板
ID:162986 發(fā)表于 2017-1-26 21:07 | 只看該作者
怎么可以下載啊
回復(fù)

使用道具 舉報(bào)

5#
ID:300001 發(fā)表于 2018-3-31 17:27 | 只看該作者
是把這段驅(qū)動(dòng)程序放在程序里,就能用arduino控制AX-12A了嗎?
回復(fù)

使用道具 舉報(bào)

6#
ID:300001 發(fā)表于 2018-3-31 17:28 | 只看該作者
火狐free 發(fā)表于 2016-7-14 17:13
新手求教: 前輩您好,很冒昧給您消息向您求助,希望能請(qǐng)教一點(diǎn)問(wèn)題,在此現(xiàn)向您表示感謝。對(duì)于使用舵機(jī)來(lái) ...

robotplus哪里能弄到
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: www.成人在线视频 | 亚洲欧美一区二区三区国产精品 | 国产精品1区2区 | 国产免费播放视频 | 999re5这里只有精品 | 久久青草av | 中文字幕日韩在线 | 中文字幕91av | 亚洲 中文 欧美 日韩 在线观看 | 欧美日韩精品久久久免费观看 | 国产精品夜夜春夜夜爽久久电影 | 欧美激情久久久 | 精品成人在线观看 | 丁香一区二区 | 久久久精品一区二区三区 | 免费h在线| 91精品观看 | 日韩高清成人 | 一级黄色裸片 | 日韩一区和二区 | 日韩成人中文字幕 | 欧美 日韩 在线播放 | 精久久久 | 日本不卡视频在线播放 | 日日夜夜天天综合 | 天天射网站 | 夜夜草天天草 | 欧美久久精品一级黑人c片 91免费在线视频 | 91精品国产高清久久久久久久久 | 小草久久久久久久久爱六 | 久久精品国产99国产精品 | 成年免费在线观看 | 久久亚洲国产 | 免费观看一级毛片 | 亚洲高清一区二区三区 | 一级片免费在线观看 | 精品一二三区在线观看 | 欧美亚洲另类丝袜综合网动图 | 久99久视频| 自拍偷拍第一页 | 国产一区二区三区四区在线观看 |