1. 功能說明
本文示例將實現R328a樣機4自由度并聯機器狗行走的功能。
在這個示例中,我們采用了以下硬件,請大家參考:
主控板 | Basra主控板(兼容Arduino Uno)? |
擴展板 | Bigfish2.1擴展板? |
電池 | 7.4V鋰電池 |
電路連接:機器狗左側的上下舵機連接在Bigfish擴展板的D3、D8端口;機器狗右側的上下舵機連接在Bigfish擴展板的D4、D7端口。
3. 功能實現
上位機:Controller 1.0
下位機編程環境:Arduino 1.8.19
實現思路:實現機器狗可以靈活的自由行走。
3.1 調試舵機角度
對于如何利用Controller軟件進行調試機器狗的舵機角度,可參考【U002】如何驅動模擬舵機-Controller 1.0b軟件的使用【https://www.robotway.com/h-col-129.html】
在本次實驗中,經過調試,對于4自由度并聯機器狗行走時的舵機角度值如下圖所示:
機器狗行走時的舵機值
3.2 示例程序
下面提供一個4自由度并聯機器狗行走的參考例程(Dog_walk_finall.ino),程序源代碼等資料詳見 https://www.robotway.com/h-col-237.html ,實驗效果可參考演示視頻。
/*------------------------------------------------------------------------------------ 版權說明: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 機器譜 2023-05-26 https://www.robotway.com/ ------------------------------*/ /* 本例程實現機器小狗行走 調試小狗行走的注意事項: 3、8對應著小狗左側的上下舵機; 4、7對應著小狗右側的上下舵機; 連接好舵機后,將調試好的小狗初始直立狀態寫入float value_init[4] = { };中即可; */ #include?Servo.h??> #define SERVO_SPEED 20 //定義舵機轉動快慢的時間 #define ACTION_DELAY 0 //定義所有舵機每個狀態時間間隔 Servo myServo[4]; int f = 15;//定義舵機每個狀態間轉動的次數,以此來確定每個舵機每次轉動的角度 int servo_port[4] = {3,4,7,8};//定義舵機引腳 int servo_num = sizeof(servo_port) / sizeof(servo_port[0]);//定義舵機數量 float value_init[4] = {1478,1500,1545,1478};//定義舵機初始角度 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) //舵機轉動 { 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); } 審核編輯 黃宇
-
機器狗
+關注
關注
3文章
167瀏覽量
9909
發布評論請先 登錄
相關推薦
評論