构建Raspberry Pi电机驱动器HAT的教程分享

控制/MCU

1882人已加入

描述

  Raspberry Pi HAT 是 Raspberry Pi 的附加板,尺寸与 Pi 相同。它可以直接安装在 Raspberry Pi 的顶部,不需要任何进一步的连接。市场上有许多 Raspberry Pi HAT。在本教程中,我们将构建一个Raspberry Pi 电机驱动器 HAT来驱动直流和步进电机。此电机驱动器 HAT 包含一个 L293D 电机驱动器 IC、16*2 LCD 显示模块、四个按钮和用于 SIM800 模块的额外引脚和一个 3.3V 稳压器。这个 Raspberry Pi HAT 将在构建机器人项目时派上用场。

  Raspberry Pi 电机驱动器 HAT 所需的组件

  树莓派

  L293D集成电路

  4 个按钮

  贴片电阻(1×10K、12×1K)

  1×10K电位器

  4× SMD LED

  LM317 稳压器

  2×螺丝端子

  16*2液晶模组

  L293D电机驱动IC

  L293D 是一种流行的 16 引脚电机驱动器 IC。顾名思义,它用于控制单极、双极步进电机、直流电机,甚至伺服电机。单个 L293D IC 可以同时驱动两个直流电机。此外,这两个电机的速度和方向可以独立控制。该 IC 带有两个电源输入引脚,即“Vcc1”和“Vcc2”。Vcc1 用于为内部逻辑电路供电,应为 5V,Vcc2 引脚用于为电机供电,可为 4.5V 至 36V。

步进电机

  L293D 规格:

  电机电压 Vcc2 (Vs):4.5V 至 36V

  最大峰值电机电流:1.2A

  最大持续电机电流:600mA

  Vcc1(VSS) 的电源电压:4.5V 至 7V

  转换时间:300ns(在 5V 和 24V 时)

  自动热关断可用

  Raspberry Pi 电机驱动器 HAT 的电路图

  下图显示了带有 Raspberry Pi 的 L293D 电机驱动器的完整原理图。原理图是使用 EasyEDA 绘制的。

步进电机

  该 HAT 由 L293D 电机驱动 IC、16*2 LCD 显示模块和四个按钮组成。我们还为带有 3.3V 稳压器的 SIM800 模块提供了引脚,该稳压器使用 LM317 可变稳压器设计用于未来的项目。Raspberry Pi 电机驱动器 HAT 将直接安装在 Raspberry Pi 顶部,从而更容易使用 Raspberry Pi 控制机器人。

  为 Raspberry Pi 电机驱动器 HAT 制造 PCB

  原理图完成后,我们可以继续布置 PCB。您可以使用您选择的任何 PCB 软件来设计 PCB。我们已经使用 EasyEDA 为这个项目制造 PCB。您可以通过从“层”窗口中选择层来查看 PCB 的任何层(Top、Bottom、Topsilk、bottomsilk 等)。除此之外,还提供了 PCB 的 3D 模型视图,了解它在制造后的外观。下面是 Pi Motor Driver HAT PCB 顶层和底层的 3D 模型视图。

步进电机

  组装Raspberry Pi 电机驱动器 HAT PCB

  几天后,我们收到了整齐包装的 PCB,PCB 质量一如既往地好。板子的顶层和底层如下图所示:

步进电机

  在确保轨道和脚印是正确的之后。我继续组装PCB。此处的图像显示了完全焊接的电路板的外观。

步进电机

树莓派设置

在对 Raspberry Pi 进行编程之前,我们必须安装所需的库。为此,首先,使用以下命令更新 Raspberry Pi OS:

 

sudo apt-get 更新
sudo apt-get 升级

 

现在为 LCD 模块安装Adafruit_CharLCD 库。该库适用于 Adafruit LCD 板,但也适用于其他品牌的 LCD 板。

 

sudo pip3 安装 Adafruit-CharLCD

 

树莓派电机驱动代码说明

在这个项目中,我们正在对 Raspberry Pi 进行编程,以在两秒的时间间隔内同时驱动正向、反向、向左和向右方向的两个直流电机。电机的方向将显示在 LCD 上。完整的代码在文档末尾给出。在这里,我们将解释代码的一些重要部分。

像往常一样,通过导入所有必需的库来启动代码。RPi.GPIO 模块用于使用 Python 访问 GPIO 引脚。模块时间用于将程序暂停一段预定义的时间。

 

导入 RPi.GPIO 作为 GPIO
进口时间
进口板
导入 Adafruit_CharLCD 作为 LCD

 

