数码之家

 找回密码
 立即注册
搜索
查看: 3637|回复: 25

[改装] 应坛友建议,开放主题。全套资料!按两次遥控解锁键自动开启后备箱。

[复制链接]
发表于 2020-4-23 07:21:02 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 liyuqing0318 于 2020-4-23 07:32 编辑

媳妇车遥控只有三个按键,一个解锁键,一个上锁键,一个响铃键(不知道厂家怎么想的,设计这么个无用键,不小心按到,声光报警,经常被吓一跳!)用惯了后备箱无钥匙解锁,真适应不了这个后备箱。

改装理想:是用汽车自带遥控器就能进行开启后备箱。

经过观察:发现解锁时按一次遥控按键,车黄灯会闪两次,上锁时就只会闪一次,而且转向和双闪时黄灯点亮的时间比解锁时的时间要长一些。

设计原理:抓取解锁时黄灯闪两次的机会,进行记录,如果在三秒内,又出现了第二次黄灯闪两次,就开启后备箱锁。

材料价格:拉伸弹簧一个10元,拉杆电机一个12元,贴片元件十几个5元。
在此感谢   极速PCB超级工厂对本项目的大力支持:lol:捷配极速PCB超级工厂

施工只需要把左尾转向灯和后备箱照明灯接两根线拉到后备箱钥匙孔处,再钻一个孔固定拉杆电机,再用铁丝弯个拉杆就可以了。

原理图:I接车尾左侧的转向黄灯,MO接电机,REC用来录取按键组合参数(只要能让黄灯闪四下,就会解锁,方便自己设定按键关系)。
用了几天,非常可靠,因为是精准测量开锁时黄灯点亮的时间,所以转向或双闪时一点都不冲突。
整机待机电流不到4毫安,没给电瓶添加负担。




整个板双面胶加扎带,固定在拉杆电机尾部。



PCB图:


3D图:


实物图:
双面胶+扎带将线路板固定在电机一侧。



上车取后备箱照明灯常电12V。不破坏线,红线直接夹在插头上。


黄色线为转向灯取来的信号线。
红色线为后备箱照明灯取来的常电。
一开始安装在这里,无奈电机力气太小拉不开锁,又把电机改到了钥匙孔那里。

接线很简单:红色线为后备箱照明灯取来的常电。黄色线为转向灯取来的信号线。兰色线接车体。
安装位置后来我改到了箱盖钥匙孔这个地方(这里只需要很小的拉力就可以解锁),安装很简单,我只钻了一个孔,固定了电机一个脚,并把地线一起固定了。泡沫是防止开车时异响。
(电机是通电缩回,断电伸出,我自己在电机伸缩皮套那里加个细弹簧)




==================================

#include <STC8.h>
#include "intrins.h"

#define WT_24M   0x81                      //EEPROM操作24MHz
#define WT_12M   0x83                      //EEPROM操作12MHz
#define WT_6M    0x84                      //EEPROM操作6MHz

bit              Lamp,Key,Cache,OUTb,H1,H2,H3,H4; //灯状态,按键状态,缓存否,输出标记,标记位
unsigned char    Temp,i;                                                          //状态计时
unsigned char    Lamp_H1,Lamp_H2,Lamp_H3,Lamp_H4; //灯亮时间
unsigned int         IN_delay,OUT_delay;                  //输入延时,输出延时
unsigned int     Rec_delay,Unlock_delay;          //解锁时间,录入延时
unsigned char    address;         

sbit IN1      =P5^4;                 //转向灯的输入脚
sbit Rec_key  =P5^5;                 //录制的设定按键

sbit OUT1=P3^0;             //输出脚群
sbit OUT2=P3^1;
sbit OUT3=P3^2;
sbit OUT4=P3^3;


/////////////延时函数=1mS/16//////////////////
void delay(unsigned int i)
{
    unsigned int j;
    for(i; i > 0; i--)
        for(j = 5; j > 0; j--);
}
//////////////端口初始化////////////////
void PortInit()
{
        P3M0=0x00;          //准双向口,灌电流20mA,拉电流150uA
        P3M1=0x00;

        P5M0=0x00;
        P5M1=0x00;
}


