1.内容
秋月電子通商で販売されている,ネットワークの利用が可能な「AKI-H8/3069F」とMacromediaFlashを使って,FLASHでH8を操作してみようという企画です.で,核となるのはやはりネットワークを用いるという部分です.「AKI-H8/3069F」は,みついわゆきお氏が開発を進めているH8/OSやMESといったH8上で動作するOSを利用することで,簡単にネットワークプログラミングが可能となっています.H8に載せるプログラムによってUDP・TCP通信はもちろん,webサーバやDHCPサーバのプログラミングができるようになっています.
ところで,なぜFlashを用いるのか?,VBなどを使ってプログラミングしてもよいのでは?という疑問が出てきます.これは,Flashの特徴も生かした上で実現しようという試みだからです.Flashは,ブラウザ(もちろんFlashPlayerプラグイン導入済みのもの)があれば実行が可能であるという汎用性の高さと,簡単にインタラクティブ・ダイナミックなインタフェースを作ることができるという特徴があります.加えて,webで主に利用されているFlashがハードウェアであるH8を,ネットワークを介して簡単に操作できる…という点で,今までにあまり無かった試みではないかという考えも含まれているからです.
まぁ,個人的には楽しめるかなぁという位置づけになっているので,展望としては一般家電を簡易的なネットワーク家電製品化,家でできるインタラクティブなユーザインタフェースでハードウェア操作などなどがあります.
2.必要なもの
この内容を進めるには,「AKI-H8/3069F」相当品とMacromediaFlashが必要です.これが無いと,何もできません.ですが,FlashではなくVBやVC++などでも,H8に信号は送ることができるのでH8側のプログラミングで参考になるかもしれません.
3.H8プログラミング
H8側は,Flashからの接続を受けるためのプログラミングを行います.
ひとまず,コードを貼り付けてみます.
#include <mes2.h>
#include <math.h>
#include "3069freg.h"
void adinit(void);
int gADC(void);
int scale(double n);
int main(int argc, char **argv) {
int port, sk, cl, n, ip, buff_len, sd, gad;
double alpha,jml,J;
struct sockaddr myaddr, addr;
char buf[100];
char buff[64];
adinit();
sd=open("lcd0",0);
port = 11111;
if(argc == 2) sscanf(argv[1], "%d", &port);
sk = tcp_socket(0);
myaddr.sin_port = port;
tcp_bind(sk, &myaddr);
tcp_listen(sk, 1);
printf("Server start...\r");
for(;;) {
cl = tcp_accept(sk, &addr);
ip = addr.sin_addr;
sprintf(buff,"%d.%d.%d.%d:%d\r", (ip>>24)&0xff, (ip>>16)&0xff, (ip>>8)&0xff, ip & 0xff,addr.sin_port);
printf(buff);
buff_len=strlen(buff);
write(sd,buff,buff_len);
tcp_write(cl,"Accepted!\n",11);
while(1){
n=tcp_read(cl, buf, 100);
if(n < 0) break;
printf(buf);
if(strstr(buf, "quit") != 0) {
printf("quit");
ioctl(sd, 0, LCD_CLEAR);
write(sd,"quitデ,セツダン",12);
break;
}
if(strstr(buf, "stop") != 0) {
printf("stop");
tcp_free(cl);
printf("Server stopped.\n");
ioctl(sd, 0, LCD_CLEAR);
write(sd,"stopデ,セツダン",12);
close(sd);
return 0;
}
if(strstr(buf,"AD")!=0){
ioctl(sd, 0, LCD_CLEAR);
printf("AD\n");
AD.CSR.BIT.ADST=1;
gad=gADC();
if((AD.CSR.BIT.ADF==1)&&(AD.CSR.BIT.ADST==0)){
sprintf(buff,"AD:%d\0",gad);
buff_len=strlen(buff);
write(sd,buff,buff_len);
AD.CSR.BIT.ADST=0;
buff_len=strlen(buff);
tcp_write(cl,buff,buff_len);
}
}
tcp_write(cl, "\0", 2);
}
}
}
void adinit(void){
PA.DDR = 0x0f;/*入出力設定*/
AD.CSR.BYTE=0x00;/*A/D設定*/
AD.DRA=0x00;
}
int gADC(void){
/*A/Dデータの変換*/
int a,b;
a=ADDRA>>6;
a=0x3ff&a;
printf("ADDRA :%d\r",a);
b=ADDRB>>6;
b=0x3ff&b;
printf("ADDRb :%d\r",b);
return a;
}
int scale(double n){
int i=0;
while(((int)n/10)>0){
i++;
n=n/10;
printf(".\n");
}
return i;
}
解説は次回・・・.
続く・・・
[ b a c k ]