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側のプログラムを実行します。

21760_01プログラムを実行すると、右図のような画面が開きます。
「直進」・「左」・「右」・「後退」ボタンをクリックすることで、EV3の動きを制御します。
「終了」ボタンをクリックすると、EV3との接続が終了します。
画面は「×」ボタンで閉じます。

?

?※Java(leJOS)で作成したプログラムによるPCとEV3間のTCP/IP通信制御方法の一例として紹介しています。
※プログラムは動作確認済みですが、誤り等が含まれていた場合はご了承ください。

SPIKE