![](https://habrastorage.org/getpro/habr/post_images/7e5/8e1/d4a/7e58e1d4a5b3b19851865c47add37641.png)
私の知る限りでは、Habréだけでなく、マイクロコントローラー(ARMプロセッサーやその他の普通ではない鉄片をベースにしたデバイス)への関心が急増しています。 市場は対称的に反応します。 需要を満たすために、Arduino、Biggle Board、Raspberry Pi、その他多くの便利なギズモが登場しました。
今年の初めから何も経っておらず、Rasprerry PiでのJavaプラットフォームのアプリケーションに関する2つの記事が一度に登場しました。 「Raspberry PiとJavaカップ、お願いします!」と「Raspberry PIとJAVA:よく見てください 。 」 当然のことながら、実験ではおなじみのJava SEを使用しました。JavaSEのARMへの移植は約2年前に登場しました。 Java MEがNokiaのプッシュボタン式携帯電話の時代に安らかに眠っていなかったことを知っている人はほとんどいません。 彼女は新しい世界、つまり組み込みシステムの世界で一生を過ごしています。 今日は、Raspberry PiでのJava MEのアプリケーションについてお話します。
Oracle Java ME Embeddedは、ハードウェア機能が制限されたARMアーキテクチャおよびシステムを備えたデバイス向けに最適化された完全なJavaランタイムです。 Java MEは、弱いコンピューティングパワーとネットワークサービスで動作する小さなRAMリソースを備えたプラットフォームで栄光を極めています。 たとえば、ワイヤレスモジュール、測位モジュール、スマートリソースメーター、環境監視センサー、自動販売機、遠隔医療、そしてもちろんスマートホームなど。
プロジェクトでOracle Java MEを使用すると、多くの興味深い機能が提供されます。 第1に、Javaの主な利点である「1回書き込み、どこでも実行」が組み込みデバイスの場合に機能するようになりました。 次に、プラットフォームは、アプリケーションライフサイクル管理システムとデバイス上のリモート更新(AMS-アプリケーション管理システム)を統合します。 第三に、周辺機器にアクセスするための特別なAPIを取得します(DAAPI-Device Access API)。 第4に、組み込みシステムでは珍しい無料の開発ツール(NetBeansおよびEclipse用のJava ME SDK)。 プラットフォームに統合された標準サービスのセット:ファイルI / O(JSR 75)、ワイヤレスメッセージング(JSR 120)、Webサービス(JSR 172)、セキュリティおよび信頼サービスサブセット(SATSA-JSR 177)、場所(JSR 179)、 XML(JSR 280)。
![](https://habrastorage.org/getpro/habr/post_images/2ec/a59/fa6/2eca59fa658c50096e08513a9e12af66.jpg)
Oracle Java ME組み込み製品スタック
すでに理解しているように、Oracle Java ME Embeddedはクロスプラットフォーム製品であり、ARMアーキテクチャを備えた多くのデバイスをサポートしています。 Oracle Java ME 3.3の現在のリリースバージョンは3.4です。 プラットフォームは、Cortex-M3 / RTX(KEIL評価ボード)、ARM11 / Linux(Raspberry Pi Model B)、ARM9 / BREW MP(Qualcomm IoE開発)、X86 / Windows(エミュレーター)に移植されています。 以下は、Oracleがリリースしたリファレンスプラットフォームの実装です。 このようなエンドユーザーのニーズに応じて、プラットフォームを他のデバイスに移植することができます。
公式には、Oracle Java ME Embeddedの最小構成では、130 KB RAM、350 KB ROMのみが必要です。 1月30日にモスクワで開催されるJava User Groupミーティング( http://jug.msk.ru )にアクセスすると、ファイルを使用して作業する場合、プラットフォームがどれほど小さいか驚くでしょう。 Alexander Mironenko alexanderVmironenkoは、Javaを32kbに「詰め込んだ」方法を説明します。 RAM 完全な標準構成には、より多くのメモリが必要です。700kbRAMと2000kb ROMですが、これらは現代の標準ではまだとんでもないようです。
![](https://habrastorage.org/getpro/habr/post_images/e3a/3de/752/e3a3de7521ce4f9867bd5cb27ef9d561.jpg)
誰もが周りのすべての人が賢くなりたいと思っています。 賢い人とコミュニケーションをとることは素晴らしいことであり、賢い家に住むことは快適です。 これがおそらく、ArduidoとRaspberry Piを使用したプロジェクトのほとんどが、我が家のスキルの向上に重点を置いている理由です。 典型的なタスクは温度監視です。
温度監視では、最初にSPIインターフェイスを備えたセンサーを使用しました。 しかし、後になって、I2Cを備えたセンサーがはるかに安価であることが判明しました。 Raspberry PiとOracle Java ME Embedded 3.3から温度計を作成するには、DIP8パッケージのDalas Semiconductor DS1621デジタル温度センサーが必要です。 ここでは、173ルーブルで購入できますhttp://www.electronshik.ru/item/ds1621-232961 。
ボードのGPIO端子に接続します
DS1621 | ラズベリーGPIOピン |
ピン1 | SDA(GPIO 2) |
ピン2 | SCL(GPIO 3) |
ピン4 | GND |
ピン8 | 3.3v |
DS1621のデータシートを読むと、この例ではピン5-6-7を使用してバス上のセンサーアドレスが設定されていることがわかります。電源に短絡することにより、すべてを1に設定します。
![](https://habrastorage.org/getpro/habr/post_images/4d5/c0e/df7/4d5c0edf7e901e036f26f942198376b0.png)
Raspbianを既にお持ちで、更新されていると考えています。
Raspberry PiでI2Cインターフェイスを使用できるようにするため。 適切なモジュールをダウンロードする必要があります。
/ etc / modulesに2行追加します
i2c-bcm2708 i2c-dev
ボードをオーバーロードします。
I2Cを使用するためのユーティリティのインストール
sudo apt-get install i2c-tools
I2Cバスでデバイスのアドレスを決定します
sudo i2cdetect -y 1
センサー4fのアドレス(この番号を覚えておいてください)
Raspberry Pi Model B用のOracle Java ME Embedded 3.3の安定バージョンをダウンロードします。バージョン3.4は、Qualcomm IoEプラットフォームのサポートのみを追加しました。 ライセンス契約に予備的に同意します。 http://www.oracle.com/technetwork/java/embedded/downloads/javame/index.html?ssSourceSiteId=ocomen
ランタイムをRaspberryにコピーし、便利な場所に展開します。
たとえば、〜/ JavaME /
そしてルートからAMS(アプリケーション管理システム)を起動します
sudo ~/JavaME/bin/usertest.sh
C Raspberry Piが終了しました。
NetBeansまたはEclipse用のJava ME SDKおよびプラグインをコンピューターにインストールします。 http://www.oracle.com/technetwork/java/javame/javamobile/download/sdk/default-303768.html
Malinkaをミッドレットを展開するためのデバイスとして追加します。
NetBeansメニューから、ツール/ Java ME /デバイスセレクターを選択します
[デバイスセレクタ]ウィンドウで、Ctrl-Dを押して新しいデバイスを作成します。 これを行うには、ボードのアドレスを登録し、[次へ]をクリックします。すべてが正常な場合は、ログのレベルを選択します。
Java ME /組み込みアプリケーションプロジェクトの作成
IDEは、MIDletクラスを継承し、startApp()、pauseApp()、およびdestroyApp(ブール型無条件)の3つのメソッドで構成されるJava MEアプリケーションのスケルトンを作成します。 ミッドレットが開始するとstartApp()メソッドが開始されます。簡単にするために、アプリケーションのコードを記述します。
Java ME Embeddedは、高レベルの周辺機器通信API-DAAPI(Deveice Access API)を提供します。 I2Cを使用するには、デバイス構成を作成し、それをPeripheralManager.open()ファクトリに転送する必要があります。すべてのワイヤが正常であり、Javaがルートとして実行されている場合、センサーと通信できるようにするI2CDevice()クラスのインスタンスを取得します。
以下はサンプルのJava MEアプリケーションコードです。不明な点がある場合は、コメントで質問し、サンクトペテルブルクのオラクルオフィスまたは1月30日( http://jug.msk.ru)
デバイスでこのコードを実行するには、NetBeansでプロジェクトを右クリックし、[Run with ...]を選択して、開いた[Quick Project Run]ウィンドウでRaspberryを選択します。 または、プロジェクトのプロパティで、[プラットフォーム]タブを選択し、デバイスを[デバイス]として選択すると、NetBeansはプロジェクトの開始時にデフォルトでアプリケーションをRapberry Piにデプロイします。
今、あなたは部屋の温度を知っています:)
便利なリンク:
Raspberry Pi用のJava ME Embedded 3.3
Java ME SDK 3.4
リファレンスプラットフォーム用Java ME Embedded 3.3入門ガイド(Raspberry Pi)
DS1621データシート温度センサー
import com.oracle.deviceaccess.PeripheralManager; import com.oracle.deviceaccess.i2cbus.I2CDevice; import com.oracle.deviceaccess.i2cbus.I2CDeviceConfig; import java.io.IOException; import javax.microedition.midlet.*; public class IMlet extends MIDlet { private final int CFG_ADDRESS = 0x4f; // private final int FREQ = 100000; // Datasheet private final int ADDRESS_SIZE = 7; // Datasheet private final int BUS_ID = 1; // Java ME Embedded Getting Started Guide // DS1621 Datasheet private final int REG_READ_TEMP = 0xAA; private final int RT_ADDR_SIZE = 0x01; private final int READ_TEMP_SIZE = 0x02; private final int READ_TEMP_VAL = 0x00; private final int REG_ACC_CONF = 0xAC; private final int ACC_CONF_VAL = 0x00; private final int REG_START_CONV = 0xEE; private final int REG_STOP_CONV = 0x22; public void startApp() { // I2CDeviceConfig config = new I2CDeviceConfig(BUS_ID, CFG_ADDRESS, ADDRESS_SIZE, FREQ); I2CDevice device = null; try { // device = (I2CDevice) PeripheralManager.open(config); // write(device, new byte[]{(byte) REG_ACC_CONF, (byte) ACC_CONF_VAL}); write(device, new byte[]{(byte) REG_START_CONV}); // byte temp[] = new byte[READ_TEMP_SIZE]; device.read(REG_READ_TEMP, RT_ADDR_SIZE, temp, 0, READ_TEMP_SIZE); // Profit! System.out.println("Temperature is:" + temp[0]); } catch (Exception ex) { // , Habrahabr ex.printStackTrace(); } finally { // if(device != null) { try { device.close(); } catch (IOException ex) { ex.printStackTrace(); } // , notifyDestroyed(); } } } public void pauseApp() { } public void destroyApp(boolean unconditional) { } private void write(I2CDevice i2c, byte[] buffer) { try { i2c.begin(); i2c.write(buffer, 0, buffer.length); i2c.end(); } catch (IOException ex) { System.out.println("[I2CThermometerTest] configure exception: " + ex.getMessage()); } catch (Exception ex) { System.out.println("[I2CThermometerTest] Peripherial not available exception: " + ex.getMessage()); } } }