ともさんのHP >ものつくり >2次元CCDを使った自作カメラ >天体写真用冷却CCDカメラの製作(パソコン-マイコン間通信)
天体写真用冷却CCDカメラの製作(パソコン-マイコン間通信)
パソコン-マイコン間通信
パソコンと マイコン 楽天 との間で通信するプログラムを作ってみます。マイコンはh8/3069FというLANを使えるものなので、これを使ってUDP通信をします。パソコン側はJAVAを使って制御します。ここにおいてあるのは通信チェック用のもの。
マイコン側のプログラムはこちら
#include <h8/reg3067.h> #include <h8/syscall.h> #include <string.h>
int udp(unsigned short port, struct sockaddr_in *addr); int main(void); void methA( void ); void methB( void );
struct sockaddr_in addr ;
//flug=1のとき、UDP受信あり int flug ; //パソコンから受ける命令が入る入れ物 unsigned char meirei ; //dataの入れ物 unsigned char datam[10]; //外付けRAMへDataをおくためのポインタ unsigned char *data;
//UDP受信時の処理 int udp(unsigned short port, struct sockaddr_in *addr) { if ( port != 123) {return 0;} udp_read(datam, 10); meirei = datam[0] ; // udp_write( &meirei , sizeof(meirei) ); flug = 1; return 0; }
int main(void) { int f = 0; int I; flug = 0; //外付けRAM(0x400000~)へDATAを入れる data = 0x400000 ; for( I=0;I<30000;I++) { *data = 'A'; data = data + 1 ; } for( I=0;I<10;I++){ datam[I]='T'; }
ether_init(0x200000); ip_setup(IPADDR(192,168,0,7), IPADDR(255,255,255,0)); udp_regport(udp); addr.sin_addr=IPADDR(192,168,0,8) ; addr.sin_port=123 ; set_udpaddr(&addr,0) ; udp_write(datam,sizeof(datam)); // udp_write(datam,10); /* data = 0x400000; udp_write( data , 1000 ); udp_write( data , 1200 ); udp_write( data , 1300 ); udp_write( data , 1400 ); udp_write( data , 1500 ); */
while (f==0){ //UPDDATA受信時の処理 if( flug == 1) { switch( meirei ) { case 'A' : methA(); break; case 'B' : methB(); break; default: break; //addr.sin_addr=IPADDR(192,168,0,8) ; addr.sin_port=123 ; set_udpaddr(&addr,0) ; //udp_write(datam,10); } flug = 0; } }
return 0; }
void methA( void ) { int I; data = 0x400000; addr.sin_addr=IPADDR(192,168,0,8) ; addr.sin_port=123 ; set_udpaddr(&addr,0) ; for( I=0;I<30;I++){ udp_write( data , 1000 ); data = data + 1000 ; } return; }
void methB( void ) { int I; addr.sin_addr=IPADDR(192,168,0,8) ; addr.sin_port=123 ; set_udpaddr(&addr,0) ; udp_write( datam , 10 ); return; }
|
このプログラムを動かすと、マイコンはまず10バイトのDATAをパソコンへ送付し、パソコンからの返事を待ちます。
パソコンからDATAを受け取ると、受け取ったDATAに応じた処理に分岐します。
Aを受け取ると、マイコンのメモリにためておいた30KバイトのDATAをパソコンへ送付します。Bを受け取ると、10バイトのDATAを返送します。
実際のプログラムではAを受け取ったらステッピングモーターを動かす。BならCCDの露光開始...というように受け取ったDATAごとに作業を割り当ててゆきます。
パソコン側のプログラムはこちら。
package tomolib.net;
import java.io.*; import java.net.*; import tomolib.net.*;
/** * 虎ス名:Url <BR> * 処理概要:データグラムのパケットの受信を行うクラス<BR> * 作者:TomoyukiIto<BR> * 履歴: <BR> * 2003/06/20 製作<BR> */
public class Udp {
/** ポート番号 */ public int PORT = 123; /** Mデータの最大長 */ public int MAX_LENGTH = 1500; /*MDATAの入れ物*/ public byte[] tmpdata; public byte[] data; private DatagramSocket socket; private DatagramPacket packet; public InetAddress server;
/** * メソッド:iniUdp( int port ,String ipadress )<BR> * 引数:port:ポート番号の指定<BR> * 引数:ipadress:通信相閧フIPアドレス<BR> */ public void iniUdp( int port ,String ipadress ) throws Exception { PORT = port; server =InetAddress.getByName( ipadress ); try{ socket = new DatagramSocket( PORT ); }catch( SocketException e ) {throw e; } catch( IOException e ) {throw e; } }
/** * 區・゙:public byte[] receive( int mmsec )<BR> * 引数:待ち時間(mmsec)<BR> * 機能:UPDからDATAがはいるのを待つ。入ればDATA配列を返す<BR> * 返り値:ッ取ったdataのBYTE配列<BR> * 設定時間を過ぎてもDATAを受け取らなかった場合はnullを返す。<BR> */ public byte[] receive( int mmsec ) //throws Exception { byte[] b = null ; data=null; tmpdata = new byte[MAX_LENGTH]; packet = new DatagramPacket( tmpdata, MAX_LENGTH ); try{ socket.setSoTimeout(mmsec); socket.receive( packet ); }catch( Exception e ) { return b; } int length = packet.getLength(); b = new byte[ length ] ; for( int I=0;I<length;I++){ b[I]=tmpdata[I]; } data = b; return b; }
/** * 區・゙:public void send( String senddata )<BR> * 引数:発送するDATA<BR> * 機能:IPアドレスにデータを発送する<BR> * 返り値:なし<BR> * <BR> */ public void send( String senddata ) throws Exception { byte[] sdata = senddata.getBytes(); packet = new DatagramPacket( sdata, sdata.length , server, PORT ); try{ socket.send( packet ); }catch( SocketException e ) { throw e; } }
/**動作確認*/ public static void main( String argv[] ) { Udp u = new Udp() ; try { u.iniUdp( 123 , "192.168.0.7" ); }catch( Exception e ) { System.out.println( "初期化失敗" ) ; System.exit(-1); }
u.receive(0); String message = new String( u.data, 0, u.data.length ); System.out.println( message );
try { u.send( "A" ); }catch( Exception e ) { System.exit(-1); } for(int I=0;I<30;I++) { u.receive(0); message = new String( u.data, 0, u.data.length ); System.out.println( message ); }
try { u.send( "B" ); }catch( Exception e ) { System.exit(-1); } u.receive(0); message = new String( u.data, 0, u.data.length ); System.out.println( message );
}
}
|
こちらも試験用のプログラム。これを走らせると...
①DATA受信を待ち、受け取ったら受け取ったDATAを画面に表示。
②文字Aを発送し、マイコンから返送されてくる30KバイトのDATAを受け取って画面に表示
③文字Bを発送し、マイコンから返送されてくる10バイトのDATAを受け取って画面に表示
の順に作業します。
実用プログラムではボタンをクリックしたらAがマイコンに送付されてモータが動いたり...時間になったらCCD露光を開始する、
といったふうにする予定。
最終更新日: 2003-06-20 00:00:00
ともさんのHP >ものつくり >2次元CCDを使った自作カメラ >天体写真用冷却CCDカメラの製作(パソコン-マイコン間通信)
ツイート