VBLEARN 项目2: 遥控小车制作, 开发记录中
本帖最后由 vblearn 于 2015-2-21 09:08 编辑2015-02-21 08:30
准备做一个遥控小车, 目的吗, 给孩子做玩具用. {:soso_e100:}
一边学一边做. 记录下来.
>>需求:
通过无线控制小车, 可以控制前进,后退,(可以调节速度),左右转弯.
可以闪灯。
>>技术分析
>无线传输
现在可用的方式包括,模电遥控器, 红外,蓝牙,无线串口和无线网络
1模电 2262/2272四路无线遥控套件M4非锁
2 红外,有51剩下的红外接收管,但考虑接收有方向性,暂不用
3 蓝牙有电路,可用(串口透传),价格较高。
4 无线串口暂无电路,朋友推荐CC1101
5 无线网络WIFI(ESP8266)有电路,试验过, 但总感觉有点复杂,而且不很可靠。
>控制命令
使用简单的串口传递命令,
>电机控制
计划使用L298N. 由于是三轮车,使用差速控制,还需要对两个速度进行微调,以走直线。
>小车,
购于某宝, http://detail.tmall.com/item.htm?id=43280413496&spm=a1z09.2.9.762.bIvwI4&_u=l1i64r1l1035&mt= 质量很一般.
>发送端
还需要另一块ARDUINO来处理发送的功能. 要不就得使用计算机遥控了.
>>开发步骤
1 试验L298N, 通过UNO 对两个电机控制
2 试验串口命令 (使用计算机发送)
3 试验有线的控制
4 调节算法, 使用差速进行控制.
5 试验计算机无线的控制.
6 ARDUINO TO ARDUINO的控制
>>计划时间, 2-3天完成.
可以参考下
http://wiki.geek-workshop.com/doku.php?id=arduino:libraries:boxz 本帖最后由 vblearn 于 2015-2-21 14:52 编辑
OK.谢谢楼上, 但已写出来了.
先接了L298N,开始用USB供电,根本带不动两个电机. 现在用12V电源(10A的). 驱动OK了.
还是考虑使用串口进行控制
现在定义了两个命令,一个是前后的速度,一个是左右的转向速度. 这两个数的范围是0到510,以255为中心.
经过计算后,变成左右电机的速度SPEED1,SPEED2,范围为0-255.
但PWM低值时无法驱动电机,高时又太快. 所以SPEED到PWM进行了一个简单的线性变换. 即定义了PWM的最小和最大值, 将SPEED的0-255映射到PWM的MIN到MAX.
由于两个电机速度不完全一致,还保留了两个变量对SPEED进行微调.
串口的处理代码可以参照上一贴项目1-万年历
下面是速度处理的代码.
//control value
int m_ValueCenter=255;// for Forward and Turn
int m_Forward,m_Turn; //Current control -255 to 255
int m_Speed1=0,m_Speed2=0; //-255 to 255
int m_Speed1Adjust=0,m_Speed2Adjust=0;//adjust the motor speed
#define C_PWM1MIN 60
#define C_PWM1MAX 130
#define C_PWM2MIN 60
#define C_PWM2MAX 130
int m_PWM1,m_PWM2; //PWM control;
一个是从控制量到两电机速度的函数
void S_CalculateControl()
{
//from m_Forward,m_Turn(-255 to 255); tom_Speed1,m_Speed2; (-255 to 255 )
m_Speed1=m_Forward;
m_Speed2=m_Forward;
if (m_Forward>0)
{
if (m_Turn<0)//turn left
{
m_Speed1+=m_Turn; //chang speed
if (m_Speed1<0) {
m_Speed1=0;
}
}
if (m_Turn>0) //turn right
{
m_Speed2-=m_Turn;
if (m_Speed2<0) {
m_Speed2=0;
}
}
}
if (m_Forward==0)
{
if (m_Turn!=0)
{
m_Speed1=-m_Turn; //chang speed
m_Speed2=m_Turn;
}
}
if (m_Forward<0)
{
//Treat turn
if (m_Turn<0)//turn left
{
m_Speed1-=m_Turn; //chang speed
if (m_Speed1>0) {
m_Speed1=0;
}
}
if (m_Turn>0)
{
m_Speed2+=m_Turn;
if (m_Speed2>0) {
m_Speed2=0;
}
}
}
}
一个是实际控制电机的函数
void S_Control()
{
int i;
byte PWM1,PWM2;
//last adjust
m_Speed1+=m_Speed1Adjust;
m_Speed2+=m_Speed2Adjust;
if (m_Speed1>255)
{
m_Speed1=255;
}
if (m_Speed1<-255)
{
m_Speed1=-255;
}
if (m_Speed2>255)
{
m_Speed2=255;
}
if (m_Speed2<-255)
{
m_Speed2=-255;
}
if (m_Speed1>0)
{
digitalWrite(P_IN1,LOW);
digitalWrite(P_IN2,HIGH);
PWM1=m_Speed1*(C_PWM1MAX-C_PWM1MIN)/255+C_PWM1MIN;
analogWrite(P_ENA,PWM1);
}
if (m_Speed1==0)
{
analogWrite(P_ENA,0); //
digitalWrite(P_IN1,LOW);
digitalWrite(P_IN2,LOW);
}
if (m_Speed1<0)
{
digitalWrite(P_IN1,HIGH);
digitalWrite(P_IN2,LOW);
PWM1=-m_Speed1*(C_PWM1MAX-C_PWM1MIN)/255+C_PWM1MIN;
analogWrite(P_ENA,PWM1);
}
//Speed2
if (m_Speed2>0)
{
digitalWrite(P_IN3,LOW);
digitalWrite(P_IN4,HIGH);
// analogWrite(P_ENB,m_Speed2);
PWM2=m_Speed2*(C_PWM2MAX-C_PWM2MIN)/255+C_PWM2MIN;
// Serial.print ("Run2 ");
// Serial.println (PWM2);
analogWrite(P_ENB,PWM2);
}
if (m_Speed2==0)
{
digitalWrite(P_IN3,LOW); //STOP
digitalWrite(P_IN4,LOW);
analogWrite(P_ENB,0);
}
if (m_Speed2<0)
{
digitalWrite(P_IN3,HIGH);
digitalWrite(P_IN4,LOW);
PWM2=-m_Speed2*(C_PWM2MAX-C_PWM2MIN)/255+C_PWM2MIN;
analogWrite(P_ENB,PWM2);
}
}
下一步,计划先拖根线传递12V和串口.试试后,再处理 移动电源和无线部分的问题. 什么时候放图或者视频呢? 本帖最后由 vblearn 于 2015-2-21 22:16 编辑
刚增加了蓝牙串口的无线功能。 使用的**莱的一对蓝牙模块。( HC-05 串口蓝牙)
上次调试对了,这次用错了电压,本来应该是5V的,用的3。3V,半天才发现错误。
而且蓝牙用的串口与下载的冲突,下载程序时还需要拔掉0,1口的线。
无线串口工作正常。下一步就是移动电源了。试了一下9V电池算可用吧,先按这个弄,之后再考虑12V的。
太晚了,先上个半成品的图。
电源部分明天再试。 20150222 22:56进展报告
使用了9V的电池,能够独立运行了。使用计算机发串口命令,可以控制小车了。为此还写了个VB。NET的程序。可以使用键盘进行控制。
但还是存在了严重的问题,就是两个电机的不一致。我本来保留了两个变量对左右电机进行微调。但发现前进和后退时,情况还不同。
看来小车不象想象的简单。 只好准备上闭环控制了。 上次买了两个测速模块。但小车的测速盘太紧,安装时损坏了一个,还没有想到替代的方法。
先把半成品的图片,程序上传,以后有设备再进行闭环的控制。
支持。加油。
页:
[1]