【毕业设计】树莓派机器视觉小车设计与实现 - 单片机物联网 嵌入式 stm32

201 篇文章 118 订阅
151 篇文章 41 订阅


0 前言

🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。

为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是

🚩 基于树莓派的机器视觉小车设计与实现

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:4分
  • 工作量:4分
  • 创新点:3分

🧿 选题指导, 项目分享:

https://gitee.com/dancheng-senior/project-sharing-1/blob/master/%E6%AF%95%E8%AE%BE%E6%8C%87%E5%AF%BC/README.md


1 简介

基于树莓派的视觉小车,完成视觉识别和驱动代码

2 实现效果

在这里插入图片描述

3 树莓派视觉环境搭建

主要有以下步骤

  • 树莓派安装系统
  • 设置静态网络
  • 更换镜像源
  • 安装中文输入法
  • 电脑控制树莓派
  • OpenCV3.4.1安装
  • 设置通用(UART)串口

3.1 树莓派安装系统

  • 下载你所要的树莓派系统
https://www.raspberrypi.org/downloads/

RASPBIAN——>RASPBIAN STRETCH WITH DESKTOP

  • 下载格式化磁盘软件,将你的磁盘格式化
https://www.sdcard.org/chs/index.html

在这里插入图片描述

  • 完成安装并进行U盘格式化操作

  • 将你树莓派的内存卡插在电脑上,打开软件
    在这里插入图片描述

  • 下载etcher,将系统导入到你的内存卡中

https://etcher.io/

在这里插入图片描述

选择好你下载的系统压缩包,你的树莓派内存卡,点击Flash!
etcher提示成功后,就可以将内存卡取下插入树莓派

  • 树莓派Raspbian系统默认密码为raspberry,ubuntu mate默认密码为ubuntu

3.2 设置静态网络

树莓派自带无线网卡,开机后按照提示链接WiFi热点输入密码上网。我们可以在终端查看网络连接情况:


​ ifconfig

在这里插入图片描述
默认情况下树莓派的IP是DHCP动态配置的,为了下文使用VNC登录方便,通常做法是将IP改为静态地址。

  • 打开/etc/dhcpcd.conf

sudo vi /etc/dhcpcd.conf

  • 在末尾添加以下内容
   interface eth0
    static ip_address=192.168.0.142/24
    static routers=192.168.199.1
    static domain_name_servers=114.114.114.114 8.8.8.8

static ip_address是树莓派的IP地址
static routers是路由器地址
/24表示为子网掩码255.255.255.0
114.114.114.114是国内的较快速的DNS服务器
8.8.8.8 是谷歌的DNS服务器

  • 重启
   reboot

3.3 更换镜像源

  • 使用管理员权限(经由sudo),编辑/etc/apt/sources.list文件。参考命令行为:
   sudo nano /etc/apt/sources.list

用#注释掉原文件内容,用以下内容取代:


​ deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi
​ deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi

  • 编辑/etc/apt/sources.list.d/raspi.list文件
sudo nano /etc/apt/sources.list.d/raspi.list

用#注释掉原文件内容,用以下内容取代:


​ deb http://mirror.tuna.tsinghua.edu.cn/raspberrypi/ stretch main ui
​ deb-src http://mirror.tuna.tsinghua.edu.cn/raspberrypi/ stretch main ui

  • 更新文件
sudo apt-get update
sudo apt-get upgrade

3.4 安装中文输入法

  • 安装中文字体
sudo apt-get install ttf-wqy-zenhei
  • 安装中文输入法
  sudo apt-get install scim-pinyin

安装好拼音输入法后,可以直接命令行输入scim激活,下次启动是会自动启动的。快捷键是Ctrl+空格。或者直接点击屏幕右上角的输入法图标选择。

  • 配置中文操作系统
   sudo raspi-config

进行系统设置。选择Internationalisation Options–>Change
Locale–>zh_CN.UTF-8–>OK,然后重启系统,设置为中文操作系统。
在这里插入图片描述

3.5 电脑控制树莓派

