>お楽しみコーナー>Linux>Linuxで計測 サイトマップ 最終更新日:2005/07/22

センリュウのホームページへ ようこそ!

 LINUXで計測  1 

Interface社製PCI−3171Aを使用した計測プログラム(化学実験用)
印刷の絵柄面積測定用(インク出しの調整に使う)に開発したものです。PCI−3171Aはこの種では定価29800円と低価格なので使ってみることにしました。1万円以下だともっと普及すると思うのですが……。

サンプルプログラムのダウンロード

 使用方法
Redhat7.0J(配布版の全てインストール)なら確実に動きます。TurboLinux6.0などで起動できないときは、/sampling/sampling.cの最初の#define FONT1 "******"等を編集して、makeし直すと大丈夫です。

@まず前提的に、interface社のホームページからドライバ等をダウンロードし、その指示に従ってインストールしておいて下さい。
 なおこのとき、ドライバが自動的に識別できずcp3100.oが /lib/modules/2.2.**/misc/ 等々にインストールされない場合は、手動でカーネルバージョンに合ったドライバ・ファイル(cp3100.o)を所定のモジュール・フォルダにコピーしておいて下さい。
A次にここのページからダウンロードしたsampling.tar.gzファイルをディスクトップに解凍します(プログラムの都合上、必ずディスクトップに!)。
 /interface/以下にファイルができます。
B/interface/interface1/project/src/project または /interface/interface2/project/src/project が実行ファイルです。どちらかを起動して下さい。
 interface1のものは一定時間ごとに自動的に電圧を計測します。
 interface2のものはIN1端子とDCOM端子を使って(スイッチをつけてショートさせる)、手動でサンプリングしていくというものです。
C計測結果はdataファイルとして保存されます(project実行ファイルのあるところにできます)。

実際の使用例(様々なセンサーを取り付けてみる)


プログラムについて

@projectディレクトリのものは、GTK+のgladeで作ったものです。callbacks.cを入れておきましたので参考になると思います。
 これは、計測前の諸設定をおこないます。
Asamplingディレクトリのものは、X11の原始的な方法で作りました。
 これが、サンプリングを行います。
Bprojectがsamplingをコマンドとして呼び出して実行するようになっています。


X11プログラミングの例
/interface/interface1/sampling/sampling.cを示しておきます。
スレッドを使って、基本描画+イベント処理と計測(その描画)を分けています。

#include <X11/Xlib.h>
#include <X11/Xutil.h>

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "fbiad.h"
#include <signal.h>
#include <time.h>

#define SMPLNUM 100
#define SMPLFREQ 1000
#define FONT1 "variable"
#define FONT2 "-urw-helvetica-bold-r-normal--42-401-75-75-p-234-iso8859-1"
//#define FONT1 "-Bitstream-Charter-Medium-R-Normal--14-100-100-100-P-78-ISO8859-1"
//#define FONT2 "-bitstream-charter-medium-r-normal--75-721-75-75-p-417-iso8859-1"

int sw=0;
int dnum;
FILE *fp;

Display *d;
Window wr, w1, w2, wb;
GC gc, gc1, gc2, gcb;
unsigned long black,white;
XColor red,green;
Pixmap pr, p1, p2, pb;



int main(int argc, char *argv[])
{
pthread_t th1;
struct tm *systime;
time_t t0, t;
void th_func();
void draw_w1base(unsigned long c);

int ch, sf, timer;
int ret, i=1, k=0, l=0;
ADSMPLREQ Conf;
unsigned short smplData[SMPLNUM];
unsigned long sumData=0;
unsigned long smplNum=SMPLNUM;
void sig_fnc();
//void wait(int msec);

int val, valg=0, valg2;
char s[16];

system("clear");

dnum=atoi(argv[1]);
ch=atoi(argv[2]);
sf=atoi(argv[3]);
timer=atoi(argv[4]);

ret = AdOpen(dnum);
if(ret){
printf("open error:ret=%x\n", ret);
exit(EXIT_FAILURE);
}

if((fp=fopen("./data","w"))==NULL)
{
printf("can not open data_file!");
exit(EXIT_FAILURE);
}

AdGetSamplingConfig(dnum, &Conf);
Conf.ulSmplNum=SMPLNUM;
Conf.ulChCount=1;
Conf.SmplChReq[0].ulChNo=ch;
Conf.fSmplFreq=SMPLFREQ;
AdSetSamplingConfig(dnum, &Conf);

signal(SIGINT,sig_fnc);

pthread_create(&th1, NULL, (void *)th_func, NULL);
while(!sw);

t0=time(NULL);

draw_w1base(black);
XSetForeground(d,gc1,red.pixel);
while(i<=sf)
{
AdStartSampling(dnum, FLAG_SYNC);
AdGetSamplingData(dnum, &smplData[0], &smplNum);
for(l=0; l<SMPLNUM; l++) sumData=sumData+smplData[l];

val=(int)((sumData/SMPLNUM)*10000/4094-5000);
sumData=0;
valg2=valg;
valg=(int)(val*180/5000);

if(k >= 780)
{
draw_w1base(black);
XSetForeground(d,gc1,red.pixel);
k=0;
}
k++;
XDrawLine(d,p1,gc1,k-1,190-valg2,k,190-valg);
XCopyArea(d,p1,w1,gc1,0,0,780,400,0,0);
sprintf(s,"%d mV",val);
XSetForeground(d,gc2,black);
XFillRectangle(d,p2,gc2,0,0,780,80);
XSetForeground(d,gc2,green.pixel);
XDrawString(d,p2,gc2,100,60,s,strlen(s));
XCopyArea(d,p2,w2,gc2,0,0,780,80,0,0);
XFlush(d);

t=time(NULL);

if(difftime(t,t0) > timer*i)
{
systime=localtime(&t);
printf("%.2d/%.2d %.2d:%.2d:%.2d %d : %.d mV\a\n", systime->tm_mon+1, systime->tm_mday, systime->tm_hour, systime->tm_min, systime->tm_sec, i, val);
fprintf(fp,"%.2d/%.2d %.2d:%.2d:%.2d %d : %.d mV\n", systime->tm_mon+1, systime->tm_mday, systime->tm_hour, systime->tm_min, systime->tm_sec, i, val);
sprintf(s,"%d",i);
XDrawString(d,p1,gc1,k,190-valg,s,strlen(s));
XCopyArea(d,p1,w1,gc1,0,0,780,400,0,0);
XFlush(d);
i++;
}

//wait(100);
}

fclose(fp);
ret = AdClose(dnum);
while(1)
{
}

return(0);
}

