Re: The history of "M&Y"

Team "M&Y" and "花鳥風月"
the soliloquy of the father
毎日更新!

方位センサー再び

2010-09-02 | AVRねた

懲りもせず・・・またまた「方位センサーのたまご」をオークションで買いました。

Img_8383

今度は2個で100円です。 なんと一個50円!

(まあ、送料とか手数料を入れると、一個200円ですかねぇ。)

前と、違う形なので、使えるかどうか不安でしたが・・・


では、赤いほうから犠牲になってもらって、早速分解です。

前と、同じ構造なら、表の方(電池が入る側と逆の方)に目的のブツがあるはずなので、そっちから攻めて行きます。

まずは、全てのネジを外します。 そうしたら、簡単にカバーが外れ基板が出てきました。

Img_8387


基板のネジも全て外し、裏返すと・・・ありました。

Img_8394

何か前より簡単だなぁ。

Img_8398

とりあえず、方位センサーのモジュールを一個手に入れました。



じゃあ、今度は、銀色のヤツを分解です。

これも、表の方のネジを全部外すと・・・カバーが開いて・・・ありました。

Img_8407

これは、さらに前よりも簡単です。

じゃあ、今回は、目的のブツを手に入れたところで終了・・・


続く・・・ハズ

コメント (2)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

AVRねた その44 ジャイロセンサー

2009-09-17 | AVRねた

ヤフオクでGBAのゲームを入手しました。

ニンテンドーの「まわるメイドインワリオ」です。

Img_7070

今さらですが・・・このゲーム、結構面白いです。



って、ゲームをするために入手したのじゃないのです。

この前、秋葉原でNXT用のジャイロセンサーを購入したのですが・・・

さすがに、7350円は高価です。 

(秋月電子にもジャイロセンサーがあるのですが・・・どうもうまく使えません。 秋月のジャイロが役に立っているチームがいたら、使い方を教えてください。)

そこで、ネットをさまよっていて、このゲームの中のジャイロセンサーが使えるらしいということで、実験材料として入手したのです。 (可哀想なゲーム! 合掌)

さて、使えるかは・・・



分解すると、こんな感じです。

Img_7078

立っている基板の裏にあるのがジャイロセンサーです。

Img_7079

では、これを分解します。

ジャイロセンサーの基板からは3本の線が出ていたので、あっさりと切りました。

赤と白と黒の線です。

普通に考えると、赤はVCC、黒はGND、白は出力ですね。 (実際にそのようです。)

ただし、電源は3Vということなので、3.3Vのレギュレータで降圧して供給します。

実際に、AVRにつないで見ると・・・

常時266という値が読み込まれます。

これは 5Vのリファレンスに対して、CG-L41の基準電圧(1.3V)が出力されているから、のようです。

ということで、ジャイロセンサーを(いや、AVRマイコンごと)回してみると、値が変化します。


こいつ、動くぞ!


なんか、使えそうです。

Img_7485  

これなら邪悪な楊枝の海の中で方向を見失わずに済むかも・・・なんちゃって。



まあ、所詮安物のおもちゃの部品なので、時間と共にどんどんずれて行きますけどね。

コメント (2)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

AVRネタ その43 ATTiny13

2009-09-10 | AVRねた

この前、秋葉原の秋月電子で購入した ATTiny13 を使ってみました。

チップを手に持った感触は「ちっ小さい!」です。

Img_8489

この小さなチップを購入した理由は・・・

センサーを付けるのに、どうせ2~3ポートしか使わないのなら、小さなチップで良いんじゃない・・・単にそれだけ。

まずは、ブレッドボードに挿してみます。

さっそく、LEDを一つだけ接続して、プログラムの書き込みテストをやります。


実験1

まずは、LEDを光らす → 成功


実験2

LEDを消す → 成功


実験3

タイマーを使って10ms待ちのサブルーチンを作り、LEDを点滅させる。

あれ? 点滅がやけに遅い・・・また10倍掛かっているような感じ・・・

