树莓派控制直流电机

2023-05-16

古月金真

1、直流电机

直流电机是一种将直流电能转换为机械能的装置,被广泛的用于驱动各种设备,如电风扇、遥控小车、电动车窗等,在控制设备运转领域中,它是不可或缺的一种设备。

小型直流电机的的电压范围通常是1.5V~30V,使用两根导线连接到直流电源上就能让电机转动起来,电压越高转得就越快。每个直流电机都有一个推荐电压,超出推荐电压太多容易导致电机被烧毁,而供电电压太低则转不起来。通过交换两根连接在电机上的导线顺序(实际上是改变电源的正负极),可以改变电机的转向。直流电机属于高功耗元件,不可以直接使用树莓派进行驱动,因此我们需要使用一个外部电源。

小型直流电机通常输出很高的转速和较低的扭矩,在作为机器人的驱动装置时,一般需要连接一个变速器,将其转换为低转速、高扭矩,使之有足够的力量驱动机器人。
下图为一个普通的直流电机图片。
在这里插入图片描述

2、双H桥直流电机驱动模块(L298N)

H桥(H-Bridge)是控制直流电机的常用电路,因其电路形状酷似字母H而得名,可以控制直流电机的转速和方向,典型的H桥芯片有L293D、L298N等,我们以L298N为例进行介绍,下图是一款典型的L298N双H桥直流电机驱动模块。
在这里插入图片描述
在这里插入图片描述

  • 采用L298N双桥直流电机驱动芯片
  • 工作电压范围5V~35V,如果需要从模块内取电,则供电范围为7V—35V。
  • 峰值输出电流2A。
  • 每个通道有一个使能输入端。
  • 可以驱动两个直流电机或者一个四线步进电机。

L298N双H桥直流电机驱动模块的引脚可以归纳成电源、控制和输出等三大类,下面是各类引脚的功能说明。

  • 电压类引脚

+12V输入:L298N芯片的电源正极,模块上标称+12V,但实际范围可以是5V35V,如果需从模块内取电,则其范围为7V35V。
  GND:L298N芯片的电源地,使用的时候应该把树莓派的GND接到这里,即两者需要共地。
  +5V输出:L298N芯片输出的5V电源,可以给外部设备供电,使用的时候需要用跳线把5V输出使能端短接起来。

  • 控制类引脚

    ENA、ENB:A、B通道的使能端,高电平有效,可以用PWM来实现调速。使用时,可以接到树莓派的GPIO上,实现用程序进行控制。
    IN1、IN2、IN3、IN4:IN1、IN2为A通道的控制输入,IN3、IN4为B通道的控制输入。

  • 输出类引脚
    OUT1、OUT2、OUT3、OUT4:OUT1、OUT2由A通道输出,OUT3、OUT4由B通道输出,可以用于连接直流电机等设备。
      控制直流电机的转向和转速实际是通过给控制类引脚设置不同的值来实现的,表7.1是使用通道A的控制直流电机的真值表,通道B与此类似。
      在这里插入图片描述

3.电路

下图为树莓派、L298N双H桥直流电机驱动模块和电机间连接的电路图,最终实物连线图如图7.4所示。我们使用树莓派的GPIO13、GPIO19和GPIO26等3个引脚,分别连接到L298N双H桥直流电机驱动模块的ENA、IN1和IN2,通过输入表7.1所示的不同电平组合就可以实现对电机的操纵。控制电机的转向和转速都是使用该电路,向ENA输入不同占空比的PWM脉冲信号就可以控制电机的转速。
在这里插入图片描述

4、程序

- 一、控制电机转动

   import RPi.GPIO as GPIO      # 引入GPIO模块
    
    ENA = 13                    #定义对应的引脚变量(等一下用)
    IN1 = 19
    IN2 = 26
    
    GPIO.setmode(GPIO.BCM)      # 使用BCM编号方式
    GPIO.setup(ENA, GPIO.OUT)   # 将连接ENA的GPIO引脚设置为输出模式
    GPIO.setup(IN1, GPIO.OUT)    # 将连接IN1的GPIO引脚设置为输出模式
    GPIO.setup(IN2, GPIO.OUT)    # 将连接IN2的GPIO引脚设置为输出模式
    
    while True:                   #循环
        GPIO.output(IN1, False)   # 将IN2设置为1
        GPIO.output(IN2,  True)   # 将IN2设置为1
        GPIO.output(ENA, True)    # 将ENA设置为1,启动A通道电机
    
    input()
    GPIO.cleanup()

运行上面程序时,电机以L298N模块输出的最大电压正转。

二、控制电机转动并调速

