【外网项目分享】STM32 Blue Pill 物联网扩展板(上)
$ ?: d9 g5 f. \7 }0 ]3 [
2 d* k5 N+ h/ N5 I: h# ~+ b
2 T2 }5 v7 M. `7 U' G; Z% @8 b& v
9 B D% v$ b# K4 {9 m; t: zSTM32现在是家庭智能网格兼容
& t! W7 G2 L9 s! Y& F( @' ?$ S- a/ e* o5 D$ ?. U; ~
什么是家庭智能网格?' r6 X4 Y; [. \: J/ K
7 _( t/ c6 ^3 v- `' ^# Z: l正如在家庭智能网格Hackaday项目中所描述的,它是一个物联网网格框架,使用树莓派的定制射频传感器和中继器。它是开放源码的,可以与MQTT和OpenHAB2连接。8 ^9 F+ d! Z) J$ H. n' s
- K. A! v0 n2 p( T3 y
mesh协议被设计得足够简单,这样您就可以在空闲时间自己理解并调试它,同时还具有实用的功能级别。在这个洪水网格项目日志中有关于网格协议的更多细节
7 M5 u; x% S2 n* G
8 e+ e; L f: [0 ]! q& X" ESTM32的硬件支持& B; V) Z5 {' U9 `9 S
9 y$ w2 N& I! G' C& T) ]- RF节点:已经在使用github STM32 RF节点项目上可用的源代码运行
- RF PIO:用于PIO伺服控制的github固件也是如此
' ~8 H% F3 i) b b. L 0 H( `0 I# g A
STM32应用程序* |. {( S+ L9 ?+ ]" p# t+ f) ~7 N! r9 {
% o5 ^1 a" |/ y! H/ Y9 O
- 加热器:固态继电器的pwm控制
- 嗅探器:不是真正的射频嗅探器,而是协议嗅探器,因为它忽略了格式,但仍然必须坚持一个通道,这有助于查看请求和确认调试。
- uart接口:. Q& r7 e" m6 `: R0 s
, X6 [: Y2 k) m4 I! w4 n7 j& }
射频狗收集广播到网格中的信息
$ y. V. A7 L7 }* L( q 使用确认将目标消息加入到特定节点。请注意,确认是从目标到源的网格宽度,而不是像增强的Shockburst那样从一点到另一点。/ b: g6 F1 W4 d( d
现在,正如我们在下面几节中所看到的,STM32带来了使用ARM mbed的可能性以及它所带来的一切。: y7 V0 M$ k# H$ V2 ~
- G, G5 L. i1 w4 R, V3 j
容易使用网格函数与ARM mbed和现代c++
' {1 o" J9 [" D* O: [% a1 ], v3 x2 K3 g5 k
在这里,我们可以从RF uart接口中找到充当RF加密狗的代码片段。在github上完成文件5 d' ]. D/ C5 G8 H
//nRF Modules 1:Gnd, 2:3.3v, 3:ce, 4:csn, 5:sck, 6:mosi, 7:miso, 8:irq
+ p9 \) e5 f7 p5 A5 x4 sRfMesh hsm(&rasp, PC_15, PA_4, PA_5, PA_7, PA_6, PA_0);
4 A+ F, D& _" m! d3 gvoid rf_broadcast_catched(uint8_t *data,uint8_t size)) b* p8 ~$ j6 }. W+ C
{
$ D" u, I, s% [( ?8 j# v4 ^ switch(data[rfi_pid])/ o! a; J5 }9 y( M
{
g, _9 G$ I2 N: F case rf_pid_0xF5_alive:
& s0 w f$ ]. u# D' L.../ P4 Y* }4 V1 O3 y/ i; U- {
int main()
; \& k2 _( w/ G& }( B3 j, T- w; B" h5 ~{
% n( |" r8 d6 p* B: ? hsm.init(CHANNEL);
; R( |7 p3 ?* J$ h3 ~0 ^ hsm.setNodeId(NODEID);) @ j7 C ~0 t4 u2 |' D
hsm.attach(&rf_broadcast_catched,RfMesh::CallbackType::Broadcast);
* d4 w3 p8 R3 I9 m b... 6 I! a- m- m% y. R
- 提供监听和发送的通道,这个通道是可以更改的,目前网格是在单个通道上运行的,这是根据通道集群和通道交换得来的特性。
- 通过广播连接到一个网格事件0 e5 v! l8 a7 o5 w9 N5 b
& e% M! s- W7 ?9 X这里,我们有一个节点应用程序的代码片段,它使用公认的对等消息。在github上完成文件
7 H) ?! y# L, C, V6 `- Svoid rf_message_to_me(uint8_t *data,uint8_t size)
* O4 \: n. F4 d h$ ^: j{
# R6 Z! e0 L m1 o5 R$ G! ^+ \% w% r if(data[rfi_pid] == rf_pid_heat)
3 s" G. L* f; ^ {; B6 O- _+ g" R: U
heat_val = data[4];//heat_val payload : Size Pid SrcId TrgId HeatVal CRC. \2 x3 y% q" P% e. C
...
% X) q4 R+ Z, o: K4 tmain()2 x% a9 r7 H( k9 M6 Y' x2 O( K+ u
{7 r" j$ A) S M. e1 @7 `
hsm.init(CHANNEL);" }- q- s3 u# |. \- B( K9 z7 R
hsm.setNodeId(NODEID);
3 G7 o4 T( `4 Q8 T, j6 `7 [ hsm.attach(&rf_message_to_me,RfMesh::CallbackType::Message);! B* q& n! K: K' {6 z
...
- q& I6 Y8 L. |9 ]/ \: }. K- X9 j- 附件是一个消息类型。
- 由于节点id已经提供给了mesh驱动程序,因此只提供与目标节点id匹配的消息。
- 确认传输也由网格驱动程序处理。% D/ x6 c0 d, O, g
. d6 @2 U" j+ C& `给自己弄个j-Link+ ^" S) I2 _' o/ p7 n& |) w, ?
9 }) X0 \* Z7 j; O& k" F) l0 A5 @像专业人员一样调试
8 j4 ~9 X$ Q; Y/ R0 O y/ |) G
$ b9 X; i9 M, p. ?! H- 因为将低成本flasher和使用ST-Link和co混用,导致我我错失了调试得良好机会,
- 为了获得ARM-M0和RF的单SoC,我不得不开始使用RE,所以我必须有一个闪烁器和调试器
- 请注意,将ST- link更新为J-Link OB并将其与ST组件以外的组件一起使用是错误的。
- 所以我决定用j-Link EDU
8 a, O/ i( V" J% M, q
) S9 M; M- j+ q: E为什么是j-Link EDU ?- a! y4 @% d4 |6 A7 i
0 T# g5 M0 w# D2 y; }8 P$ G1 A没有必要为诸如“它就是奏效的!”这样的理由争论太多。,这是真的,我试过了,也兼容了所有严肃开放的IDE,所以让我们更专注于比较 + v. _* h: s: S+ t/ C4 t
3 t! ~9 }# i2 z! c, [与ST-Link相比,j-Link提供的VTref输入可以感知目标电压,因此可以使用它自动化脚本。
5 d' Q& M5 Z% \3 z
9 j3 b" v l8 c, m7 a注意,埃杜是相对便宜(60€)使用仅供爱好者和教育,但有一个对于皮层M更便宜的EDU-mini(16€)。
; |4 F3 g- I& ]$ m2 j8 l- L
8 R( g9 G4 G2 h- O T' BEDU比mini有更高的下载速度,支持更多的CPU变体。
: `& s) F, q8 `5 R+ x& w+ `3 T2 e( W _ n; ^" i. H# E
它可以控制电源高达300毫安5V完全关闭目标,这是非常重要的测试自动化,因为它不同于复位。 % U# M/ w) B4 g6 i1 S$ }' J
; P# `% g2 k. @( W5 y9 h0 ]/ s
它有一个虚拟UART,而不是从ARM cortext中提升,但是您可以使用外部UART保持您的ARM程序不被修改,并将其连接到调试器的外部插脚。
6 `+ E/ y0 C9 o5 z+ b4 D6 ]; q7 H+ q `' @" P
所以你可以试用,调试器,电源控制,电压传感和UART
$ i5 \: e8 K5 q8 f6 g2 b! D. `% ^$ f: Y0 M7 v
segger设备的安全性正在提高,所以您不必担心在SW更新之后克隆会停止工作。 4 B+ D" A, t: Z! V$ n' \
/ Y' Z* @# m# C! B) b9 B从这里去哪里+ Y8 \- ~& `% v$ ]1 b
8 R {1 S9 t3 d$ z
我将开始更新我的脚本和环境使用j-Link edu,我将打破与ST-Link实用程序的兼容性。 4 }; m% }2 S( \
' M$ j D; W4 V3 r, H我将评估调试器接口Ecpilse和segger特定的 : v4 \' f, K: |
. A9 a& n5 {5 |% ]0 e5 d
我将开始使用python包装调试接口,使其快速且可访问
# q, F! x$ B6 A# p! ?5 n7 k+ a, Q0 H6 |
感觉无刷直流速度和位置控制' G4 ~- N' E0 J* z8 ]) N
! G/ b9 g2 g2 y6 y实验设置 5 [: h, Y2 A; p+ r2 k/ I
- PS4操纵杆非常适用同时操纵多个变量,适用于实验,触摸板增加了位置参考的可能性。
- 这里的树莓派不是BLDC控制所需要的,而是作为游戏杆的界面,加上它的开发环境更适合编程。
- 虽然射频节点板内置了USB接口,但是USB软件集成起来比较复杂,而且使用内存,所以UART还有时间进行实验。USB到UART的连接也可以达到同样的效果。
- RFPIO板用于伺服电机控制而不是无刷直流电动机,但它是一个很好的无刷直流电动机实验平台,因为它公开了PWM输出并具有无线电连接。
- 无线电连接在这里用处不大,但它实际上是和非常重要的隔离介质之间的测试PC机和电机测试台。这种优势在这里没有使用,只是因为电源已经调节了电流。1 a$ W; c# B' t5 ~6 e
0 @8 [% X( y# j: k. p) }6 U4 `注意安全:$ ]+ }+ i; t4 y7 I5 D; e
; B5 r+ F9 z$ P; J( V
使用带有实验控制器的普通电池是危险的,可能会导致测试台着火。使用保险丝、限流电源或可靠的控制器。 ' S, z! X, j" i2 L' r9 a0 r, V
; k, @+ I" l* N* x, l% u, F: ?- 一个便宜的逻辑分析仪在使用的模式下,与Saleae logic SW一起工作,这是一个伟大的和经济的分析组合。
- 来自eBay的L6234D使用了一个商业化的模块,但是这个模块没有提供太多的选项,因为所有的支持都是连接在一起的,并且没有感应电阻。所以这只能在开电压回路中控制。
) s/ J. v% a1 o# s" K7 F! }6 F" @9 ~
5 y7 N, N! V' Z$ b0 r演示2 g& Y$ k" a! t$ K0 l
: S( \+ d! Y: y$ M* h$ |% F% r6 c# ^
这个演示中有趣的部分不是第一次旋转bldc的革命,而是:
) T# s, ]5 c8 T `2 e- 在不同的环境中集成这么多小的SW协议
- 通过直接操纵多个变量并在逻辑分析仪上观察脉冲,人们可以感受到无刷直流电动机是如何工作的
- Y9 T% q* H$ P' b1 x
; M* L q/ h) z# r# W; c
开环控制:BLDC =步进电机
2 Q `! e8 n" `" p$ J0 S- 在不考虑转子位置的情况下,改变每个线圈的电压总是可能的。
- 如果电压不足以处理扭矩,这肯定会导致步骤的缺失。正如在BLDC中步骤是巨大的一样,错过它们会造成伤害,并且不会被忽视。
- 解决的办法是增加电压,但是你浪费的能量不是转矩,而是保持电机的位置。由于没有反作用力,电机处于静止状态时,电流要大得多。
- 在这里使用的无刷直流电动机消耗约50毫安,转速很少每秒和高达180毫安在停止位置与7.2伏特。
7 }% ]2 u. ~% G; v I8 I; p- A& y
$ @- L9 @# A; K8 C+ Q控制参数 / V/ g0 E/ t$ [5 R* J
每一个关于BLDC控制的新视频或图表都能让我理解更多的东西,这就是为什么尽管互联网上有大量的文档和教程,为什么不添加另一个简单的视图。
% n, R5 d" c/ c+ @( d- 速度在应用下一个电角度位置之前作用于延迟,注意最大命令更新频率小于pwm信号频率,否则无效(图中两者的比例不相同)。
- 电压增加了脉冲宽度。虽然这里只显示了一个pwm信号,但是这3个信号的宽度脉冲都是成比例地增大和减小的。
- 从软件的角度来看,这个位置甚至更简单,因为你只需要根据手指在触控板上的移动比例增加或减少电角度。每个角度的正弦信号被用来定义相应电桥的脉冲宽度。
- |9 d/ L$ f# w1 T
软件1 Q- n) a7 J: }. G3 y1 L1 {9 ~
抱歉把源代码作为图片,但源代码插件是如此菜了,代码几乎无法阅读,所以我保持VSCode的颜色。0 b" c* X- I+ z, o- q
( N( x8 X; k! N7 g6 `$ s神奇的地方就是,角度为int,让它更简单,我甚至不使用一个合适的单位作为放射微粒或学位,而256°256/360单位适合表窦porecessed一旦和存储为查找。 w) ^5 P8 z; y* O' a4 f
7 |1 W2 |* }/ g/ m
( H9 D+ K+ L- P7 b* O* S当M3以72MHz运行时,对浮点数的实时计算花费了7.2 us,而这里的查找函数只花费了大约1 us,所以对于50 us pwm周期= 20 KHz(最大控制刷新率)来说,这仍然是值得的。9 h- J# p- M6 { U& W* E
5 s3 x. |* u% L% R0 e4 f
, |$ M; N3 E1 R# g4 e9 x请注意,L6234D可以高达150千赫从死开关时间的观点。3 C: i" r) N W5 Q9 g4 u
6 u' o' T5 y; B+ F- P
( }) M- U' @, v! b! M2 W我使用mbed-os作为开发环境,为什么要这么复杂的使用它呢?3 D8 N7 h3 C' Z9 t
PwmOut pwm1;
3 D. D; g* k4 O5 R4 `
, H" V* V" l# z `0 Y, V) f4 ipwm1 = 1;
2 ~2 [) X2 b9 C' l$ j4 y这很利于开箱即用的配置和初始化。它可以为您做任何事情,从cmsis HAL api调用到计算应该将哪些引脚分配给哪些替代函数。它配置pwm模式,所有堆栈都要经过赋值运算符的重载,这会使函数时间从微秒变为毫秒。- e/ H: D; Z' j' Q- t8 H
/ C o. ]( b: ^- X
这就是为什么寄存器的直接使用是围绕一条指令的。: I% ]7 f7 v4 k8 I+ M% }
1 N# d- ?; l8 z, I; B信号: y% Y* Z' t+ L Z
: ? w3 d# s" m" b
- 我们可以在逻辑分析仪上看到中心对齐的pwm信号。
- 注意,频率显示为10khz,而不是上面提到的20khz,这是正确的,因为将两个脉冲粘在一起可以将变化减少一半。
- l, ~. e9 }$ I 7 N D- v6 B0 v6 _" Y4 E$ Q, N0 v
! V4 L T! k9 M) Z结论
! R7 D0 ]& v5 ?7 ^! \5 G
( S9 c/ Y, x L+ ?7 ]( v C: {) G一旦你同时控制了速度和电压,你就能更好地了解电机什么时候停了,什么时候没踩踏板,你可以按住它,施加更高的电压,看它什么时候能克服施加的扭矩。这不是科学,但是可以让你更加随意的处理其他科学公式。
! q0 j0 p' O* P. [
( w5 X6 P b) f; y i# E4 q/ ?下一步是查看扭矩控制回路,然后可能是反电动势监控,为BLDC设计一个特定的扩展板,并在面向现场的控制视频前进行冥想。但可以肯定的是,对于我的倒立摆移动机器人的计划来说,这种控制已经足够了。' L" S7 W1 [4 h% i: a5 J3 H8 a
3 E4 ~: P; c+ d+ L1 k即将到来&创意
8 B1 B9 }' [. O4 |8 o
1 I7 s2 J) I# l/ o带有传感器的射频节点已经启动并运行,RFPIO已经启动并运行,是时候考虑下一步应该做什么了。 + r1 ? @- T4 t9 k
* R1 x9 y% W+ \2 u. K* g
- 超声制图采用多种低成本HC-SR04或058 t5 i) e2 M1 g# \& C" `6 U
# N9 c2 V4 z3 G
实验见hello_超声样本。. o8 F4 B( y8 m. q% ]' t
扩展板应该为多个超声波传感器提供准备就绪的连接输出4 S& s o, t( E3 ~& D8 g
- BLDC:经过很长时间的犹豫和反射后,一个严重的跳跃机器人操场不能绕过电机控制
3 v2 h" ^- [8 M4 L # N A. z% U# d# x
使用L6234 PowerSo20模块或稍后一些较低的电流L6234直接浸在同一块板上。
8 o- Y# q. p- q; P* Z6 w$ }% e- 只使用伺服:x24引脚和x12伺服的RFPIO双使用不是只使用伺服的最优尺寸,也许另一种最优的布图对于一些疯狂的多伺服项目会更方便。- z( K5 r; ]0 X g1 I3 \1 V
9 R3 ? j" c' {4 z( l
9 W6 J1 ~' g3 m: o+ g
0 N9 A! ]8 m& h8 Q/ p! v" k来源>>
, `) Y, ?7 k; r# p) V7 Q |