/*******输入状态*************/
void IN()                                                          //解锁一次,亮灭两次时间为1S。每次状态为250mS,计25个数,每个数10mS。
{     
        if(++IN_delay>10)            //主循环每运行10次共0.01s就扫描一次
                 {         IN_delay=0;                        //记录次数
                             if(++Temp>250)                 //超过2.5s时长未改变状态
                                            {     
                                                H1=H2=H3=H4=0;    //标记位清零
                                                        Temp=0;  //记录清0
                                                        OUT4=0;   //////////////////
                                        }        
                 if((IN1)&(!Lamp))      //端口跳高,
                                            {
                                                    Lamp=1;           //记录当前灯为高
                                                        Temp=0;    //记录清0
                                                        OUT4=1;           ////////////////////////
                                            }  
                     if((!IN1)&(Lamp))      //端口跳低,
                                            {        Lamp=0;           //记录当前灯为低
                                                    OUT4=0;           ////////////////////////  
                                                        if(!H1)                                //第一次高记录
                                                              {   
                                                                    if(Cache)Lamp_H1=Temp;          //缓存标志为1,记录时间
                                                                if(Lamp_H1-2<Temp&Temp<Lamp_H1+2)
                                                                              {  H1=1; }          //标记位
                                                                else        
                                                                              {  H1=0; }
                                                                        Temp=0;  //记录清0
                                                                  }
                                                        if((H1)&(!H2))                        //第二次高记录
                                                              {        
                                                                    if(Cache)Lamp_H2=Temp;             //缓存标志为1,记录时间
                                                                    if(Lamp_H2-2<Temp&Temp<Lamp_H2+2)
                                                                              {  H2=1; }           //标记位
                                                                        else         
                                                                              {  H2=0; }
                                                                        Temp=0;  //记录清0
                                                                  }
                                                        if((H1)&(H2)&(!H3))                    //第三次高记录
                                                              {        
                                                                        if(Cache)Lamp_H3=Temp;             //缓存标志为1,记录时间
                                                                if(Lamp_H3-2<Temp&Temp<Lamp_H3+2)
                                                                              {  H3=1;  }          //标记位
                                                                else         
                                                                              {  H3=0;  }
                                                                        Temp=0;  //记录清0
                                                                  }
                                                        if((H1)&(H2)&(H3)&(!H4))        //第四次高记录
                                                              {        
                                                                        if(Cache)Lamp_H4=Temp;                //缓存标志为1,记录时间
                                                                    if(Lamp_H4-2<Temp&Temp<Lamp_H4+2)
                                                                              {  H4=1; }          //标记位
                                                                        else         
                                                                              {  H4=0; }
                                                                        Temp=0;  //记录清0
                                                                  }
                                                        Temp=0;  //记录清0
                                            }
                                 if(H1&H2&H3&H4)                        //符合输出条件
                                            {              
                                                    OUTb=1;                //输出标记
                                                        H1=H2=H3=H4=0;    //标记位清零                                                                        
                                        }
                        }
}
/*******输出状态*************/
void OUT()
{                 if(++OUT_delay>20)             //主循环每运行20次共0.02秒就扫描一次
                    {         OUT_delay=0;         
                                      if(OUTb)                        //符合输出
                                               {  OUTb=0;                       
                                                      Unlock_delay=0;                        //解锁时间清零
                                                      OUT1=OUT2=OUT3=1;            //全部输出        
                                                          OUT4=1;              //////////////////////////   
                                                   }
                                         else
                                               {  Unlock_delay++;                      //解锁时间++
                                                   if(Unlock_delay>3)    OUT1=0;
                                                  if(Unlock_delay>5)    OUT2=0;
                                                  if(Unlock_delay>8)    OUT3=0;
                                                                  
                                                       }
                                }
}

