树莓派通过MCP3008芯片驱动控制摇杆
所需材料
- 树莓派
- MCP3008芯片
- 移动摇杆
模块以及针脚介绍
MCP3008
MCP3008是一个10位8通道的ADC(模拟数字转换器),它使用SPI总线协议,价格便宜,也不需要使用额外的组件。它对应针脚如下
连接图
树莓派、MCP3008、移动摇杆连接图
SPI接口
控制原理:SPI是串行外设接口,移动摇杆通过此方式进行通信,传输X、Y轴变动数据。
编写代码
首先导入所需依赖pi4j-core:1.4
、pi4j-gpio-extension:1.3
、slf4j-simple:1.7.32
,对应的测试代码如下,通过GpioPinListenerAnalog
监听针脚数值变化
import com.pi4j.gpio.extension.mcp.MCP3008GpioProvider;
import com.pi4j.gpio.extension.mcp.MCP3008Pin;
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinAnalogInput;
import com.pi4j.io.gpio.event.GpioPinAnalogValueChangeEvent;
import com.pi4j.io.gpio.event.GpioPinListenerAnalog;
import com.pi4j.io.spi.SpiChannel;
/**
* 〈MCP3008Test〉
*
* @author 丁乾文
* @date 2022/5/25 15:05
* @since 1.0.0
*/
public class MCP3008Test {
public static void main(String[] args) throws Exception {
final GpioController gpio = GpioFactory.getInstance();
final MCP3008GpioProvider provider = new MCP3008GpioProvider(SpiChannel.CS0);
final GpioPinAnalogInput[] inputs = {
gpio.provisionAnalogInputPin(provider, MCP3008Pin.CH0, "CH0"),
gpio.provisionAnalogInputPin(provider, MCP3008Pin.CH1, "CH1"),
};
// 以防止大量模拟输入更改事件传播并调度可能具有预期漂移范围的输入值。
provider.setEventThreshold(100, inputs);
// 设置监视器间隔 milliseconds
provider.setMonitorInterval(250);
GpioPinListenerAnalog listener = new GpioPinListenerAnalog() {
@Override
public void handleGpioPinAnalogValueChangeEvent(GpioPinAnalogValueChangeEvent event) {
System.out.println(" [" + event.getPin().getName() + "] : RAW VALUE = " + event.getValue());
}
};
gpio.addListener(listener, inputs);
Thread.sleep(10000);
gpio.shutdown();
System.out.println("Exit");
}
}
当摇动操作杆时输出:
[CH0] : RAW VALUE = 1023.0
[CH0] : RAW VALUE = 514.0
[CH0] : RAW VALUE = 54.0
[CH0] : RAW VALUE = 515.0
[CH1] : RAW VALUE = 226.0
[CH1] : RAW VALUE = 114.0
[CH0] : RAW VALUE = 726.0
[CH1] : RAW VALUE = 0.0
[CH0] : RAW VALUE = 515.0