Re: The history of "M&Y"

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

AVRねた その30 カラーセンサー

2009-08-10 | AVRねた

だんだん、AVRの使い方も進んできました。

今回は、カラーセンサーを接続してみまます。

カラーセンサーといえば、ダイセン工業のものですが・・・

今回は、秋月電子でゲットした「デジタルカラーセンサー」という部品を使っています。

これは、浜松ホトニクス社製のデジタルカラーセンサーICで、型番はS9706です。

もう、指の先に「ちょこん」と載るくらい小さな部品です。

いつもどおり、ATmega88に接続して、読み出した結果をLCDに表示するようにしてみました。

Img_7478_2

その結果・・・簡単に接続(表示)できました。

普通に読み出しできたので「これは、使えるかも・・・」と大変期待したのですが・・・

読み出される数字が3つ

①赤成分の照度

②緑成分の照度

③青成分の照度

が順に出力されます。

確かに、色のついたものを読ませると、それらしい数値が表示されます。

黒い色を見せると、3つの数字が全部小さくなるし、赤色を見せると赤の数字が大きくなります。

ただ、あくまでも3つの数字を比較して、大小のパターンを判断して・・・となり、ちょっと簡単に「色を判別」できるとは思えません。

ということで・・・終了!です。

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

AVRねた その29 アナログポートの読み込み

2009-08-09 | AVRねた

アナログポートの読み込みができたところで、その読み込みにどの程度の時間が掛かるのか興味があるところです。

で、やってみると・・・

10万回の読み出しに11.2秒掛かりました。

つまり、1回のアナログ値の読み込みに0.000112秒(112μ秒)掛かります。

なんと、NXTより遅いことが分かりました。

クロック8MHzのATmega88だからでしょうか? 

クロックを最高速の20MHzにすれば、2倍程度速くなるとは思いますが・・・

ちょっと、ガックシです。

やっぱPICの方が性能的に上か?

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

AVRねた その28 アナログ入力

2009-08-07 | AVRねた

いよいよアナログ入力に挑戦です。

といっても、これもライブラリを使用すると簡単でした。

Source Files に adc.c を追加して、ソースファイルの先頭に

#include "adc.h"

を追加します。

あとは、ad_init( ) で入力ポートを選択し、 ad_get( ) で値を取り込みます。

サンプルプログラムはこんな感じです。 

#include <avr/io.h>
#include <stdio.h>
#include "lcd.h"
#include "adc.h"

int main( void )
   {
   int i;

   lcd_init();
   fdevopen( lcd_put_ch,NULL);
   ad_init(4);   // ADC4
 
  while( 1 )
      {
      i = ad_get( );
      lcd_position(0,0);
      printf("i = %4d",i);
      }
   }

以前に電子工作の師匠からいただいた、RPR-220というフォトリフレクタを接続してみました。

Avr004

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

AVRねた その27 デジタル入力

2009-08-01 | AVRねた

じゃあ次は入力ということで、スイッチの入力を読ませてみました。

PC4にタクトスイッチを接続して、スイッチを押すとGNDと接続されます。

プログラムはこうなります。

#include <avr/io.h>
#include <stdio.h>
#include "lcd.h"

int main( void )
   {
   lcd_init();
   fdevopen( lcd_put_ch,NULL);
   
   DDRC &= ~0b00010000;    // PC4を入力に
   PORTC |= 0b00010000;      // PC4をプルアップ

   while( 1 )
      {
      lcd_position(0,0);

      if(( PINC & 0b00010000 ) == 0 )   // スイッチが押されていれば 0
         printf("ON ");
      else
         printf( "OFF" );
      }
   }

で、そのタクトスイッチですが・・・どの部分がスイッチ(接点)なのか良く分からなかったのですが、実験の結果写真のようになっていることが判明しました。

Img_7462_2

Avr003

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

AVRねた その26 LCD

2009-07-30 | AVRねた

今度はLCDの制御です。

と言っても既にあるライブラリを使うと簡単です。

Source Files に lcd.c を追加します。

あとは、 fdevopen関数 に lcd_put_ch を指定すれば printf関数 が使えるようになります。

#include <avr/io.h>
#include <stdio.h>
#include "lcd.h"

int main( void )
   {
   lcd_init();
   fdevopen( lcd_put_ch,NULL );
   lcd_position( 0,0 );
   printf( "Hello World!" );
   }

これをコンパイルすると・・・

