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で記事を書いているので、後に、ラズパイでの実行した結果を記述します。

RPi ラズパイの設定

ラズパイの設定

ラズパイ(RPo)を購入して、早速起動!などどと浮かれていると、早速設定の必要性が出てきます。
設定は一度やったらあまりいじらないので、メモしておくに限ります。

日本語入力の設定(iBus-Mozc)

日本語のキーボート、表示はOSのインストール時にできるかもしれませんが、自分の場合は入力ができませんでした。
なので、次のコマンドを実行して、必要なプログラムをインストールしました。

まずは、アップデートを行います。

sudo  apt update

次に、iBus-Mozcのインストール

sudo apt install iBus-Mozc

これが終わったら、再起動します。そして、設定後入力結果です。
この記事を書いているときのもので失礼・・・

画面の右上部分にインストールした結果追加されたアイコン?が表示さています。

インストール状況の確認

コマンドを実行して、「Java, Ruby, Pythonのインストールされているかどうか?」を確認しました。
以下のような感じでした。

コマンドの実行結果は以下の出力がありました。

 takunoji@raspberrypi:~ $ jaca -vewrsion
bash: jaca: コマンドが見つかりません
takunoji@raspberrypi:~ $ ruby -V
bash: ruby: コマンドが見つかりません
takunoji@raspberrypi:~ $ python -V
Python 3.9.2

つまり、Pythonのインストールはされているということです。

BlueJのインストール

参考サイトは「bluej.org」です。

以下のコマンドを叩きます。

sudo apt-get update && sudo apt-get install bluej

Javaは別途インストールする必要があります。

sudo apt install default-jdk

確認するには、次のコマンドで行います。

java -version

BlueJを使ってみる

インストール後に、起動してプロジェクトを作成すると以下のような形で見えます。

そしてクラスを作成すると、こんな感じです。

クラスのコードを書くために、エディタを開きます。

一連の流れを動画にしました。
<iframe width="560" height="315" src="https://www.youtube.com/embed/nQjENclzrhE"; title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

Wifiの設定

参考サイト

1, コマンドでSSIDの確認
<code>sudo iwlist wlan0 scan | grep SSID</code>で対象のアクセスポイントが生きているか確認

  1. 「/etc/wpa_supplicant/wpa_supplicant.conf」を修正
    ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
    update_config=1
    country=JP
    network={
    ssid="ここにSSID"
    psk="パスワード"
    }

これで再起動すると、Wifiの設定ができているようです。

オーバークロックの方法

こちらのページを参考にします。

  1. クロックの状態を確認するために、ツールを導入。

    sudo apt-get install cpufrequtils
  2. オーバークロックする前の状態を確認。

    cpufreq-info -s -m
  3. /boot/config.txt 修正。

    arm_freq=1300
    over_voltage=5
    gpu_freq=500
    sdram_freq=500
    sdram_schmoo=0x02000020
    over_voltage_sdram_p=6
    over_voltage_sdram_i=4
    over_voltage_sdram_c=4
  4. リブート

    udo reboot
  5. 確認。

    pufreq-info -s -m

JavaFX in RPi 〜RPiでビルドをかける〜

JavaFXで作成したアプリケーションをRPi(ラズパイ)にインストールしたいと思います。

今までやってきたのは下にリンクをつけて置きます。

  1. メディアプレーヤ作成開始
  2. ラズパイでJavaFXを使うには
  3. [JavaFXとプロパティファイルを読み込み](Java FX in RPi 〜プロパティファイルの読み込み JavaFX実装〜)
  4. JavaFXで画面サイズ取得
  5. Youtubeにアクセス
  6. JavaFXでHTMLをロードする
  7. IFrame YoutubePlayerを使う

RPiでビルド準備

単純にビルドをかけるためにはMavenを使います。

Mavenとは

世間では「ビルドツール」としてよく目にしますが、「ビルドツールって何?」とか「用途は?」と疑問に思うことがあります。
早い話が、「ビルド!」ってやると、以下のようなことができます。

  1. 実行ファイルを作る
  2. 自動でテスト
  3. デプロイ
  4. 他の人のプロジェクトをダウンロード(git pull)

大雑把に上記のようなことができます。

Mavenのセットアップ in RPi

早速、RPiにアクセスしようと思います。SSH接続の詳細に関してはこちらに記載しています
補足としてメモもあります

とりあえずはSSHで接続します。

上のようにMavenがインストールされているか?
mvn -version
Javaがインストールされているか?を確認します。
java --version

しかし、上記の通りに何もインストールしていないのでここからインストールします。

Javaのインストール

Oracleからダウンロードしてインストールするのが一番良いと思います。(コマンドでインストールするとどこに何が?となる。。。)
調べてみたところ、ラズパイのサイトから見つけた方法が良いかと思いました。
これを実行します。

ラズパイにJDK

ラズパイのへのJDKのインストールに関しては、オラクルのサイトから手順を見ながら行いました。

bellsoft-jdk13-linux-arm32-vfp-hflt.debをインストールして、ラズパイでのJavaFXを起動できるようにします。

