EdgeBroad(智能车) 功能部件 调试功能 过程汇总(包括 主要代码,环境,背景等 )

首先总框(图片很全,来自 博客47991812):

目录

目录 3

1. 系统搭建 1

2.界面设计 8

3. 功能和代码 16

3.1. 智能小车的电机驱动 16

3.1.1. 功能简介 16

3.1.2. 操作截图 17

3.1.3. 代码说明 17

3.2. 摄像头的使用,以及舵机与摄像头平台的转动 24

3.2.1. 功能简介 24

3.2.2. 操作截图 25

3.2.3. 代码说明 29

3.3. 蓝牙通信控制驱动 40

3.3.1. 功能简介 40

3.3.2. 操作截图 40

3.3.3. 代码说明 41

3.4. 蓝牙通信控制舵机 57

3.4.1. 功能简介 57

3.4.2. 操作截图 57

3.4.3. 代码说明 58

3.5. USB摄像头捕获道路图片同时获取方向信息 74

3.5.1. 功能简介 74

3.5.2. 操作截图 75

3.5.3. 代码说明 75

3.6. 根据超声波传感器距离调整 92

3.6.1. 功能简介 92

3.6.2. 操作截图 93

3.6.3. 代码说明 96

3.7. edgeboardAI 小车驱动实现 118

3.7.1. 功能简介 118

3.7.2. 操作截图 118

3.7.3. 代码说明 120

3.8. 基于edgeboardAI和WOBOT超声波微调 131

3.8.1. 功能简介 131

3.8.2. 操作截图 132

3.8.3. 代码说明 132

3.9. edgeboardAI 小车展旗,放粮架主要代码 151

3.9.1. 功能简介 151

3.9.2. 操作截图 151

3.9.3. 代码说明 152

3.10. 基于多个舵机的抓机的实现,以及1,2两块电机板驱动对于上层AI的调用接口实现 155

3.10.1. 功能简介 155

3.10.2. 操作截图 155

3.10.3. 代码说明 155

1.系统搭建

针对树莓派平台的系统的制作、驱动程序安装、各种软件的安装和配置(Qt、SSH、VNC等),详细撰写,相当于一个指南,其他人按照这个指南,就可以一步一步在空白的树莓派上把所有环境安装配置好。

0.搭建树梅派Linux系统,基于SD卡安装Ubuntu系统

1.点击 Software

2.Raspberry PI OS

3.下拉 根据 系统 选择 为选择的 是第二个

4.安装拷贝 工具

拷贝成功,将SD卡放回树莓派接口,

接入PC显示器/LCD屏等测试

启动 并 初始化 树莓派系统,为下载编译等环境做准备

1.Linux安装ssh使用ssh pi@地址 或者 putty工具进行SSH连接

2.需要用到树莓派操作系统,并且安装编译环境.py以及gpio库模板sudo pip install rpi.gpio

sudo apt-get update

sudo apt-get install -y python3

sudo apt-get install -y libatlas-base-dev

sudo apt-get install -y libjasper-dev

sudo apt-get install -y libqtgui4

用vim编写并.py并用python test.py 测试环境

3.安装socat和minicom和hterm模拟程序的通讯。

sudo apt-get install socat

sudo apt-get install minicom

下载hterm源码编译,./hterm运行

4.安装python带的蓝牙通信模块

pip install pybluez

导入模板import bluetooth

5.安装pygame手柄控制(360无线)

sudo apt-get install joystick

ls /dev/input/

jstest /dev/input/js0

然后调试手柄通信,

或者c语言版控制

gcc Xbox_Joystick.c -o Xbox_Joystick

sudo ./Xbox_Joystick

6.树莓派GPIO库安装

1)编译环境(python)

先安装python

sudo apt-get install python-dev

然后pip安装依赖

pip install RPi.GPIO

pip install spidev

2)然后安装I2C和UART接口库

sudo apt install python-smbus

sudo apt install python-serial

7.c语言给python写接口

