一、前言
玩过很长一段时间单片机,一直想接触Arduino系列板子,这次如愿以偿。用去年自己3D打印机打的机器人外壳,Arduino UNO R3+舵机控制板,做的一个四足机器人。
二、爬过的坑
不得不承认Arduino确是个好东西,开发速度极快,极易上手。从开始动手到完成,只持续了3天不到,测试。调代码。封装。
整个过程里一开始就感觉会头疼的就是机器人的步态,因为之前也没接触过。实际操作起来比想象中容易的多。现在的机器人支持前进、后退、左转、右转、起立、坐下。五种步态。通过摇杆控制。
废话不多说,贴一下代码。
代码经过粗略的封装,舵机控制板有个库文件需要下载调用,别的都是手打的代码
主要封装了单足控制函数action.参数说明:foot:第N只足,Up:足举起的高度,Dis:足向前转动的角度幅度,walk:取0或1,0代表原地运动,1代表走动。主要是为了区别出起立坐下这两个原地运动。
再把action函数封装进前进、后退、左转、右转四个函数中,参数仅有t,用于设定动作间的延时,以控制整体的运动速度。
void action(int foot,int Up,int Dis,int walk=0){
switch (foot){
case 0 : hor = 0 ; ver = 4 ; verBegin=340;
break ;
case 1 : hor = 1 ; ver = 5 ; Up=-Up;verBegin=400;
Dis=-Dis;
break ;
case 2 : hor = 2 ; ver = 6 ; verBegin=340;
Dis=-Dis;
break ;
case 3 : hor = 3 ; ver = 7 ; Up=-Up;verBegin=400;
break ;
}
pwm.setPWM(ver, 0, verBegin + Up);
pwm.setPWM(hor, 0, SERVOBEGIN_0 + Dis);
delay(150);
if(walk){
pwm.setPWM(ver, 0, verBegin);
}
}
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
// 使用默认I2C地址 0x40
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
//Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x41);
#define SERVOMIN 150 // this is the 'minimum' pulse length count (out of 4096)
#define SERVOMAX 600 // this is the 'maximum' 脉冲宽度 count (out of 4096)
//定义begin状态,即机器人准备爬行状态的舵机初始值,修改初始定义值调节四足平衡,消除机械误差
//注释后为无机械误差的理想值
#define SERVOBEGIN_0 375 //左前横臂 375
#define SERVOBEGIN_1 375 //右前横臂 375
#define SERVOBEGIN_2 375 //右后横臂 375
#define SERVOBEGIN_3 375 //左后横臂 375
#define SERVOBEGIN_4 340 //左前纵臂 340
#define SERVOBEGIN_5 400 //右前纵臂 400
#define SERVOBEGIN_6 340 //右后纵臂 340
#define SERVOBEGIN_7 400 //左后纵臂 400
#define SERVOBEGIN_8 375 //尾巴起点 375
#define UP 60 //纵向幅度
#define Distance 80 //前进幅度
int i =0;
boolean q;
void setup() {
Serial.begin(9600);
//Serial.println("16 channel Servo test!");
pwm.begin();
pwm.setPWMFreq(