RaspberryPi로 JavaFX와 GPIO 제어를 조합하였으나, 아직 orz가 완성되지 않았습니다

13427 단어 RaspberryPiJavaFX
이 글은 Tech Women Advent Calendar 2014 19일째 글이다.
엔지니어@shikiyak입니다.비록 나의 업계 경력은 매우 길지만, 나의 업계 경력은 거의 모두 직업 엔지니어로서 www를 보냈기 때문에 그리 대단한 것은 아니다.할 수 있는 건 업무 시스템 개발뿐이야.
프로 엔지니어인 나도 프로그래밍을 좋아해서 프로그램이 시작되면 즐거워서 놀기 위한 프로그램을 많이 쓴다.
이런 게임의 장면은 이전에 스마트폰 앱을 만들면 즐거웠지만 조금 지겨워졌다.
지금은 래퍼리피를 이용해 작은 허보 허보 시스템을 만들어 즐거운 게임이 됐다.

Raspberry Pi는


아이들 교육을 위해 제작된 싱글보드컴퓨터입니다.일본에서는 교육용이라기보다는 아두노처럼 전자공으로 유명한데...루치아 같은...
하지만 기본적으로 교육용이어서 많은 일을 할 수 있습니다!
어쨌든 운영체제는 Linux!
Debian 기반의 Raspbian은 그 외에 일부 물건을 제공했다.
Linux 환경에서도 프로그램 언어의 설정 방법이 있다면 기본적으로 사용할 수 있다.
그러나 CPU가 ARM11이기 때문에 컴파일할 때의 지연은... 부인할 수 없습니다.
하지만, 괜찮아!게임이니까!!!

취미로 해봤던 JavaFX & Gpio Control.


가장 긴 프로그래밍 언어는 Java다. 작은 프로그램이라면 Java가 가장 쉽게 쓸 수 있다. 그리고 Java 여자부 멤버이기 때문에 Java로 만들고 싶다...(예전에 트위터 4J로 TweetBot을 만들었다) 이번에는Tech Women Advent Calendar에 사용한다.발표용 앱을 JavaFX로 만들기로 했어요.
일반적인 프레젠테이션 도구는 마우스를 클릭하거나 화살표 키를 누르면 페이지를 보내지만 이번에는 랩퍼리피이기 때문에 마우스를 대신해 GPIO를 momentary형 단추로 대체한다.
Momentary 버튼을 사용하는 회로도는 다음과 같습니다.

부착된 LED는 확인 버튼을 눌러 사건이 발생한 것을 확인하는 디버깅용이기 때문에 정식으로 사용할 때 LED와 저항을 뺄 수 있다(차라리 빼기를 원한다...).
두 개의 스위치가 설치되어 있는데, 그 중 하나는 페이지로 보내졌고, 하나는 중단된 종료 단추로 선택되었다.
JavaFX는 skrb 자료를 참조했습니다.
http://skrb.hatenablog.com/entry/2012/06/13/233944
GPIO Control은 java입니다.IO 포장도 가능하지만, 최대한 자바FX의 이벤트 처리 프로그램과 비슷한 인코딩을 사용하려고 Pi4J를 사용했다.
Pi4J : http://pi4j.com/
GPIO Control에서 Pi4J에 버튼이 있는 이벤트 청취자의 자료의 샘플 코드도 자료로 참고했습니다.
http://pi4j.com/example/listener.html
자료는 기본적으로 이렇게 시작하는데 완성된 원본 코드는 다음과 같다.
xxx.java
package rasppijoshi;

import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinDigitalInput;
import com.pi4j.io.gpio.PinPullResistance;
import com.pi4j.io.gpio.RaspiPin;
import com.pi4j.io.gpio.event.GpioPinDigitalStateChangeEvent;
import com.pi4j.io.gpio.event.GpioPinListenerDigital;
import javafx.application.Application;
import static javafx.application.Platform.exit;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

/**
 *
 * @author shikiyak
 */
public class RPiJavaFXPresenter extends Application {

    //表示するスライド画像ファイル名を表示順に登録する
    private final String[] viewGraphs = {
        "no1.jpg",
        "no2.jpg",
        "no3.jpg"
    };
    // 現在表示しているページ番号
    private int viewGraphIndex;


