树莓派4B基础功能部署:环境部署+人脸识别+超声波测距+语音控制(附源码)

文章目录

  • 前言
  • 一、环境准备(硬件)
  • 二、环境准备(软件)
  • 三.树莓派开机
    • 使用VNC连接效果图
    • 树莓派的连接有多种方式,都需要保证在同一局域网络下,打开树莓派SSH服务,其次获取树莓派ip,进行连接(例如Putty,VNC,Xshell,Windows自带远程桌面等等)
  • 四.语音版接线及使用(尽量断电操作,以防损坏芯片)
  • 五、人脸识别以及视频实时传输
    • 运行截图:蓝色框为识别框
    • PC端程序(先启动):
    • 树莓派端代码:
  • 六、超声波测距模块使用(HC-SR04)


前言

由于课程需要,所以进行树莓派入门开发应用学习。在这里分享我的环境部署过程和功能实现过程希望对大家有所帮助。


一、环境准备(硬件)

  • 树莓派4B开发板(我选择的是8G运行内存)
  • 高速sd卡(推荐class10 版本以上,内存根据个人需求选择)
  • HC-SR04超声波测距模块
  • 亚博语音开发板 YB- MVE01
  • USB免驱摄像头
  • L298N电机驱动模块
  • 电机供电电池
  • 拓展板
    树莓派4B基础功能部署:环境部署+人脸识别+超声波测距+语音控制(附源码)_第1张图片

二、环境准备(软件)

使用官方的系统烧录工具(步骤简单)
imager下载地址
树莓派4B基础功能部署:环境部署+人脸识别+超声波测距+语音控制(附源码)_第2张图片
系统选择如下,直接烧录即可
树莓派4B基础功能部署:环境部署+人脸识别+超声波测距+语音控制(附源码)_第3张图片

没有单独显示器的情况下还需使用VNC工具。
VNC下载地址

三.树莓派开机

使用VNC连接效果图

树莓派4B基础功能部署:环境部署+人脸识别+超声波测距+语音控制(附源码)_第4张图片

树莓派的连接有多种方式,都需要保证在同一局域网络下,打开树莓派SSH服务,其次获取树莓派ip,进行连接(例如Putty,VNC,Xshell,Windows自带远程桌面等等)

  1. 获取树莓派ip地址:
ifconfig
查看以太网接口处(eth0)显示ip地址,即为树莓派ip地址。
  1. 开启ssh服务
第一种:通过  sudo raspi-config 命令打开图形化配置界面打开ssh
第二种:命令行直接开启  sudo systemctl start ssh
  1. 有独立显示器的情况下可以直接在桌面开启
    树莓派4B基础功能部署:环境部署+人脸识别+超声波测距+语音控制(附源码)_第5张图片

四.语音版接线及使用(尽量断电操作,以防损坏芯片)

  1. 语音版接线规则:
    树莓派4B基础功能部署:环境部署+人脸识别+超声波测距+语音控制(附源码)_第6张图片
  2. 口令触发模式程序准备:
首先树莓派开启I2C服务
sudo apt-get install i2c-tools
安装成功之后使用命令检查
i2cdetect -y -a 1
出现0f即为成功(如下图)

树莓派4B基础功能部署:环境部署+人脸识别+超声波测距+语音控制(附源码)_第7张图片

  1. 程序(个人使用主要进行语音控制、唤醒功能)
import smbus
import time

bus = smbus.SMBus(1)
i2c_addr = 0x0f  # 语音识别模块地址
asr_add_word_addr = 0x01  # 词条添加地址
asr_mode_addr = 0x02  # 识别模式设置地址,值为0-2,0:循环识别模式 1:口令模式 ,2:按键模式,默认为循环检测
asr_rgb_addr = 0x03  # RGB灯设置地址,需要发两位,第一个直接为灯号1:蓝 2:红 3:绿 ,
# 第二个字节为亮度0-255,数值越大亮度越高
asr_rec_gain_addr = 0x04  # 识别灵敏度设置地址,灵敏度可设置为0x00-0x55,值越高越容易检测但是越容易误判,
# 建议设置值为0x40-0x55,默认值为0x40                                    
asr_clear_addr = 0x05  # 清除掉电缓存操作地址,录入信息前均要清除下缓存区信息
asr_key_flag = 0x06  # 用于按键模式下,设置启动识别模式
asr_voice_flag = 0x07  # 用于设置是否开启识别结果提示音
asr_result = 0x08  # 识别结果存放地址
asr_buzzer = 0x09  # 蜂鸣器控制寄存器,1位开,0位关
asr_num_cleck = 0x0a  # 录入词条数目校验
asr_vession = 0x0b  # 固件版本号
asr_busy = 0x0c  # 忙闲标志

