2017年2月6日
- EV3技術情報
- Java
- ソフトウェア
EV3-Java EV3間のBluetooth通信制御プログラム
Java(leJOS)で作成したプログラムによる、2台のEV3間のBluetooth通信制御プログラムについて紹介します。
※EV3のJava言語プログラミング環境については、「教育版EV3 Javaプログラミングガイド」をご参照ください。
※ここで紹介する内容は、leJOS EV3 バージョン 0.9.1-betaを用いて動作を確認したものです。
◆準備
EV3を2台用意し、メッセージを受信するEV3と、送信するEV3を決めておきます。また、その2台のEV3をペアリングし、受信側EV3のアドレスを確認しておきます。(ペアリングおよびEV3のアドレスの確認方法は、こちらをご覧ください。)
◆プログラム
このプログラムは、EV3からEV3にBluetooth通信でメッセージを送り、それを受信したEV3は、メッセージに対応した色のLEDを点灯します。
プログラムを実行する際は、受信側EV3のプログラムを先に実行します。
◇メッセージ受信側EV3のプログラム
1 | import lejos.hardware.Bluetooth; |
---|---|
2 | import lejos.remote.nxt.NXTCommConnector; |
3 | import lejos.remote.nxt.NXTConnection; |
4 | import lejos.utility.Delay; |
5 | import lejos.hardware.lcd.LCD; |
6 | import lejos.hardware.Button; |
7 | |
8 | public class BtsampleEv3_1 { |
9 | |
10 | public static void main(String[] args) { |
11 | // 接続待機 |
12 | LCD.drawString("Waiting...",1,1); |
13 | NXTCommConnector connector = Bluetooth.getNXTCommConnector(); |
14 | NXTConnection connection = |
15 | connector.waitForConnection(0, NXTConnection.RAW); |
16 | |
17 | // メッセージを受信してLED点灯 |
18 | // 1:Green 2:Red 3:Orange |
19 | int message = getMessage(connection); |
20 | LCD.clear(); |
21 | if(message != 0){ |
22 | LCD.drawString("message is " + message,1,1); |
23 | Button.LEDPattern(message); |
24 | Delay.msDelay(3000); |
25 | } else { |
26 | LCD.drawString("error...",1,1); |
27 | } |
28 | |
29 | // 接続解除 |
30 | try { |
31 | if (null != connection) { |
32 | connection.close(); |
33 | } |
34 | } catch (Exception e) { |
35 | } |
36 | } |
37 | |
38 | static int getMessage(NXTConnection connection) { |
39 | byte[] buff = new byte[16]; |
40 | |
41 | //メッセージを受信するまで待つ |
42 | while(buff[0] == 0){ |
43 | connection.read(buff, buff.length); |
44 | } |
45 | |
46 | //メッセージを確認 |
47 | for (int i = 0; i < buff.length; i++) { |
48 | if (0 <= buff[i] && buff[i] <= 3) { |
49 | return buff[i]; |
50 | } |
51 | } |
52 | return 0; |
53 | } |
54 | } |
プログラムを実行すると、受信側EV3は送信側EV3から接続されるのを待ちます。(14行目)
接続後メッセージを受信したら、そのメッセージの内容を確認します。(19行目)
メッセージは「1~3」の範囲の数値です。
受信側EV3は、メッセージの値に対応した色でLEDを点灯します。(23行目)
◇メッセージ送信側EV3のプログラム
1 | import lejos.hardware.Bluetooth; |
---|---|
2 | import lejos.remote.nxt.NXTCommConnector; |
3 | import lejos.remote.nxt.NXTConnection; |
4 | import lejos.utility.Delay; |
5 | import lejos.hardware.lcd.LCD; |
6 | import lejos.hardware.Button; |
7 | |
8 | public class BtsampleEv3_2 { |
9 | |
10 | public static void main(String[] args) { |
11 | String ev3add = "00:00:00:00:00:00"; // 接続先EV3アドレス |
12 | |
13 | // 接続 |
14 | LCD.drawString("Connecting...",1,1); |
15 | NXTCommConnector connector = Bluetooth.getNXTCommConnector(); |
16 | NXTConnection connection = |
17 | connector.connect(ev3add, NXTConnection.RAW); |
18 | if (connection == null) { |
19 | LCD.clear(); |
20 | LCD.drawString("Connect error",1,1); |
21 | Button.waitForAnyPress(); |
22 | System.exit(1); |
23 | } |
24 | |
25 | // 接続成功 |
26 | LCD.clear(); |
27 | LCD.drawString("Connected!",1,1); |
28 | Delay.msDelay(1000); |
29 | |
30 | // 1~3のランダムな数値メッセージを送信 |
31 | LCD.clear(); |
32 | LCD.drawString("Sending...",1,1); |
33 | int message = (int)(Math.random()*4); |
34 | sendMessage(connection, message); |
35 | |
36 | // 送ったメッセージをLCDに表示、いずれかのボタンが押されるまで待機 |
37 | LCD.clear(); |
38 | LCD.drawString("Send:" + message,1,1); |
39 | Button.waitForAnyPress(); |
40 | |
41 | // 接続解除 |
42 | try { |
43 | if (null != connection) { |
44 | connection.close(); |
45 | } |
46 | } catch (Exception e) { |
47 | } |
48 | } |
49 | |
50 | static void sendMessage(NXTConnection connection, int message) { |
51 | // メッセージをバッファに設定 |
52 | byte[] buff = new byte[16]; |
53 | for (int i = 0; i < buff.length; i++) { |
54 | buff[i] = (byte) message; |
55 | } |
56 | |
57 | // メッセージを送信 |
58 | connection.write(buff, buff.length); |
59 | } |
60 | } |
プログラムの11行目「"00:00:00:00:00:00"」には、ペアリングの際に確認した受信側EV3のアドレスを設定します。
プログラムを実行すると、送信側EV3は受信側EV3に接続します。(16行目)
接続が完了したら、1~3のいずれかの数値をメッセージとして送信します。(33・34行目)
その後、送信したメッセージの値をLCDに表示します。(38行目)
LCDに表示されたメッセージを確認し、インテリジェントブロックのいずれかのボタンを押すと、受信側EV3との接続を解除します。(39行目~)
- Java(leJOS)で作成したプログラムによるEV3間のBluetooth通信制御の一例として紹介しています。
プログラムは動作確認済みですが、誤り等が含まれていた場合はご了承ください。