調べたら、クロックが9.6MHzになっていた。 (逆に早いじゃない!)


Img_8482

ちゃんとデータシートを調べて、タイマーの分周も1024を指定しているし・・・他にも分周する指定があるのかな? と思って、データシートでタイマー関係のレジスタを見ても・・・別に指定はなさそうです。

なんとなく8倍の時間が掛かっているようなので、何か設定がされてしまっているようです。

あきらめて、データシートを最初から、順に読んでいくと・・・

これだ! 

レジスタの設定ではなく、ヒューズの設定で CKDIV8 が有効になっていました。

この CKDIV8 の設定を無効にしたら、ちゃんと10ms待ちのサブルーチンになりました。

なんか、AVRで新しいことをやるたびに、ハマルなぁ~

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

AVRねた その42 NXTとの接続

2009-09-07 | AVRねた

だんだんAVRの工作についても先が見えてきたので、いよいよNXTの自作センサーを接続する実験をしたいと思います。

とはいえ、以前にYが作成した自作センサーのキット(NICO SENSOR)があるので、それを大いに参考に(別名「パクる」)しようと思います。

これまで、ATmega88を中心に使っていたのですが、アナログポート数が多いという理由で、ATTiny26Lを使うことにします。


ブレッドボードに、部品を挿して行き、ハードはすぐにできました。


ソフトウェアは、NICO SENSORのものを改造(というか、不要のものを削除して簡略化したもの)を入れてみると・・・NXTとの通信はうまくいくのですが、ADC0ポートの値が「0」となってしまいます。 どうも、アナログポートの読み込みが全然できていないようです。

プログラムの中で、NXTに送る値を適当に埋め込むと、ちゃんとその数字が「NXT側」に表示されるので、通信は問題無いようです。

何で、アナログポートを読んでくれないの?


AREFやAVCCを+5Vに接続しても、変わりませんねぇ。

いろいろ試しても一向にアナログポートからの読み込みはできません。

きっと、このAVRマイコンが壊れているんだ! (すぐに他人のせいにする悪いクセ)

などと、現実逃避をしてみても、時間が過ぎるだけです。

実は、adc.c がATmega88用に書かれていた(修正されていた)ことをすっかり忘れていました。

adc.cの中の ADCSRA の記述を ADCSR に変更したら、何事も無かったように動作しました!


しかし、レジスタの名前が(ATTiny26用でなく)間違っていたにも関わらず、なぜコンパイルエラーが表示されなかったのか? それが不思議です。

後から考えると・・・単にコンパイルエラーを見過ごしていただけらしい・・・シッカリしろ俺


とにかく、上の修正をしたら、やっとアナログポートに接続した光センサーの値をNXT上に表示することができました。 (長い道のりであった)



これで、スペインチームのロボットのようにたくさんのセンサーを搭載できる・・・かもね。

コメント (2)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

AVRねた その41 バージョンアップ

2009-09-01 | AVRねた

ここのところ、AVRでいろいろやって楽しんでいますが・・・

謎も多いので、調子に乗って開発環境を最新化するという暴挙に出てみました。

AVR Studio を Ver4.17 Build 666 に

WinAVR を 20090313 に

さて、これが吉と出るか凶と出るか・・・

まずは、これまでインストールしてあったAVR StudioとWinAVRをあっさりとアンインストールして、新バージョンのインストールをしました。

さて、液晶に"HELLO"と表示されるプログラムを動作させてみると・・・

早くも「凶と出ました」(苦笑)

"HELLO"と表示されるはずが・・・"■oooo"と表示されます。

Img_7801

やっぱり、最新化は危険な賭けであったか・・・

しかし、LEDを光らせたりする限りは動作するようです。

そうすると、ダメなのはLCDへの表示ってことなのですかねぇ?

だとすると、何かタイミングとかかもしれない、ということでプログラムを見てみると、時間待ちを単純ループで実施している部分がありました。

ここで、魔法の呪文 volatile を入れてみると・・・