之后,为 L293D 电机驱动器 IC 和 LCD 显示器分配 GPIO 引脚。

 

液晶显示器 = 0
液晶显示器 = 5
lcd_d4 = 6
电机 1A = 4
电机 1B = 17
电机 1E = 12

 

现在,将 6 个电机引脚设置为输出引脚。接下来的四个是输出引脚,其中前两个用于控制右侧电机,接下来的两个用于控制左侧电机。接下来的两个引脚是左右电机的启用引脚。

 

GPIO.setup(Motor1A,GPIO.OUT)
GPIO.setup(Motor1B,GPIO.OUT)
GPIO.setup(Motor1E,GPIO.OUT)
GPIO.setup(Motor2A,GPIO.OUT)
GPIO.setup(Motor2B,GPIO.OUT)
GPIO.setup(Motor2E,GPIO.OUT)

 

在 while 循环内,以两秒的间隔同时向前、向后、向左和向右移动两个直流电机。

 

GPIO.输出(电机 1A,0)
                GPIO.输出(电机 1B,0)
                GPIO.输出(电机 2A,1)
                GPIO.输出(Motor2B,0)
                lcd.message ('左')
                打印(“左”)
                睡觉(2)
       #向前
                GPIO.输出(电机 1A,1)
                GPIO.输出(电机 1B,0)
                GPIO.输出(电机 2A,1)
                GPIO.输出(Motor2B,0)
                lcd.message ('转发')
                打印(“转发”)
…………………………………………

 

  测试 Raspberry Pi 电机驱动器 HAT

  完成 PCB 组装后,将电机驱动器 HAT 安装在 Raspberry Pi 上,然后启动代码。如果一切正常,连接到 Raspberry Pi 的直流电机将每两秒同时向左、前、右和反向移动,电机方向将显示在 LCD 显示屏上。

步进电机

导入 RPi.GPIO 作为 GPIO
从时间导入睡眠
进口板
导入 Adafruit_CharLCD 作为 LCD
# 树莓派引脚设置
液晶显示器 = 0
液晶显示器 = 5
lcd_d4 = 6
lcd_d5 = 19
lcd_d6 = 26
液晶显示器 = 21
液晶背光 = 2
#定义 16x2 LCD 的 LCD 列和行大小。
lcd_columns = 16
lcd_rows = 2
lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, lcd_columns, lcd_rows, lcd_backlight)
# 电机驱动器输入引脚
电机 1A = 4
电机 1B = 17
电机 1E = 12
电机 2A = 27
电机 2B = 22
电机 2E = 13
GPIO.setwarnings(假)
GPIO.setmode(GPIO.BCM)
GPIO.setup(Motor1A,GPIO.OUT)
GPIO.setup(Motor1B,GPIO.OUT)
GPIO.setup(Motor1E,GPIO.OUT)
GPIO.setup(Motor2A,GPIO.OUT)
GPIO.setup(Motor2B,GPIO.OUT)
GPIO.setup(Motor2E,GPIO.OUT)
GPIO.setup(14, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.输出(电机 1E,1)
GPIO.输出(Motor2E,1)
而真:
input_state = GPIO.input(14)
打印(输入状态)
如果 input_state == False:
#剩下
GPIO.输出(电机 1A,0)
GPIO.输出(电机 1B,0)
GPIO.输出(电机 2A,1)
GPIO.输出(Motor2B,0)
lcd.clear()
lcd.set_cursor(6,0)
lcd.message ('左')
打印(“左”)
睡觉(2)
#向前
GPIO.输出(电机 1A,1)
GPIO.输出(电机 1B,0)
GPIO.输出(电机 2A,1)
GPIO.输出(Motor2B,0)
lcd.clear()
lcd.set_cursor(4,0)
lcd.message ('转发')
打印(“转发”)
睡觉(2)
#正确的
GPIO.输出(电机 1A,1)
GPIO.输出(电机 1B,0)
GPIO.输出(Motor2A,0)
GPIO.输出(Motor2B,0)
lcd.clear()
lcd.set_cursor(5,0)
lcd.message ('对')
打印(“右”)
睡觉(2)
#撤销
GPIO.输出(电机 1A,0)
GPIO.输出(电机 1B,1)
GPIO.输出(Motor2A,0)
GPIO.输出(Motor2B,1)
lcd.clear()
lcd.set_cursor(4,0)
lcd.message ('反向')
打印(“反向”)
睡觉 (2)
#停止
GPIO.输出(电机 1A,0)
GPIO.输出(电机 1B,0)
GPIO.输出(Motor2A,0)
GPIO.输出(Motor2B,0)
lcd.clear()

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分