詳細に関しては、以下の通りです。

  1. 通常のJDK、Windowsなどの通常のPCで使用しているJDKではなく、ARM32用のJDKをインストール
  2. 「update-alternatives」コマンドで、使用するJDKを変更する
  3. Mavenをインストールする

この部分に関しては、下の記事に詳細を記載しています。
RPi JavaFX execution ~ラズパイでJavaFX起動~

しかし、自分がこの設定を行い実行したときは、リモートデスクトップ接続した状態だったので動きませんでした。
エラー詳細に関してはこちらに記載しています、とりあえずはリモートデスクトップ接続では動かなかったというところです。

あとは、ラズパイでの実行確認を行うだけなのですが、時間がなく。。。

中途半端な状態です。

でわでわ。。。

関連記事

ラズパイ設定 ~リモートデスクトップ,ウェブサーバー構築,JavaFX~

イントロダクション

シングルボードコンピューター、ラズベリーパイをご存じの方は多いと思いますが、知らない人のために簡単に「こんなものもです」という動画を引っ張ってきました。以下のものは、サンプルです。
用途その1:ロボットを動かす

用途その2:ゲーム機にする

用途その3:メディアプレーヤーにする

用途その4:ウェブサーバーにする

今回のやりたいこと

表題の通りに、以下の設定を行いました。

  1. ラズパイにリモートデスクトップでアクセスできるように設定
  2. ラズパイを起動したときにウェブサーバーが起動する ※インストール時に、自動起動する設定を行ってくれるようなので、実際にやったことは、インストールとPHPの設定のみ。

ちなみに、コマンドでOSを終了するときは以下のコマンドです。

sudo shutdown now

Index

  1. ラズパイにリモートデスクトップ接続
  2. ラズパイのセッティング
  3. ウェブサーバーのインストール
  4. PHPのインストール
  5. ウェブサーバー(Apache2)の設定
  6. ウェブサーバー(NGINX)の設定
  7. Javaのインストール
  8. Wifiの設定
  9. iPhoneをルーターの代わりにする
  10. MavenのインストールとJavaFXのインストール

ちなみに以下のアプリ(コマンド)はインストール済みでした。

ハマったところ

ブラウザにキャッシュが残っていて、修正自体は問題ないが、修正が反映されていない事件があったので
「おかしい!」と思ったらブラウザの履歴を削除してみるのもよいと思います。

テキストエディタNano

nanoコマンドでのテキストエディタをお勧めします。
その理由は、操作方法法が下に表示されているから。。。
nano

終了するのはウィンドウズのキーボードならcntroll + Xで終了になります。
つまり「^」はcontrollボタンに相当するわけです。

行番号の表示

修正対象ファイル:/etc/nanorc

set linenumbersのコメントアウトを解除する

Access RPi

ラズパイにリモートデスクトップ接続する方法
こちらのサイトを参考に実行してみました。

RPi Setting

ラズパイのセッティングを行います。

  1. ラズパイを起動して、コマンド画面(Terminal)を開きます。

  2. 以下のコマンドを入力、Enterを押下

    sudo apt-get install tightvncserver -y

    コマンドの実行中にy/nの入力を求められるので「y」を入力します

  3. 同様に以下のコマンドを入力

    sudo apt-get install xrdp
  4. 上のコマンド実行が終わったら、ラズパイの使用しているネットワークとIPアドレスを調べます。※192.168.0.10とあります。
    具体的には、下のような形で確認、メモします。
    ifconfig

    • Terminalで「ifconfig」とコマンドを入力すると上のように表示されるので、以下のパターン別に見分けます。
      1. LANケーブルの場合: eth0:の部分にある「inet」をみる。ちなみに上のキャプチャはWifi接続なので「inet」の部分がありません。
      2. Wifi接続の場合: wlan0:の部分にある「inet」をみる。キャプチャには接続しているので「inet」があります。そして「192.168.0.12」と表示されています。これをメモリます。
  5. 改めてWindowsを立ち上げ、ラズパイは、ディスプレイを接続しない形で、再度立ち上げなおし(起動しなおし)「アクセサリ -> リモートデスクトップ接続」のようにアプリを起動します。

  6. 下のような画面が出るので先ほどメモしたIPアドレスを入力します。

    RPiSetting

そして接続してみると下のような画面が見れます。
remoteDesk

これで、今後ラズパイ用ののディスプレイ、キーボードなどを用意しなくても、Windowsからリモートでラズパイを操作することができます。一応ですが、
ラズパイの電源は入れ、ネットワークの接続を行う必要があります。

Install Web Server

ウェブサーバーのインストールを行います。参考サイトはこちら

しかし、Raspberry Pi Imagerでインストールしたもの(OS)には、Apacheが初めからインストールされているようで、さらにラズパイ起動時にウェーブサーバーも起動してくれるようになっていたんで今更インストールしなくてもよいかもしれません。。。

  1. 以下のコマンドを叩きます(入力してEnter押下)
    sudo apt-get install nginx

    インストールが終了したら。。。

  2. 下のコマンドでサーバーを起動します。※自分の場合はインストールしたら起動していました。。。
    sudo /etc/init.d/nginx start

    ブラウザで「localhost」と入力すれば確認できます。
    WebServer

