Archive for the ‘AVR’ Category

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で使ってみよ。
# 認識はするけど、使えないって
# 何処かに書いてあったような無かったような。
# もしかしら今の状態だと使えるかもしれないし。

Frisk mega88 five

Tuesday, July 14th, 2009

久しぶりに電子工作三昧な日を過ごすことができ、一気にFrisk ATmega88モジュールを仕上げた。

まずは、FRISKのケースに合わせてユニバーサルボードをカットする。
board
Friskのケースにユニバーサルボードを合わせると10×25のサイズになり、秋月のボードからは3枚取れるらしい。
カットは、切り口とサイズが奇麗なピラニア ノコできっていたんだけど、かったるくなったので鉄パイプを切るノコギリに換えた。
こちらの方が、ノコギリの歯の幅と穴のサイズが同じ位で意外と調子が良かった。

穴の位置で切ると少し大きめなので、後はひたすら紙ヤスリで削る!
sanding

というわけで、サイズを合ったら部品を載せて、これもひたすらハンダ付け。
atmega88_fives
で、前に一つ作っていたので、合計5個のFrisk mega88モジュールができた。

上手い具合に秋月のWebに載っているシングルピンソケットが高さも丁度良くはまりプログラミング用のコネクタも付けることが出来た。

最終的な実体配線図チックな回路はこうなった。青の破線は、部品面でジャンパーしている。
基板の外側を回っているのは、ワイヤーでジャンパーのイメージ。
動いているので大丈夫だと思うけど、参考にするならYour Own Riskでよろしく。
frisk_rev22

課題としては、
ADCのノイズ対策をしていないこと。
ADCのリファレンス電源。
USB供給の電源のノイズ具合はどうなんだろう?
というところかなぁ。