やっと、"HELLO"が表示されました。

Img_7807

LCD用の時間待ち関数は

void lcd_wait( volatile long m )

   {

   while( m-- > 0 );

   }

こんな感じです。 引数に625を与えると、大体1ms待ちというところでしょうか。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

AVRねた その40 70万ループの謎

2009-08-28 | AVRねた

Yの夏休みの宿題で、ATTiny2313の基本的なプログラムをテストしていたときのことです・・・

時間待ちをするのに、普通ならタイマーなどを使いますが、さすがにYにそれを期待するのはかわいそうなので、単純なループで時間待ちを作ることにしました。

0.1秒(100ms)の時間待ちループを作れば、あとはそれを何回か繰り返せば、5秒だって10秒だってできちゃいます。

ということで、Yは、0.1秒ループを作成するために、ストップウォッチを片手に、その単純ループを100回繰り返すと10秒になるループ回数を試行錯誤して調査していきました。

こんな感じのプログラムなのですが・・・

#include <avr/io.h>

void wait( int t )
   {
   long i;
   while( t-- > 0 )
      for( i=0 ; i<700000L ; i++);
   }

int main(void)
   {
   DDRB = 0b00011111;
   while( 1 )
      {
      PORTB |=  0b00010000; // LED ON
      wait( 100 );
      PORTB &=  ~0b00010000; // LED OFF
      wait( 100 );
      }
   }

これで、LEDが点灯している時間、消灯している時間を計ります。

で、上の wait関数の forループの中の定数を変化させて実験していました。

690000Lの時に9秒くらいだったので、じゃあもうちょっと増やそうということで、700000Lにすると14秒くらいになります。 あれ、増やしすぎたかなぁ。

710000Lにすると、10秒くらいになりました。 えっ、700000Lと逆転?

なぜか、70万回ループだけ異様に時間が掛かります。



謎です。

コメント (3)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

AVRねた その39 方位センサー完成

2009-08-26 | AVRねた

いろいろ努力の結果・・・方位センサーが完成しました。

部品代は500円でしたが、私の努力の費用は・・・(疲れた!)


まず、このセンサーは、90度ずれた地磁気の強さ?X,Yの2つの値を返します。

その2つの値から方位を計算します。

しかし、その計算がそんなに単純じゃありませんでした。

出力される値自体の補正をしなければなりません。

①真北に向けて値を取得し記録します。

②真南に向けて値を取得し記録します。

①と②の値の平均値分だけ、X,Yのそれぞれの値から差し引いた値になるように補正します。(この説明じゃわかりませんね。 要は、①と②の平均値が0になるように出力の値を細工します。)

それが済むと・・・

北(x>0,y=0)  東(x=0,y<0) 南(x<0,y=0) 西(x=0,y>0)

という値が取り出せます。 ここから arctan を使って(実際には変換テーブルを使って

)方位(角度)を取得します。

とりあえず、精度もそれほどでもなさそうなので、最小単位5度の72分割にしてみました。

Img_7793


やっと、ワンコイン方位センサーの完成です。

あくまでも自己満足ってことで・・・



ところで、上にも書いている「補正」の作業ですが・・・

2008年の蘇州世界大会の時の中国チームのロボットで、方位センサーを搭載したスゴイのがありました。 

競技の前に、

①2階の壁の前に撒かれている楊枝をどける

②楊枝をどけたところにロボットを置き、壁に押し付ける

③何かスイッチを押す

④ロボットを180度回転させて、再び壁に押し付ける

⑤何かスイッチを押す

⑥ロボットを持ち上げ、楊枝を元のようにならす

とやっていたのですが・・・いったい何をしているのか分かりませんでした。

Img_8651

これは、方位センサーの補正作業をしていたのですね。

もしかして、これが「キャリブレーション」ですか・・・

うん、納得

コメント (2)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

AVRねた その38 方位センサーの一歩手前

2009-08-25 | AVRねた

