您现在的位置是:首页 > 汽车

如何利用Raspberry Pi建造半自动4WD汽车

2024-04-28 02:04:36

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

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

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

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

  最终目标:

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

  -4WD

  - 半自主能力

  -Camera Stream(可通过 Internet 访问)

  实物:

pYYBAGLg-YGAeMDgAAQiezJs86s245.png

pYYBAGLg-X2ALSykAAJtV1B91po965.png

pYYBAGLg-XqAIPilAAHnNK1MJD4139.png

  建造 Pi 车:

  1. 构建机箱:

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

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

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

poYBAGLg-XWATF49AANKX5iY2ck857.png

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

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

  2.1 连接电线:

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

  左上电机: 右上电机:

  红色:输出 2 红色:输出 4

  黑色:输出 1 黑色:输出 3

  左下电机: 右下电机:

  红色:输出 1 红色:输出 3

  黑色:输出 2 黑色:输出 4

pYYBAGLg-XCAR9AYAAOvvZjf68k570.png

  重要提示:对于这个项目,我们将两根电线连接到电机驱动器上可用的每个“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 的引脚,请参见下图。

poYBAGLg-WqAFw-bAAGRyGLT0VM244.png

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

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

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

pYYBAGLg-WaAEcCSAAIZ0VulX3I812.png

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

  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 配置

  将打开以下窗口:

poYBAGLg-V-AYIfxAAH3NWKLh44680.png

  单击“扩展文件系统”以确保我们使用 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('', key_input)
command.mainloop()