机器视觉小车搭建之电机
在搭建小车的硬件之前先了解一下有哪些硬件,里面可能讲的不够详细,具体的请自行百度补充。
一、硬件:电机。
1.电机
电机的主要作用是给小车提供动力,选择的电机是三相电机(型号请师弟师妹查询补充)。
电机有三根接线,连接电调,被电调控制。
二、硬件的连接
-
电机连接电调
因为电机是三相电机,与电调相连,总共有六种接线方式,请自行尝试,找到正确的连接方式。
-
电调连接Arduino
电调又称电子调速器,主要作用是接收arduino的指令来控制电机。
红色线:VCC 黑色线:GND 白色线:信号线
我们Arduino中的代码中设置D9端口作为输出,控制电调,然后电调控制电机。
以上为硬件的连接,接下来为arduino的调试。
========================================================
========================================================
Arduino的调试主要的作用是测试小车硬件是否正常和获取小车的动力和转向的角度。
其中,在理论中,!p1500为静止,!p1000为后退最大速度,!p2000为前进最大速度。
!s1500为静止,!s1000为极左,!s2000为极右。
(注意输入指令时注意中英的!是有区别的)
接下来我们需要一个arduino IDE来烧写程序。
下载地址(https://www.microsoft.com/zh-cn/p/arduino-ide/9nblggh4rsd8?ocid=badge&rtc=1&activetab=pivot:overviewtab)
安装完成之后,我们进行小车的调试。
先将代码拷贝进去(代码我放在文档最后)
1. 设置板子的信息(我们使用的是arduino uno版本)
2.选择烧写板子的端口(可以在笔记本管理中查询到)
3.编译
显示出上传成功即烧写成功。
4.调试
选择右上角的串口监视器
显示以下窗口(设置波特率为115200)
特别提醒:设置的波特率和arduino的代码需要一致,这样才能通信。切记需要灵活运用。
5.输入!p指令
通过修改!p+数值来寻找小车的最佳速度,包括前进和后退。
========================================================================================
==============
==================
=========================
===============================
电机控制代码:
#define BAUD_RATE 115200 //串口通信波特率
#include
//*********************电机舵机定义**************************//
int POWER_PIN = 5; //5引脚 控制动力;
Servo powerServo; //电机
int PULSEP= 1500; //转向的中间值
//*********************串口定义*****************************//
int commandStarted = 0;
String valueString = "";
String command = "";
float value = 0;
//*********************控制系统定义*************************//
char useControlSystem = 0;
void setup()
{
// put your setup code here, to run once:
Serial.begin(BAUD_RATE); //设置串口通信波特率115200
pinMode(POWER_PIN, OUTPUT); //定义POWER_PIN 5引脚为输出口 控制动力
powerServo.attach(POWER_PIN); //初始化一个连接到9引脚的运动范围在0°~180°的电机
powerServo.writeMicroseconds(PULSEP); //初始化电机的中点值为PULSEP=1500
}
int checkForSerial()
{
//检查串口通信
if (Serial.available() > 0) //检查串口缓冲区是否有获取数据
{
int inChar = Serial.read(); //将串口获取的数据传给inChar
if(inChar == '!')
{
//接收到指令
commandStarted = 1;
valueString = "";
command = "";
}
if(commandStarted == 0)
{
//没有接收到指令
return 0;
}
if (isDigit(inChar) || inChar == '.') //检查inChar是否有数字或者‘.’
{
valueString += (char)inChar; //valueString=valueString+inChar;例如:inChar为!p1500 则valueString为1500
}
if(isAlpha(inChar)) //检查inChar是否有字母
{
command += (char)inChar; //command=command+inChar;例如:inChar为!p1500 则command为p
}
if (inChar == 'n') //如果按下enter/确认
{
commandStarted = 0;
value = valueString.toFloat();
if(command=="p")
{
if(useControlSystem==0)
{
if(value >=1000){
if(value <= 2000)
{
PULSEP = value;
powerServo.writeMicroseconds(PULSEP);
Serial.print("Power: ");
Serial.println(PULSEP);
}
}
}
else{
Serial.println("Cannot set power value directly when using control system.");
}
}
}
}
}
void loop()
{
// put your main code here, to run repeatedly:
checkForSerial();
}
--end--
声明:本文章由网友投稿作为教育分享用途,如有侵权原作者可通过邮件及时和我们联系删除:freemanzk@qq.com