LOADING...

加载过慢请开启缓存(浏览器默认开启)

loading

简单的智能小车开发

嵌入式开发的初尝试

因为上的一门课,我初次接触到了嵌入式开发的一些知识和原理,并进行了十分粗浅的尝试。本次尝试是基于arduino的智能小车进行,并通过c语言对其进行开发。

大体思路概括:首先围绕一块arduino的主板进行硬件的组装,包括电机、舵机、红外寻迹模块、超声波测距等。小车组装完毕后,在计算机上使用arduino IDE编写代码,并可以把代码传到智能小车上,智能小车就可以按照程序运行。

(其中使用arduino来编程,是因为其具有如下好处:与arduino板匹配度高,可直接传递代码;与其他电子开发平台相比,程序代码简单明了,虽然也是用的c语法,但其具有强大的库文件,使得代码无比简单明了;arduino是一个开源平台,有着丰富的代码库)

本文从三个部分进行介绍智能小车开发的全过程:

  • 硬件组装
  • 软件开发
  • 最终运行

硬件组装

这一部分介绍简略些,依次组装直流电机组、电池、定向轮、电压检测模块、arduino主板、接线板与车轮、超声波舵机云台,具体安装过程略去。

bHcEKH.jpg

安装完毕后,进行硬件的调试,首先是调试红外避障模块。原理是:智能小车上电后,红外对管就开始工作,当红外对管前方一定距离内有障碍物出现时,会 把发射管发射的红外光反射回来,此时被接收管接收到,通过电压比较芯片分析后输出相应的信号,当红 外对管前方一定距离内有障碍物出现时状态指示 LED 灯亮起,电位器用于调节检测障碍物的距离。调试过程略去。

然后调节红外寻迹板块。工作原理:利用判断黑白线来完成寻迹,红外光有一个反射特性。但对于不同的 物体反射特性是不同,特别是对白色反光的物体,红外光的反射量将会多一点。 而对黑色不反光的物体,红外反射量将会大量的减少。那么我们就可利用这个特性来完成黑与白的判断。

下图为红外寻迹模块

bHcrM4.png

接下来调节电机模块。调节完毕之后完成接线,之后小车就已大功告成。

bHcqot.png

软件开发

硬件配置好后,进行软件编程。arduino配备了齐全且完备的函数,可以直接调用来实现一些简单的操作。在编程时,可使用一个图形化编程工具作为辅助——Mixly,如果已经基本了解arduino的基本函数也可以直接使用arduino编写程序。

Mixly(米思齐)是在北京师范大学傅骞博士团队组织开发的一款国内自主研发,且免费开源的图形化编程工具。在这里mixly可以直接为我们提供现成的操作函数,并以图形的形式展现、调用。其中包含逻辑(如循环、选择等结构)、数组、函数等等c语言的语法结构,个人认为十分适合编程入门。
题外话:这也是我第一次接触图形化编程。一接触就被它的简单、便捷、明了的特点所折服。它是如此友好,用图形拼插的方式展现出各功能的作用和逻辑关系。想起一位学长创业的项目就是编程拼图,就是用如此友好、通俗的方式将编程学习普及,特别是向小孩子普及,激发他们的学习兴趣。现在年营业额已超千万,而那位学长才大四。那位学长的一场分享也让我印象深刻:“做一点心潮澎湃的事情”

bHgPwn.png

以让小车前进为例。

mixly中,只需直接调用左右电机的函数(即拖拽对应的图形),便可实现。

而用arduino编程,代码如下:

int left_motor_en = 5;//左电机使能 
int right_motor_en = 6;//右电机使能 
int left_motor_go = 3;//左电机正传 
int right_motor_go = 4;//右电机正传 
int left_motor_back = 2;//左电机反转 
int right_motor_back = 7;//右电机反转 
void setup() 
{
//电机驱动引脚全部设置为输出模式 
pinMode(left_motor_en,OUTPUT); 
pinMode(right_motor_en,OUTPUT); 
pinMode(left_motor_go,OUTPUT);
pinMode(right_motor_go,OUTPUT); 
pinMode(left_motor_back,OUTPUT); 
pinMode(right_motor_back,OUTPUT); 
analogWrite(left_motor_en,255);//左电机占空比值 取值范围 0-255,255 最快 
analogWrite(right_motor_en,255);//右电机占空比值取值范围 0-255 ,255 最快 
}
//小车前进 
void forward() 
{
     digitalWrite(left_motor_go,HIGH); //左电机前进 
     digitalWrite(left_motor_back,LOW); 
     digitalWrite(right_motor_go,HIGH); //右电机前进 
     digitalWrite(right_motor_back,LOW); 
}
void loop() 
{
 forward();//小车前进 
 }

