介绍
由于树莓派GPIO输出的电压太小,不足以推动电机转动,这是就需要一个驱动板来实现用GPIO对电机的操控。
L298N安装以及注意事项
安装示意图如上(上图没有标记控制端口的位置,根据情况自行确定),注意ENA,ENB位置的GPIO接口需要PWM输出。
注意事项
- L298N的12V接线是输入,5V是输出,5V的输出不建议作为树莓派的供电,至少在我用的时候,树莓派经常因为电压不稳重启 。
- 一定要把L298N的地线和树莓派GPIO的地线相连,不然不能驱动电机转动。
- 使能A和使能B的跳线帽如果不使用PWM控制的话,那就不需要拔掉,如果拔掉的话还没有输入PWM的话,会因为使能为0导致电机不转。
L298N操控
真值表如下
如图为L298N控制电机的真值表,根据真值表,写出代码如下
import java.util.Scanner;
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinDigitalOutput;
import com.pi4j.io.gpio.PinState;
import com.pi4j.io.gpio.RaspiPin;
public class Main {
static int flag=0;
static GpioController gpio=null;
static GpioPinDigitalOutput GPIO_01=null;
static GpioPinDigitalOutput GPIO_02=null;
static GpioPinDigitalOutput GPIO_03=null;
static GpioPinDigitalOutput GPIO_04=null;
static GpioPinDigitalOutput GPIO_00=null;
static GpioPinDigitalOutput GPIO_23=null;
public static void now(int a) {
if(Main.flag==0){
gpio = GpioFactory.getInstance();
GPIO_01= gpio.provisionDigitalOutputPin(RaspiPin.GPIO_01, "ENA", PinState.HIGH);//如果跳线帽没有拔掉可以删除此行
GPIO_00 = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_00, "IN_1", PinState.LOW);
GPIO_02 = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_02, "IN_2", PinState.LOW);
GPIO_03 = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_03, "IN_3", PinState.LOW);
GPIO_04 = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_04, "IN_4", PinState.LOW);
GPIO_23 = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_23, "ENB", PinState.HIGH);//如果跳线帽没有拔掉可以删除此行
Main.flag=1;
}
switch(a) {
case 1:GPIO_03.setState(PinState.HIGH);GPIO_04.setState(PinState.LOW);break;
case 2:GPIO_03.setState(PinState.LOW);GPIO_04.setState(PinState.HIGH);break;
case 3:GPIO_00.setState(PinState.HIGH);GPIO_02.setState(PinState.LOW);break;
case 4:GPIO_00.setState(PinState.LOW);GPIO_02.setState(PinState.HIGH);break;
case 5:GPIO_00.setState(PinState.LOW);GPIO_02.setState(PinState.LOW);GPIO_03.setState(PinState.LOW);GPIO_04.setState(PinState.LOW);break;
}
}
public static void main(String[] args) {
System.out.println("begin");
Scanner input=new Scanner(System.in);
while(true) {
int a=input.nextInt();
Main.now(a);
}
}
}
PWM操控L298N
如果想用操控马达转速,只需要将使能A B接口接入GPIO,再把输出调整成PWM就可以了。
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinDigitalOutput;
import com.pi4j.io.gpio.GpioPinPwmOutput;
import com.pi4j.io.gpio.PinState;
import com.pi4j.io.gpio.RaspiPin;
import com.pi4j.wiringpi.Gpio;
import com.pi4j.wiringpi.SoftPwm;
import java.util.Scanner;
public class Main {
static int flag=0;
static GpioController gpio=null;
static GpioPinDigitalOutput GPIO_02=null;
static GpioPinDigitalOutput GPIO_03=null;
static GpioPinDigitalOutput GPIO_04=null;
static GpioPinDigitalOutput GPIO_00=null;
static GpioPinPwmOutput GPIO_01=null;//ENA
static GpioPinPwmOutput GPIO_23=null;//ENB
public static void now(int a) {
if(Main.flag==0){
gpio = GpioFactory.getInstance();
Gpio.wiringPiSetup();
SoftPwm.softPwmCreate(1, 50,100);//引脚位置,引脚设定初始值,引脚最大值
SoftPwm.softPwmCreate(23,50,100);//引脚位置,引脚设定初始值,引脚最大值
GPIO_00 = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_00, "IN_1", PinState.LOW);
GPIO_02 = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_02, "IN_2", PinState.LOW);
GPIO_03 = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_03, "IN_3", PinState.LOW);
GPIO_04 = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_04, "IN_4", PinState.LOW);
flag=1;
}
switch(a) {
case 1:GPIO_03.setState(PinState.HIGH);GPIO_04.setState(PinState.LOW);break;
case 2:GPIO_03.setState(PinState.LOW);GPIO_04.setState(PinState.HIGH);break;
case 3:GPIO_00.setState(PinState.HIGH);GPIO_02.setState(PinState.LOW);break;
case 4:GPIO_00.setState(PinState.LOW);GPIO_02.setState(PinState.HIGH);break;
case 5:SoftPwm.softPwmWrite(1, 30);SoftPwm.softPwmWrite(23, 30);break;//把使能A B设定为30%
case 6:SoftPwm.softPwmWrite(1, 60);SoftPwm.softPwmWrite(23, 60);break;//把使能A B设定为60%
case 7:SoftPwm.softPwmWrite(1, 90);SoftPwm.softPwmWrite(23, 90);break;//把使能A B设定为90%
case 8:GPIO_00.setState(PinState.LOW);GPIO_02.setState(PinState.LOW);GPIO_03.setState(PinState.LOW);GPIO_04.setState(PinState.LOW);break;//关闭所有接口
}
}
public static void main(String[] args) {
System.out.println("begin");
Scanner input=new Scanner(System.in);
while(true) {
int a=input.nextInt();
Main.now(a);
}
}
}