티스토리 뷰
728x90
출처
- GPIO - Tinker Board Wiki
- Tinker Boardの基本的な使い方(その4・GPIOを使う) - The blog of H.Fujimoto
- GitHub - mattjlewis/diozero: Java Device I/O library designed to be portable across Single Board Computers. Tested with Raspberry Pi, Odroid C2, BeagleBone Black, Next Thing CHIP, Asus Tinker Board. Also known to work with Udoo Quad.
- Providers - diozero
- Install Oracle DIO : PibotGoldenImage – Team 2537 Wiki
- Tinker Boardの基本的な使い方(その4・GPIOを使う) - The blog of H.Fujimoto
- (추천) ラズパイ:ステアリングのためのサーボモータ制御(1) - 豆腐とコンソメ
- 몽상가 :: [Tinker Board S] GPIO이용#1 - 개발환경 및 Digital I/O(C/C++) 설명/RPI3 비교
- 몽상가 :: [Tinker Board S] GPIO이용#3 - i2c 설명 및 총평/RPI비교
- GitHub - smueller92/rpi-remote-camera-control: Raspberry PI Pan-Tilt-Camera Movement Control (Python/Javascript)
Tinker Board S : pi4j
Tinker Board의 pwm 제어 하는 예제는 python을 제외하고는 c언어나 java 예제를 찾을 수 없어서 wiringPi 라이브러리를 직접 컴파일 해보았지만 모터의 떨림도 심하고, 발열도 심해서 아직은 불안한것 같습니다. python의 pwm관련 소스를 wiringPi에 추가하고 다시 pi4j 라이브러리에 적용했습니다. pi4j라이브러리와 pi4j를 이용한 Servo.java 예제도 첨부했습니다.동영상을 보시면 알겠지만, 떨림도, 발열도 발생하지 않았습니다.
TinkerBoardPin.java
package com.pi4j.io.gpio; import java.util.EnumSet; public class TinkerBoardPin extends PinProvider { // GPIO0_C1 public static final Pin GPIO0_C1 = createDigitalPin(7, "GPIO0_C1"); // addGpioPinInfo(16+1, "GPIO0_C1", 7, PinInfo.DIGITAL_IN_OUT); // GPIO5B (GP5B0-GP5B7) public static final Pin GPIO5_B0 = createDigitalPin(16, "GPIO5_B0"); // addGpioPinInfo(160, "GPIO5_B0", 10, PinInfo.DIGITAL_IN_OUT); public static final Pin GPIO5_B1 = createDigitalPin(15, "GPIO5_B1"); // addGpioPinInfo(160+1, "GPIO5_B1", 8, PinInfo.DIGITAL_IN_OUT); public static final Pin GPIO5_B2 = createDigitalPin(4, "GPIO5_B2"); // addGpioPinInfo(160+2, "GPIO5_B2", 16, PinInfo.DIGITAL_IN_OUT); public static final Pin GPIO5_B3 = createDigitalPin(5, "GPIO5_B3"); // addGpioPinInfo(160+3, "GPIO5_B3", 18, PinInfo.DIGITAL_IN_OUT); public static final Pin GPIO5_B4 = createDigitalPin(0, "GPIO5_B4"); // addGpioPinInfo(160+4, "GPIO5_B4", 11, PinInfo.DIGITAL_IN_OUT); public static final Pin GPIO5_B5 = createDigitalPin(21, "GPIO5_B5"); // addGpioPinInfo(160+5, "GPIO5_B5", 29, PinInfo.DIGITAL_IN_OUT); public static final Pin GPIO5_B6 = createDigitalPin(2, "GPIO5_B6"); // addGpioPinInfo(160+6, "GPIO5_B6", 13, PinInfo.DIGITAL_IN_OUT); public static final Pin GPIO5_B7 = createDigitalPin(3, "GPIO5_B7"); // addGpioPinInfo(160+7, "GPIO5_B7", 15, PinInfo.DIGITAL_IN_OUT); // GPIO5C (GP5C0-GP5C3) // GPIO5C (GP5C0-GP5C3) public static final Pin GPIO5_C0 = createDigitalPin(22, "GPIO5_C0"); // addGpioPinInfo(168, "GPIO5_C0", 31, PinInfo.DIGITAL_IN_OUT); //public static final Pin GPIO5_C1 = createDigitalPin(168+1, "GPIO5_C1"); // addGpioPinInfo(168+1, "GPIO5_C1", -1, PinInfo.DIGITAL_IN_OUT); //public static final Pin GPIO5_C2 = createDigitalPin(168+2, "GPIO5_C2"); // addGpioPinInfo(168+2, "GPIO5_C2", -1, PinInfo.DIGITAL_IN_OUT); public static final Pin GPIO5_C3 = createDigitalPin(6, "GPIO5_C3"); // addGpioPinInfo(168+3, "GPIO5_C3", 22, PinInfo.DIGITAL_IN_OUT); // GPIO6A (GP6A0-GP6A1) public static final Pin GPIO6_A0 = createDigitalPin(1, "GPIO6_A0"); // addGpioPinInfo(184, "GPIO6_A0", 12, PinInfo.DIGITAL_IN_OUT); public static final Pin GPIO6_A1 = createDigitalPin(24, "GPIO6_A1"); // addGpioPinInfo(184+1, "GPIO6_A1", 35, PinInfo.DIGITAL_IN_OUT); // GPIO6A (GP6A3-GP6A4) public static final Pin GPIO6_A3 = createDigitalPin(28, "GPIO6_A3"); // addGpioPinInfo(184+3, "GPIO6_A3", 38, PinInfo.DIGITAL_IN_OUT); public static final Pin GPIO6_A4 = createDigitalPin(29, "GPIO6_A4"); // addGpioPinInfo(184+4, "GPIO6_A4", 40, PinInfo.DIGITAL_IN_OUT); // GPIO7A (GP7A7) public static final Pin GPIO7_A7 = createDigitalPin(27, "GPIO7_A7"); // addGpioPinInfo(216+7, "GPIO7_A7", 36, PinInfo.DIGITAL_IN_OUT); // GPIO7B (GP7B0-GP7B2) public static final Pin GPIO7_B0 = createDigitalPin(25, "GPIO7_B0"); // addGpioPinInfo(224, "GPIO7_B0", 37, PinInfo.DIGITAL_IN_OUT); //public static final Pin GPIO7_B1 = createDigitalPin(224+1, "GPIO7_B1"); // addGpioPinInfo(224+1, "GPIO7_B1", -1, PinInfo.DIGITAL_IN_OUT); //public static final Pin GPIO7_B2 = createDigitalPin(224+2, "GPIO7_B2"); // addGpioPinInfo(224+2, "GPIO7_B2", -1, PinInfo.DIGITAL_IN_OUT); // GPIO7CL (GP7C1-GP7C2) public static final Pin GPIO7_C1 = createDigitalPin(30, "GPIO7_C1"); // addGpioPinInfo(232+1, "GPIO7_C1", 27, PinInfo.DIGITAL_IN_OUT); public static final Pin GPIO7_C2 = createDigitalPin(31, "GPIO7_C2"); // addGpioPinInfo(232+2, "GPIO7_C2", 28, PinInfo.DIGITAL_IN_OUT); // GPIO7CH (GP7C6-GP7C7) public static final Pin GPIO7_C6 = createDigitalAndPwmPin(23, "GPIO7_C6"); // addPwmPinInfo(232+6, "GPIO7_C6", 33, 0, PinInfo.DIGITAL_IN_OUT_PWM); public static final Pin GPIO7_C7 = createDigitalAndPwmPin(26, "GPIO7_C7"); // addPwmPinInfo(232+7, "GPIO7_C7", 32, 1, PinInfo.DIGITAL_IN_OUT_PWM); // GPIO8A (GP8A3-GP8A7) public static final Pin GPIO8_A3 = createDigitalPin(11, "GPIO8_A3"); // addGpioPinInfo(248+3, "GPIO8_A3", 26, PinInfo.DIGITAL_IN_OUT); public static final Pin GPIO8_A4 = createDigitalPin(8, "GPIO8_A4"); // addGpioPinInfo(248+4, "GPIO8_A4", 3, PinInfo.DIGITAL_IN_OUT); public static final Pin GPIO8_A5 = createDigitalPin(9, "GPIO8_A5"); // addGpioPinInfo(248+5, "GPIO8_A5", 5, PinInfo.DIGITAL_IN_OUT); public static final Pin GPIO8_A6 = createDigitalPin(14, "GPIO8_A6"); // addGpioPinInfo(248+6, "GPIO8_A6", 23, PinInfo.DIGITAL_IN_OUT); public static final Pin GPIO8_A7 = createDigitalPin(10, "GPIO8_A7"); // addGpioPinInfo(248+7, "GPIO8_A7", 24, PinInfo.DIGITAL_IN_OUT); // GPIO8B (GP8B0-GP8B1) public static final Pin GPIO8_B0 = createDigitalPin(13, "GPIO8_B0"); // addGpioPinInfo(256, "GPIO8_B0", 21, PinInfo.DIGITAL_IN_OUT); public static final Pin GPIO8_B1 = createDigitalPin(12, "GPIO8_B1"); // addGpioPinInfo(256+1, "GPIO8_B1", 19, PinInfo.DIGITAL_IN_OUT); protected static Pin createDigitalPin(int address, String name) { return createDigitalPin(TinkerBoardGpioProvider.NAME, address, name); } protected static Pin createDigitalPinNoEdge(int address, String name, EnumSet<PinPullResistance> resistance) { return createDigitalPin(TinkerBoardGpioProvider.NAME, address, name, resistance, EnumSet.noneOf(PinEdge.class)); } protected static Pin createDigitalPinNoEdge(int address, String name) { return createDigitalPin(TinkerBoardGpioProvider.NAME, address, name, EnumSet.noneOf(PinEdge.class)); } protected static Pin createDigitalAndPwmPin(int address, String name) { return createDigitalAndPwmPin(TinkerBoardGpioProvider.NAME, address, name); } protected static Pin createDigitalAndPwmPinNoEdge(int address, String name) { return createDigitalAndPwmPin(TinkerBoardGpioProvider.NAME, address, name, EnumSet.noneOf(PinEdge.class)); } // *override* static method from subclass // (overriding a static method is not supported in Java // so this method definition will hide the subclass static method) public static Pin getPinByName(String name) { return PinProvider.getPinByName(name); } // *override* static method from subclass // (overriding a static method is not supported in Java // so this method definition will hide the subclass static method) public static Pin getPinByAddress(int address) { return PinProvider.getPinByAddress(address); } // *override* static method from subclass // (overriding a static method is not supported in Java // so this method definition will hide the subclass static method) public static Pin[] allPins() { return PinProvider.allPins(); } // *override* static method from subclass // (overriding a static method is not supported in Java // so this method definition will hide the subclass static method) public static Pin[] allPins(PinMode ... mode) { return PinProvider.allPins(mode); } }
servo.c
#include <stdio.h> #include "RKIO.h" #include "wiringTB.h" #include "constants.h" #include "common.h" #include "c_gpio.h" #include "py_gpio.h" #include "py_pwm.h" int main () { printf("servo.main\n"); int myservo = 239; //GPIO.setmode(GPIO.ASUS) py_setmode(ASUS); //GPIO.setup(myservo,GPIO.OUT) py_setup_channel(myservo, OUTPUT); //pwm = GPIO.PWM(myservo,50) # 50hz yani 20mslik periyod PWMObject pwm; PWM_init(&pwm, myservo, 50); printf("pwm.gpio = %d\n", pwm.gpio); //pwm.start(2.5) # 0 derece PWM_start(&pwm, 2.5); //pwm.ChangeDutyCycle(2.5) #0 derece PWM_ChangeDutyCycle(&pwm, 2.5); sleep( 1 ); //pwm.ChangeDutyCycle(7.5) #90 derece PWM_ChangeDutyCycle(&pwm, 7.5); sleep( 1 ); //pwm.ChangeDutyCycle(12.5) #180 derece PWM_ChangeDutyCycle(&pwm, 12.5); sleep( 1 ); //pwm.ChangeDutyCycle(7.5) PWM_ChangeDutyCycle(&pwm, 7.5); sleep( 1 ); //pwm.ChangeDutyCycle(2.5) #0 derece PWM_ChangeDutyCycle(&pwm, 2.5); sleep( 1 ); //pwm.ChangeDutyCycle(7.5) PWM_ChangeDutyCycle(&pwm, 7.5); sleep( 1 ); PWM_dealloc(pwm); }
컴파일
$ gcc -lm -lpwmBx servo.c -o servo
Servo.java
import com.pi4j.io.gpio.GpioFactory; import com.pi4j.io.gpio.TinkerBoardGpioProvider; import com.pi4j.wiringpi.ASUSGpio; import com.pi4j.wiringpi.PWMObject; public class Servo { public static void main(String[] args) throws Exception { GpioFactory.setDefaultProvider(new TinkerBoardGpioProvider()); int myservo = 239; //GPIO.setmode(GPIO.ASUS) ASUSGpio.pySetmode(ASUSGpio.ASUS); //GPIO.setup(myservo,GPIO.OUT) ASUSGpio.pySetupChannel(myservo, ASUSGpio.OUTPUT); //pwm = GPIO.PWM(myservo,50) # 50hz yani 20mslik periyod PWMObject pwm = ASUSGpio.pwmInit(myservo, 50); System.out.println("pwm.gpio = "+ pwm.gpio + "/" + pwm.freq + "/" + pwm.dutycycle); //pwm.start(2.5) # 0 derece ASUSGpio.pwmStart(pwm, 2.5f); Thread.sleep( 1000 ); //pwm.ChangeDutyCycle(2.5) #0 derece ASUSGpio.pwmChangeDutyCycle(pwm, 2.5f); Thread.sleep( 1000 ); //pwm.ChangeDutyCycle(7.5) #90 derece ASUSGpio.pwmChangeDutyCycle(pwm, 7.5f); Thread.sleep( 1000 ); //pwm.ChangeDutyCycle(12.5) #180 derece ASUSGpio.pwmChangeDutyCycle(pwm, 12.5f); Thread.sleep( 1000 ); //pwm.ChangeDutyCycle(7.5) ASUSGpio.pwmChangeDutyCycle(pwm, 7.5f); Thread.sleep( 1000 ); //pwm.ChangeDutyCycle(2.5) #0 derece ASUSGpio.pwmChangeDutyCycle(pwm, 2.5f); Thread.sleep( 1000 ); //pwm.ChangeDutyCycle(7.5) ASUSGpio.pwmChangeDutyCycle(pwm, 7.5f); Thread.sleep( 1000 ); ASUSGpio.pwmDealloc(pwm); } }
컴파일
$ javac -cp .:pi4j-core-1.2-SNAPSHOT.jar Servo.java
실행
$ java -cp .:pi4j-core-1.2-SNAPSHOT.jar Servo
실행 동영상
댓글
300x250
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- flex
- oracle
- Delphi
- 서울오토살롱
- ffmpeg
- 송주경
- KOBA
- android
- koba2010
- JavaScript
- 지스타2007
- BPI-M4
- 일본여행
- Spring MVC
- SAS
- ble
- Java
- MySQL
- NDK
- Linux
- 전예희
- Xcode
- Mac
- 레이싱모델 익스트림 포토 페스티벌
- 튜닝쇼 2008
- 동경
- Spring
- Delphi Tip
- ubuntu
- sas2009
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함