さて、オモチャから取り外した部品は、方位センサーとして機能するのでしょうか?

まずは、センサーからの計測結果の数値を取り出します。

計測結果は11ビットの数値が2組出力されます。

x と y で、90度ズレた2つの方向での磁気の強さを測っているようです。

Img_7788

で、出てきたこの2組の出力で方向を判断する、プログラムを組まなければなりません。

(写真の「12」は、2進数「1100」を10進数で表示したものです。)

通常は arctan( -y/x ) という式で計算して、角度(方位)を求めるらしいのですが・・・NXCにもWinAVRにも arctan などという三角関数はなさそうです。(あるのかなぁ?)

なので、実際には、値→角度 となるテーブルを用意しておいて、変換するのが得策のようです。 まあ、10度くらいの精度で分かれば良いので細かい表は無しにします。


ここまで、なんとかできました・・・

それらしい数値が取り出せているので、なんか動いていそうなのですが・・・

まだ方位センサーとして機能しておりません。

なんだか、これ以上努力するのが、バカらしくなってきましたが・・・


とりあえず、続くハズ・・・・


秋月電子の8方位の方位センサーが3400円もするのですから、500円の投資は無駄では無かった・・・と自分では納得しようと思います。 いゃ、無理やり納得しています・・・

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

AVRねた その37 方位センサーのひよこ

2009-08-24 | AVRねた

さて、オモチャから取り出した方位センサーの部品ですが・・・

果たして使えるのでしょうか?


オークションで(1個)500円で落札したので、500円分くらいは楽しませて欲しいなぁ。


で、いろいろ調べて見ると・・・コンピュータとはシリアルで接続することになるようです。

早速、AVRと接続してみます。

電源は3Vらしいので、3端子レギュレータで降圧して供給します。

AVRからコマンドを送り、そのコマンドに対応してデータを送出してくれるようです。

シーケンスは

Reset device(AVR→センサー)

Start measurement(AVR→センサー)

Report measurement status(AVR→センサー)

これで、デバイスの状況が回答されます。

ここで、"1100"の回答があれば、計測終了&エラー無しとなり、続けて計測結果が転送されます。

されるハズです。

でも、なかなか"1100"が送り返されません・・・・"1111"になってしまいます。

タイミングが悪いのか、プログラムが悪いのか、私の生活態度が悪いのか・・・(笑)

しかし、なんか、いろいろやっているうちに、やっと"1100"が返ってきました。

Img_7780

もしかしたら、方位センサーとして使えるかもしれない・・・と期待感が高まったところで・・・

気が付くと、もう日付変更線を越えています。 明日も普通に仕事があるので・・・本日はここまで。

おやすみなさい。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

AVRねた その36 方位センサーのたまご

2009-08-23 | AVRねた

こども向け?のおもちゃで、トレジャーガウストというのをオークションで手に入れました。


Img_7624

空間に潜むガウストを探知!ガウスポジションシステムで空間追跡!リールアクションで捕獲!捕まえたガウストで育成&バトルができる!


という、なんかよく分からないゲーム(アクション)ができるらしい。

よし、これでYと一緒に遊ぶゾ!

という訳ではありません・・・


なんで、これを手に入れたか、と言うと・・・この、おもちゃは方位センサー(地磁気センサー)を使っているらしいので、その部品を取り出すためなのです。


では、早速分解を・・・まずは、赤い方に犠牲になってもらって・・・


Img_7635

まずは、もう外から見えるネジというネジを全部外しました。(お菓子に小さな蟻が集っているみたい・・・)

これで、裏蓋は外れますが・・・その中には、目的の物はなさそうです。 

Img_7639

じゃあ、もう一つの筐体(正面の方)を外さなければなりません。 とはいえ、ネジは見あたらないし・・・もう、どうせ元に戻すつもりもないし、バキッとやっちゃうか!

いや、最後にもう一回確認とばかりにネジを探すと、巧妙に穴が空けられているところがありました。 無事、ネジを外すことができました。


