作为一名电子爱好者,自己动手制作一些简单的硬件小设备还是非常有趣的。我之前也是发布了《制作HackCube中的坎坎坷坷》。这次带来的是一个简易的频谱仪。
说先要说一下为什么要制作这个小东西。
1. 为了装13
2. 为了看一下附件2.4G频段的信号,尤其是一些使用2.4G频段的航模爱好者,他们使用的遥控器是2.4G的,如果在这个频段范围内有太多的信号,可能会造成一些不可预料的影响。
3. 当然了为了制作这个的最直接的原因是手上有这些模块并且最近在研究频谱仪,频谱仪的价钱还是相当的贵的。制作的过程中,学习一些设备的通信的原理。比如这个里面就有IIC和SPI两种通信协议。
制作的材料:
1. Arduino uno开发板一块(我是用的是uno,当然了你也可以使用Nano等一些其他的开发板)
2. IIC接口的OLED显示屏一块好像是128*64的。淘宝上面有一堆,价钱也不是很贵。我选的是蓝色的,当然还有上半部分是黄色下半部分是蓝色的,你想要什么样的你自己做决定。当然了,你也可以尝试在一些更大的显示设备上面显示(TFT彩屏)
3. 射频模块nRF24L01:这个小东西网上也有很多型号的,什么邮票孔的啦,焊好排针的啦。这个也是随你的。
4. 其他:焊接工具,连接线,电源等
说完基本的硬件设备接下来就是软件问题了。刚刚开始的时候我是准备使用STM32F103制作这个小东西的。但是我发现有点麻烦,因为是寄存器入手32的,配置寄存器实在麻烦,我就想着能不能找一些已经完善的库来开发。我这个时候脑子一热,Arduino里面的集成库那个叫多啊。我就去网上查找了一些这方面的资料。结果不找不知道一找吓一跳。网上已经有大神做出来了。那我就算啦,直接跟着他们做吧。我看了网上有不少版本。
不过都是基于Arduino的,估计是Arduino里面有集成好的库文件吧。
把程序烧入Arduino。就是简简单单的一步,还是有很多人出现问题。
首先第一点就是开发板没选好
我太难了,我把下载好的项目文件发给别人,他们还有人问我为什么下载失败。我过去一看,真的是各种问题。
第二点就是项目的文件不在一个文件夹里面
正常情况下你直接打开IDE文件的时候IDE会自动加载需要的库文件,但是不排除少数情况下,她找不到库文件。
第三,系统缺少库文件,对于我经常使用arduino来说电脑里面很多的库文件都是有的,如果说你在编译的时候出现了编译失败,并且还告诉你缺少了什么库文件,那你就下载相应的库文件吧。我这里还是演示一下吧
要什么库安装什么库。再不行那就去百度问问。
说完了一些错之后我就简单的说一下IIC和SPI的通信协议吧,至于我为什么用IIC的OLED,为什么使用SPI的射频模块。第一点我在网上购买射频模块的时候出来的都是SPI的,所以我也没得选择,不过OLED倒是有很多种,因为IIC的使用的线少,所以我就选择了使用IIC。最主要的是别人开源的里面就使用了IIC的,我不想改代码啦。
说一下IIC:相信很多小伙伴第一次使用IIC的时候应该是单片机开发板上面的EEPROM芯片。当时我学习51单片机的时候,STC89C51没有IIC的专用引脚,只能使用引脚模拟IIC啦。不过这样我感觉对IIC的协议的学习还是非常有帮助的。
工作速率有100K和400K两种;
支持多机通讯;
支持多主控模块,但同一时刻只允许有一个主控;
由数据线SDA和时钟SCL构成的串行总线;
每个电路和模块都有唯一的地址;
每个器件可以使用独立电源
以启动信号START来掌管总线,以停止信号STOP来释放总线;当SCL为高时,SDA下跳为起始信号,上跳为停止信号。
每次通讯以START开始,以STOP结束;
启动信号START后紧接着发送一个地址字节,其中7位为被控器件的地址码,一位为读/写控制位R/W,R. /W位为0表示由主控向被控器件写数据,R/W为1表示由主控向被控器件读数据;
当被控器件检测到收到的地址与自己的地址相同时,在第9个时钟期间反馈应答信号;
写通讯过程:
1. 主控在检测到总线空闲的状况下,首先发送一个START信号掌管总线;
2. 发送一个地址字节(包括7位地址码和一位R/W);
3. 当被控器件检测到主控发送的地址与自己的地址相同时发送一个应答信号(ACK);
4. 主控收到ACK后开始发送第一个数据字节;
5. 被控器收到数据字节后发送一个ACK表示继续传送数据,发送NACK表示传送数据结束;
6. 主控发送完全部数据后,发送一个停止位STOP,结束整个通讯并且释放总线;
读通讯过程:
1. 主控在检测到总线空闲的状况下,首先发送一个START信号掌管总线;
2. 发送一个地址字节(包括7位地址码和一位R/W);
3. 当被控器件检测到主控发送的地址与自己的地址相同时发送一个应答信号(ACK);
4. 主控收到ACK后释放数据总线,开始接收第一个数据字节;
5. 主控收到数据后发送ACK表示继续传送数据,发送NACK表示传送数据结束;
6. 主控发送完全部数据后,发送一个停止位STOP,结束整个通讯并且释放总线;
1. 总线空闲状态
SDA和SCL两条信号线都处于高电平,即总线上所有的器件都释放总线,两条信号线各自的上拉电阻把电平拉高;
2. 启动信号START
时钟信号SCL保持高电平,数据信号SDA的电平被拉低(即负跳变)。启动信号必须是跳变信号,而且在建立该信号前必修保证总线处于空闲状态;
3. 停止信号STOP
时钟信号SCL保持高电平,数据线被释放,使得SDA返回高电平(即正跳变),停止信号也必须是跳变信号。
4. 数据传送
SCL线呈现高电平期间,SDA线上的电平必须保持稳定,低电平表示0(此时的线电压为地电压),高电平表示1(此时的电压由元器件的VDD决定)。只有在SCL线为低电平期间,SDA上的电平允许变化。
5. 应答信号ACK
I2C总线的数据都是以字节(8位)的方式传送的,发送器件每发送一个字节之后,在时钟的第9个脉冲期间释放数据总线,由接收器发送一个ACK(把数据总线的电平拉低)来表示数据成功接收。
6. 无应答信号NACK
在时钟的第9个脉冲期间发送器释放数据总线,接收器不拉低数据总线表示一个NACK,NACK有两种用途:
a. 一般表示接收器未成功接收数据字节;
b. 当接收器是主控器时,它收到最后一个字节后,应发送一个NACK信号,以通知被控发送器结束数据发送,并释放总线,以便主控接收器发送一个停止信号STOP。
地址的分配方法有两种:
1. 含CPU的智能器件,地址由软件初始化时定义,但不能与其它的器件有冲突;
2. 不含CPU的非智能器件,由厂家在器件内部固化,不可改变。
这里的解释还是https://www.cnblogs.com/yan0837/articles/1202374.html
为什么要说这个协议呢,目前IIC的通信相对与其他一些高速的通信协议来说还是比较慢的,我看到过有人通过分析IIC最后逆向破解了一个小设备。大家如果对这方面的资料感兴趣的话,可以自己去找资料看看。
不过在我们这个小项目种就会有一个问题,那就是你买回来的OLED的地址不一样,导致你烧入程序之后不能正常工作。
很多小伙伴问我他的显示屏为什么不显示,我查来查去最后发现他买的IIC的地址和我的不一样,只要在OLED库文件里面修改IIC的地址就好了。
IIC的通信我是玩过了,大概也能根据时序图写一个程序出来,但是SPI还是没有尝试过。在些这篇文章的时候我还不是很了解,所以我这里也不说什么了,怕误导大家。
最近在研究这些代码。
我自己的小设备借给别人玩了。所以也没什么照片放上来,不过我想抽空画一个PCB。做一个简易版。比较就算使用arduino Nano还是有点臃肿,如果有PCB的话,就可以做的非常的小巧。如果有志同道合的人愿意一起搞这些东西的话,我十分开心。
所有的代码在github上面都有。大家可以自己搜索一下。
之前的文章种写过一个HackCube的文章,我自己也买了CC1101的射频模块,我准备有空自己制作一个小的设备,这个小设备就对1Ghz一下的信号进行分析,尤其是对一些固定码的研究,虽然HackCube已经实现了相应的功能但是我还是喜欢自己研究并且开发一下。
说一下这个小设备的效果,她能在2.41G到2.51G范围内不断扫描,然后将有信号的频段通过OLED显示出来。大家不要害怕制作完了之后周围没有2.4G的信号源给你测试,你会发现你家的路由器也是使用2.4G的频段。当然也有不少是5Ghz的。那你可以带上你的小设备去户外看看。
至于我文章中说到的关于IIC的逆向,我在国外的一些视频网站上面看到过,大家自行查找。如果有志同道合,对硬件,和硬件安全感兴趣的朋友可以留言哦。
至于这个小设备准不准,那我也不清楚,因为我也没有设备测量,只能提供参考吧。如果有人想打板子做的话也可以的。
*本文原创作者:LEdge1,本文属于FreeBuf原创奖励计划,未经许可禁止转载