上次用 SK150 模块改装了一台电源:变废为宝-将淘汰的PC电源改装成直流稳压源,一直想升级一下。为什么呢,一个原因是之前打印的是白色,和灰色的模块不搭,另一个原因是想增加 USB 接口,直接输出 5V,还有一个是电源按钮忘记把指示灯接上了。然后就是在使用时,发现要是加个语音识别功能就最好了,两只手在测量时,嘴里叫一声打开电源,关闭电源,就非常方便了。趁着年前有点时间,功能全都加上。

语音识别
语音模块淘宝一搜就有很多,我买的是 ASR-PRO 核心板 4M 版本,花了 9.5。
模块问题不大,但配套的开发软件就是垃圾,说明文档也很烂,搞的我重新写了几次,就因为开发软件逻辑混乱,自动保存不知道保存的啥,另存为后自动保存又自己改名字,什么配置模式,编程模式,字符编程随便点一下,之前的工作就废了。反正就是乱七八糟的,就这样的玩意儿居然还拿出来商用,太业余了。
还有一个就是固件下载之前一定要先生成模型,也就是安装固件里的文字生成语音模型。这个必须用手机号实名注册才行。

按照模块的开发板设计的:

源文件使用嘉立创专业版,没用 KiCAD 是因为板子很简单又小,方便免费打板:
ADJpower_ASR_V1.0 链接: https://pan.baidu.com/s/18X4nqUIlhQyUX2NETzVrwA?pwd=s7fu 提取码: s7fu
SK150 模块有标准的 Modbus-RTU (CRC-16/MODBUS) 协议,见SK150 模块产品说明书:
链接:https://pan.quark.cn/s/a023f8d13edf 提取码:AX8x
但是,这个说明书里有问题,电压值是 x100 后转换成十六进制,电流值是 x1000 再转换成十六进制。 不然按照说明书来电流调整都会小 10倍。
语音模块的代码如下,我只加了开关输出,一些我常用的电压电流值:
输出开启 (ON):01 06 00 12 00 01 E8 0F
输出关闭 (OFF):01 06 00 12 00 00 29 CF
| 电压 (V) |
值(单位:0.01V) |
十六进制指令 |
语音 ID |
| 3.6 |
360 |
01 06 00 00 01 68 89 B4 |
2 |
| 4.2 |
420 |
01 06 00 00 01 A4 89 E1 |
3 |
| 8.4 |
840 |
01 06 00 00 03 48 89 0C |
4 |
| 12.0 |
1200 |
01 06 00 00 04 B0 8A BE |
5 |
| 12.6 |
1260 |
01 06 00 00 04 EC 8A 87 |
6 |
| 16.8 |
1680 |
01 06 00 00 06 90 8A 06 |
7 |
| 20.0 |
2000 |
01 06 00 00 07 D0 8A 66 |
8 |
| 24.0 |
2400 |
01 06 00 00 09 60 8F B2 |
9 |
| 25.2 |
2520 |
01 06 00 00 09 D8 8F C0 |
10 |
| 29.4 |
2940 |
01 06 00 00 0B 7C 8F 1B |
11 |
| 30.0 |
3000 |
01 06 00 00 0B B8 8E 88 |
12 |
| 36.0 |
3600 |
01 06 00 00 0E 10 8C 66 |
13 |
| 电流 (A) |
值 (单位: 0.001A) |
十六进制指令 |
语音ID |
| 0.2 |
200 |
01 06 00 01 00 C8 D9 9C |
14 |
| 0.5 |
500 |
01 06 00 01 01 F4 D8 1D |
15 |
| 1.0 |
1000 |
01 06 00 01 03 E8 D8 B4 |
16 |
| 1.5 |
1500 |
01 06 00 01 05 DC DA C3 |
17 |
| 2.0 |
2000 |
01 06 00 01 07 D0 DB A6 |
18 |
| 2.5 |
2500 |
01 06 00 01 09 C4 DF C9 |
19 |
| 3.0 |
3000 |
01 06 00 01 0B B8 DF 48 |
20 |
| 3.5 |
3500 |
01 06 00 01 0D AC DC E7 |
21 |
| 4.0 |
4000 |
01 06 00 01 0F A0 DD 82 |
22 |
| 4.5 |
4500 |
01 06 00 01 11 94 D5 F5 |
23 |
| 5.0 |
5000 |
01 06 00 01 13 88 D5 5C |
24 |
| 6.0 |
6000 |
01 06 00 01 17 70 D6 1E |
25 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341
|
#include "asr.h" extern "C"{ void * __dso_handle = 0 ;} #include "setup.h" #include "HardwareSerial.h"
uint32_t snid; void ASR_CODE(); void app();
void ASR_CODE(){ set_state_enter_wakeup(15000); switch (snid) { case 0: Serial1.write(0x01); Serial1.write(0x06); Serial1.write(0x00); Serial1.write(0x12); Serial1.write(0x00); Serial1.write(0x01); Serial1.write(0xE8); Serial1.write(0x0F); break; case 1: Serial1.write(0x01); Serial1.write(0x06); Serial1.write(0x00); Serial1.write(0x12); Serial1.write(0x00); Serial1.write(0x00); Serial1.write(0x29); Serial1.write(0xCF); break; case 2: Serial1.write(0x01); Serial1.write(0x06); Serial1.write(0x00); Serial1.write(0x00); Serial1.write(0x01); Serial1.write(0x68); Serial1.write(0x89); Serial1.write(0xB4); break; case 3: Serial1.write(0x01); Serial1.write(0x06); Serial1.write(0x00); Serial1.write(0x00); Serial1.write(0x01); Serial1.write(0xA4); Serial1.write(0x89); Serial1.write(0xE1); break; case 4: Serial1.write(0x01); Serial1.write(0x06); Serial1.write(0x00); Serial1.write(0x00); Serial1.write(0x03); Serial1.write(0x48); Serial1.write(0x89); Serial1.write(0x0C); break; case 5: Serial1.write(0x01); Serial1.write(0x06); Serial1.write(0x00); Serial1.write(0x00); Serial1.write(0x04); Serial1.write(0xB0); Serial1.write(0x8A); Serial1.write(0xBE); break; case 6: Serial1.write(0x01); Serial1.write(0x06); Serial1.write(0x00); Serial1.write(0x00); Serial1.write(0x04); Serial1.write(0xEC); Serial1.write(0x8A); Serial1.write(0x87); break; case 7: Serial1.write(0x01); Serial1.write(0x06); Serial1.write(0x00); Serial1.write(0x00); Serial1.write(0x06); Serial1.write(0x90); Serial1.write(0x8A); Serial1.write(0x06); break; case 8: Serial1.write(0x01); Serial1.write(0x06); Serial1.write(0x00); Serial1.write(0x00); Serial1.write(0x07); Serial1.write(0xD0); Serial1.write(0x8A); Serial1.write(0x66); break; case 9: Serial1.write(0x01); Serial1.write(0x06); Serial1.write(0x00); Serial1.write(0x00); Serial1.write(0x09); Serial1.write(0x60); Serial1.write(0x8F); Serial1.write(0xB2); break; case 10: Serial1.write(0x01); Serial1.write(0x06); Serial1.write(0x00); Serial1.write(0x00); Serial1.write(0x09); Serial1.write(0xD8); Serial1.write(0x8F); Serial1.write(0xC0); break; case 11: Serial1.write(0x01); Serial1.write(0x06); Serial1.write(0x00); Serial1.write(0x00); Serial1.write(0x0B); Serial1.write(0x7C); Serial1.write(0x8F); Serial1.write(0x1B); break; case 12: Serial1.write(0x01); Serial1.write(0x06); Serial1.write(0x00); Serial1.write(0x00); Serial1.write(0x0B); Serial1.write(0xB8); Serial1.write(0x8E); Serial1.write(0x88); break; case 13: Serial1.write(0x01); Serial1.write(0x06); Serial1.write(0x00); Serial1.write(0x00); Serial1.write(0x0E); Serial1.write(0x10); Serial1.write(0x8C); Serial1.write(0x66); break; case 14: Serial1.write(0x01); Serial1.write(0x06); Serial1.write(0x00); Serial1.write(0x01); Serial1.write(0x00); Serial1.write(0xC8); Serial1.write(0xD9); Serial1.write(0x9C); break; case 15: Serial1.write(0x01); Serial1.write(0x06); Serial1.write(0x00); Serial1.write(0x01); Serial1.write(0x01); Serial1.write(0xF4); Serial1.write(0xD8); Serial1.write(0x1D); break; case 16: Serial1.write(0x01); Serial1.write(0x06); Serial1.write(0x00); Serial1.write(0x01); Serial1.write(0x03); Serial1.write(0xE8); Serial1.write(0xD8); Serial1.write(0xB4); break; case 17: Serial1.write(0x01); Serial1.write(0x06); Serial1.write(0x00); Serial1.write(0x01); Serial1.write(0x05); Serial1.write(0xDC); Serial1.write(0xDA); Serial1.write(0xC3); break; case 18: Serial1.write(0x01); Serial1.write(0x06); Serial1.write(0x00); Serial1.write(0x01); Serial1.write(0x07); Serial1.write(0xD0); Serial1.write(0xDB); Serial1.write(0xA6); break; case 19: Serial1.write(0x01); Serial1.write(0x06); Serial1.write(0x00); Serial1.write(0x01); Serial1.write(0x09); Serial1.write(0xC4); Serial1.write(0xDF); Serial1.write(0xC9); break; case 20: Serial1.write(0x01); Serial1.write(0x06); Serial1.write(0x00); Serial1.write(0x01); Serial1.write(0x0B); Serial1.write(0xB8); Serial1.write(0xDF); Serial1.write(0x48); break; case 21: Serial1.write(0x01); Serial1.write(0x06); Serial1.write(0x00); Serial1.write(0x01); Serial1.write(0x0D); Serial1.write(0xAC); Serial1.write(0xDC); Serial1.write(0xE7); break; case 22: Serial1.write(0x01); Serial1.write(0x06); Serial1.write(0x00); Serial1.write(0x01); Serial1.write(0x0F); Serial1.write(0xA0); Serial1.write(0xDD); Serial1.write(0x82); break; case 23: Serial1.write(0x01); Serial1.write(0x06); Serial1.write(0x00); Serial1.write(0x01); Serial1.write(0x11); Serial1.write(0x94); Serial1.write(0xD5); Serial1.write(0xF5); break; case 24: Serial1.write(0x01); Serial1.write(0x06); Serial1.write(0x00); Serial1.write(0x01); Serial1.write(0x13); Serial1.write(0x88); Serial1.write(0xD5); Serial1.write(0x5C); break; case 25: Serial1.write(0x01); Serial1.write(0x06); Serial1.write(0x00); Serial1.write(0x01); Serial1.write(0x17); Serial1.write(0x70); Serial1.write(0xD6); Serial1.write(0x1E); break; }
}
void app(){ while (1) { delay(100); } vTaskDelete(NULL); }
void hardware_init(){ vol_set(5); setPinFun(2,FORTH_FUNCTION); setPinFun(3,FORTH_FUNCTION); Serial1.begin(115200); xTaskCreate(app,"app",128,NULL,4,NULL); vTaskDelete(NULL); }
void setup() { }
|
结构
结构还是用的 Solidworks 我也尝试过用 freeCAD,但是易用性实在不好,我实在不想学了。

因为要增加一块小板,还有喇叭麦克风,所以在之前的基础上增加了长度,另外开始是想做一个喇叭腔体放左边的,后来发现声音已经够大了,所以就懒得折腾了,不过位置还是留着了。
源文件下载:
SK150.SLDPRT 链接: https://pan.baidu.com/s/1cP8gwmTejCkrd9v1A6fcKQ?pwd=tuu8 提取码: tuu8
SK150.STEP 链接: https://pan.baidu.com/s/1yjHJnCcTu9I7EgCVFSPhNw?pwd=2prk 提取码: 2prk
装配
装配完成图片:

打印有点瑕疵,不过颜色搭得上了。语音功能正常,我也不录视频了,麻烦。
source
https://mianao.info/pc-power-supply-adjustable-dc-voice-control/
评论
发表评论