2016年7月19日
- EV3技術情報
- Java
- ソフトウェア
EV3-Java PCとEV3間のTCP/IP通信制御方法
Java(leJOS)で作成したプログラムによる、PCとEV3間のTCP/IP通信制御方法について紹介します。
※EV3のJava言語プログラミング環境については、「教育版EV3 Javaプログラミングガイド」をご参照ください。
※ここで紹介する内容は、leJOS EV3 バージョン 0.9.1-betaを用いて動作を確認したものです。
ここでは、PCからEV3にTCP/IP通信で命令を送り、それによって車型に組み立てたEV3の進行方向をコントロールするプログラムを紹介します。
なお、車型のEV3は、左タイヤのモーターがポートB、右タイヤのモーターがポートCに接続されているものとします。
◆EV3側のプログラム
package tcpip_ev3pc;
import java.net.ServerSocket;
import java.net.Socket;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import lejos.hardware.lcd.LCD;
import lejos.utility.Delay;
import lejos.hardware.motor.Motor;
import lejos.robotics.RegulatedMotor;
public class Ev3_robot {
static RegulatedMotor leftMotor = Motor.B;
static RegulatedMotor rightMotor = Motor.C;
public static void main(String[] args) {
try{
// ポートを開く(9999の部分には任意のポートを指定)
ServerSocket serverSocket = new ServerSocket(9999);
// 接続があるまでブロック
LCD.clear();
LCD.drawString("Please Wait...", 0, 0);
Socket socket = serverSocket.accept();
// PCの命令を受信
BufferedReader br =
new BufferedReader(new InputStreamReader(
socket.getInputStream()));
String str;
running: while ( true ) {
str = br.readLine();
LCD.clear();
LCD.drawString(str, 0, 0);
// PCの命令によってモーターを制御
switch (str) {
case "STRAIGHT":
motor_set(300,300);
break;
case "RIGHT":
motor_set(300,-300);
break;
case "LEFT":
motor_set(-300,300);
break;
case "BACK":
motor_set(-300,-300);
break;
case "STOP":
motor_set(0,0);
break running;
}
Delay.msDelay(100);
}
// BufferedReaderを閉じる
br.close();
// ソケットを閉じる
if( socket != null){
socket.close();
socket = null;
}
if( serverSocket != null){
serverSocket.close();
serverSocket = null;
}
}
catch (Exception e) {
System.out.println(e);
}
}
// モーターのパワーを制御
private static void motor_set(int l_motor_pow, int r_motor_pow) {
leftMotor.setSpeed(l_motor_pow);
rightMotor.setSpeed(r_motor_pow);
if ( l_motor_pow > 0 ) {
leftMotor.forward();
} else if ( l_motor_pow < 0 ) {
leftMotor.backward();
} else {
leftMotor.stop();
}
if ( r_motor_pow > 0 ) {
rightMotor.forward();
} else if ( r_motor_pow < 0 ) {
rightMotor.backward();
} else {
rightMotor.stop();
}
}
}
EV3側のプログラムを先に実行しておきます。
PC側から送られてきた命令(文字列)によって、モーターのパワーを制御しています。
PC側から終了命令(“STOP”)を受信すると、モーターを停止しプログラムが終了します。
◆PC側のプログラム
package tcpip_ev3pc;
import java.net.Socket;
import java.io.OutputStreamWriter;
import java.io.BufferedWriter;
import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowEvent;
import java.awt.event.WindowAdapter;
public class Pc_controller extends JFrame {
private static final long serialVersionUID = 1L;
private BufferedWriter bw;
private Socket socket;
public static void main(String[] args) {
Pc_controller frame = new Pc_controller();
frame.setSize(300, 300);
frame.setVisible(true);
}
public Pc_controller(){
try {
// ソケットを開く
// 192.168.00.00の部分はEV3のIPアドレスを指定
// 9999の部分にはEV3側のプログラムと同じ任意のポートを指定
socket = new Socket("192.168.00.00",9999);
bw = new BufferedWriter(new
OutputStreamWriter(socket.getOutputStream()));
// レイアウトと各ボタンを押したときの処理
setLayout(new BorderLayout());
JButton straight = new JButton("直進");
add(straight, BorderLayout.NORTH);
straight.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e){
sendCommand("STRAIGHT");
}
});
JButton right = new JButton("右");
add(right, BorderLayout.EAST);
right.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e){
sendCommand("RIGHT");
}
});
JButton left = new JButton("左");
add(left, BorderLayout.WEST);
left.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e){
sendCommand("LEFT");
}
});
JButton back = new JButton("後退");
add(back, BorderLayout.SOUTH);
back.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e){
sendCommand("BACK");
}
});
JButton stop = new JButton("停止");
add(stop, BorderLayout.CENTER);
stop.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e){
sendCommand("STOP");
}
});
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
try {
bw.close();
if( socket != null){
socket.close();
socket = null;
}
}
catch (Exception ex) {
System.out.println(ex);
}
System.exit(0);
}
});
}
catch (Exception e) {
System.out.println(e);
}
}
// EV3に命令を送る
private void sendCommand(String command) {
try {
bw.write(command+"\n");
bw.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
}
EV3側のプログラム実行し、EV3のLCDに「Please Wait...」と表示されてから、PC側のプログラムを実行します。
プログラムを実行すると、右図のような画面が開きます。
「直進」・「左」・「右」・「後退」ボタンをクリックすることで、EV3の動きを制御します。
「終了」ボタンをクリックすると、EV3との接続が終了します。
画面は「×」ボタンで閉じます。
?
?※Java(leJOS)で作成したプログラムによるPCとEV3間のTCP/IP通信制御方法の一例として紹介しています。
※プログラムは動作確認済みですが、誤り等が含まれていた場合はご了承ください。
