您的位置:首页 > 产品设计 > UI/UE

智能小车制作过程全纪录: 二、软件平台--- Arduino底盘驱动

2016-09-28 15:09 555 查看

主控板主要提供智能数据分析,根据分析的结果通过串口发送控制命令给小车驱动板,小车驱动板根据控制命令控制小车的动作,主控板采用Java平台,集成相关领域的开源解决方案,软件系统主要包括如下:



底盘驱动:根据控制命令控制4个电机的控制

听觉系统:采用Sphinx4开源语音识别框架,识别语音数据

视觉系统:采用JavaCV图像识别来分析小车所看到的内容,做到目标跟踪

语音合成系统:采用FreeTTS语音合成技术,合成语音数据,

舵机控制系统:通过采集的视觉和语音数据,控制舵机,一开始只是控制摄像头的左右上下活动

传感器系统:系统安装温度、湿度、光感、人体感知等传感器,主控器根据传感器数据做出相应的动作

1.底盘驱动

底盘采用Arduino+电机驱动板,代码比较简单,从串口接收命令,控制四个马达驱动,Arduino代码如下:

#include <AFMotor.h>

#include <Servo.h>

AF_DCMotor Rback_motor(1);
AF_DCMotor Rfront_motor(2);
AF_DCMotor Lback_motor(4);
AF_DCMotor Lfront_motor(3);

int maxSpeed = 255;/////////最大速度
int delay180=2350;//////////选择180度所需要的时间(ms)
char getstr;////////////串口数据

Servo myservo1;/////////舵机
int trig = 13;
int echo = 9;
long IntervalTime = 0;
int pos = 0;
int control=0;/////0:人工控制;1:自动控制

void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Rback_motor.setSpeed(0);

Rback_motor.run(RELEASE);

Rfront_motor.setSpeed(0);

Rfront_motor.run(RELEASE);

Lback_motor.setSpeed(0);

Lback_motor.run(RELEASE);

Lfront_motor.setSpeed(0);

Lfront_motor.run(RELEASE);

//////////// 舵机控制初始化
myservo1.attach(10);
myservo1.write(90);
delay(2000);

////////////超声波测距
pinMode(echo, INPUT);
pinMode(trig, OUTPUT);
}

void loop() {
// put your main code here, to run repeatedly:
getstr = Serial.read();
driver();
if(control==1){
ultrasonicCar();
}
//Serial.println("we are link");

//delay(3000);
}

void forward() {

Rback_motor.run(BACKWARD);
Rfront_motor.run(BACKWARD);
Lback_motor.run(BACKWARD);
Lfront_motor.run(BACKWARD);

Rback_motor.setSpeed(maxSpeed);
Rfront_motor.setSpeed(maxSpeed);
Lback_motor.setSpeed(maxSpeed);
Lfront_motor.setSpeed(maxSpeed);
}

void backward() {

Rback_motor.run(FORWARD);
Rfront_motor.run(FORWARD);
Lback_motor.run(FORWARD);
Lfront_motor.run(FORWARD);

Rback_motor.setSpeed(maxSpeed);
Rfront_motor.setSpeed(maxSpeed);
Lback_motor.setSpeed(maxSpeed);
Lfront_motor.setSpeed(maxSpeed);

}

void stopcar() {
Rback_motor.setSpeed(0);
Rfront_motor.setSpeed(0);
Lback_motor.setSpeed(0);
Lfront_motor.setSpeed(0);
Rback_motor.run(RELEASE);
Rfront_motor.run(RELEASE);
Lback_motor.run(RELEASE);
Lfront_motor.run(RELEASE);
}

void left(){
Rback_motor.run(FORWARD);
Rfront_motor.run(FORWARD);
Lback_motor.run(BACKWARD);
Lfront_motor.run(BACKWARD);

Rback_motor.setSpeed(maxSpeed);
Rfront_motor.setSpeed(maxSpeed);
Lback_motor.setSpeed(maxSpeed);
Lfront_motor.setSpeed(maxSpeed);
}

void right(){
Rback_motor.run(BACKWARD);
Rfront_motor.run(BACKWARD);
Lback_motor.run(FORWARD);
Lfront_motor.run(FORWARD);

Rback_motor.setSpeed(maxSpeed);
Rfront_motor.setSpeed(maxSpeed);
Lback_motor.setSpeed(maxSpeed);
Lfront_motor.setSpeed(maxSpeed);
}

void rightAngle(int angle){
right();
delay(delay180*angle/180);
stopcar();
}

void leftAngle(int angle){
left();
delay(delay180*angle/180);
stopcar();
}

void driver() {
if (getstr == '5') {
Serial.println("stopcar");
stopcar();
control=0;
}
if (getstr == '1') {
Serial.println("forward");
forward();
control=0;
}
if (getstr == '2') {
Serial.println("backward");
backward();
control=0;
}
if (getstr == '3') {
Serial.println("right");
right();
control=0;
}
if (getstr == '4') {
Serial.println("left");
left();
control=0;
}
if (getstr=='6'){
control=1;
}
if(getstr=='7'){
control=0;
}
}

void servocontrol1(int mypos) {
myservo1.write(mypos);
}

float getdistance() {
digitalWrite(trig, 1);
delayMicroseconds(15);
digitalWrite(trig, 0);
IntervalTime = pulseIn(echo, HIGH);
//Serial.print(IntervalTime / 58.00);
return IntervalTime / 58.00;
}

void ultrasonicCar() {

float s135 = 0;
float s45 = 0;
float s90 = 0;
for (pos = 45; pos < 136; pos++) {
myservo1.write(pos);
if (pos == 45) {
s45 = getdistance();
} else if (pos == 90) {
s90 = getdistance();
} else if (pos == 135) {
s135 = getdistance();
} else {
delay(5);
}
}
ultrasonicCar(s135, s90, s45);

for (pos = 135; pos >= 45; pos--) {
myservo1.write(pos);
if (pos == 45) {
s45 = getdistance();
} else if (pos == 90) {
s90 = getdistance();
} else if (pos == 135) {
s135 = getdistance();
} else {
delay(5);
}
}
ultrasonicCar(s135, s90, s45);
}

void ultrasonicCar(float s135, float s90, float s45) {
//Serial.println("--------------------------");

if ((s90 < 40)&&(s45<40)&&(s135<40)){
stopcar();
}else if ((s90 < 40)&&(s45>40)&&(s135<40)){
left();
}else if ((s90 < 40)&&(s45<40)&&(s135>40)){
right();
}else{
forward();
}
}


持续更新中
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息