def AsrAddWords(idnum, str):
    global i2c_addr
    global asr_add_word_addr
    words = []
    words.append(asr_add_word_addr)
    words.append(len(str) + 2)
    words.append(idnum)
    for alond_word in str:
        words.append(ord(alond_word))
    words.append(0)
    print(words)
    for date in words:
        bus.write_byte(i2c_addr, date)
        time.sleep(0.03)


def RGBSet(R, G, B):
    global i2c_addr
    global asr_rgb_addr
    date = []
    date.append(R)
    date.append(G)
    date.append(B)
    print(date)
    bus.write_i2c_block_data(i2c_addr, asr_rgb_addr, date)


def I2CReadByte(reg):
    global i2c_addr
    bus.write_byte(i2c_addr, reg)
    time.sleep(0.05)
    Read_result = bus.read_byte(i2c_addr)
    return Read_result


def Busy_Wait():
    busy = 255
    while busy != 0:
        busy = I2CReadByte(asr_busy)
        print(asr_busy)

'''
模式和词组具有掉电保存功能,第一次录入后续如果没有修改可以将1置位0不折行录入词条和模式
'''
cleck = 0
if 1:
    bus.write_byte_data(i2c_addr, asr_clear_addr, 0x40)  # 清除掉电缓存区
    Busy_Wait()  # 等待模块空闲
    print("缓存区清除完毕")
    bus.write_byte_data(i2c_addr, asr_mode_addr, 1)  # 设置为循环模式
    Busy_Wait()  # 等待模块空闲	
    print("模式设置完毕完毕")
    AsrAddWords(0, "xiao ya")
    Busy_Wait()  # 等待模块空闲	
    AsrAddWords(1, "hong deng")
    Busy_Wait()  # 等待模块空闲
    AsrAddWords(2, "lv deng")
    Busy_Wait()  # 等待模块空闲
    AsrAddWords(3, "lan deng")
    Busy_Wait()  # 等待模块空闲
    AsrAddWords(4, "guan deng")
    Busy_Wait()  # 等待模块空闲
    while cleck != 5:
        cleck = I2CReadByte(asr_num_cleck)
        print(cleck)
bus.write_byte_data(i2c_addr, asr_rec_gain_addr, 0x40)  # 设置灵敏度,建议值为0x40-0x55
bus.write_byte_data(i2c_addr, asr_voice_flag, 1)  # 设置开关提示音
bus.write_byte_data(i2c_addr, asr_buzzer, 1)  # 蜂鸣器
RGBSet(255, 255, 255)
time.sleep(1)
RGBSet(0, 0, 0)
bus.write_byte_data(i2c_addr, asr_buzzer, 0)  # 蜂鸣器
while True:
    result = I2CReadByte(asr_result)
    print(result)
    time.sleep(0.5)

五、人脸识别以及视频实时传输

  1. 环境准备:树莓派安装opencv环境
    这里使用piwheels下载:
    piwheels-opencv-python下载地址
    piwheel-opencv-contrib-python下载地址
    树莓派4B基础功能部署:环境部署+人脸识别+超声波测距+语音控制(附源码)_第8张图片
  2. 实时人脸检测程序
    haarcascade_frontalface_default.xml 此文件可在pc端下载传入树莓派(如已下载opencv源文档可自行查找)
import numpy as np
import cv2

# 导入opencv内部已经训练好的人脸模型
faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# 打开摄像头,并设置窗口大小
cap = cv2.VideoCapture(0)
cap.set(3, 640)  # set Width
cap.set(4, 480)  # set Height

# 进行人脸识别
while True:
    ret, img = cap.read()  # 读取摄像头采集到的图片
    # img = cv2.flip(img, -1)   #将摄像头180旋转,摄像头倒放的时候需要
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 将读取的图片转换为灰度图
    faces = faceCascade.detectMultiScale(
        gray,
        scaleFactor=1.2,
        minNeighbors=5,
        minSize=(20, 20)
    )
    # 采用Haar+Cascade分类器进行脸部识别

    for (x, y, w, h) in faces:  # 将识别到的人脸用蓝色框框出来,x:横坐标;y纵坐标;w:宽度;h:高度(即(x,y):表示画蓝色框的起点;w,h表示蓝色框的长和宽)
        cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
        roi_gray = gray[y:y + h, x:x + w]
        roi_color = img[y:y + h, x:x + w]

    cv2.imshow('video', img)  # 显示到屏幕上
    k = cv2.waitKey(30) & 0xff
    if k == 27:  # 按'ESC'退出摄像头
        break