gcc -fPIC -shared func.c -o libfunc.so 编译成动态库

Python test.py 运行调用c接口的函数测试

8.树莓派 USB摄像头 网络监控环境

1.确认设备

lsusb -> ls /dev 找到video0(或者有类似的设备)

2.安装MJPG-Streamer

先安装cmake环境:

sudo apt-get install cmake libjpeg8-dev

让后 拷贝源码

git clone  https://e.coding.net/fivecc/mjpg-streamer/mjpg-streamer.git

或者

wget https://github.com/Five-great/mjpg-streamer/archive/master.zip

然后进入有cmake的目录:

执行 make

以及 sudo make install

再测试:

1)首先创建 该摄像头的 输出 以及 端口号(这里 是 8080):

/usr/local/bin/mjpg_streamer -i "/usr/local/lib/mjpg-streamer/input_uvc.so -n -f 30 -r 1280x720" -o "/usr/local/lib/mjpg-streamer/output_http.so -p 8080 -w /usr/local/share/mjpg-streamer/ww

2)然后使用javastrip地址(http://<树莓派地址(网络地址或者物理地址)>:<端口号>)该地址 用网络 地址需要在覆盖范围区域内,用物理地址时,树莓派需要接网线(这里会影响小车,建议使用网络地址)

或者编写 .html文件(后面有该编码)

9.树莓派 自启动程序

Nuhup查看是否有

如有没有安装

然后使用命令

nohup python test.py > pomelo.js.log &

将test.py挂到后台运行

然后将该命令放在 /etc目录下

rc.local文件中 即sudo vim rc.local(因为是系统文件 需要权限)

10.scrot屏幕截图

1.安装

sudo apt-get install scrot

2.查看scrot -v

3使用scrot -s(选择区域截图)

11.wobot以及edgeboardAI和STM32的连接

在固件按最上面到下面依次WOBOT和edgeboardAI,STM的顺序依次连接好的基础上。

1.双头USB线连接edgeboardAI的USB接口

2.绿色的电源线一端连接STM一段连接edgeboardAI的电源线

3.然后个驱动马达和传感器通过网络数据线连接WOBOT的M1~M4和P1~P4

4.连接好后STM32和WOBOT都需要接通圆孔电源线,其中STM32给edgeboardAI供电,wobot通过自己的电源线供电。

5.如果需要远程,则将STM32电源线换成2500MA的电池,将WOBOT换成800MA+的电池。

2.界面设计

实际的界面截图,标出各控件的名称

Jacvstrip地址

Html 语言 firefox web.html  获知谷歌 chromium-browser web.html

Web.html 文件

<!DOCTYPE html>

<html>

<head>

<title>实时视频</title>

<style>

     #webcam{

          width: 80%;

          height: 80%;

          display: block;

          margin: 10% auto;

          text-align: center;

          position: relative;

     }

     #webcam img{

         width: 100%;

         height: auto;

         display: block;

         margin: 0 auto;

     }

</style>

</head>

<body>

<div id="webcam">

     <div>

     </div>

</div>

<script type="text/javascript">

    var imageNr = 0; // 图片的索引号

    var finished = new Array(); // 下载图片的队列

    var paused = false; //

     

    function createImageLayer() {

      var img = new Image();

      img.style.position = "absolute";

      img.style.zIndex = -1;

      img.onload = imageOnload;

      img.onclick = imageOnclick;

         //填你对应的ip和端口

      img.src = "http://172.19.8.176:8080/?action=snapshot&n=" + (++imageNr);

      var webcam = document.getElementById("webcam");

      webcam.insertBefore(img, webcam.firstChild);

    }

     

     

    function imageOnload() {

      this.style.zIndex = imageNr;

      while (1 < finished.length) {

        var del = finished.shift(); // 删除旧照片

        del.parentNode.removeChild(del);

      }

      finished.push(this);

      if (!paused) createImageLayer();

    }

     

    function imageOnclick() {

      paused = !paused;

      if (!paused) createImageLayer();

    }

    createImageLayer()

