Raspberry Pi Java Pi4j gpio 对我不起作用,但可以与 python 一起使用
Raspberry Pi Java Pi4j gpio isn't working for me, works with python though
我是一名老 java 程序员,将代码从桌面翻译到 Raspberry Pi,目的是将软件嵌入到硬件接口中。
我连接了一个 16*2 字符 LCD 显示器,它使用 Python 代码,但是当我使用 pi4j 库时通过Java访问GPIO,屏幕是空白的。
我是否遗漏了一些二进制 on/off 开关?
我是 运行 pi4j 1.2,在 A+ Pi 上,克服了影响 Pi 接线的 1.1 处理器错误.
感谢阅读,如有任何建议,我们将不胜感激。
import com.pi4j.component.lcd.LCDTextAlignment;
import com.pi4j.component.lcd.impl.GpioLcdDisplay;
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.RaspiPin;
import com.pi4j.system.NetworkInfo;
public class LCD {
public static void main(String args[]) {
System.out.println("SYSTEM PRINT TEST");
GpioController gpio = GpioFactory.getInstance();
GpioLcdDisplay lcd = new GpioLcdDisplay(2,16,
RaspiPin.GPIO_26,
RaspiPin.GPIO_31,
RaspiPin.GPIO_15,
RaspiPin.GPIO_16,
RaspiPin.GPIO_01,
RaspiPin.GPIO_04);
lcd.clear();
Thread.sleep(1000);
lcd.write(0, "LINE 1 TEST");
lcd.write(1, "LINE 2 TEST");
Thread.sleep(2000);
gpio.shutdown();
}
}
这个行话代码上的引脚编号与原始底层 wiringPi 编号之间的差异是造成这种挫败感的原因。这里是修改后的代码,其中gpio 25对应的是wiringPi 6,不是26!记得更新 wiringPi 和 pi4j 到最新版本。
import com.pi4j.wiringpi.Gpio;
import com.pi4j.wiringpi.Lcd;
public class LCD {
public final static int LCD_ROWS = 2;
public final static int LCD_COLUMNS = 16;
public final static int LCD_BITS = 4;
public static void main(String args[]) {
System.out.println("SYSTEM PRINT TEST");
if (Gpio.wiringPiSetup() == -1) {
System.out.println("GPIO SETUP ERROR");
return;
}
int lcdHandle= Lcd.lcdInit(LCD_ROWS,
LCD_COLUMNS,
LCD_BITS,
6,
5,
15,
16,
1,
4,
0,
0,
0,
0);
if (lcdHandle == -1) {
System.out.println("LCD INIT ERROR");
return;
}
Lcd.lcdDisplay(lcdHandle,1);
Lcd.lcdClear(lcdHandle);
Lcd.lcdPuts (lcdHandle, "LCD TEST LINE 1") ;
Lcd.lcdPosition (lcdHandle, 0, 1) ;
Lcd.lcdPuts (lcdHandle, "LCD TEST LINE 2") ;
try {
Thread.sleep(10000);
} catch (Exception e) {}
Lcd.lcdDisplay(lcdHandle,0);
}
}
在用头撞桌子几个小时后,我决定进行此 Google 搜索
google.com >> raspberry pi java gpio not working python works
这让我想到了这个问题,由于某种原因它被否决了 3 次,但这正是我所经历的。
我搜索的第二个结果是这个问题:
这让我明白我需要添加这行代码,因为 pi4j 默认使用不同的 PIN 布局。
GpioFactory.setDefaultProvider(new RaspiGpioProvider(RaspiPinNumberingScheme.BROADCOM_PIN_NUMBERING));
这还不够,但这个问题让我想到了这个 question/answer:
Raspberry pi 4 controle GPIO with java
这说明我需要将我的 gpio 二进制文件更新到 v2.52
此示例 Python 代码运行正常:
https://maker.pro/raspberry-pi/projects/controlling-a-dc-motor-with-raspberry-pi4-1
import RPi.GPIO as GPIO
from time import sleep
# Pins for Motor Driver Inputs
Motor1A = 20
Motor1B = 16
Motor1E = 21
def setup():
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM) # GPIO Numbering
GPIO.setup(Motor1A,GPIO.OUT) # All pins as Outputs
GPIO.setup(Motor1B,GPIO.OUT)
GPIO.setup(Motor1E,GPIO.OUT)
def loop():
# Going forwards
GPIO.output(Motor1A,GPIO.HIGH)
GPIO.output(Motor1B,GPIO.LOW)
GPIO.output(Motor1E,GPIO.HIGH)
print("Going forwards")
sleep(5)
# Going backwards
GPIO.output(Motor1A,GPIO.LOW)
GPIO.output(Motor1B,GPIO.HIGH)
GPIO.output(Motor1E,GPIO.HIGH)
print("Going backwards")
sleep(5)
# Stop
GPIO.output(Motor1E,GPIO.LOW)
GPIO.output(Motor1B,GPIO.LOW)
print("Stop")
def destroy():
GPIO.cleanup()
if __name__ == '__main__': # Program start from here
setup()
try:
loop()
except KeyboardInterrupt:
destroy()
但是我使用 Pi4J Java 库的尝试惨遭失败。
这是我的工作 Java 代码:
//This line was initially not here, it is part of the solution
GpioFactory.setDefaultProvider(new RaspiGpioProvider(RaspiPinNumberingScheme.BROADCOM_PIN_NUMBERING));
gpio = GpioFactory.getInstance();
in2 = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_16, "IN2", PinState.LOW);
in1 = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_20, "IN1", PinState.LOW);
en = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_21, "EN", PinState.LOW);
//Going forwards
in1.high();
in2.low();
en.high();
Thread.sleep(5000);
//Going backwards
in1.low();
in2.high();
en.high();
Thread.sleep(5000);
// stop
en.low();
in2.low();
gpio.shutdown();
我是一名老 java 程序员,将代码从桌面翻译到 Raspberry Pi,目的是将软件嵌入到硬件接口中。
我连接了一个 16*2 字符 LCD 显示器,它使用 Python 代码,但是当我使用 pi4j 库时通过Java访问GPIO,屏幕是空白的。
我是否遗漏了一些二进制 on/off 开关?
我是 运行 pi4j 1.2,在 A+ Pi 上,克服了影响 Pi 接线的 1.1 处理器错误.
感谢阅读,如有任何建议,我们将不胜感激。
import com.pi4j.component.lcd.LCDTextAlignment;
import com.pi4j.component.lcd.impl.GpioLcdDisplay;
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.RaspiPin;
import com.pi4j.system.NetworkInfo;
public class LCD {
public static void main(String args[]) {
System.out.println("SYSTEM PRINT TEST");
GpioController gpio = GpioFactory.getInstance();
GpioLcdDisplay lcd = new GpioLcdDisplay(2,16,
RaspiPin.GPIO_26,
RaspiPin.GPIO_31,
RaspiPin.GPIO_15,
RaspiPin.GPIO_16,
RaspiPin.GPIO_01,
RaspiPin.GPIO_04);
lcd.clear();
Thread.sleep(1000);
lcd.write(0, "LINE 1 TEST");
lcd.write(1, "LINE 2 TEST");
Thread.sleep(2000);
gpio.shutdown();
}
}
这个行话代码上的引脚编号与原始底层 wiringPi 编号之间的差异是造成这种挫败感的原因。这里是修改后的代码,其中gpio 25对应的是wiringPi 6,不是26!记得更新 wiringPi 和 pi4j 到最新版本。
import com.pi4j.wiringpi.Gpio;
import com.pi4j.wiringpi.Lcd;
public class LCD {
public final static int LCD_ROWS = 2;
public final static int LCD_COLUMNS = 16;
public final static int LCD_BITS = 4;
public static void main(String args[]) {
System.out.println("SYSTEM PRINT TEST");
if (Gpio.wiringPiSetup() == -1) {
System.out.println("GPIO SETUP ERROR");
return;
}
int lcdHandle= Lcd.lcdInit(LCD_ROWS,
LCD_COLUMNS,
LCD_BITS,
6,
5,
15,
16,
1,
4,
0,
0,
0,
0);
if (lcdHandle == -1) {
System.out.println("LCD INIT ERROR");
return;
}
Lcd.lcdDisplay(lcdHandle,1);
Lcd.lcdClear(lcdHandle);
Lcd.lcdPuts (lcdHandle, "LCD TEST LINE 1") ;
Lcd.lcdPosition (lcdHandle, 0, 1) ;
Lcd.lcdPuts (lcdHandle, "LCD TEST LINE 2") ;
try {
Thread.sleep(10000);
} catch (Exception e) {}
Lcd.lcdDisplay(lcdHandle,0);
}
}
在用头撞桌子几个小时后,我决定进行此 Google 搜索
google.com >> raspberry pi java gpio not working python works
这让我想到了这个问题,由于某种原因它被否决了 3 次,但这正是我所经历的。
我搜索的第二个结果是这个问题:
这让我明白我需要添加这行代码,因为 pi4j 默认使用不同的 PIN 布局。
GpioFactory.setDefaultProvider(new RaspiGpioProvider(RaspiPinNumberingScheme.BROADCOM_PIN_NUMBERING));
这还不够,但这个问题让我想到了这个 question/answer:
Raspberry pi 4 controle GPIO with java
这说明我需要将我的 gpio 二进制文件更新到 v2.52
此示例 Python 代码运行正常:
https://maker.pro/raspberry-pi/projects/controlling-a-dc-motor-with-raspberry-pi4-1
import RPi.GPIO as GPIO
from time import sleep
# Pins for Motor Driver Inputs
Motor1A = 20
Motor1B = 16
Motor1E = 21
def setup():
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM) # GPIO Numbering
GPIO.setup(Motor1A,GPIO.OUT) # All pins as Outputs
GPIO.setup(Motor1B,GPIO.OUT)
GPIO.setup(Motor1E,GPIO.OUT)
def loop():
# Going forwards
GPIO.output(Motor1A,GPIO.HIGH)
GPIO.output(Motor1B,GPIO.LOW)
GPIO.output(Motor1E,GPIO.HIGH)
print("Going forwards")
sleep(5)
# Going backwards
GPIO.output(Motor1A,GPIO.LOW)
GPIO.output(Motor1B,GPIO.HIGH)
GPIO.output(Motor1E,GPIO.HIGH)
print("Going backwards")
sleep(5)
# Stop
GPIO.output(Motor1E,GPIO.LOW)
GPIO.output(Motor1B,GPIO.LOW)
print("Stop")
def destroy():
GPIO.cleanup()
if __name__ == '__main__': # Program start from here
setup()
try:
loop()
except KeyboardInterrupt:
destroy()
但是我使用 Pi4J Java 库的尝试惨遭失败。
这是我的工作 Java 代码:
//This line was initially not here, it is part of the solution
GpioFactory.setDefaultProvider(new RaspiGpioProvider(RaspiPinNumberingScheme.BROADCOM_PIN_NUMBERING));
gpio = GpioFactory.getInstance();
in2 = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_16, "IN2", PinState.LOW);
in1 = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_20, "IN1", PinState.LOW);
en = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_21, "EN", PinState.LOW);
//Going forwards
in1.high();
in2.low();
en.high();
Thread.sleep(5000);
//Going backwards
in1.low();
in2.high();
en.high();
Thread.sleep(5000);
// stop
en.low();
in2.low();
gpio.shutdown();