带有 Pi4j 的树莓派 Pi4 Java
Raspberry Pi4 with Pi4j Java
我正在尝试 运行 使用 pi4j java 库 v1.2 在我的 Raspberry Pi4 上进行简单测试。不知何故,它什么也没做。我也没有在控制台上看到任何错误。它只是在 2 秒后完成。
我希望 LED 灯在 2 秒后打开和关闭。
我也按照这个 将我的 gpio 二进制文件更新到 v2.52,但它仍然是一样的。此外,命令 gpio write 19 1
没有执行任何操作。
GPIO
pi@gtpi:~ $ gpio -v
gpio version: 2.52
Copyright (c) 2012-2018 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty
Raspberry Pi Details:
Type: Pi 4B, Revision: 02, Memory: 4096MB, Maker: Sony
* Device tree is enabled.
*--> Raspberry Pi 4 Model B Rev 1.2
* This Raspberry Pi supports user-level GPIO access.
pi@gtpi:~ $ gpio write 19 1 ///---> this also doesn't do anything
Java 应用程序:使用 com.pi4j:pi4j-core:1.2
import com.pi4j.io.gpio.*;
public class Pi4 {
public static void main(String[] a) throws Exception {
GpioPinDigitalOutput op = GpioFactory.getInstance().provisionDigitalOutputPin(RaspiPin.GPIO_19);
op.high();
Thread.sleep(2000);
op.low();
}
}
但是,我编写的用于执行相同操作的 python 脚本正在运行:
from gpiozero import LED
from time import sleep
red = LED(19)
red.on()
sleep(2)
red.off()
问题:我还需要做什么才能使 Java 应用正常工作(打开 LED)?完全不兼容Pi4吗?
它的答案似乎在这里:
- https://raspberrypi.stackexchange.com/questions/113511
- https://raspberrypi.stackexchange.com/questions/111679
看起来 Pi4j 使用了不同的管脚编号方案。 “在幕后”,WiringPi 用于控制 GPIO。
所以,我需要告诉它使用 Broadcom 引脚编号方案:
GpioFactory.setDefaultProvider(new RaspiGpioProvider(RaspiPinNumberingScheme.BROADCOM_PIN_NUMBERING));
现在开始工作了:
import com.pi4j.io.gpio.*;
public class Pi4 {
public static void main(String[] a) throws Exception {
GpioFactory.setDefaultProvider(new RaspiGpioProvider(RaspiPinNumberingScheme.BROADCOM_PIN_NUMBERING));
GpioPinDigitalOutput op = GpioFactory.getInstance().provisionDigitalOutputPin(RaspiPin.GPIO_19);
op.high();
Thread.sleep(2000);
op.low();
}
}
确实Pi4J默认使用WiringPi编号方案。
这是一个很好的概述,其中物理引脚号 (1-40)、BMC 和 WiringPi (WPI) 彼此相邻。
这在我的书“Getting Started with Java on the Raspberry Pi”中有进一步描述。是的,我知道,这是不要脸self-promotion ;-)
我正在尝试 运行 使用 pi4j java 库 v1.2 在我的 Raspberry Pi4 上进行简单测试。不知何故,它什么也没做。我也没有在控制台上看到任何错误。它只是在 2 秒后完成。 我希望 LED 灯在 2 秒后打开和关闭。
我也按照这个 将我的 gpio 二进制文件更新到 v2.52,但它仍然是一样的。此外,命令 gpio write 19 1
没有执行任何操作。
GPIO
pi@gtpi:~ $ gpio -v
gpio version: 2.52
Copyright (c) 2012-2018 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty
Raspberry Pi Details:
Type: Pi 4B, Revision: 02, Memory: 4096MB, Maker: Sony
* Device tree is enabled.
*--> Raspberry Pi 4 Model B Rev 1.2
* This Raspberry Pi supports user-level GPIO access.
pi@gtpi:~ $ gpio write 19 1 ///---> this also doesn't do anything
Java 应用程序:使用 com.pi4j:pi4j-core:1.2
import com.pi4j.io.gpio.*;
public class Pi4 {
public static void main(String[] a) throws Exception {
GpioPinDigitalOutput op = GpioFactory.getInstance().provisionDigitalOutputPin(RaspiPin.GPIO_19);
op.high();
Thread.sleep(2000);
op.low();
}
}
但是,我编写的用于执行相同操作的 python 脚本正在运行:
from gpiozero import LED
from time import sleep
red = LED(19)
red.on()
sleep(2)
red.off()
问题:我还需要做什么才能使 Java 应用正常工作(打开 LED)?完全不兼容Pi4吗?
它的答案似乎在这里:
- https://raspberrypi.stackexchange.com/questions/113511
- https://raspberrypi.stackexchange.com/questions/111679
看起来 Pi4j 使用了不同的管脚编号方案。 “在幕后”,WiringPi 用于控制 GPIO。
所以,我需要告诉它使用 Broadcom 引脚编号方案:
GpioFactory.setDefaultProvider(new RaspiGpioProvider(RaspiPinNumberingScheme.BROADCOM_PIN_NUMBERING));
现在开始工作了:
import com.pi4j.io.gpio.*;
public class Pi4 {
public static void main(String[] a) throws Exception {
GpioFactory.setDefaultProvider(new RaspiGpioProvider(RaspiPinNumberingScheme.BROADCOM_PIN_NUMBERING));
GpioPinDigitalOutput op = GpioFactory.getInstance().provisionDigitalOutputPin(RaspiPin.GPIO_19);
op.high();
Thread.sleep(2000);
op.low();
}
}
确实Pi4J默认使用WiringPi编号方案。 这是一个很好的概述,其中物理引脚号 (1-40)、BMC 和 WiringPi (WPI) 彼此相邻。
这在我的书“Getting Started with Java on the Raspberry Pi”中有进一步描述。是的,我知道,这是不要脸self-promotion ;-)