机器人
六足蜘蛛机器人有六个腿,每个腿有两个舵机控制,一个负责水平方向的前后运动,一个负责竖直方向的上下运动(抬腿落腿)。如下图所示
驱动板:
该驱动板为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步。
更多的运行要求,可在此基础上自己设计程序。