小甲醛硬件测评与树莓派GPIO基础

前言

  • 我们买了很多硬件设备,我们现在来简单测一下各个设备,学习一下基本的使用方法。

树莓派摄像头

  • 19 块钱 500W 像素 CSI 摄像头,直接连在树莓派上,如下所示:

  • 这个摄像头的像素比想象中要高很多,如下所示,肯定够用了。

  • 使用方法,首先要在树莓派的设置中,开启 camera

  • 在树莓派命令行中可以用下面的代码来拍照:

vcgencmd get_camera
raspistill -v -o test.jpg
  • 这样就在桌面生成了一个 test.jpg 的图片

  • 如果要在 Python 中使用,首先要安装一些包:

sudo apt-get install -y libopencv-dev python3-opencv
  • 测试以下代码:
import cv2
cap=cv2.VideoCapture(0) #调用摄像头‘0'一般是打开电脑自带摄像头,‘1'是打开外部摄像头(只有一个摄像头的情况)
width=1280
height=960
cap.set(cv2.CAP_PROP_FRAME_WIDTH,width)#设置图像宽度
cap.set(cv2.CAP_PROP_FRAME_HEIGHT,height)#设置图像高度
#显示图像
while True: 
  ret,frame=cap.read()#读取图像(frame就是读取的视频帧,对frame处理就是对整个视频的处理)
  #print(ret)#
  #######例如将图像灰度化处理,
  img=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)#转灰度图
  cv2.imshow("img",img)
  ########图像不处理的情况
  cv2.imshow("frame",frame)  
  
  input=cv2.waitKey(20)
  if input==ord('q'):#如过输入的是q就break,结束图像显示,鼠标点击视频画面输入字符
    break
   
cap.release()#释放摄像头
cv2.destroyAllWindows()#销毁窗口
  • 可以用,就是视频显示比较卡。

音频输出

  • 7 块钱买的树莓派喇叭,发现声音贼小。接到电脑上以后,声音比较大,看来是树莓派功率不够,所以我准备用寝室的蓝牙音箱,蓝牙音箱自己供电,应该声音会比较大。

麦克风

  • 9 块钱的树莓派麦克风,发现必须要对着麦才有声音,于是发现麦克分有近场和远场之分,这种麦克风完全无法满足我们的需求。
  • 搜了很久,麦克风不是贼便宜就是贼贵,终于找到一个 65 的麦克风,也是 USB 无驱的,先买回来再试试看。

树莓派 GPIO 基础

  • 在基本学习控制器件的时候,我们就要先学习以下树莓派的 GPIO 各个功能的写发。
  • GPIO 引脚图如下所示:

  • 我们直接看一下最简单的各种控制方法,首先是最简单的,点亮 LED 灯
import RPi.GPIO as GPIO  #引入函数库
import time

RPi.GPIO.setmode(GPIO.BOARD)  		#设置引脚编号规则
RPi.GPIO.setup(11, RPi.GPIO.OUT)    #将11号引脚设置成输出模式

while True
    GPIO.output(channel, 1)   	#将引脚的状态设置为高电平,此时LED亮了
    time.sleep(1)   			#程序休眠1秒钟,让LED亮1秒
    GPIO.output(channel, 0)   	#将引脚状态设置为低电平,此时LED灭了
    time.sleep(1)   			#程序休眠1秒钟,让LED灭1秒

GPIO.cleanup()    #程序的最后别忘记清除所有资源
  • PWM 的输出:
import time
import RPi.GPIO as GPIO   	#引入库
GPIO.setmode(GPIO.BOARD)  	#设置编号方式
GPIO.setup(12, GPIO.OUT)  	#设置12号引脚为输出模式

p = GPIO.PWM(12, 50)  		#将12号引脚初始化为PWM实例 ,频率为50Hz
p.start(0)    				#开始脉宽调制,参数范围为: (0.0 <= dc <= 100.0)
try:
    while 1:
        for dc in range(0, 101, 5):
            p.ChangeDutyCycle(dc)   #修改占空比 参数范围为: (0.0 <= dc <= 100.0)
            time.sleep(0.1)
        for dc in range(100, -1, -5):
            p.ChangeDutyCycle(dc)
            time.sleep(0.1)
except KeyboardInterrupt:
    pass
p.stop()    				#停止输出PWM波
GPIO.cleanup()    			#清除
  • 输入的相关设置
#	设置上拉或下拉电阻
GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

#	读取状态
GPIO.input(channel)
  • 边缘检测
#	wait_for_edge(),顾名思义,会阻塞程序
channel = GPIO.wait_for_edge(channel, GPIO.RISING, timeout=5000)
if channel is None:
    print('Timeout occurred')
else:
    print('Edge detected on channel', channel)
#	可以输入 GPIO.RISING、GPIO.FALLING、GPIO.BOTH

#	一般用的是 event_detected() 系列的监听函数机制
#	如下就是注册回调函数的方法
def my_callback_one(channel):
    print('回调 1')
  
def my_callback_two(channel):
    print('回调 2')
  
GPIO.add_event_detect(channel, GPIO.RISING)
GPIO.add_event_callback(channel, my_callback_one)
GPIO.add_event_callback(channel, my_callback_two)

舵机

  • 舵机的黄、红、棕线,分别对应信号线、电源线、地线。

  • 这里没有直接控制舵机旋转角度的库函数,我们通过原理来控制PWM来控制旋转角度。

  • 舵机旋转角度是由脉冲宽度决定的,旋转角度与占空比是线性函数关系,50Hz的PWM波,旋转角度到占空比的转换公式为:duty = (1/18) * direction + 2.5

  • 实测效果还是比较好的。


本文章使用limfx的vsocde插件快速发布