智能小车制作过程全纪录: 二、软件平台--- 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(); } }
持续更新中
相关文章推荐
- 智能小车制作过程全纪录: 四、软件平台--- Java 控制GPIO
- 智能小车制作过程全纪录: 六、软件平台--- 摄像头云台控制
- 智能小车制作过程全纪录:一、硬件平台
- Arduino智能小车制作报告
- 通过WiFi控制智能小车机器人制作过程详解
- 基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - 智能部署与升级
- 【STM32 .Net MF开发板学习-13】用PWM驱动智能小车
- 历时两年开发,昕友亿方InfoPath智能平台软件横空出世
- 昕友亿方InfoPath智能平台软件视频教程公开,4分钟学会轻松定制企业级应用软件
- 颠覆传统 联鼎软件推出全新智能高可用双机热备软件,可扩展为集群及容灾平台
- 基于架构驱动的软件开发过程
- 阿凡达制作过程中用了多少adobe的软件
- SP(软件过程)的发展历程2:计划驱动软件开发过程时代
- 智能DNS安装配置过程全纪录
- iModel 模型驱动软件开发平台 -开启信息管理软件DIY之旅(转)
- 请把Camera hold住 - Android高通平台调试Camera驱动全纪录
- 【STM32 .Net MF开发板学习-13】用PWM驱动智能小车 推荐
- 软件智能升级(用Web Services制作升级程序)
- 【免费VR软件下载】专业虚拟仿真制作平台—VEStudio1.2无限制商业版
- 智能手机软件平台 Android VS iPhone OS: 平台对比分析 (1/4)