今天来总结一下一周实战项目的一个收获,先总结一下物联网的部分功能,后续再补充小车的其他功能话不多说,直接展示。下面是视频演示。
Arduino+ESP8266遥控小车-机械臂
OK了老铁们,下面,我将详细地介绍一下这个项目的细节,其中,项目过程中所遇到的问题,以及解决方法,都会在其中提到,欢迎友友们指出我的不足,同时,有更好的解决方法,也欢迎大家在评论区讨论,感谢各位大佬们!
一、小车简介:
本小车采用Arduino uno R3 主控板,在小车上搭载了物联网开发板-ESP8266 WIFI模块,L298N电机驱动模块,LM2596降压电源模块,超声波测距模块、OLED显示模块、减速直流电机,舵机,按键,能够实现小车的基本运动,控制机械臂的夹取,WIFI联网手机控制,按键切换小车模式,OLED显示模式内容等功能,本文重点介绍WIFI联网控制小车运动和机械臂夹取功能,后续会更新上述的其他功能,谢谢!
二、硬件准备:
名称 | 数量 |
Arduino uno R3 | 1块 |
ESP8266 Node MCU 物联网模块 | 1块 |
降压模块 | 1块 |
电机驱动模块 | 1块 |
直流电机 | 4个 |
舵机 | 4个 |
12V锂电池 | 1个 |
三、接线图:
小编在这个降压过程中,原本是用L7805CV稳成5V的供给Arduino,后来发现在接入四个舵机和接入电机驱动的时候,发现有时候轮子不转了,后来在查看Arduino uno R3的数据手册,发现建议供电是7V至12V,低于7V的话,会供电不足,这个时候,才想到使用降压模块,降成8.5V供给Arduino。这里因为舵机需要的VCC、GND比较多,我把Arduino的5v、3.3V、GND多接出一排为后续做准备。
四、机智云创建:
①创建机智云账号,同时,点击创建新产品,选择玩具娱乐、遥控车方案。并给方案命名,其余保持默认选项即可。
②、编辑数据点、小车前进、后退、左转、右转,采用可写的布尔值。底座、右臂、左臂、夹子,采用可写的数值,这里的数值范围,根据机械臂每个部位可运动的大小而定。
③选择MCU开发、复制Product Secret,然后下载代码包。
④下载好的代码包,解压之后,把里面的Gizwits文件夹,复制到Arduino的library位置,小编的位置如下:这里如果下载新版的IDE的小伙伴,就需要找到自己安装的library的位置啦,小编是老版本的IDE。
⑤给无线WIFI模块烧录机智云开发的GAgent固件,烧录之后,可以使用机智云的串口调试助手,调试WIFI模块,这里的烧录固件,和调试使用都可以在机智云官网查找,如果找不到方法,或者烧录不成功,可以滴滴小编,小编快马加鞭,再出一次教程给到大家。
⑥把WIFI模块配置好了之后,调试成功,绑定之后,WIFI模块上电之后,我们就可以在机智云APP的界面上,看到我们的方案名称,我们的简易的控制界面就创建成功啦!
五、Arduino代码编写:
①首先打开我们机智云生成的Gizwits文件夹里面examples中的simpleTry文件作为模板:
②编写小车运动代码,PWM调速,uno开发板的数字引脚中,有“~”的I/O(3、5、6、9、10、11)口表示有PWM调速功能,这里选择6、5分别连接L298N的ENA、ENB使能端进行PWM调速。
void motorRun(int m,int v)
{
analogWrite(leftPWM,v);
analogWrite(rightPWM,v);
switch(m)
{
case FORWARD://左、右两个电机均正转
//Serial.println("FORWARD");
digitalWrite(leftmotor1,LOW);
digitalWrite(leftmotor2,HIGH);
digitalWrite(rightmotor1,LOW);
digitalWrite(rightmotor2,HIGH);
break;
case BACKWARD://左、右两个电机均反转
//Serial.println("BACKWARD");
digitalWrite(leftmotor1,HIGH);
digitalWrite(leftmotor2,LOW);
digitalWrite(rightmotor1,HIGH);
digitalWrite(rightmotor2,LOW);
break;
case TURNLEFT://左边两个电机反转、右边两个电机正转
//Serial.println("TURNLEFT");
digitalWrite(leftmotor1,HIGH);
digitalWrite(leftmotor2,LOW);
digitalWrite(rightmotor1,LOW);
digitalWrite(rightmotor2,HIGH);
break;
case TURNRIGHT://左边两个电机正转、右边两个电机反转
//Serial.println("TURNRIGHT");
digitalWrite(leftmotor1,LOW);
digitalWrite(leftmotor2,HIGH);
digitalWrite(rightmotor1,HIGH);
digitalWrite(rightmotor2,LOW);
break;
default://四个电机都停止转动
//Serial.println("STOP");
digitalWrite(leftmotor1,LOW);
digitalWrite(leftmotor2,LOW);
digitalWrite(rightmotor1,LOW);
digitalWrite(rightmotor2,LOW);
}
}
③检测手机端相应按键控制,并执行相应的小车运动,由于数字 I/O口输出范围为0~255,若输出x,则电机的输入电压为(x/255*5)V,这里将6、5接口的输出设置为100,这样小车运动的速度适中。
if(varR_FORWARD==1)
{
motorRun(FORWARD,100); // 前进
}
else if(varR_BACKWARD==1)
{
motorRun(BACKWARD,100); // 后退
}
else if(varR_TURNLEFT==1)
{
motorRun(TURNLEFT,100); // 左转
}
else if(varR_TURNRIGHT==1)
{
motorRun(TURNRIGHT,100); // 右转
}
else
{
motorRun(STOP,0); // 前进
}
④机械臂运动代码,这里的舵机模块可以通过指令控制舵机转动的角度,此机械臂使用的是180°舵机。我采用的是,先调试舵机,使其90°的位置是我们机械臂静置时的位置,根据不同部分活动范围的不同,在机智云创建过程中,我们就设置好具体的范围,上面有给出,这里,当手机端给出不同的角度时,舵机会做出相应的变动。
if(myGizwits.hasBeenSet(EVENT_pos0))
{
myGizwits.read(EVENT_pos0,&varR_pos0);//Address for storing data
}
if(myGizwits.hasBeenSet(EVENT_pos1))
{
myGizwits.read(EVENT_pos1,&varR_pos1);//Address for storing data
}
if(myGizwits.hasBeenSet(EVENT_pos2))
{
myGizwits.read(EVENT_pos2,&varR_pos2);//Address for storing data
}
if(myGizwits.hasBeenSet(EVENT_pos3))
{
myGizwits.read(EVENT_pos3,&varR_pos3);//Address for storing data
}
myservo0.write(varR_pos0);
myservo1.write(varR_pos1);
myservo2.write(varR_pos2);
myservo3.write(varR_pos3);