1、智能泡茶机项目需求

1.1、目标项目需求(总体:机械结构+电控)

  1. 机械为主、电控为辅。
  2. 突出机械部分创新点。
  3. 项目主要机械部分需要ANSYS有限元分析。
  4. 符合时代智能家居的理念。

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占用

注意:

  1. Arduino的供电问题:Arduino的供电问题:因为在泡茶及运行的时候,我们不可能说是把Arduino板连接在电脑上面运行,所以我们这里的解决方案就是拿充电插头给Arduino板供电,或者使用稳压模块来给Arduino来供电。
  2. 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板作为下位机。使用串口通信。

  1. 第一版解决方案:在一个Uno板在控制机械手的时候记录好自己所需要用的时间,Mega板作为上位机,给下位机发出信号后,自己进入延时来等待下位机完成动作。
    遇到的问题:如果使用这一方案的话会需要花费大量的时间来记录Uno板每个动作的时间,且容错率低,这一方案会浪费大量时间。
  2. 第二版解决方案:给他们3个Arduino板一个共同的时间,来控制时间方面。
    遇到的问题:对于这里方面没有花费过多的研究,但是让三个时间同步,可以使用Mega板IIC连接两个Uno下位机,但是对于Uno板的IIC地址和通信不是很懂,所以放弃了这一方案。
  3. 第二版解决方案:借用网络通信的三次握手理念,但是我这里有点改动,就是如果没有接收到下位机的回应就会一直阻塞等待。这样的一个好处就是防止上一个动作还没做完,其他机械手就开始工作了,这样很容易让机械手相撞。

6、注意事项和解决方法

  • 有时候代码没错,但是舵机动不了
    解决方法(5种情况):

    • 用一个简单的舵机驱动测试一下那个舵机,是不是单独的那个舵机损坏问题(舵机明显发热等现象)。
    • 上面的如果没问题看看是不是舵机的输入电压不够(一般都是这个问题)。
    • 检查是不是16路舵机驱动板的问题(检查不动的那个舵机在舵机驱动板上的接口),看看那个16路舵机驱动板的输出口电压是否足够(5V左右的电压)?
    • 检查这个舵机所在的舵机驱动板,看看这个驱动板上有没有那种执行起来比较奇怪的舵机(这种舵机它旋转起来转起来感觉很丝滑,不会发出正常舵机的转动的声音),这种舵机会影响16路多级驱动板上其他舵机的信号!
    • 接线问题,看看是不是舵机的信号线接触不良引起的。
  • 舵机没有被卡住,但是抖动严重
    解决方法(检验与排除):
    看看连接在同一16舵机驱动板(或者是面包板)上的其他舵机又没右哪个卡住了,某一个卡住的话也会影响其他舵机,这明显的现象就是有的舵机剧烈抖动,但是没有卡住现象。

最后,我在这里总结一下,毕竟有的同学是和我一样使用220V转5V的,一般这种加压器的接线旁边是可以调节输出电压的(一个可以用螺丝刀调节的三极管),所以在使用之前一定一定要先测一下输出电压再接上电路。舵机短时间正负极接错是没有多大问题的,但是接个30s多半就废了。

