本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页

基于树莓派B的半自动4WD汽车

发布时间:2022-07-26
分享到:

基于树莓派B的半自动4WD汽车

发布时间:2022-07-26
分享到:

本文是关于如何构建我的 Pi Car 的指南! 

当我第一次发现 Raspberry Pi 时,我渴望学习电子学和编码,以便创造出很酷的小工具。但是,由于没有事先编码或电子知识,我真的不知道从哪里开始。

所以这作为我的第一个项目,我决定建造一辆 Raspberry Pi Car。同时,在尝试学习 Raspberry Pi、Linux、电子和 Python 的基础知识的过程中! 

阅读本文可以帮助你了解在构建自己的 Pi Car 时的一些具体细则。

最终目标: 

构建具有以下内容的 Pi Car:

  •    -4WD 
  •    - 半自主能力
  •    -Camera Stream(可通过 Internet 访问)

实物:

建造 Pi 车:

1. 构建机箱:

组装底盘套件。这是相当直截了当的,但请参阅下面的构建前和构建后图片以获取帮助。 

重要提示:在将电机拧入到位之前(如下图所示),将红线和黑线连接到每个电机。红线需要连接到每个电机的顶部,黑线也需要连接到底部。用绝缘胶带将这些连接牢牢固定。 如果您想要永久连接,您可以焊接这些。最后, 记得取下每张塑料片上的棕色盖子。

在我的 构建中,我 将电池组移向底盘末端以创造更多空间(由下图中的箭头指示)。

2. 将电机连接到 L298N 电机驱动器:

接下来,我们将 4 个电机连接到电机驱动器。

2.1 连接电线:

请参阅下面的图片以识别哪个电机是哪个电机,以及电机驱动器的图片以清楚地识别如何连接 4 个电机中的每一个。下面的列表还说明了如何为每个电机接线。

左上电机: 右上电机:                                 

  •    红色:输出 2 红色:输出 4
  •    黑色:输出 1 黑色:输出 3

左下电机: 右下电机:

  •    红色:输出 1 红色:输出 3
  •    黑色:输出 2 黑色:输出 4

重要提示:对于这个项目,我们将两根电线连接到电机驱动器上可用的每个“OUT”孔中。拧紧每个连接以确保电线不会移动。这可能是一个相当麻烦的过程,但请注意不要损坏电线。对于电缆管理,您可以将电线穿过机箱中内置的许多小孔。  

2.2 连接电池组:

要将电池组(已安装在底盘上)连接到电机驱动器,请按如下方式连接电线: 

将红线连接到 VCC 孔, 黑线连接到 GND 孔。 

现在所有 4 个电机都连接到电机驱动器,我们可以添加 Raspberry Pi 并将其连接到电机驱动器。 

3. 将树莓派连接到 L298N 电机驱动器

在添加我们的 Raspberry Pi 之前,我们需要按照以下步骤进行准备:

3.1 准备树莓派:

  • 下载 Raspbian Jessie 操作系统 (OS)
  • 将 Raspbian 格式化并安装到 SD 卡
  • 将无线互联网和无线键盘 USB 适配器插入 Pi 的 USB 插槽

3.2 连接 L298N 电机驱动器:

完成后,我们需要将其放置在 Pi-Car 的前面。(我可以用 Pi 外壳上的一些螺丝固定我的)接下来使用跳线将 Pi 的 GPIO 引脚连接到电机驱动器。

如下所示连接引脚: 

  • GPIO 引脚 2 至 5V(使用母对公跳线) 
  • GPIO 引脚 6 到 GND(使用母对公跳线)
  • GPIO 引脚 7 到 INI4 (EVA) 
  • GPIO 引脚 11 至 INI3 (5V)
  • GPIO 引脚 13 至 INI2 (5V)
  • GPIO 引脚 15 到 INI1 (EVB)

如需识别 Pi 的引脚,请参见下图。

现在 Pi 已定位,我们需要添加超声波传感器。 

4.添加HC-SR04超声波测距传感器模块

如下图所示,将传感器模块和电线连接到面包板上。确保包括 1ohm 电阻,因为这将保护您的 Pi。(请参阅下面的其他图片,了解使用哪个电阻)

完成后,将面包板放置在汽车前部的底层。