逆に停止するときは下のコマンドです。

sudo /etc/init.d/nginx stop

インストールした時点で、自動起動する設定も反映されるようなので、もともと入っているApacheを使用しなくてもよいようです。

Install PHP

みんながよく使用するので(ウェブ系の人々)一応インストールします。あわよくばWordPressもインストールしようか?と思っています。
シンプルに以下のコマンドでインストールできるようです。

sudo apt-get install php
php -v # phpのバージョンを確認後「X」にバージョン番号を対応させる
sudo apt install phpX.X-mbstring

インストールの確認は以下のコマンド

php -v

Setting Apache

ウェブサーバーを起動した後に、自分の作成した画面を表示できるように設定を行います。
そして、以下のパッケージ?が必要なようですのでインストールします。※参考サイトより

sudo apt install apache2-dev # PHP動かすのに必要(と思う)

まずは、サーバーの起動確認

ラズパイの80番ポートを使用しているアプリの確認を行うコマンド。※80の部分を8080に変更すれば、8080晩ポートの確認ができる

nc -v -w ラズパイのIPアドレス -z 80

そして、ブラウザでIPアドレスにアクセスしてみると下のように表示されました。
ApacheView

Apache起動と停止コマンド

# 起動
$ sudo service apache2 start
# 停止
$ sudo service apache2 stop
# 再起動
$ sudo service apache2 restart // エラーが出る場合がある

# エラーが出る場合は、stopとstartを別々に動かす方法もある

# 強制的に設定を再読み込みする
sudo /etc/init.d/apache2 force-reload

エラーになったときの対処

エラーメッセージの中に下のような文言があるはず。。。

See systemctl status apache2.service

このコマンドを叩いてみると詳細な情報が表示されました。
自分の場合は下のように叩きました。

sudo systemctl status apache2.service

どうやらIPアドレスがバインド (関連付け)されていないようでした。。。
そして、初めにインストールしたNGINXがポートを使用していたためバインドできないエラーが出ていました。下のコマンドで確認しました。つまるところApacheではなくNGINXが動いていた。。。ということでした(笑)

sudo netstat -tlnp

設定の変更

ファイルを修正する前には必ずバックアップを取りましょう

  1. 修正対象ファイル: /etc/apache2/apache2.conf
    バックアップを取るのには以下のコマンド

    # cp コピーするファイル コピー後のファイル
    cp /etc/apache2/apache2.conf /etc/apache2/bakup.apache2.conf

エラーページの設定
下のような文字列を追記する

<VirtualHost *:80>
    # 404エラーのとき、/error/404.htmlを表示する
    ErrorDocument 404 /error/404.html
    ErrorDocument 403 /error/403.html
</VirtualHost>
  1. 修正対象ファイル: /etc/apache2/site-available/000-default.conf

    <VirtualHost *:80>
        # /var/www/htmlディレクトリをドキュメントルートとする設定
        DocumentRoot /var/www/html  
    </VirtualHost>

    デフォルト(初期)設定で上のようになっているのでそのままにしようと思います。。。

  2. PHPの設定を行う
    PHPのインストールを確認後に作業してください
    以下のコマンドを実行します。使用している(インストール済みの)PHPのMODを下のコマンドで「php~.load」があるか確認してください、なければa2enmodコマンドで有効にしてください

    ls -l /etc/apache2/mods-enabled

    有効にするモジュール(MOD)

    sudo a2enmod rewrite
    sudo a2enmod suexec
    sudo a2enmod include
    sudo a2enmod fcgid
  3. 修正が終わったらサーバーを再起動します。

    $ sudo service apache2 stop
    $ sudo service apache2 start

Setting Nginx

Apacheの時と同様に、PHPの設定を行います。
ドキュメントルートはApacheと同様なので、割愛します。

PHPの設定

PHPを使用するのにphpX.X-fpmを使用するようなので今回は下のようにインストールしました。

sudo apt-get install php7.3-fpm

設定ファイルの修正

参考サイト
修正対象ファイル: /etc/nginx/sites-enabled/default

  • 下のようになっている行を

    index index.html index.htm;

次のように修正

index index.php index.html index.htm;

そしてPHP部分の修正、下のようになっている所の{}のなかを

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
# location ~ \.php$ {

下のように修正

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
        include snippets/fastcgi-php.conf;

# With php-fpm (or other unix sockets):
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
# With php-cgi (or other tcp sockets):
#fastcgi_pass 127.0.0.1:9000;
}

そして、下のようなエラーが出る場合「nginx.conf」or「nginx/sites-enabled/default」
のファイルに下のような文字列が記述されているのでどちらかをコメントアウトします。
ちなみに自分の場合はdefaultの方を修正しました。

#listen 80 default_server;
#listen [::]:80 default_server ipv6only=on;

