Arduino案例实操 -- 智能巡防小车(三)Arduino IDE巡线小车编程

3.1 Arduino开发环境

开发环境即Arduino项目的编程环境 – Arduino IDE,Arduino集成开发环境(IDE)是一个在计算机上运行的软件,可供开发者编写、编译以及上传程序至Arduino开发板。其界面友好,语法简单,可以很方便的上传程序,使得Arduino项目开发变得非常便捷。

Arduino IDE在网上有很多资源提供下载,初学者可以自行从GitHub或者Arduino官网下载,这里提供从Arduino官网下载IDE的两种方式:

下载免安装ZIP包

进入Arduino官网 IDE下载页面(https://www.arduino.cc/en/Main/Software?setlang=en),英文网页看不懂的可以切换中文显示。

图3.1.1  IDE下载页面

切到至中文界面,页面大标题显示Arduino IDE当前的最新版本,点击右侧的链接能直接下载最新版IDE的免安装版压缩包。

图3.1.2  下载免安装ZIP包

不想下载最新版本的话,可以选择过去的老版本(版本号)进行下载。

图3.1.3  选择老版本IDE

下载的免安装压缩包,解压后可以直接看到整个IDE的目录,双击Arduino.exe可以直接打开IDE编辑器。

图3.1.4  IDE文件目录

下载IDE安装包

选择Windows安装包进行IDE安装包下载,运行安装包, I Agree进入下一步。

图3.1.5  IDE安装)

默认安装配置,Next进入下一步。

图3.1.6  安装配置选择

选择软件安装路径(可自定义路径),Install。

图3.1.7  选择安装路径

等待进度安装,完成后关闭安装向导,close关闭安装程序。

图3.1.8  等待安装

安装包安装的Arduino IDE目录比免安装的目录多了一个IDE卸载程序(uninstall),其他的没什么不同。

图3.1.9  IDE文件目录

运行Arduino IDE,非常干净简介的编程界面。

图3.1.10  IDE编程界面

3.2 Arduino IDE

此处参考 Arduino成长日记2 - Arduino编程基础 中的 Arduino软件(IDE) 小节

3.3 Blink项目实例

以IDE内置的Blink闪烁灯案例上传至Mega2560控制器,熟悉利用IDE进行软件开发的流程。

打开内置案例

打开菜单栏“文件 → 示例 → 01.Basics → Blink”,打开IDE内置案例。
在这里插入图片描述

内置案例为13号数字引脚LED灯闪烁。
在这里插入图片描述

进行程序上传

在菜单栏“工具 → 开发板 ”选择Arduino UNO开发板。

在菜单栏“工具 → 端口 ”选择UNO开发板连接端口(可在设备管理器找到CH340的对应端口)。
在这里插入图片描述

进行程序上传,观察状态栏的上传状态信息。
在这里插入图片描述
等待程序上传成功,观察实验效果。

在这里插入图片描述

3.4 巡线小车编程

配置好Arduino IDE环境,确认可以正常编译程序及上传后,开始编写巡线程序。
在IDE界面中直接进行项目代码编写。
在这里插入图片描述
添加小车车头舵机及OpenMV软串口所使用到的头文件。

#include <Servo.h>
#include "SoftwareSerial.h"

定义软串口引脚(软串口不固定引脚,可用户自定义引脚),创建舵机类对象。

//rx:9  tx:10
SoftwareSerial SoftSerial(9,10);

//创建舵机类对象
Servo AngleServo;

定义小车电机引脚,及PWM控制引脚。

//定义引脚
int Left_motor_go = 8;        //左电机前进 AIN1
int Left_motor_back = 7;      //左电机后退 AIN2

int Right_motor_go = 2;       //右电机前进 BIN1
int Right_motor_back = 4;     //右电机后退 BIN2

int Left_motor_pwm = 6;       //左电机控速 PWMA
int Right_motor_pwm = 5;      //右电机控速 PWMB

编写小车前进函数。