而如果代码实现左转右转,以左转为例,就让左电机不动,右电机转或左电机转的比右电机慢即可。

也可以用代码实现一些比较有意思的功能,比如:

小车跟随——即小车会跟着你走

mixly:即为上图

代码:

#include "yunk_ARCar.h"
Yunk_ARCar_IRAvoid  yk_arIRAvoid(12, 13);
Yunk_ARCar_Motor  yk_arCar(3, 2, 4, 7, 5, 6);

void setup()    //可理解为初始化
{

}

void loop()
{

    if (LOW == yk_arIRAvoid.Senser_State_L() && LOW == yk_arIRAvoid.Senser_State_L()) 
{
    yk_arCar.Run(120, 0);
} 
else {
if (HIGH == yk_arIRAvoid.Senser_State_L() && LOW == yk_arIRAvoid.Senser_State_R()) 
{
  yk_arCar.Right(120, 0);
}
if (LOW == yk_arIRAvoid.Senser_State_L() && HIGH == yk_arIRAvoid.Senser_State_R()) 
{
  yk_arCar.Left(120, 0);
}
if (HIGH == yk_arIRAvoid.Senser_State_L() && HIGH == yk_arIRAvoid.Senser_State_R())
{
  yk_arCar.Stop(120, 0);
}
}
}

智能避障

代码实现:

#include "yunk_ARCar.h"
volatile int LeftDirection;
volatile int RightDirection;
Yunk_ARCar_CloudServo yk_arcloudservo_9(9, OUTPUT);
Yunk_ARCar_Motor  yk_arCar(3, 2, 4, 7, 5, 6);

float checkdistance_A5_A4() {
digitalWrite(A5, LOW);
delayMicroseconds(2);
digitalWrite(A5, HIGH);
delayMicroseconds(10);
digitalWrite(A5, LOW);
float distance = pulseIn(A4, HIGH) / 58.00;
delay(10);
return distance;
}
void setup()
{
LeftDirection = 0;
RightDirection = 0;
pinMode(A5, OUTPUT);
pinMode(A4, INPUT);
}
void loop()
{
yk_arcloudservo_9.CloudServo_Contrl(90,65);
if (checkdistance_A5_A4() < 45) {
yk_arCar.Stop(130, 100);
yk_arCar.Back(130, 300);
yk_arCar.Stop(130, 100);
yk_arcloudservo_9.CloudServo_Contrl(180,65);
LeftDirection = checkdistance_A5_A4();
yk_arcloudservo_9.CloudServo_Contrl(0,65);
RightDirection = checkdistance_A5_A4();
if (LeftDirection < 45 && RightDirection < 45) {
  yk_arCar.SpinLeft(130, 600);
} 
else {
  if (LeftDirection > RightDirection) {
    yk_arCar.Left(130, 500);
    yk_arCar.Stop(130, 100);
  } else {
    yk_arCar.Right(130, 500);
    yk_arCar.Stop(130, 100);
  }
}
} else {
yk_arCar.Run(130, 0);
}
}

最终运行

代码完成后,在arduino或mixly里将代码编译完成,再通过USB数据线将代码传入arduino主板,打开开关小车就可以按照所编写的程序运行了。

一点总结:之前的编程都是在计算机环境中,接收到的输出也都是计算机内部通过计算、运行反馈到屏幕上的结果。而这次经历也让我对于嵌入式的开发有所了解。其本质也是用c语言,通过调用函数来控制特定电子元件,并通过改变参数实现操作。这样的开发感觉是一种在计算机的虚拟世界和实体的世界建立一种联系。实体的设备使得计算机上的代码焕发了生命,而代码又使得设备更加灵活、智能,是一种双向赋能。