import RPi.GPIO as GPIO     # 引入GPIO模块

ENA = 13      #定义对应的引脚变量(等一下用)
IN1 = 19
IN2 = 26
hz = 500       #定义频率变量(等一下用)
speed = 0      #定义占空比变量(等下用)运行时默认的占空比为0

GPIO.setmode(GPIO.BCM)    # 使用BCM编号方式
GPIO.setup(ENA, GPIO.OUT) # 将ENA对应的GPIO引脚设置为输出模式
GPIO.setup(IN1, GPIO.OUT)  # 将IN1对应的GPIO引脚设置为输出模式
GPIO.setup(IN2, GPIO.OUT)  # 将IN2对应的GPIO引脚设置为输出模式
pwm = GPIO.PWM(ENA, hz)    # 设置向ENA输入PWM脉冲信号,频率为hz并创建PWM对象
pwm.start(speed)           # 以speed的初始占空比开始向ENA输入PWM脉冲信号

while True:
    speed = int(input("Please input motor speed (1-100): "))   #程序运行时通过键盘输入占空比改变电机转速
    pwm.ChangeDutyCycle(speed)  # 改变PWM占空比
    GPIO.output(IN1, GPIO.LOW)    # 将IN1设置为0
    GPIO.output(IN2, GPIO.HIGH)    # 将IN2设置为1 ,电机正转
  
input()
GPIO.cleanup()

当程序运行时,电机不转动,当输入在0~100数值的占空比后电机转动,输入数值越大L298N模块输出的最大电压越大,当输入数值100时电机以L298N模块输出的最大电压正转,当输入数值0时,L298N模块输出电压为0v,电机不转动,运行操作如下图所示。
在这里插入图片描述
三、控制电机正转、反转和停止

import RPi.GPIO as GPIO    # 引入GPIO模块

ENA = 13       #定义对应的引脚变量(等一下用)
IN1 = 19
IN2 = 26

GPIO.setmode(GPIO.BCM)       # 使用BCM编号方式
GPIO.setup(ENA, GPIO.OUT)    # 将连接ENA的GPIO引脚设置为输出模式
GPIO.setup(IN1, GPIO.OUT)     # 将连接IN1的GPIO引脚设置为输出模式
GPIO.setup(IN2, GPIO.OUT)     # 将连接IN2的GPIO引脚设置为输出模式

a = int(input("zheng zhuan 0 ,fan zhuan 1,  ting 2 : "))  #程序运行时通过键盘输入0、1、2分别控制电机正转、反转和停止
while True:
    if a == 0:   #如果键盘输入的数值为0,则电机正转
        while 1:
            GPIO.output(IN1, GPIO.LOW)
            GPIO.output(IN2, GPIO.HIGH)
            GPIO.output(ENA, GPIO.HIGH)
            a = int(input("zheng zhuan 0 ,fan zhuan 1,  ting 2 : "))
            if (a == 1 or a == 2):  
                break

    if a == 1:    #如果键盘输入的数值为1,则电机反转
        while 1:
            GPIO.output(IN1, GPIO.HIGH)
            GPIO.output(IN2, GPIO.LOW)
            GPIO.output(ENA, GPIO.HIGH)
            a = int(input("zheng zhuan 0 ,fan zhuan 1,  ting 2 : "))
            if (a == 0 or a == 2):
                break

    if a == 2:      #如果键盘输入的数值为2,则电机停止转动
        while 1:
            GPIO.output(IN1, GPIO.LOW)
            GPIO.output(IN2, GPIO.LOW)
            GPIO.output(ENA, GPIO.LOW)
            a = int(input("zheng zhuan 0 ,fan zhuan 1,  ting 2 : "))
            if (a == 0 or a == 1):
                break
input()
GPIO.cleanup()

当程序运行时,如果键盘输入的数值为0,则电机正转。 如果键盘输入的数值为1,则电机反转。如果键盘输入的数值为2,则电机停止转动,运行参照如下图所示。

在这里插入图片描述
四、控制电机正转、反转和停止并现在速度的控制

import RPi.GPIO as GPIO    # 引入GPIO模块

ENA = 13    #定义对应的引脚变量(等一下用)
IN1 = 19
IN2 = 26
hz = 500     #定义频率变量(等一下用)
speed = 0    #定义占空比变量(等下用)运行时默认的占空比为0

