347945801 发表于 2020-12-23 10:31:01

树莓派魔法盒——让你的圣诞礼物摇起来!

本帖最后由 347945801 于 2020-12-29 14:18 编辑

一年一度的圣诞节又要到了,你的圣诞礼物都备好了吗!反正我是还没有。给人挑礼物有时真的挺伤脑筋。我在网上找了很久,一无所获。后来想想,这次整个有趣的活,我打算在圣诞盒子上花点心思,做一个摇动开锁打开的盒子,就算是给圣诞礼物加点料吧,哈哈。

我们需要的材料:
礼物小盒
小礼物
一些填充物
一个树莓派
一个能给树莓派供电的5V电源
BMX160传感器,180度舵机
一个振动电机模块

需要注意的是:
1、这个盒子不需要太大,比你准备的礼物大一点就好,但一定要好看。
2、你的礼物可以是玩偶这种比较结实的物品,太脆弱易碎不太适合咱们的设计
3、这个树莓派我使用的是4B版本,如果你是一个树莓派上的新手,你可以在网上找到许多教程,我们要用到的是简单的python脚本

第一步、获取传感器的库
将树莓派上电,通过以下指令获取BMX160库
git clone https://github.com/DFRobot/DFRobot_BMX160这是一个包含Arduino和Python的库,我们只需要用它的Python部分

第二步、编写程序
这是一个可以感受加速度的传感器,我们为其设计摇动密码,完成我们设计的摇动密码,我们就能打开礼物盒了import sys
sys.path.append('../')
import time
from DFRobot_BMX160 import BMX160
import RPi.GPIO as GPIO
import signal
import atexit

up = 1
down = 2
left = 3
right = 4

atexit.register(GPIO.cleanup)
servopin = 22
motorpin = 11
GPIO.setmode(GPIO.BCM)
GPIO.setup(servopin,GPIO.OUT)
GPIO.setup(motorpin,GPIO.OUT)
angle=GPIO.PWM(servopin,50)
angle.start(0)

bmx = BMX160(1)

while not bmx.begin():
    time.sleep(2)
bmx.set_accel_range(bmx.AccelRange_2G)
password =

def check():
    data= bmx.get_all_data()
    if data<-8 and data>-4:
      return 1
    elif data>8 and data>-4:
      return 2
    elif data<-8 and data>-4:
      return 3
    elif data>8 and data>-4:
      return 4
    else:
      return 0
   

TIMEOUT=20000    #Set Timeout period, unit(mm)

def main():
index=0
pd_len = len(password)
print("password length=%d"%pd_len)
start_timestamp = time.time()
print("please input the %d gesture"%(index+1))
correct = False
while(correct == False):
    now = time.time()
    if(now - start_timestamp >= TIMEOUT):
      start_timestamp = now
      index = 0
      print("timeout,input again")
      print("please input the %d gesture"(index+1))

    gesture = check()
    #print("**get gesture=%d"%gesture)   
    if(gesture == 0):
      continue;
   
    elif(gesture == password):
      index = index + 1
      GPIO.output(motorpin,GPIO.HIGH)
      time.sleep(0.5)
      GPIO.output(motorpin,GPIO.LOW)
      print("please input the %d gesture"%(index + 1))
    if(index == pd_len):
      correct = True

print("Unlock all gestures successfully, you have entered the system")
print("To enter the gesture password, you have spent %d seconds"%((time.time()-start_timestamp)/1000))
angle.ChangeDutyCycle(float(90)/18+2.5)
time.sleep(20)
angle.ChangeDutyCycle(float(0)/18+2.5)

if __name__ == "__main__":
while True:
    main()


第三步、将这个程序设计为开机启动
具体方法如下
1、切换到root账户
sudo su2、修改rc.local文件
sudo nano /etc/rc.local在exit 0前添加命令
sudo python /xx/xx/text.py

第四步、安装传感器
我们需要将BMX160传感器固定在盒子中的一角,需要准确的按方向固定

第五步、安装舵机和振动电机
我们需要将舵机固定在盒子开口附近,并与盒子的开关做一个联动,我们需要用舵机来作为盒子的锁
安装振动电机的目的是为了每完成一个密码获得一个反馈

第六步、连接硬件
将树莓派和电源固定在盒子底部,连接上传感器和舵机,就可以完成我们的礼物盒了

第七步、放入礼物
我们用一些填充物遮住电路元件,再放入我们的礼物,就可以将盒子盖起来了

第八步、做一些小小的装饰
一个外表空荡荡的盒子肯定不符合圣诞节欢乐的气氛,我们用一些包装纸将他做的好看一点

最后

在送给别人之前,我们来试验一下我们的礼物能打开吗我们按照事先设定好的摇动顺序(密码是上下上下左右左右)就可以打开盒子了
https://www.bilibili.com/video/BV1nZ4y137DM/

以上就是我们的新奇礼物了,当然可能这个盒子比你装在里面的礼物还贵,但不妨碍你把这个盒子也作为礼物的一部分送给你亲爱的朋友
最后祝你圣诞快乐




gray6666 发表于 2020-12-23 21:42:22

if __name__ == "__main__":这句能去掉吗?

347945801 发表于 2020-12-29 09:44:54

gray6666 发表于 2020-12-23 21:42
if __name__ == "__main__":这句能去掉吗?

理论上可以去掉,这算是我的编程习惯

gray6666 发表于 2020-12-30 11:35:19

347945801 发表于 2020-12-29 09:44
理论上可以去掉,这算是我的编程习惯

刚刚又问了度娘,您这个习惯很好,学习了{:6_215:}

pATAq 发表于 2021-1-3 08:44:00

感谢分享
页: [1]
查看完整版本: 树莓派魔法盒——让你的圣诞礼物摇起来!