定下功能
愿星空
因为学期前的暑假还有刚开学的时候都在做 愿星空 (一个用来许愿的地方,启发于让我很惊讶的许愿墙网页——真的是每天都有很多人在上面许愿),本着把做过的事情和打算要做的事情结合起来的原则,便决定做一个和愿星空 有关系的东西。
脑子里面的一个小揪揪
有几次独自在晚上的地铁上用手机听音乐听到没电的经历,戴着耳机却没有声音从中出来,只有旧地铁和轨道摩擦发出的声音,哐哧哐哧。手抓着耳机插头,想着要是地铁能有一些耳机插孔,而每一个插孔都能播放不同的歌曲,这个时候我就能够被“拯救了”。
以这个为起点,我开始对“遍地皆是的能和人产生不可预知的互动器件网络”这个概念开始感兴趣,笔头落下,想到一个简单可行的例子,将一种“特别”的二维码贴到北京的各个地铁站里,这种二维码链接着不同散文,每扫一次能够随机获得其中一篇散文。
还有一个不太实际的例子(模仿《her story》),同样是链接到文字上,但每一个二维码背后是一个被合理地拆分的故事的一个片段,扫码能够获得其中一个片段,如果想要了解更多,则需要根据手上的片段选取关键词来在一个经过设计的搜索系统中进行搜索,其中只有被人扫码获得过的片段才能被搜索的,如果想要阅读某个片段,则有两个方式:1. 和片段拥有者交换手上的片段。2. 在某时某地去扫某个特定的二维码
后台在这期间能够不断地修改、添加故事片段,对体验进行调控。
模仿得再不要脸一点的,那二维码背后可以放像《放逐之日》- 凉炘一样是个记者追查某个未知事件的采访记录,这样确实是比较合适的。
定
话说多了。总之大概那么想了一下,便决定做个简单的许愿器件。
一些很有用的笔记
顶层宏观分析
选型
- 初学者还是使用比较常用的社区比较完备的芯片吧
电源相关
- 低功耗器件两个常见的电压: 5V 、3.3V
- USB : 5V
多数CPU、内存的工作电压:3.3V
- 5V 的 2/3
难度系数
原理图 > PCB
- 原理图依靠 知识 和 经验
- PCB
原理图
器件连接
- 可以参考芯片的参考设计
- 文档中
- 设计范例
- 分享的设计文件
PCB
地 和 电源 的线尽量的宽
- 不低于50mil
- 过孔不要太小
没有被使用的引脚
- 可以引导插座上方便将来拓展用
- 电源
电阻、电容...
- 0603型号
如果再做感觉依然是个难点的地方
选合适器件
- 避免功能过剩
原理图绘制
器件之间的连接
- 引脚的之间连接
- 以及连接的电阻、电容等其他的值
PCB
- 器件的PCB获取/绘制。
硬件设计
硬件选型
功能分析:
输入:
- 音频模拟信号
输出:
- wifi上传音频PCM数据(或别的)
处理:
- ADC、
- WIFI传输、
- 处理器、
- 小按键
硬件挑选:
老师上课教导我们大致要按以下标准来选取器件:
- 功能
- 成本
- 能耗
- 体积
- 可靠性
因为TI可以很方便地申请样片并且文档比较全,因此主要在TI中挑选,但在对嵌入式基本没有了解下只能“大胆”地根据搜到的资料按照自己的设想来挑选了。我挑选了一批之后,拿去请教老师,再调整清单,反复几次,最后在老师的指导下定下这些基本的器件,处理器选择了廉价而受欢迎的wifi模块esp8266:
- ADC: tlv320adc3101
- wifi传输、处理器:esp8266
- 电压转换:略
原理图
最终原理图:
- 按键、开关
遇到的问题:8266和tlv320adc3101的连接
- 老师的指导
- 参考8266的文档 [安信可科技
](http://wiki.ai-thinker.com/doku.php)
- 网上社区
电源相关:
- 参考TiDesign完成了电压部分(usb电源、电源转压线路)的连线以及地线。
使用 miniUSB 接口作为电源接入 5V
- 添加一个开关控制供电
- 并且添加了LED作为供电指示灯
芯片3101 和 芯片8266 工作电压在3.3V左右。芯片3101 还额外需要一个1.8V的供电。
因此需要两个转压模块
- 5V -> 3.3V
- 5V -> 1.8V
ADC需要处理模拟信号和数字信号因,需要一个模拟电/地和一个数字电/地。
- 电:通过将3.3V电压分成两路分别串联一个电容来实现。
- 地:通过将地分成两路分别串联一个0欧电阻来实现。
- 添加了一个去耦电路来使电源工作得更稳定。
- 老师的指导
3101 与 8266的连接:
3101部分
8266部分
ADCRST
- 3101的使能端受8266的控制
SCL & WS
SDA
- I2C 的 串行数据线
DOUT
- 音频串行数据输出(从3101到主芯片)
BCK
- 音频串行数据输出的bit时钟
音频串行数据 VS I2C
- 按照我目前的理解来解释
- I2C 是 8266 控制 3101的时候使用的通道
- 音频串行数据 是 8266获取 3101 处理完成后的音频数据的通道
按键及其指示灯:
按键给了用户操作的空间
- 在软件上通过动态检测工作状态可以赋予一个按键多个功能
电源开关
- 控制电源的开关
- 一般建议带有一个LED指示灯
录音开关
常置高 按下是置地
常置地 按下是置电?
- 感觉应该不行,就算按下了接通的电也会流进地里。
接入处理器8266的GPIO4
通过软件来检测GPIO4的电平变化来触发不同的工作事件
第一次按下 -》
- 如果已经连上wifi并且能够正常上传,则开始录音
- 如果不能上传,则不开始录音,指示灯闪两下
- 录音开始7秒内再按下 -》 停止录音
- (软件中)7秒后 -》自动停止录音
- (软件中)上传文件途中按下按键 -》 不录音
录音状态的提示
- 通过与8266的GPIO5连接的LED来表示
- 灭:未在录音
- 亮:正在录音
- 闪烁:正在上传中
- 闪两下:未联网
3101 与 耳机插孔的连接:
计划通过方便的耳麦来录音于是选用了3.5mm接口的耳机插孔
- 耳机插孔的说明网上看了很多,但是有些地方彼此矛盾,或许该找个时间好好学习一下
- 耳麦输入的是模拟信号,因此插座的地接到了 模地 上
- 按照3101的文档中的典型应用使用IN1L(P)作为音频的单输入
插座:
- 将8266和3101空置的引脚引到插针上,方便拓展以及调试和功能调整。
3101插座
按照3101的引脚的功能分成了:
- I2C : I2C传输
- GPIO : GPIO
- IN2 : 一对音频信号输入口(二号)
- IN3 : 一对音频信号输入口(三号)
- ADR : 电子音频信号输入口
- CTR : RST + 主从连接
8266插座
作为处理器,分出了必要的工作模式选择和UART下载
UART下载
- 3.3 + GND
- TXD0 + RXDO
工作模式选择
参考文档中的模式说明
- 将GPIO15常置地,GPIO2常置高
- 通过将GPIO0引到插座上,通过插针来切换“高”与“地”
PCB
建立PCB工程:
一开始没有“PCB”的概念
惑:
- 听老师示范讲解之后还是有点一知半解地感觉
奋:
- 回忆着老师的步骤在原理图的基础上建立PCB工程,但是一直报错没有成
- 遂:自己去探索
《AD完全指南》
奋:
- 于是去图书馆借了本《AD完全指南》
读着书慢慢操作
- 按照提示信息爆出的错误去修改原理图
- 按照书的教程,先生成报表再建立PCB工程
遂
- 总算能够建立PCB工程
构建PCB库:
TI芯片的PCB封装
因:
- 听说TI的器件,TI都会直接提供其PCB封装
但:
- 在器件的文档中没有看看“PCB封装”的字样
奋:
- 到TI论坛去提问
- 到网上找教程
- 看TI的帮助文件
遂:
- 发现TI提供了一种文件格式和一个转换软件
- 可以通过软件来处理文件从而导出需要的 PCB封装 的文件类型
8266的PCB
获:
- 店家提供
电阻、电容、的型号需要更改
原:
- 一开始直接使用AD默认的器件封装
后:
- 老师提醒能够提供“0601”型号常用元件
遂:
- 在原理图中修改相关元件对应的封装,然后更新PCB图
耳机插孔以及USB插座
挫:
- 没有想到USB、耳机插座这样常用器件的封装都散落在网络各个角落,竟没有一个大而全的仓库包含。(或许是我没有发现)
获:
- 最终通过自己绘制 和 老师提供的封装 获得。
拓展插座
绘:
- 以AD自带的插座的 PCB封装 为基础按照需要的针数做出调整
绘制PCB版:
自动布局?
原:
- 一开始想要图方便打算使用AD的自动布局功能
后:
- 自动布局功能没有反应
调:
- 发现要开启自动布局功能必须要设置好规则并且画好布局范围
实:
- 自动布局完之后的布局根本不能用。
遂:
- 决定手动布局
谨慎保险地布局策略
因:
- 本着 线路太靠近可能会彼此干扰 以及 线路越大越好 的原则。
决:
- 决定将器件放得散散的,让线与线之间能有更多的空间。
自动布线?
能
- 自动布线能够正常工作并且布置的效果尚可
但
- 但是不能(或者我不会)对其中电源和地的线路进行宽度定制
- 如果想要扩大电源和地的线宽必须手动调整
- 而手动调整实际上需要修改更多的线
遂
- 工程量与手动布线差不了多少
全手动布线
能
- 虽然看起方法比较笨
- 但好在心里踏实,知道自己大概还要多少事件就能布完线
规:
基本遵循以下规则:
- 先布电源和地线
- 然后是芯片之间的连线
- 其他
修改布局
因:
- 之前的布局过于松散,成本会升高。
遂:
- 需要再次修改布局:更紧凑的布局方式
再次布线
因:
- 有了上一次布线的经验,我有了更多的精力处理其他的部分。
遂:
- 在布线中也同时能够调整一些布局
- 并且在 布线 <--> 调整布局 之间反复中最终完成PCB板的绘制
PCB板印刷:
最终成品:
PCB图:
PCB板:
正面
背面
工作板
正面
背面
软件测试
固件烧录
参考着各种教程慢慢啃下来。
基本的电路焊接好之后尝试着烧录程序却无法烧录进去
能
- 电脑的串口调试工具能够识别到串口的连接,并且能够通过AT指令进行控制
软件调试
一开始打算使用乐鑫原产的SDK通过AT指令来让芯片工作
能
- 能够作为STATION连上wifi,作为AP提供WIFI
但
- AT指令功能有限而且我自己也不是很会用。
- 乐鑫提供的工作环境也不是很好用。
遂
- 决定使用nodeMCU框架
使用nodeMCU框架
是
- NodeMCU是在微控制器上运行LUA的固件引擎。目前支持ESP8266Ex芯片及其模块。
- 如果通过LUA开发,可以直接通过串口协议链接终端即可。
- 与普通串口设备不同的是,所采用的控制指令不是ATA,而是LUA脚本。
- 理论上讲,通过ATA脚本可以模拟出多种设备的指令集,而且可以通过WiFi进行远程控制。
感
nodeMCU是怎么出来的呢?我大概猜了一个思路
- 低廉的芯片 -》 适合业余爱好者玩耍 -》 大部分业余爱好者很可能是软件工作者 -》 更适合软件工作者的方式
- 类似 Arduino
能
按照比较久远的帖子烧入的比较旧版本(0.9.6-dev_20150704- Z5)的nodeMCU编译文件之后在能够在串口调试工具通过Lua语句来控制器件。
- 例如:print("WOW')、以及控制8266上的小蓝灯
但
这个旧版本没有比较傻瓜的http模块
- 一个指令
http.get()
完成任务
- 一个指令
遂
- 需要获取新版本的编译包
新版本的编译包
能
- 通过nodeMCU的云编译服务获得了新的编译包
但
编译完成之后烧录进去,芯片却不能工作
- 疯狂地输出乱码
奋
- 通过在nodeMCU的github项目里发现了相关的问题
发现在nodeMCU的API文档中的章节#Upgrading Firmware中以及有提到这个问题
- 当从nodeMCU的的 0.X版本 -》 1.X版本升级的时候
- 因为框架基于的乐鑫SDK从 1.5 -》 2.0
- 因此得将 乐鑫SDK 2.0 和新版本的nodeMCU编译包 一并烧进去一次才能完成升级。
遂
- 成功烧录
- 调试成功
使用新版本的编译包中的
http()
模块不能
- 使用
HTTP CLIENT: error(x)
各种error- DNS 解析失败
- error : 8
- error : -11
奋
提issue搜Google
- issue#1704 nodemcu-firmware
- 发现很多
http()
模块本身不太稳定
遂
使用
net
模块,参考nodeMCU官网的例子-- A simple http client conn=net.createConnection(net.TCP, false) conn:on("receive", function(conn, pl) print(pl) end) conn:connect(80,"121.41.33.127") conn:send("GET / HTTP/1.1\r\nHost: www.nodemcu.com\r\n" .."Connection: keep-alive\r\nAccept: */*\r\n\r\n")
无视掉
dns
解析无效的问题,直接使用ip地址能够实现传输功能(但不稳定,时成功时不成功)- 能够成功
GET
到野狗的json数据 - 并通过
POST
方法修改野狗的json数据 - 野狗提供的[REST API] (https://docs.wilddog.com/api/sync/rest/introduce.html)
- 能够成功
成果展示
通过http-post方法修改 wishwall.wilddogio.com/-KRmORJEhD6EV3fo6j_f.json 这个节点节点
> conn:send("POST /-KRmORJEhD6EV3fo6j_f.json HTTP/1.1\r\nContent-Type: application/x-www-form-urlencoded\r\nHost: wishwall.wilddogio.com\r\nContent-Length: 16\r\n\r\n{\"value\":\"aini\"}") > HTTP/1.1 200 OK Server: nginx Date: Thu, 12 Jan 2017 06:13:00 GMT Content-Type: application/json;charset=UTF-8 Transfer-Encoding: chunked Connection: keep-alive Keep-Alive: timeout=75 Access-Control-Allow-Origin: * Access-Control-Allow-Methods: PUT,OPTIONS,DELETE,POST,GET,PATCH Access-Control-Allow-Headers: Content-Type 1b {"name":"-KaGIhUcpea1i7cQ"} //////post 也成功了。
- 成功添加
{value:"aini"}
总结
感
感谢老师!
- 没有老师的耐心的帮助我想各种方面都很难进行下去!
收获颇多!
- 走了一遍下来,至少对于嵌入式开发有了一个骨架式的了解。之后学习计算机知识,能够更宏观综合的眼光。
- 自学能力 以及解决问题的能力得到了锤炼。
- 作为“世界创客中心”深圳人感觉有了基本的素养了。
决
- 虽然很有成就感,但是在未知中摸索得感觉实在是颇为疲惫,倒不会说“累感不爱”,但至少现在稍微有点不想去继续调试。或许在学习更多相关知识之后再进行下去也不定。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。