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

2020-12-238644
精华项目
AI 快速预览详细 收起
本文介绍了如何使用树莓派4B和BMX160传感器制作一个摇动开锁的圣诞礼物盒。项目所需的材料包括树莓派、BMX160传感器、180度舵机和振动电机模块。通过编写Python脚本,设定特定的摇动密码,当用户按照正确的顺序摇动盒子时,舵机会解锁盒子。这个项目不仅有趣,还能激发孩子们对编程的兴趣,并锻炼他们的动手能力。


一年一度的圣诞节又要到了,你的圣诞礼物都备好了吗!反正我是还没有。给人挑礼物有时真的挺伤脑筋。我在网上找了很久,一无所获。后来想想,这次整个有趣的活,我打算在圣诞盒子上花点心思,做一个摇动开锁打开的盒子,就算是给圣诞礼物加点料吧,哈哈。
树莓派魔法盒——让你的圣诞礼物摇起来!图7树莓派魔法盒——让你的圣诞礼物摇起来!图8
我们需要的材料:
礼物小盒
小礼物
一些填充物
一个树莓派
一个能给树莓派供电的5V电源
BMX160传感器180度舵机
一个振动电机模块

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

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

第二步、编写程序
这是一个可以感受加速度的传感器,我们为其设计摇动密码,完成我们设计的摇动密码,我们就能打开礼物盒了
  1. import sys
  2. sys.path.append('../')
  3. import time
  4. from DFRobot_BMX160 import BMX160
  5. import RPi.GPIO as GPIO
  6. import signal  
  7. import atexit
  8. up = 1
  9. down = 2
  10. left = 3
  11. right = 4
  12. atexit.register(GPIO.cleanup)  
  13. servopin = 22
  14. motorpin = 11
  15. GPIO.setmode(GPIO.BCM)
  16. GPIO.setup(servopin,GPIO.OUT)
  17. GPIO.setup(motorpin,GPIO.OUT)
  18. angle=GPIO.PWM(servopin,50)
  19. angle.start(0)
  20. bmx = BMX160(1)
  21. while not bmx.begin():
  22.     time.sleep(2)
  23. bmx.set_accel_range(bmx.AccelRange_2G)
  24. password = [up,down,up,down,left,right,left,right]
  25. def check():
  26.     data= bmx.get_all_data()
  27.     if data[7]<-8 and data[8]>-4:
  28.         return 1
  29.     elif data[7]>8 and data[8]>-4:
  30.         return 2
  31.     elif data[6]<-8 and data[8]>-4:
  32.         return 3
  33.     elif data[6]>8 and data[8]>-4:
  34.         return 4
  35.     else:
  36.         return 0
  37.    
  38. TIMEOUT=20000    #Set Timeout period, unit(mm)
  39. def main():
  40.   index=0
  41.   pd_len = len(password)
  42.   print("password length=%d"%pd_len)
  43.   start_timestamp = time.time()
  44.   print("please input the %d gesture"%(index+1))
  45.   correct = False
  46.   while(correct == False):
  47.     now = time.time()
  48.     if(now - start_timestamp >= TIMEOUT):
  49.         start_timestamp = now
  50.         index = 0
  51.         print("timeout,input again")
  52.         print("please input the %d gesture"(index+1))
  53.     gesture = check()
  54.     #print("**get gesture=%d"%gesture)   
  55.     if(gesture == 0):
  56.       continue;
  57.    
  58.     elif(gesture == password[index]):
  59.       index = index + 1
  60.       GPIO.output(motorpin,GPIO.HIGH)
  61.       time.sleep(0.5)
  62.       GPIO.output(motorpin,GPIO.LOW)
  63.       print("please input the %d gesture"%(index + 1))
  64.     if(index == pd_len):
  65.       correct = True
  66.   
  67.   print("Unlock all gestures successfully, you have entered the system")
  68.   print("To enter the gesture password, you have spent %d seconds"%((time.time()-start_timestamp)/1000))
  69.   angle.ChangeDutyCycle(float(90)/18+2.5)
  70.   time.sleep(20)
  71.   angle.ChangeDutyCycle(float(0)/18+2.5)
  72. if __name__ == "__main__":
  73.   while True:
  74.     main()
复制代码


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


第四步、安装传感器
我们需要将BMX160传感器固定在盒子中的一角,需要准确的按方向固定
树莓派魔法盒——让你的圣诞礼物摇起来!图1
第五步、安装舵机和振动电机
我们需要将舵机固定在盒子开口附近,并与盒子的开关做一个联动,我们需要用舵机来作为盒子的锁
安装振动电机的目的是为了每完成一个密码获得一个反馈
树莓派魔法盒——让你的圣诞礼物摇起来!图2树莓派魔法盒——让你的圣诞礼物摇起来!图3
第六步、连接硬件
将树莓派和电源固定在盒子底部,连接上传感器和舵机,就可以完成我们的礼物盒了
树莓派魔法盒——让你的圣诞礼物摇起来!图9树莓派魔法盒——让你的圣诞礼物摇起来!图4
第七步、放入礼物
我们用一些填充物遮住电路元件,再放入我们的礼物,就可以将盒子盖起来了
树莓派魔法盒——让你的圣诞礼物摇起来!图6
第八步、做一些小小的装饰
一个外表空荡荡的盒子肯定不符合圣诞节欢乐的气氛,我们用一些包装纸将他做的好看一点
树莓派魔法盒——让你的圣诞礼物摇起来!图5
最后

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


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




创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(2)
pATAq
pATAq
感谢分享
gray6666
gray6666
if __name__ == "__main__":这句能去掉吗?
gray6666
gray6666回复347945801
刚刚又问了度娘,您这个习惯很好,学习了
347945801
347945801
作者
回复gray6666
理论上可以去掉,这算是我的编程习惯
- 没有更多了 -