(18)管脚口操作
第一个小实验是让蓝绿两色LED小灯交替闪烁,在查阅电路图后我们发现,两个LED小灯由GPIO20,21控制,这里简单讲一下Python控制树莓派GPIO的方式,首先要引入RPi.GPIO库文件,然后要设置树莓派GPIO的工作模式,参数为BCM和BOARD,BCM代表着引脚的按GPIO编号声明,BOARD代表引脚按板载编号声明。如图2.1。事实上,不同版本的GPIO个数是不一样的,导致不同版本板载编号不同,所以建议同学们以BCM作为工作模式的声明方式。第二步是用.setup()函数声明指定引脚的输入输出。例如,控制LED需要对LED进行“写”操作,所以参数应该是GPIO.OUT。对应的,对于一些传感器,例如触摸传感器,温湿度传感器,我们要对传感器的检测结果进行读,那时参数就应该是GPIO.IN。接下来改变输出引脚的电平即可对LED进行亮灭控制。最后不要忘记通过GPIO.cleanup()释放工作状态,以免影响下次正常使用。/home/pi/yahboom/GPIO/led.py详细代码如下:
#!/usr/bin/env python2 # -*- coding: utf-8 -*- import RPi.GPIO as GPIO import time #设置工作模式为bcm GPIO.setmode(GPIO.BCM) #找到将使用的引脚 GPIO.setup(20, GPIO.OUT) GPIO.setup(21, GPIO.OUT) #运行十次 for i in range(0,10): GPIO.output(20,True) time.sleep(0.5) GPIO.output(20,False) GPIO.output(21,True) time.sleep(0.5) GPIO.output(21,False) GPIO.cleanup()
测试LED
#!/usr/bin/env python2 # -*- coding: utf-8 -*- import time import RPi.GPIO as GPIO GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) pinA1=6 pinA2=13 pinB1=19 pinB2=26 GPIO.setup(pinA1, GPIO.OUT) #设置脚为输出模式 GPIO.setup(pinA2, GPIO.OUT) #设置脚为输出模式 a = 10 #闪烁10次 while a > 0: a -= 1 print ("HIGH") GPIO.output(pinA1, GPIO.HIGH) #亮 GPIO.output(pinA2, GPIO.HIGH) #亮 time.sleep( 0.2 ) #延时 秒 print ("LOW") GPIO.output(pinA1, GPIO.LOW) #暗 GPIO.output(pinA2, GPIO.LOW) #暗 time.sleep( 0.2 ) #延时 秒
控制电机运动
实物图
引脚接口
#!/usr/bin/env python2 # -*- coding: utf-8 -*- import time import RPi.GPIO as GPIO GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) # 树梅派插着USB和网线口那一侧为下面 从下往上数 左列 1-GND 2-5引脚 对应 26 19 13 5 pinA1=6 # 左电机1 pinA2=13 # 左电机 2 pinB1=19 # 右电机 1 pinB2=26 # 右电机 2 GPIO.setup(pinA1, GPIO.OUT) #设置脚为输出模式 GPIO.setup(pinA2, GPIO.OUT) #设置脚为输出模式 GPIO.setup(pinB1, GPIO.OUT) #设置脚为输出模式 GPIO.setup(pinB2, GPIO.OUT) #设置脚为输出模式 go_time_intever=0.2 # 运动步长(秒) 通过改时间来改每一步的运动距离 def go_ahead(): print ("go_ahead") GPIO.output(pinA1, GPIO.HIGH) # A往前转 GPIO.output(pinA2, GPIO.LOW) #灭 GPIO.output(pinB1, GPIO.HIGH) # B往前转 GPIO.output(pinB2, GPIO.LOW) #灭 time.sleep( go_time_intever ) #延时 秒 def stop(): print ("stop") GPIO.output(pinA1, GPIO.LOW) # A停止 GPIO.output(pinA2, GPIO.LOW) #灭 GPIO.output(pinB1, GPIO.LOW) # B停止 GPIO.output(pinB2, GPIO.LOW) #灭 time.sleep( go_time_intever ) #延时 秒 def tuen_left(): print ("tuen_left") GPIO.output(pinA1, GPIO.LOW) # A往后转 GPIO.output(pinA2, GPIO.HIGH) #灭 GPIO.output(pinB1, GPIO.HIGH) #B往前转 GPIO.output(pinB2, GPIO.LOW) #灭 time.sleep( go_time_intever ) #延时 秒 def turn_right(): print ("turn_right") GPIO.output(pinA1, GPIO.HIGH) #A往前转 GPIO.output(pinA2, GPIO.LOW) #灭 GPIO.output(pinB1, GPIO.LOW) #B往后转 GPIO.output(pinB2, GPIO.HIGH) #灭 time.sleep( go_time_intever ) #延时 秒 a = 10 #闪烁10次 while a > 0: a -= 1 go_ahead() tuen_left() turn_right() stop()
第二个实验同样是控制小灯,但是这次我们将使用PWM的工作方式控制RGB小灯,下面的程序提供了以脉冲调制解调控制小灯的方法,程序实现了一个呼吸灯使得小灯的颜色进行红绿蓝之间的渐变。程序位于/home/pi/yahboom/GPIO/BST-AI.py程序完整代码如下:
#!/usr/bin/env python2 # -*- coding: utf-8 -*- import RPi.GPIO as GPIO import time #led由三个引脚控制,蜂鸣器由16引脚控制 R,G,B=9,10,11 buzzer=16 GPIO.setmode(GPIO.BCM) GPIO.setup(R, GPIO.OUT) GPIO.setup(G, GPIO.OUT) GPIO.setup(B, GPIO.OUT) GPIO.setup(buzzer, GPIO.OUT) #先让蜂鸣器停下来 GPIO.output(buzzer, False) time.sleep(2) GPIO.output(buzzer,True) #设置pwm的工作模式为pwm pwmR = GPIO.PWM(R, 70) pwmG = GPIO.PWM(G, 70) pwmB = GPIO.PWM(B, 70) pwmR.start(0) pwmG.start(0) pwmB.start(0) #写四种模式,实际可以由更多变化方式 try: t = 0.01 while True: for i in range(0,71): pwmG.ChangeDutyCycle(70) pwmB.ChangeDutyCycle(i) pwmR.ChangeDutyCycle(70-i) print(i) time.sleep(t) for i in range(70,-1,-1): pwmG.ChangeDutyCycle(0) pwmB.ChangeDutyCycle(i) pwmR.ChangeDutyCycle(70-i) print(i-1000) time.sleep(t) except KeyboardInterrupt: pass pwmR.stop() pwmG.stop() pwmB.stop() GPIO.cleanup()