</script>

</body>

</html>

3.功能和代码

3.1.智能小车的电机驱动

3.1.1.功能简介

驱动 小车 前进 后退 左转 右转 左上走 右上走等:

前进和后退,左右两边的方向都朝前或朝后,速度一致;

原地顺时针旋转时,左边轮子前进,右边轮子后退,速度一致;

原地逆时针旋转时,左边轮子后退,右边轮子前进,速度一致;

偏左前进时,左右两边的方向都朝前,左轮速度比右轮速度慢一点;

偏右前进时,左右两边的方向都朝前,左轮速度比右轮速度快一点;

偏左后退时,左右两边的方向都朝后,左轮速度比右轮速度慢一点;

偏右后退时,左右两边的方向都朝后,左轮速度比右轮速度快一点;

3.1.2.操作截图

3.1.3.代码说明

#初始化代码

#-*- coding:UTF-8 -*-

import RPi.GPIO as GPIO

import time

#小车电机引脚定义

IN1 = 20

IN2 = 21

IN3 = 19

IN4 = 26

ENA = 16

ENB = 13

#设置GPIO口为BCM编码方式

GPIO.setmode(GPIO.BCM)

#忽略警告信息

GPIO.setwarnings(False)

#电机引脚初始化操作

def motor_init():

    global pwm_ENA

    global pwm_ENB

    GPIO.setup(ENA,GPIO.OUT,initial=GPIO.HIGH)

    GPIO.setup(IN1,GPIO.OUT,initial=GPIO.LOW)

    GPIO.setup(IN2,GPIO.OUT,initial=GPIO.LOW)

    GPIO.setup(ENB,GPIO.OUT,initial=GPIO.HIGH)

    GPIO.setup(IN3,GPIO.OUT,initial=GPIO.LOW)

    GPIO.setup(IN4,GPIO.OUT,initial=GPIO.LOW)

    #设置pwm引脚和频率为2000hz

    pwm_ENA = GPIO.PWM(ENA, 2000)

pwm_ENB = GPIO.PWM(ENB, 2000)

#控制驱动代码

#小车前进

def run():

    GPIO.output(IN1, GPIO.HIGH)

    GPIO.output(IN2, GPIO.LOW)

    GPIO.output(IN3, GPIO.HIGH)

    GPIO.output(IN4, GPIO.LOW)

    pwm_ENA.ChangeDutyCycle(CarSpeedControl)

    pwm_ENB.ChangeDutyCycle(CarSpeedControl)

#小车后退

def back():

    GPIO.output(IN1, GPIO.LOW)

    GPIO.output(IN2, GPIO.HIGH)

    GPIO.output(IN3, GPIO.LOW)

    GPIO.output(IN4, GPIO.HIGH)

    pwm_ENA.ChangeDutyCycle(CarSpeedControl)

    pwm_ENB.ChangeDutyCycle(CarSpeedControl)

#小车左转

def left():

    GPIO.output(IN1, GPIO.LOW)

    GPIO.output(IN2, GPIO.LOW)

    GPIO.output(IN3, GPIO.HIGH)

    GPIO.output(IN4, GPIO.LOW)

    pwm_ENA.ChangeDutyCycle(CarSpeedControl)

    pwm_ENB.ChangeDutyCycle(CarSpeedControl)

#小车右转

def right():

    GPIO.output(IN1, GPIO.HIGH)

    GPIO.output(IN2, GPIO.LOW)

    GPIO.output(IN3, GPIO.LOW)

    GPIO.output(IN4, GPIO.LOW)

    pwm_ENA.ChangeDutyCycle(CarSpeedControl)

    pwm_ENB.ChangeDutyCycle(CarSpeedControl)

#小车原地左转

