detect I2C chips
출처 : i2cdetect(8): detect I2C chips - Linux man page
/dev/i2c-0 /dev/i2c-1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: 70 -- -- -- -- -- -- --
PCA9685 제어
import java.io.IOException; import java.math.BigDecimal; import com.pi4j.gpio.extension.pca.PCA9685GpioProvider; import com.pi4j.gpio.extension.pca.PCA9685Pin; import com.pi4j.io.gpio.BPIM2PGpioProvider; import com.pi4j.io.gpio.GpioController; import com.pi4j.io.gpio.GpioFactory; import com.pi4j.io.gpio.GpioPinPwmOutput; import com.pi4j.io.gpio.Pin; import com.pi4j.io.i2c.I2CBus; import com.pi4j.io.i2c.I2CFactory; import com.pi4j.io.i2c.I2CFactory.UnsupportedBusNumberException; public class PCA9685Gpio { public static final int SERVO_DURATION_MIN = 650; public static final int SERVO_DURATION_NEUTRAL = 1500; public static final int SERVO_DURATION_MAX = 2100; private static PCA9685Gpio instance = null; private PCA9685GpioProvider gpioProvider = null; // sudo java -cp .:pi4j-core.jar:pi4j-gpio-extension.jar PCA9685Gpio private PCA9685Gpio() throws IOException, UnsupportedBusNumberException { GpioFactory.setDefaultProvider(new BPIM2PGpioProvider()); System.out.println("<--Pi4J--> PCA9685 PWM Example ... started."); // This would theoretically lead into a resolution of 5 microseconds per // step: // 4096 Steps (12 Bit) // T = 4096 * 0.000005s = 0.02048s // f = 1 / T = 48.828125 BigDecimal frequency = new BigDecimal("48.828"); // Correction factor: actualFreq / targetFreq // e.g. measured actual frequency is: 51.69 Hz // Calculate correction factor: 51.65 / 48.828 = 1.0578 // --> To measure actual frequency set frequency without correction // factor(or set to 1) BigDecimal frequencyCorrectionFactor = new BigDecimal("1.0578"); // Create custom PCA9685 GPIO provider I2CBus bus = I2CFactory.getInstance(I2CBus.BUS_0); gpioProvider = new PCA9685GpioProvider(bus, 0x40, frequency, frequencyCorrectionFactor); // Define outputs in use for this example GpioPinPwmOutput[] myOutputs = provisionPwmOutputs(gpioProvider); // Reset outputs gpioProvider.reset(); } public static PCA9685Gpio getInstance() throws IOException, UnsupportedBusNumberException { if (instance==null) instance = new PCA9685Gpio(); return instance; } public void setPwm(Pin pin, int duration) { gpioProvider.setPwm(pin, duration); } public void shutdown() { gpioProvider.shutdown(); } private static GpioPinPwmOutput[] provisionPwmOutputs(final PCA9685GpioProvider gpioProvider) { GpioController gpio = GpioFactory.getInstance(); GpioPinPwmOutput myOutputs[] = { gpio.provisionPwmOutputPin(gpioProvider, PCA9685Pin.PWM_00, "Pulse 00"), gpio.provisionPwmOutputPin(gpioProvider, PCA9685Pin.PWM_01, "Pulse 01"), gpio.provisionPwmOutputPin(gpioProvider, PCA9685Pin.PWM_02, "Pulse 02"), gpio.provisionPwmOutputPin(gpioProvider, PCA9685Pin.PWM_03, "Pulse 03"), gpio.provisionPwmOutputPin(gpioProvider, PCA9685Pin.PWM_04, "Pulse 04"), gpio.provisionPwmOutputPin(gpioProvider, PCA9685Pin.PWM_05, "Pulse 05"), gpio.provisionPwmOutputPin(gpioProvider, PCA9685Pin.PWM_06, "Pulse 06"), gpio.provisionPwmOutputPin(gpioProvider, PCA9685Pin.PWM_07, "Pulse 07"), gpio.provisionPwmOutputPin(gpioProvider, PCA9685Pin.PWM_08, "Pulse 08"), gpio.provisionPwmOutputPin(gpioProvider, PCA9685Pin.PWM_09, "Pulse 09"), gpio.provisionPwmOutputPin(gpioProvider, PCA9685Pin.PWM_10, "Always ON"), gpio.provisionPwmOutputPin(gpioProvider, PCA9685Pin.PWM_11, "Always OFF"), gpio.provisionPwmOutputPin(gpioProvider, PCA9685Pin.PWM_12, "Servo pulse MIN"), gpio.provisionPwmOutputPin(gpioProvider, PCA9685Pin.PWM_13, "Servo pulse NEUTRAL"), gpio.provisionPwmOutputPin(gpioProvider, PCA9685Pin.PWM_14, "Servo pulse MAX"), gpio.provisionPwmOutputPin(gpioProvider, PCA9685Pin.PWM_15, "not used") }; return myOutputs; } public static void main(String[] args) throws Exception { PCA9685Gpio test = PCA9685Gpio.getInstance(); test.setPwm(PCA9685Pin.PWM_01, SERVO_DURATION_NEUTRAL); Thread.sleep(200); for (int i=SERVO_DURATION_MIN; i<=SERVO_DURATION_MAX; i+=30) { test.setPwm(PCA9685Pin.PWM_00, i); Thread.sleep(200); } for (int i=SERVO_DURATION_MAX; i>=(int)(SERVO_DURATION_MIN+(SERVO_DURATION_MAX-SERVO_DURATION_MIN)/2); i-=30) { test.setPwm(PCA9685Pin.PWM_00, i); Thread.sleep(200); } for (int i=SERVO_DURATION_MIN; i<=SERVO_DURATION_MAX; i+=30) { test.setPwm(PCA9685Pin.PWM_01, i); Thread.sleep(200); } for (int i=SERVO_DURATION_MAX-200; i>=(int)(SERVO_DURATION_MIN+(SERVO_DURATION_MAX-SERVO_DURATION_MIN)/2); i-=30) { test.setPwm(PCA9685Pin.PWM_01, i); Thread.sleep(200); } test.shutdown(); } }
실행
platformId = raspberrypi / label = Raspberry Pi
platformId = bananapi / label = BananaPi
platformId = bananapro / label = BananaPro
platformId = odroid / label = Odroid
platformId = BPI_M2P / label = BPI_M2P
piboardRev: Hardware string: Hardware : sun8i
Hardware:Hardware : sun8i
piboardRev: 3
piboardId: Revision string: Revision : 0000
wiringPi: wiringPiSetup called
piboardRev: Hardware string: Hardware : sun8i
Hardware:Hardware : sun8i
piboardRev: 3
piboardRev: Hardware string: Hardware : sun8i
Hardware:Hardware : sun8i
piboardRev: 3
piboardId: Revision string: Revision : 0000
wiringPiSetup: wiringPiMode = 0
<--Pi4J--> PCA9685 PWM Example ... started.
실행 결과