さて、そこを開いてみると、大きな基板が鎮座しております。 

Img_7644

見る限り、目的のものは見つかりません。 しょうがないので、またまた、基板を止めているネジというネジを外して基板を取り外しました。 

基板の裏側を見ると・・・やっと、目的のものを見つけることができました。

Img_7657

しかし、基板にしっかりハンダ付けされており、簡単には取れそうにありません。

とりあえず、よく分からないリード線などをニッパでパキッパキッと切っていきます。

基板を残して、あとはゴミ箱行きです。(さようなら)

さて、小さなセンサー基板をどうにかして外さなければなりません。


どうしよう、どらえも~ん!

たらららったた~♪ 半田吸取り機!


ということで、先日手に入れた半田吸取り機が役に立ちました。

苦労しましたが、目的の部品の摘出に成功しました。


よしじゃあ、次は青い方も犠牲になってもらおう・・・

もう、手順も分かっているので、必要な部分だけ外して・・・

完璧!

Img_7712

これで、2つの部品が手に入りました。

さて、この私の努力は報われるのでしょうか?

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

AVRねた その35 熱っちぃ

2009-08-21 | AVRねた

Yの夏休みに自由研究に先立って、初めて使うATtiny2313にプログラムが書き込めるか、調査していたときのこと・・・

ブレッドボードにAVRを挿し、書き込みに必要な配線(6本)をして、電池(4.5V)をつないで見ました。


AVR書き込み機(AVRISPmkII)を接続すると、(書き込み機の)LEDが赤く光ります。

電池の電源をONにすると、書き込み機のLEDが緑色になるハズなのに・・・ならない。

オレンジ色に点滅します。

電池の電源をOFFにすると、何も無かったように、LEDが赤く光ります。

あれ~ 配線を間違えたかな~

何度見ても配線は間違い無いようです。

何で?

とAVRを触ったら


熱っちぃ!


すごい熱で、指先を火傷するところでした。(すぐに氷で冷やしました。)

なんで、こんなに熱いの?

もう一度配線を確認しましたが、やっぱり間違いは無いようです。

またまた「このATtiny2313は壊れてる」等と言う考えがよぎりました


が、もう一度良く見たら・・・単にAVRが180度逆に挿してありました。

(単に、それだけ)

気を付けろよ俺! 落ち着けっ俺!

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

AVRねた その34 PWM制御

2009-08-17 | AVRねた

やっと、いろいろ思い出してきて、PWM制御まできました。

とりあえず、PD6(OC0A)にLEDを接続しました。

タイマー0をPWM用に使用して、以下のプログラムを動作させてみます。

#include <avr/io.h>
#define LED_SET  DDRD  |=  0b01000000
void wait( long t )     // 10ms単位での時間待ち
   {
   TCNT1 = 0;
   while( t-- > 0 )
      {
      while( TCNT1 < 78 );
      TCNT1 = 0;
      }
   }

int main( void )
   {
   LED_SET;
   TCCR1B = 0x05;            // プリスケーラ1024分周

   TCNT0 = 0x00;
   TCCR0A = 0b10000001;
   TCCR0B = 0b00000001;

   OCR0A = 0xff;
   wait(100);

   OCR0A = 0xA0;
   wait(100);

   OCR0A = 0x80;
   wait(100);

   OCR0A = 0x40;
   wait(100);

   OCR0A = 0x10;
   wait(100);

   OCR0A = 0x00;
   }

最初は明るく光っていたLEDがだんだんと暗くなり、消えます。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

AVRねた その33 電池1本から・・・

2009-08-13 | AVRねた

前回の続きってことで・・・

Step-up DC/DC Converterを使って、電圧を上げることはできましたので、続きの実験をしてみました。


まずは・・・

マイクロインダクタの種類を変えても動作するか確認です。

最初に使っていたのは、秋月電子で買ったインダクタ(下の写真右)なのですが・・・でかいです。

この巨大なマイクロインダクタ・・・なんのこっちゃ・・・は邪魔なので、次のやつを試してみました。

