这是一个很简单的四足兼四轮机器人,机器人的身体由一个方形的塑料瓶构成,四足使用四个sg90舵机,既可以使用180舵机做腿,也可以使用和360舵机做轮子,如果希望他能有个可以摇头晃脑,还需要一个二维的舵机支架,基础配置四个舵机,带头需要两个额外的180舵机,主控是一块arduino的芯片。如果主板或者电池不行,可以使用舵机控制板把主控和舵机分开供电。
如下:即可以使用360度轮子,也可以使用180度舵臂,有电池成本4个sg90舵机和一块arduino控制板。
大部分的机器人都需要驱动大量的舵机驱动,对主板和电池要求比较高,我经常遇到由于电量波动导致的主板不稳定问题,最简单最便宜的方案是主控和舵机两路供电。有钱的可以购买更好的电源,不过也要对硬件比较精通的人才好,否则可能高价买的也并不怎么好用,全缴了智商税。对于研究来说,两路是个经济又快捷的方式。我这里使用子舵机板两路供电。
代码如下:
#include <SoftwareSerial.h>
#include <Servo.h>
SoftwareSerial ESP01(14, 15); //A0,A1,rx,tx
// Define the servos
Servo LF; //左前腿
Servo RF; //右前腿
Servo LB; //左后腿
Servo RB; //右后腿
Servo NECK; //脖子
Servo HEAD; //头
// Define the ultrasonic sensor pins
const int LF_PIN = 2;
const int RF_PIN = 3;
const int LB_PIN = 4;
const int RB_PIN = 5;
const int NECK_PIN = 6;
const int HEAD_PIN = 7;
char dataIn = 0;
int motor_speed = 100; //250;
//mode 0:dog, 1:wheel
int mode = 1;
void setup() {
Serial.begin(9600);
//ESP01.begin(115200);
ESP01.begin(9600);
initPin();
delay(5000);
while (ESP01.available()) {
ESP01.read();
Serial.println("ESP01 read---------");
stop();
}
}
void initPin() {
LF.attach(LF_PIN);
RF.attach(RF_PIN);
LB.attach(LB_PIN);
RB.attach(RB_PIN);
NECK.attach(NECK_PIN);
HEAD.attach(HEAD_PIN);
}
void deinitPin() {
LF.detach();
RF.detach();
LB.detach();
RB.detach();
NECK.detach();
HEAD.detach();
}
void Home() {
LF.write(90);
RF.write(90);
LB.write(90);
RB.write(90);
NECK.write(90);
HEAD.write(90);
delay(100);
}
void forward() {
Home();
LF.write(90);
RF.write(120);
LB.write(60);
RB.write(90);
NECK.write(90);
HEAD.write(60);
delay(100);
LF.write(120);
RF.write(120);
LB.write(60);
RB.write(60);
NECK.write(90);
HEAD.write(120);
delay(100);
LF.write(120);
RF.write(90);
LB.write(90);
RB.write(60);
NECK.write(90);
HEAD.write(60);
delay(100);
Home();
LF.write(60);
RF.write(90);
LB.write(90);
RB.write(120);
NECK.write(90);
HEAD.write(120);
delay(100);
LF.write(60);
RF.write(60);
LB.write(120);
RB.write(120);
NECK.write(90);
HEAD.write(60);
delay(100);
LF.write(90);
RF.write(60);
LB.write(120);
RB.write(90);
NECK.write(90);
HEAD.write(120);
delay(100);
Home();
}
void backward() {
Home();
LF.write(90);
RF.write(60);
LB.write(120);
RB.write(90);
NECK.write(90);
HEAD.write(120);
delay(100);
LF.write(60);
RF.write(60);
LB.write(120);
RB.write(120);
NECK.write(90);
HEAD.write(60);
delay(100);
LF.write(60);
RF.write(90);
LB.write(90);
RB.write(120);
NECK.write(90);
HEAD.write(120);
delay(100);
Home();
LF.write(120);
RF.write(90);
LB.write(90);
RB.write(60);
NECK.write(90);
HEAD.write(60);
delay(100);
LF.write(120);
RF.write(120);
LB.write(60);
RB.write(60);
NECK.write(90);
HEAD.write(120);
delay(100);
LF.write(90);
RF.write(120);
LB.write(60);
RB.write(90);
NECK.write(90);
HEAD.write(60);
delay(100);
Home();
}
void left() {
Home();
LF.write(120);
RF.write(90);
LB.write(90);
RB.write(120);
NECK.write(60);
HEAD.write(90);
delay(100);
LF.write(120);
RF.write(60);
LB.write(60);
RB.write(120);
NECK.write(120);
HEAD.write(90);
delay(100);
LF.write(90);
RF.write(60);
LB.write(60);
RB.write(90);
NECK.write(60);
HEAD.write(90);
delay(100);
Home();
}
void right() {
Home();
LF.write(90);
RF.write(60);
LB.write(60);
RB.write(90);
NECK.write(120);
HEAD.write(90);
delay(100);
LF.write(120);
RF.write(60);
LB.write(60);
RB.write(120);
NECK.write(60);
HEAD.write(90);
delay(100);
LF.write(120);
RF.write(90);
LB.write(90);
RB.write(120);
NECK.write(120);
HEAD.write(90);
delay(100);
Home();
}
void hand() {
Home();
RF.write(180);
delay(100);
RF.write(150);
delay(100);
RF.write(180);
delay(100);
RF.write(150);
delay(100);
RF.write(180);
delay(100);
RF.write(150);
delay(100);
Home();
}
void shake() {
Home();
LF.write(60);
RF.write(120);
LB.write(60);
RB.write(120);
NECK.write(60);
HEAD.write(60);
delay(100);
Home();
delay(100);
LF.write(120);
RF.write(60);
LB.write(120);
RB.write(60);
NECK.write(120);
HEAD.write(120);
delay(100);
Home();
delay(100);
}
void head() {
Home();
HEAD.write(60);
delay(100);
HEAD.write(120);
delay(100);
HEAD.write(60);
delay(100);
HEAD.write(120);
delay(100);
HEAD.write(60);
delay(100);
HEAD.write(120);
delay(100);
Home();
}
void neck() {
Home();
NECK.write(60);
delay(100);
NECK.write(120);
delay(100);
NECK.write(60);
delay(100);
NECK.write(120);
delay(100);
NECK.write(60);
delay(100);
NECK.write(120);
delay(100);
Home();
}
void stand() {
Home();
}
void sit() {
//Home();
LF.write(90);
RF.write(90);
LB.write(0);
RB.write(180);
NECK.write(120);
delay(100);
}
void sleep() {
//Home();
LF.write(0);
RF.write(180);
LB.write(0);
RB.write(180);
NECK.write(120);
HEAD.write(60);
delay(100);
}
void paxia() {
//Home();
LF.write(0);
RF.write(180);
LB.write(90);
RB.write(90);
NECK.write(120);
HEAD.write(60);
delay(100);
}
void angry() {
Home();
LF.write(0);
RF.write(180);
NECK.write(120);
HEAD.write(60);
delay(100);
}
void stop() {
Home();
}
//car
void car_forward() {
LF.write(60);
RF.write(120);
LB.write(60);
RB.write(120);
NECK.write(90);
HEAD.write(90);
delay(100);
}
void car_backward() {
LF.write(120);
RF.write(60);
LB.write(120);
RB.write(60);
NECK.write(90);
HEAD.write(90);
delay(100);
}
void car_sforward() {
LF.write(0);
RF.write(180);
LB.write(0);
RB.write(180);
NECK.write(90);
HEAD.write(90);
delay(100);
}
void car_sbackward() {
LF.write(180);
RF.write(0);
LB.write(180);
RB.write(0);
NECK.write(90);
HEAD.write(90);
delay(100);
}
void car_left() {
LF.write(60);
RF.write(60);
LB.write(60);
RB.write(60);
NECK.write(90);
HEAD.write(90);
delay(100);
}
void car_right() {
LF.write(120);
RF.write(120);
LB.write(120);
RB.write(120);
NECK.write(90);
HEAD.write(90);
delay(100);
}
void car_stop() {
Home();
}
void loop() {
if (ESP01.available() > 0)
//if (Serial.available() > 0)
{
dataIn = (char)ESP01.read();
//dataIn = (char)Serial.read();
Serial.println("ESP01 read---------dataIn;");
Serial.println(dataIn);
}
switch (dataIn) {
case '1':
if (mode == 0) {
forward();
} else {
car_forward();
}
break;
case '2':
if (mode == 0) {
backward();
} else {
car_backward();
}
break;
case '3':
if (mode == 0) {
left();
} else {
car_left();
}
break;
case '4':
if (mode == 0) {
right();
} else {
car_right();
}
break;
case '5':
if (mode == 0) {
hand();
} else {
car_sforward();
}
break;
case '6':
if (mode == 0) {
shake();
} else {
car_sbackward();
}
break;
case '7':
head();
break;
case '8':
neck();
break;
case '9':
//neck();
angry();
break;
case 'a':
stand();
break;
case 'b':
sit();
break;
case 'c':
sleep();
break;
case 'd':
paxia();
break;
case 'e':
mode = 0;
break;
case 'f':
mode = 1;
break;
case '0':
stop();
break;
defalt:
stop();
break;
}
}
使用蓝牙控制。
演示:
可以看我的B站:
【arduino做的小车小狗,180舵机可以做小狗,360可以做小车-哔哩哔哩】 https://b23.tv/YS4zkNW