def spin_left():

    GPIO.output(IN1, GPIO.LOW)

    GPIO.output(IN2, GPIO.HIGH)

    GPIO.output(IN3, GPIO.HIGH)

    GPIO.output(IN4, GPIO.LOW)

    pwm_ENA.ChangeDutyCycle(CarSpeedControl)

    pwm_ENB.ChangeDutyCycle(CarSpeedControl)

#小车原地右转

def spin_right():

    GPIO.output(IN1, GPIO.HIGH)

    GPIO.output(IN2, GPIO.LOW)

    GPIO.output(IN3, GPIO.LOW)

    GPIO.output(IN4, GPIO.HIGH)

    pwm_ENA.ChangeDutyCycle(CarSpeedControl)

    pwm_ENB.ChangeDutyCycle(CarSpeedControl)

#小车沿左前轮前进

def upleft():

    GPIO.output(IN1, GPIO.HIGH)

    GPIO.output(IN2, GPIO.LOW)

    GPIO.output(IN3, GPIO.HIGH)

    GPIO.output(IN4, GPIO.LOW)

    pwm_ENA.ChangeDutyCycle(CarSpeedControl-20)

    pwm_ENB.ChangeDutyCycle(CarSpeedControl+20)    

#小车沿左后方后退

def downleft():

    GPIO.output(IN1, GPIO.LOW)

    GPIO.output(IN2, GPIO.HIGH)

    GPIO.output(IN3, GPIO.LOW)

    GPIO.output(IN4, GPIO.HIGH)

    pwm_ENA.ChangeDutyCycle(CarSpeedControl-20)

    pwm_ENB.ChangeDutyCycle(CarSpeedControl+20)

#小车沿右上方前进

def upright():

    GPIO.output(IN1, GPIO.HIGH)

    GPIO.output(IN2, GPIO.LOW)

    GPIO.output(IN3, GPIO.HIGH)

    GPIO.output(IN4, GPIO.LOW)

    pwm_ENA.ChangeDutyCycle(CarSpeedControl+20)

    pwm_ENB.ChangeDutyCycle(CarSpeedControl-20)   

#小车沿右下方后退

def downright():

    GPIO.output(IN1, GPIO.LOW)

    GPIO.output(IN2, GPIO.HIGH)

    GPIO.output(IN3, GPIO.LOW)

    GPIO.output(IN4, GPIO.HIGH)

    pwm_ENA.ChangeDutyCycle(CarSpeedControl+20)

    pwm_ENB.ChangeDutyCycle(CarSpeedControl-20)

#小车停止

def brake():

   GPIO.output(IN1, GPIO.LOW)

   GPIO.output(IN2, GPIO.LOW)

   GPIO.output(IN3, GPIO.LOW)

   GPIO.output(IN4, GPIO.LOW)0

time.sleep(2)

#try/except语句用来检测try语句块中的错误

#从而让except语句捕捉异常信息并处理

try:

    motor_init()

    while True:

        run()

except KeyboardInterrupt:

    pass

pwm_ENA.stop()

pwm_ENB.stop()

GPIO.cleanup()

3.2.摄像头的使用,以及舵机与摄像头平台的转动

3.2.1.功能简介

1.USB摄像头

初始化摄像头

USB摄像头工作时,读取一帧图像

显示图像窗口在树莓派的屏幕上

或用命令行在 web 网页上显示 摄像图像

2.舵机的控制

调整舵机PWM的占空比,将占空比的改变变成

具体角度的变化

或用命令行在 web 网页上显示 摄像图像

3.2.2.操作截图

代码方式

运行代码截图

Web方式   MJPG-Streamer

实时视频接收

启用树梅派摄像

*.html web启用

javascript地址模式

3.2.3.代码说明

列出主要的源码,对重要语句用文字注释

# 1舵机的控制

#-*- coding:UTF-8 -*-

#舵机转动控制舵机采用系统的pwm库 对占空比进行更改

import RPi.GPIO as GPIO

import time

#RGB三色灯引脚定义

LED_R = 22

LED_G = 27

LED_B = 24

#舵机引脚定义

ServoPin = 11

#设置GPIO口为BCM编码方式

GPIO.setmode(GPIO.BCM)

#忽略警告信息

GPIO.setwarnings(False)

#RGB三色灯初始化为输出模式

#舵机引脚设置为输出模式

def init():

    global pwm_servo

    GPIO.setup(LED_R, GPIO.OUT)

    GPIO.setup(LED_G, GPIO.OUT)

    GPIO.setup(LED_B, GPIO.OUT)

    GPIO.setup(ServoPin, GPIO.OUT)

    #设置pwm引脚和频率为50hz

    pwm_servo = GPIO.PWM(ServoPin, 50)

    pwm_servo.start(0)

#根据转动的角度来点亮相应的颜色

def corlor_light(pos):

    if pos > 150:

        GPIO.output(LED_R, GPIO.HIGH)

GPIO.output(LED_G, GPIO.LOW)

GPIO.output(LED_B, GPIO.LOW)

    elif pos > 125:

GPIO.output(LED_R, GPIO.LOW)

GPIO.output(LED_G, GPIO.HIGH)

GPIO.output(LED_B, GPIO.LOW)

    elif pos >100:

        GPIO.output(LED_R, GPIO.LOW)

GPIO.output(LED_G, GPIO.LOW)

GPIO.output(LED_B, GPIO.HIGH)

    elif pos > 75:

GPIO.output(LED_R, GPIO.HIGH)

GPIO.output(LED_G, GPIO.HIGH)

GPIO.output(LED_B, GPIO.LOW)

    elif pos > 50:

GPIO.output(LED_R, GPIO.LOW)

GPIO.output(LED_G, GPIO.HIGH)

GPIO.output(LED_B, GPIO.HIGH)

    elif pos > 25:

        GPIO.output(LED_R, GPIO.HIGH)

GPIO.output(LED_G, GPIO.LOW)

GPIO.output(LED_B, GPIO.HIGH)

    elif pos > 0:

        GPIO.output(LED_R, GPIO.HIGH)

GPIO.output(LED_G, GPIO.HIGH)

GPIO.output(LED_B, GPIO.HIGH)

    else :

        GPIO.output(LED_R, GPIO.LOW)

GPIO.output(LED_G, GPIO.LOW)

GPIO.output(LED_B, GPIO.LOW)

#舵机来回转动

def servo_control_color():

    for pos in range(181):

        pwm_servo.ChangeDutyCycle(2.5 + 10 * pos/180)

corlor_light(pos)

time.sleep(0.009)

    for pos in reversed(range(181)):

        pwm_servo.ChangeDutyCycle(2.5 + 10 * pos/180)

corlor_light(pos)

time.sleep(0.009)

#延时2s

time.sleep(2)

#try/except语句用来检测try语句块中的错误,

#从而让except语句捕获异常信息并处理。

try:

    init()

    #舵机初始化向前

    pwm_servo.ChangeDutyCycle(2.5 + 10 * 90/180)

    while True:

  servo_control_color()

except KeyboardInterrupt:

    pass

pwm_servo.stop()

GPIO.cleanup()

#2 打开usb摄像头读取帧照片

import CV2

import matplotlib.pyplot as plt

#opencv调用csi摄像头优先0,然后usb按顺序排列下去

capture = CV2.VideoCapture(0)

# 获取一帧

ret, frame = capture.read()

plt.imshow(frame[:,:,::-1])#BGRtoRGB

plt.show()

# 释放资源

capture.release()

除了程序打开

还可以使用 命令行,打开USB摄像头进行录制和拍摄

cd mjpg-streamer-master/mjpg-streamer-experimental(切换到树莓派上 摄像头软件目录)

./mjpg_stream -i ”./input_uvc.so” -o ”./output_http.so -w ./www”(命令启动 usb摄像头 这里实例 主要用了USB摄像头 没有用 树莓派摄像头)

或者 ./start.sh(bash 命令快捷启动)

注意开启后 保持终端 防止 摄像头中断