    @Override
    public void start(Stage primaryStage) {

        // RaspberryPIのGPIOを使えるようにする
        final GpioController gpio = GpioFactory.getInstance();

        StackPane root = new StackPane();        

        // GPIOイベントのハンドリングをする
        final GpioPinDigitalInput myButtonLeft = gpio.provisionDigitalInputPin(RaspiPin.GPIO_04, PinPullResistance.PULL_DOWN);
        final GpioPinDigitalInput myButtonRight = gpio.provisionDigitalInputPin(RaspiPin.GPIO_05, PinPullResistance.PULL_DOWN);

        // 左ボタンは、処理終了
        myButtonLeft.addListener(new GpioPinListenerDigital() {
            @Override
            public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent event) {
                exit();
           }

        });

        //右ボタンは、ページ送り
        myButtonRight.addListener(new GpioPinListenerDigital() {
            @Override
            public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent event) {
                if("HIGH".equals(event.getState().toString())){
                    moveViewGraph(root);
                }
            }

        });

        //シーンをサイズ指定で作成
        Scene scene = new Scene(root, 800, 600);        
        primaryStage.setScene(scene);
        primaryStage.show();
        moveViewGraph(root);

    }

     public static void main(String[] args) {
        launch(args);
    }

    private void moveViewGraph(StackPane root){
// ページをロード
        String imageURL = getClass().getResource(viewGraphs[viewGraphIndex]).toString();
        Image image = new Image(imageURL);
        ImageView next = new ImageView(image);
        root.getChildren().add(next);

// ページインデックスを進める
// 最後までいったら終了する
        viewGraphIndex++;
        if (viewGraphIndex >= viewGraphs.length) {
            exit();
        }        
    }    
}
이 프로그램에는'myButtonLeft','myButtonRight'등의 대상이 있는데 이것은 GPIO와 연결된 단추이다.
프로그램은 랩베리피로 제작된 것이 아니라 PC 모양의 넷빈스로 제작됐으며, 랩베리에서 jar만 SCP를 하는 방법으로 작업을 진행했다.
RaspberryPi를 사용하여 수행하는 명령은 jar 파일 이름이 "Presenter.jar"이면 다음과 같습니다.sudo java -Djavafx.screen=eglfb -classpath .:classes:lib/'*':Presenter.jar rasppijoshi.RPiJavaFXPresenter주의점으로 삼다
JavaFX를 사용하는 경우 직렬 연결 터미널이나 SSH 연결 터미널에서 잘못된 동작이 발생할 수 있습니다.
번거롭지만 HDMI 모니터를 연결하여 작동할 필요가 있습니다.

미완성


결론은...실제로 이 프로그램은 아직 실행되지 않았다.
시동을 걸면 GPIO도 잘 감지되지만 화면이 움직이지 않는다.JavaFX에서만 GPIO 화면을 사용하지 않고 이동하고 있습니다. 그 소스 코드에서 마우스를 삭제하는 이벤트 처리 프로그램이 GPIO를 통해 모멘터리 스위치를 처리하는 누르는 이벤트로 변경되었기 때문에 거기서 틀렸나요?난 또...
그건 아닌 것 같고, Momentary Switch를 누르는 이벤트가 취소돼도 다음 화면 표시는 진행되지 않는다.

게임이니까 여유롭게 하고 싶어요.


뭐, 일이잖아. 이제 겨울방학이니까 열심히 하고 싶어.
해결되면 여기를 업데이트할게요.

랩베리피에 관심 있는 여성들이 모여서 떠들어보겠죠?


그렇게 생각하는 여성과 함께 떠들썩하게 놀고 싶어 래스퍼리피의 여성 전용 유저팀을 만들었다.전자작업인지 프로그래밍도 그렇게 일사불란할 수 없고, 기타리스트도 아니고... 이런 여성에서 왔어요.
나는 열정적인 첨단 기술 여성도 만 명의 사용자층을 받아들일 수 있도록 하고 싶다.랩베리피 주체도 여럿(10대 정도)이기 때문에 서버를 구성해 볼 수도 있다.재미있으면 Google Group 에 쉽고 즐겁게 로그인하십시오.
여유로운 여자를 위한 래퍼리 피 유저 그룹.
https://groups.google.com/forum/?hl=ja#!forum/raspijoshi

좋은 웹페이지 즐겨찾기