Maven エラー JavaFXのライブラリが読み込めない

OpenCVライブラリが読み込めない

module-info.javaでOpenCVライブラリが読み込めないのでエラーになりました。下のようなエラー内容です。

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project pi4j-example-javafx: Compilation failure: Compilation failure: 
[ERROR] /home/pi/projects/pi4j-example-javafx/src/main/java/com/pi4j/example/HelloCV.java:[8,18] package org.opencv.core is not visible
[ERROR]   (package org.opencv.core is declared in the unnamed module, but module org.opencv.core does not read it)
[ERROR] /home/pi/projects/pi4j-example-javafx/src/main/java/com/pi4j/example/HelloCV.java:[11,26] package javafx.embed.swing does not exist
[ERROR] /home/pi/projects/pi4j-example-javafx/src/main/java/com/pi4j/example/HelloCV.java:[28,19] package javafx.fxml does not exist
[ERROR] /home/pi/projects/pi4j-example-javafx/src/main/java/com/pi4j/example/HelloCV.java:[29,18] package org.opencv.core is not visible
[ERROR]   (package org.opencv.core is declared in the unnamed module, but module org.opencv.core does not read it)
[ERROR] /home/pi/projects/pi4j-example-javafx/src/main/java/com/pi4j/example/HelloCV.java:[30,18] package org.opencv.core is not visible
[ERROR]   (package org.opencv.core is declared in the unnamed module, but module org.opencv.core does not read it)
[ERROR] /home/pi/projects/pi4j-example-javafx/src/main/java/com/pi4j/example/HelloCV.java:[45,9] cannot find symbol
[ERROR]   symbol:   class FXMLLoader
[ERROR]   location: class com.pi4j.example.HelloCV
[ERROR] /home/pi/projects/pi4j-example-javafx/src/main/java/com/pi4j/example/HelloCV.java:[45,33] cannot find symbol
[ERROR]   symbol:   class FXMLLoader
[ERROR]   location: class com.pi4j.example.HelloCV
[ERROR] /home/pi/projects/pi4j-example-javafx/src/main/java/com/pi4j/example/HelloCV.java:[51,15] cannot find symbol
[ERROR]   symbol:   class OpenCvController
[ERROR]   location: class com.pi4j.example.HelloCV
[ERROR] -> [Help 1]

Mavenで下のコマンドを実行したときに出たエラーです。

mvn package

コンパイルするときにJARファイルはインストールできているのだが、読み込めない。。。

他にも下のようなエラーが出ました。

was cached in the local repository, resolution will not be reattempted until the update interval of central has elapsed or updates are forced -> [Help 1]

解決

以下の原因があったようです。

  1. キャッシュが更新されていない
  2. module-infoに読み込みを書いてない
  3. javafx-fxml, javafx-swingのバージョン指定が不適切

キャッシュをクリアする

下のコマンドで再度実行

mvn -U package

これで読込は動いた

module com.pi4j.example {
    // Pi4J MODULES
    requires com.pi4j;
    requires com.pi4j.plugin.pigpio;

    // SLF4J MODULES
    requires org.slf4j;
    requires org.slf4j.simple;

    //  JavaFX
    requires transitive javafx.graphics;
    requires transitive javafx.controls;
    requires transitive javafx.fxml;
    requires transitive javafx.swing;
    requires transitive javafx.base;
    // Add Modules
    requires java.desktop;
        // 3rd-party
    requires org.bytedeco.opencv.platform;
    requires org.bytedeco.javacv.platform;

    uses com.pi4j.extension.Extension;
    uses com.pi4j.provider.Provider;

    // allow access to classes in the following namespaces for Pi4J annotation processing
    opens com.pi4j.example to com.pi4j;
    exports com.pi4j.example to javafx.graphics;
}

バージョン指定

下の部分がバージョン指定のところです。「${javafx.version}」はプロパティ要素で定義している定数です。

<version>${javafx.version}</version>

