树莓派遇上Java 03:马达篇

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

树莓派3B共40个针脚,其中8个Ground、4个VDC电源和23个GPIO,每个GPIO针脚都可以输出基本的高低电平信号,树莓派可以通过它们控制继电器实现所需功能。驱动马达,需要一块L298N马达驱动板和两个独立电源,其中一个电源为马达供电,另一个为树莓派单独供电。

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

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

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

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

L298N

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

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

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

写一个小程序测试马达转向与高低电平的组合,推荐在PC上使用Intellj IDEA导入Pi4J编写代码,然后复制到树莓派上编译运行,或者将编译好生成的Jar包传到树莓派上直接运行。Pi4J项目有很多示例程序,基本涵盖对GPIO的所有操作,可以参考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

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

pi4j -c Demo.java

运行:

pi4j Demo

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

arrow_upward