基于Arduino的智能泡茶机(1)——机械系机械创新比赛总结技术点与不足处相关推荐

  1. 基于 Arduino 的智能投石机制作

    不知大家对投石车有没有印象,所谓投石车即古代攻取城池时用到的一种攻城武器,可把巨石投进敌方的城墙和城内造成破坏.如今创客将过去个头巨大,并不智能的战场投石机变成了精美小巧.智能有趣的玩具投石机.废话不 ...

  2. 基于Arduino的智能家居系统设计

    基于Arduino的智能家居系统设计 一.设计要求 1.利用DHT11温湿度检测模块和光敏电阻采集环境温度.湿度和光强信息: 2.通过Arduino开发板对DS1302时钟模块进行初始设置,并每隔一定 ...

  3. 基于Arduino的智能洗手机

    目录 引言 1 ATMEGA328P 芯片简介 1.1 理论介绍 1.2 芯片引脚定义图 1.3 最小系统制作原理图 2 框架及组成结构 2.1 系统框架 2.2 主要模块介绍 2.2.1 HC-SR ...

  4. arduino灯光装置_基于Arduino的智能家居灯控系统设计

    &能应用 ------ T X 阵 W S 2 8 1 2 全 彩 灯 带 R X 工 G N D r 0 引言 智能家居的概念虽然已经有了几十年,但进入我国并取 得一定发展还是最近几年的事, ...

  5. 【毕业设计】基于Arduino的智能灌溉系统 - 嵌入式 单片机 物联网

    文章目录 1 简介 1 硬件要求 2 项目背景 3 实现功能 4 OLDE显示屏 5 IO扩展器 6 系统构建 7 完整代码 8 最后 1 简介 Hi,大家好,这里是丹成学长,今天向大家介绍一个 单片 ...

  6. 基于Arduino的智能晾衣架

    前段时间,由于个人原因没有及时更新,今天准备写一个基于Arduino的智能晾衣架. 摘要: 智能晾衣架是应用物联网工程技术,通过网络和物品的连接得以控制晾衣架的状态.智能晾衣架通过多个传感器来对外界环 ...

  7. 基于arduino单片机智能避障小车

    基于arduino单片机智能避障小车 思路简介 本文简要介绍了基于arduino单片机智能小车可以通过手机端蓝牙助手对其进行遥控操作'可以切换手动操作和自动避障两个模式,避障基于蝙蝠超声波测距的原理, ...

  8. 红外测温枪,超进化 -- 智能温度传感器 基于 arduino 的智能测温模块

    红外测温枪,超进化!--智能温度传感器!基于 arduino 的智能测温模块. 前言 硬件选择 代码讲解 通过 SDDC 协议接入 Spirit 1 部分 配置设备信息 数据获取与发送流程 融合!特殊 ...

  9. 基于Arduino的智能家居语音识别系统设计

    基于Arduino的智能家居语音识别系统设计 前言:       随着这两年深入中国本土企业,在移动智能终端市场疯狂抢食,英特尔早已"摸清"了中国厂商和市场的情况.现在顺势推出智能 ...

最新文章

  1. JAVA 和JAVAC命令行
  2. 常用Oracle系统表查询
  3. 135. 最大子序和【前缀和 单调队列】
  4. 使用Chrome快速实现数据的抓取(四)——优点
  5. subpage新写法
  6. 【转】Ubuntu中SVN客户端安装+使用
  7. Nginx编译./configure翻译
  8. 深入浅出设计模式 ------ Prototype(原型模式)之深度克隆
  9. 【Matlab绘图】plot3函数绘制三维点或线图
  10. 最好用的知识库软件合集
  11. mysql日期相减返回月数_MySql日期相减返回月数_MySQL
  12. 见证取样员考试题库及答案
  13. 一文了解RoaringBitmap
  14. CC00255.CloudKubernetes——|KuberNetes中间件容器化及helm.V02|——|中间件.v02|redis.v5.0.4|ratel方式部署|
  15. rabbitMQ无法访问web管理页面
  16. 搜狗2020校招(后端)笔试第一场
  17. cadence 怎么拼版_一种基于Cadenceskill的快速板卡拼版方法与流程
  18. 复旦大学软件工程硕士博士学位点被撤销!整理20年被撤销计算机相关的学位点名单...
  19. Detours: 在二进制代码上截获Win32函数调用
  20. 世界杯八强即将出炉,iModeluus助您知晓赛果!

热门文章

  1. 数据加密存储---加密文件系统(EFS)介绍
  2. IDEA代码放大缩小快捷键设置、注释、标识符以及关键字。
  3. 【解决】如何线上申请电子版的招商银行卡 | 在线申请招商银行的一网通账户
  4. iOS 视频录制流程解析
  5. 大疆2019届秋招笔试--测试工程师
  6. 基于SSM框架的外卖订餐系统
  7. 台式计算机连wifi,台式电脑怎么连wifi
  8. linux 编译器制作,Linux交叉編譯器的制作(一)
  9. 悬挂式Notification 停留几秒后自动消失 且保留状态栏的通知(自定义消息)
  10. 机器人会偷走你的饭碗吗——写作篇