树莓派遇上 Java 03:马达篇

本文时间久远,部分内容可能过时,仅供参考。

树莓派 3B 共 40 个针脚,其中 8 个 Ground、4 个 VDC 电源和 23 个 GPIO,使用输出高低电平信号的 GPIO 针脚即可控制大部分继电器实现所需功能。控制马达需要一块 L298N 马达驱动板和两个独立电源,其中一个电源为马达供电,另一个为树莓派单独供电。

关于供电问题,有三种方案:

  • 方案一:使用 5V 电源为树莓派供电,然后从它的 5V 电源针脚取电给 L298N 和马达供电,树莓派与 L298N 共地线。这种方法不可取,因为马达在启动瞬间会因为低电阻和不做功产生大电流,可能损坏树莓派。

  • 方案二:电源给 L298N 供电,然后从 L298N 的 5V 电压输出口取电接树莓派 5V 电源针脚,树莓派与 L298N 共地线。这种方法在简单情况下可用,如果树莓派驱动的设备增多则容易因电压不稳重启。我在给树莓派安装摄像头后发现,只要马达转动树莓派就会重启,后来用移动电源给树莓派单独供电才解决。

  • 方案三:使用独立电源分别为树莓派和 L298N 供电。这是最稳妥的方法,并且以后增加舵机等设备可直接从 L298N 的 5V 电压输出口接电而不用担心影响树莓派。

L298N

在上面的 L298N 驱动板中,1、2 和 3、4 分别接两个马达的正负极,它们是 L298N 的电流输出口。树莓派的任意 4 个 GPIO 针脚接在 in1、in2、in3、in4 上,可以通过改变 4 个针脚的高低电平控制两侧马达的转动,建议实际写一个测试程序尝试不同电平组合导致的马达转向变化,比枯燥说明直观清晰。

5、6 是 L298N 的电源接入口,5 接电源正极,6 接电源负极(当心不要接反)。L298N 内置变压模块,当输入电压大于 5V 时,7 可作为正极稳定输出 5V 电压,能和作为负极的 6 一起为其它设备供电。至于 in1、in2、in3、in4 两边用跳线帽连接的使能端,可用作电机调速,我没有用到,暂时忽略。

接线时注意 L298N 要与树莓派共地线,即 6 要与树莓派某个 Ground 针脚相连,这样输出的电平信号才能构成回路。

写一个小程序测试马达转向与高低电平的组合,推荐在 PC 上使用 Intellj IDEA 导入 Pi4J 编写代码生成 JAR 包再传输给树莓派运行。Pi4J 项目的示例程序已经基本涵盖对 GPIO 的常用操作,可参考控制电平的示例

这里提供一个控制 GPIO 电平的简单 Demo:

import com.pi4j.io.gpio.*;

/**
 * Created by apqx on 2016/9/11.
 */
public class Demo {

    public static void main(String[] args) throws Exception {
        GpioController gpio = GpioFactory.getInstance();
        // L298N in1
        GpioPinDigitalOutput RIGHT_1 = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_00,
            "right_1", PinState.LOW);
        // L298N in2
        GpioPinDigitalOutput RIGHT_2 = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_02,
            "right_2", PinState.LOW);
        // L298N in4
        GpioPinDigitalOutput LEFT_1 = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_04,
            "left_1", PinState.LOW);
        // L298N in3
        GpioPinDigitalOutput LEFT_2 = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_03,
            "left_2", PinState.LOW);
        
        // 设置 in1 为高电平,in2 为低电平
        RIGHT_1.high();
        RIGHT_2.low();
        // 延时 2 秒钟
        Thread.sleep(2000);
        // 设置 in1 为低电平,in2 为低电平
        RIGHT_1.low();
        RIGHT_2.low();
        // 设置 in3 为高电平,in4 为低电平
        LEFT_2.high();
        LEFT_1.low();
        // 延时 2 秒钟
        Thread.sleep(2000);
        // 设置 in3 为低电平,in4 为低电平
        LEFT_2.low();
        LEFT_1.low();
        // 关闭输出
        gpio.shutdown();
    }

}

注意代码中RaspiPin.GPIO_**对应的是图中两侧的黑体数字,而不是中间的针脚号。

树莓派 RaspberryPi j8header

在树莓派上新建一个文件:

vim Demo.java

将以上代码复制到文件中,编译:

pi4j -c Demo.java

运行:

pi4j Demo

会看到两个马达依次转动。

arrow_upward