Design and Technology Portfolio v5.1.0_ZN

这是张家平的设计与技术组合

夏酷暑,冬严寒,春也不死吾心,心所向,将所成。

你好,我是张家平,我致力于设计高度模块化,集成化,通用的,具有技术可行性以及商业可行性的产品解决方案。我追求扁平化,设计感,为客户提供最美好的用户体验经历。我享受提出并解决问题的过程以及其成就感,来磨练自己的技术水平以迎接更难的挑战。

我将在这个文件里为你展现我的专业技能,设计理念,个人和团队项目能力以及学习潜能,并分为以下三个板块:

  • 以时间线广度优先的学习经历介绍,重点为发展,趋势与进程。
  • 单个项目组成的深度优先介绍,重点是我的思考,设计理念与技术能力。
  • 个人潜能分析以及总结。

入门编程

兴趣使然,我在小学五年级时接触了编程方面的知识,梦想当一名黑客,我知道这意味着什么,也知道在聊天软件中所谓活跃的所谓黑客大多都是脚本小子而已。我决定脚踏实地一步一步的来,由此开始自学 C 语言以及 web。

初中一年级时,我虽有在游戏外挂,计算工具上面的需求,可苦于没有构建项目以及 C 语言窗体的能力,我第一次感觉到了理论技术与实践需求之间的差距,由此逐渐生长出了现在这种实用主义的自学模式和学习观。

一直到初中毕业,我执着于锻炼自己解决问题的能力,不断的提出需求,利用一切方法来解决它。期间我接触到了很多优秀的朋友和老师,发现并没有一种通用的全局最优算法或者最简编程工具,无论何种编程语言和工具都有其适合的领域与功能,我广泛的去了解各种工具和算法,虽不求甚解,但旨在提出需求时可以快速分析其适用的语言和算法,直到现在变成了一种习惯。

专注设计

高中一年级时我接触了信息竞赛 NOIP,学习了大概一年的算法,虽有成绩,但只是更加确定了我在设计上的兴趣,于是我退出竞赛并专心于设计。

高中二年级时,我独自创办了 B-Tree Design Studio 开始接单一些大学生的毕业设计,这时我发现我已经拥有一些构建中小型项目的能力了,并坚定当前“用什么学什么”的自学方式,有了构建商业化产品自己挣钱的想法。

我开始自己提出需求,不断学习,制作,迭代,重构…… 天生的设计感与完美主义使我不仅在功能技术方面要求极高,在外形,实用性,兼容耦合,集成化等方面也要做到全局最优,这个时期是我的高速发展期,几个月时间从完全不会电路成长到学会并应用了数十片 MCU 与数百片 IC,PCB 设计也愈发得心应手。

贫穷使人进步,我在单片机,IC 选型以及设计成本优化方面下了很多功夫,期望以最小的资源和时间成本达到最优的效果,也有了不错的成就(现在至少不会没钱吃饭了)。

以上便是我以时间角度书写的学习和项目历程,在下面,我选择了一些可以代表我的设计思考以及能力的项目,予以呈现给你。

AR 眼镜

  • 目的:
    1.将一些必须一直监视的数据或需要双手把持的检测器数据方便的显示在眼前。
    2.信息提醒的可视化。
    • 例如:
      可将万用表数据直接浮动于眼前并加以处理,更加安全;
      pid 调参时直接读取数据并绘图显示,手指滑动更改参数;
      连接手机后对手机提示进行收集并分析显示等。
  • 需求:置于眼前的浮动屏幕,有信息提示,数据采集与显示,触摸,拍照,蓝牙等功能。
  • 如何实现:使屏幕或投影仪成像与菲涅尔透镜的距离等于焦距,会让平行光进入眼睛,大脑逆光路就会有一个无限远的虚像,半透半反镜承接显示虚像,安卓端 Android studio 构建 ble 客户端,自设计主板。
  • 技术难点:
    1.成本难以优化;
    2.ble 通知传输需手机端配合;
    3.单色 oled 不好看,多色贵而且尺寸不合;
    4.树莓派实时性不够;
    等。