javafx-fxmlは「11」が使用できないらしい。。。

POMファイル

下記のようにPOMファイルに定義したらコンパイルできた。

        <!-- https://mvnrepository.com/artifact/org.openjfx/javafx-fxml -->
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>${javafx.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.openjfx/javafx-swing -->
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-swing</artifactId>
            <version>17-ea+8</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.openjfx/javafx-base -->
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-base</artifactId>
            <version>${javafx.version}</version>
        </dependency>

module-info.java

/*-
 * #%L
 * **********************************************************************
 * ORGANIZATION  :  Pi4J
 * PROJECT       :  Pi4J :: EXAMPLE  :: Sample Code
 * FILENAME      :  module-info.java
 *
 * This file is part of the Pi4J project. More information about
 * this project can be found here:  https://pi4j.com/
 * **********************************************************************
 * %%
 * Copyright (C) 2012 - 2020 Pi4J
 * %%
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * #L%
 */
module com.pi4j.example {
    // Pi4J MODULES
    requires com.pi4j;
    requires com.pi4j.plugin.pigpio;

    // SLF4J MODULES
    requires org.slf4j;
    requires org.slf4j.simple;

    //  JavaFX
    requires transitive javafx.graphics;
    requires transitive javafx.controls;
    requires transitive javafx.fxml;
    requires transitive javafx.swing;
    requires transitive javafx.base;
    // Add Modules
    requires java.desktop;
        // 3rd-party
    requires org.bytedeco.opencv.platform;
    requires org.bytedeco.javacv.platform;

    uses com.pi4j.extension.Extension;
    uses com.pi4j.provider.Provider;

    // allow access to classes in the following namespaces for Pi4J annotation processing
    opens com.pi4j.example to com.pi4j;
/*    opens com.pi4j.example to javafx.graphics;
    opens com.pi4j.example to javafx.controls;
    opens com.pi4j.example to javafx.fxml;
    opens com.pi4j.example to javafx.swing;
    opens com.pi4j.example to javafx.base; */
}

軽量IDE Geanyをインストールする

イントロダクション

ラズパイとWindowsにOpenCVをインストールして、次のような形で開発がしたいと思い環境構築をすることにしました。

  1. WindowsでOpenCVの実装をする
  2. ラズパイでOpenCVを起動する

そして、ラズパイではIntellJなどの開発ツールが遅いので「Geany」という開発ツールを使用することにしました。使用しているラズパイは32ビットです。

ラズパイへのインストール

Raspberry Pi OSにはデフォルトでインストールされているようです。追加で下のコマンドをたたきます。

apt-get install geany-plugins

これで、プロジェクトを設定して起動することができます。

そして、Gitからクローンします。

Windowsへのインストール

Geanyのサイトでダウンロードできます。
ダウンローするのはインストーラー(*.msi)なので、クリック一発でインストールできます。
そして、プラグインも同様にGenyサイトからダウンロードできます。

ダウンロードして実行したら下のような形でセットアップします。

Mavenプロジェクトの設定

  1. Mavenをインストールする
    こちらのApacheサイトからダウンロードします。ダウンロードしたら、適当な場所に解凍してその場所を環境変数の「PATH」に追加します。

  2. JAVA_HOMEを設定する
    環境変数に「JAVA_HOME」を追加します。その時に、「bin」まで設定しないようにしましょう。

これで、Mavenを使用できます。Linux上では、コマンドで実行しますのでWindowsでも困んで実行できるようにしておくと後が楽です。

実際に筆者は、下記でOpenCVでのハローワールドを実行したのですが、大分苦労しました。結局のところはCLASSPATH変数を定義するとパッケージ指定でのコマンド実行ができなくなるので、CPオプションで実行するのが良いという結論に至りました。

実行

Geanyでコンパイルのコマンドを設定します。

上部のメニュー、ビルド→ビルドの設定で下のような画面を開きます。タブは「ビルド」を選択します。

文字 意味
%f メニュー項目が選択されたときにエディタで選択されたファイルのファイル名に置き換えられます。
%e 同じファイル名で置き換えられますが、最後の拡張子は付きません。
%d メニュー項目が選択されたときにエディタで選択されたファイルのディレクトリの絶対パスに置き換えられます。
%p 現在開いているプロジェクトのベース ディレクトリの絶対パスに置き換えられます。

コンパイル

javacコマンドに次のパラメータを設定します。CPオプションで「JARファイル、ライブラリ」のパスを設定します。

javac -cp "C:\OpenCV\opencv\build\java\opencv-480.jar;C:\OpenCV\opencv\build\java\x86" "%f"

実行

javaコマンドに以下のパラメータを設定します。CPオプションでJARファイル、-DでシステムプロパティにOpenCVのDLL(もしくはSO)ファイル

ちなみに、CPオプションの一番初めにある「.」はカレントディレクトリを示します。なのでコマンドを実行するときの現在位置もクラスパスに追加する形で実行します。

java -cp ".;C:\OpenCV\opencv\build\java\opencv-480.jar" -Djava.library.path="C:\OpenCV\opencv\build\java\x64" "src.main.java.cam.HelloCV"

コマンドからの実行結果です。ちなみに、こまんどぷろんぷとでは、「promt $$」とコマンドをたたいているので、パスがコマンドプロンプトに表示されていません。

ラズパイでJavaFXの開発環境を整える

イントロダクション

ラズパイでJavaCVを使った定点観測アプリを作成したいと思っております。
そんなわけで、次のような要件で、開発環境を整えたいと思っております。

  • ラズパイでソースをGitからPULLして、コンパイル、実行する
  • ウィンドウズでプログラムの作成とテスト
  • Gitにソースをコミット

ラズパイで開発環境を整える

まずは、ラズパイでJavaCVプログラムが動かせることを確認しないといけません。なので、JavaCV版のハローワールドを実行します。

まずは、開発ツールとしてGeanyを使用します。

UnsupportedClassVersionError

ラズパイで、Javaのハローワールドを実行してみました。Geanyでのプログラム実行が初めてだったので。。。
すると下のようなエラーがでました。

Error: LinkageError occurred while loading main class Test1
    java.lang.UnsupportedClassVersionError: Test1 has been compiled by a more recent version of the Java Runtime (class file version 57.0), this version of the Java Runtime only recognizes class file versions up to 55.0

原因を調べてみると、次のような結果が出ました。

  • 使用しているjavaコマンドのバージョン:Java11
  • 使用しているjavacコマンドのバージョン:Java13

なるほど。。。次のコマンドで、バージョンを変更しました。
【Javaコマンドのバージョン】

sudo update-alternatives --config java

【Javacコマンドのバージョン】

sudo update-alternatives --config javac

JavaFXのインストール

ライブラリを配置するだけです。
GLUONサイトからJARファイルをダウンロードします。

ライブラリの読み込み

Linux では次のように動作します。

java -cp "Test.jar:lib/*" my.package.MainClass

区切り文字はセミコロンではなくコロンです。

ラズパイのGeanyでプロジェクト作成

デフォルトの状態では、プロジェクトが作成できないみたいなので、次のようにプラグインをインストールします。【Debia系OS】※Ubuntsuやラズパイ

sudo apt-get install geany-plugins

そして、プロジェクトの作成ができたら使用するライブラリをコンパイル時に追加するようにjavacコマンドを記述します。

javac -cp "ライブラリ(JARファイル)へのパス" "%e(クラス名を示す)"

とりあえずは、こんな感じです。

WindowsのGeanyでプロジェクトの作成

Windowsの場合はインストーラーがあるので、それぞれにインストーラーをダウンロードします。

これでGeanyのインストールは完了です。ラズパイには、初めからインストールされています。

ポイントはWindowsでもラズパイでも同じ開発ツール(IDE)を使用するというところです。

Mavenも使いましょう。

Mavenというビルドツールがあります。これを使うとコマンドでいろいろとできます。
例えば、ライブラリのインストールなどは、POMファイルに文言を追加して、再度ビルドすればPCにインストールできます。

そして、ラズパイ上でも同様に動きますので、プロジェクトの生成やプロジェクトのインストールなどできます。

プロジェクトの生成

Mavenプロジェクトのインストール

Windowsでのプロジェクトのインストール

Windows IOT with RPi ~ラズパイ x JavaでLチカをやってみる~

イントロダクション

ラズパイでJavaプログラミングをやりたいと思っていたのですが、なかなか着手できずにいましたが、昨日LANのインターフェースを買ってきました。

これで、Windowsと接続してIOTしたいなと思っている次第です。

Widnows IOT

はじめに、IOTというとArduino、ichigo-jam、Microbitなどもあるのですが、Javaプログラミングをやりたかったらラズパイになります。
容量的にラズパイクラスのPCでないと動かないためです。JavaMEも残念ながらArduinoなどではデータのサイズが足らない状態です。。。

Microsoftの「Windows Iot for Raspberry Pi」を参考にして学習していきます。

VNCセットアップを行う

次に、WindowsPCからラズパイにアクセスして作業がやりたいので、リモート接続(リモートデスクトップ)の設定を行います。

Windows PCに接続する動画があるのでそれを見ると早いです。

この動画を見ると、必要な機材から丁寧に説明してくれている。残念ながら英語で説明してくれている。。。
日本語版があるといいんだけど。。。

一時停止ながら聞いていくと、WindowsIotのスターターパックみたいなのも、あるようです。

ラズパイの接続

筆者は、自力でラズパイをインストールしたので、インストール済みのラズパイを接続しました。WindowsIotの場合はSDカードのインストールからやるようです。

調べてみると、リモート接続でVNCを使用するようです。セキュリティ的に「xrdp」を使用する方法は、できなくなったようです。※Raspberry DeskTop

VNC接続手順

ラズパイに、VCNの設定を行う。

  1. ラズパイのメニュー→設定→インターフェースを開く右上の「V2」があることを確認

  2. SSH、VNC、I2Cの3つを「ON」に設定します。OKボタンを押下

  3. V2というのが右上部に表示されるのでそれをクリックしてIPアドレスをメモなどで覚えておきます。

  4. WindowsでVNC Viewerをインストールします。
      WindowsにインストールしたVNCビューワーで表示します。

いろいろとインストールする

まずここで使用したいものは「Py4J」というライブラリです。これはJavaからGPIOを使うために必要になります。
同様に、作成したプロジェクトを管理、学習のためにチェックアウトしたい時に便利な「Maven」をインストールしたいと思います。

まずは、ラズパイのアップデートをしましょう。

sudo apt update

Py4Jのインストール

Py4Jのサイトを参考にします。

ネットワーク接続がうまくいかなかったので、とりあえず、手動インストールしました。

  1. ここからDEBファイルをダウンロード※上記のリンク先にあります。
  2. VNC Veiwerでファイルを送信
  3. 「sudo dpkg -i pi4j-1.2.deb」コマンドでインストール

WringPiをインストール

下のコマンドでインストールします。やることはGitからソースを取得してビルドする。ということです。

git clone https://github.com/WiringPi/WiringPi.git
cd WringPi
./build

インストールできたら、確認します。

gpio -v

pigpioのインストール

sudo apt-get install pigpio

Mavenのインストール

次のコマンドで一発インストール

 sudo apt install maven -y

Javaのインストール

Oracleのサイトに次の文章がありました。

ありがたいことに、BellSoftがLiberica JDKを提供しています。

というわけで、次の手順でインストールします。

  1. 上のリンク先からDEBファイルをダウンロード
  2. VNC Viewerでファイル送信
  3. インストールをします。
  4. Javaのバージョンを切り替える

Javaを動かす

そして、Javaに触ります。ラズパイには、BlueJというIDE(開発ツール)がデフォルトでインストールされています。そして、チュートリアルのプロジェクトも入っています。

入ってない場合

下のコマンドで一発インストールできます。

sudo apt-get install bluej

チュートリアル

詳細は、BlueJのチュートリアルサイトにありました。
プロジェクト名が「LEDチュートリアル」のようです。ここをクリックするとダウンロードできます。

ダウンロードしたら、VNC Vewerでファイルをラズパイに送信できます。

BlueJを起動して、Controllerクラスを実行するのには、Controllerクラスを右クリックして、「new」してやれば実行できます。

余談

プログラムの実行というとメインメソッドを探してしまうのですが、BlueJの場合は、コンストラクタを実行することができるので、メインメソッドを探さなくてもよさそうです。BlueJがSwingで動いているからかな?

しかしエラーが。。。

早速プロジェクトを実行してみたら、下のようなエラーが出た。

重大: Unable to load [libpi4j.so] using path: [/lib/raspberrypi/dynamic/libpi4j.so]

原因は、そのまんま「「libpi4j.so]が見つからない」というエラーでした。
なので、これをダウンロードしてプロジェクト直下に配置してやるのが解決策でした。手順は以下の通りです。

