ともさんの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;

/** 信データの最大長 */

public int MAX_LENGTH = 1500;

/*信DATAの入れ物*/

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文字Aを発送し、マイコンから返送されてくる30KバイトのDATAを受け取って画面に表示

 B文字Bを発送し、マイコンから返送されてくる10バイトのDATAを受け取って画面に表示

 の順に作業します。

 実用プログラムではボタンをクリックしたらAがマイコンに送付されてモータが動いたり...時間になったらCCD露光を開始する、

といったふうにする予定。

最終更新日: 2003-06-20 00:00:00

ともさんのHP >ものつくり >2次元CCDを使った自作カメラ >天体写真用冷却CCDカメラの製作(パソコン-マイコン間通信)

このエントリーをはてなブックマークに追加
広告
おすすめ記事
新着ページ

fxmlファイルの利用  
雑草でグリーンカーテン  
ウエスト切り替えワンピースの作りかた  
気象観測装置を作りました  
五右衛門風呂の修復  
子ウインドウを開く  
キキョウの栽培、手入れ、増やしかた  
ツリービューにポップアップメニューを追加  
JavaFXでPopupMenu  
竹を曲げる方法  
井戸保護カバーの自作  

私の他のサイト

ともさんの箱庭(ブログ)
家庭菜園
3D-CAD
洋裁CAD

いいねなど

 RSS 
PageSpeedInsights
html5チェック

Author: Tomoyuki Ito

このサイトの文章・写真の無断転載を禁じます