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通信制御方法の一例として紹介しています。
※プログラムは動作確認済みですが、誤り等が含まれていた場合はご了承ください。