4.1 将传感器连接到 Pi:

将面包板上的电线连接到 Pi 和电机驱动器,如下所示:

  • 回声电缆(上图中的黄色电缆)到 Pi 上的引脚 16(使用母对公跳线) 
  • 触发电缆(上图中的橙色电缆)到 Pi 上的引脚 12  (使用母对公跳线)
  • 接地电缆(上图中的黑色电缆)到 电机驱动器上的 GND(使用母对公跳线)
  • 电源线(上图中的红色电缆)到电机驱动器上的 5V(使用母对公跳线)

到这一步,你现在应该已将所有必要的电缆插入电机驱动器!1 条电缆进入 VCC(来自电池组),  3 条电缆进入 GND(1 条来自电池组、Raspberry Pi 和超声波传感器。)和 2 条进入 5V 的电缆(1 条来自 Pi,1 条来自超声波传感器)

5. 将相机添加到 Pi:

- 相机本身的概述

-如何将相机模块连接到树莓派

-如何在 Pi 本身上启用相机模块

- 使用相机的基本命令(即如何拍照和录像)

在我的构建中,我使用了“ Scorpi / Flexible Mount” 电缆来帮助将相机固定到位。

6. 放置电源组:

将便携式充电器放在机箱背面的底层。我使用松紧带帮助在使用时将充电器临时固定到位。

设置 Pi 车:
现在汽车已经建成,我们现在可以为汽车开发软件。

1. 准备树莓派:

在打开 Pi 之前,请确保以下内容已连接到 Pi  :

  • - 无线键盘 USB 适配器
  • - 无线互联网 USB 适配器
  • - 连接显示器/电视的 HDMI 电缆。
  • - 相机也应该连接。

2. 开启树莓派:

要打开 Pi 电源,请将 micro-USB 电缆从电源连接到 Pi。 Pi 第一次启动需要几分钟时间。完成后,图形用户界面 (GUI) 将自动加载。

3. 配置树莓派:

我们需要做的第一件事是配置 Pi。为此,请单击:

菜单(屏幕左上角)>首选项>Raspberry Pi 配置 

将打开以下窗口:

单击“扩展文件系统”以确保我们使用 SD 卡上的所有可用内存。(随时更改您的密码等)

接下来,单击“接口”选项卡并启用相机(确保 SHH 也已启用。)

然后,单击“本地化”选项卡并将语言和国家/地区设置为您的偏好。

单击“确定”并重新启动 Pi。

4. 连接互联网: 

Pi重新启动后,单击屏幕右上角的“网络”图标。 

从下拉菜单中选择您的路由器并输入其密码。

5. 更新 Raspbian 操作系统:

现在我们已连接到互联网,我们可以将我们的操作系统更新到最新版本。为此,请打开“终端”并分别输入以下代码:

sudo apt-get update

sudo apt-get upgrade       

(对于第二个命令,在提示时输入 Y)

两者都可能需要几分钟才能完成,完成后重新启动您的 Pi。

6.安装VLC:

VLC 是我们将用于将 Raspberry Pi 相机流式传输到 Internet 的应用程序。我们需要将它安装在您想要从中查看摄像头流的 Pi 和计算机/智能手机上。

在 Pi 上:

在终端中输入以下代码:

sudo apt-get install vlc

(出现提示时输入 Y)

在客户端计算机/智能手机上:

访问:http ://www.videolan.org/vlc/index.en_GB.html 并下载适合您操作系统的版本。(Windows/Mac/安卓)

7. 创建文件:

现在我们的 Pi 是最新的,我们拥有所有必需的应用程序,可以创建实际驾驶汽车的代码。 

首先,我们将创建一个文件夹来存放我们的文件。为此,我们在终端中输入以下命令:

mkdir PiCar

这将创建一个名为“PiCar”的文件夹 - 您可以随意命名。

现在文件夹已经创建,我们需要通过输入以下命令进入它;

cd PiCar

现在我们需要创建实际驾驶汽车的 python 文件:

7.1 main.py - 这将是我们为驾驶汽车而运行的主文件

要创建一个空文件 ,请在终端中键入以下命令:

sudo nano main.py 
这将在 Raspberry Pi 的文本编辑器中打开一个新文件。(称为纳米)