GPIO.setmode(GPIO.BCM)    # 使用BCM编号方式
GPIO.setup(ENA, GPIO.OUT)  # 将连接ENA的GPIO引脚设置为输出模式
GPIO.setup(IN1, GPIO.OUT)   # 将连接IN1的GPIO引脚设置为输出模式
GPIO.setup(IN2, GPIO.OUT)   # 将连接IN2的GPIO引脚设置为输出模式
pwm = GPIO.PWM(ENA, hz)   # 设置向ENA输入PWM脉冲信号,频率为hz并创建PWM对象
pwm.start(speed)         # 以speed的初始占空比开始向ENA输入PWM脉冲信号

a = int(input("Positive : 0 , Reversal:1,  Stop: 2, speed:3   :")) #键盘输入0、1、2、3可控制电机正、反、停和改变速度。
speed = int(input("Please input the motor speed (0-100): "))     #键盘输入电机开始运行的速度
while True:
    if a == 0:     #如果键盘输入的数值为0,则电机正转
        while 1:
            if a == 3:   #如果键盘输入的数值为3,输入数值0~100可改变占空比来改变电机转速
                speed = int(input("Please input the motor speed (0-100): "))
            GPIO.output(IN1, GPIO.LOW)
            GPIO.output(IN2, GPIO.HIGH)
            pwm.ChangeDutyCycle(speed)   # 改变PWM占空比
            a = int(input("Positive : 0 , Reversal:1,  Stop: 2, speed: 3  :"))
            if (a == 1 or a == 2):
                break

    if a == 1:      #如果键盘输入的数值为1,则电机反转
        while 1:
            if a == 3:
                speed = int(input("Please input the motor speed (0-100): "))
            GPIO.output(IN1, GPIO.HIGH)
            GPIO.output(IN2, GPIO.LOW)
            pwm.ChangeDutyCycle(speed)
            a = int(input("Positive : 0 , Reversal:1,  Stop: 2, speed: 3  :"))
            if (a == 0 or a == 2):
                break

    if a == 2:      #如果键盘输入的数值为2,则电机停止转动
        while 1:
             if a == 3:
                speed = int(input("Please input the motor speed (0-100): "))
             GPIO.output(IN1, GPIO.LOW)
             GPIO.output(IN2, GPIO.LOW)
             GPIO.output(ENA, GPIO.LOW)
             a = int(input("Positive : 0 , Reversal:1,  Stop: 2, speed: 3  :"))
             if (a == 0 or a == 1):
                 break            
input()
GPIO.cleanup()

当程序运行时,如果键盘输入的数值为0,则电机正转。 如果键盘输入的数值为1,则电机反转。如果键盘输入的数值为2,则电机停止转动。如果键盘输入的数值为3,可以输入数值0~100可改变占空比来改变电机转速,输入数值越大L298N模块输出的最大电压越大,当输入数值100时电机以L298N模块输出的最大电压正转,当输入数值0时,L298N模块输出电压为0v,电机不转动,运行操作如下图所示。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