void RunForward()
{
	//左电机前进
  	digitalWrite(Left_motor_go, HIGH);    //左电机前进使能
  	digitalWrite(Left_motor_back, LOW);   //左电机后退禁止
  	analogWrite(Left_motor_pwm, 120);     //PWM比例0-255调速,左右轮差异略增减

  	//右电机前进
  	digitalWrite(Right_motor_go, HIGH);   //右电机前进使能
  	digitalWrite(Right_motor_back, LOW);  //右电机后退禁止
  	analogWrite(Right_motor_pwm, 120);    //PWM比例0-255调速,左右轮差异略增减

  	delay(50);
  	analogWrite(Left_motor_pwm, 50);
  	analogWrite(Right_motor_pwm, 50);
}

编写小车后退函数。

void Run_Backoff()
{
  	//左电机后退
  	digitalWrite(Left_motor_go, LOW);     //左电机前进禁止
  	digitalWrite(Left_motor_back, HIGH);  //左电机后退使能
  	analogWrite(Left_motor_pwm, 120);     //PWM比例0-255调速,左右轮差异略增减

  	//右电机后退
  	digitalWrite(Right_motor_go, LOW);    //右电机前进禁止
  	digitalWrite(Right_motor_back, HIGH); //右电机后退使能
  	analogWrite(Right_motor_pwm, 120);    //PWM比例0-255调速,左右轮差异略增减

  	delay(50);
  	analogWrite(Left_motor_pwm, 50);
  	analogWrite(Right_motor_pwm, 50);
}

编写小车电机停转函数。

void CarStop()
{
	//左电机静止
  	digitalWrite(Left_motor_go, LOW);    //左电机前进使能
  	digitalWrite(Left_motor_back, LOW);  //左电机后退禁止
  	analogWrite(Left_motor_pwm, 0);      //PWM比例0-255调速,左右轮差异略增减

  	//右电机静止
  	digitalWrite(Right_motor_go, LOW);   //右电机前进使能
  	digitalWrite(Right_motor_back, LOW); //右电机后退禁止
  	analogWrite(Right_motor_pwm, 0);     //PWM比例0-255调速,左右轮差异略增减	
}

小车的车头由舵机连杆控制转向,编写舵机角度控制函数来控制小车转向。

void CarTurn(short angle)
{
		AngleServo.write(angle);
}

创建相关变量,编写小车巡线程序,通过转换软串口来自OpenMV的角度值数据,进行小车车头转向控制。

String str = "";			     //字符串变量,接收OpenMV发送过来的角度字符串
int AngleValue = 0;			//车头转动角度值变量
bool RunOrder = false;		//小车行走状态标志位

//小车巡线函数
void OpenMV_LinePatrol()
{
	if(SoftSerial.available()){
	    // statement
	    if(RunOrder == false){
			RunOrder = true;
			RunForward();
		}
		while(SoftSerial.available())
		{
			int inReceive = SoftSerial.read();
			
			if(inReceive == '\n'){
				
				int value = str.toInt();

				AngleValue = 90 + round(value/2);		//黑线坐标坐标转换成舵机转动角度计算
				CarTurn(AngleValue);
				
				str = "";
			}
			else	str += (char)inReceive; 		
		}
    }
}

编写Arduino的setup函数内容,主要作用为初始化舵机引脚,初始化串口及配置串口波特率,配置电机引脚等操作。

void setup()
{
	//初始化角度舵机
	AngleServo.attach(3);
	AngleServo.write(90);

	//初始化串口参数
	SoftSerial.begin(115200);
	SoftSerial.listen();

	//初始化电机驱动IO口为输出方式
  	pinMode(Left_motor_go, OUTPUT);
 	pinMode(Left_motor_back, OUTPUT);
  	pinMode(Right_motor_go, OUTPUT);
  	pinMode(Right_motor_back, OUTPUT);

  	delay(50);	
}

Loop函数编程,循环调用小车巡线函数。

//loop函数
void loop()
{
	OpenMV_LinePatrol();	//OpenMV巡线函数
}

有争议的一点可能是舵机转换角度的计算,因为读者所用车体不一定和博主的一样,所以读者的小车角度计算需要根据实际测试的效果进行微调。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GenCoder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值