libpi4j.soを取得

Py4Jのページにパスの指定方法が書いてありました。Javaを起動するときに下のようにやります。

ライブラリ取得先

上記のページに記載がありました。

ネイティブ ライブラリの入手先
Pi4J ネイティブ ライブラリは、アーキテクチャ固有のファイルを抽出することで取得できます。libpi4j-xxx.soプラグイン JAR ファイルのリソースからファイルを取得します。

さらに、Pi4J ネイティブ ライブラリは、Maven リポジトリで独立したアーティファクトとして公開されます。 https://oss.sonatype.org/#nexus-search;quick~pi4j-library-pigpio

libpi4j.soを参照する

ダウンロードしてきたファイルをBlueJプロジェクトで参照しないといけません。参照する方法は次のような3パターンがあります。

パターン1

Javaコマンドの実行時にVM引数を渡してやる方法。

java --Dpi4j.library.path="system" ...
-or-
java --Dpi4j.library.path="local" ...
-or-
java --Dpi4j.library.path="/some/directory" ...

パターン2

プログラムでシステムプロパティを追加する方法

System.setProperty("pi4j.library.path", "/some/directory");
-or-
System.setProperty("pi4j.library.path", "system");
-or-
System.setProperty("pi4j.library.path", "local");

パターン3

実行しているBlueJプロジェクトのフォルダに直接配置。下の画像のように配置します。

