智能小车制作过程全纪录: 二、软件平台— Arduino底盘驱动详解架构师

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

这里写图片描述

  1. 底盘驱动:根据控制命令控制4个电机的控制
  2. 听觉系统:采用Sphinx4开源语音识别框架,识别语音数据
  3. 视觉系统:采用JavaCV图像识别来分析小车所看到的内容,做到目标跟踪
  4. 语音合成系统:采用FreeTTS语音合成技术,合成语音数据,
  5. 舵机控制系统:通过采集的视觉和语音数据,控制舵机,一开始只是控制摄像头的左右上下活动
  6. 传感器系统:系统安装温度、湿度、光感、人体感知等传感器,主控器根据传感器数据做出相应的动作

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(); 
  } 
}

持续更新中

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/architecture/6916.html

(0)
上一篇 2021年7月17日 01:44
下一篇 2021年7月17日 01:44

相关推荐

发表回复

登录后才能评论