phpExe

Install Java

Javaのインストール配下のコマンドでOK、下のようなコマンドでインストールを行います。
参考サイトはこちらです

sudo apt install default-jdk

しかし、インストールされるのはOpenJDK11, 8なのでネットワーク環境の良いところで実行してください。
でないと、自分のように何時間も待つ羽目になります。。。

そして、実行してみたところ上のコマンドの次に

sudo apt install openjdk-8-jdk

を実行し、使用するJDKの選択を行う必要がありました。

sudo update-alternatives --config java

alternatives

そして、JDK8を選択、javaコマンドが起動できました。
JavaCommand

Wifi Setting

Wifiの設定を行います。
参考サイトはラズパイのページです。

wifiの接続先検索コマンド
  1. ifconfigコマンドで、「wlan」という文字列を探します。
  2. おそらく「wlan0」という文字列が見つけられるので、それを確認
  3. 以下のコマンドを叩く

    sudo iwlist wlan0 scan

これで、接続できるSSIDの一覧を取得できます。

wifiの接続先候補リスト
/etc/wpa_supplicant/wpa_supplicant.conf

上のファイルに接続先候補が記述されています。
なので。。。

wifi接続先候補の確認

以下のコマンドを叩きます。

cat /etc/wpa_supplicant/wpa_supplicant.conf

そしてこれを編集したいときは

sudo nano /etc/wpa_supplicant/wpa_supplicant.conf

しかし、これは新しい接続先に画面から接続したらプログラムがこのファイルに書き込んでくれるので「不要なものを削除する」のがメインになりそうです。

Use iPhone for router

iPhoneをルーター代わりにする
ラズパイ上のウェブサーバーを起動しても、ネットワークがつながらないと、話になりません。
そこで、携帯をルーターの代わりにする方法を記載しておきます。

  1. 設定をタップ

  2. インターネット共有をタップ

  3. インターネット共有をONにする

  4. ちょっと待つ

これで、iPhoneをルータの代わりにできます。あとは、ラズパイでiPhoneにwifi接続してやれば、ウェブサーバーにアクセスできます。通信費は携帯のものを使用するので注意が必要です。

Install Maven JavaFX

ちなみに、JavaFXは下のようなGUIアプリケーションを作成することができます。
画面上のPNG画像を動かして、画面の下部分に文字を表示したりしています。

Mavenのインストール
こちらの記事にも記載しましたが、下のコマンド一発でインストールできます。

sudo apt-get install maven

JavaFXのインストール
参考サイトはこちら
そして、apt-get instll でインストールしたのなら

/usr/lib/jvm

以下に、JDKがインストールされているはずです。

  1. JDKのインストール

    sudo apt update
    sudo apt install openjdk-8-jdk

  2. JDKの確認と選択

    sudo update-alternatives --config java

  3. /etc/environmentファイルを修正する

    JAVA_HOME="javaのインストールしているパス"

具体的には下のようにJDKを確認・指定します。

そして、

sudo nano /etc/environment

でファイルに以下の文字列を書き込みます。

JAVA_HOME="usr/lib/jvm/java-8-openjdk-armhf/jre/bin/java

  1. GluonからJavaFX SDKをダウンロード
    このページからダウンロードできます。そしてダウンロードしたら適当な場所に解凍します。自分の場合は、ダウンロードフォルダに解凍しました。
    以下のように配置(インストール)するようです。
