1. 功能說明
本文示例將實(shí)現(xiàn)R328a樣機(jī)4自由度并聯(lián)機(jī)器狗行走的功能。
2. 電子硬件
在這個示例中,我們采用了以下硬件,請大家參考:
主控板 | Basra主控板(兼容Arduino Uno)? |
擴(kuò)展板 | Bigfish2.1擴(kuò)展板? |
電池 | 7.4V鋰電池 |
電路連接:機(jī)器狗左側(cè)的上下舵機(jī)連接在Bigfish擴(kuò)展板的D3、D8端口;機(jī)器狗右側(cè)的上下舵機(jī)連接在Bigfish擴(kuò)展板的D4、D7端口。
3. 功能實(shí)現(xiàn)
上位機(jī):Controller 1.0
下位機(jī)編程環(huán)境:Arduino 1.8.19
實(shí)現(xiàn)思路:實(shí)現(xiàn)機(jī)器狗可以靈活的自由行走。
3.1 調(diào)試舵機(jī)角度
對于如何利用Controller軟件進(jìn)行調(diào)試機(jī)器狗的舵機(jī)角度,可參考【U002】如何驅(qū)動模擬舵機(jī)-Controller 1.0b軟件的使用【https://www.robotway.com/h-col-129.html】
在本次實(shí)驗(yàn)中,經(jīng)過調(diào)試,對于4自由度并聯(lián)機(jī)器狗行走時的舵機(jī)角度值如下圖所示:
機(jī)器狗行走時的舵機(jī)值
3.2 示例程序
下面提供一個4自由度并聯(lián)機(jī)器狗行走的參考例程(Dog_walk_finall.ino),程序源代碼等資料詳見 https://www.robotway.com/h-col-237.html ,實(shí)驗(yàn)效果可參考演示視頻。
/*------------------------------------------------------------------------------------ 版權(quán)說明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved. Distributed under MIT license.See file LICENSE for detail or copy at https://opensource.org/licenses/MIT by 機(jī)器譜 2023-05-26 https://www.robotway.com/ ------------------------------*/ /* 本例程實(shí)現(xiàn)機(jī)器小狗行走 調(diào)試小狗行走的注意事項(xiàng): 3、8對應(yīng)著小狗左側(cè)的上下舵機(jī); 4、7對應(yīng)著小狗右側(cè)的上下舵機(jī); 連接好舵機(jī)后,將調(diào)試好的小狗初始直立狀態(tài)寫入float value_init[4] = { };中即可; */ #include?Servo.h??> #define SERVO_SPEED 20 //定義舵機(jī)轉(zhuǎn)動快慢的時間 #define ACTION_DELAY 0 //定義所有舵機(jī)每個狀態(tài)時間間隔 Servo myServo[4]; int f = 15;//定義舵機(jī)每個狀態(tài)間轉(zhuǎn)動的次數(shù),以此來確定每個舵機(jī)每次轉(zhuǎn)動的角度 int servo_port[4] = {3,4,7,8};//定義舵機(jī)引腳 int servo_num = sizeof(servo_port) / sizeof(servo_port[0]);//定義舵機(jī)數(shù)量 float value_init[4] = {1478,1500,1545,1478};//定義舵機(jī)初始角度 int leg_range = 180; //小狗左右兩條腿擺動的幅度 float reset_init[4]={0,0,0,0}; void setup() { Serial.begin(9600); for(int i=0;i?servo_num;i++) ServoGo(i,value_init[i]); for(int i=0;i?servo_num;i++){ reset_init[i] = value_init[i]; } delay(2000); } void loop() { Dog_walk(); } void Dog_walk() { servo_move(value_init[0],value_init[1],reset_init[2]+leg_range,reset_init[3]); servo_move(value_init[0],value_init[1],reset_init[2],reset_init[3]-leg_range); } void ServoStart(int which) { if(!myServo[which].attached())myServo[which].attach(servo_port[which]); pinMode(servo_port[which], OUTPUT); } void ServoStop(int which) { myServo[which].detach(); digitalWrite(servo_port[which],LOW); } void ServoGo(int which , int where) { if(where!=200) { if(where==201) ServoStop(which); else { ServoStart(which); myServo[which].write(where); } } } void servo_move(float value0, float value1, float value2, float value3) //舵機(jī)轉(zhuǎn)動 { float value_arguments[] = {value0, value1, value2, value3}; float value_delta[servo_num]; for(int i=0;i?servo_num;i++) { value_delta[i] = (value_arguments[i] - value_init[i]) / f; } for(int i=0;i?f;i++) { for(int k=0;k?servo_num;k++) { value_init[k] = value_delta[k] == 0 ? value_arguments[k] : value_init[k] + value_delta[k]; } for(int j=0;j?servo_num;j++) { ServoGo(j,value_init[j]); } delay(SERVO_SPEED); } delay(ACTION_DELAY); } 審核編輯 黃宇
-
機(jī)器狗
+關(guān)注
關(guān)注
3文章
173瀏覽量
10194
發(fā)布評論請先 登錄
相關(guān)推薦
評論