/*******EEPROM操作*************/
void IapIdle()                           //iap空闲关闭操作
{
           IAP_CONTR  = 0;         //关闭IAP功能
                   IAP_CMD    = 0;               //清命令寄存器
                   IAP_TRIG   = 0;         //清触发寄存器
                   IAP_ADDRH  = 0x80;      //将地址设置到非IAP区域
                   IAP_ADDRL  = 0;
}
char IapRead(int addr)                   //iap读操作
{                   char dat;
           IAP_CONTR  = WT_6M;    //使能IAP功能
                   IAP_CMD    = 1;               //设置IAP读命令
                   IAP_ADDRL  = addr;      //设IAP低地址  
                   IAP_ADDRH  = addr>>8;   //设IAP高地址
                 IAP_TRIG   = 0x5a;             //写触发命令5a
           IAP_TRIG   = 0xa5;      //写触发命令a5
                   _nop_();
                   dat = IAP_DATA;         //读IAP数据
                   IapIdle();              //关闭IAP功能
                   return dat;
}
void IapProgram(int addr,char dat) //IAP写操作 (地址+数据)
{
                   IAP_CONTR  = WT_6M;    //使能IAP功能
                   IAP_CMD    = 2;               //设置IAP写命令
                   IAP_ADDRL  = addr;      //设IAP低地址  
                   IAP_ADDRH  = addr>>8;   //设IAP高地址
                   IAP_DATA   = dat;       //写IAP数据
                 IAP_TRIG   = 0x5a;             //写触发命令5a
           IAP_TRIG   = 0xa5;      //写触发命令a5
                   _nop_();
           IapIdle();              //关闭IAP功能
}
void IapErase(int addr)                           //IAP擦除操作
{
           IAP_CONTR  = WT_6M;    //使能IAP功能
                   IAP_CMD    = 3;               //设置IAP擦除命令
                   IAP_ADDRL  = addr;      //设IAP低地址  
                   IAP_ADDRH  = addr>>8;   //设IAP高地址
                 IAP_TRIG   = 0x5a;             //写触发命令5a
           IAP_TRIG   = 0xa5;      //写触发命令a5
                   _nop_();
           IapIdle();              //关闭IAP功能
}         

/*******录入状态*************/
void REC()                                          //按键按下为低电平,
{        if(++Rec_delay>500)             //主循环每运行500次0.5秒就扫描一次
               {  Rec_delay=0;
                  if((!Rec_key)&(!Key))      //按键被第一次按下,
                              {  Key=1;            //记录当前按键被按下
                                      Cache=1;                         //缓存标志
                                   }     
                                if((Rec_key)&(Key))      //按键第一次抬起,
                       {  Key=0;            //记录当前按键被抬起
                                          Cache=0;                      //缓存标志
                                             IapErase(0x0040);                    //写入数据前必须先擦除扇区(512字节)写入FF
                                        IapProgram(0x0040,Lamp_H1); //更新密钥        
                                                IapProgram(0x0041,Lamp_H2); //更新密钥
                                                IapProgram(0x0042,Lamp_H3); //更新密钥
                                                IapProgram(0x0043,Lamp_H4); //更新密钥
                                   }
                   }
}

/****************读钥匙密码***********************/
void Load_Password()
{         
     Lamp_H1 = IapRead(0x0040);                //读取密码
         Lamp_H2 = IapRead(0x0041);                //读取密码
         Lamp_H3 = IapRead(0x0042);                //读取密码
         Lamp_H4 = IapRead(0x0043);                //读取密码
}
///////////////////主程序///////////////////////
void main()
{         
     PortInit();                //端口初始化
         OUT1=OUT2=OUT3=OUT4=0;            //关闭全部输出
         Load_Password();           //加载钥匙密码
         WDT_CONTR = 0X24;                        //使能看门狗,定时1.05秒,0x24=00100100
         while(1)
              {        
                     WDT_CONTR |= 0X10; //喂狗 0x10= 00010000
                         IN();                                //扫描灯端口
                         OUT();                            //输出信号
                         REC();                      //学习
                         delay(90);                 //延时 1ms
                  }  
}



===============================










打赏

参与人数 4家元 +62 收起 理由
dahai1270 + 30 原創內容
szmoon + 10 優秀文章
不长叶子的树 + 10
liaozheny + 12 謝謝分享

查看全部打赏

发表于 2020-4-23 11:17:49 | 显示全部楼层
我来个沙发。哈哈。楼主高大上!!!:lol:
回复 支持 反对

使用道具 举报

发表于 2020-4-23 13:20:58 | 显示全部楼层
我的老款哈弗H6运动版也只有3个按键.解锁,上锁,寻车!
回复 支持 反对

使用道具 举报

发表于 2020-4-23 15:12:28 | 显示全部楼层
05款国产第一代福克斯
三键遥控钥匙, 尾门可以单独用遥控开启, 关闭尾门后自动上锁, 也就是说尾门开启时车门还是上锁的

15款标致308S
也是三键遥控钥匙, 单独按尾门开启键, 整车门全部解锁, 关闭尾门需要再按上锁键才锁车, 不够人性化 !
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-23 18:08:45 | 显示全部楼层
hu7235 发表于 2020-4-23 15:12
05款国产第一代福克斯
三键遥控钥匙, 尾门可以单独用遥控开启, 关闭尾门后自动上锁, 也就是说尾门开启时车 ...