SSH只能使用命令行控制树莓派,而VNC可远程登录树莓派图形界面系统。VNC包括服务端(VNC server)和客户端(VNC viewer)。
安装VNC官方参考文档:https://www.realvnc.com/en/connect/docs/raspberry-pi.html#raspberry-pi-setup

  • 在树莓派上安装VNC server
 	sudo apt-get update
    sudo apt-get install realvnc-vnc-server
  • 打开VNC service服务
   sudo raspi-config

找到 Interfacing Options > VNC and select Yes.
设置完成后,树莓派启动时,VNC service将自动启动。

  • 获取树莓派IP地址
  ifconfig

在这里插入图片描述

安装后打开VNC Viewer
在这里插入图片描述
File ——> New connection
在这里插入图片描述
红色部分输入树莓派的IP地址,点击OK添加。
选择连接之后输入树莓派的登录用户名密码,初始用户名 pi,密码为进入树莓派系统时设置的密码(如果没有设置,树莓派初始密码为
raspberry)。确认之后即可进入树莓派的远程桌面!
在这里插入图片描述
在这里插入图片描述

3.6 OpenCV3.4.1安装

  • 软件更新
   // 软件源更新
    sudo apt-get update 
    // 升级本地所有安装包,最新系统可以不升级,版本过高反而需要降级才能安装
    sudo apt-get upgrade
    // 升级树莓派固件,固件比较新或者是Ubuntu则不用执行
    sudo rpi-update
  • 安装构建OpenCV的相关工具:
 
// 安装build-essential、cmake、git和pkg-config
sudo apt-get install build-essential cmake git pkg-config
  • 安装常用图像工具包
   // 安装jpeg格式图像工具包
    sudo apt-get install libjpeg8-dev 
    // 安装tif格式图像工具包
    sudo apt-get install libtiff5-dev 
    // 安装JPEG-2000图像工具包
    sudo apt-get install libjasper-dev 
    // 安装png图像工具包
    sudo apt-get install libpng12-dev 
  • 安装视频I/O包
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
  • 安装gtk2.0
sudo apt-get install libgtk2.0-dev
  • 优化函数包
sudo apt-get install libatlas-base-dev gfortran
  • 编译OpenCV源代码
// 使用wget下载OpenCV源码,觉得慢的话可以到https://github.com/opencv/opencv/releases下载OpenCV的源代码
// tar.gz格式,需要解压好,放到用户目录下
// 但是OpenCV_contrib请大家使用wget,亲测直接到Github下载zip文件的话,会有编译问题

// 下载OpenCV
wget -O opencv-3.4.1.zip https://github.com/Itseez/opencv/archive/3.4.1.zip
// 解压OpenCV
unzip opencv-3.4.1.zip
// 下载OpenCV_contrib库:
wget -O opencv_contrib-3.4.1.zip https://github.com/Itseez/opencv_contrib/archive/3.4.1.zip
// 解压OpenCV_contrib库:
unzip opencv_contrib-3.4.1.zip

找到你下载的源码文件夹并打开,tar.gz解压后文件夹名应该是opencv-3.4.1(版本号可能会变化),git方式下载的文件夹名应该是opencv。之后我们新建一个名为release的文件夹用来存放cmake编译时产生的临时文件:

// 打开源码文件夹,这里以我修改文章时最新的3.4.1为例
cd opencv-3.4.1
// 新建release文件夹
mkdir release
// 进入release文件夹
cd release

设置cmake编译参数,安装目录默认为/usr/local ,注意参数名、等号和参数值之间不能有空格,但每行末尾“\”之前有空格,参数值最后是两个英文的点:

/** CMAKE_BUILD_TYPE是编译方式
* CMAKE_INSTALL_PREFIX是安装目录
* OPENCV_EXTRA_MODULES_PATH是加载额外模块
* INSTALL_PYTHON_EXAMPLES是安装官方python例程
* BUILD_EXAMPLES是编译例程(这两个可以不加,不加编译稍微快一点点,想要C语言的例程的话,在最后一行前加参数INSTALL_C_EXAMPLES=ON \)
**/

sudo cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.4.1/modules \
    -D INSTALL_PYTHON_EXAMPLES=ON \
    -D BUILD_EXAMPLES=ON ..
  • 开始正式编译