JavaでLチカをやってみる

準備ができたので、今回の目的であるLチカに着手したいと思います。

コードの分析

Controllerクラスを解析します。ちなみに、ラズパイにもともと入っていたコードです。

READMEを読む

Project "LEDButton"
Authors: Fabio Hedayioglu, Ian Utting and Michael Kölling

飛ばします。

This project is part of the material for the tutorial for BlueJ on the Raspberry Pi.

このプロジェクトは、Raspberry Pi 上の BlueJ のチュートリアルの素材の一部です。

 It is Part of the first and second tutorial: GPIO: LED and GPIO: Button.

最初と 2 番目のチュートリアルの一部です: GPIO: LED および GPIO: ボタン。

This is a simple object to demonstrate the use of an LED and a Button
connected to the Raspberry Pi using GPIOs.

LED とボタンの使用法を示す簡単なオブジェクトです。
GPIO を使用して Raspberry Pi に接続します。

You can manipulate LEDs and Buttons and interact with them either interactively
or programatically, by editing the class Controller.

LED とボタンを操作し、インタラクティブに操作できます。
または、クラス コントローラーを編集してプログラム的に。

This project is designed in such a way to make the manipulation of LEDs and Buttons
very easy and straightfoward, making it accessible even to the novice programmer.

このプロジェクトは、LED とボタンを操作するように設計されています。
非常に簡単かつ簡単なので、初心者プログラマーでもアクセスできます。