这是我的第一个产品设计项目,没有经验的我做了充足的可行性分析。即便如此,我还是遇到了很多问题,比如如果每次迭代都要交付工厂,不仅价格昂贵还会影响到设计周期与迭代速度。工欲善其事必先利其器,我拼装了一台3D打印机用来快速实现设计,它在以后的设计中也帮了我许多。











项目前期,我设计了可滑动的外壳和在外壳上的多个定位点,做出试验机型来确定尺寸和之后的的设计方案。为了开发方便,我选择用树莓派作为眼镜的主机,并尽量使用 C 语言和 Python 编写程序,以便后期移植 stm32 平台。阵列分布 TTP223 模块来检测手指触摸,并为其设计了手势算法。由于相对 spi 总线开发简单,我学习了 iic 总线协议,用其与 oled 模块通讯,连接 PCF8574 模块来扩展 GPIO。








项目中期,我用 IP5306 芯片来做电源管理模块,并在淘宝上联系到了合适的电池厂家。之后我学习了 PCB 制图,在立创 EDA 上做了一个兼容树莓派并方便移植 stm32 的扩展版,把需要用到的器件集成到了一起。在外壳设计大体成型的基础上,我增加了一个用 A4988 驱动的微型步进电机帮助菲涅尔透镜调整焦距,来确保近视也能看清图像。








由于图像失真和屏幕刷新,实际效果优于此照片效果。

我本计划后期要使用 stm32f407 来压低成本以及增高实时性,用步进电机调整半透半反镜角度。甚至都已经联系好了可以量产彩色 oled 的厂家。但由于资金原因,这个项目只能无限期停滞,即使我迭代几十次才打一个样板来确定开发方向,竭力避免资源浪费与消耗,但我还是无法承受在没有资金帮助情况下的无限投入。我这时才明白了,必须要先挣到钱才能支持技术研发,于是我把目光投向了下一个项目。

树脂夜灯

  • 目的:夜灯
  • 需求:无极调光,柔和光源,无触点,需内置电池,充电系统方便简约,工艺简单。
  • 技术难点:
    1.空间资源难以优化;
    2.光源散热问题;
    3.ic 选型与控制难;
    4.如何设计用户体验良好的浸入式控制系统;
    等。

滴胶是一种用树脂和相应固化剂配制的胶水,具有粘度低,透明度高,耐黄变,抗折性好等特点,被许多人用来制作工艺品。这种工艺品在灯光下会有非常优良的显示效果,而脱离灯光后会相对差很多,许多人还为此购买了展示台。当时我发现市场上并没有成型的环氧树脂与电路混合产品,便想设计出一款赏心悦目的夜灯来赚钱。

我先是学习了滴胶工艺品的制作方法,后联系了一些厂家并最终选择了 SGL8022w 模块来充当主控。我的最初设计完全是用各种模块拼起来的,体积大,制作困难,成本还高,我决定先制作出初步的试验机型,再去优化设计。而由于滴胶流动的特性,我无法为其设计 microUSb 接口,最终只剩下磁吸接口与无线充电两项可行方案。最终经过一系列测试与分析,我选择了相对昂贵但更加稳定简便的无线充电方案,并用 IP5306 连接它和锂电池。敲定方案后不久,第一款试验机就做出来了,个人感觉超级丑。













我认为这么丑有两个原因,第一是光强不够,第二是发光面积不够大。我设计了 PCB 并进行了多次迭代尝试,用均光板和亚克力菲涅尔透镜作为散光设备,用多光源增加光强,但效果都不尽人意。




我最初设计的多光源 PCB

我开始寻找适合我这款夜灯的光源,用 blender 建模做光线追踪运算,跑去深圳华强北逐一进行尝试,最终发现效果最好的有以下两种:




高强度的SMD ( Surface Mounted Devices ) LED



