最近准备拿树莓派做一些AI相关好玩的东西,但是对这块别人设计的板子总感觉不是很满意。一方面树莓派是面向广大用户的,所以定制化不够,板子形状尺寸配置外设都无法达到理想的要求;另一方面树莓派的性能也确实相对捉急,毕竟成本摆在那里,为了普及这块卡片电脑,不可能用上太贵的SOC(树莓派上面的博通CPU是专门供应给树莓派的)。于是为了满足个人的强迫症,也为了学习一下高速PCB的设计制造,决定自己画块ARM核心板玩~
板子的原理图设计和PCB Layout已经完成了,正在发往厂家进行PCB加工。这里吐槽一下,像这种多层精密PCB板要找到合适的厂家打个样(不是批量)还真是不容易。。。淘宝上翻了一遍PCB打样的厂家,没有一家能做0.3mm pitch的BGA板;听说嘉立创最近工艺升级,于是去充了个值把板子发过去试试看,第一次审核通过,第二次准备加工的时候,接到电话说你的板子我们做不了,0.2mm的过孔超过工艺范围,是的加钱也做不了…不过幸运的是最终还是找到一个可以做的厂家,当然价格也是相当的不亲民了~
板子用的全志Cortex A53四核CPU,主频1.5GHz,六层DDR3内存,mini-PCIE尺寸,性能应该是完全超过树莓派了~等板子加工好了下一步移植uboot和Linux-kernel,应该是目前为止最小的Linux开发板了。板子引出了spi,iic,uart等引脚资源,后面会做一个arduino兼容的底板。
2018.4.18
- 加工的核心板PCB到了,迅速尝试焊了几片~由于是第一次手工焊接BGA的芯片,而且还是0.3mm pitch的BGA,所以一开始并没有太大的把握。
- 一般BGA都是让厂家去焊接,因为需要用到专门的吹焊台,可以精确地控制温度曲线。个人寝室是不可能用上这么专业的设备的,所以只能展示一下真正的技术了:D
根据网上看到的BGA焊接经验,一般是先对芯片植锡球,也就是利用钢网对准焊点后,将锡球(网上很好买,分为各种尺寸,一般按万颗计算的)撒到芯片上,然后加热化锡,这样芯片上的的锡球就成为连接PCB和芯片的导线了,这也是BGA(Ball Grid Array,焊球阵列封装)的意思。
|
|
- 我买的CPU和DDR芯片是全新的,所以出厂已经植好了锡球,这一步就可以省略了,当然如果后面一次焊接没有成功,需要吹下来重焊的话,还是需要重新植锡的。
这是我的装备↓
- 我采用的焊接方法是,先把除BGA以外别的器件都焊好(主要是电源电路,和一些外设),然后上电测试电压(5V、3.3V、1.2V、CPUX的1.3/1.4V)是否正常,正常的话就说明板子成功了一半~因为PCB的加工至少应该是没有问题的(虽然PCB发货前会进行飞针测试,但是只保证通路,短路是很难检查出来的)。
- 很幸运我这块板子没有发现任何问题,这又说明了我的走线和规则设定是ok的。
- 然后就是最重要的CPU和DDR焊接了,这也是最没把握的一步。BGA的引脚完全分布在芯片下方,所以肉眼是看不到的,因此在设计PCB的时候,一定要准确地把芯片边界的丝印画上去,这是用于对齐芯片的唯一标准。对好芯片之后,上风枪加热,用最低档风速,250°进行加热(注意需要吧吹嘴去掉以便增大出风口均匀加热),吹上一分钟左右可以看到芯片有轻微的归位动作,这时候用镊子非常非常小心地碰一碰芯片,能自动归位,就说明基本焊好了。
- 这里我由于吹焊的操作没有掌握好,吹废了两块板子(温度太高吹太久焊盘脱落了),不过最终还是成功焊好了一片~有了这次的经验,感觉下次吹BGA应该会轻松很多了。
芯片焊好的样子↓
插上SD卡,USB上电,还没接上SSH呢,已经看到状态LED闪烁了,说明CPU正常启动!至此个人的第一块ARM核心板硬件可以说就圆满成功了~
第一次设计高速多层的ARM板就成功,实在是很幸运(当然其实前期也断断续续各种找资料预研了好几个月),回想一下整个设计过程,有太多的不确定因素:
- 第一次进行多层板设计,而且还是直接上6层
- 第一次设计ARM的核心板电路:需要考虑复杂的电源系统、PCB阻抗计算、信号等长走线,EMC优化等等
- 第一次进行多层精密PCB的加工投板:6层、3mil线距、0.2mm过孔,价格相比2层板翻了20倍不止就算了,加工好了还不确定是否真的能用
- 第一次进行BGA的手工焊接:就算PCB没问题,焊接也是个大问题,一旦焊接完发现板子不工作,很难排查是哪里的原因
好在以上所有问题都随着板子上那颗可爱的LED闪起来而得到了完美的回答哈哈~
硬件正常工作,下一步就是软件的移植工作了,U-BOOT和Linux内核的移植和编译在之前等PCB加工的时候已经基本完成,将系统写入SD卡后,插上板子,上电成功进入内核~文件系统使用的Ubuntu16.04,Debian系的最佳选择,跟树莓派也基本完全兼容。下图为通过板载的USB串口进行SSH登陆的效果↓
然后确定了核心板没问题之后,今天也赶紧画了个底板,用于将USB、网口、SPI、I2C等资源都引出来,同时底板上集成了一块Arduino Micro(Mega32U4),通过串口或者I2C和CPU通信(实际上核心板上可以直接运行Linux版的Arduino的IDE给底板上的Arduino下载程序了)
2018.5.2
- 底板的PCB也加工好了,地板功能比较简单,走线也只需要两层,元件全部放在同一层,省得焊接麻烦
- 底板主要通过mini-PCIE的底座将核心板上的IO资源都引出来,比如USB口、以太网口、I2C、SPI、串口、麦克风、喇叭等等
同时底板也板载了一块Mega32U4芯片,烧写Arduino Micro的Bootloader之后可以作为Arduino使用,其中串口和I2C接口都是可以和核心板相连的,用于两者通信,当然核心板上也能直接编译程序给Arduino下载啦
|
|
|
|
由于一般Linux都直接用SSH或者远程桌面登陆,所以底板上没接出HDMI接口(另一个原因是为了关闭GPU降低功耗和发热),所以最好需要一个板载的小屏幕来显示一些信息,比如CPU使用率、温度、IP地址等等。这里我选用一块很常用的OLED12864屏幕,尺寸很小巧显示也很漂亮,通过I2C接口驱动,接线也相当简洁,即插即用。
用Linux驱动OLED,和用单片机(比如Arduino)驱动一块OLED有啥不同?那就很有意思啦,首先Linux是一个完整的桌面级操作系统,很多算法(像图像处理,网络应用)都是可以直接移植运行的,所以不会出现像单片机上资源匮乏,每显示一副图片甚至一段中文,都需要事先用PC端软件开好模,再存到单片机的flash里面再下载运行这种情况(因为这Linux板子本身就是个电脑了哈哈);其次Linux是可以多任务的,也就是说可以很方便地将OLED的显示和其他应用结合起来,将屏幕作为一个展示内容的很好工具
|
|
另外,不知道intel啥时候肯放出Movidius芯片的bsp,就可以在板子上整合这颗VPU做神经网络加速了,到时候移植几个神经网络算法设计个迷你AI机器人耍耍 ~