《基于IntoRobot创客
开发板的远程云遥控小车》
在这里非常感谢
电子发烧友提供的试用平台和创客开发板提供的试用机会~
经过一段时间的学习摸索基本掌握了
IntoRobot Neutron 开发板的使用方法,下面就用一个小项目来讲解一下整个开发过程:功能实现:通过网络远程进行小车的遥控控制。
硬件准备:1.小车底盘(铝基板加四个减速电机)
2.电机驱动板(TB6612是最常用的电机驱动模块体积小发热小效率高)
3.电源模块(DC-DC降压模块用来做5V供电电源)LM2596 DC-DC
4.底板(用来连接各模块,这个底板是覆铜板自己做的,前一段时间做的用来做底板非常合适)
5.下面这个就是今天的主角核心控制器(
IntoRobot Neutron 开发板)
6.锂电池(为整个系统供电)11.1V 600MAH
7。BB响(这个可有可无因为我的锂电池怀孕了必须实时进行检测电压保护,所以接上了一个BB响提示电过低)
8.电位器(作为本工程里面用来调节小车速度的)20K的滑动变阻器,官方控件不能自己编辑所以调速的东西还是用硬件来实现,毕竟速冻控制在调试的时候很重要。
好了以上就是硬件部分的介绍,下面介绍一下软件的开发:
首先建立一个新的工程(新建工程连接WIFI等..在前几期已经介绍过了这里就不再一一叙述了)
在线编辑主要介绍一下带码,之前想用按钮来控制前进后退,后面发现自编应用里没用合适的控件按钮,仅有的按钮是单击的不能自己复位,会出现一直点击的情况,最后在官网看到有个虚拟手柄的控件是个好东西,于是就载入到应用里面,在这个控件上走了不少弯路自己写的代码跟这个控件不能对接导致不能进行遥控,后面在官网查询不少资料后发现有个例程可以参考
下面就直接贴出我的全部代码了:
编辑代码前一定要添加一个按键解析的官方库,不然编译会出错的。
/*该头文件引用由IntoRobot自动添加.*/
#include "WidgetJoypad/WidgetJoypad.h"
#define A_IN0 D0 // A 电机驱动IO 电机接口
#define A_IN1 D1 // A 电机驱动IO
#define B_IN0 D3 // B 电机驱动IO
#define B_IN1 D4 // B 电机驱动IO
#define AB_EN D2 // A B 电机使能
#define LED D7 状态指示灯调试程序用的
const int analogInPin = A2; 定义一个电位器的模拟量输入接口
const int analogOutPin_A = A0; 定义一电机速度控制的两个PWM输出接口
const int analogOutPin_B = A1;
int sensorValue = 0; 定义模拟量输入输出变量
int outputValue = 0;
int outputValue_A = 0;
int outputValue_B = 0;
WidgetJoypad joypad;
void SwitchCb(void) 按键解析函数的(解析收到的按键信号并进行处理)
{
if(joypad.getUpkey()) 检测前进按键
{
goahead(); 小车前进
delay(300); 延时(这个是我一直困惑的问题按道理是不用加延时的,但是实际情况不 加延时会出现不前进的情况,后续还会继续研究这个问题,官方的例 子就是带延时的所以先按照官方的来)
}
else
{
stopm(); 小车停止
}
if(joypad.getDownkey()) 后退检测
{
goback();
delay(300);
}
else
{
stopm();
}
if(joypad.getRightkey()) 右转
{
trunright();
delay(300);
}
else
{
stopm();
}
if(joypad.getLeftkey()) 左转
{
trunleft();
delay(300);
}
else
{
stopm();
}
}
void setup() 初始化
{
// put your setup code here, to run once.
pinMode(A_IN0, OUTPUT);
pinMode(A_IN1, OUTPUT); 电机接口初始化
pinMode(B_IN0, OUTPUT);
pinMode(B_IN1, OUTPUT);
pinMode(AB_EN, OUTPUT);
pinMode(LED, OUTPUT); 指示灯初始化
pinMode(analogInPin,AN_INPUT); 模拟量输入
pinMode(analogOutPin_A,OUTPUT); PWM输出
pinMode(analogOutPin_B,OUTPUT);
joypad.begin(SwitchCb);
}
void goahead() 前进子函数
{
digitalWrite(AB_EN, HIGH);
digitalWrite(A_IN0, HIGH); //灯亮
digitalWrite(A_IN1, LOW); //灯灭
digitalWrite(B_IN1, HIGH); //灯亮
digitalWrite(B_IN0, LOW); //灯灭
}
void goback() 后退子函数
{
digitalWrite(AB_EN, HIGH);
digitalWrite(A_IN1, HIGH); //灯亮
digitalWrite(A_IN0, LOW); //灯灭
digitalWrite(B_IN0, HIGH); //灯亮
digitalWrite(B_IN1, LOW); //灯灭
}
void trunright()
{
digitalWrite(AB_EN, HIGH);
digitalWrite(A_IN0, HIGH); //灯亮
digitalWrite(A_IN1, LOW); //灯灭
digitalWrite(B_IN0, HIGH); //灯亮
digitalWrite(B_IN1, LOW); //灯灭
}
void trunleft()
{
digitalWrite(AB_EN, HIGH);
digitalWrite(A_IN1, HIGH); //灯亮
digitalWrite(A_IN0, LOW); //灯灭
digitalWrite(B_IN1, HIGH); //灯亮
digitalWrite(B_IN0, LOW); //灯灭
}
void stopm()
{
digitalWrite(AB_EN, LOW);
digitalWrite(A_IN0, LOW); //灯亮
digitalWrite(A_IN1, LOW); //灯灭
digitalWrite(B_IN1, LOW); //灯亮
digitalWrite(B_IN0, LOW); //灯灭
}
void loop()
{
sensorValue = analogRead(analogInPin); 读取模拟量数据
outputValue = map(sensorValue, 0, 2047, 0, 255)/4; 数值转换(实验发现结果除4速度比较稳定)
outputValue_A = outputValue;
outputValue_B = outputValue;
analogWrite(analogOutPin_A, outputValue); 输出PWM
analogWrite(analogOutPin_B, outputValue);
}
代码调试:
调试完毕后将小车进行组装:
最后打开控制软件进行遥控:(可以
手机电脑同时控制,由于本人条件有限使用手机录制视屏只好用电脑进行演示)
PS:勾选下面的按键控制可用电脑键盘进行操作
下面将视频贴上来让小伙伴们看看,用爱剪辑制作的 呵呵~ 马马虎虎,大家不要见笑~
[media]http://player.youku.com/player.php/sid/XMjgzOTcwN
tiwOA==/v.swf[/media]
总结一下:使用电位器可将车速控制在合适的范围,拧动电位器可进行调节,速度控制非常流畅,全部功能都都可以实现,方向控制是我想说的重点也是和上面延时函数可能也有关系,在控制过程中有时会出现动作延时的情况,还有不能连续控制的情况,这些问题我还在继续研究,可能其他小伙伴已经解决了(有的话请高手留言赐教非常感谢),下面我就想说下关于控件的使用,控件的种类个人感觉还需要再增加一些,如果控件可以自己设计那就更完美了,整个开发过程相对来说非常之快,归功于这个开源的平台使项目开发变得非常容易,如果使用传统的方法以我这个菜鸟的技术不知道什么时候才能搞出来。
以上欢迎各位小伙伴过来讨论赐教~