柜台自动翻牌子装置
本帖最后由 apple武 于 2017-7-16 09:19 编辑柜台自动翻牌子装置制作
项目要求:当在银行或者火车站办理业务时,一般柜台上都会有一个牌子正面显示工作人员的信息(姓名、工号。。。。。),反面显示有事离开,请稍候之类的话语。当工作人员有事情离开时,要显示这个牌子的反面。当工作人员回来正常工作时,这个牌子就翻转到工作人员信息的那一面。 解决方案:1、通过放置在椅子上面的一个压力传感器来自动检测是否有人坐下 2、通过一个小电机来对牌子进行180度的翻转操作 材料的选择:
[*] 压力传感器选择了薄膜压力传感器RFP612,如下图所示
当时选择压力传感器时,大致做了一个计算,确定该传感器的一个量程。一个人坐在凳子上,凳子所受的力大致会有人体重力的70-80%(只是一个估计,并没有称来实际地测一下),假设一个人重量是70kg,那他作用在凳子上的力有700*0.8=560N(假设G=10N/Kg)当人坐在凳子上时,和凳子的一个接触面积大致有370*370mm2,要是选择这个压力传感器的面积太小,人有可能会坐不到这个传感器上面,从而检测出错,故最后选择了一个面积比较大的46mm*46mm,通过单位面积上分到的力一致可以得到传感器上面分到的力大致有46*46/(370*370)*560 = 8N,当然有可能算到的数值要比这个要大,因为测得人和凳子的接触面积会比370*370要小,故最后在商家的建议下选择了一个5Kg的。这个传感器输出的是一个阻值,当没有压力时,输出的阻值将近无穷大,当压力为满量程50N时,输出阻值为10K左右。通过一个电阻分压,将压力的变化转换成电压的变化,然后采用一个电压比较器,将该输出电压和一个阈值电压进行比较输出一个高低电平给单片机进行读取。这个阈值电压可以通过一个滑动变阻器来进行调节,找到一个合适的阈值,然后用定值电阻来进行替代。
[*]电机采用了一个180度的舵机来实现,如下图所示
这边因为要翻转,故只要可以转动180度,对于转速并没有太大的要求,工作电压在4.8-6.0V,直接用开发板上面的5V供电即可。
[*]虽然控制器要求不是太高,但是由于用习惯了STM32,这次直接还是用32了,32依旧是挚爱。
以上基本是整体的一个框架,或者说是思路。大家有什么好的建议,还望指点!接下来就准备开始写程序了。搭建该系统了! ----smtudou
2017/7/16
https://bbs.21ic.com/data/attachment/forum/201707/14/152750uy4tyert1ptwubtg.png
制作过程
[*]硬件部分
要实现功能:将传感器电阻的变化引起的电压的变化和设定的阈值进行比较,当人没有坐下时,输出高电平1;当人坐下时,输出低电平0.
首先通过电阻分压将电阻的变化转化为电压的变化,然后通过LM393比较器对该电压和阈值电压进行比较。
电路图如下所示:
通过一个滑动变阻器来模拟压力传感器输出,当没有人坐下时,压力传感器输出电阻无穷大,此时A点的电压接近VCC=5v
当有人坐下时,压力传感器输出电阻为20K左右,此时A点电压接近400mV
为了滤除传感器输出信号的噪声,采用了两阶的低通滤波,设定低通滤波的截止频率为20Hz,这样,可以有效地避免意外的干扰,提高准确性。
通过滑动变阻器设定阈值为3V。
故可以得到
当没有人坐下时,Vin+ > Vin- , 输出为高电平
当有人坐下时, Vin+ < Vin- , 输出为低电平
[*]软件部分
1)驱动舵机部分
舵机是一种通过PWM占空比来进行调节的位置伺服型电机,简而言之,是通过PWM的占空比大小调节舵机转动的角度,一般舵机需要的PWM的频率是50Hz(周期20ms),对于180度转动的舵机来说,高电平的时间一般是0.5ms----2.5ms之间,对应于0---180°。
0.5ms--------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;
故,我们只需要开一个定时器,产生20ms的一个pwm方波,然后,调节占空比就可以控制该舵机转动相应的角度。利用TIM3 CH1----PA6产生20ms的一个pwm方波。
程序如下:
//TIM3 pwm初始化
//freq:产生pwm的频率
//pre:分频比
//duty:占空比
//TIM3 CH1 ----PA6
//TIM3 CH2 ----PA7
//TIM3 CH3 ----PB0
//TIM3 CH4 ----PB1
void TIM3_PWM_Init(u16 freq,u16 pre,u16 duty)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //打开TIM3时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); //复用功能打开
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //复用功能打开
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置PC6为复用推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE); //将TIM3完全映射PC3-->PC6 TIM3 CH1
TIM_TimeBaseStructure.TIM_Period = freq; //TIM3参数配置
TIM_TimeBaseStructure.TIM_Prescaler = pre;
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, & TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //PWM模式配置
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_Pulse = duty;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //极性为低,这样可以保证当duty变大时,led变亮
TIM_OC1Init(TIM3, & TIM_OCInitStructure); //使能TIM3 CH1
// TIM_SetCompare1(TIM3, duty);
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3 CH1的CCR1预装载
TIM_Cmd(TIM3, ENABLE); //开TIM3
}
2)信号读取
通过PC6脚来读取传感器比较输出的信号,当检测到低电平时,让舵机转动180度,若是高电平,则,一直保持在0度
配置PC6引脚为上拉输入状态
由于没有其他事情要做,故直接在主循环中进行引脚电平状态的读取,一下是源代码
if(SIN1 == 0)
{
delay_ms(10);
if(SIN1 == 0)
TIM_SetCompare1(TIM3, 2475); //对TIM3 CH1 比较寄存器重新赋值,此时正脉冲宽度2475ms,对应于180度反转
else
TIM_SetCompare1(TIM3, 575);
}
}
以上就是大致所做,有不合理的地方,还望指点。源程序见附件!
------smtudou
2017/7/18
https://bbs.21ic.com/data/attachment/forum/201707/14/152750uy4tyert1ptwubtg.png
感谢分享 没必要吧,红外检测,调节一下距离和角度范围,MCU里逻辑设置检测间隔,多久检测不到人体红外信号就可以触发反转不就OK了. 若是用树莓派这样的单板电脑还可以用opencv进行面部识别,不同的人坐下来翻转不同的牌子,离开都翻转一样的牌子。 JLennon 发表于 2017-7-29 12:43
没必要吧,红外检测,调节一下距离和角度范围,MCU里逻辑设置检测间隔,多久检测不到人体红外信号就可以触 ...
什么型号的红外传感器那? JLennon 发表于 2017-7-29 12:47
若是用树莓派这样的单板电脑还可以用opencv进行面部识别,不同的人坐下来翻转不同的牌子,离开都翻转一样的 ...
还没有用过这么高级的 不用压力检测了,直接用按键来触发翻牌
页:
[1]