极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 26263|回复: 13

世界最小的Arduino——ATTiny13上手全攻略2C舵机测试仪

[复制链接]
发表于 2015-9-7 16:00:03 | 显示全部楼层 |阅读模式
本帖最后由 幻生幻灭 于 2017-2-15 10:42 编辑

系列教程传送门
世界最小的Arduino——ATTiny13上手全攻略1A简介
世界最小的Arduino——ATTiny13上手全攻略1B在Arduino IDE环境下的搭建
世界最小的Arduino——ATTiny13上手全攻略1C用Arduino来下载
世界最小的Arduino——ATTiny13上手全攻略2A跑马灯
世界最小的Arduino——ATTiny13上手全攻略2B呼吸灯
世界最小的Arduino——ATTiny13上手全攻略2C舵机测试仪
世界最小的Arduino——ATTiny13上手全攻略3A冬日雪花

本实验我们将教大家制作一款简单的舵机测试器





如图是网上常见的一款舵机测试器。其主要功能是可以切换三种不同的工作模式,通过旋钮电位器调节舵机角度的手动模式,中位测试模式和像雨刷一样往返摆动的自动模式。整体硬件有1个电位器模拟量输入,1个模式切换按钮开关数字量输入,3个LED模式状态指示灯和1路PWM舵机控制脉冲输出(图中显示CH1到CH3实际是一路PWM输出)。而我们要做的是其中的自动模式,只要能测试舵机进行往复摆动即可。




(图片转自MAKE杂志19期中网友Tod E. Kurt的文章)
在正式开始之前,我们先简单的普及下舵机的基础知识。舵机的分类有两种,数字舵机和模拟舵机。数字舵机比模拟舵机多了个主控,所以响应速度等性能大幅提升,但价格也增加了,不过这种舵机不在我们这次实验的范围内。下面我们主要围绕可180°旋转的模拟舵机进行试验,从硬件接线上看,舵机一般都是由电源,接地和控制信号这三根线组成。常见的两种接线颜色定义如下图,市面上最常见的都是第二种棕红橙。

要想控制模拟舵机,就要明白其运行原理。舵机系统通过控制信号线接收来自单片机的可变宽度的脉冲信号来进行角度控制,但其频率是一定的,即调幅等频脉冲。一般来说,舵机的基准信号周期为20ms,不同的脉冲宽度决定了舵机的角度。脉冲宽度的范围从0.5ms到2.5ms对应的就是舵机0到180°。但这也不是绝对的,有的厂商采用1ms到2ms的脉冲范围。但绝大部分舵机的中点都是1.5ms,具体数据需要查阅舵机的产品手册或者进行角度测试。


为了进一步的论证舵机控制原理,我们先下载Arduino软件的舵机样例File  Examples  Servo  Sweep到一个Arduino UNO中去,舵机实际的测试效果还不错。然后用Saleae Logic逻辑分析仪对其IO口的状态进行监控。由测量结果可知,舵机的运行周期和理论周期20ms一致。舵机在某一摆动时刻的脉冲宽度为1.4ms,应该是接近中点的位置。


因为目前没有支持ATTiny13的Arduino舵机库,所以我们可以根据以上的控制原理,自己写一个控制舵机的函数了。大体的控制思路就是将舵机的输入角度0到180°映射到0.5ms到2.5ms的高电平,然后再输出(20-高电平时长)毫秒的低电平,重复发送多次来实现调幅等频脉冲。


写完之后我们先在Arduino UNO测试了一下,舵机的控制没有问题。从测量结果中可以看出周期比标准值多了1ms,但并没有影响舵机运动。


本想把在UNO测试过的代码直接下载到ATTiny13的控制器内,结果软件报警说程序太大,存储空间不足。总程序占用1046 Bytes,比系统空间1024 Bytes还多出好几十字节。


无奈之下只好对程序进行删减。但删减后的程序功能比较弱,只能实现到达指定的舵机角度。舵机的角度需要手动修改变量然后重新下载程序后才会有效。程序下载成功后可以开始搭建硬件电路了。本实验整体接线比较简单,舵机的三根线分别接VCC,GND和ATTiny13的D4端口即可。


好不容易瘦身成功,没想到自从连上舵机以后,舵机大部分时间都在不停的抖动,主轴偶尔会动弹两下,而且全程伴随着各种噪音。

