/********************************************************************** * bishamonten.c * 毘沙門天動作プログラム * 動作確認環境:AT互換機+FreeBSD3.1R+gcc2.7.2.1 * 注:/dev/ppi0に書き込み、読み出し許可が出してあること * * V0.0 2003/06/20 K.Takasugi T.Fujii パラレルポートの制御に成功 * V1.0 2003/06/23 T.Fujii ベースのプログラムを作成 * V1.1 2003/06/24 K.Takasugi コップサイズ,缶サイズによる分岐の追加 * V1.2 2003/06/25 T.Fujii K.Takasugi 秒以下の計測を可能にした * V1.3 2003/06/26 T.Fujii ブレーキ機能の追加 * V1.4 2003/06/27 T.Fujii 設定をdata.txtから読み込むようにした * V1.5 2003/07/02 K.Takasugi T.Fujii テキストデータ読み込みの改良 * V1.6 2003/07/11 K.Takazugi T.Fujii 完成版 **********************************************************************/ #include #include #include #include #include #include int main(void); void motor(int,double,u_int8_t); void motorC(int,double,u_int8_t); void touch(int); void brake(int,double); void dataload(double[]); int main(void) { int fd,can_size,i,a; char cup_size,yesno; double xtime; u_int8_t zero,zeroC; double mo[50]; fd=open("/dev/ppi0",O_RDWR,0600); if(fd < 0){ fprintf(stderr,"Failed to open /dev/ppi0\n\a"); exit(0); } zero=0x0; ioctl(fd,PPISDATA,&zero); zeroC=0x0b; ioctl(fd,PPISCTRL,&zeroC); while(1){ dataload(mo); printf("ボ〜トルトルトル\n"); /**缶をはさむ**/ printf("缶を挟む(%lf秒) 飲んで飲んで〜\n",mo[1]); motor(fd,mo[1],0x20); brake(fd,mo[0]); printf("おもりを載せておくれ"); getchar(); /**缶を上昇**/ printf("缶を上昇 ボ〜トルトルトル\n"); motorC(fd,mo[2],0x09); brake(fd,mo[0]); printf("タブ位置うごかすぞ?"); getchar(); /**タブ位置合わせモーター起動**/ printf("タブ位置合わせ(%lf秒)\n",mo[3]); motor(fd,mo[3],0x40); brake(fd,mo[0]); /**微妙に傾き修正**/ motor(fd,0,0x04); touch(fd); brake(fd,mo[0]); /**タブ開けモーター起動**/ printf("タブ開け(%lf秒)\n",mo[4]); motor(fd,mo[4],0x01); brake(fd,mo[0]); /**タブ開け部を元に戻す**/ printf("タブ開け部もどし(%lf秒)\n",mo[5]); motor(fd,mo[5],0x02); brake(fd,mo[0]); printf("タブ位置合わせ部はずし(%lf秒)\n",mo[6]); motor(fd,mo[6],0x80); brake(fd,mo[0]); /**缶を下降**/ printf("缶を下降(%lf秒)\n",mo[7]); motorC(fd,mo[7],0x0a); brake(fd,mo[0]); /**缶を傾ける**/ for(i=0;i<3;i++){ printf("缶を傾けます(%lf秒)\n",mo[8+i]); motor(fd,mo[8+i],0x08); printf("缶を停止(%lf秒)\n",mo[11]); brake(fd,mo[11]); /**缶を戻す**/ printf("缶を戻す\n"); motor(fd,0,0x04); touch(fd); motor(fd,0.25,0x08); brake(fd,1); if(i<=1){ printf("もう一杯いっとく?(Y or N):"); fpurge(stdin); scanf("%c",&yesno); if(yesno=='n' || yesno=='N'){ printf("しゃーなしやぞ\n"); break; } printf("いいねぇ\n"); } else{ break; } } printf("おもりを放してください"); fpurge(stdin); getchar(); /**缶を下降**/ printf("缶を下降(%lf秒)\n",mo[12]); motorC(fd,mo[12],0x0a); brake(fd,mo[0]); /**缶を放す**/ printf("缶を放す(%lf秒)\n",mo[13]); motor(fd,mo[13],0x10); brake(fd,mo[0]); /**タブ位置合わせ部初期位置**/ motor(fd,mo[14],0x40); brake(fd,mo[0]); /**傾け調整**/ motor(fd,mo[14],0x08); brake(fd,mo[0]); printf("もう一本いっとく?(Y or N):"); while(1){ fpurge(stdin); scanf("%c",&yesno); if(yesno=='n' || yesno=='N'){ printf("お前はもう死んでいる\n"); goto end; } else if(yesno=='y' || yesno=='Y'){ printf("ボトル入りま〜す!\n"); break; } else{ printf("どっちやねん!\n"); } } } end: close(fd); exit(0); } /**DATAポートを使ったモーター制御関数**/ void motor(int fd,double t,u_int8_t spin) { clock_t t1,t2; t1=clock(); ioctl(fd,PPISDATA,&spin); while(1){ t2=clock(); if((double)(t2-t1)/CLOCKS_PER_SEC>=t && (double)(t2-t1)/CLOCKS_PER_SEC<=(t+1)){ break; } } } /**CTRLポートを使ったモーター制御関数**/ void motorC(int fd,double t,u_int8_t spin) { clock_t t1,t2; t1=clock(); ioctl(fd,PPISCTRL,&spin); while(1){ t2=clock(); if((double)(t2-t1)/CLOCKS_PER_SEC>=t && (double)(t2-t1)/CLOCKS_PER_SEC<=(t+1)){ break; } } } /**タッチセンサーを認識する関数**/ void touch(int fd) { u_int8_t st1,st2; ioctl(fd,PPIGSTATUS,&st1); while(1){ ioctl(fd,PPIGSTATUS,&st2); if(st2!=st1){ break; } } } /**ブレーキ機能用の関数**/ void brake(int fd,double t) { clock_t t1,t2; u_int8_t val; t1=clock(); val=0xff; ioctl(fd,PPISDATA,&val); val=0x04; ioctl(fd,PPISCTRL,&val); while(1){ t2=clock(); if((double)(t2-t1)/CLOCKS_PER_SEC>=t && (double)(t2-t1)/CLOCKS_PER_SEC<=(t+1)){ break; } } val=0x0; ioctl(fd,PPISDATA,&val); val=0x0b; ioctl(fd,PPISCTRL,&val); } /**テキストファイルから時間を取得**/ void dataload(double load_data[]) { FILE *fp_load; char dmy[100]; int i; if((fp_load=fopen("data.txt","r")) == NULL){ printf("Can't open files\n"); exit(0); } for(i=0;;i++){ fscanf(fp_load,"%s %lf",dmy,&load_data[i]); if(ferror(fp_load)){ break; } if(feof(fp_load)){ break; } } fclose(fp_load); }