// 编译,以管理员身份,否则容易出错
sudo make
// 安装
sudo make install
// 更新动态链接库
sudo ldconfig
  • 查看安装版本
pkg-config --modversion opencv
  • 测试安装:
cd ~/opencv-3.4.1/release/bin
./opencv_test_core

7.设置通用(UART)串口的方法

  • 首先查看有没有相关文件
  	cd /boot/overlays
    ls

查看是否存在README 和 pi3-miniuart-bt-overlay.dtb 或者是 pi3-miniuart-bt.dtb
(后面的缺了(overlay)但是在README中的解释是相同的)。如果没有的话,自行百度下载。
在这里插入图片描述

  • 查看并修改串口映射关系
ls -l /dev

在这里插入图片描述
这里已经配置好了,因此会有ttyAMA0和ttyS0两个串口映射,最开始只有一个。下一步对文件进行修改。


​ sudo nano /boot/config.txt

在该文件最后一行加入代码


​ dtoverlay=pi3-miniuart-bt

保存文件。


​ sudo nano /boot/cmdline.txt

注释掉原来的内容,将以下内容添加进去


​ dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

保存文件。

  • 禁用串口的控制台功能
   sudo systemctl stop serial-getty@ttyAMA0.service
   sudo systemctl disable serial-getty@ttyAMA0.service

最后,我们依次执行以下命令完成所有配置并重启:


​ sudo apt-get update
​ sudo apt-get upgrade
​ sudo reboot

8 部分核心代码

def Motor_Init():
    global L_Motor, R_Motor
    L_Motor= GPIO.PWM(l_motor,100)
    R_Motor = GPIO.PWM(r_motor,100)
    L_Motor.start(0)
    R_Motor.start(0)
 
 
def Direction_Init():
    GPIO.setup(left_back,GPIO.OUT)
    GPIO.setup(left_front,GPIO.OUT)
    GPIO.setup(l_motor,GPIO.OUT)
    
    GPIO.setup(right_front,GPIO.OUT)
    GPIO.setup(right_back,GPIO.OUT)
    GPIO.setup(r_motor,GPIO.OUT)
 
 
def Servo_Init():
    global pwm_servo
    pwm_servo=Adafruit_PCA9685.PCA9685()
    
 
def Init():
    GPIO.setwarnings(False) 
    GPIO.setmode(GPIO.BCM)
    Direction_Init()
    Servo_Init()
    Motor_Init()

运动控制函数

def Front(speed):
    L_Motor.ChangeDutyCycle(speed)
    GPIO.output(left_front,1)   #left_front
    GPIO.output(left_back,0)    #left_back
 
    R_Motor.ChangeDutyCycle(speed)
    GPIO.output(right_front,1)  #right_front
    GPIO.output(right_back,0)   #right_back
    
    
def Back(speed):
    L_Motor.ChangeDutyCycle(speed)
    GPIO.output(left_front,0)   #left_front
    GPIO.output(left_back,1)    #left_back
 
    R_Motor.ChangeDutyCycle(speed)
    GPIO.output(right_front,0)  #right_front
    GPIO.output(right_back,1)   #right_back
 
 
def Left(speed):
    L_Motor.ChangeDutyCycle(speed)
    GPIO.output(left_front,0)   #left_front
    GPIO.output(left_back,1)    #left_back
 
    R_Motor.ChangeDutyCycle(speed)
    GPIO.output(right_front,1)  #right_front
    GPIO.output(right_back,0)   #right_back
 
 
def Right(speed):
    L_Motor.ChangeDutyCycle(speed)
    GPIO.output(left_front,1)   #left_front
    GPIO.output(left_back,0)    #left_back
 
    R_Motor.ChangeDutyCycle(speed)
    GPIO.output(right_front,0)  #right_front
    GPIO.output(right_back,1)   #right_back
 
 
def Stop():
    L_Motor.ChangeDutyCycle(0)
    GPIO.output(left_front,0)   #left_front
    GPIO.output(left_back,0)    #left_back
 
    R_Motor.ChangeDutyCycle(0)
    GPIO.output(right_front,0)  #right_front
    GPIO.output(right_back,0)   #right_back

9 最后

  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值