COB ( Chip On Board Light ) 的面光源 LED

考虑到项目需求,我选择了强度更高,发光更柔和的 COB LED 作为光源。为了驱动它我需要 12v 300mA 的供电系统和效率更高的散热系统。我用 IP5306 输出了 5V 电压,并用 PL7512A 升压至 12V,发现并不能支持这么大的电流,后来我换用了 MC34063 模块暂时解决了这个问题,不过发热更严重了。




为了散热,我甚至在PCB画上了冰之妖精,毕竟大家PID调参的时候也都很相信玄学。

我用 TTP223 增加了 IP5306 电源的触摸开关并连接至 SGL8022w,以此设计了新版的 PCB。经过几次测试之后我把所有器件焊接到了 PCB 上。这时突然出现了 led 间歇性的频闪并充不进电的情况,触摸按钮也不管用了。而后经过实验,我把问题锁定在了触摸模块与 SGL8022 控制芯片的连接上。其体现为分开完全正常,而连到一起之后却无法工作。后来我经过学习和讨论,猜想并证明了这个问题的原因:因为 SGL8022w 和 TTP223 芯片的触摸引脚都是利用张弛振荡器计算方波频率来检测人体电容,而当两个引脚接在一起时由于初始时钟不同,导致了两个芯片互相触发的人间惨剧。要想解决这个问题只能设计两个按钮把他们分开或者实现用一个主机控制他们的使能,很显然前者并不符合我扁平化的设计理念。

因为对尺寸和成本的要求,我最终选择了 ms 系列单片机的 ms82f1402 作为主控,接受来自触摸模块的状态,来调控 IP5306 和 MC34063 的使能并输出 PWM 信号给三极管,继而控制灯珠的开关和亮度。

由此,我的夜灯设计就基本成型了。这时我便需要一个非常漂亮的,能够配得上我的夜灯的开关。然后很遗憾我并没有找到我想要的。于是我准备做一个出来。

全彩呼吸灯触摸开关模块

  • 目的:通用触摸开关
  • 需求:接口全面且方便连接耦合,输出功能多,接口调试方便,个性化程度高且自定义方便,漂亮,成本低,量产简单等。
  • 技术难点:
    1.集成度达不到要求,尺寸要求过高,保证物料成本的情况下主板设计及其困难;
    2.TTP223 触摸芯片的灵敏度和抗干扰度达不到要求;
    3.ms82f1402 单片机性能达不到要求,而 ms83f 系单片机尺寸太大;
    4.5050 尺寸的 ws2812 灯珠时序位不明确,帧片段丢包严重;
    5.MC34063 升压芯片的电流不够,体积太大,考虑更换;
    6.算法效率受设备制约;
    etc…

起初我只想做一个通用的有呼吸灯的开关。于是我便设计了第一版开关模块。它是由 5050 尺寸的 ws2812,ms82f1402 单片机,ttp223 触摸芯片,IP5306 电源管理芯片,ldo,三极管,状态灯构成,尺寸为 40*0.8mm







但由于它太小了,很多器件挤在了一起,很不好焊接而且很容易就会导致严重的短路事故以至于烧毁芯片。这时的我已经有了初步的设计经验,不会像以前那样手忙脚乱了。我设计了时间规划并做了完备的设计计划,同时进行着设计与优化。

首先,为了能节省时间先一步开始软件编写,我用面包板和洞洞板搭建了一个简易的 ms82f1402 开发平台,并连接了我需要使用的一系列器件模块,我在开发软件的同时记录下问题与需求,不断迭代着 pcb 的布局。等待 pcb 同时这些问题也帮助我更改器件选型,比如将 MC34063 改为最新的 sh1208 升压模块,既节省了成本又解决了发热和电流不稳的问题。再比如我更改了数十次 ldo 的选型,找到了尺寸最小,相对便宜还运行稳定的 SC662K-3.3V 芯片。







