BeagleBoneには、8つの12bit A/D変換がついています。
最大入力電圧は1.8Vとなっています。
今回は温度センサ LM35DZをつなげて、温度測定してみることにしました。
LM35DZは、0℃から100℃まで計測できる温度センサで、出力は10mV/℃となっています。
動作電圧は4V~20Vなので、今回はSYS_5Vから電源を供給しています。
LM35DZの出力を、AIN0(P9の39ピン)に接続し、温度測定を行いました。
時刻もNTPで補正できるので、簡易温度ロガーとしてすぐに使えそうな感じです。
今回のソースコードは以下の通りです。
/* *Beagle Bone *Sample code for analog input. */ #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <time.h> //LM35D float VoltageToTemp(float voltage) { //LM35D 10.0mV/Celsius return voltage*1000/10; } void printCurrentTime() { // time_t t; struct tm *s_time; char str[100]; (void) time(&t); s_time=localtime(&t); fprintf(stdout,"%4d-%02d-%02d %02d:%02d:%02d",1900+s_time->tm_year,s_time->tm_mon+1,s_time->tm_mday, s_time->tm_hour,s_time->tm_min,s_time->tm_sec); } //Convert digitalvalue to voltage. float digitalValueToVoltage(int digValue) { int analogResolution=4096;// 12bit A/D converter in BeagleBone float voltage=0; float maxInputVoltage= 1.8f; float rate=(float)(maxInputVoltage/analogResolution); return (float)(rate*digValue); } int main() { int filedescriptor=open("/sys/devices/platform/tsc/ain1", O_RDONLY); fprintf(stdout,"start templuture monitoring\n"); char buffer[128]; while(1) { int readcount=read(filedescriptor,buffer,sizeof(buffer)); if(-1!=readcount) { buffer[readcount]=NULL; lseek(filedescriptor,0,0);//reset seek position int digitalValue=atoi(buffer); float voltage=digitalValueToVoltage(digitalValue); float templuture=VoltageToTemp(voltage); printCurrentTime(); fprintf(stdout," ReadValue:%d\tVoltage:%2.3fV\tTemplture:%2.1f\n",digitalValue,voltage,templuture); } else { fprintf(stdout,"could not read from ain2\n"); return -1; } sleep(1); } close(filedescriptor); return 0; }
ではまた。
0 件のコメント:
コメントを投稿