cap.release()  # 释放摄像头
cv2.destroyAllWindows()  # 关闭窗口

运行截图:蓝色框为识别框

树莓派4B基础功能部署:环境部署+人脸识别+超声波测距+语音控制(附源码)_第9张图片

  1. 实时视频传输(采用zeromq框架):
    树莓派4B基础功能部署:环境部署+人脸识别+超声波测距+语音控制(附源码)_第10张图片

PC端程序(先启动):

# coding=utf8
import cv2
import zmq
import base64
import numpy as np


def video():
    context = zmq.Context()
    footage_socket = context.socket(zmq.PAIR)
    footage_socket.bind('tcp://*:5555')
    cv2.namedWindow('video', flags=cv2.WINDOW_NORMAL | cv2.WINDOW_KEEPRATIO)

    while True:
        print("树莓派连接中")
        frame = footage_socket.recv_string()  # 接收TCP传输过来的一帧视频图像数据
        img = base64.b64decode(frame)  # 把数据进行base64解码后储存到内存img变量中
        date_img = np.frombuffer(img, dtype=np.uint8)  # 把这段缓存解码成一维数组
        source = cv2.imdecode(date_img, 1)  # 将一维数组解码为图像source
        cv2.imshow("video", source)  # 把图像显示在窗口中
        cv2.waitKey(5)  # 延时等待,防止出现窗口无响应


if __name__ == '__main__':
    video()

树莓派端代码:

import cv2
import zmq
import base64

def raspi():

    IP = 'PC端ip地址'  # 上位机视频接受端的IP地址
    # 创建并设置视频捕获对象
    cap = cv2.VideoCapture(0)
    print("camera is open: {}".format(cap.isOpened()))
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, 320)  # 设置图像宽度
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 240)  # 设置图像高度

    # 建立TCP通信协议
    contest = zmq.Context()
    footage_socket = contest.socket(zmq.PAIR)
    footage_socket.connect('tcp://%s:5555' % IP)

    while True:
        # 读取图像
        ret, frame = cap.read()

        # 转换为流数据并编码
        encoded, buffer = cv2.imencode('.jpg', frame)
        jpg_as_test = base64.b64encode(buffer)  # 把内存中的图像流数据进行base64编码

        # 发送数据
        footage_socket.send(jpg_as_test)  # 把编码后的流数据发送给视频的接收端
        cv2.waitKey(5)  # 延时等待,防止出现窗口无响应


if __name__ == '__main__':

    raspi()

六、超声波测距模块使用(HC-SR04)

  1. 引脚接线:
    Vcc——树莓派5v引脚
    Trig——树莓派任意引脚(本次程序测试接8)
    Gnd——树莓派Gnd引脚
    Echo——树莓派任意引脚(本次程序测试接7)
  2. 程序
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BOARD)
GPIO_TRIGGER = 8
GPIO_ECHO = 7
GPIO.setup(GPIO_TRIGGER, GPIO.OUT)
GPIO.setup(GPIO_ECHO, GPIO.IN)

def distance():

 GPIO.output(GPIO_TRIGGER, True)
 time.sleep(0.00001)
 GPIO.output(GPIO_TRIGGER, False)
 start_time = time.time()
 stop_time = time.time()

 while GPIO.input(GPIO_ECHO) == 0:
  start_time = time.time()
 while GPIO.input(GPIO_ECHO) == 1:
  stop_time = time.time()

 time_elapsed = stop_time - start_time
 distance = (time_elapsed * 34300) / 2

 return distance

if __name__ == '__main__':
 try:
  while True:
   dist = distance()
   print("Distance = {:.2f} cm".format(dist))
   time.sleep(1)
 # Reset by pressing CTRL + C
 except KeyboardInterrupt:
  print("Measurement stopped by User")
  GPIO.cleanup()

树莓派4B基础功能部署:环境部署+人脸识别+超声波测距+语音控制(附源码)_第11张图片


你可能感兴趣的:(python,嵌入式硬件)