树莓派控制直流电机 的相关文章

  • @JsonAlias和@JsonProperty用法参考

    64 JsonProperty 这个注解提供了序列化和反序列化过程中该java属性所对应的名称 64 JsonAlias 这个注解只只在反序列化时起作用 xff0c 指定该java属性可以接受的更多名称 JsonAlias 反序列化才可以接
  • linux授权文件文件夹

    授权文件文件夹用户用户组 chown jenkins jenkins maven maven 文件夹 jenkins 用户 jenkins 用户组 授权文件文件夹下所有文件用户用户组 chown span class token opera
  • 【解决问题】RLException: [xx.launch] is neither a launch file in package [x] nor is [x] a launch file name

    本博客运行环境为Ubuntu 18 04 今天在ROS工作区下编译时遇到如下错误 xff1a RLException racecar launch is neither a launch file in package racecar ga
  • Linux\Ubuntu20下解压\提取realsense-viewer的录制文件xxx.bag

    最近用realsense获取rgb和depth图像 xff0c 其中用到了有ui界面的realsense viewer 这里附上RealSense SDK 2 0的github链接 直接在命令行输入即可打开realsense viewer
  • Unity基于思岚A2雷达开发-----配置教程

    说明 此教程是根据视频总结的 xff0c 配置包是厂商提供的 1 图片中圈出来为雷达校准软件 2 打开如下 xff0c 左上角按钮功能依次是设置 扫描 划定互动区域 保存 停止 加载以前扫描文件 右上角白色圆盘调整角度 xff0c 左右箭头
  • Altium Designer20-柔性PCB绘制技巧

    Altium Designer2020 柔性PCB绘制技巧 注 xff1a 教程所用PCB随意找的 xff0c 并没有完全绘制完 xff0c 大家学习PCB折弯方法即可 1 打开PCB 点击视图 gt 板子规划模式1 xff0c 如下图所示
  • SolidWorks2020小金球

    SolidWorks2020小金球 注 xff1a SolidWorks用户对SolidWorks渲染RealView功能的一个简单的叫法 小金球 xff0c 是一款功能功能强大的图形特效工具 xff0c 它可以快速的通过SOLIDWORK
  • QT5.14.1程序打包超级详细教程(windeployqt工具+Enigma Virtual Box)

    QT5 14 1程序打包超级详细教程 windeployqt工具 43 Enigma Virtual Box 注 xff1a 1 本教程使用QT5 14 1版本 xff0c 使用官网自带的windeployqt打包工具 xff0c 可以将文
  • c# RabbitMQ 和 ActiveMQ windows环境的配置和使用

    c RabbitMQ 和 ActiveMQ windows环境的配置和使用 RabbitMQ 1 下载配置 erlang 确保 39 ERLANG HOME 39 在环境变量中配置 2 下载安装 rabbit mq 3 激活 managem
  • SolidWorks2020绘制XT30PW模型

    SolidWorks2020绘制XT30PW模型 注 xff1a 模型根据数据手册绘制下载链接 1 2 3
  • Vmware安装Ubuntu16.0.4出现Assuming drive cache: write through和1920X1080分辨率调节问题

    Vmware安装Ubuntu16 0 4出现Assuming drive cache write through和1920X1080分辨率调节问题 注 xff1a 用Vmare安装Ubuntu16几乎都会遇到下面两个问题 xff0c 跟着我
  • ubuntu QT出现qt creater能编译但qmake编译后不能完全运行

    注释 xff1a 最开始用QT 编译程序 xff0c 但是最后需要将用命令行来编译 xff0c 在使用qmake过程中出现编译能通过但是运行程序也能跑起来 xff0c 但是就感觉卡在哪里了 xff0c 每次需要在QT编译器中重新编译才能运行
  • VScode 代码行数统计

    VScode 代码行数统计 1 安装vs code counter 2 按住按Ctrl 43 Shift 43 P 在命令输入 xff1a Count lines in workspace并回车 3 自动生成 VSCodeCounter x
  • 个人主页(包含项目经历、实习经历、竞赛经历)

    个人主页 注 xff1a 个人主页中主要包含项目经历 实习经历 竞赛经历等方面的照片及文字说明 项目经历 一 基于声源目标识别与定位的微型平台设计 图1 图2 图3 图1 3声源目标识别与定位平台 二 基于STM32的六足仿生机器人设计 图
  • UBUNTU编译运行RTKLIB

    RTKLIB在ubuntu下没有图形用户界面 xff08 GUI xff09 xff01 RTKLIB作为一个功能强大的工具 xff0c 我一直以为它在ubuntu下和win10下是一个样子 xff0c 所以想着用ubuntu下的编译器去编
  • 关于makefile与CMakeList的理解

    为了编译某一工程中的众多 c文件搞出来一个makefile可以批量编译 xff1b Linux下用Cmake也即CMakeLists txt文件 作者写的很清晰易懂
  • c++版本详表

    1 语言标准 版本代目版本号年份第一版c 43 43 981998第二版c 43 43 032003第三版c 43 43 112011第四版c 43 43 142014第五版c 43 43 172017第六版待定待定 2 visual st
  • ffmpeg常用命令

    1 rtsp into mp4 ffmpeg exe i 34 rtsp username password 64 192 168 1 183 554 34 f mp4 r 25 an 640x480 ss 600 t 600 s 34 t
  • http包详解

    位于应用层的http协议 什么也不多说了 xff0c 马上放个图看看 请求方法 xff0c 主要是 xff1a get xff1a 获取 post xff1a 提交 请求头 xff1a User Agent xff1a 产生请求的浏览器类型