All the implementation details are isolated to the user, in order to make the
teaching and use of the LED and Button classes completely free from low level details.

すべての実装の詳細は、ユーザーに分離されます。
LED およびボタンのクラスの教育と使用には、低レベルの詳細は一切含まれません。

The LED and Button classes are flexible and can be used in general purpose projects.

LED クラスと Button クラスは柔軟性があり、汎用プロジェクトで使用できます。

コード内容

下のコードを読んでみると次のようにまとめられます。

  1. LEDは6ピンを使用、ボタンは7ピンを使用する。

つまり、GPIOの6番ピンでLED、ボタンは6番とチュートリアルにあるが、これは、今回使用しているラズパイ3とモデルが違うようなので、別途調べる。。。

こちらがそれのようだ。

/**
 * A controller for an LED at pin 6 and a Button at pin 7.
 * 
 * Creates an LED (called led) and a Button (called button) for you to control.
 * 
 * Class used for the BlueJ on Raspberry Pi turorial.
 * 
 */
public class Controller implements ButtonListener
{
   private LED led;
   private Button button;

   /**
    * Setup the Controller.
    */
   public Controller()
   {
       led = new LED(6);             // Create the LED at pin 6 controlled by this
       button = new Button(7);       // Create the Button at pin 7 controlled by this
       button.addListener(this);     // Make the button tell us when it has changed (See buttonChanged() below)
   }

