基于Arduino的智能泡茶机(1)——机械系机械创新比赛总结技术点与不足处
1、智能泡茶机项目需求
1.1、目标项目需求(总体:机械结构+电控)
- 机械为主、电控为辅。
- 突出机械部分创新点。
- 项目主要机械部分需要ANSYS有限元分析。
- 符合时代智能家居的理念。
1.2、作品完成后已有的功能
- 通过控制执行器,能够完整的泡茶出来。
- 语音控制、按钮输入功能。
- 设计出一套符合机型的APP。
- 语音提示。
2、泡茶机的元器件件选型
元器件名称 | 数量 | 作用 |
---|---|---|
MG995舵机 | 19 | 控制泡茶机动作的主要执行器 |
HC-05号蓝牙模块 | 1 | 建立手机与单片机之间的桥梁 |
循迹避障模块 | 3 | 用于检测茶杯(人机交互) |
水泵(接食用水) | 1 | 抽水 |
继电器 | 1 | 用Arduino来控制水泵何时通电 |
手机 | 1 | 用于蓝牙连接、语音识别、触屏(按钮) |
降压器(220V转5V) | 1 | 给传感器和执行器供电 |
Arduino Uno板 | 2 | 用于控制控水机械手、茶壶机械手 |
Arduino Mega板 | 1 | 主要控制板用于通信两外两个Arduino Uno板 |
16路舵机驱动板 | 1 | 通过IIC通信驱动舵机,减少大量IO占用 |
注意:
- Arduino的供电问题:Arduino的供电问题:因为在泡茶及运行的时候,我们不可能说是把Arduino板连接在电脑上面运行,所以我们这里的解决方案就是拿充电插头给Arduino板供电,或者使用稳压模块来给Arduino来供电。
- Arduino通信问题:在上面的元器件选型中,我使用的是两个Uno板和一个Mega板,在通信上,我的思路是让Mega板作为一个上位机,其他的Uno板作为下位机,他们在通信上还是有一些问题,比如说通信上会有延时,这里的话,我们可以使用Arduino的软串口来解决通信延时问题,但是这个前提是你占用的IO口不多,不然一个软串口就要占用两个IO口的位置。由于我在设计的时候,IO的使用比较多了,所以我没有使用这个解决方法。或者你用两个Mega板来代替你的两个Uno板,因为Mega板有4个通信口。
3、项目中需要使用到的软件
软件名称 | 用途 |
---|---|
Mixly(或者中文叫米思齐) | 这是图形化编程,用于传感器检测会快很多(这软件给小朋友学编程用的,所以……很简单) |
Arduino | 主要的Arduino编译器,如果你VS编译器里有Arduino模块也行 |
App Inventor | 基于Java的一个APP制作网页(也有软件版本的,可以在中国大学慕课里找到相关课程) |
Fritzing | 这是一个用于电路接线的一个软件 |
ANSYS 17.0 | 这是一个很强大的一个有限元分析软件,用于材料应力分析等(19版本以上有中文,如果没有学过专门的课程的话,很难使用) |
注意:
我们在控制方面的话主要还是要使用Arduino来编程。
App Inventor是图形化编程,在使用上比较简单,在使用到百度语音的时候,记得要让手机联网,不然唤醒不了。
蓝牙在每一次Arduino复位后可能要重新连接。
4、Arduino编程中主要使用到的函数
4.1、舵机控制函数
在泡茶机中,我们主要的执行器就是MG955舵机。舵机的驱动方式有两个:一是使用Arduino自带的Servo函数,二是使用第三方库Adafruit_PWMServoDriver.h。注意:不管你是你使用哪一种方式,delay函数只是给舵机足够的时间,并不是控制舵机转动时长。如果你要控制舵机请看4.2。
4.1.1、Servo库
Servo函数的主要成员(下面用Uno板为例)
函数名 | 用途 |
---|---|
attach() | 设定舵机的接口,注意在Arduino 0016之前只能接到9和10引脚 |
write() | 让舵机旋转到到指定角度(这只能0-180度) |
writeMicroseconds() | 写个微秒让舵机转动,一般情况下,在标准舵机中,参数设置为1000为完全逆时针方向,2000完全顺时针方向,1500为在中间。但是不同的厂家可能会有些不同 |
read() | 读取舵机的当前角度,返回的是0-180度 |
attached() | 传入一个Servo变量,判断是否被附加到一个引脚上,有就返回true,否则返回false |
detach() | 将servo变量与引脚脱离,如果所有servo变量均被脱离,第9和第10教将可以用analogWrite()函数进行PWM输出 |
市面上的Arduino板的0-13引脚(一共14路)都是可以接舵机的,如果解不了的话可以参考4.1.2的16路du
注意:我们这里主要使用到的有attach()、write()这两个函数。其他函数在本项目中使用不到。
例子:
- 在全局定义中创建一个Servo 变量:Servo servo_9; //创建一个全局的Servo 变量
- 在Arduino的setup中初始化:servo_9.attach(9); //附加到Arduino的9号引脚
- 发送PWM数据给9号引脚:servo_9.write(60); //让舵机转到60度
- 给足够时间给舵机: delay(100); //延时100毫秒给舵机转动
4.1.2、Adafruit_PWMServoDriver.h库
注意:这个库是购买16路舵机驱动板时的芯片资料,我们拿到的一般是一个压缩包。这时需要先打开Arduino编译器的文件位置->libraries,然后再把压缩包放到libraries中。
左图为16路舵机驱动板。
在Adafruit_PWMServoDriver.h库中主要的函数如下
函数名 | 作用 |
---|---|
Adafruit_PWMServoDriver(uint8_t addr = 0x40) | Adafruit_PWMServoDriver库的构造函数,默认地址为0X40 |
begin(void) | 启动函数,无参数 |
reset(void) | 复位函数,无参数 |
setPWMFreq(float freq) | 设置刷新频率,我这里使用的是60Hz |
setPWM(uint8_t num, uint16_t on, uint16_t off) | 发送off(脉冲长度计数)给16路舵机的num接口 |
注意:如果使用舵机驱动板的话还需要用到#include <SPI.h>和#include <Wire.h>,这两个库是Arduino的自带库(不需要额外下载的),他们是用于IIC通信时使用的。
例子:
- 在全局变量中定义:Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0X40); //创建一个16路舵机驱动板变量
- 在Arduino的setup函数中:pwm.begin(); //驱动板开启
- 在Arduino的setup函数中:pwm.setPWMFreq(60); //模拟伺服系统以60赫兹的频率更新
- 启动舵机:pwm.setPWM(0, 0, 600);
- 给一定的时间延时:delay(100);
4.2、解决舵机运行速度和加速度的方式
对于不同厂家生产出来的舵机转速是有一定差异的,下面是我在一个淘宝卖家上的截图。
我们可以看到在4.8V和6.V时的空载速度是不同的(单位是秒/60°)。随着舵机的规格不同,速度也是有些差异的。就拿上面的9KG铜齿舵机来说,4.8V时的空载速度为140ms转完一圈,那么大概就是2.4ms转一度。这也说明你给他140ms它能转一圈,但是你给它120ms的话它是不会转一圈的(即转速不会加快),除非是提高电压!同理,也不能说是给200ms它就会慢慢转,他只会用140ms,剩下的的60ms它只会在那边干等着。
此外,舵机也算是电机,只是他是一个特殊的电机(我们这里就把他看成是一个小型的电机),根据《执行元件及控制》中电机的特性曲线可以只知道电机在开始工作的时侯转速的偏慢的,那我们把电机映射成舵机的话,我们可以得出舵机小幅度转动的话旋转的速度是会更慢一些的。
所以,我们可以根据这两个特性来对将要旋转的度数进行划分。
下面我就用一个demo来描述一下舵机转速主要解决方式,这里我使用的是上文中第一种控制方式(使用Servo.h库函数),舵机选用上面9KG扭矩的舵机,接上4.8V电压让其空转。
#include <Servo.h>
Servo servo_2; //创建一个全局的Servo 变量
int Degree = 0; //记录当前角度
int Target = 0; //记录将要旋转的目标角度
int Velocity = 20; //记录舵机每度的延时时间,可作为旋转速度
int Acceleration = 1; //加速度
int readnum = 0; //用于存储随机数
void setup(){servo_2.attach(2); //这里我是使用2号引脚
}void loop(){Target = random(1, 180); //这里我随机产生一个随机数作为目标角度Degree = Run_Servo(Degree ,Target,Velocity ,Acceleration); //获取当前角度delay(1000); //延时1秒后进行下一次转动
}
//舵机执行函数,输入当前度数、指定度数,速度级别,加速度
int Run_Servo(int Deg,int Tar,int v,int a){int flag = -1; //记录是要顺时针转还是逆时针int Decode_Motor_Degree; //记录将要转动的度数int Variable = 0; //两个度数差//做差值,求两角度的差值Variable = Deg - Tar;//判断角度差是正值还是负值,并且设立标志位if(Variable>=0){flag = 1;}else{flag = -1;}for(int i = 1; i <= Variable*flag; i++){Decode_Motor_Degree = Deg+i*flag;servo_2.write(Decode_Motor_Degree); //这里就是让舵机一度一度的往上加//下面为每度的延时时长if(Velocity>3){delay(Velocity-a*i);}else{delay(3);}}
}
注意:我们必须要给系统留一些裕度,所以在舵机每度延时方面不能小于2.4ms,为了保证系统稳定性,我们最少设置为3ms。上面对加速度的处理方面,我只是提供一个比较简陋的处理方式,没有考虑到过多的细节,大家可以对此进行优化。
5、三个Arduino之间的通信问题与解决方案
在项目初期,我原本打算使用单单一个Uno板来完成整个项目的控制,但是由于经验不足,对于16路舵机驱动板运用不够熟悉,还有在项目期间遇到很多无法解决的问题,所以就放弃了这个想法。相比之下,使用多块Arduino板来控制会相对简单很多。
到最后版本我选择使用一个Mege板外加两个Uno板,其中Mega板作为上位机,两个Uno板作为下位机。使用串口通信。
- 第一版解决方案:在一个Uno板在控制机械手的时候记录好自己所需要用的时间,Mega板作为上位机,给下位机发出信号后,自己进入延时来等待下位机完成动作。
遇到的问题:如果使用这一方案的话会需要花费大量的时间来记录Uno板每个动作的时间,且容错率低,这一方案会浪费大量时间。 - 第二版解决方案:给他们3个Arduino板一个共同的时间,来控制时间方面。
遇到的问题:对于这里方面没有花费过多的研究,但是让三个时间同步,可以使用Mega板IIC连接两个Uno下位机,但是对于Uno板的IIC地址和通信不是很懂,所以放弃了这一方案。 - 第二版解决方案:借用网络通信的三次握手理念,但是我这里有点改动,就是如果没有接收到下位机的回应就会一直阻塞等待。这样的一个好处就是防止上一个动作还没做完,其他机械手就开始工作了,这样很容易让机械手相撞。
6、注意事项和解决方法
- 有时候代码没错,但是舵机动不了
解决方法(5种情况):- 用一个简单的舵机驱动测试一下那个舵机,是不是单独的那个舵机损坏问题(舵机明显发热等现象)。
- 上面的如果没问题看看是不是舵机的输入电压不够(一般都是这个问题)。
- 检查是不是16路舵机驱动板的问题(检查不动的那个舵机在舵机驱动板上的接口),看看那个16路舵机驱动板的输出口电压是否足够(5V左右的电压)?
- 检查这个舵机所在的舵机驱动板,看看这个驱动板上有没有那种执行起来比较奇怪的舵机(这种舵机它旋转起来转起来感觉很丝滑,不会发出正常舵机的转动的声音),这种舵机会影响16路多级驱动板上其他舵机的信号!
- 接线问题,看看是不是舵机的信号线接触不良引起的。
- 舵机没有被卡住,但是抖动严重
解决方法(检验与排除):
看看连接在同一16舵机驱动板(或者是面包板)上的其他舵机又没右哪个卡住了,某一个卡住的话也会影响其他舵机,这明显的现象就是有的舵机剧烈抖动,但是没有卡住现象。
最后,我在这里总结一下,毕竟有的同学是和我一样使用220V转5V的,一般这种加压器的接线旁边是可以调节输出电压的(一个可以用螺丝刀调节的三极管),所以在使用之前一定一定要先测一下输出电压再接上电路。舵机短时间正负极接错是没有多大问题的,但是接个30s多半就废了。
基于Arduino的智能泡茶机(1)——机械系机械创新比赛总结技术点与不足处相关推荐
- 基于 Arduino 的智能投石机制作
不知大家对投石车有没有印象,所谓投石车即古代攻取城池时用到的一种攻城武器,可把巨石投进敌方的城墙和城内造成破坏.如今创客将过去个头巨大,并不智能的战场投石机变成了精美小巧.智能有趣的玩具投石机.废话不 ...
- 基于Arduino的智能家居系统设计
基于Arduino的智能家居系统设计 一.设计要求 1.利用DHT11温湿度检测模块和光敏电阻采集环境温度.湿度和光强信息: 2.通过Arduino开发板对DS1302时钟模块进行初始设置,并每隔一定 ...
- 基于Arduino的智能洗手机
目录 引言 1 ATMEGA328P 芯片简介 1.1 理论介绍 1.2 芯片引脚定义图 1.3 最小系统制作原理图 2 框架及组成结构 2.1 系统框架 2.2 主要模块介绍 2.2.1 HC-SR ...
- arduino灯光装置_基于Arduino的智能家居灯控系统设计
&能应用 ------ T X 阵 W S 2 8 1 2 全 彩 灯 带 R X 工 G N D r 0 引言 智能家居的概念虽然已经有了几十年,但进入我国并取 得一定发展还是最近几年的事, ...
- 【毕业设计】基于Arduino的智能灌溉系统 - 嵌入式 单片机 物联网
文章目录 1 简介 1 硬件要求 2 项目背景 3 实现功能 4 OLDE显示屏 5 IO扩展器 6 系统构建 7 完整代码 8 最后 1 简介 Hi,大家好,这里是丹成学长,今天向大家介绍一个 单片 ...
- 基于Arduino的智能晾衣架
前段时间,由于个人原因没有及时更新,今天准备写一个基于Arduino的智能晾衣架. 摘要: 智能晾衣架是应用物联网工程技术,通过网络和物品的连接得以控制晾衣架的状态.智能晾衣架通过多个传感器来对外界环 ...
- 基于arduino单片机智能避障小车
基于arduino单片机智能避障小车 思路简介 本文简要介绍了基于arduino单片机智能小车可以通过手机端蓝牙助手对其进行遥控操作'可以切换手动操作和自动避障两个模式,避障基于蝙蝠超声波测距的原理, ...
- 红外测温枪,超进化 -- 智能温度传感器 基于 arduino 的智能测温模块
红外测温枪,超进化!--智能温度传感器!基于 arduino 的智能测温模块. 前言 硬件选择 代码讲解 通过 SDDC 协议接入 Spirit 1 部分 配置设备信息 数据获取与发送流程 融合!特殊 ...
- 基于Arduino的智能家居语音识别系统设计
基于Arduino的智能家居语音识别系统设计 前言: 随着这两年深入中国本土企业,在移动智能终端市场疯狂抢食,英特尔早已"摸清"了中国厂商和市场的情况.现在顺势推出智能 ...
最新文章
- JAVA 和JAVAC命令行
- 常用Oracle系统表查询
- 135. 最大子序和【前缀和 单调队列】
- 使用Chrome快速实现数据的抓取(四)——优点
- subpage新写法
- 【转】Ubuntu中SVN客户端安装+使用
- Nginx编译./configure翻译
- 深入浅出设计模式 ------ Prototype(原型模式)之深度克隆
- 【Matlab绘图】plot3函数绘制三维点或线图
- 最好用的知识库软件合集
- mysql日期相减返回月数_MySql日期相减返回月数_MySQL
- 见证取样员考试题库及答案
- 一文了解RoaringBitmap
- CC00255.CloudKubernetes——|KuberNetes中间件容器化及helm.V02|——|中间件.v02|redis.v5.0.4|ratel方式部署|
- rabbitMQ无法访问web管理页面
- 搜狗2020校招(后端)笔试第一场
- cadence 怎么拼版_一种基于Cadenceskill的快速板卡拼版方法与流程
- 复旦大学软件工程硕士博士学位点被撤销!整理20年被撤销计算机相关的学位点名单...
- Detours: 在二进制代码上截获Win32函数调用
- 世界杯八强即将出炉,iModeluus助您知晓赛果!