|
快过年了,公司还没有放假,也没有什么事情做,闲来无事把之前改进的ID模拟卡,详细细节发个帖子,常年潜水看贴,年终发帖给坛友当个乐子,闲言少叙,进入正题:
成品展示:
(TYPE-C的开孔方法也是跟论坛高人学的,我就说论坛能学到真东西 )
从最初的原理验证老站发帖(http://bbs.mydigit.cn/read.php?tid=2144071) 到勉强能看,再到我觉得比较完善。这个玩具断断续续来说已经玩了差不多有8年了。
之前DIY的ID卡在也发过帖子详见:https://www.mydigit.cn/thread-272474-1-1.html
使用起来有如下缺点:
1、STM8S是没有断开电源的,处于休眠状态,单按键唤醒和切换卡号,长期使用起来的话电池一个星期左右就没有电了,偶尔STM8S唤不醒。
2、虽然可以一次存储多张ID卡,但是都是写死在程序里面的,不够灵活,如果要改,还需要改程序 编译下载 还需要下载器,自己玩玩可以,如果是一个产品的话 这些是致命的。
3、电路不够精简,有冗余器件。
4、ID卡天线问题,之前是拆其他门禁钥匙ID卡的天线,很细 容易断。
以上就是上一版的各种痛点,此次改进如下:
1、为了解决续航问题,将纽扣电池改为锂电池+TYPE-C充电,解决续航问题,单按键为总电源,按键按下 单片机就发ID卡号,5S后停止发送卡号,进入蓝牙模式。
2、为了解决正删改查卡号的问题:
A.不能写死在程序里,刚好STM8S有128个字节的EEPROM,程序运行后从EEPROM里面读取8字节的卡号,128字节做如下规划
| STM8 EEPROM数据区 |
|
| addr | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|
| 0x4000 | 1 | 1 | 0x00 | 0x01 | 0 | 0 | 0 | 0 |
| 1 | 0x4008 | FF | F5 | 20 | 00 | FC | 69 | 3C | D4 | 1号卡 | 2 | 0x4010 |
|
|
|
|
|
|
|
| 2号卡 | 3 | 0x4018 |
|
|
|
|
|
|
|
| 3号卡 | 4 | 0x4010 |
|
|
|
|
|
|
|
| 4号卡 | 5 | 0x4018 |
|
|
|
|
|
|
|
| 5号卡 | 6 | 0x4020 |
|
|
|
|
|
|
|
| 6号卡 | 7 | 0x4028 |
|
|
|
|
|
|
|
| 7号卡 | 8 | 0x4030 |
|
|
|
|
|
|
|
| 8号卡 | 9 | 0x4038 |
|
|
|
|
|
|
|
| 9号卡 | 10 | 0x4040 |
|
|
|
|
|
|
|
| 10号卡 | 11 | 0x4048 |
|
|
|
|
|
|
|
| 11号卡 | 12 | 0x4050 |
|
|
|
|
|
|
|
| 12号卡 | 13 | 0x4058 |
|
|
|
|
|
|
|
| 13号卡 | 14 | 0x4060 |
|
|
|
|
|
|
|
| 14号卡 | 15 | 0x4068 |
|
|
|
|
|
|
|
| 15号卡 |
前面8字节记录 第一字节记录当前使用的是第几张卡 第二字节是总共存储了几张卡 第三四字节记录卡槽位的占用情况,一bit代表一张卡,2字节16位最高位不用。剩余四字节暂时保留,余下的分别每8字节记录一张卡号。
B.接下来解决如何方面的对卡号进行正删改查,增加蓝牙透传芯片是一个不错的选择,最开始是用的nRF connect软件发送命令字节来操作,但用起来实在不方便,想着最好是能有个安卓软件。按几个按钮就能操作,于是研究了一下安卓软件怎么搞,发现这个APP Inventor(http://ai2.17coding.net/)这个是真不错,很方便的就能搞一个安卓程序,搭积木一样的编程,现在很多少儿编程中文编程都是用的这种方式,很简单。
3、为了解决天线问题,后面找了个小电机抽出里面的铜丝,随便绕了个10多圈就可以用了,解决了我的大问题。
由于还是习惯用AD加上对自己的库用的比较放心不用去验证,所以只能白漂捷配了,在此郑重感谢捷配(https://www.jiepei.com/)每个月一次免费打样机会,快递也给力发货后一天就到货了。
原理图和PCB
关键代码:
- #include "HAL/HAL.h"
- void BtStart()
- {
- digitalWrite_HIGH(PC4);
-
- Uart_Init(); //串口初始化
- TIM1_Cmd(DISABLE);
- TIM2_Cmd(DISABLE);
-
- delay(300);
-
- BT_Init();
- }
- void Tim2_Init()
- {
- TIM2->ARRH = (uint8_t)(1000 >> 8);
- TIM2->ARRL = (uint8_t)(1000);
- TIM2->PSCR = 0x04;
-
- TIM2->EGR = 0x01;
- TIM2->SR1 = (~0x01);
- TIM2->CR1 |= 0x01;
- TIM2->IER |= 0x01;
- }
- uint16_t time;
- bool state = false;
- #pragma vector=0xF
- __interrupt void TIM2_UPD_OVF_BRK_IRQHandler(void)
- {
- TIM2->SR1 = (~0x01);
-
- time++;
- if(time > 4000)
- {
- time = 0;
- state = true;
- }
- }
- void setup()
- {
- IDCard_Init(); //发送卡号
- Tim2_Init(); //启动4S定时
- pinMode(PC4,OUTPUT);
- digitalWrite_LOW(PC4);
- }
- void loop()
- {
- uint8_t packet[20];
- uint8_t packetLen;
-
- if(state)
- {
- state = false;
- BtStart();
- }
-
- if(Uart_ReceiveDataProcessing(packet,&packetLen) == 0)
- {
- dcapp_packet_parse(packet,packetLen);
- }
- }
- int main(void)
- {
- /*设置内部高速时钟16M为主时钟*/
- CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
- /* millis()函数使用的定时器提供时钟节拍 */
- Delay_Init();
-
- setup();
- for(;;)loop();
- }
复制代码 程序和PCB 以及APP Inventor源码 蓝牙插件 自己写的ID卡10位卡号转曼切斯特 码插件,以及安卓APP
通过百度网盘分享的文件:IDCard
链接:https://pan.baidu.com/s/1LIfuXt6i8WNASkg82exxKw?pwd=atqy
提取码:atqy
注意:由于我用的蓝牙芯片是不具有通用性 程序原理图以及APP不能全部照搬,可改用其他蓝牙透传的芯片,程序稍加修改就可以。
下期预告:桌面时钟
下期更精彩 尽请期待!!!
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|