   /**
    * Turn the led on.
    * (Exercise 1.2)
    * 
    */
   public void turnLEDOn()
   {
       //put your code here.
   }

   /**
    * Turn the led off.
    * (Exercise 1.2)
    * 
    */
   public void turnLEDOff()
   {
       //put your code here.
   }

   /**
    * Keep the LED on for a given period of time, then turn it off.
    * @param time the length of the flash in milliseconds (1/1000ths of a second).
    * (Exercise 1.3)
    * 
    */
   public void flash(int time)
   {
       //put your code here.
   }

   /**
    * Blink the LED a number of times, each time the LED is kept on for a given period.
    * (Exercise 1.4)
    * 
    */
   public void flashSOS()
   {
       // Put your code here
   }

   /**
    * To be called by the Button when it is pressed or released.
    * (Exercises 2.1, 2.2 and 2.3)
    * 
    */
   public void buttonChanged(boolean isPressed)
   {
       // Put your code here
   }

   /**
    * Returns the amount of time in milliseconds between the LED turning on and the button being pressed.
    * @return the reaction time in milliseconds.
    * (Exercise 2.4)
    * 
    */
   public int reactionTime()
   {
       // Replace the line below with your code
       return 0;
   }

   /*
    *  You don't need to change the methods below this point.
    *  They are just to help you with the examples on the web page.
    */

   /**
     * Cause the program to sleep for a short time.
     * @param milisec the number of milliseconds to sleep.
     * 
     */
    public void sleepMillisec(int millisec)
    {
        try
        {
            Thread.sleep(millisec);
        }
        catch ( InterruptedException e)
        {
        }
    }

   private static long startTime = System.currentTimeMillis();

   /**
    * The current time, measured in milliseconds since the program started.
    * @return integer with measured time in milliseconds.
    * 
    */
   public int timeNow()
   {
       return ((int) (System.currentTimeMillis() - startTime));
   }

}

実行

しかし、またエラーが。。。

6月 27, 2023 9:46:59 午前 com.pi4j.util.NativeLibraryLoader load
重大: Unable to load [libpi4j.so] using path: [/lib/raspberrypi/dynamic/libpi4j.so]
java.lang.UnsatisfiedLinkError: /tmp/libpi4j9090757756364282176.so: /tmp/libpi4j9090757756364282176.so: 間違った ELF クラスです: ELFCLASS32 (Possible cause: architecture word width mismatch)

ラズパイのOSが64ビットだった。。。32ビットしかないのでわ?

