【外网项目分享】STM32 Blue Pill 物联网扩展板(上)+ w0 C7 Q, L0 ?; \2 e6 K) n
& Y8 B7 [5 X9 w4 @" U( I( F7 j# _+ T6 [
# @/ V. P: @( m9 X0 O6 f
STM32现在是家庭智能网格兼容
c% \/ u- k2 A$ D
$ j" [6 L9 `, y什么是家庭智能网格?/ v! v1 m; O% }/ K) C
% d1 R* h4 s6 Z, i' u- ~6 W' Q
正如在家庭智能网格Hackaday项目中所描述的,它是一个物联网网格框架,使用树莓派的定制射频传感器和中继器。它是开放源码的,可以与MQTT和OpenHAB2连接。
- l! \! R5 e [# t0 D4 m( j& i8 E! b
mesh协议被设计得足够简单,这样您就可以在空闲时间自己理解并调试它,同时还具有实用的功能级别。在这个洪水网格项目日志中有关于网格协议的更多细节2 w/ a. Y/ D7 ~3 u" ^' l
$ H: n8 j) y6 v8 s) u
STM32的硬件支持
( x8 N/ Q( O5 [ d' d6 n% n g# R+ C; z. J- {0 ?. @( [7 s
- RF节点:已经在使用github STM32 RF节点项目上可用的源代码运行
- RF PIO:用于PIO伺服控制的github固件也是如此. \- i4 o5 B4 \& @* S
. c6 E/ ?' W$ x) tSTM32应用程序
5 E) @' e/ {. D) v# @9 `: @& F) V: K$ l0 y8 U8 N
- 加热器:固态继电器的pwm控制
- 嗅探器:不是真正的射频嗅探器,而是协议嗅探器,因为它忽略了格式,但仍然必须坚持一个通道,这有助于查看请求和确认调试。
- uart接口: u0 V$ c3 S; j6 D- f
. ?/ S( f' ?! c* s3 G
射频狗收集广播到网格中的信息6 o5 Q; X% F$ x7 ~7 e2 k
使用确认将目标消息加入到特定节点。请注意,确认是从目标到源的网格宽度,而不是像增强的Shockburst那样从一点到另一点。
) a7 b6 d( Q. c现在,正如我们在下面几节中所看到的,STM32带来了使用ARM mbed的可能性以及它所带来的一切。: Z, X! j9 N- {8 \
1 T' h1 M1 k/ B; h+ E/ D5 v
容易使用网格函数与ARM mbed和现代c++
0 }$ v f, o' l7 X4 t4 |1 h
% D% Q1 H# |9 t7 s6 G在这里,我们可以从RF uart接口中找到充当RF加密狗的代码片段。在github上完成文件. D2 [' [8 c' ?4 Q2 h
//nRF Modules 1:Gnd, 2:3.3v, 3:ce, 4:csn, 5:sck, 6:mosi, 7:miso, 8:irq
1 Z# c* X) U- F/ r; vRfMesh hsm(&rasp, PC_15, PA_4, PA_5, PA_7, PA_6, PA_0);4 V5 F4 I! O' o! [; w
void rf_broadcast_catched(uint8_t *data,uint8_t size)! z% z9 ^& J y: Q
{, n0 P1 @; K- o1 K
switch(data[rfi_pid]), O' |; p* s4 K: Q2 m6 a1 W
{
* b. |$ [' ?9 X# R. ] case rf_pid_0xF5_alive:
2 ] ]9 p8 p( Q4 @5 @3 N...
4 j. A8 C0 O& ~int main()5 U" _5 T, c- t: K8 v
{
0 q% z' C. L3 c; n) O1 f) U hsm.init(CHANNEL);* X) b$ ~3 t6 V# Q, N
hsm.setNodeId(NODEID);' K$ w: F: _8 g) r
hsm.attach(&rf_broadcast_catched,RfMesh::CallbackType::Broadcast);
6 z, B, U0 T) f& {' x...
5 |' I; V0 B, p$ ~& B- 提供监听和发送的通道,这个通道是可以更改的,目前网格是在单个通道上运行的,这是根据通道集群和通道交换得来的特性。
- 通过广播连接到一个网格事件' l9 L8 P. l: c0 h; G, U& T
7 x/ }; l# U0 n
这里,我们有一个节点应用程序的代码片段,它使用公认的对等消息。在github上完成文件6 w8 w4 H- d9 e" s6 s8 j
void rf_message_to_me(uint8_t *data,uint8_t size)* r6 V9 @+ |2 s5 X' x
{
) E0 Y, Q+ S1 N( R4 T$ c if(data[rfi_pid] == rf_pid_heat), e% } @: Z% z5 E9 H: R. ]
{
$ @ K( m! }3 C1 `* |/ i heat_val = data[4];//heat_val payload : Size Pid SrcId TrgId HeatVal CRC
! j3 N8 Y# {6 d5 N+ V( h8 T& M...
b2 }. B9 K9 U! V9 bmain()9 H* t3 E3 b6 ^, F& @
{1 `) n, o6 y0 g) H# M( p' J
hsm.init(CHANNEL);
( C7 L$ l/ _; ^, w) v" J8 ] hsm.setNodeId(NODEID);
4 p# ]% a6 e0 `' U' [0 d, G0 i hsm.attach(&rf_message_to_me,RfMesh::CallbackType::Message);
; C/ R- H) V* A( ~; ]! p0 v4 z... 8 n7 s& C8 i6 Z* m: J( j
- 附件是一个消息类型。
- 由于节点id已经提供给了mesh驱动程序,因此只提供与目标节点id匹配的消息。
- 确认传输也由网格驱动程序处理。6 U+ \, `1 f0 G& J7 x0 T
2 J5 [ r& x4 d$ ^) K5 q( k
给自己弄个j-Link+ ]# O+ W- M: C6 n% a% a( R9 Q
- R0 }* D) v' t( O像专业人员一样调试
9 Y" d: k! }1 m* ]2 T8 c" u6 A& i8 V7 M! [6 |; z) e; g- W
- 因为将低成本flasher和使用ST-Link和co混用,导致我我错失了调试得良好机会,
- 为了获得ARM-M0和RF的单SoC,我不得不开始使用RE,所以我必须有一个闪烁器和调试器
- 请注意,将ST- link更新为J-Link OB并将其与ST组件以外的组件一起使用是错误的。
- 所以我决定用j-Link EDU
$ ]: T! j) j9 W8 e& t
2 _/ X& C0 f$ U7 W, @3 P为什么是j-Link EDU ?
( f9 Q$ S/ \2 ]1 H- Y8 a
4 u) O! g) J; q$ ?" z没有必要为诸如“它就是奏效的!”这样的理由争论太多。,这是真的,我试过了,也兼容了所有严肃开放的IDE,所以让我们更专注于比较 9 Y4 d, s* D/ F/ F2 z" m' h3 N- r
! P# u1 z3 E- r7 r" W# l与ST-Link相比,j-Link提供的VTref输入可以感知目标电压,因此可以使用它自动化脚本。 ; q' ~& a% T" S1 |( E9 f
) m8 ]7 p8 T9 ]; E+ [
注意,埃杜是相对便宜(60€)使用仅供爱好者和教育,但有一个对于皮层M更便宜的EDU-mini(16€)。
7 j2 p4 I% p* m* {: C# }
" R3 R9 i) a. |$ i! dEDU比mini有更高的下载速度,支持更多的CPU变体。
' }5 ^3 e. Q3 r1 I o+ X2 \) I5 y/ D- X' {
它可以控制电源高达300毫安5V完全关闭目标,这是非常重要的测试自动化,因为它不同于复位。
; b* j* v: Q% `) a& L: x, D# P7 L+ ]) e( M
它有一个虚拟UART,而不是从ARM cortext中提升,但是您可以使用外部UART保持您的ARM程序不被修改,并将其连接到调试器的外部插脚。
' ?$ b; m/ O" e
2 a& k: y/ Q4 H* p( o- ~ R所以你可以试用,调试器,电源控制,电压传感和UART / [8 a- W: s' z( t
' f% R+ ^9 R1 m2 Dsegger设备的安全性正在提高,所以您不必担心在SW更新之后克隆会停止工作。
- @ K4 s) U# d- X6 b& X! {6 w9 U$ u( Q9 E
从这里去哪里, [9 l4 t7 e$ X& h I0 {
6 s* D3 k$ a, M3 D- J* q7 b
我将开始更新我的脚本和环境使用j-Link edu,我将打破与ST-Link实用程序的兼容性。 3 M) s% A1 D& ]2 J: d# @
' V/ Z: g5 o0 r) f/ b我将评估调试器接口Ecpilse和segger特定的 / D6 `( B" e5 |- C2 ^9 }$ U
" P# T& I- e R5 `
我将开始使用python包装调试接口,使其快速且可访问
' w# o) d2 ] n G# n* s( N6 Y3 Q. S" {
感觉无刷直流速度和位置控制' M' _/ q4 V4 G; V
0 t; T4 q1 b. u3 |9 Q$ O6 E实验设置 " I8 J) @3 f. Q9 N* V; E
 - PS4操纵杆非常适用同时操纵多个变量,适用于实验,触摸板增加了位置参考的可能性。
- 这里的树莓派不是BLDC控制所需要的,而是作为游戏杆的界面,加上它的开发环境更适合编程。
- 虽然射频节点板内置了USB接口,但是USB软件集成起来比较复杂,而且使用内存,所以UART还有时间进行实验。USB到UART的连接也可以达到同样的效果。
- RFPIO板用于伺服电机控制而不是无刷直流电动机,但它是一个很好的无刷直流电动机实验平台,因为它公开了PWM输出并具有无线电连接。
- 无线电连接在这里用处不大,但它实际上是和非常重要的隔离介质之间的测试PC机和电机测试台。这种优势在这里没有使用,只是因为电源已经调节了电流。) t9 n" O4 t; f4 h
) I0 S G( |, t) S1 h注意安全:3 R% M% M5 h9 K$ m% O
3 [# \' J' P4 a% ^9 O
使用带有实验控制器的普通电池是危险的,可能会导致测试台着火。使用保险丝、限流电源或可靠的控制器。 + \( q* z, S* Q! `9 d1 \) a
8 m1 e( b7 ~: b. w- 一个便宜的逻辑分析仪在使用的模式下,与Saleae logic SW一起工作,这是一个伟大的和经济的分析组合。
- 来自eBay的L6234D使用了一个商业化的模块,但是这个模块没有提供太多的选项,因为所有的支持都是连接在一起的,并且没有感应电阻。所以这只能在开电压回路中控制。
7 Y! ^. b9 G/ w& a. T
6 s2 G) v, m4 ^' n2 i9 H演示
' |5 B; T" u5 _
& y- W# h- {" r4 @这个演示中有趣的部分不是第一次旋转bldc的革命,而是:
4 t2 A1 S! N3 U* O: F0 F) ?- 在不同的环境中集成这么多小的SW协议
- 通过直接操纵多个变量并在逻辑分析仪上观察脉冲,人们可以感受到无刷直流电动机是如何工作的
! b5 T; }( k& t4 H, u" P9 P
2 R' O6 N7 R, y3 B9 {7 S开环控制:BLDC =步进电机
# F8 }6 f+ `1 Z' t9 L- 在不考虑转子位置的情况下,改变每个线圈的电压总是可能的。
- 如果电压不足以处理扭矩,这肯定会导致步骤的缺失。正如在BLDC中步骤是巨大的一样,错过它们会造成伤害,并且不会被忽视。
- 解决的办法是增加电压,但是你浪费的能量不是转矩,而是保持电机的位置。由于没有反作用力,电机处于静止状态时,电流要大得多。
- 在这里使用的无刷直流电动机消耗约50毫安,转速很少每秒和高达180毫安在停止位置与7.2伏特。
2 E, Z0 p8 z1 n; I: d
3 D9 D F0 N' r K* J
控制参数 4 x# ~/ I% D; s
每一个关于BLDC控制的新视频或图表都能让我理解更多的东西,这就是为什么尽管互联网上有大量的文档和教程,为什么不添加另一个简单的视图。
3 {! c& W. P q/ h4 s. H% V- 速度在应用下一个电角度位置之前作用于延迟,注意最大命令更新频率小于pwm信号频率,否则无效(图中两者的比例不相同)。
- 电压增加了脉冲宽度。虽然这里只显示了一个pwm信号,但是这3个信号的宽度脉冲都是成比例地增大和减小的。
- 从软件的角度来看,这个位置甚至更简单,因为你只需要根据手指在触控板上的移动比例增加或减少电角度。每个角度的正弦信号被用来定义相应电桥的脉冲宽度。
' F' Q. b9 _8 ]( ?& A: H8 m2 U
软件
: {/ D/ k5 E9 V7 Z; m5 h( O抱歉把源代码作为图片,但源代码插件是如此菜了,代码几乎无法阅读,所以我保持VSCode的颜色。" d& P# Y* s4 G* @3 K. Z# C
; s, l8 E2 O+ |- X# M0 M4 r6 p神奇的地方就是,角度为int,让它更简单,我甚至不使用一个合适的单位作为放射微粒或学位,而256°256/360单位适合表窦porecessed一旦和存储为查找。
2 j0 d) }( J6 a, [$ X! P( V6 ^# C! s" A' C: R
+ U! \# |$ `/ d- F6 g
当M3以72MHz运行时,对浮点数的实时计算花费了7.2 us,而这里的查找函数只花费了大约1 us,所以对于50 us pwm周期= 20 KHz(最大控制刷新率)来说,这仍然是值得的。
, @) Q" B" d# ^9 ~0 [: c$ g2 U) t" M! m9 d' z$ }; d$ l2 E
7 Q1 W/ n0 G, E. f0 `
请注意,L6234D可以高达150千赫从死开关时间的观点。
2 v9 _& ^6 Z+ r' t- O+ L9 D) q# O) ?- ]8 V4 Q( I8 _3 s' m- A
N" U- S, n7 c2 a- P, j- ?
我使用mbed-os作为开发环境,为什么要这么复杂的使用它呢?
: l) j. j- Q: l. f {! ?& TPwmOut pwm1;
- f% v; l" j) o4 a7 x H. f! b) I: R" _) }8 @# R' x
pwm1 = 1; * v( Z! [6 [$ R; `0 \
这很利于开箱即用的配置和初始化。它可以为您做任何事情,从cmsis HAL api调用到计算应该将哪些引脚分配给哪些替代函数。它配置pwm模式,所有堆栈都要经过赋值运算符的重载,这会使函数时间从微秒变为毫秒。& V8 ~% v/ W. _, `" h1 r
# j$ T9 q: y* q- `* N
这就是为什么寄存器的直接使用是围绕一条指令的。
# {7 @, e1 r+ C( L& o9 i
7 Y' r) M, ]' k' e信号) {/ d8 N- u6 ^+ Z2 P
; g9 m- y7 ?" c( f: @. u- 我们可以在逻辑分析仪上看到中心对齐的pwm信号。
- 注意,频率显示为10khz,而不是上面提到的20khz,这是正确的,因为将两个脉冲粘在一起可以将变化减少一半。
# B; C0 L& d' D ; q5 F3 N' G* a9 U
/ l/ I# J3 V6 h( Y7 g2 O1 x* ~
结论
- G' r. I ] c6 @7 X% p
, y/ d- H; y% O. Q6 B一旦你同时控制了速度和电压,你就能更好地了解电机什么时候停了,什么时候没踩踏板,你可以按住它,施加更高的电压,看它什么时候能克服施加的扭矩。这不是科学,但是可以让你更加随意的处理其他科学公式。$ \ M" p/ I0 n& H( t
2 I/ A5 b$ F9 {5 X) q1 C2 Y. ]
下一步是查看扭矩控制回路,然后可能是反电动势监控,为BLDC设计一个特定的扩展板,并在面向现场的控制视频前进行冥想。但可以肯定的是,对于我的倒立摆移动机器人的计划来说,这种控制已经足够了。! |7 N9 u9 Z% J8 M& V" V [
r! N4 r' ^2 |; F
即将到来&创意
% l) C0 l* ?+ E4 ^) r; ~- x! v4 |$ g; G
带有传感器的射频节点已经启动并运行,RFPIO已经启动并运行,是时候考虑下一步应该做什么了。 $ g( B+ n8 W7 M( R4 f
3 v/ j) T- i: `3 T n- 超声制图采用多种低成本HC-SR04或05
8 ]7 X6 M% N( c0 T# Q, o4 d # q" j- X5 U& ]
实验见hello_超声样本。9 D2 n( \9 V' G
扩展板应该为多个超声波传感器提供准备就绪的连接输出( U1 ]+ K- T& w
- BLDC:经过很长时间的犹豫和反射后,一个严重的跳跃机器人操场不能绕过电机控制
/ Z6 _2 o9 c" e& G
/ O6 z: l: X- \: f. b. U 使用L6234 PowerSo20模块或稍后一些较低的电流L6234直接浸在同一块板上。8 L8 G; h1 q2 D0 t( S
- 只使用伺服:x24引脚和x12伺服的RFPIO双使用不是只使用伺服的最优尺寸,也许另一种最优的布图对于一些疯狂的多伺服项目会更方便。
+ ^- L8 q6 R4 F7 ?, r " C& o, O2 {- t5 T- f+ Z. E
+ \& C. ^9 t# X' K% o$ F) y
0 e" [" L [4 r% O
来源>>9 j- U$ g6 L5 b: R4 g5 N
|