解凍したフォルダ(コピー元) JDKのパス(コピー先)
armv6hf-sdk/rt/lib/ext/jfxrt.jar jre/lib/ext/
armv6hf-sdk/rt/lib/arm/* jre/lib/arm/
armv6hf-sdk/rt/lib/javafx.platform.properties jre/lib/
armv6hf-sdk/rt/lib/javafx.properties jre/lib/
armv6hf-sdk/rt/lib/jfxswt.jar   jre/lib/

実行結果

これで、GithubからPULLしたソースをビルドできる

mvn install

しかし、リモートデスクトップ接続の状態ではXサーバーの問題でうまく動かないようです。

<未解決>
ラズパイを単体で起動、確認してみます。

でわでわ。。。

関連ページ一覧

Eclipse セットアップ

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseCDTをインストール〜
  3. Setup OpenGL with JavaJOGLを使う準備 for Eclipse
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)
  6. Eclipse SceneBuilderを追加する
  7. JavaFX SceneBuilder EclipseSceneBuilder連携~

Java Basic一覧

  1. Java Basic Level 1 〜Hello Java〜
  2. Java Basic Level2 〜Arithmetic Calculate〜
  3. Java Basic Level3 〜About String class〜
  4. Java Basic Level 4〜Boolean〜
  5. Java Basic Level 5〜If Statement〜
  6. Java Basic Summary from Level1 to 5
  7. Java Basic Level 6 〜Traning of If statement〜
  8. Java Basic Level8 〜How to use for statement〜
  9. Java Basic Level 8.5 〜Array〜
  10. Java Basic Level 9〜Training of for statement〜
  11. Java Basic Level 10 〜While statement 〜
  12. Java Basic Swing〜オブジェクト指向〜
  13. Java Basic Swing Level 2〜オブジェクト指向2〜
  14. サンプル実装〜コンソールゲーム〜
  15. Java Basic インターフェース・抽象クラスの作り方
  16. Java Basic クラスとは〜Step2_1〜
  17. Java Basic JUnit 〜テストスイートの作り方〜

Git関連

  1. Java Git clone in Eclipse 〜サンプルの取得〜
  2. Eclipse Gitリポジトリの取得 GitからソースをPullしよう〜
  3. IntelliJ IDEA GitGitリポジトリからクローン〜

JavaFX関連ページ

  1. Eclipse SceneBuilderを追加する
  2. JavaFX SceneBuilder 〜EclipseとSceneBuilder連携~
  3. JavaFX SceneBuilder〜ボタンにメソッドを割り当てるワンポイント〜
  4. Java プロコンゲーム 〜見た目の作成(SceneBuilderの使用)〜

ステップアップ関連ページ一覧

  1. Java 初めてでも大丈夫〜ステップアッププログラミングのススメ〜
  2. ステップアッププログラミング〜Java FxでHelloWorld解説〜
  3. Java StepUpPrograming〜JavaFX で四則計算〜
  4. Java StepUpPrograming〜JavaFXで画面切り替えを作る1〜
  5. Java StepUpPrograming〜JavaFXで画面切り替え2ボタン作成〜
  6. Java StepUpPrograming〜JavaFXで画面切り替え3アクション〜
  7. Java StepUpPrograming〜JavaFXで画面切り替え4Pane切り替え〜
  8. Java StepUpPrograming〜JavaFXで画面切り替え5WebEngine

JavaFX + ND4Jで機械学習準備

  1. JavaFX + ND4J〜数学への挑戦1:ND4Jのインストール〜
  2. JavaFX + ND4J〜数学への挑戦2: 行列の計算〜
  3. Java + ND4J 〜数学への挑戦3: ベクトル(配列)の作成方法〜

オブジェクト指向関連ページ

  1. [オブジェクト指向の概念1〜OracleDocのチュートリアル1〜](https://zenryokuservice.com/wp/2019/10/301. /%e3%82%aa%e3%83%96%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e6%8c%87%e5%90%91%e3%81%ae%e6%a6%82%e5%bf%b5-%e3%80%9coracledoc%e3%81%ae%e3%83%81%e3%83%a5%e3%83%bc%e3%83%88%e3%83%aa%e3%82%a2%e3%83%ab%ef%bc%91/)
  2. オブジェクト指向の概念2〜クラスとは〜

RPi EJDK install 〜ラズパイにJavaSE Embeddedのインストール〜

今回は、JavaSE Embedded(EJDK)をインストールします。

関連記事

EJDKのダウンロード
RPiコマンドメモ -> ラズパイにSSH接続、ファイル送信

参考サイトはオラクルのJavaSE Embeddedインストールです。英語なので翻訳して読みます。

Step1:通常のJDKインストール

参考サイトでは、通常のJDKがインストールされている必要があると書いてあるのでJava8のインストールを行います。
参考サイトはこちらです、ラズパイフォーラムページです。
前提として、今回のJavaSE EmbeddedはJava8です。
jdk-8u231-linux-arm32-vfp-hflt.tar.gz
jdk-8XXXXと書いてあるものはJava8です。

そして、JavaSE Embeddedは8が最新で最後になるらしい。。。です。

なので、通常のJava8をインストールします。OpenJDKを使用します。
なので、ラズパイにログインしてから以下のコマンドを叩きます。
sudo apt-get install -y galternatives openjdk-8-jdk

そして、インストールできたか確認します。
java -version

確認が取れたら、JavaSE Embedded(EJDK)のインストール準備が完了です。(スペックなどは各自で確認してください)

EJDKインストール

今回はラズパイのドキュメント直下にインストールディレクトリを作成します。
~/Javaというディレクトリを作成します。「~/」というのはログインしているユーザーのドキュメント直下という意味になります。
つまりユーザー「pi」でログインしているのであれば「/home/pi/Java」というディレクトリを作成します。

mkdir ~/Javaというコマンドで作成します。
そして、mvコマンドでインストールするファイルを移動します。

そして、インストールファイルを解答します。

gunzip ファイル名(.gzでも良い)とコマンドを叩くと、指定ファイルもしくは(.gz)そのディレクトリにある全てのgzファイルを解凍します。

同様にtarコマンドで解凍します。
tar -xvf ファイル名

環境設定ファイル(環境変数)

参考サイトはこちらです、ラズパイフォーラムページです。

こちらのページには以下のような記述がありました。

クイックガイド
ただシステムを実行する必要がある性急な人のために、ここであなたができることがあります:
すべてのグローバル環境変数、つまりすべてのユーザーに影響する変数を/ etc / environmentに入れます
このファイルはシェルではなく PAMによって読み取られることに注意してください。ここではシェル拡張を使用できません。たとえば、MAIL = $ HOME / Maildir /は機能しません!
PAMが処理できる些細なケース以外に、すべてのユーザーの環境を構成する方法の問題に対する、シェルに依存しない、ログインに依存しないソリューションはありません。
すべての一時的なシェル設定(エイリアス、関数、シェルオプション)を〜/ .bashrcに入れます
すべての環境変数を〜/ .profileに入れます
ファイル〜/ .bash_profileを作成または編集し、コマンドを含めます。

なので、「evironment」ファイルにEJDKのパスを設定します。
sudo nano /etc/environment
EJDK_HOME=/home/pi/Java/ejdk1.8.0_211/bin

そして、上記でインストールしたJDK(EJDKではない)を参照するように環境変数のJAVA_HOMEを設定します。
</etc/environment>

JJAVA_HOME=/usr/lib/jvm/java-8-openjdk-armhf/bin
EJDK_HOME=/home/pi/Java/ejdk1.8.0_211/bin

jrecreate.sh --help実行結果

JREの生成

参考ページ(サイト)はオラクルのJRE生成ページです。

そして、JREの生成で実行するコマンドはExample3のコマンドを実行します。

JavaFX controls and Java SE locales added to server JVM and compact3 profile.

% installDir/ejdk<version>/bin/jrecreate.sh \
    --dest /tmp/exampleJRE2 \
    --profile compact3 \
    --vm server \
    --extension fx:controls \
    --extension locales 

インストールしたいのはJavaFXのコントロールとJVMサーバーなので。。。
<実際に実行したコマンド>
※「(バックスラッシュ)」は改行しても改行したこと(Enterキーを押したこと)にしない(エスケープする)ためにつけています。

cd $EJDK_HOME
bin/jrecreate.sh --dest /tmp/exampleJRE2 \
    --profile compact3 \
    --vm server \
    --extension fx:controls \
    --extension locales

そして、実行して見た所以下のようなエラーが出ました。

JREの作成に失敗しました。ターゲットlinux_arm_sfltはVM serverをサポートしていません。

改めてヘルプを見ると色々と修正する必要がありました。。。

使用方法: jrecreate --help | --dest  [options]
オプションは次のとおりです:
  -?, -h, --help             このヘルプ・メッセージを表示します。
  -d, --dest           Javaランタイムのターゲット・ディレクトリを指定します。
  --ejdk-home          ejdkディストリビューションのルートのパスを指定します。
  -g, --debug                Javaレベルのデバッグ・サポートを組み込みます。
  -k, --keep-debug-info      JRE生成中にクラス/jarファイルからデバッグ属性を除去しません。
                               署名付きjarファイルには適用されません。
  -n, --dry-run              リクエストされた操作を試験的に実行します。
  --no-compression           jarファイルを圧縮しません。署名付きjarファイルには適用されません。
  -p, --profile        オプション。プロファイルのいずれかを生成対象として指定します。
                               有効なプロファイル名: compact1、compact2、compact3。
                               指定しない場合、完全なJREが作成されます。
  -v, --verbose              詳細な出力を有効にします。
  --vm               ターゲット・ランタイムで使用するVMを指定します。
                               有効なオプション: minimal、client、server、all。
                               デフォルトは、compact1とcompact2に対してはminimal、compact3に対してはclient、JREに対してはallです。
  -x, --extension      生成されるランタイムに含めるオプション・コンポーネントを1つ以上選択します。
                               複数のコンポーネントを選択するために、このオプションには単独の値だけで
                               なく、カンマ区切りリスト(スペースなし)も指定できます。
                               有効な拡張機能:
                                   sunpkcs11 - Cryptographic Token Interface Standard (PKCS 11)プロバイダ
                                   gcf - 汎用接続フレームワーク・オプション・パッケージ(JSR-197)
                                   locales - すべてのJava SEロケール
                                   charsets - 拡張文字エンコーディング
                                   sunec - 楕円曲線暗号方式プロバイダ
                                   nashorn - Nashorn JavaScriptエンジン

結局のところは以下のようなコマンドになりました。

% installDir/ejdk<version>/bin/jrecreate.sh  --dest /tmp/ejre8 --extension locales 

生成したJREは/tmp/ejre8というフォルダに出力されるようにコマンドを実行しました。

どうやらJREの生成ができたようです。(Fullversion)

でわでわ。。。



RPi SSH Command Memos 〜ラズパイに接続するときのメモ〜

ラズパイにMac(PC)から接続するときの手順とコマンドのメモ

SSH コマンドメモ

MacからLANケーブルで接続したラズパイにSSHコマンドでsつ属するとき

接続時に使用するコマンド

接続する時に使用するIPアドレスを調べる
$ arp -a -> 接続しているIPアドレスを検索
<コマンドの実行結果>

ラズパイ接続
sudo ssh ユーザー名@IPアドレス

実行例
sudo ssh pi@a192.168.4.2

ここで、「sudo」をつけ忘れるとエラーが出た。実行する環境(PC)によって実行結果が変わる可能性がある。
-> PCのアクセス権限などで実行結果が変わる

ラズパイからログアウト
exit

ファイル送信

<コマンドの入力形式>
scp 「(オプション)」「転送したいファイル名」「転送先のパス」

実行例
sudo scp -p -v ~/.ssh/known_hosts ~/Java/zips/ejdk-8u211-linux-arm-sflt.tar.gz pi@192.168.4.2:/home/pi/

注意点

scpコマンドを使用してアクセスする時にアクセス権限がないのでエラーが出ました、-> 「sudo」を使用しない時

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

これに対してsudoコマンドを初めにつけてやり実行するとちゃんと接続できました。

-> パスワードの入力を促される。

PCのスーパーユーザーのパスワードとラズパイのユーザーのパスワードが聞かれるのでそれを入力する。

ブルートゥース

bluetoothctlコマンドで細かい設定を行う

以下は、コマンドオプションです

list # ローカルコントローラのリスト表示
show # コントローラの状態表示
power on # コントローラ起動
power off # コントローラ停止
scan on # デバイス検索モード
devices # デバイス表示
pair (dev) # ペアリング
trust (dev) # デバイスを信用する。(必要かどうか分からない)
paired-devices # ペアリング済デバイス表示
connect (dev) # 接続
info (dev) # デバイスの状態

でわでわ。。。



Java RPi JDKインストール 〜ラズパイにJDK(Embedded)をインストール〜

ラズパイに、JDKをインストールしようと思います。
はっきり言って
sudo apt-get install -y galternatives openjdk-8-jdkでインストールできます。

が。。。やっぱりRPiにインストールするのでちゃんと選ばないといけないような気がしました。なので調べます。

結論から言うと、JDK Embeddedをインストールします、そしてMavenのインストールについても少し触れます。

ORACLEのサイトを見る

ドキュメントのルートへのリンクはこれです

オラクルに組み込みデバイスへのJDKインストール関連のドキュメントがありました。これをみていこうと思います。

JDKインストール

JDKをインストールのページによると以下のような文言がありました。

Oracle Java SE Embeddedには、すぐに組み込みデバイスにインストールできるJREがありません。jrecreateホストコンピューターでツールを使用してカスタムJREをビルドし、そのJREを組み込みデバイスにコピーする必要があります。

ここからダウンロードできるようです。

見つけるのに一苦労しました。

JDKのダウンロードはこちらのサイトから行います。

ここは「アーカイブ」のページになっているので見つけるのが大変でした。

そして、解凍します。すると下のようなファイルが入っています。

ドキュメントによると、[JREを生成する必要がある]のでその手順も踏みます。

そして、ここのページに従い、インストールを行います。

やっぱり、インストールの確認には「ハローワールド」をやるみたいです(笑)。

Mavenのインストール

ここのサイト(英語)が叩くコマンドが書いてありとても分かり易かったです。詳細は翻訳で。。。

ここまでやれば、アプリケーションの起動準備ができたも同然です。。。がやって見ないとわからないのが世の常。。。

これから実行しようと思います。

でわでわ。。。



JavaFX in RPi 〜IFrame Youtube Player自動再生〜

今回は、以前作成したプロパティファイルを読み込む処理を連携して、以下のような処理を作成したいと思います。

  1. プロパティファイルを読み込む
  2. 取得したURLを15秒おきに再生

前回JavaFXでHTML+JSで作成した Youtube Playerを表示しました。

ポイント

  1. JavaFXでプロパティファイルを読み込みます
  2. 読み込んだデータをJSに出力します。
    engine.executeScript("var data = " + videoIds + ";");
  3. あとはHTML(+JS)でVideoIDの数だけ動画をループして表示します。

HTMLに実装したJSはこのページをコピって作成しました

作成したコードはGithubにアップしてあります。

  1. Main.java
  2. iframePlayer.html

とりあえず、JSでYoutubeの動画を15秒ずつ切り替えるところが大変でした。

動画の指定方法として、URLではなくVideoIDを使用するところがキーポイントでした。

でわでわ。。。

https://github.com/ZenryokuService/RPiMediaPlayer/blob/master/RPiMediaPlayer/src/application/iframePlayer.html

JavaFX in RPi 〜IFrame Youtube Player を作る〜

今回はHTML(とJS)でYoutubePlayerを作成します。
目的と実行手順は以下の通りです。

参考サイトはこちらのGoogle Developperページです。

IFrame Youtube Player

  1. HTMLでYoutubePlayerを作成
  2. JavaFXで作成したHTMLをロード
  3. RPiで起動するように設定
  4. TVなどで再生してみれるようにする

サンプルコードをコピペで動かしてみました。

<!DOCTYPE html>
<html>
  <body>
    <!-- 1. The <iframe> (and video player) will replace this <div> tag. -->
    <div id="player"></div>

    <script>
      // 2. This code loads the IFrame Player API code asynchronously.
      var tag = document.createElement('script');

      tag.src = "https://www.youtube.com/iframe_api";
      var firstScriptTag = document.getElementsByTagName('script')[0];
      firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

      // 3. This function creates an <iframe> (and YouTube player)
      //    after the API code downloads.
      var player;
      function onYouTubeIframeAPIReady() {
        player = new YT.Player('player', {
          height: '360', // window.innerHeight * 0.9などで値を変更する
          width: '640',
          videoId: 'M7lc1UVf-VE',
          events: {
            'onReady': onPlayerReady,
            'onStateChange': onPlayerStateChange
          }
        });
      }

      // 4. The API will call this function when the video player is ready.
      function onPlayerReady(event) {
        event.target.playVideo();
      }

      // 5. The API calls this function when the player's state changes.
      //    The function indicates that when playing a video (state=1),
      //    the player should play for six seconds and then stop.
      var done = false;
      function onPlayerStateChange(event) {
        if (event.data == YT.PlayerState.PLAYING && !done) {
          setTimeout(stopVideo, 6000);
          done = true;
        }
      }
      function stopVideo() {
        player.stopVideo();
      }
    </script>
  </body>
</html>

しかし、このままだと全画面表示でないのでカスタムしてやる必要があります。

カスタムする

ここで、変更したいのはボタンなどをつけて「チャンネルなどを変えることができる」ということをユーザーに気づいてもらえるようにすることです。
具体的には下のようなイメージです。。。
しかし、仮の状態です。

「▶︎」などをつけてみました。
とりあえずは、見た目のみです。

バージョンについて

今回作成するのは、特定のYoutubeの動画IDを15秒おきに再生するものを作成するので、正直のところは「▶︎」ボタンなどはいらないのです。。。
しかし、バージョンわけで表示できるような工夫をしてみたいと思います。
<Version1>
Youtubeを15置きに動画IDを変更して連続的に再生する、アプリが止まるまで続ける自動再生プレーヤ

<Version2>
Youtubeだけでなく、インターネットTVなど表示するテレビ局などを変更、チャンネルの変更などができるようにする。
当然、RPi(ラズパイ)をテレビに接続して表示できるようにする。(試行錯誤中ですが・・・・)

以上のように考えております。

でわでわ。。。



JavaFX in RPi 〜HTMLをロードする〜

今回は作成したHTMLファイルをJavaFXでロードします。
前回URLをロードしてみた結果、表示したくない部分も画面に出てきたのでそれをなくします。

問題と解決策

早い話が、HTMLにiframeを使用して動画部分のみを表示しようというところです。
下の画像がJavaFXでロードした結果です。

HTMLをロードする

JavaFXでHTMLをロードするのはとても簡単でした。
<ロードした結果>

<ロードしたHTML>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
    <iframe width="560" height="315"
         src="https://www.youtube.com/embed/S0LbTzCrkiw"
         frameborder="0"
         allow="accelerometer;
         autoplay;
         encrypted-media;
         gyroscope;
         picture-in-picture"
         allowfullscreen>
    </iframe>
</body>

</html>

<Javaコード>

public void start(Stage primaryStage) {
    try {
        // レイアウト(土台)になるペインを作成
        BorderPane root = new BorderPane();

        // WebView(ブラウザ)の作成
        WebView browser = new WebView();
        WebEngine engine = browser.getEngine();
        String aaa = getClass().getResource("iframe.html").toExternalForm();
        System.out.println(aaa);
        engine.load(aaa);

        root.setCenter(browser);
        // 画面を表示する土台(シーン)を作成
        Scene scene = new Scene(root,this.windowWidth,this.windowHeight);
        // JavaFX用のCSSを読み込む
        scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
        primaryStage.setScene(scene);
        primaryStage.setOnCloseRequest(event -> Platform.exit());
        primaryStage.show();
    } catch(Exception e) {
        e.printStackTrace();
    }
}

今回の課題

ロードしたHTMLファイルのプロパティ(画面サイズや、そのほかのコントロール)を操作したい

上の要件を満たすために、通常のHTML + JSで実装するのであれば、シンプルにHTMLファイルに全部記述してしまうのが手っ取り早く、メンテナンス性も優れています。

というわけで、Youtubeを単純に全画面表示する場合は下のようなHTMLファイルを作成してやればOKな感じでした。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body width="100%" height="100%">
    <iframe style="border: 0; position:fixed; top:0; left:0; right:0; bottom:0; width:100%; height:100%"
         src="https://www.youtube.com/embed/S0LbTzCrkiw"
         frameborder="0"
         allow="accelerometer;
         autoplay;
         encrypted-media;
         gyroscope;
         picture-in-picture"
         allowfullscreen>
    </iframe>
</body>

</html>

しかし、自動再生が走らないのでちょいといじります。
iframeタグのsrcにautoplay=1を、allow属性にallow="accelerometer"を追加しました。HTMLを直接開いた場合は自動再生が始まらなかったのですが、JavaFXでロードしたら自動再生が始まりました。

ちょっと腑に落ちませんが、まぁよしとします(笑)

作成したコードはこちらにアップしてあります。

でわでわ。。。