biying 发表于 2014-6-12 03:52:23

免钥匙启动兼自动设防震动缺电防盗报警器设计

本帖最后由 biying 于 2014-6-12 11:14 编辑

带钥匙开车太麻烦;带防盗报警器遥控设防会忘记设防;原车震动报警太灵敏(飞机飞过就叫);报警音千篇一律,不知道是不是自己的车在叫;电瓶电线被剪断失去报警功能而丢电瓶。为了解除以上烦恼,特设计此款免钥匙报警器。思路:采用单键带灯按钮作为密码输入和功能设置,震动传感器选 SW-18010P,报警音色自已设定,自带电池,原车电断电后触发震动报警,打开脚踏板同样触发震动报警(在撬电瓶之前就报警),以后再加入GPS报警定位模块,发送位置信号和短信报警信号。免钥匙、密码识别技术花了2个月时间已经掌握(http://www.amobbs.com/thread-5576508-1-1.html),接下来攻破报警音程序,还是用ATTINY85。拆解在车报警器后发现,原报警器待机电流6毫安以上,用压电蜂鸣器报警发声,是4个三极管推动,有一款压电蜂鸣器还串接一个电感,算了一下谐振应该是2.66KHZ,这样的话应该可以用互补PWM来推动,通过改变频率和相位来产生报警音。现在互补PWM我做出来了:关于ATtiny85的互补PWM功能及死区调节(问题己解决)
http://www.amobbs.com/thread-5584260-1-1.html

暂时设计个怪声音,在此希望有经验的朋友来指导一下这个报警声音应该如何设计。没人指导的话,我估计这个设计可能又要2个月(我平时主要带2岁孩子,只能利用业余时间)完工。

用纸塞住耳朵后测试音量,距离喇叭1米:
看来这个1.8KHZ到3.5KHZ的变化,不用保持占空比为49%就已经很大了,测试了一下电流,36V,只有60毫安左右,效率很高啊!

zyw19987 发表于 2014-6-12 05:58:08

呵呵我又来了。市场上的都是警笛声,从1.8k上升到3.3k然后下降,这个过程的周期改变了声音就变了。

zyw19987 发表于 2014-6-12 07:06:26

真正免钥匙的防盗器是通过低频唤醒,靠近时遥控器自动发送撤防,离开时自动布防。滚动码发送。

lzchuo 发表于 2014-6-12 08:19:29

有些意思 ,

xin 发表于 2014-6-12 08:55:17

LZ要带小孩啊?不上班吗?靠接外单吗?

biying 发表于 2014-6-12 09:39:50

zyw19987 发表于 2014-6-12 07:06
真正免钥匙的防盗器是通过低频唤醒,靠近时遥控器自动发送撤防,离开时自动布防。滚动码发送。 ...

谢谢!低频唤醒还是得要钥匙,只是你这个钥匙是无线的,有时带个钥匙不方便(除非可以植入皮下,这样开家门更方但了),所以我想做成不带钥匙的。

biying 发表于 2014-6-12 09:42:48

本帖最后由 biying 于 2014-6-12 09:48 编辑

xin 发表于 2014-6-12 08:55
LZ要带小孩啊?不上班吗?靠接外单吗?

孩子太小,得早教,我不上班,开了家店,平时不用去管,单片机纯粹是为了自己的需要而初学的。你看我的程序就知道,菜鸟中的菜鸟!也许10年后我的孩子学好了可以接外单。

xin 发表于 2014-6-12 09:50:46

那也好啊,当成兴趣爱好来搞,我也在为小孩的事情发愁。

biying 发表于 2014-6-13 09:33:14

本帖最后由 biying 于 2014-6-14 02:31 编辑

报警音出来了,但是报警音中为什么会伴有“嗒嗒-嗒-------嗒嗒”的爆破音呢?

#include <tiny85.h>
#include<delay.h>
unsigned char LIGHT,Even_numbers=2;
//unsigned char LIGHT;
void main(void)
{
// Declare your local variables here

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port B initialization
// Func5=In Func4=Out Func3=In Func2=In Func1=Out Func0=In
// State5=T State4=0 State3=T State2=T State1=0 State0=T
PORTB=0x1B;
DDRB=0x1B;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
//2.666khz互补PWM实验
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 250.000 kHz
// Mode: PWMA & B top=OCR1C
// OC1A output: Non-Inv., /OC1A connected
// OC1B output: Disconnected
// Timer1 Overflow Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
PLLCSR=0x00;
// 没有以下三行,反相端就不会有输出
DTPS=0x00;
DTVALC=0x55;
DTVALB=0x55;

TCCR1=0x56;
GTCCR=0x40;
TCNT1=0x00;
OCR1A=0x45;OCR1B=0x00;OCR1C=0x8A; //1.8K到3.5K
//OCR1A=0x2E;OCR1B=0x2E;OCR1C=0x5D;//2.666khz

// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=0x00;
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Universal Serial Interface initialization
// Mode: Disabled
// Clock source: Register & Counter=no clk.
// USI Counter Overflow Interrupt: Off
USICR=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;
ADCSRB=0x00;
DIDR0=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

while (1)
      {
      // Place your code here
      
       for(LIGHT=138;LIGHT>70;LIGHT--)//138对应1.8KHZ,70对应3.5KHZ,频率从1.8K到3.5K匀速增加,
                {
         
         
         OCR1C=LIGHT;                  
         if(Even_numbers==2)   //偶数判断后计算占空比为一半,保证音量为最大
         {
            OCR1A=(LIGHT/2);
            Even_numbers=0;
         }
         Even_numbers++;   
         delay_ms(2); //
         
      }
      for(LIGHT=70;LIGHT<138;LIGHT++)//138对应1.8KHZ,70对应3.5KHZ,频率从3.5K到1.8K匀速减少,
                {
         
         
         OCR1C=LIGHT;
         if(Even_numbers==2)   //偶数判断后计算占空比为一半,保证音量为最大
         {
            OCR1A=(LIGHT/2);
            Even_numbers=0;
         }
         Even_numbers++;
         delay_ms(2); //
         
      }
      }
}



奇怪,为什么我现在把程序里的DTPS=0x00;
DTVALC=0x55;
DTVALB=0x55;
这三行去掉了仍然可以有PWM输出,重新写一片全新芯片也一样

如果while (1)里只有这几句: OCR1C=71;
         delay_ms(50);
         OCR1C=70;
         delay_ms(50);
那么爆破音出现的间隔是9秒,是“嗒-----嗒-嗒”9秒后又“嗒-----嗒-嗒”这种。单片机上电从输出PWM音后也是9秒后出现爆破音。

如果把延时改为 OCR1C=71;
         delay_ms(40);
         OCR1C=70;
         delay_ms(40);
那么爆破音出现的间隔是2.67秒,是“嗒”2.67秒后又“嗒”这种。

如果把延时改为 OCR1C=71;
         delay_ms(30);
         OCR1C=70;
         delay_ms(30);
那么爆破音出现的间隔是9秒,是“嗒”,2.67秒后又“嗒”,2.67秒后又“嗒--嗒”这种,周期也是9秒。


如果把延时改为 OCR1C=71;
         delay_ms(5);
         OCR1C=70;
         delay_ms(5);
那么爆破音出现的间隔是0.5秒,是“嗒”0.5秒后又“嗒”这种。我数了11个,耗时5秒。


改为OCR1C=250;
         delay_ms(5);
         OCR1C=249;
         delay_ms(5);后听不到爆破音了


改为OCR1C=137;
         delay_ms(5);
         OCR1C=138;
         delay_ms(5); 那么爆破音出现的间隔是5秒,是“嗒-嗒-嗒”然后5秒后又“嗒-嗒-嗒”这种。

改为OCR1C=137;
         delay_ms(5);
         OCR1C=137;
         delay_ms(5);后是听不到爆破音的,也就是说只要是频率不变就不出问题。

改了这么多,看似没有规律,到底是哪里出了问题?PWM啊,你要给我出难题了。



反复看了马老师关于PWM的帖子,其中一句话给我了灵感:改变PWM的频率,改在计数器溢出中断服务中后(占空比调节依然在主循环中),杂音居然消失了!之前在数据手册中也有看到溢出中断中可以修改TOP值,怎么当时就不会引起重视呢?理论不行,就只有在实践中碰到问题,再回头肯理论了。

biying 发表于 2014-6-14 02:25:19

本帖最后由 biying 于 2014-6-14 02:59 编辑

看了一下TINY85的手册,OCR1A值的改变,芯片会自动同步PWM而不出错。但OCR1C的值如果不在溢出中断中来改的话,容易输出错误的PWM脉冲,之前的杂音应该就是这种错误的脉冲。似乎频率越低越不会出错。应该设计多种警报音,意义:单次震动,5秒内多次震动,数错密码,连续三次数错密码,电池盖被打开,电瓶断电(偷电瓶),表达的意义真多,搞这么多音色怕是难记,看来得简化分类分级,分成:
隔1秒慢响一次响3次,无需理会-----预警(单次震动、数错密码)
隔几秒快响一次持续响10多次,引起警惕-------告警(连续三次数错密码、电池盖被打开)
持续慢响20秒,驱赶坏人-----报警(5秒内多次震动、)
持续快响20秒,驱赶坏人通知主人必须处理----紧急(报警后依然震动3次)
隔1秒快响一次直到用完电,必须处理-----特紧(电瓶断电)

biying 发表于 2014-6-17 01:05:59

本帖最后由 biying 于 2014-6-17 02:38 编辑

有一个端口PB2,我用两条宏定义了两个名字,怎么在端口初始化函数void initial_myself(void)位运算时,只能用key_LED_fu,用key_input后,就会出现PB1(即PWM端口)不输出0。
明白了,忘记key_input定义的是PINB.2,还以为和2是一样的,它是读输入2口呢,这是修改好的,把端口设置调来靠近主函数前面,希望输出端口上电不会输出错误的信号。

现在可以密码控制PWM输出、关闭了

不知勿笑 发表于 2014-6-17 02:55:05

没明白,车没钥匙,怎么取消防盗的

biying 发表于 2014-6-17 03:21:12

本帖最后由 biying 于 2014-6-17 03:31 编辑

加入PC-INT0振动报警,并在休眠程序中添加status = 0; //休眠前返回初始状态,不然唤醒后程序会继续在密码输对的循环里跑,但奇怪为什么单击会出现status = 0的关PWM的效果呢,不可能同时可以选两个循环来运行呢!

奇怪怎么之前的密码锁我没有加入这条而没有出这个唤醒后的问题呢?休眠前没有status = 0应该是原密码锁中的BUG才对,等有时间再详细测试一下。

biying 发表于 2014-6-17 03:30:05

本帖最后由 biying 于 2014-6-17 03:49 编辑

不知勿笑 发表于 2014-6-17 02:55
没明白,车没钥匙,怎么取消防盗的

通过按单个按键输入密码来撤防,设防是停车20秒后自动设防(没有振动20秒后),或者长按按键,听到嘀一声就表示设防。

rom 发表于 2014-6-17 06:15:31

好东西,做个记号先

biying 发表于 2014-6-21 03:13:57

本帖最后由 biying 于 2014-6-21 03:15 编辑

加上报警音,单击按键切换两种报警音,出种怪声音,甚至休眠唤醒后的音都不一样
因为休眠唤醒后的音都不一样了,初步怀疑PWM开关初始化没有做好

biying 发表于 2014-6-21 04:44:12

继续改 void alarm(void)之前好多的错误后,切换声音正常了,但是休眠唤醒后还是不能变音,只能出节奏

biying 发表于 2014-6-21 04:52:41

搞定了,原来是EXT_INT0中断程序里的TIMSK=0x10;   // 允许T/C0比较匹配中断,因为没有开启溢出中断导致不能调PWM频率所致

liliuqun 发表于 2014-6-21 06:44:41

顶楼主   

wxty 发表于 2014-6-21 07:21:25

单按键密码怎么做?

biying 发表于 2014-6-21 09:53:43

wxty 发表于 2014-6-21 07:21
单按键密码怎么做?

看这个帖子http://www.amobbs.com/thread-5576508-1-1.html

biying 发表于 2014-6-21 17:23:00

再三修改之前void alarm(void)函数的诸多错误,没想到昨晚搞到4点多还是错误百出

biying 发表于 2014-6-25 14:40:55

还差断电报警模块程序

biying 发表于 2014-6-26 22:41:21

断电检测之前考虑和振动传感器共用一个IO,但发现断电后就把IO拉低了,会导致振动信号失效,于是考虑用按键INT0共用ADC来检测电源电压变化来实现,现在做成一个不满意的程序,因为按键时会有报警声

biying 发表于 2014-6-27 02:48:17

本帖最后由 biying 于 2014-6-27 09:44 编辑

ADC断电监测完成,和按键负极共用INT0端口,INT0按键端口只需要低电平触发,而ADC只要监测到INT0口在4V到5V之间变化就可以识别到电瓶缺电或者被剪断电瓶电。平时利用振动启动ADC检测,电池电压低于43V就报警,接下来几天找BUG,并试图加入行车电压监测(电池电压低于43V就报警),

电路板为原报警器改造,有振动时为高电平,原天线改为9V备用电池正级

plc_avr 发表于 2014-6-27 08:57:06

哈哈,这个不错,顶一下。

biying 发表于 2014-6-28 09:13:19

本帖最后由 biying 于 2014-6-29 08:55 编辑

有按键时禁用ADC,按键抬起后再启用ADC,实现按键和电池监测共用一个IO

为防止每次读按键就重设端口,修改按键端口设置条件,改为只有闪灯时才重设按键端口。

biying 发表于 2014-8-1 07:00:59

昨天下楼发现自己的摩托车再次遭遇小偷光顾,上次是忘记设报警,导致机头被暴力撇歪,无奈龙头锁太牢靠,前轮没法撇直小偷被迫放弃。这次小偷技术升级,把脚垫偷走,剪断电瓶旁的报警器供电线,导致报警器失效,龙头再次被撇歪。也许下一次可能真的就被偷走了。

liuruoshui 发表于 2014-8-1 08:04:22

不错!做个标记!

lnso 发表于 2015-1-10 10:32:57

mark标记一下

clesun 发表于 2016-5-24 14:20:33

biying 发表于 2014-6-28 09:13
有按键时禁用ADC,按键抬起后再启用ADC,实现按键和电池监测共用一个IO

为防止每次读按键就重设端口,修改 ...

楼主,可否把电路共享下

biying 发表于 2016-5-25 08:33:08

clesun 发表于 2016-5-24 14:20
楼主,可否把电路共享下

不好意思,电路图我没有画
页: [1]
查看完整版本: 免钥匙启动兼自动设防震动缺电防盗报警器设计