所以就把钥匙锁后备箱里了.:titter:
回复 支持 反对

使用道具 举报

发表于 2020-4-23 18:45:38 来自手机浏览器 | 显示全部楼层
liyuqing0318 发表于 2020-4-23 18:08
所以就把钥匙锁后备箱里了.

哈哈哈!确实啊!有解释说是p档因为美国人懒,不爱手刹,要求档位中加入的
回复 支持 反对

使用道具 举报

发表于 2020-4-23 23:10:21 | 显示全部楼层
有创意,有水平,手工点赞。:victory:
回复 支持 反对

使用道具 举报

发表于 2020-4-23 23:46:29 | 显示全部楼层
:lol:以后万一哪一个转向灯坏了,哪就呵呵了。。闪快了。。是不是就弹后箱了。>>
回复 支持 反对

使用道具 举报

发表于 2020-4-24 07:55:32 | 显示全部楼层
liyuqing0318 发表于 2020-4-23 18:08
所以就把钥匙锁后备箱里了.

开了十二年一次也没有把钥匙锁进后备箱过
到是有过2次锁在前机舱, 经典福克斯机盖锁是要用钥匙打开的

使用中体验下来单就钥匙功能早出厂的福克斯更人性化
单开主驾侧门单开后备箱和关闭窗玻璃钥匙都可以控制
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-24 21:50:07 | 显示全部楼层
本帖最后由 liyuqing0318 于 2020-4-24 21:53 编辑
ckh911 发表于 2020-4-23 23:46
以后万一哪一个转向灯坏了,哪就呵呵了。。闪快了。。是不是就弹后箱了。>> ...

这个还真有这个可能,没试过坏了的时候跟开锁的频率是不是一样的。
回去试试,如果是一样的,我就再加100行代码,把暗灯时间也记录比较。

回复 支持 1 反对 0

使用道具 举报

发表于 2020-4-26 00:28:33 | 显示全部楼层
liyuqing0318 发表于 2020-4-24 21:50
这个还真有这个可能,没试过坏了的时候跟开锁的频率是不是一样的。
回去试试,如果是一样的,我就再加100 ...

:lol:这个要是能在防盗电脑上做手脚就好子因为上锁开锁都有信号输出到别的电脑。你要是能得到这个信号就比用这个灯的信号稳一点
回复 支持 反对

使用道具 举报

发表于 2020-4-26 08:52:50 | 显示全部楼层
没看明白程序里的录制和读取钥匙密码是什么意思,不是取的黄灯电平信号给单片机计数吗?
回复 支持 反对

使用道具 举报

发表于 2020-4-26 23:50:02 来自手机浏览器 | 显示全部楼层
我搭过两个继电器电容三极管的电路 按两下解锁
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-4-27 20:33:25 | 显示全部楼层
coco_faw 发表于 2020-4-26 08:52
没看明白程序里的录制和读取钥匙密码是什么意思,不是取的黄灯电平信号给单片机计数吗? ...

就是计数用的,我取了个花花的名字。:lol:
回复 支持 反对

使用道具 举报

发表于 2020-4-30 14:08:08 | 显示全部楼层
开双闪会弹后备箱吗:titter:
回复 支持 反对

使用道具 举报

发表于 2020-5-5 07:39:25 | 显示全部楼层
就是折腾!我自己车有后备箱遥控开启功能,我还特意把这个功能取消了。其实后备箱遥控开启没有合理性
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-8 19:37:32 | 显示全部楼层
3335 发表于 2020-4-30 14:08
开双闪会弹后备箱吗

双闪的占空比跟解锁时的占空比不一样,所以开双闪不会弹后备箱。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-8 19:39:11 | 显示全部楼层
jmkl128 发表于 2020-5-5 07:39
就是折腾!我自己车有后备箱遥控开启功能,我还特意把这个功能取消了。其实后备箱遥控开启没有合理性 ...

从超市出来提两袋东西,如果能遥控开后备箱会多么的方便。:lol:
回复 支持 反对

使用道具 举报

发表于 2020-5-8 20:14:56 来自手机浏览器 | 显示全部楼层
liyuqing0318 发表于 2020-5-8 19:39
从超市出来提两袋东西,如果能遥控开后备箱会多么的方便。

是啊,所以我装了脚扫开启
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-19 00:08 , Processed in 0.374401 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表