//////////////////////////////////////////////////////////////////////////////////////////////////

void sig_fnc()
{
int ret;
fclose(fp);
ret = AdClose(dnum);
exit(EXIT_FAILURE);
}

//////////////////////////////////////////////////////////////////////////////////////////////////

void wait(int msec)
{
clock_t start_time=clock();
while((int)((clock()-start_time)*1000/CLOCKS_PER_SEC)<msec);
}

/////////////////////////////////////////////////////////////////////////////////////////////////

void draw_w1base(unsigned long c)
{
XSetForeground(d,gc1,white);
XFillRectangle(d,p1,gc1,0,0,780,400);
XSetForeground(d,gc1,c);
XDrawString(d,p1,gc1,200,385,"200",3);
XDrawString(d,p1,gc1,400,385,"400",3);
XDrawString(d,p1,gc1,600,385,"600",3);
XDrawLine(d,p1,gc1,0,370,780,370);
XDrawLine(d,p1,gc1,0,190,780,190);
XDrawLine(d,p1,gc1,200,0,200,370);
XDrawLine(d,p1,gc1,400,0,400,370);
XDrawLine(d,p1,gc1,600,0,600,370);
XCopyArea(d,p1,w1,gc1,0,0,780,400,0,0);
}

////////////////////////////////////////////////////////////////////////////////////////////////

void th_func()
{
Colormap cmap;
XColor c0;
XEvent event;
int ret;
Font f1,f2;

d=XOpenDisplay(NULL);

black=BlackPixel(d,0);
white=WhitePixel(d,0);

cmap=DefaultColormap(d,0);
XAllocNamedColor(d,cmap,"red",&red,&c0);
XAllocNamedColor(d,cmap,"green",&green,&c0);

wr=XCreateSimpleWindow(d,RootWindow(d,0),100,50,800,530,1,black,white);
XStoreName(d, wr, "sampling_auto");
w1=XCreateSimpleWindow(d,wr,10,10,780,400,1,black,white);
w2=XCreateSimpleWindow(d,wr,10,410,780,80,1,black,black);
wb=XCreateSimpleWindow(d,wr,700,500,50,20,1,black,white);

XSelectInput(d,wr,ExposureMask);
XSelectInput(d,wb,ButtonPressMask);

XMapWindow(d,wr);
XMapSubwindows(d,wr);

pr=XCreatePixmap(d,wr,800,530,DefaultDepth(d,0));
p1=XCreatePixmap(d,w1,780,400,DefaultDepth(d,0));
p2=XCreatePixmap(d,w2,780,80,DefaultDepth(d,0));
pb=XCreatePixmap(d,wb,50,20,DefaultDepth(d,0));

gc=XCreateGC(d,pr,0,0);
gc1=XCreateGC(d,p1,0,0);
gc2=XCreateGC(d,p2,0,0);
gcb=XCreateGC(d,pb,0,0);

f1=XLoadFont(d,FONT1);
f2=XLoadFont(d,FONT2);

XSetFont(d,gc,f1);
XSetFont(d,gc1,f1);
XSetFont(d,gc2,f2);
XSetFont(d,gcb,f1);

XSetForeground(d,gc,white);
XSetForeground(d,gcb,black);

XFillRectangle(d,pr,gc,0,0,800,530);
XFillRectangle(d,pb,gcb,0,0,50,20);

XSetForeground(d,gc,black);
XSetForeground(d,gcb,white);

XDrawString(d,pr,gc,580,515,"quit : press here =",19);
XDrawString(d,pb,gcb,15,15,"quit",4);

XCopyArea(d,pr,wr,gc,0,0,800,530,0,0);
XCopyArea(d,pb,wb,gcb,0,0,50,20,0,0);

sw=1;

while(1)
{
XNextEvent(d,&event);
switch(event.type)
{
case Expose:
XCopyArea(d,pr,wr,gc,0,0,800,530,0,0);
XCopyArea(d,p1,w1,gc1,0,0,780,400,0,0);
XCopyArea(d,p2,w2,gc2,0,0,780,80,0,0);
XCopyArea(d,pb,wb,gcb,0,0,50,20,0,0);
XFlush(d);

case ButtonPress:
if(event.xbutton.window == wb)

fclose(fp);
ret = AdClose(dnum);
exit(EXIT_FAILURE);
}

}
}
}