树莓派遇上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
驱动板中,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
的所有操作,可以参考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_**
对应的是图中两侧的黑体数字,而不是中间的针脚号。
在树莓派
上新建一个文件:
vim Demo.java
将以上代码复制到Demo.java
文件中,编译:
pi4j -c Demo.java
运行:
pi4j Demo
会看到两个马达
依次转动。