これで、実機に組み込んでというところで大問題が!
温度を測ろうと思っていたのは、ATOM兄弟。OSはFreeBSD7.2がのっているのだが、FreeBSDでは、libusbがちょっと違うらしくデバイスは認識されるんだけど、コマンドに応答してくれない。:-(

う〜ん、困ったなぁ。
まっハードは出来たってことで良しとするか。
まだまだ道のりは遠いですな。

Mega88をFRISKケースに入れてみた -VUSB Exampleの実行

Thursday, June 25th, 2009

mega88-frisk

ライターをFRISKケースにまんまと仕込み、勢いでブレッドボードでテストしていた温度測定用のATmega88もFRISKケースに無事に納めることができた。
#ケースの真ん中に穴があいているのは
#やっぱり心配だったのでICソケットを使った。
#しかし部品少ないな。

その後、しばらくAVRに触れることが出来なかったんだけど、少し時間を作って触ってみた。

VUSB -A.K.A avr-usb – のexampleであるcustom-classは、今までMac OSXで作業していたんだけど、何となくWindows XPに接続してみたところ、コード10のエラーが出て、USB HID(ヒューマン インタフェース デバイス)として認識してくれない問題が出た。試しにLinuxに接続してみたけど、やっぱり認識してくれない。
なぜかMac OSXだけ認識する状態。

回路を色々みてまわったところ、異なる箇所は、

  • USBのD-, D+の抵抗値が68Ω。今回は、75Ωを使った。
  • ツェナーダイオードに3.6V。今回は、3.3Vを使った。
  • 発振子は12MHz。今回は、16MHz。

抵抗と発振子をそれぞれ68Ωと12MHzにしてWindows XPに接続したけど、ダメ。

タイミング良く3.3V出力の3端子レギュレータが手に入ったので、ツェナーダイオードを外して、全体を3.3V で駆動するようにしたけどやっぱりダメ。

千秋さんのところでHIDaspxがmega88で動作させるプロジェクトがあるのを思い出して、除いてみた所、irukaさんのところで、mega88を使ったHIDmonとHIDaspxを公開されていた。
早速ダウンロードし、自作ライターで件のmega88にfirmwareを書き込んで、Windows XPに接続すると、ちゃんとUSB HIDで認識するじゃあーりまんせんか!

ためしにハードの構成を、ダメだとおもっていた構成に、つまり抵抗75Ω、発振子16MHz、ツェナーダイード3.3VにしてもちゃんとWindows XPはHIDとして認識する。
なーんと、firmwareの問題だった。というか、またまた先人に助けられたわけだけど、ハードとソフトの切り分けが出来たのは本当にありがたいです。

さて、firmがどこが違うかは、首から下の作業。(当然違う箇所があるのだけど、ある程度目星を付けて見て行った)

■ usbconfig.h

  • USB_CFG_DEVICE_CLASS 0xff -> 0 にする。
  • USB_CFG_INTERFACE_CLASS  0 -> 3 にする。

Windows XPに繋いでみるとHIDデバイスと自動で認識する。おぉぉぉ〜〜〜〜

でも、まだだめ。コード10のエラーが出て、デバイスマネージャで認識されてない。

■ usbconfig.h

  • USB_CFG_HID_REPORT_DESCRIPTOR_LENGTHのコメントを外す

■ main.c

  • PROGMEM char usbHidReportDescriptorを設定する。

これは、内容を今ひとつ解読していないので、HIDmon-mega88のmain.cからコピーした。

なんとなく、いけそ〜な、気がする〜!
繋いでみた。おっ、おっ、HIDとして認識してくれた。
commandlineからアクセスしてみると…ちゃんと温度情報を応答した。

というわけで、VUSBのExampleはデフォルトでは何らかのドライバが必要なのかな?
HIDとして認識させるには、usbconfig.hのHIDに関連する項目の設定とusbHidReportDescriptorが必要ということですな。

よし!材料は揃ったぞ。

FRISK -AVR- WRITER

Friday, June 12th, 2009

frisk_writer

というわけで、早速FRISKのケースに入れたライターを作ってみた。
前例もあるので大丈夫だとは思っていたけど、あっさり出来た。

ちょっと不安だったのは、FRISKケースに入れた例はどれもパターンをプリントした物で、汎用基板では作っていないこと。
逆に作ってから判ったのは、

  • ICソケットが使えない。(高さが足りない)
  • 2列ピンヘッダは使えない。(これも高さが足りなさそう。無理すれば大丈夫かも
  • 直径3mmのLEDでもふたに干渉する。(穴をあけなくても良いかと思っていたけど、ふたがきっちり閉まらない)
  • FRISKケースの加工はとても簡単。(ドリルの歯で簡単に穴があけられる。手回しでね)その後、カッターで微調整

最初は、ICソケットが使えると思っていただけけにAVRを直接ハンダ付けしなければならなかった。ハンダ付けはそれほど上手くないのでドキドキだった。

回路は QRP-HomeBrewersさんのものを参考にというか、ほぼそのまま使わせて頂きました。ISPの端子もそのまま。

回路図だけではイメージできないので水魚堂さんの回路図エディタを使って実体配線図チックに絵を描いてみた。
frisk_rev2

下側のが今回作ったHIDaspxのライター。上は、温度測定モジュールのつもり。本当は、8pinのattiny45あたりでも十分なんだけど、秋月で入手できるatmega88の方がコストパフォーマンスがいいんだよな。

あっ、2列のピンヘッダは並ばなさそうなので直さなくっちゃ。

FRISKのケースに入るかな

Thursday, June 11th, 2009

frisk_board

AVR温度測定プロジェクトは、なんとかAVRで温度を測り、USBでデータを取得することが出来そうになって来た。

AVRで定期的に温度を測定して、定期的にUSBやシリアルでデータを吐き出すようにしても良かったんだけど、何となくHOSTであるPCからデータ要求し、AVRで温度情報を応答する方式にしたかった。

FRISKのケースに合わせて基板をカットしてみた。FRISKのケースに合わせると2.54mmピッチで10×25の大きさとなる。

秋月の片面紙エポキシ・ユニバーサル基板 Bタイプからだと3つ基板を切り出せる。

ライターは、USBミニBタイプのコネクタを付けようと思っている。

温度測定モジュールは、pinヘッダーでUSB接続しようと考えているところ。

VUSB a.k.a. AVR-USB

Wednesday, June 3rd, 2009

VUSB-LED

USBで温度計測をするための実験を続けているんだけど、温度が測れたので次は、USBで制御できるか実験してみた。

ドライバ不要でAVRにプログラムを書き込めるHIDaspxでも使っているV-USBのサンプルを動作させてみた。

サンプルは、V-USBをダウンロードし展開するとexampleディレクトリにあるcustom-classをコンパイルしたコマンドラインのプログラムとAVRに書き込むfiremware。ターゲットとするAVRはATMega168を使ったMetaboardである。今回AVRはATMega88を使用しているので、温度測定してLEDを点灯させた回路が殆ど使えた。LEDを取り外し、USBの回路とPB0にLEDを取り付けた。

custom-classはコマンドラインからLEDのON/OFFを制御する。それとLEDのStatusを調べる。というものである。

$ ./set-led on ....... LEDを点灯する。
$ ./set-led off ...... LEDを消灯する。
$ ./set-led status ... LEDの状態を確認する。

てなわけで、コマンドラインとファームウェアをコンパイルしたら、あっさり動作してしまった。プログラムはサンプルから特に変更していない。MakefileでATMega168だったのをATMega88に変更したくらい。外部クロックを使うので、Fuseの設定を行ったけど、Makefileに書いてあった値をHIDspxで書いた。

ちなみに最初、外部クロック源にセラロックを使ってみたけどUSBで認識してくれなかった。ということで水晶発信子にしたら問題なく認識された。

先達の歩んだ道をトレースしまくりなわけだけど、素材がそろったのでそろそろ本題のUSBで温度計測だな。
一番の悩みはパッケージングだなー。パッケージングでは、QRPな自作の日記さんのFRISKのケースに入れたいなーなんて目論んでいたりして。

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);
}