#实现视频接受 html

<!DOCTYPE html>

<html>

<head>

<title>实时视频</title>

<style>

     #webcam{

          width: 80%;

          height: 80%;

          display: block;

          margin: 10% auto;

          text-align: center;

          position: relative;

     }

     #webcam img{

         width: 100%;

         height: auto;

         display: block;

         margin: 0 auto;

     }

</style>

</head>

<body>

<div id="webcam">

     <div>

     </div>

</div>

<script type="text/javascript">

    var imageNr = 0; // 图片的索引号

    var finished = new Array(); // 下载图片的队列

    var paused = false; //

     

    function createImageLayer() {

      var img = new Image();

      img.style.position = "absolute";

      img.style.zIndex = -1;

      img.onload = imageOnload;

      img.onclick = imageOnclick;

         //填你对应的ip和端口

      img.src = "http://172.19.8.176:8080/?action=snapshot&n=" + (++imageNr);

      var webcam = document.getElementById("webcam");

      webcam.insertBefore(img, webcam.firstChild);

    }

     

     

    function imageOnload() {

      this.style.zIndex = imageNr;

      while (1 < finished.length) {

        var del = finished.shift(); // 删除旧照片

        del.parentNode.removeChild(del);

      }

      finished.push(this);

      if (!paused) createImageLayer();

    }

     

    function imageOnclick() {

      paused = !paused;

      if (!paused) createImageLayer();

    }

    createImageLayer()

</script>

</body>

</html>

3.3.蓝牙通信控制驱动

3.3.1.功能简介

简要说明该功能

1.蓝牙通信控制驱动

获取手柄传入的蓝牙信息,

调整案件和左边转轴的范围

,根据获取到的案件信息调取对应的驱动功能

按键

(-1,0)向左

(1,0)右

(0,-1)上

(0,1)下

左右转轴

Axi1 axi2 axi3 axi4 axi5

测试

3.3.2.操作截图

该功能的操作截图

3.3.3.代码说明

列出主要的源码,对重要语句用文字注释

自己添加功能章节

#-*- coding:UTF-8 -*-

import RPi.GPIO as GPIO

import time

import spidev

import pygame

    

#手柄按键定义

PSB_forward = 1

PSB_back =  2

PSB_Right =  3

PSB_left = 4

PSB_stop = 5

#PS2引脚设置

#回发过来的后4个数据是摇杆的数据

#小车运行状态值定义

enSTOP = 0

enRUN =1

enBACK = 2

enLEFT = 3

enRIGHT = 4

enTLEFT =5

enTRIGHT = 6

enUPLEFT = 7

enUPRIGHT = 8

enDOWNLEFT = 9

enDOWNRIGHT = 10

#小车电机引脚定义

IN1 = 20

IN2 = 21

IN3 = 19

IN4 = 26

ENA = 16

ENB = 13

#舵机引脚定义

ServoPin = 11

#蜂鸣器引脚定义

buzzer = 8

#灭火电机引脚设置

OutfirePin = 2

#RGB三色灯引脚定义

LED_R = 22

LED_G = 27

LED_B = 24

#小车速度变量

CarSpeedControl = 50

#小车舵机状态变量

g_ServoState = 0

#设置GPIO口为BCM编码方式

GPIO.setmode(GPIO.BCM)

#忽略警告信息

GPIO.setwarnings(False)

#电机引脚初始化为输出模式

#RGB三色灯,舵机引脚初始化

def init():

    global pwm_ENA

    global pwm_ENB

    global pwm_servo

    global pwm_rled

    global pwm_gled

    global pwm_bled   

    GPIO.setup(ENA,GPIO.OUT,initial=GPIO.HIGH)

    GPIO.setup(IN1,GPIO.OUT,initial=GPIO.LOW)

    GPIO.setup(IN2,GPIO.OUT,initial=GPIO.LOW)

    GPIO.setup(ENB,GPIO.OUT,initial=GPIO.HIGH)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值