../T01.c:12: warning: passing arg 1 of `fdevopen' from incompatible pointer type

という警告(warning)が出ちゃいます。 いいのかなぁ~



Avr002_2

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

AVRねた その25 ループでの時間待ち

2009-07-29 | AVRねた

割り込みによるタイマーで1/100秒を計れるようになりました。


しかし、もっと基本的な時間待ちを試してみたくなりました。

そうです。

単なるループでの時間待ちです。

何回のループで1秒の待ちになるか確認してみます。

500,000,000回(5億回)のループで大体8秒でした。

ということは、1回のループに0.000000002秒です。(0.002μ秒 速っ~!)

すごいよAVR!



と単純にびっくりしていましたが・・・待てよ! また単純なプログラムなので、変数がレジスタに乗ってしまっているだけかも知れない・・・と疑ってみるとやっぱりそうでした。

ループの変数の定義に volatile を付けてみると・・・とてつもなく遅くなりました。

2,500,000回のループで大体11秒です。

すると、1回のループに0.0000004秒です。(0.4μ秒 まあ、こんなもんか)

#include <avr/io.h>

#define LED_SET DDRC |= 0x10
#define LED_ON  PORTC |= 0x10
#define LED_OFF PORTC &= ~0x10

int main( void )

   {
   volatile long i;

   LED_SET;

   while(1)
      {
      LED_ON;
      for(i=0 ; i<2500000L ; i++);
      LED_OFF;
      for(i=0 ; i<500000L ; i++);
      }
   }

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

AVRねた その24 タイマー割り込み

2009-07-28 | AVRねた

よ~し だんだん思い出してきたゾ。

それじゃ、調子に乗って、タイマー割り込みを・・・

このプログラムを動作させると、PC4に接続したLEDが一秒毎に点滅します。

#include <avr/io.h>
#include <avr/interrupt.h>

#define LED_SET DDRC |= 0x10
#define LED_ON  PORTC |= 0x10
#define LED_OFF PORTC &= ~0x10

volatile unsigned long cnt = 0;

ISR( SIG_OVERFLOW1 ) // 10ms毎に割り込み
   {

   TCNT1 = 0x10000 - 1250;
   cnt++;
   }

int main( void )

   {

   LED_SET;
   TCCR1A = 0x00;
   TCCR1B = 0x03;                 // 64分周
   TCNT1 = 0x10000 - 1250; // 10ms毎にオーバーフロー

   TIFR1 |= 0x01;                     // オーバーフロー許可
   TIMSK1 |= 0x01;                  // タイマ割り込み許可

   sei( );                                     // 割り込み有効

   while(1)
      {
      cnt = 0;
      LED_ON;
      while( cnt < 20 );               // 0.2秒点灯
      LED_OFF;
      while( cnt<100 );               // 0.8秒消灯
      }
   }

0.01秒(10ms)毎にグルーバル変数 cnt がインクリメントされます。

1250のところを12500にすると、10ms毎のカウントではなく、100ms毎のカウントになります。 

確か前回は、volatileを知らなくて、ハマッテいました。



この1250という数値は以下の式で算出しました。

1(秒) ÷ 8,000,000(クロックHz) × 64(分周) × 定数 = 0.01(秒)

となる定数を逆算すると 1,250 になります。

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

AVRねた その23 タイマー

2009-07-27 | AVRねた

まだ、よく思い出せないAVRですが・・・とりあえず、タイマーを使った時間待ちを作ってみました。

これで、1秒間だけLEDを点灯することができます。

#include <avr\io.h>   // LEDを一秒間点灯する

void wait(long t)         // 10ms待つ
   {
   while(t-- > 0)
      {

      TCNT0=0;
      while( TCNT0<78 );
      }
   }

int main( void )
   {
   TCCR0B = 0x05;   //プリスケーラ1024分周
   TCNT0 = 0;             //タイマークリア
   DDRC |= 0x10;       // PC4を出力に設定

   PORTC |= 0x10;     // PC4をHに設定
   wait( 100 );              // 1秒待つ
   PORTC &= ~0x10; // PC4をLに設定
   }



この 78 と言う数値は以下の式で算出しました。

1 (秒)÷ 8,000,000(クロックHz) × 1,024(分周) × 定数 = 0.001(秒)

となる 定数 を逆算すると、大体 78 となります。

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

AVRねた その22 復習

2009-07-16 | AVRねた

前に書いたとおり・・・ここのところ放置していたら、AVRの使い方を全く忘れてしまいました。

それじゃあ・・・ということで、恥ずかしながら、再度初めからやってみることにしました。

初めから、って? LEDを点けるヤツですね。

なんとなく思い出しながら、以下のプログラムを作成し、ATmega88に転送すると、PC4に接続したLEDが点灯しました。

やった! って、こんなことで喜ぶなよ俺。

#include <avr\io.h>  /* LEDを制御する */

int main( void )
   {
   DDRC |= 0x10;     /* PC4を出力に設定 */
   PORTC |= 0x10;   /* PC4を H に設定 */
   }

まあ、とりあえず動いたってことで・・・



一応、備忘録ということで

LEDを消す(L に設定)は

   PORTC &= ~0x10;   /* PC4を L に設定 */

Avr001_2

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

AVRねた その21 完璧に忘れた

2009-06-14 | AVRねた

ここのところ、AVRを全く触っていなかったので、開発環境の状態や、手順を完璧に忘れてしまいました。

そういうのって、記録に残しておかないとダメですね。

これまで、タイマーや割り込みなどもマスターしたハズなんですが・・・

すっかり忘れています。

とりあえず、ブレッドボードには、光センサーの値をLCDに表示する回路が組まれていました。

きっと、過去の自分は、ここまで使えたのだと思いますが・・・過去の自分に追いつくまでに結構な時間が掛かりそうです。

はあっ

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

AVRねた その20 やり方忘れた

2008-12-30 | AVRねた

本当に久しぶりに「AVR」でもやるか・・・と思っていろいろやろうとしたら・・・やり方をすっかり忘れているようです。

ファイルもどこに、何を格納したかさっぱり分かりません。

健忘症か?

これから、自分の過去を少しずつ取り戻していきます。

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

AVRねた その19 抵抗値

2008-12-10 | AVRねた

正確にはAVRねたではありません。

先日買った「試しながら学ぶAVR入門」という本の中に書かれていたこのなのですが・・・

販売されている抵抗やコンデンサの値の決め方は、等比数列になるようになっているらしいです。 

つまり、

10を6回の等比数列であらわしたものがE-6系列

10を12回の等比数列であらわしたものをE-12系列としています。

E-6系列で考えてみると、

X^6 = 10  ⇒ X = 10^(1/6)

となり、X = 1.4677992676 になります。

そうすると

1.0

1.5

2.2

3.2

4.6

6.8

10.0

という数列になります。

抵抗の値ってなんだか半端だなぁ~と思っていました。

6.0kΩが無いのに6.8kΩがある訳がやっと分かりました。

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

AVRねた その18 参考書

2008-12-09 | AVRねた

本屋で、AVRの参考書をさがしたのですが・・・

PICの解説書はたくさんあります。 しかし、AVRの本はほとんどありません。

AVRってマイナーなのですかね?

そんな中で、やっと「試しながら学ぶAVR入門」という本を見つけて購入しました。

特に新しい情報があるわけではないのですが、C言語のプログラムのところにコメントがしっかり入っているので、勉強になります。

私はPICをほんのちょっとしか知らないので、本当のところPICとAVRを比べるとどうなのかしりません。 でも、いまのところ、性能的にも扱いやすさでもAVRで文句はありません。

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

AVRねた その17 雑感

2008-11-21 | AVRねた

M&Y研究所」の自作機への道も一歩一歩進んでおります。
これって、いつか役に立つのでしょうか? 役に立ってほしいなぁ。


とりあえず、AVRマイコンを中核にして出力系は目処が付きました。
今度は、入力系に移りたいのですが、その前に入力したセンサーの値をどのように測るのかが問題になっています。一番現実的なのはLCDを接続してLEGOのようにロボット単体で確認できるのが良いかと考えています。しかし、LCDを接続するためには、電源とGNDを除いて6本の信号線が必要です。 そうすると、たとえATMEGA88でもポートが足りなくなってしまいます。 うーんどうするかな? (本来は私が悩むことじゃないんですけどね)

いまのところの想定だと入出力として最低限


出力系
・モーター左右で 3ポート×2
・ランプ 最低1ポート


入力系
・光センサー 最低3ポート
・タッチセンサー 2ポート
・傾斜センサー 最低1ポート
と考えています。 そうすると、最低でも出力系で7ポート、入力系で6ポート必要になります。
さらに、ISP接続、LCD接続となると・・・どうでしょうか?
単に、40ピンのAVRマイコンにすれば良いのでしょうか?


ひとつのアイディアとして、LCDは調整の時にだけ必要なので、LCDを外付けにするというのを考えています。 そして、ATMEGA88とはI2C接続にします。 そうすれば、ATMEGA88のポートを2個消費するだけになります。(どうせ調整のときだけ必要なので、ISP端子に接続しても良いかもしれません)
LCD側にもI2Cを受ける仕組みは必要ですが、AVRマイコンを一個使えば良いのではないでしょうか?
うまくいくか判りませんが・・・。

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

AVRねた その16 リアルタイムクロック

2008-11-04 | AVRねた

ロボットとはあんまり関係ないのですが・・・AVRマイコンとリアルタイムクロック(RTC-8564NB)を接続してみました。

このRTCモジュールですが・・・かってI2Cの勉強をしているときに、よし!やるぞ・・・と思って買ってきてあったのですが、ずっと使わずに(使えずに)しまってありました。

やっと、役に立つ時がきました。

ATMEGA88をマスターとしてI2C接続で4本のケーブルで結びます。

時分秒を読み出して、LCDに表示させることができました。

ところが、1秒毎に秒が進むのですが、表示がなんか変です。

突然数字が飛びます。(ぽよ~ん)

う~んこれまた何で? (なんで、いつも素直に動かないの?)

と、よくデータシートを見たら(最初からちゃんと見てろよ)BCD形式だということが分かりました。 そうすると、上位4ビットと下位4ビットに分けて表示しなければならないので・・・良く考えたら 

printf( "%02d:%02d:%02d",hour,min,sec );

というのを

Img_0583printf( "%02x:%02x:%02x",hour,min,sec );

にしたら、ちゃんと表示できました。

今度は、どうやって時刻を合わせるかが問題なのですが・・・あれっ、時計を作ってもしょうがないや。 あくまでも、I2CとLCDの勉強用ですので・・・。

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