(缩减功能后的代码是1014 Bytes)
关于舵机发出的声音,大家要仔细判断。一般有三种,主轴快速旋转时齿轮的声音是连续而且比较尖锐的;主轴在某个位置微调时齿轮的声音是断断续续的哒哒声;还有一种是超程时的声音,舵机本体会严重的抖动,而且齿轮有比较沉闷的呜呜声。其中前两种声音都是正常的,如果舵机质量较好且控制信号源的脉冲稳定的话,第二种声音则几乎听不到。而第三种声音是最伤舵机的,应该立即断开舵机与单片机的连接,然后修改程序,缩小行程范围(即提高脉冲高电平持续时间的最小值或最大值)以便解决问题。


为了解决抖动和噪音的问题,我们用逻辑分析仪先看一下ATTiny13的输出波形,发现其输出的周期已经达到了26ms,远远超过标准的20ms周期。即使通过修改延时参数,也很难将其周期控制在20ms之内。大家还记得我们在上一篇教程中开篇提到的ATTiny13支持函数清单么?其中delayMicroseconds() 后面是有“*”号,官方说对这个函数的支持是有限的,也就是说延时会有误差。不过us级的MCU会有ms级的误差,倒是有些让人意外。于是笔者又单独用Arduino样例代码中的Blink在ATTiny13环境下测试了一下delay()函数。一个1s的延时,实际测量是1.3s也是有一定误差的。更悲剧的是这两种延时的误差都是非线性的,多次测量其稳定性也不太理想,我也是醉了。如此看来用延时函数制作简单的功能还可以,如果需要精确定时就不要考虑了。


(采用寄存器操作后的代码是644 Bytes)
这个舵机小实验就这样停滞了好几天,实在没辙了,只好尝试去从AVR单片机的底层寻找解决方案。最终我们通过采用定时器的寄存器操作不仅解决了舵机脉冲控制信号不准的问题,还仅用了644 Bytes就实现了之前预期的摆动功能。这和先前的写到溢出都实现不了摆动功能相比可以说是质的飞跃了。照目前的程序容量推测,即使实现那种舵机测试器的全部三个功能也应该不是问题。我们监控一下其波形,基本算是比较理想。舵机当前位置大概在170°左右。实际测试舵机的转动也是比较理想的,往返运动都比较顺畅。


我们在程序中首先定义了一些变量,其中有两个参数是需要大家根据自己舵机实际测试的效果进行微调的,“int pulseStartPoint = 7; ”和“int pulseEndPoint = 22;”该变量表示高电平脉冲的持续时间,最小值是5,最大值是25。如果大家在测试舵机时发现其明显抖动,正如前面所述的第三种声音时,应该将其值进行调整,避免损坏舵机。然后我们setup()中定义了输出和定时器,在loop()中通过对输出脉冲的占空比进行调节,实现了舵机往复摆动的运动。而在定时器中,我们使用了大量的寄存器操作,大体的意思就是让单片机的定时器可以在20ms内实现波形占空比的调整。

大家还记得在上一个实验的最后,我们提到的寄存器么?其实寄存器在Arduino的字典里是不存在的事物,就好像一堆奇怪的大写字符。笔者在玩Arduino的这几年里都不曾“遇见过”寄存器。但如果细心的读者翻开各种Arduino库的话,相信里面多少都能看到寄存器的影子,例如我们之前提到过的AnalogWrite()函数。寄存器虽然不是最方便的功能,但却是非常高效和节省空间的。当然,本教程的侧重点是实验过程,寄存器的详细功能不在我们讨论的范围内,感兴趣的小伙伴可以查阅ATMEL官方的ATTiny13的Datasheet手册。

样例代码



参考资料
果壳网DIYer修炼:舵机知识扫盲:http://www.guokr.com/article/5292/
极客工坊舵机详解:http://www.geek-workshop.com/thread-70-1-1.html
模型中国伺服马达原理与控制,模拟舵机与数字舵机的区别以及常见问题解决方法(资料):http://bbs.mx3g.com/thread-172006-1-1.html

精彩内容,稍后继续!
预告:ATTiny13上手全攻略3A串行74HC595控制

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2015-9-7 17:19:12 | 显示全部楼层
还是定时器比较准,另外,这家伙没有晶振,怎么能知道定时器的时间?
回复 支持 反对

使用道具 举报

发表于 2015-9-7 18:03:23 | 显示全部楼层
太好了, 大大把舵機的測試也做出來了.  
大大會否進一步嘗試 i2c 通訊, 可以的話, 就可以做一個小模塊, 把一般舵機變成總線舵機了.
回复 支持 反对

