电子说
步骤1:零件列表
为了便于指导,我正在使用以下零件:
您可能需要这些
二进制手轮或指轮开关。这些可以在在线的主要电子商店购买,或者如果您在科罗拉多州,请查看Boulder的J.B. Saunders。他们便宜地买了它们!
无焊面包板
烙铁,焊料,连接线(我使用24规格绞线是因为它非常易弯曲)
AVR微控制器
我正在使用ATmega328p,它位于Modern Device裸露的主板上
我正在使用USB BUB对AVR进行编程
可选
四个LED(用于说明编码)
四个电阻(用于LED。我使用了我已经在板凳上摆了200欧姆(我很懒惰 2 ))
现代设备]
如果您要使用四个二极管关于将反向极性插入MCU引脚的偏执狂
一些用于编写或编译固件的东西
我使用AVR Studio 4.16 SP1,但是您也可以使用:
Windows
WinAVR进行Windows AVR开发
FreeBSD/Linux(其他* NIX变体)
pkg_add -r avr-gcc -or- cd /usr/ports/devel/avr-gcc/ && make install clean pkg_add -r avr-libc pkg_add -r avr-gdb
对于Linux,您将安装相同的东西,但使用特定的粒子包管理实用程序。
Mac
我在这里没有经验,所以我建议Ladyada的教程为此。
您可能还希望使用其他实用程序,例如Eclipse,但这应该是一个好的开始。
现在您已经知道需要什么,我们将其组合在一起,但是要做到这一点,您需要知道二进制开关的工作方式。..。.所以让我们继续下一步吧!
第2步:二进制开关和真实表
正如我在简介中简要提到的,二进制开关是对其进行编码的开关状态为二进制。二进制是一种使用两个离散状态(一个和零)来表示其他符号的编码方法。每个一个或零称为一个“位”,这些位通常串在一起分成八组,称为一个“字节”。并非字节中的所有位都必须用于编码,但是ASCII字符集是仅使用7位的显着示例(存在扩展版本)。此指令中的按钮开关的范围是0到15,并使用四位对表盘上的数字进行编码。
简短的二进制算术
以了解四位如何表示16种不同的数字数字,我们必须稍微了解一下二进制编码对该开关的作用(以及一般情况)。
从第一张图片中,您应该能够看到实际上从键盘背面有五个打击垫开关。这些分别标记为1、2、4、8和C。C被视为公用端子。也就是说,它是开关电路的一部分,始终与开关中打开的任何开关相连。在我的设置中,我将“ C”垫接地,并且任何电流都将从断开的开关流出,并从C端子流出并向下流至地面。因此,“ C”盘不会对表盘正面的数字进行编码时所用的位。这是指轮开关内部开关电路的电流吸收器。
1、2、4和8填充对数字的位进行编码。以二进制形式,字节中1和0的位置和数字用于确定字符集中单个单元的身份,或者出于我们的目的,确定在表盘上选择的数字。因为我们的集合中有四个位,所以一和零的唯一组合的最大数量为2 4 =16。记住这一点的最佳方法是增加可能性的数量(这里有两个可能性:1或0)乘以位数(此处我们有4位:填充1、2、4和8)。如果我们要在四个位置写出1和0的所有唯一组合,则看起来像这样:
No 1&aposs One 1 Two 1&aposs Three 1&aposs Four 1&aposs ------ ----- ------- --------- -------- 0000 0001 0011 0111 1111 0010 0101 1011 0100 1001 1101 1000 0110 1110 1010 1100
所以我们有16种独特的可能性来安排0和1,并且方便地,此开关的计数器从0到15。当一个计划组合在一起时,这很好。但是您可能想知道,是否存在一种模式来说明这四个位的排列方式(顺便称为Nibble)如何代表数字。我很高兴你问。
还记得垫的1、2、4和8吗?那不是营销人员反复无常的标签。让我们再次看看我们的数字模式。每个位位置都有一个“位置”,可以将其视为“ 2的幂”位置读取,其中最低有效位在第0位开始。也就是说,我们使用从0开始的索引,并从零开始计数到一,再到二,以此类推,而不是在以1开头的白话中计数。因此,2 0 = 1,2 1 = 2,2 2 = 4,依此类推。从右到左排列此字符,它的四位模式0101看起来像这样:
Place --》 8 4 2 1 0 1 0 1
要确定“ 0101”代表的数字,我们要做的就是找到每个里面有1的地方,加上两个数字的幂。在我们的示例中,第1和第4位有一个。加1 + 4,得到5,因此,二进制数字0101代表十进制数字5。这不令人兴奋吗?让我们尝试另一个,即使我们的交换机只有四个位,这个也要完整的8位。这是一个好习惯,下次您会印象深刻。
01101110代表的十进制数字是多少?在这里是它们的位置:
128 64 32 16 8 4 2 1 0 1 1 0 1 1 1 0查找具有1的位置,并将这些位置号加在一起。那将是64 + 32 + 8 + 4 + 2 =110。非常容易,是吧?现在知道了这一点,我们就可以采用我们的4位开关,并形成一个相对于小数点为1的引脚号矩阵(数字逻辑1的电压高于逻辑零的电压,在我们的情况下分别为5V和0V)。他们代表的数字。参见下面的第二张图片,我制作了一个表格来表示开关上的打击垫,根据拨盘前面选择的数字,该打击垫将为逻辑1。现在我们可以开始构建东西了。请跟随我进入下一步!
步骤3:焊接开关和测试二进制逻辑
是时候将焊料放到焊盘上了,开始制造东西了。
拿起连接线,剥去两端约半厘米。只要使用不会混淆电线的颜色,无论使用哪种颜色或根本不使用其他颜色都没有关系。当您发现填充板“ 2”代替填充板“ 4”时,您将尝试调试二进制逻辑错误。
现在是验证或说服自己二进制逻辑正确的好时机。为此,我带了四个LED和四个220欧姆电阻,并将它们放在面包板上。您可以根据您的LED颜色和正向电压要求使用180欧姆甚至1k电阻。对于您的电源,您可以使用5V稳压电源(在其中一张照片中,这是我的面包板上悬挂的小电路),也可以通过Arduino,BBB等为该板供电。选择是您自己选择。
将C线连接到5V(请注意这一点,因为在连接到微控制器时会做相反的事情)。
连接线1、2、4 8个至自己的电阻,其后接LED的正极。如果您不确定,那是长腿。然后将LED的另一侧接地。
该电路应类似于我下面的电路。如果您真的不确定,请在图片中包含原理图以显示LED测试电路。还请注意,我在图片中从左到右显示了二进制文件。只要电线连接到正确的LED,就可以将电线从左到右或从右到左连接到测试电路中,并且可以将它们与真值表进行比较以确认逻辑,这无关紧要。
一旦您确信该Universe可以按照您可以连接微控制器的方式正常运行。
第4步:连接微控制器并加载代码
选择MCU上空闲的四个端口并将其配置为输入。我在设置中选择了PD [2..5],但是选择哪一个都没关系,如果您打算使用U(S)ART通信,请谨慎使用PD [0..1],因为这些引脚是通常为此保留。我很确定Arduino和其他克隆也将针脚0和1映射到其USB FTDI端口。作为一种可选措施,您可以选择安装二极管(在右侧条纹下方的图片中)。有些主板具有保护功能,但是如果您在主板上玩裸AVR芯片,那可能不是个坏习惯。在闻到足够多的晶体管烧毁之后,您便可以执行这些操作。
建立与输入引脚的连接后,只需简单地读取引脚并处理数据即可。您可以读取引脚和发光二极管的指示灯,用于处理串行通信的设置中断,或者如果将多个开关串在一起,则可以将它们用作电子锁,在授予访问权限之前测试引脚以查看是否输入了正确的组合
第5步:[可选] AVR代码示例
好的,好的,我不会让您挂断电话。我认为您可能都具备读取I/O引脚的能力,因此这并不意味着侮辱您的智慧。这只是我写的一小段代码,用于读取引脚并通过ATmega328p中的USART将数据发送到FreeBSD盒上的串行端口。
我不使用Arduino库,仅使用纯C语言,因此您可能必须相应地调整您的。也许有一种更优雅的方法,但这是我想出的。
#include #include #include “uart.h”#define SWITCH_M 0b00111100int main(){ USART_init(BAUD_9600); DDRD = 0x00; // inputs for switches PORTD = 0xFF; // pullup on PD[2..5] (we have negative logic on switch now) uint8_t bcode = 0x00; for (;;) { bcode = (PIND & SWITCH_M); // bcode = 00xxxx00 bcode = (bcode 》》 2); // bcode = 0000xxxx bcode |= 0xF0; // bcode = 1111xxxx USART_tx(~bcode); // bcode = 0000xxxx bcode = 0x00; _delay_ms(2000); } }
从我的车轮开关从0开始并循环向上,我得到以下输出:
0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B 0x0C 0x0D 0x0E 0x0F
全部0条评论
快来发表一下你的评论吧 !