程序员开发实例大全宝库

网站首页 > 编程文章 正文

Arduino入门 第五节 摇摇棒(arduinops2摇杆)

zazugpt 2024-10-24 19:34:00 编程文章 24 ℃ 0 评论

本期课程开始学习摇摇棒的基本原理,这是一个摇摇棒最基础的"模型",在"来回摆动"时只能显示对称图形,只有在不改变运动方向的情况下才能显示非对称图形。这是由于到本期课程为止,我们只学习了数字引脚的输出,对于外部数据的采集还未涉及到,因此还不能对摇摇棒的方向进行控制,在后期的课程中,我们将用更为"高级"的方法来实现流水灯、摇摇棒。

下面进入正题,什么是摇摇棒?其实就是通过快速摇摆一列LED灯来显示一个图案或者字符。人眼在观察景物时,光信号传入大脑神经,需经过一段短暂的时间,光的作用结束后,视觉形象并不会立即消失,这种残留的视觉称"后像",视觉的这一现象则被称为 "视觉暂留",比如在夜晚时,握着一个手电筒画圈,我们的眼睛可以看到一个"光圈"。摇摇棒就是利用了"视觉暂留",用LED的亮灭来组合对我们想要显示的图案进行"逐列扫描",利用每一列的视觉暂留来让我们看到一个图案。而每一列的亮灭组合,我们就可以利用上一期课程中流水灯状态编码的方法来实现。接下来,我们用"最原始"的方法来制作一个摇摇棒。

首先,我们建立一个表格,表格的行数为17行,其中最下方一行用于保存列图像的十六进制编码,列数则根据需要显示的图像而定,例程中我们设计17列,即显示的图像长17个像素点,高16个像素点,在这个17x16的区域中,我们用"1"填出我们要显示的图像(即亮起的部分),其余部分用"0"填充。在下表的第一列中,标上了位置序号0-15,其中0号与我们摇摇棒的第0号LED对应,填好后,我们按列取出二进制编码进行转换,其中编号为0的位为最低位,将转换好的十六进制编码填在这一列的最下方。这个设计转码的过程其实可以很简便的,网上可以找到很多"取模软件",实际上就在里面设计图形或者文字,然后我们需要的编码是自动转换出来的,而我们这里是学习它的基本原理,因此通过手动转换深入学习一下这个过程。转换好编码后,我们就可以开始设计程序了,在程序中我们也将用到这些转换好的编码。

接下来,给出示例代码:

程序说明:从程序中我们可以看到,基本的变量定义:引脚定义、编码,与流水灯程序是一致的,并且"setup"里面的操作也是一样的。编码数组code[ ]中的所有元素即构成了一副完整的图像,每一个元素则代表图像的1列,与编码转换表比较我们发现code[ ]中的编码在头尾各加了两个"0x0",它的作用是避免两个图像"粘连"。在本节的代码中,将LED的状态更新放到了一个子函数中:led_display(),这个函数包含三个入口参数,第一个参数n决定了一幅图像显示的次数,它是为了方便多幅图像轮流显示时可以控制每一幅图像显示的时间或次数(本例中只做了一幅图像);第二个参数则为图像的长度,也就是图像的列数(图像的高度-行数是固定的16,这个与灯板LED的位数有关),列数取决于code[ ]的中元素的个数,在调用函数时,以sizeof()将code[ ]的字节数传给此参数,在程序中将此参数除以2,便得到了code[ ]中的元素个数(code[ ]中一个元素占两个字节的存储空间,sizeof()得出是字节数,是元素个数的两倍)。参数三为一个指针,它可以指向当前"放入"的数组(关于指针的操作,可以参看C语言程序设计的指针部分)。建立这样的一个子函数,就可以灵活地切换显示的图像了。

以上代码是针对"共阴极"连接的电路,如果要让它去驱动"共阳极"连接的电路,是不是需要对程序进行"大改"呢?其实不用,我们只需将子函数中的:

"digitalWrite(pin[j],bitRead(a[i],j))"

改为:"digitalWrite(pin[j],bitRead(~a[i],j))"

也就是在a[i]的前面加上了符号"~",这是一个运算符,它的作用是按位取反,即原来是1则取反为0,原来是0则取反为1,如果将0x01(00000001)按位取反,则得到的便是0xfe(11111110)。上一节的流水灯程序也可以用这个方法来进行修改。我们也可以让改过的代码在共阴极的电路上运行,看看会得到什么效果。

本期课程就讲到这里,下一期我们将继续玩"灯"-呼吸灯。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表