2013年3月7日木曜日

コンビニチャイムをつくる(1)


こんにちは。

前回までは教科書の内容に基づいた、いわば基本編でしたが、今回からは応用編ということで、複数のパーツを組み合わせた作例を紹介していきます。

初回は人が近づいたら反応して音をならしてあいさつの言葉を表示する「コンビニチャイム」を作ります。今回は音をならして文字を表示する部分まで作っていきます。

使うものは
・圧電ブザー
・LCD
・赤外線センサ
ですが、まずは圧電ブザーで音楽をならす部分から作っていきます。

始めにブレッドボードの10列目とArduinoのGND(マイナス)ピン、ブレッドボードの13列目とArduinoの13番ピンをそれぞれつなぎます。そのあと圧電ブザーの足をブレッドボードの10列目と13列目(向きは関係ないです)に挿します。




まずは基本となるプログラムを書きます。
IDEの「スケッチ」→「ファイルを追加」からUSBメモリに入っている「pitches」、「kana」と言う名前のファイルを追加しておいてください。


#include"pitches.h"


int tempo=90;
int rhythm=0;

void setup() {
}

int melody[]={
  _FAS1, _RE1, _RA, _RE1, _MI1, _RA1, _RA,
  _MI1, _FAS1, _MI1,_RA,_RE1,0
};
int beat[]={
  8,8,8,8,8,4,8,
  8,8,8,8,4,4
};
void loop() {
  
  int siz=sizeof(melody)/2;
  for(int i=0;i<siz;i++){
    rhythm=6000/tempo*10*4;
    tone(13,melody[i]);
    delay(rhythm/beat[i]-10);
    noTone(13);
    delay(10);
  }
  
}

これは教科書32ページのプログラムから、赤い部分だけ変えたものです。
書き込んでみると、チャイムの音がすると思います。

続いてLCDと接続します。LCDの左端のピンを15列目に挿します。
左端のピンからArduinoの2番、3番、4番、5番につなぎ、4列開けて(次は23列目から)10番、11番、12番にそれぞれつなげます。

その後ブレッドボードの下の赤いラインとArduinoの5V(プラス)ピン、青いラインとArduinoのGND(マイナス)ピンをそれぞれつなげます。

さらに可変抵抗を用意して、真ん中の足を47列目に挿します。赤い硬いジャンパワイヤを使ってLCDの右から5番目のピンが刺さっている26列目とつなげましょう。

最後に柔らかいジャンパワイヤを使って可変抵抗の右足と赤いライン、左足と青いライン、LCDの右から4番目(27列目)と赤いライン、右から3番目(28列目)と青いラインをつなげばひとまず終わりです。

さらにプログラムを書きかえていきましょう。

#include <LiquidCrystal.h>
#include "kana.h"

#include"pitches.h"

int tempo=90;
int rhythm=0;

LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);

char text[]={
  _i,_ra,_ltu,_si,_lya,_i,_ma,_se,'\0'};


void setup() {
  lcd.begin(16,2);
}

int melody[]={
  _FAS1, _RE1, _RA, _RE1, _MI1, _RA1, _RA,
  _MI1, _FAS1, _MI1,_RA,_RE1,0
};
int beat[]={
  8,8,8,8,8,4,8,
  8,8,8,8,4,4
};

void loop() {
  lcd.clear();
  lcd.setCursor(0,0);

  lcd.print(text);

  int siz=sizeof(melody)/2;
  for(int i=0;i<siz;i++){
    rhythm=6000/tempo*10*4;
    tone(13,melody[i]);
    delay(rhythm/beat[i]-10);
    noTone(13);
    delay(10);
  }
  
delay(1000);

}

赤字部分が新しいところです。LCDに文字を表示するために必要な部分を追加しました。うまくいけば写真のように表示されるはずです。

今回はここまでです。次回コンビニチャイムを完成させます。

2013年3月4日月曜日

温度センサを使った「目でわかる温度計」


こんにちは。
今回は前回に引き続き、教室で扱えなかった温度センサを使ってみたいと思います。

今回もLCDではなく、パソコンと通信してどれくらいの温度が計測されているのかを調べてみます。

ブレッドボードの15列目に、温度センサの平らな面が見えるようにして真ん中のピンを挿します。





続いてArduinoと接続します。15列目(真ん中)とArduinoのA0ピン、14列目(左)とArduinoの5V(プラス)ピン、16列目(右)とArduinoのGND(マイナス)ピンをそれぞれつなげます。



それでは、以下のプログラムを書き込み、パソコンで値を見てみましょう。
値をみるにはIDE右上の「虫眼鏡」マークのボタン(シリアルモニタ)を押します。

int data=0;
float temp=0;

void setup() {
  Serial.begin(9600);
  analogReference(INTERNAL);
}

void loop(){
  data=analogRead(0);
  temp=(data*2560.0/1023.0 - 600.0)/10.0;

  Serial.print("Temperature ");
  Serial.print(temp);
  Serial.println(" C");
  delay(100);
}