Img_7609

千石電商で買った、2種類のマイクロインダクタに取り替えてみます。

まずは、何かカエルを想像するような形のもの(上の写真中央)・・・でも、ちゃんと動作しました。

じゃあ最後に抵抗みたいな小さなヤツ(上の写真左)・・・でも、ちゃんと動作しました。

あまり、部品の種類には関係ないのかなぁ。

Img_7600


じゃあ、次の実験として、秋月電子で一緒に買っておいた3.3VのDC/DC Converterに交換してみました。 

(型番はHT7733A)

これで、乾電池2本から3.3Vを作り出すのは、造作も無いこと、ですね。


さらに実験は続きます。

電池を1本にしてみると、それでもちゃんと3.3Vが出力されます。

(古い電池なので入力電圧は1.28Vでした。)

これに、気を良くして・・・電池1本のまま、DC/DC Converterを5V用に変えてみると・・・それでも、なんとか5Vが出力されました。 (正確には4.9Vでした。 くたびれた電池1本からでは、ここらへんが限界か。)

結構使えるかも・・・

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

AVRねた その32 Step-up DC/DC Converter

2009-08-12 | AVRねた

正式にはAVRねたじゃないんですけど・・・

ダイセンのロボットキットのTJ3は、乾電池3本を使いますが、ステップアップコンバーターを内蔵していて、5Vを作り出しています。

あの、安定したセンサーの読み取りなども、このステップアップコンバータによる電源電圧の安定化によるものかと、(勝手に)想像しています。

で、「M&Y研究所」でも、ステップアップコンバータの実験をしてみました。

コンバータ自体は、秋月電子で手に入れた「HT7750A」というものです。

それに、ショットキーバリアダイオードとマイクロインダクタ(コイル)、電解コンデンサを組み合わせると、5Vが出来ちゃうっていうことらしい。

早速、ブレッドボードに回路を組んで、電源(くたびれた電池2本)を与えてみると、みごとに5Vが出力され、青色LEDが光りました。

Img_7587

電圧を測って見ると、くたびれた電池2本で2.8V、そして出力はきっちり5.0Vです。

とりあえず、実験は成功ということで・・・

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

AVRねた その31 タイマーの謎

2009-08-11 | AVRねた

私がよく使っているAVRマイコンのATmega88には、タイマーが3つあります。

タイマー0と2が8ビットタイマーで、タイマー1が16ビットタイマーです。

基本的には、同じように使えるハズなのですが・・・

これまで、単純に時間待ちタイマーとして使用する場合には、タイマー0を使って10msを計測していました。

しかし、次項のPWMを実験するにあたり、PWM用にタイマー0を使用する関係上、時間待ちをタイマー0以外で実現する必要があります。

#include <avr/io.h>

#define LED_SET  DDRD  |=  0b01000000
#define LED_ON   PORTD |=  0b01000000
#define LED_OFF  PORTD &= ~0b01000000

void wait( long t )     // 10ms単位での時間待ち
   {
   TCNT0 = 0;
   while( t-- > 0 )
      {
      while( TCNT0 < 78 );
      TCNT0 = 0;
      }
   }

int main( void )
   {
   LED_SET;
   TCCR0B = 0x05;            // プリスケーラ1024分周

   LED_ON;
   wait( 100 );
   LED_OFF;
   }

このプログラムでPD6ポートに接続したLEDを1秒間だけ光らせるのですが・・・

このプログラムの TCNT0とTCCR0Bをそれぞれ、TCNT1とTCCR1Bに変更すると、それでも1秒間LEDが光ります。

しかし、TCNT2とTCCR2Bに変更すると、LEDが一瞬だけ光って終わってしまいます。 待ち時間を多くしてみると、タイマー0や1に比べて7倍くらいの速さ(短さ)になってしまっているようです。

私の何がいけないの?

タイマー2をタイマー0と同じように使用する方法を誰か教えてください。

コメント (2)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする