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

本文介绍了如何使用树莓派和Python编程语言控制L9110电机,包括电机的特点、工作方式以及如何通过GPIO接口进行正转、反转和停止操作,提供了一个完整的Motor类代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引言

  树莓派是一款小巧、低成本且功能强大的单板计算机,它的广泛应用使得它成为了物联网和嵌入式系统开发的理想选择。在这篇博客中,我将向大家介绍如何使用树莓派和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()
### L9110S 电机驱动与树莓派连接及编程 #### 连接方式 对于L9110S电机驱动模块,其接口设计较为简单。该模块具有两个输入端(IN1, IN2 和 IN3, IN4),用于接收PWM信号来控制两路直流电机的方向和速度;以及电源负极接入点VCC/GND。当利用树莓派作为控制器时,需通过GPIO引脚向这些输入端发送指令[^1]。 为了安全可靠地建立电气连接: - 将L9110S的GND连接到Raspberry Pi的地线; - VCC应接到适合的工作电压源上,通常为5V或外部电池供电; - 输入端口(IN1-IN4)则对应链接至RPi GPIO针脚,以便执行程序逻辑操作。 #### Python编程实例 下面提供一段基于Python的基础代码片段,展示如何设置并运行一个简单的测试循环,使连接于L9110S上的小型DC马达能够按照指定方向旋转一定时间后再停止。 ```python import RPi.GPIO as GPIO from time import sleep # 设置使用的BCM编号模式 GPIO.setmode(GPIO.BCM) # 定义各管脚对应的BCM号码 in1 = 17 in2 = 18 in3 = 27 in4 = 22 # 初始化GPIO状态 for pin in (in1,in2,in3,in4): GPIO.setup(pin, GPIO.OUT) def forward(): """让左侧轮子向前转动""" GPIO.output(in1, True) GPIO.output(in2, False) def backward(): """让右侧轮子向后退行""" GPIO.output(in3, False) GPIO.output(in4, True) try: while True: print("前进...") forward() sleep(2) print("停止&反转...") backward() sleep(2) finally: # 清理资源释放 GPIO.cleanup() ``` 此段代码实现了基本的功能演示——即交替改变电机运转方向,并保持每种状态下持续运作约两秒钟的时间间隔。值得注意的是,在实际应用中可能还需要考虑更多因素如异常处理机制、精确的速度调节等特性[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值