我为夜灯模块设计了接口,用来对接开关模块。我还自行设计了纳米级时序帮助 ws2812 传输数据位,解决了网上示例的丢包问题。







这时我发现当前的开关模块完全可以代替此前设计的夜灯 PCB 设计了,只需要调试好相应的 PWM 输出,便能达到相与夜灯模块相同甚至更加完美的效果,只要我能保持这个尺寸与功能性。

我已经不满足做一个普通的开关,我想构建任何人都可以使用的,可以跟大多数设计耦合的,好看并且能够个性化的开关模块。我在软件方面下了大功夫,几乎用上了所有定时器和中断,分时复用用了 4 个 GPIO 控制了 12 个 led 的独立状态,尝试了频分复用的数据传递,尝试压榨这款 0.2 人民币的单片机的所有资源。





在这期间我保持使用了 Google 代码风格,并越来越体会到代码风格以及注释,变量名等信息的重要性。即便是使用没有关键字 class 的 C 语言编写,我依旧选择了偏面向对象的编程思想,高耦合,低内聚。我还设计了类似嵌入式系统的周期内时间调度以及功能模块化。




算法过程单周期功能化



命名规范化,注释多



设计模块化,输出模式由硬件置位调整

在个性化方面,我利用十二个 led 与用户交流,让用户可以自己设定或导入色彩值以及各项设定并将它们储存在 EEPROM 中。模块的实际输出方式与电压等设定也可由出厂硬件引脚反馈或置位来决定,这进一步简化并增强了用户体验。







我还为我对用户们提供了我在设计中为了实际运算而写出的计算程序帮助他们自定义输出,还为他们写出了一套 API 说明,也正在实现 PC 端的 GUI 图形订单界面。





我就不信卖不出去了。

下一步我将使用更小的贴片布局以构建更宽的铜线,来适应更多的设计。我将用运放和比较器来实现触摸功能的集成化以及个性化,并开通更多的输出模式来满足更多的需求。敬请拭目以待……

以上三个只是我比较有代表性的项目,除此之外还有很多,比如用联盛德的 W600 模块化到极致的物联探测组件,用 electron-vue 构建的扁平化窗体模板,esp8266 开发板构建的 wifi-killer ,用 hexo 自动构建的静态博客等就不再展开说明了。

甚至我在写这篇文章的同时又萌生动机,构建出了一个更方便的,可以插入在 Markdown 语言中的图片组件,它已经用在此篇文章里了,但还不够精简和方便。之后我会去学习 Node.js,不久应该会作为一个 npm 包加入我的博客:

function ExImg(str) {
  return str.replace(/\{([^{}()]+)\}\(([^{}()]+)\)/g, function(match, $1, $2) {
    return (
      '<div style="display:flex;width:100%;"> <div style = "display:flex;flex-direction:column;align-items:center;width:100%" ><img src = "' +
      $1 +
      '"width = "' +
      $2 +
      '" / ></div> </div>'
    )
  })
}

团队协作能力 —— 大疆 robomaster 冬令营

2019 年初,我作为嵌入式进入了大疆 Robomaster 冬令营。虽之前也在 Github 上有过团队协作的经历,但还是第一次在线下参与这样的团队项目。十天中我们需要制作出两个机器人并与其他小组对抗。

在这段时间里,我更加熟悉了以前只是当作项目存储的 git 版本库的使用,学会了 PID 调参(虽然还是很玄学),Google 代码风格的习惯派上了用场。我用串口与下位机 Arduino 通讯的红外阵列最终因为时间不够,考虑到稳定性而没能完全上场。不过我用两根皮筋制作的投放器设计,两片弯折硬纸板做的限位设计,也解决了储物箱容易卡位的问题。我发现了我在机械方面的天赋,准备进一步学习机械设计。

而到目前为止,貌似官方还没有开源代码,由于有保密协议,我无法在这方面讲的太多……

















最后

O ever youthful, O ever weeping / 永远年轻,永远热泪盈眶