) u3 {8 c' O" z3 U, C+ y2 ~
8 M# Y$ l/ k0 @1 `描述
2 {* L8 p/ W0 K. n' e& x7 K% j这个项目是我出口想要练习几个设计目标:
8 g" S0 o5 O) u! e——低功率电子产品。手表总是会预计将持续好几个月。对我来说这是一个很好的opertunity与STM32的节电功能有亲密关系。% j3 E" _% \ y! S( Q! b
——光滑的工程设计。我从来没有真正试图做一些你希望出现在公共场合。虽然我没有经验做“时尚”的东西,这个项目会给我一个插座的尝试。
+ J) F; X; V; I1 B——古怪的特性。顾名思义,我想轻子热相机集成到手表。我有一个理论,这些传感器会找到更多的使用如果您没有设置/找到工具箱的时间。那辆车刚吗?哪里来的狗湿地毯吗?这房子在这条街上似乎种植植物莫名其妙地在他们的阁楼吗?值得回答的问题,和一个热摄像头是你需要的!
& b+ N6 c0 H/ U2 `* ~9 M( d, C, k& C+ d" m8 P `7 t
% O9 j, c' V1 q- r' ^- i/ B: V( F
7 y$ |& {# F$ H/ V& b项目概述
6 j9 Y h9 h0 D2 B2 C t3 Q# f& N. o, K6 {& l* v
如果你走了这么远你可能知道我打算建立一个手表。这是正确的。我也可以假定这些信息不足以满足你的好奇心,所以下面我将提供一些无耻的我的计划的细节。: k- ^- m" m$ G0 M
8 U1 m0 y+ a! n/ w9 d目标
" b2 A) c: f1 w0 I2 V# @
1 @' @& ?+ n# ~7 N! w! w0 T手表必须:* |* F) Z8 A7 ]1 `3 }. C. ~
) u- S7 N' f W) a3 I" ^
足够小的人将不会注意到这是“自制”从远处看,和时尚的,以至于人们不被关闭。5 H: `( y |4 ^9 M+ f
运行在一个收费大约1年,我现在的手表一样。假设将只有时间将计入保持功能,其他功能应该很间歇地使用。也如果你有一个长热感摄像机会话你会收取您所使用的设备。1 X7 I i" o! s- E! W7 L |
我希望它是防水的。这是我没有见过任何其他DIY的手表设计(和一些商业手表很酷的特性)。这是很重要的,正如我的自我识别为“看”的人,和时间没有手表给了我巨大的分离焦虑。因此我应该能穿它洗澡,洗手等。潜水100将无限期地在TODO列表。 c; E0 @8 r2 G$ I- }
是愚蠢的。我庄严宣誓,这个项目不会成为一个互联网的东西。也不会认为自己足够聪明有前缀“智能…”。它将有一个预定义的功能列表,它将做他们,仅此而已。没有扩展接口,就没有交流。没有无限的待办事项列表。你还记得你上次完成的一个项目。我也不。) s+ ^* S# B* w' } o2 H4 U
硬件- A6 n1 j. F9 g4 Q
9 y' x; b7 n5 X7 J您可以查看硬件的未完成状态目前的硬件是基于三个主要组件。处理器:STM32L432,相机:FLIR轻子,OLED ssd1351屏幕:1.27”。/ Q( s3 Z, b) a' h) g7 Y7 P5 @! M
4 z# u8 T( y+ R: h另外这些主要部件会有适当调光的光传感器显示。紫外线指数传感器,因为我苍白,我喝SPF50 +生存。和一些亮为方便手腕上的LED灯,当你在一个桌子更新桌面。
6 }: |* \! X3 L# T- i l9 [6 V. I) y. P& F0 c2 B2 Q
为了让相机从用户向外点我将使用flex PCB和刚性部分。将会有3部分:热相机指出,看脸的手腕,和用户面临的按钮。 J: L8 k9 J H. F
& ?# Z$ z9 Q/ r& l
软件
2 t" ]+ t& K) U+ U+ k; H0 y
3 o8 I5 k9 ~; b$ G/ I我将尝试使用ChibiOS uGFX为主。我知道我需要拉伸STM32很难得到相机宣读和屏幕更新所有满足时间限制。如果我想运行一些简单的游戏,那么一个好的图形库是好的。
- R* X* x& V% P! x% o
4 W1 h8 r( z' V8 }3 L8 w结论
+ G( }$ i# @- Y2 i) T+ x2 Z7 \. ^( F. I1 w1 Y: j# q
/遵循等如果你想看到一个手表相机热集成。
. { D0 T. |) z) p& [+ A& J0 ? g) u
让OLED的工作/ q7 Z! O& K+ U* P) i( x2 P
O1 j: y9 l0 `1 }: R
今天是一个非常漫长的一天....我开始与ChibiOS uGFX他们似乎想给我战斗。第一个好消息。ChibiStudio很好就被迅速建立。我建立了一个类似的工作区微型机器人项目,ChibiStudio更快做了同样的事情。
3 o& p b; l. {: M# a6 J2 T, I
1 ]9 T! d: w0 y2 K6 ^# U2 G主要的事情是需要的是找出board_SDD1351。h文件。我最后这样的(这里有别人的代码,但改变的代码产生的时间让我松参考。)* z/ Y: _% k9 m
$ E( @8 ~+ X1 ?. O: o7 R* p
; Q8 m3 K) ^1 m2 q1 R+ e' E$ K- /*0 z; p" F* W# a3 U8 M. f- |) p
- * This file is subject to the terms of the GFX License. If a copy of
% b4 C4 T' I* D* c8 B - * the license was not distributed with this file, you can obtain one at:# q* T1 @( _! D; m' i
- *( U! y# o$ S% E
- * http://ugfx.org/license.html/ @ m9 y0 R/ I" I+ \& d+ m
- */
* E; e2 ]) ]: M: M( A5 C6 c- n - #ifndef _GDISP_LLD_BOARD_H
$ a4 G6 f# ?3 r1 n: t* x - #define _GDISP_LLD_BOARD_H
" v0 h: l* u7 W- D - #define SPI_DRIVER (&SPID1)
9 e+ R4 [( ^5 K& ^ y8 j" F - #define SPI_PORT GPIOA! B; N* `: S* @/ M
- #define SCK_PAD 5 //PA5+ N1 ?$ H8 B* l% L# `( E5 E
- #define MISO_PAD 6 //PA6( R; ?, b* v) O3 r& v' K
- #define MOSI_PAD 12 //PA7; B; J k( N( c# l
- #define CS_PORT GPIOB
+ g% f6 M; \& [% E - #define RESET_PORT GPIOA* a, g3 d" E, k* F+ `6 M& Y: G
- #define DNC_PORT GPIOA$ M; p( w; [ C0 g
- #define CS_PAD 4 // PB4 -- 0 = chip selected
+ n/ i, ^9 d6 t5 L) G" ^ - #define RESET_PAD 10 // PA10 -- 0 = reset) \+ R" C g0 O9 r- u8 F
- #define DNC_PAD 9 // PA9 -- control=0, data=1 -- DNC or D/C# ]' S4 g- W% o8 y7 T0 J% m+ \
- // SPI setup ajust " SPI_BaudRatePrescaler_X" to set SPI speed.3 `" h; a% J1 y5 r6 j( p3 b p5 h
- // Peripherial Clock 42MHz SPI2 SPI3; G- ]9 z+ f* F, I7 h+ P; g+ z
- // Peripherial Clock 84MHz SPI1 SPI1 SPI2/3
3 f- ~8 n8 l) k: j' P* E8 I$ u- e - #define SPI_BaudRatePrescaler_2 ((uint16_t)0x0000) // 42 MHz 21 MHZ- R/ t: T5 c2 y: Z+ G# U& }
- #define SPI_BaudRatePrescaler_4 ((uint16_t)0x0008) // 21 MHz 10.5 MHz/ @! H9 S8 O2 u, @% ?: t( i8 ]
- #define SPI_BaudRatePrescaler_8 ((uint16_t)0x0010) // 10.5 MHz 5.25 MHz! J8 H5 q3 w% L- F/ L
- #define SPI_BaudRatePrescaler_16 ((uint16_t)0x0018) // 5.25 MHz 2.626 MHz( e7 F* Y6 U) ~% O* e1 |
- #define SPI_BaudRatePrescaler_32 ((uint16_t)0x0020) // 2.626 MHz 1.3125 MHz
) p: V6 s: a! u) e: X# `2 q - #define SPI_BaudRatePrescaler_64 ((uint16_t)0x0028) // 1.3125 MHz 656.25 KHz6 ]" n6 j! S" R1 C0 d
- #define SPI_BaudRatePrescaler_128 ((uint16_t)0x0030) // 656.25 KHz 328.125 KHz8 m, z# \9 B" R
- #define SPI_BaudRatePrescaler_256 ((uint16_t)0x0038) // 328.125 KHz 164.06 KHz
8 H* P7 o& ^# h - static SPIConfig spi_cfg = {, \: m9 A; `' P9 X; R A* l4 Z
- NULL,. z3 e+ c4 i' ^
- CS_PORT,8 Y8 z$ `$ ?5 d+ `8 L7 W
- CS_PAD,$ T% t {& l* U* H7 A- Z6 L9 i! [
- SPI_BaudRatePrescaler_16 //AJUST SPEED HERE..
( n- W: v) ?( {6 E, Q - };0 k" Q: [+ A: i- l: `; A$ W; y
- static inline void init_board(GDisplay *g) {5 C2 G7 @8 H( L6 b$ H
- (void) g;
- [% S# y" R& c( l' p2 m - //g->board = 0;6 E' t. l/ P5 {5 v3 P* ^
- //Set up the pins..0 `0 g% v i d1 |
- palSetPadMode(SPI_PORT, SCK_PAD, PAL_MODE_ALTERNATE(5));
, B3 p+ N( R. k( ]- P4 S - palSetPadMode(SPI_PORT, MOSI_PAD, PAL_MODE_ALTERNATE(5));
, [2 D* b/ c2 {* I* D6 E, c - palSetPadMode(SPI_PORT, MISO_PAD, PAL_MODE_ALTERNATE(5));
$ m0 I# \ z6 _1 @) [2 W: ` - palSetPadMode(RESET_PORT, RESET_PAD, PAL_MODE_OUTPUT_PUSHPULL);% c. Q& ~* M# s7 ~7 t0 ?
- palSetPadMode(CS_PORT, CS_PAD, PAL_MODE_OUTPUT_PUSHPULL);3 X) x9 v8 _+ z2 W6 L6 w% G
- palSetPadMode(DNC_PORT, DNC_PAD, PAL_MODE_OUTPUT_PUSHPULL);
& x% N8 F2 S9 G/ R - //Set pins.
5 s3 |; t g4 k: v - palSetPad(CS_PORT, CS_PAD);9 o( O3 ]/ T' g
- palSetPad(RESET_PORT, RESET_PAD);$ b7 A' ?# T1 ?6 v8 w& t
- palClearPad(DNC_PORT, DNC_PAD);- b7 D$ Z! Q9 D# O! j
- //Start SPI1 with our config.
' r5 j C# B5 e - spiStart(SPI_DRIVER, &spi_cfg);
) x& G6 |% P. O) H, T- A - }
2 @+ F( g( t/ h' R3 n5 G) Q6 _/ A - static inline void post_init_board(GDisplay *g) {
3 e( k; e+ y, V* ~, S; w3 m - (void) g;
$ O+ b& A' w# l2 M; ^ - }
" V( p8 h' K8 U. A% f1 Z1 i5 O$ ~ - static inline void setpin_reset(GDisplay *g, bool_t state) {0 O) N" g( ^# o
- (void) g;
' p+ B9 }% ~5 G3 \4 A - palWritePad(RESET_PORT, RESET_PAD, !state);3 y2 f! S. g+ B/ |* Z) a
- }. k; D! o m4 R7 }
- static inline void set_backlight(GDisplay *g, uint8_t percent) {
7 B, D9 [, Q' U4 t" E& ` - (void) g;1 ^" l1 L+ A% V* }
- (void) percent;! H2 Q, m2 s# T; r+ I8 V$ |
- }& m, k! P- @7 V7 q1 C+ Q* X z9 w( |
- static inline void acquire_bus(GDisplay *g) {" l3 k; ]0 H; j+ P- C ~
- (void) g;
, ~# k1 S. I. X - spiSelect(SPI_DRIVER);
* J/ f# ]) P/ O4 O2 O - }2 e4 y- Q" _# s' H2 ?
- static inline void release_bus(GDisplay *g) {
& X+ }% a" X8 F! T& c - (void) g;/ f `% D9 k" I. A
- spiUnselect(SPI_DRIVER);* i. A# t8 O* O" u: W
- }$ f" U1 ~' e# s/ A2 B8 w
- static inline void write_cmd(GDisplay *g, uint8_t index) {# a+ x$ s0 A+ R3 e$ M+ J& ~# b
- static uint8_t sindex;+ N8 l R# @5 X+ g" c$ ~5 Y) P2 m
- (void) g;
& B9 O( b, D9 q! g* L - palClearPad(DNC_PORT, DNC_PAD);
6 {3 H- d( C, A) O - sindex = index;/ L6 O% P* R3 s: {9 E
- spiSend(SPI_DRIVER, 1, &sindex);
- M( Q1 `. ~8 J, @6 l - }
7 }6 v) D* n% f9 V6 e9 R: j - static inline void write_data(GDisplay *g, uint8_t data) {; r7 d' Y! |9 |! E% Z) {
- static uint8_t sdata;8 B& x0 Q/ q4 ]) s
- (void) g;- W0 P7 K0 o5 @
- palSetPad(DNC_PORT, DNC_PAD);2 h0 _& c2 R: ^2 w$ A0 ]& A
- sdata = data;
6 Q6 w+ t% y& U+ h# E, v - spiSend(SPI_DRIVER, 1, &sdata);+ b; G, s. n4 [2 P) \ B8 @
- }2 b l' L& w8 f% R
- static inline void setreadmode(GDisplay *g) {
( q/ j3 p g8 b- L2 S. ?- J, @ - (void) g;
8 r0 @9 Q/ H8 N$ w0 \) b - }) c* ] B- T* H* x* I5 g
- static inline void setwritemode(GDisplay *g) {3 B4 B$ f- O5 F a5 @" r
- (void) g;
/ Q) E1 M4 B2 W- U2 s) ^ - }
( X! ?( y& g) P! [( @% s" v) L - static inline uint16_t read_data(GDisplay *g) {; I( l& Q6 H( T2 j+ S4 W( y4 _; ?- B
- (void) g;
2 p0 K% J; V8 O; U - return 0;; i- {7 f6 Y& V
- }7 }$ n- n* h" n6 m T5 m5 ]
- #endif /* _GDISP_LLD_BOARD_H */
复制代码 0 w. [1 J) O' F& i4 S7 v
默认uGFX图书馆似乎安排单像素使用DMA的硬件,这是非常低效的。这让我填一页3帧/秒左右。幸运的SPI支持代码ChibiOS似乎支持DMA开箱即用的,这将是一个管道的缓冲到相应的API调用。我只需要算出这应该是结合uGFX这样我不最终维护一个垃圾的负担。这样做应该得到约30 fps我估计性能。
3 g0 a4 v. n5 o' k0 d& _! I7 b1 ]) a4 t" ^# a
我还没有真正陷入与ChibiOS本身,尽管它似乎所有你希望的特性。这个项目应该是非常简单的从操作系统的角度来看。我打算把单片机进入待机模式不使用时,唤醒开始执行的代码从一开始(你可以保持一段SRAM和RTC仍然运行)。我可以生成一个新的特定于应用程序的线程,然后杀死整个系统和从头开始“回来”时看的脸。
4 {3 q) p. N9 I' n+ `; J
/ Z6 }- T2 ^, Q& X: }# u7 m6 b任何方式我将上传一个git当我完全理解所有的文件需要包括,可以减少它。2 u( U' { _" K' Q
6 L" n& g9 Y; @# h) W4 e. g- W热成像摄像机工作
+ Y4 C( z t) P2 k% C在13:04 08/03/2017吗?0评论, f- W) v2 E4 t" d
Okidoke,所以过去的几天里一直在让热感摄像机正常工作。这让我吃惊上有专门为ChibiOS像样的示例代码GroupGets Github 。我不知道发生了什么错误。我最好的猜测是,有小虫子的混合物相互复合,最有可能的设置GPIOs和SPI端口(默认端口的所有示例是一个驱动OLED)。这些虫子是经过几个小时的扰动分类代码。6 d! d6 M5 ~( w5 |
/ J+ ^% K8 r5 |) q6 a$ x- x一旦我有一个图像的缓冲区的本机14位整数类型(垫短整数)我需要渲染成一个图像看起来合理。这是通过使用min和max值与前一帧(也没人有时间预扫描的最新图片),然后之间的线性插值的蓝- >绿- >红565年RGB格式。结果看起来不错,不过我只能渲染帧的一半来自相机,由于它所花费的时间来处理这个问题。
|$ J; w7 n2 Q) t* d( C& q! C# m5 W2 V& L/ u+ h. W' P
改变从浮点数学整数保存一天,之后我将precalculate一些好看的颜色查找表。我认为浮点就可以作为STM32L432 FPU,但事实证明我需要把每一滴性能呈现高分辨率上的所有帧轻子3我打算用在最后的设计。: y& r: v9 e& ?5 X3 ~; v# W
1 t( D/ j# h( K4 y% b+ N% C
我仍然需要实现缩放所以我可以填满整个屏幕(和低档次的新传感器)。可能我只能实现4:3比例比,因为这可以插值使用只转移。我将浪费几个像素,因为这将给我一个90 x120图像和OLED是96 x128。我可以想到的一些简单的GUI使用额外的空间。8 u0 Y q0 ^' Q$ k
# G T! c8 J0 d6 t: K8 F' o任何方式我能清理我的代码现在公开发布,核心功能是功能。这是一个图片供大家欣赏!
$ ]$ v6 m5 f$ W1 R- {7 J5 u& w, ~% M
/ }" Y0 }. L. U9 a8 ` f
% |5 a* \% T0 _1 n& E# s
印刷电路板; |3 s' a6 B! e8 j& C% r
& m1 I0 o$ U2 x* r5 c+ Z! w
) |6 I* f/ M. y/ ~. F ~
只是一个小更新。的PCB基本上是做手表。我认为是前面提到过的,看最终将被建在flex PCB,与部分由刚性加劲板背面。
6 Y+ A4 p& n$ N0 e
/ e" ]% _. F. ?+ m8 |
2 X' t, c: X; `
; w, j; C4 j: s1 Jflex电缆的OLED显示器将通过右边的长孔。左上角的圆形物体振动马达。其余的大部分设计各种各样的电源管理电路。底部上面的图片你可以看到高亮度白色led灯,我认为这将是一个非常有用的功能,我们不能看到在黑暗中(哦,等一下,这款手表我们可以;)), |+ O% }, }4 U0 { q2 o$ M2 a
5 c J+ e5 d N2 L' k; N A( g
3 q( A! U) M( _3 T! a+ y+ c1 r/ m: _9 t! Q" g
在这幅图像块在右边是热感摄像机。在中间的是电池。oled不是呈现在这里,但它将(我猜有些显然)坐扣电池。左边是方向键风格与中心点击开关。旁边的视觉光谱光传感器检测环境光,所以你不要盲目的自己在半夜超级明亮的OLED。毗邻这是紫外线指数传感器。我诞生在阳光下燃烧的能力非常快,现在,我将能够量化太阳坚持我的胳膊简要从阴影中,这样我就能有数据我错过什么。8 u( a i6 A7 q5 U
) F+ V' M6 W: f" k8 B您可能会注意到,有一个大法兰在PCB,这是简化防水处理。如果PCB到每个边缘,不会有“似乎”形成一个通道通过橡胶垫片,其中会有很多。很多垫圈。
: C& g4 ]4 q( E7 L% {1 S) O3 t3 l2 e) h! B) h6 [
我将先原型这个刚性板上。所以祝我好运。
5 D8 @+ v7 w* v6 h# D
. V9 T& S: ]1 E6 m+ C* D$ @, |PCB原型来制造。
$ e7 x% L. s* L' X! D8 Q
* Y3 S! t; |! g& ~$ T; I; M2 c U只是一个快速更新。这个项目和我的一些其他的董事会已经送到家。目前它只会死板的PCB,这样它便宜犯错。如果一切顺利,那么下一个版本将flex。; D X; W( F7 O9 W2 A7 p
( t! v b0 M* i5 ]1 o/ G8 b既然我已经打发他们回去我会公开的文件。你可以在这里找到它们http://workspace.circuitmaker.co ... joshua-Elsdon/Watch sectionOverview/ k+ m0 q2 [& [9 W* ]$ U
+ D- F! b1 J. F" s1 hPCB原型组装。7 x$ e1 B! v' G5 V$ [; S1 l5 t, D
" o" d: k3 a ^6 F
只是一些图片我的街头信誉。& S4 V0 {% L, C) Q9 _: b5 \1 l
8 ` i* A0 P$ l
焊接通量在一个注射器是一个主要帮助整理短裤上开发flex连接器。- U* s2 i7 F ~% x9 ?6 F0 q7 _
5 u; s3 ?5 Y0 B* m. X
8 X) A5 a3 _* T6 i' e* `5 Z# ]连接器的热感摄像机很难获得在英国,所以我得到了我的FLIR我打捞的传感器。! K D% Z; ]$ x* K" o o
8 q' w d" \3 P8 {# l: ]% a1 V' y
显示和电池。酥饼是奇妙的。每个100卡路里的热量,可以很容易地完成一包10。) {# D0 @$ ]6 F2 j
0 i3 K; Y8 v; `# |9 c" M+ f
' U/ g" O4 r. U
- |7 H- ~8 Y" q3 y* i7 X" k; B8 y3 [
设计相当苗条,一些空间振动电机和套管,它应该是关于我现在一样的厚度(没有热感摄像机)腕表。
2 P' _+ F# }. X! m" U- [: [$ {# W
仍然需要抚养,我可以确认程序,但默认情况下所有的电源都关闭,所以我需要验证之前冒着相机和oled价值更高的组件。也没有开关,所以我需要得到的低功耗特性之前工作在某种程度上我可以焊接的电池。只是把东西睡觉就够了,只需要配置一个唤醒销,也许找到一种方法检测芯片,我在调试会话,这样我就能旋转循环而不是睡觉6 F4 { G F3 z2 ]3 A. i8 g8 A
3 Q% Q U" d% K7 L6 ?
/ P" v2 L/ O5 H/ \6 C0 Q P
相关资料请见circuitmarks+ l3 p& Q: j! i' B/ [
+ c9 v( H( Z+ [! Z, y+ M" c
) C; x3 p: U0 o" H( ? v+ `& ^6 Y
原文请见hackaday2 V, z3 C' l; L8 J' u7 z6 X5 |
5 i- f" [) n2 V6 d7 @* m2 c) z5 ]2 c) n& e+ p. a
|
应该还可以做得更小