• 六足蜘蛛机器人行走控制


    机器人

    六足蜘蛛机器人有六个腿,每个腿有两个舵机控制,一个负责水平方向的前后运动,一个负责竖直方向的上下运动(抬腿落腿)。如下图所示

                 

      

    驱动板:

    该驱动板为TOROBOT公司产品,编程时与电脑串口连接,靠串口命令驱动舵机工作。见下图及其详细说明书。本机器人有12个舵机,需要占用驱动板的12个S口。

     

     //TOROBOT 驱动板驱动六足蜘蛛机器人

      1 //脉冲宽度1166对应60度,右边向上/向后,左边向下/向前
      2 
      3 //脉冲宽度1500对应90度,舵机的初始位置
      4 
      5 //脉冲宽度1833对应120度,右边向下/向前,左边向上/向后
      6 
      7  
      8 
      9 int i,j,k;
     10 
     11 int pos1=1166;  //对应60度
     12 
     13 int pos2=1277;  //对应70度
     14 
     15 int pos3=1388;  //对应80度
     16 
     17 int pos4=1500;  //对应90度
     18 
     19 int pos5=1611;  //对应100度
     20 
     21 int pos6=1722;  //对应110度
     22 
     23 int pos7=1833;  //对应120度
     24 
     25  
     26 
     27 void setup()
     28 
     29 {
     30 
     31   Serial.begin(9600);
     32 
     33   init_robot();    //机器人状态初始化
     34 
     35 }
     36 
     37  
     38 
     39 //腿ABC分别对应右前右后左中,上下电机分别接S1,S2,S3,前后电机分别接S4,S5,S6
     40 
     41 //腿DEF分别对应左前左后右中,上下电机分别接S7,S8,S9,前后电机分别接S10,S11,S12
     42 
     43  
     44 
     45 void ABC_up()     //ABC脚抬起
     46 
     47 {
     48 
     49     Serial.print("#1P1500#2P1500#3P1500T1000
    "); 
     50 
     51     // S1号S2号S3号舵机分别旋转到角度为90度的位置,使用时间1000ms
     52 
     53     delay(1000);  // 延时1000ms,舵机刚好执行完上一条命令
     54 
     55 }
     56 
     57  
     58 
     59 void ABC_down()    //ABC脚落下
     60 
     61 {
     62 
     63     Serial.print("#1P1833#2P1833#3P1166T1000
    "); 
     64 
     65     // S1号S2号S3号舵机分别旋转到角度为120度,120度,60度的位置,使用时间1000ms
     66 
     67     delay(1000);  // 延时1000ms,舵机刚好执行完上一条命令
     68 
     69 }
     70 
     71  
     72 
     73 void ABC_forward()   //AB,C脚往前转到120度和30度
     74 
     75 {
     76 
     77     Serial.print("#4P1833#5P1833#6P1166T1000
    "); 
     78 
     79     // S4号S5号S6号舵机分别旋转到角度分为120,120,60度的位置,使用时间1000ms
     80 
     81     delay(1000);  // 延时1000ms,舵机刚好执行完上一条命令
     82 
     83 }
     84 
     85  
     86 
     87 void ABC_turn_left()   //AB,C脚往前转小角度100度和60度,往右拐,AB旋转角度变小,C不变
     88 
     89 {
     90 
     91     Serial.print("#4P1611#5P1611#6P1166T1000
    "); 
     92 
     93     // S4号S5号S6号舵机分别旋转到角度分为110,110,60度的位置,使用时间1000ms
     94 
     95     delay(1000);  // 延时1000ms,舵机刚好执行完上一条命令
     96 
     97 }
     98 
     99  
    100 
    101  void ABC_turn_right()   //AB,C脚往前转小角度120度和80度,往左拐,AB不变,C旋转角度变小
    102 
    103 {
    104 
    105     Serial.print("#4P1833#5P1833#6P1388T1000
    "); 
    106 
    107     // S4号S5号S6号舵机分别旋转到角度分为120,120,70度的位置,使用时间1000ms
    108 
    109     delay(1000);  // 延时1000ms,舵机刚好执行完上一条命令
    110 
    111 }
    112 
    113  
    114 
    115 void ABC_backward()  //ABC脚往后转
    116 
    117 {
    118 
    119     Serial.print("#4P1500#5P1500#6P1500T1000
    "); 
    120 
    121     // S4号S5号S6号舵机分别旋转到角度分别为90,90,90度的位置,使用时间1000ms
    122 
    123     delay(1000);  // 延时1000ms,舵机刚好执行完上一条命令
    124 
    125 }
    126 
    127  
    128 
    129 void DEF_up()    //DEF脚抬起
    130 
    131 {
    132 
    133     Serial.print("#7P1500#8P1500#9P1500T1000
    "); 
    134 
    135     // S7号S8号S9号舵机分别旋转到角度分别为90,90,90度的位置,使用时间1000ms
    136 
    137     delay(1000);  // 延时1000ms,舵机刚好执行完上一条命令
    138 
    139 }
    140 
    141  
    142 
    143 void DEF_down()    //DEF脚落下
    144 
    145 {
    146 
    147     Serial.print("#7P1166#8P1166#9P1833T1000
    "); 
    148 
    149     // S7号S8号S9号舵机分别旋转到角度分别为60,60,120度的位置,使用时间1000ms
    150 
    151     delay(1000);  // 延时1000ms,舵机刚好执行完上一条命令
    152 
    153 }
    154 
    155  
    156 
    157 void DEF_forward()     //DE,F脚往前转到60度和120度
    158 
    159 {
    160 
    161     Serial.print("#10P1166#11P1166#12P1833T1000
    "); 
    162 
    163     // S10号S11号S12号舵机分别旋转到脉宽为60,60,120度的位置,使用时间1000ms
    164 
    165     delay(1000);  // 延时1000ms,舵机刚好执行完上一条命令
    166 
    167 }
    168 
    169  
    170 
    171 void DEF_turn_left()     //DE,F脚往前转到60度和100度,DE旋转角度不变,F旋转角度变小
    172 
    173 {
    174 
    175     Serial.print("#10P1166#11P1166#12P1611T1000
    "); 
    176 
    177     // S10号S11号S12号舵机分别旋转到脉宽为60,60,110度的位置,使用时间1000ms
    178 
    179     delay(1000);  // 延时1000ms,舵机刚好执行完上一条命令
    180 
    181 }
    182 
    183  
    184 
    185 void DEF_turn_right()     //DE,F脚往前转到70度和120度,DE旋转角度变小,F旋转角度不变
    186 
    187 {
    188 
    189     Serial.print("#10P1388#11P1388#12P1833T1000
    "); 
    190 
    191     // S10号S11号S12号舵机分别旋转到脉宽为80,80,120度的位置,使用时间1000ms
    192 
    193     delay(1000);  // 延时1000ms,舵机刚好执行完上一条命令
    194 
    195 }
    196 
    197  
    198 
    199  
    200 
    201 void DEF_backward()     //DEF脚往后转
    202 
    203 {
    204 
    205     Serial.print("#10P1500#11P1500#12P1500T1000
    "); 
    206 
    207     // S10号S11号S12号舵机分别旋转到角度分别为90,90,90度的的位置,使用时间1000ms
    208 
    209     delay(1000);  // 延时1000ms,舵机刚好执行完上一条命令
    210 
    211 }
    212 
    213  
    214 
    215 void forward_one_step_by_ABC()  //前进1步,用ABC
    216 
    217 {
    218 
    219   ABC_up();      //右抬腿
    220 
    221   delay(1000);
    222 
    223  
    224 
    225   ABC_forward();  //右前进
    226 
    227   delay(1000);
    228 
    229  
    230 
    231   ABC_down();    //右落腿
    232 
    233   delay(1000);
    234 
    235  
    236 
    237   DEF_up();       //左抬腿
    238 
    239   delay(1000);
    240 
    241  
    242 
    243   ABC_backward();  //右后退
    244 
    245   delay(1000);
    246 
    247  
    248 
    249   DEF_down();       //左落腿
    250 
    251   delay(1000);
    252 
    253 }
    254 
    255  
    256 
    257 void forward_one_step_by_DEF()  //前进1步,用DEF
    258 
    259 {
    260 
    261   DEF_up();      //左抬腿
    262 
    263   delay(1000);
    264 
    265  
    266 
    267   DEF_forward();  //左前进
    268 
    269   delay(1000);
    270 
    271  
    272 
    273   DEF_down();    //左落腿
    274 
    275   delay(1000);
    276 
    277  
    278 
    279   ABC_up();       //右抬腿
    280 
    281   delay(1000);
    282 
    283  
    284 
    285   DEF_backward();  //左后退
    286 
    287   delay(1000);
    288 
    289  
    290 
    291   ABC_down();     //右落腿
    292 
    293   delay(1000);
    294 
    295 }
    296 
    297  
    298 
    299 void init_robot()  //不能用init命名函数
    300 
    301 {
    302 
    303   Serial.print("#1P1833#2P1833#3P1166T1000
    ");   //ABC腿放下
    304 
    305   delay(1000);  // 延时1000ms,舵机刚好执行完上一条命令
    306 
    307   Serial.print("#7P1166#8P1166#9P1833T1000
    ");   //DEF腿放下
    308 
    309   delay(1000);  // 延时1000ms,舵机刚好执行完上一条命令
    310 
    311  
    312 
    313    Serial.print("#1P1500#2P1500#3P1500T1000
    ");  //ABC腿抬起
    314 
    315    delay(1000);  // 延时1000ms,舵机刚好执行完上一条命令
    316 
    317   Serial.print("#4P1500#5P1500#61500T1000
    ");  //ABC腿转到中间位置
    318 
    319   delay(1000);  // 延时1000ms,舵机刚好执行完上一条命令
    320 
    321   Serial.print("#1P1833#2P1833#3P1166T1000
    ");   //ABC腿放下
    322 
    323   delay(1000);  // 延时1000ms,舵机刚好执行完上一条命令
    324 
    325  
    326 
    327   Serial.print("#7P1500#8P1500#9P1500T1000
    ");  //DEF腿抬起
    328 
    329   delay(1000);  // 延时1000ms,舵机刚好执行完上一条命令
    330 
    331   Serial.print("#10P1500#11P1500#12P1500T1000
    ");  //DEF腿转到中间位置
    332 
    333   delay(1000);  // 延时1000ms,舵机刚好执行完上一条命令
    334 
    335    Serial.print("#7P1166#8P1166#9P1833T1000
    ");   //DEF腿放下
    336 
    337   delay(1000);  // 延时1000ms,舵机刚好执行完上一条命令
    338 
    339 }
    340 
    341  
    342 
    343 void turn_left_one_step_by_ABC()  //左转1步,用ABC
    344 
    345 {
    346 
    347   ABC_up();      //右抬腿
    348 
    349   delay(1000);
    350 
    351  
    352 
    353   ABC_turn_left();  //左拐
    354 
    355   delay(1000);
    356 
    357  
    358 
    359   ABC_down();    //右落腿
    360 
    361   delay(1000);
    362 
    363  
    364 
    365   DEF_up();       //左抬腿
    366 
    367   delay(1000);
    368 
    369  
    370 
    371   ABC_backward();  //右后退
    372 
    373   delay(1000);
    374 
    375  
    376 
    377   DEF_down();       //左落腿
    378 
    379   delay(1000);
    380 
    381 }
    382 
    383  
    384 
    385 void turn_left_one_step_by_DEF()  //左转1步,用DEF
    386 
    387 {
    388 
    389   DEF_up();      //左抬腿
    390 
    391   delay(1000);
    392 
    393  
    394 
    395   DEF_turn_left();  //左拐
    396 
    397   delay(1000);
    398 
    399  
    400 
    401   DEF_down();    //左落腿
    402 
    403   delay(1000);
    404 
    405  
    406 
    407   ABC_up();       //右抬腿
    408 
    409   delay(1000);
    410 
    411  
    412 
    413   DEF_backward();  //左后退
    414 
    415   delay(1000);
    416 
    417  
    418 
    419   ABC_down();     //右落腿
    420 
    421   delay(1000);
    422 
    423 }
    424 
    425  
    426 
    427 void turn_right_one_step_by_ABC()  //右转1步,用ABC
    428 
    429 {
    430 
    431   ABC_up();      //右抬腿
    432 
    433   delay(1000);
    434 
    435  
    436 
    437   ABC_turn_right();  //右拐
    438 
    439   delay(1000);
    440 
    441  
    442 
    443   ABC_down();    //右落腿
    444 
    445   delay(1000);
    446 
    447  
    448 
    449   DEF_up();       //左抬腿
    450 
    451   delay(1000);
    452 
    453  
    454 
    455   ABC_backward();  //右后退
    456 
    457   delay(1000);
    458 
    459  
    460 
    461   DEF_down();       //左落腿
    462 
    463   delay(1000);
    464 
    465 }
    466 
    467  
    468 
    469 void turn_right_one_step_by_DEF()  //右转1步,用DEF
    470 
    471 {
    472 
    473   DEF_up();      //左抬腿
    474 
    475   delay(1000);
    476 
    477  
    478 
    479   DEF_turn_right();  //右拐
    480 
    481   delay(1000);
    482 
    483  
    484 
    485   DEF_down();    //左落腿
    486 
    487   delay(1000);
    488 
    489  
    490 
    491   ABC_up();       //右抬腿
    492 
    493   delay(1000);
    494 
    495  
    496 
    497   DEF_backward();  //左后退
    498 
    499   delay(1000);
    500 
    501  
    502 
    503   ABC_down();     //右落腿
    504 
    505   delay(1000);
    506 
    507 }
    508 
    509  
    510 
    511  
    512 
    513 void loop()
    514 
    515 {
    516 
    517   for(i=0;i<5;i++)  //前行5步
    518 
    519   {
    520 
    521     forward_one_step_by_ABC();
    522 
    523     delay(1000);
    524 
    525     forward_one_step_by_DEF();
    526 
    527     delay(1000);
    528 
    529    }
    530 
    531  
    532 
    533   for(j=0;j<5;j++)  //左转5步
    534 
    535   {
    536 
    537     turn_left_one_step_by_ABC();
    538 
    539     delay(1000);
    540 
    541     turn_left_one_step_by_DEF();
    542 
    543     delay(1000);
    544 
    545   }
    546 
    547  
    548 
    549   for(k=0;k<5;k++)  //右转5步
    550 
    551   {
    552 
    553     turn_right_one_step_by_ABC();
    554 
    555     delay(1000);
    556 
    557     turn_right_one_step_by_DEF();
    558 
    559     delay(1000);
    560 
    561    }
    562 
    563  
    564 
    565   while(1)  完成规定工作后机器人停止不动
    566 
    567   {
    568 
    569  
    570    }
    571 
    572  
    573 
    574 }

    运行效果:机器人前进5步,然后左转5步,然后右转5步。

    更多的运行要求,可在此基础上自己设计程序。

  • 相关阅读:
    $P5240 Derivation$
    $P2504 [HAOI2006]聪明的猴子$
    $P1194 买礼物$
    $P2690 接苹果$
    $CF1141C Polycarp Restores Permutation$
    $CF1141B Maximal Continuous Rest$
    $CF1141A Game 23$
    $P1215 [USACO1.4]母亲的牛奶 Mother's Milk$
    $luogu2375[NOI2014]$
    poj 1419 (最大独立集)
  • 原文地址:https://www.cnblogs.com/MyAutomation/p/9536581.html
Copyright © 2020-2023  润新知