当前位置:   article > 正文

树莓派开发相关知识二

树莓派开发相关知识二

1、相关术语

树莓派装载的芯片:BCM2835是一个MCU微处理器,它可以理解为CPU+其它模块的组合。

GPIO:General-purpose input/output,通用型输入输出,其接脚可以供使用者由程控自由使用,PIN脚依现实考量可作为通用输入(GPI)或通用输出(GPO)或通用输入与输出(GPIO)。

GPIO输入:就是输入一个电压信号,可以理解为开关打开后电流可以注入的端口。

GPIO输出:让这个端口输出电,让外接设备通电。当然也可以控制断电。

编程使用时,需要导入RPI包中的GPIO模块, as 将此导入的结果用GPIO表示。

  1. #导入模块
  2. import RPi.GPIO as GPIO

查看GPIO情况:

sudo gpio readall 

注意引脚号,用python编程使用的都是BCM编号。 树莓派外接40引脚,排列在板子的一侧。 引脚可以插入拓展模块,方便操作。

2、常见使用(输出)

  1. #设置是否打印警告
  2. GPIO.setwarnings(True/False)
  3. #GPIO编号格式,我们选择BCM
  4. GPIO.setmode(GPIO.BOARD/GPIO.BCM)
  5. #设置引脚为输出,初始化高电平还是低电平,默认低电平。
  6. GPIO.setup(channel,GPIO.OUT,initial=GPIO.HIGH/GPIO.LOW)
  7. #输出引脚高电平或低电平。
  8. GPIO.output(channel,GPIO.HIGH/GPIO.LOW)

3、简单使用(输出)

  1. #!/usr/bin/env python
  2. #coding:utf-8
  3. import RPi.GPIO as GPIO
  4. import time
  5. GPIO.setwarnings(False)
  6. #设置为BCM引脚
  7. GPIO.setmode(GPIO.BCM)
  8. #设置引脚号,LED18
  9. LED=18
  10. #将引脚设置为输出,初始化为低电平
  11. GPIO.setup(LED,GPIO.OUT,initial=GPIO.LOW)
  12. #设置PWM,设置频率0.5hz
  13. pwm=GPIO.PWM(LED,0.5)
  14. #设置占空比50,即50%高电平,50%低电平
  15. pwm.start(50)
  16. #闪烁
  17. try:
  18. while True:
  19. time.sleep(1)
  20. except KeyboardInterrupt:
  21. #清空GPIO
  22. GPIO.cleanup()

4、常风方法(输入)

轮询、边缘检测、线程回调。 

  1. #设置引脚为输入。
  2. GPIO.setup(channel,GPIO.IN,pullupdown=GPIO.PUDUP/GPIO.PUDDOWN)
  3. #读取引脚高电平或低电平。
  4. GPIO.input(channel)
  5. #读取引脚上升沿、下降沿或都获取
  6. GPIO.waitforedge(channel,GPIO.RISING/GPIO.FALLING/GPIO.BOTH)
  7. #加入线程事件循环
  8. GPIO.addeventdetect(channel,GPIO.RISING/GPIO.FALLING/GPIO.BOTH)
  9. #添加回调函数
  10. GPIO.addeventcallback(channel, callback)
  11. #添加线程事件循环,防抖200毫秒
  12. GPIO.addeventdetect(channel,GPIO.RISING/GPIO.FALLING/GPIO.BOTH, callback=callback, bouncetime=200)
  13. #停止线程事件循环
  14. GPIO.removeeventdetect(channel)

5、简单使用输入

  1. #!/usr/bin/python
  2. #-*- coding: utf-8 -*
  3. # 导入模块
  4. import RPi.GPIO as GPIO
  5. import time
  6. # 设置GPIO模块的警告提示,取消
  7. GPIO.setwarnings(False)
  8. # 设置为BCM引脚
  9. GPIO.setmode(GPIO.BCM)
  10. # 设置引脚号,IN18
  11. IN = 18
  12. # 将引脚设置为输入
  13. GPIO.setup(IN,GPIO.IN,pull_up_down=GPIO.PUD_UP)
  14. # 轮询输入
  15. def inputPolling():
  16. while True:
  17. while GPIO.input(IN) == GPIO.LOW:
  18. time.sleep(0.1)
  19. print '按键轮询输入获取成功'
  20. # 边缘检测
  21. def inputEdge():
  22. while True:
  23. GPIO.wait_for_edge(IN,GPIO.RISING)
  24. print '按键边缘检测输入成功'
  25. # 边缘检测
  26. def myCallback(channel):
  27. print '按键线程回调输入成功'
  28. # 线程回调
  29. def inputEvent():
  30. GPIO.add_event_detect(IN,GPIO.BOTH)
  31. GPIO.add_event_callback(IN,callback=myCallback)
  32. while True:
  33. time.sleep(0.01)
  34. try:
  35. inputPolling();
  36. #inputEdge();
  37. #inputEvent();
  38. except KeyboardInterrupt:
  39. # 清空GPIO
  40. GPIO.cleanup()

无论是哪种模式,明明按了1次,却输出很多次,这是为什么呢?轮询模式的编程错误,以及没有顾虑到按键的防抖。实际上,按键按下的一瞬间,会有多个脉冲,故会判定多次按下,需要通过代码进行防抖。 

6、输入防抖

  1. #!/usr/bin/python
  2. #-*- coding: utf-8 -*
  3. # 导入模块
  4. import RPi.GPIO as GPIO
  5. import time
  6. # 设置GPIO模块的警告提示,取消
  7. GPIO.setwarnings(False)
  8. # 设置为BCM引脚
  9. GPIO.setmode(GPIO.BCM)
  10. # 设置引脚号,IN18
  11. IN = 18
  12. # 将引脚设置为输入
  13. GPIO.setup(IN,GPIO.IN,pull_up_down=GPIO.PUD_UP)
  14. # 轮询输入,防抖
  15. def inputPolling():
  16. while True:
  17. if GPIO.input(IN)==GPIO.HIGH:
  18. time.sleep(0.01)
  19. if GPIO.input(IN)==GPIO.HIGH:
  20. print '按键轮询输入获取成功'
  21. while GPIO.input(IN)==GPIO.HIGH:
  22. time.sleep(0.01)
  23. # 边缘检测,防抖
  24. def inputEdge():
  25. while True:
  26. GPIO.wait_for_edge(IN,GPIO.RISING)
  27. time.sleep(0.01)
  28. if GPIO.input(IN)==GPIO.HIGH:
  29. print '按键边缘检测输入成功'
  30. # 边缘检测
  31. def myCallback(channel):
  32. print '按键线程回调输入成功'
  33. # 线程回调
  34. def inputEvent():
  35. GPIO.add_event_detect(IN,GPIO.BOTH)
  36. GPIO.add_event_callback(IN,GPIO.RISING,callback=myCallback,bouncetime=10)
  37. while True:
  38. time.sleep(0.01)
  39. try:
  40. inputPolling();
  41. #inputEdge();
  42. #inputEvent();
  43. except KeyboardInterrupt:
  44. # 清空GPIO
  45. GPIO.cleanup()

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号