最終的に再インストール

再度インストールして、セットアップを行いました。再度トライ!
しかし、またまたエラー。。。これは、BlueJでLEDクラスをインスタンス化したときにエラーが出ました。

java.lang.UnsatisfiedLinkError: 'int com.pi4j.wiringpi.Gpio.wiringPiSetup()'

何ともならなかったので、とりあえずコマンドで実行してみました。

コマンドで実行したところ何とか動きました。しかしコマンドで動かしたいわけではないので。。。

改めてBlueJから起動したところLEDボタンが表示できました。

なぞだ。。。

Pi4J ラズパイでLチカをしてみる

イントロダクション

ラズパイでのJavaプログラミングを行うのに、BlueJが使えるというかOracleさんが言うにはラズパイ用に出ているようです。
こちらにその記事があります、そして、下のように記述がありました。

バージョン 3.14 から、BlueJ は、学校での基本的なコンピューター プログラミングの教育を促進することを目的とした、クレジット カード サイズのシングル ボード コンピューターであるRaspberry Piを完全にサポートします。BlueJ は、Pi 上での開発とプログラムの実行を可能にする Java 開発環境です。

インストール方法も記述があり、実際にはコマンド一発でインストールできました

Pi4J1でLチカを

ラズパイが世の中に出てから「時間があったら触りたい」と思い続けていたものの、なかなか触れないという状況がありました。
それというのは、「何をどの言語を使用して作ろうか?できればJavaを使いたい」と思っていたためです。

ちょうど、チュートリアルなるものがありました。
記事内のリンクからBlueJプロジェクトをダウンロードして、ラズパイで開けばよいみたいです。
Windowsで開くと、エラーが出ました。GPIO周りのクラスが参照できないエラーでした。

ラズパイで、プロジェクトをダウンロードしてBlueJを開いてみたらビルドエラーがない状態でした。
しかし、重くてキャプチャーなどを残せませんでした。オーバークロックなどいろいろとセットアップが必要です。※調査します。

チュートリアル翻訳と解釈

参照するページはこちら、オラクルで出しているBlueJのサイトにあるものです。

LED を Raspberry Pi に接続

このセクションでは、LED を Raspberry Pi に接続し、BlueJ を使用してオブジェクトを直接操作してオンとオフを切り替えます。このチュートリアルでは、プロジェクトLEDButtonを使用します。このプロジェクトをダウンロードして、Raspberry Pi で実行されている BlueJ で開く必要があります。