温度を見てみると大体27℃近くあるようでした。例えば温度センサをつまんでみると温度はどう変化するでしょうか?



実際にやってみると32℃以上になりました。このことを利用して、「目でわかる温度計」を作ってみましょう!



今回はフルカラーLEDを使います。まずはある温度を超えると赤に、ある温度以下だと青に光るようにしてみましょう。今回もif(){}を使います。

始めに配線です。フルカラーLEDの一番長い足が左から2番目に見えるようにして、左端の足を30列目に挿します。


次に1キロオーム(茶黒赤金)の抵抗を2本使い、30列目と25列目、32列目と40列目をそれぞれつなぎます。


最後に25列目とArduinoの10番ピン、40列目とArduinoの11番ピン、31列目とArduinoのGND(マイナス)ピンをつなぎます。



そして以下のプログラムを書き込みましょう。

int data=0;
float temp=0;

void setup() {
  analogReference(INTERNAL);
}

void loop(){
  data=analogRead(0);
  temp=(data*2560.0/1023.0 - 600.0)/10.0;

  if(temp>30.0){
    analogWrite(10,255);
    analogWrite(11,0);
  }else{
    analogWrite(10,0);
    analogWrite(11,255);
  }
}

場合分けの条件はお好みで変えてみてください。
下の動画のように温度センサを指でつまむと青→紫→赤と次第に色が変わっていっておもしろいと思います。これはセンサの値が微妙に上下しながら高くなったり低くなったりと変化していくためだと思われます。





さらに緑色(33列目)を13番ピンにつなぎ、場合分けを増やしてみたり、明るさを変えたりすると色の変化をさらに楽しめそうです。

今回はここまでにして、次回以降は応用的な作例を作っていきたいです。

CDSを使った「暗くなったら点灯するLED」


こんにちは。
今回は教室で出来なかったセンサを使ってみたいと思います。
まずはCDSからです。

CDSを38列目と40列目に入れましょう。向きはありません。
次に10キロオーム(茶黒橙金)の抵抗を35列目と40列目に入れます。
続いて硬いジャンパワイヤ(茶色)で38列目と下の青い(マイナスの)ラインをつなげましょう。

さらに、好きな色のLEDのプラス(足が長い方)を46列目に、マイナス(足が短い方)を45列目に入れましょう。
そのあと、1キロオーム(茶黒赤金)の抵抗で45列目と青いラインをつなぎます。これでブレッドボード上の配線は終了です。




Arduinoとの接続に入ります。柔らかいジャンパワイヤを使いましょう。
ArduinoのGND(マイナス)ピンとブレッドボードの青いラインをつなぎます。
Arduinoの5V(プラス)ピンとブレッドボードの35列目(10キロオームの抵抗)をつなぎます。
ArduinoのA0ピンとブレッドボードの40列目(CDS)をつなぎます。
最後にArduinoの6番ピンとブレッドボードの46列目(LED)をつないで配線は終了です。




パソコンと接続して以下のプログラムを書き込みましょう。

int data=0;

void setup(){
}

void loop(){
  data=analogRead(0);
  data=map(data,0,1023,0,255);
  analogWrite(6,data);
}

CDSの前で手を動かしてみるとLEDがチラチラすると思います。が、変化が小さくてよくわからないと思うので、センサの値を直接見てみましょう。
教室ではLCDを使ったので課題のようにそれを使ってもよいのですが、今回はパソコンの画面で値を確認できるようにします。

プログラムを以下のようにして、書き込んでみましょう。
int data=0;

void setup(){
Serial.begin(9600);
}


void loop(){
  data=analogRead(0);
  data=map(data,0,1023,0,255);
  Serial.println(data);
  analogWrite(6,data);
  delay(10);
}

書き込んだら、IDEの右上の「虫眼鏡」の印のボタン(カーソルをもっていくと「シリアルモニタ」と表示されます)をクリック!

すると数字がたくさん出る画面が出てくるはずです。これがセンサの値になります。


Serial.begin(9600); でパソコンとの通信を始めて、
Serial.println(data); でパソコンにデータを送っています。
delay(10); はデータを送る間隔をあけるためです。

電気をつけた状態で75くらい、CDSに手を近づけると170くらい、電気を消すと250くらいになりました。
つまり、センサの値が高い→周りが暗い
    センサの値が低い→周りが明るい
となります。
では、この値を使って「暗くなったら点灯するLED」を作ってみましょう!

今回の動作は、
センサの値をはかる
→センサの値が高い(周りが暗い)→LEDを点ける
 センサの値が低い(周りが明るい)→LEDを消す
です。

暗くなったときだけLEDが点けばいいので、200くらいを境目にします。
場合分けにはif(){}を使います。
プログラムは以下の通り。

int data=0;

void setup(){
}

void loop(){
  data=analogRead(0);
  data=map(data,0,1023,0,255);
  
  if(data>200){
    analogWrite(6,150); 
  }else{
    analogWrite(6,0);  
  } 
}

明るさはお好みで。明るさを調整して、電池を使うと常夜灯代わりにもなりますよ?



次回は温度センサを使ってみたいと思います。