由于课程需要,所以进行树莓派入门开发应用学习。在这里分享我的环境部署过程和功能实现过程希望对大家有所帮助。
使用官方的系统烧录工具(步骤简单)
imager下载地址
系统选择如下,直接烧录即可
没有单独显示器的情况下还需使用VNC工具。
VNC下载地址
ifconfig
查看以太网接口处(eth0)显示ip地址,即为树莓派ip地址。
第一种:通过 sudo raspi-config 命令打开图形化配置界面打开ssh
第二种:命令行直接开启 sudo systemctl start ssh
首先树莓派开启I2C服务
sudo apt-get install i2c-tools
安装成功之后使用命令检查
i2cdetect -y -a 1
出现0f即为成功(如下图)
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)
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() # 关闭窗口
# 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()
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()