AVRというマイコン

Monday, May 25th, 2009

cimg62141

ここの所、AVRというマイコンと闘っていました。といってもまだ、ハードウェアを組み立てただけなんだけど。

AVRを使ったきっかけは、「サーバの温度を取得したい」だった。今時のマザーボードは、BIOSでダイの温度を測ることが可能であるが、GA-GC230やGCLF2でFreeBSDだとうまく測れていないっぽい。Core-tempだと13とか31という数字が表示されるだけだった。まだ実際に測った訳ではないのだけど、BIOSの表示は43℃とか47℃とかなので、やはり、Core-tempがおかしいのかも。

というわけで、温度を計測する方法を探っていたらPICというマイコンと温度を計測するICを組み合わせる方法が出て来た。もう少し調べていくとPICがメジャーなわけだけど、後発のAVRがMac OSXのXCodeでも開発できるということでこちらを選択した。

AVRに限らずマイコンの開発では、マイコン自体にプログラムを書き込む仕組みが必要なわけだが、AVR用のライターは簡単に組むことが出来るということでチャレンジしてみた。
千秋ゼミ

しかしここからが荊の道の始まりだった。
AVRのライターはAVRで制御しており、ライターを作るためにライターが必要になるという鶏と卵の問題があるのだけど、既に先達の方々が解決しているのである。
自分も千秋先生の卵ライターでAVRファームを書き込んだんだけど、一度成功したに見えたが上手く動作せず。

COMポートやパラレルポートがあれば別なライターでプログラムの書き込みができそうだと言うことで、そちらも試したけど、うまく行かず。(今思えば、FUSEによって外部クロックを設定してしまっていたらしい。そのときは、気がつかなかった)

ここまで来て引き返すのもなんなので、AVRの開発元の純正ライターを買って来た。(最初から買えって話しもあるが)

これで、HIDaspxのファームを書き込んだところ、自作ライターが使えるようになった。(まだWindows環境)

OSXでライターを使うためにHIDaspxをダウンロードし、使ってみたが、起動せず。どうやら、libusbというライブラリが必要らしい。

libusbをインストールでインストールし再度MakeしたらOSXでもHIDaspxを使えるようになったのであった。

感覚的にはここまで1週間くらいかかっているんだけど、さっき、いつからだっけとタイムラインを見ていたらどうやらAVRとLM35が頭の中をぐるぐる回り始めたのは、5月9日だったらしい。ってことは2週間くらいハマっているのね。

さて、ライターも出来たことだし、サンプルも動いたし。
温度はかるぞー