材料

  1. LED:
  2. 抵抗 (270Ω ~ 330Ω の任意の値
  3. ブレッドボード(あるとよい)

組み立て方

ブレッドボードなし

LEDは、電流が流れると光る部品です。長い脚と短い脚があります。短い脚 (接地端子) は黒いワイヤに直接接続し、長い脚は抵抗器に接続する必要があります。抵抗は流れる電流を制限し、LED の焼損を防ぐために使用されます。

次の図のように、抵抗器のもう一方の脚をもう一方のワイヤ (赤いワイヤ) に接続する必要があります。

次に、黒のワイヤを Pi の 20 (Ground) とマークされたピンに接続し、赤のワイヤを 22 (GPIO6) とマークされたピンに接続する必要があります。

注: Raspberry Pi モデル B+ を使用している場合は、26 個を超えるピンがあります。ただし、両方のモデル (B および B+) に存在するピンの割り当ては、ここで説明されているものと同じであり、プロジェクトは変更なしで機能するはずです。

回路は次のようになります。

ブレッドボードあり

任意のサイズのブレッドボードが利用できる場合は、それを使用して回路を構築することをお勧めします。LEDの脚を正しい方向に向けることを忘れないでください! この回路を以下の図 4 に示します。

コードについて

BlueJ で、プロジェクト LEDButton を開きます。画面は次のようになります。

上の BlueJ 画面の黄色のボックスはそれぞれ Java クラスです。LED クラスは、Raspberry Pi に接続された実際の LED を表します。

LED、Button、および ButtonListener クラスはすでに作成されており、次の演習で使用できますが、変更しないでください。Controller クラスは、独自のコードを記述する場所です。Button クラスと ButtonListener クラスについては、このチュートリアルのパート 2 で説明します。

新しい LED オブジェクトの作成
コードを書き始める前に、BlueJ を使用して直接制御することで、LED クラスが実際の LED にどのように影響するかを確認します。

開始するには、LED クラスを右クリックし、ポップアップ メニューから次の項目を選択します。

BlueJ は「インスタンスの名前」を尋ねます。提案された名前は今のところ問題ありません。BlueJ ウィンドウの左下に「lED1」という名前の赤い四角形が表示されます。

この長方形の赤いアイコンは、「lED1」オブジェクトを表します。このオブジェクトは、Raspberry Pi に接続された実際の LED の Java 表現です。

LEDの点灯

LED をオンにするには、「lED1」インスタンスを右クリックし、次を選択します。

これで LED が点灯するはずです。(すべての舞台裏の接続が行われるため、最初は少し時間がかかる場合があります)。

図 6 を見ると、gpio 番号を指定して LED も作成できることがわかります。デフォルトの gpio 番号は、LED を接続した gpio 番号 6 であるため、これを行う必要はありませんでした。

ヒント: LED クラスには、使用可能なすべてのメソッドとそれぞれの簡単な説明を示す独自のドキュメントが含まれています。それらを表示するには、LED クラス (黄色のボックス) をダブルクリックするだけで、そのドキュメント (javadoc) が表示されます。

演習

演習 1.1 : LED をオンにしました。今すぐオフにできますか?
演習 1.2 : Controller クラスにコードを記述して、今行ったことを対話的に行うことができます。Controller クラスで、メソッド「void turnLEDOn()」の本体を変更して LED をオンにするメソッドを呼び出し、同じクラスのメソッド「void turnLEDOff()」を同様に LED をオフにするように変更します。
チップ:

Controller クラスを編集するには、「Controller」の黄色のボックスをダブルクリックすると、Controller クラスのソース コードが表示されます。
Controller クラスでは、LED オブジェクトは 'led' と呼ばれます: それはすでに存在しています!
重要:コントローラー クラスに加えた変更をテストする前に、エディターの左上または BlueJ メイン画面の左パネルにある [コンパイル] をクリックしてプロジェクトをコンパイルすることを忘れないでください。

Controller クラスの変更をテストするには、LED クラスで行ったのと同じように、クラスを右クリックして Controller のインスタンスを作成し、次に赤い Controller インスタンスを右クリックして、変更したばかりのメソッドを呼び出します。 .
演習 1.3 : Controller クラスのメソッド "void flash(int time)" の本体を変更して、一定時間 (ミリ秒単位で測定) LED をオンにしてから、LED をオフにします。
チップ:

Controller クラスには、というメソッドがあります。
sleepMillisec(int 時間)
このメソッドは、プログラムを指定されたミリ秒数待機させるために使用できます。
1 ミリ秒は非常に短い時間です。
演習 1.4 : SOS のモールス信号を LED で点滅させるために、メソッド "void flashSOS()" の本体を変更します。
ヒント:

SOS のモールス符号は「. . . - - - . . .」で、ドット (.) は短いフラッシュで、ダッシュ (-) は長いフラッシュです。

前の演習で実装したフラッシュ メソッドを利用します。

演習 1.5 : モールス信号が使用するすべてのパターンを調べ、モールス符号で指定した文字列をフラッシュする Controller クラスの新しいメソッドを作成します。

ラズパイで実行するとき

  1. ラズパイのセットアップを先に行います。
  2. 必要な部品などを用意。
  3. サンプルプロジェクトをダウンロード。
  4. チュートリアルを見ながら作成。

現状は、Windowsで記事を書いているので、後に、ラズパイでの実行した結果を記述します。