随机推荐

  • linux下编译C++项目

    include CheckCXXCompilerFlag CHECK CXX COMPILER FLAG std 61 c 43 43 11 COMPILER SUPPORTS CXX11 CHECK CXX COMPILER FLAG s
  • www总结

    一 www服务器 1 什么是www xff1a www是world wide web的缩写 xff0c 也就是全球信息广播的意思 通常说的上网就是使用www来查询用户所需要的信息 www可以结合文字 图形 影像以及声音等多媒体 xff0c
  • matlab基础练习作业(1)

    要期末考试了 xff0c 整理一下平时的题 作业 xff11 1 写出完成下列操作的命令 1 将矩阵A第2 5行中第1 3 5列元素赋给矩阵B B 61 A 2 5 1 3 5 或者B 61 A 2 3 4 5 1 3 5 2 删除矩阵A的
  • PHP中使用cURL实现进行Post请求 ssl 双向认证

    span class token comment 64 param string url 接收数据的api 64 param string vars 提交的数据 64 param int second 要求程序必须在 second 秒内完成
  • 大端字节序与小端字节序 (网络字节序与主机字节序)

    大端字节序与小端字节序 1 简介2 判断机器字节序 xff08 C C 43 43 xff09 3 主机字节序与网络字节序的转换4 IP地址与网络字节序的转换 1 简介 字节序分为大端字节序 xff08 big endian xff09 和
  • Noetic安装ros_canopen

    建立workspace mkdir span class token operator span p canopen span class token operator span scr cd canopen catkin make 下载n
  • ROS学习初始化ws下catkin_make必须有src生成devel和build

    安装虚拟机开启intel vt 创建工作空间 first ws src catkin make在ws下生成devel和build 创建package 在src下添加package catkin create pkg hello ros ro
  • Pyhon : 爬虫Requests高级用法--证书

    客户端证书 你也可以指定一个本地证书用作客户端证书 xff0c 可以是单个文件 xff08 包含密钥和证书 xff09 或一个包含两个文件路径的元组 xff1a requests get https kennethreitz org cer
  • 【px4】运行mavsdk中的offboard example

    运行MAVSDK中的offboard例子时无人机不执行 想控制无人机前后左右移动 xff0c 在按照官方教程实现offboard 插件的时候 发现用action插件能正常起飞和降落 但是一旦执行到offboard的插件代码的时候就会自动降落
  • MDF does not reside in a read-only database or filegroup

    错误信息 The file 34 MDF 34 is compressed but does not reside in a read only database or filegroup The file must be decompre
  • Python复习笔记4——文件和目录操作

    一 文件读写 1 1 读文件 xff08 1 xff09 打开文件 使用Python内置的open 函数 xff0c 传入文件名和标示符 xff0c 打开一个文件对象 xff1a span class token operator gt g
  • Python复习笔记5——常用模块

    一 内建模块 1 1 datetime日期时间 xff08 1 xff09 导入模块 span class token keyword from span datetime span class token keyword import s
  • COLMAP+OpenMVS实现物体三维重建mesh模型

    一 环境准备 1 COLMAP 进入COLMAP官网 xff0c 打开下载页面 xff0c 下载COLMAP程序 2 OpenMVS OpenMVS可以自己从源码下载进行编译 如果觉得编译openmvs可能要费点时间 xff0c 那也可以直
  • 解决ubuntu火狐无法上网问题

    之前安装Ubuntu时是可以上网的 xff0c 呆了一个月没怎么用突然不能搜索了 xff0c 记录一下 xff0c 已解决 只需一条命令 打开终端 xff0c 输入 sudo apt get install firefox 问题解决啦 xf
  • C语言基本数据类型int, short int, long int, long long int, unsigned int, signed int等解析

    一 普通int类型 int类型是有符号整型 xff0c 即int类型的值必须是整数 xff0c 可以是正整数 xff0c 负整数 xff0c 零 int类型取值范围因计算机系统而异 早起的16位IBM PC兼容机使用16位来存储一个int值
  • Docker容器内更新apt-get 国内加速

    Docker容器内更新源apt get的方法 由于不使用国内镜像网速缓慢 xff0c 所以使用国内镜像加速就很必要了 xff0c 但是经过博主测试大部分apt get加速都是针对Ubuntu 的 xff0c 根本解决不了Docker 容器内
  • STM32F4 422串口通信

    STM32F429 422串口通信 422串口的硬件原理图如下 xff1a 422串口和232串口不同的是引脚的电平控制 xff0c 还有DE是发送使能 xff0c 置高即可 xff1a RE是接收使能 xff0c 置低即可 422接出来的
  • Java基础学习记录

    一 基础DOS操作 dir xff1a directory 列出当前目录内容 md xff1a make directory 创建目录 rd xff1a remove directory 删除目录 cd xff1a change direc
  • 6、杂项:rtk原理简要说明

    目录 x1f345 点击这里查看所有博文 随着自己工作的进行 xff0c 接触到的技术栈也越来越多 给我一个很直观的感受就是 xff0c 某一项技术 经验在刚开始接触的时候都记得很清楚 往往过了几个月都会忘记的差不多了 xff0c 只有经常
  • 树莓派控制直流电机

    古月金真 1 直流电机 直流电机是一种将直流电能转换为机械能的装置 xff0c 被广泛的用于驱动各种设备 xff0c 如电风扇 遥控小车 电动车窗等 xff0c 在控制设备运转领域中 xff0c 它是不可或缺的一种设备 小型直流电机的的电压