使用道具 举报

发表于 2015-9-7 18:17:40 | 显示全部楼层
有少少問題,

"大体的控制思路就是将舵机的输入角度0到180°映射到0.5ms到2.5ms的高电平,然后再输出(20-高电平时长)毫秒的低电平,重复发送多次来实现调幅等频脉冲。"

但程式中是
int myangle=map(_angle, 0, 180, 500, 2000);

最後一個 parameter,  是否應該填上 2500?  (是最大值而不是變化範圍)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-7 22:58:21 | 显示全部楼层
164335413 发表于 2015-9-7 17:19
还是定时器比较准,另外,这家伙没有晶振,怎么能知道定时器的时间?

内部晶振,第一篇文章提过,但是精度不是很准的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-7 22:59:12 | 显示全部楼层
Super169 发表于 2015-9-7 18:03
太好了, 大大把舵機的測試也做出來了.  
大大會否進一步嘗試 i2c 通訊, 可以的話, 就可以做一個小模塊, 把 ...

我也想呢,不过i2c底层操作太多了。。。担心自己搞不定呢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-7 23:00:07 | 显示全部楼层
Super169 发表于 2015-9-7 18:17
有少少問題,

"大体的控制思路就是将舵机的输入角度0到180°映射到0.5ms到2.5ms的高电平,然后再输出(20 ...

那只是个样例,实际上不同厂家舵机脉冲和角度都会有些许差别,有的达不到180度的。
回复 支持 反对

使用道具 举报

发表于 2015-9-8 01:05:12 | 显示全部楼层
幻生幻灭 发表于 2015-9-7 22:59
我也想呢,不过i2c底层操作太多了。。。担心自己搞不定呢

我在網上也找到一些 i2c 的例子, 但大多不是用 arduino IDE, 是用 c 語言的.  不知要如果放進去.
有機會也想嘗嘗, 只要有了一個通訊渠道, ATtiny13 就可以變成一個轉介的模塊, 用便宜及簡單的東西, 把不同的設備轉成 i2c 設備.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-8 07:50:45 | 显示全部楼层
Super169 发表于 2015-9-8 01:05
我在網上也找到一些 i2c 的例子, 但大多不是用 arduino IDE, 是用 c 語言的.  不知要如果放進去.
有機會 ...

大家可以一起研究下,我对这个也蛮感兴趣的
回复 支持 反对

使用道具 举报

发表于 2015-9-8 10:54:27 | 显示全部楼层
幻生幻灭 发表于 2015-9-8 07:50
大家可以一起研究下,我对这个也蛮感兴趣的

有 大大的幫忙, 當然是最好的了.

再三研究網上有關資料, 原來之前看到的 ATtiny I2C 例子, 都是 ATtiny85 為主的.
初時以為同樣是 ATtiny  8 pin 系列, 分別不大, 再細心看看, 原來 ATtiny13 只有 64 byte 的 SRAM 及 EEPROM, 本身亦沒有 TWI device, 看來要一定的難度, 真的很有挑戰性.



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-8 13:53:25 | 显示全部楼层
Super169 发表于 2015-9-8 10:54
有 大大的幫忙, 當然是最好的了.

再三研究網上有關資料, 原來之前看到的 ATtiny I2C 例子, 都是 ATtin ...

是呢,但Tiny85在国内的价格赶上Mega8了
回复 支持 反对

使用道具 举报

发表于 2015-9-9 15:43:43 | 显示全部楼层
幻生幻灭 发表于 2015-9-7 22:58
内部晶振,第一篇文章提过,但是精度不是很准的

受温度影响,不过应该可用,就像51单片机
回复 支持 反对

使用道具 举报

发表于 2016-7-13 20:53:28 | 显示全部楼层
幻生幻灭 发表于 2015-9-7 22:58
内部晶振,第一篇文章提过,但是精度不是很准的

你好我想问一下,ATTINY13外部晶振怎么连接,他只有一个CLKI,是接有源晶振吗?能不能帮我看看
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-14 09:44:33 | 显示全部楼层
gzm 发表于 2016-7-13 20:53
你好我想问一下,ATTINY13外部晶振怎么连接,他只有一个CLKI,是接有源晶振吗?能不能帮我看看

没结果晶振。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 10:06 , Processed in 0.050656 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表