【树莓派】在树莓派使用Python控制L9110电机转动的详细教程

发布时间:2024年01月07日

引言

??树莓派是一款小巧、低成本且功能强大的单板计算机,它的广泛应用使得它成为了物联网和嵌入式系统开发的理想选择。在这篇博客中,我将向大家介绍如何使用树莓派和Python来控制L9110电机。L9110电机控制器是一种常用的电机驱动模块,它可以实现电机的正转、反转和停止。

准备工作

??在开始之前,我们需要准备以下材料:

  • 树莓派(任意型号)
  • L9110电机
  • 杜邦线
  • 电机

L9110电机知识储备

特点

  • 低静态工作电流;
  • 宽电源电压范围:2.5V-12V;
  • 每通道具有800mA连续电流输出能力,具有较低的饱和压降;
  • TTL/CMOS输出电平兼容,可直接连CPU;输出内置钳位二极管,适用于感性负载;控制和驱动集成于单片IC之中;
  • 具备管脚高压保护功能;
  • 工作温度:0℃-80℃;

电机的工作方式

  • IA输入高电平,IB输入低电平,【OA1 OB1】电机正转;
  • IA输入低电平,IB1输入高电平,【OA1 OB1】电机反转;
    (实际上,当我们接上电源后,电机即可转动,不过电流可能不太稳定)

实现

  • 树莓派与电机的连接方式;
树莓派L9110电机
VCCVCC
GNDGND
GPIO12IA
GPIO16IB
  • 使用import引入GPIO库函数,用于控制GPIO的高低电平
import RPi.GPIO as GPIO
  • 此处使用Python类的思想来编写代码,也就是说.py文件中的模式应该如下:
class name:
	def __init__(self):
		……
	def function1(self):
		……
	def function2(self):
		……
  • 在电机类Motor中,初始化时需要设置电机控制引脚的编码格式与引脚编号,如果一开始不想让电机转动还可以将电机引脚IA IB都设置成低电平(待机模式)
 def __init__(self, gpioPinIa: int, gpioPinIb: int):
        """
        电机构造函数
        :param gpioPinIa: 设置L9110芯片IA引脚
        :param gpioPinIb: 设置L9110芯片IB引脚
        :return:
        """
        self._gpioPinIa = gpioPinIa
        self._gpioPinIb = gpioPinIb

        # 设置编码方式
        GPIO.setmode(GPIO.BOARD)
        # 设置GPIO引脚
        GPIO.setup(self._gpioPinIa, GPIO.OUT)
        GPIO.setup(self._gpioPinIb, GPIO.OUT)

        # 将电机设置成待机模式
        self.setStand()

  • 为了提升代码的复用性,这里特意预设一个方法用于设置GPIO引脚的状态,后续直接传递参数即可设置GPIO引脚状态;
    def _setGPIO(self, pinIaMod, pinIbMod):
        """
        设置GPIO引脚电压
        :param pinIaMod:
        :param pinIbMod:
        :return:
        """
        GPIO.output(self._gpioPinIa, pinIaMod)
        GPIO.output(self._gpioPinIb, pinIbMod)
  • 将电机设置成待机状态;
    def setStand(self):
        """
        设置电机为待机模式
        :return:
        """
        # 设置GPIO低电平,实现电机待机
        self._setGPIO(GPIO.LOW, GPIO.LOW)
  • 将电机设置成正转模式
    def setForeward(self):
        """
        将电机设置成正转模式
        :return:
        """
        # 设置GPIO高低电平,实现电机正转
        self._setGPIO(GPIO.HIGH, GPIO.LOW)
  • 将电机设置成反转模式
    def setReversal(self):
        """
        将电机设置成反转模式
        :return:
        """
        # 设置GPIO低高电平,实现电机反转
        self._setGPIO(GPIO.LOW, GPIO.HIGH)
  • 将电机设置成停止状态
    def stop(self):
        """
        电机停止工作
        :return:
        """
        # 设置GPIO高电平,实现电机停止工作
        self._setGPIO(GPIO.HIGH, GPIO.HIGH)
  • 还需要注意:每次使用完成GPIO引脚后需要释放GPIO引脚,否则:每次代码运行时否会给出警告说引脚应该被设置过,其次据说还会对树莓派造成损伤;
    @staticmethod
    def close():
        """
        释放所有已经使用过的GPIO
        :return:
        """
        GPIO.cleanup()
  • 现在可以使用Motor类来控制电机了。下面是一个简单的示例代码,演示如何使用Motor类来控制电机的正转、反转和停止:
import time
from Motor import Motor

def testMotor():
    # 设置电机引脚 并且实例化
    gpioPinIa, gpioPinIb = 12, 16

    motor = Motor(gpioPinIa, gpioPinIb)

    # 测试
    for i in range(2):
        print(1)
        # 开始正转
        motor.setForeward()
        time.sleep(4)
        print(2)
        # 开始反转
        motor.setReversal()
        time.sleep(4)
        print(3)
        # 停止
        motor.stop()
        time.sleep(4)
    motor.close()

if __name__ == '__main__':
	testMotor()

??在这个示例中,引入time库是为了给予延时,如果不给予延时程序的效果就会是: 电机正转、反转、停止 这三个状态几乎同一时间完成,而我们人的肉眼根本无法捕获到三个状态的改变。
??在这个示例中,引入print函数式为了告诉程序员代码运行的进度,以便示例效果与示例代码匹配。

结论

??通过这篇博客,我们学习了如何使用树莓派和Python来控制L9110电机。我们编写了一个Motor类,可以方便地控制电机的正转、反转和停止。我们还提供了一个简单的示例代码,演示了如何使用Motor类来控制电机的运行。希望这篇博客能帮助你开始使用树莓派和Python来控制电机。



附:完整代码


class Motor(object):
    """
    电机操作的基类
    """

    def __init__(self, gpioPinIa: int, gpioPinIb: int):
        """
        电机构造函数
        :param gpioPinIa: 设置L9110芯片IA引脚
        :param gpioPinIb: 设置L9110芯片IB引脚
        :return:
        """
        self._gpioPinIa = gpioPinIa
        self._gpioPinIb = gpioPinIb

        # 设置编码方式
        GPIO.setmode(GPIO.BOARD)
        # 设置GPIO引脚
        GPIO.setup(self._gpioPinIa, GPIO.OUT)
        GPIO.setup(self._gpioPinIb, GPIO.OUT)

        # 将电机设置成待机模式
        self.setStand()

    def _setGPIO(self, pinIaMod, pinIbMod):
        """
        设置GPIO引脚电压
        :param pinIaMod:
        :param pinIbMod:
        :return:
        """
        GPIO.output(self._gpioPinIa, pinIaMod)
        GPIO.output(self._gpioPinIb, pinIbMod)

    def setStand(self):
        """
        设置电机为待机模式
        :return:
        """
        # 设置GPIO低电平,实现电机待机
        self._setGPIO(GPIO.LOW, GPIO.LOW)

    def setForeward(self):
        """
        将电机设置成正转模式
        :return:
        """
        # 设置GPIO高低电平,实现电机正转
        self._setGPIO(GPIO.HIGH, GPIO.LOW)

    def setReversal(self):
        """
        将电机设置成反转模式
        :return:
        """
        # 设置GPIO低高电平,实现电机反转
        self._setGPIO(GPIO.LOW, GPIO.HIGH)

    def stop(self):
        """
        电机停止工作
        :return:
        """
        # 设置GPIO高电平,实现电机停止工作
        self._setGPIO(GPIO.HIGH, GPIO.HIGH)

    @staticmethod
    def close():
        """
        释放所有已经使用过的GPIO
        :return:
        """
        GPIO.cleanup()
文章来源:https://blog.csdn.net/qq_53960242/article/details/131442555
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。