现在将附加的main.py文件中的代码复制或键入 到这个空文件中。 

7.2 sensor.py - 该文件将初始化超声波传感器。 

为 sensor.py 文件再次完成上述过程。请记住首先使用以下命令创建文件;

sudo nano sensor.py 
(确保在我们创建的 PiCar 文件夹中创建它)

7.3 camera.sh  - 此文件将通过互联网传输我们的相机。

首先使用以下命令创建文件;

sudo nano camera.sh
现在将附加的 camera.sh 文件中的代码复制或键入到这个空文件中。

运行代码:

1.给树莓派上电(用HDMI线连接显示器)

2.启动后,打开终端

3. 将目录更改为 PiCar(键入 cd PiCar)

4.运行汽车文件(输入'sudo python main.py')

5. PiCar现在可以通过无线键盘运行和控制(开车前记得拔掉HDMI线!)

以下钥匙将驾驶汽车:

  • W = 前进
  • S = 反向
  • A = 左转
  • D = 右转
  • P = 停止

Pi 也将是半自动的,如果有任何东西进入前传感器的 15 厘米范围内,那么 PiCar 将自动倒车一秒钟。 

流式传输相机(可选):

在 Pi 上:

1.打开终端

2. 将目录更改为 PiCar(键入 cd PiCar) 

3.运行camera.sh(输入./camera.sh)

在客户端计算机/智能手机上: 

  • 启动 VLC
  • 单击“文件”,然后单击“打开网络流”
  • 输入 http://<YourIPAddressHere> :8554/
  • 单击“打开”,几秒钟后,将打开一个带有流的新窗口。(可能会有几秒钟的延迟)

重要提示:要查找您的 IP 地址,请在终端中输入以下命令:

hostname -I

未来可能的拓展:

  • 让main.py文件在启动时自动运行(所以我不需要将Pi插入显示器超时)
  • 创建一个 python 文件,它将执行与我们的 camera.sh bash 脚本(使用 Picamera)相同的操作,并将其 合并到我们的main.py文件中。 
  • 添加额外的超声波传感器

python main文件:

import RPi.GPIO as gpio
import time
import sys
import Tkinter as tk
from sensor import distance

def init():
    gpio.setmode(gpio.BOARD)
    gpio.setup(7, gpio.OUT)
    gpio.setup(11, gpio.OUT)
    gpio.setup(13, gpio.OUT)
    gpio.setup(15, gpio.OUT)

def reverse(tf):
    gpio.output(7, False)
    gpio.output(11, True)
    gpio.output(13, False)
    gpio.output(15, True)
    time.sleep(tf)
    
def forward(tf):
    gpio.output(7, True)
    gpio.output(11, False)
    gpio.output(13, True)
    gpio.output(15, False)
    time.sleep(tf)
    
def turn_right(tf):
    gpio.output(7, True)
    gpio.output(11, False)
    gpio.output(13, False)
    gpio.output(15, True)
    time.sleep(tf)
    
def turn_left(tf):
    gpio.output(7, False)
    gpio.output(11, True)
    gpio.output(13, True)
    gpio.output(15, False)
    time.sleep(tf)

def stop(tf):
    gpio.output(7, False)
    gpio.output(11, False)
    gpio.output(13, False)
    gpio.output(15, False)
    time.sleep(tf)
    gpio.cleanup()

def key_input(event):
    init()
    print "Key:", event.char
    key_press = event.char
    sleep_time = 0.060
    
    if key_press.lower() == "w":
        forward(sleep_time)
    elif key_press.lower() == "s":
        reverse(sleep_time)
    elif key_press.lower() == "a":
        turn_left(sleep_time)
    elif key_press.lower() == "d":
        turn_right(sleep_time)
    elif key_press.lower() == "p":
        stop(sleep_time) 
    else:
        pass

    curDis = distance("cm")
    print("Distance:", curDis)
    
    if curDis <15:
        init()
        reverse(0.5)

command = tk.TK()
command.bind('<keypress>', key_input)
command.mainloop()

如果您对此项目有任何想法、意见或问题,请在下方留言。

以上内容翻译自网络,原作者:Best,如涉及侵权,可联系删除。

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论