Posts Tagged ‘LM35’

Frisk Mega88 on FreeBSD7.2 with libusb

Thursday, July 16th, 2009

FreeBSDのlibusbがちょっと違うらしいと思っていたんだけど、そうでも無いらしい。

FreeBSDでは、USBデバイスの認識をumassやukbdやulptとして認識する。
vusbを使ったFrisk Mega88(名前決めてないや)はHIDとして認識するようにしているので、WindowsやMacでは、ドライバ不要で使えたりする。FreeBSDでもhidでバイスは、uhidとして認識されるわけだが、どうやらFreeBSDのlibusbはuhidで認識されたデバイスにアクセスできないらしい。

FreeBSDのlibusbは汎用のUSBデバイスであるugenとして認識できたデバイスだと上手く操作出来るらしい。

ということをGoogle様で探してLipwoodさんのところで見つけた。
LipwoodさんはUSB-IOというデバイスをFreeBSD上でlibusbを使って動作させたということなので、早速実験してみた。

まず、Frisk Mega88をそのままFreeBSDマシンのUSBに接続する。
uhid0: on uhub1
やはりuhidで認識されている。

ここで、コマンドを叩いてみる。
# ./getemp
Could not find USB device “GETTEMPDev”
となり温度情報を取得することが出来ない。

というわけで、uhidをカーネルコンフィグからコメントアウトしてカーネルの再構築を実行。
待つことしばし。

reboot後、Frisk Mega88をFreeBSDマシンに接続。こんどは、
ugen0: on uhub1
という訳で、ugenデバイスとして認識している。

んじゃってことで、コマンドを叩いてみる。
% ./getemp
Could not find USB device “GETTEMPDev”
ダメじゃん!何かが違うんだろうなorz…

しばらくして、ふとrootでコマンドを叩いてみたら
# ./getemp
28.6
#
いぇい!まんまと温度を取得することが出来た。

そうか管理者権限が無いと出来ないらしい。
試しにPWM(一応組み込んではある。ドライブは出来ないだろうけど)の設定をしてみるとLEDの明るさを換えることができる。
# ./getemp 1
#
ついでにステータスも取得してみる。
# ./getemp status
Duty is 1
#

んじゃ、シェルスクリプトで温度取得をぶん回してみる。
# sh gett.sh
26.7
26.8
:
#
100回でも500回でも大丈夫らしい。

次は実験機に組み込んでみようと思う。

# そういえば、AVRライターであるHIDspxをFreeBSDで使ってみよ。
# 認識はするけど、使えないって
# 何処かに書いてあったような無かったような。
# もしかしら今の状態だと使えるかもしれないし。

avrで温度計測 – LM35

Friday, May 29th, 2009

m88_temp

セイゴとセイギョさんの日記超「いいかげんな」AVRマイコン入門 WinAVR編を殆ど使わせていただき、ATMega88と温度センサーICであるLM35DZを使って温度を測定することが出来た。

今回は、テストなので、LEDで確認できれば、オッケーなので、温度センサーで取得した値をPORTDに下位8bitとPORTBの0と1に上位2bitを出力してみた。

あと、ADCのリファレンス電源は、内部1.1Vを使った。セイゴとセイギョさんは外部にリファレンス電源を持っていたようだけど、これも実験なので単純化した。


#include
#include 

void port_init(void)
{
	PORTB = 0xFF;
	DDRB  = 0xFF;
	PORTC = 0x00;
	DDRC  = 0x00;
	PORTD = 0xFF;
	DDRD  = 0xFF;
}

//TIMER0 initialize
void timer0_init(void)
{
	TCCR0B = 0x00;
	TCNT0  = 0x64;
	TCCR0A = 0x00;
	TCCR0B = 0x05;
}

ISR(TIMER0_OVF_vect)
{
	TCNT0  = 0x64;
	ADCSRA = 0xCF;
	PORTB  = 0x01;
}

//ADC initialize
void adc_init(void)
{
	ADCSRA = 0x00;
	ADMUX  = 0xC0;
	ACSR   = 0x80;
	DIDR0  = 0x01;
	ADCSRB = 0x00;
}

ISR(ADC_vect)
{
	unsigned char vh,vl;

	vl = ADCL;
	vh = ADCH;
	PORTB = (vh & 0x03);
	PORTD = vl;
}

// call this routine to initilize all peripherals
void init_devices(void)
{
	cli();
	port_init();
	timer0_init();
	adc_init();

	MCUCR = 0x00;
	EICRA = 0x00;
	EIMSK = 0x00;

	TIMSK0 = 0x01;
	TIMSK1 = 0x00;
	TIMSK2 = 0x00;

	PCMSK0 = 0x00;
	PCMSK1 = 0x00;
	PCMSK2 = 0x00;
	PCICR  = 0x00;
	PRR    = 0x00;
	sei();
}

int main(void)
{
	init_devices();

	PORTD = 0xFF;

	while(1) {
		;
	}

	return(0);
}