超☆ゆとり的電子工作 スイッチ動作の巻

フルカラーLED光速点灯
ゆとりAVR講座もついに3回目
そろそろ使えそうな物が作りたい
ということで、色が変えられるライトスタンドを目指して、フルカラーLED制御に挑戦だ!
…といってもまぁ、制御自体は赤色LEDの点灯の時と一緒だし…フルカラーLED自体の回路は組んで確認済みだし…
というわけで今までの集大成的なもの+αだよ!

というこって、今までのおさらいも兼ねて、inkscapeというフリーソフトで回路図を描いてみた。

5V回路図
5V電源回路

RGBLED回路図
フルカラーLED点灯回路

main回路図
赤色LED動作用AVRマイコン回路

そしてこれらを組み合わせた上で、スイッチもおまけに追加しちゃった回路がこれだ!
全体回路図

見ての通り、フルカラーLED回路で5Vにつながっていた端子が、AVRマイコンのPD0~PD2の、3つの端子につながっています。
そして、ポートAの0にスイッチがつながってます。
だんだんと回路がごちゃごちゃしてまいりました…
ひとつの回路にいろいろとさせるのこそ電子工作の醍醐味よね!

回路ができたらあとはプログラムだ!
こっちは前回のプログラムにいろいろ追加しただけ~

//ATTINY2313Vtest
//20100927
//C言語によるATTYNY2313Vマイコン動作テスト
//試しながら学ぶAVRマイコンp43
//20100929
//p61割り込みプログラム追加のナイトライダー
//20101004
//+フルカラーLED点灯回路追加

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

unsigned char x;
int q,w;

ISR ( TIMER0_COMPA_vect )
{

PORTB = q;
PORTD = w;
q=q+q;
if(q>=16)
{
q=1;
w++;
}

}

int main ( void )
{
q = 1;
x = 1;
DDRB = 0b00001111;
DDRD = 0b00000111;


TCCR0A = 0b00000010;
TCCR0B = 0b00000101;
OCR0A = 64;
TIMSK = 0b00000001;

sei();

while(1)
{

}

}



割り込みを使用したナイトライダープログラムに追加で、ナイトライダーの光が右から左へ一回行くごとに、フルカラーLEDの色が一回変わります。
ポ、ポケモンフラッシュ!?目がぁー!目がぁぁぁ~!

プログラムの簡単な説明としては、
ナイトライダープログラムのLED点滅初期設定(ポートBの設定)に合わせて、ポートDにも、LEDを光らせるための設定をします。
そして、ポートDは、変数wによって点灯の制御を行ない、wはナイトライダーの一周期ごとにインクリメント(変数wに1を加える)しています。

という、てっきとーなプログラム。
適当バンザイ!

しかしこれではさすがに目が辛いので、スイッチによってフルカラーLEDの点灯を制御するプログラムを作ります。
スイッチを一回押すごとに色がかわるよ!
もうナイトライダーはしないので、上のプログラムのうちの、初期設定とタイマ設定だけ残して、あとは削除
そしてスイッチ関係のプログラムとLEDの点灯プログラムを追加したものがこれ

//ATTINY2313V_switch_test
//20101005
//スイッチを利用したマイコン動作テスト
//

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

int x,x0,y;

ISR ( TIMER0_COMPA_vect )
{

x = PINA & 0b00000001;

if(x != x0)
{
if((x & 0b00000001) == 0)
{
y++;
}
}
PORTB = y;
PORTD = y;
x0 = x;

}

int main ( void )
{
DDRA = 0b00000000;
DDRB = 0b00001111;
DDRD = 0b00000111;

PORTA = 0B00000001;

x0 = PINA & 0b00000001;
y = 0;

TCCR0A = 0b00000010;
TCCR0B = 0b00000101;

OCR0A = 64;
TIMSK = 0b00000001;

sei();

while(1)
{

}

}




メイン(int main ( void )の中)の説明…は、いままでのとあまり変わらないのでいいか?
一応説明しておこう
DDRA = 0b00000000;とは!?
DDRAなどは、ポートの入出力を設定しているところであり、いままで既に使っていたDDRBとかDDRDのうち、LEDを回路的に接続しているところには1が入っていたはずです。
1とは、信号を出力することが出来ますよ、という設定。
それとは逆に今回ポートAにはスイッチを使いしているので、スイッチ=入力動作 つまり出力とは逆の0を設定しています。

PORTA = 0B00000001;とは
これは、ポートAの、0番地をプルアップする設定を行っています。
プルアップでググれ
簡単にいうと、すいっちを押して無いときは電圧がかかっている、つまり1が入力されている。スイッチが押されるとかかっていた電圧がGNDに流れていってしまうので、電圧が下がり0が入力される。という設定。
つまり、スイッチが押されていないと1が、押されると0が入力されるんや

x0 = PINA & 0b00000001;とは
&の記号は論理演算子 二進数と論理演算子でググれ
こうすることで、変数x0の中に、スイッチが押されていたら0が、押されていなければ1が入ります。


さてここからがプログラムのメイン
割り込み時実行プログラムのなかを見ていきましょう


ISR ( TIMER0_COMPA_vect )
{

x = PINA & 0b00000001;

if(x != x0)
{
if((x & 0b00000001) == 0)
{
y++;
}
}
PORTB = y;
PORTD = y;
x0 = x;

}



この中のプログラムは、タイマ割り込みによって、何秒かに一回動作します。何秒だったかは忘れたので前回の記事を見てくr

x = PINA & 0b00000001;
まずはこれ。上のx0の時と同じ。変数xのなかに、スイッチが押されていたら0が、押されていなければ1が入ります。

if(x != x0)
{
if((x & 0b00000001) == 0)
{
y++;
}
}
つぎにこれ。プログラムの基本、if文である。しかも入れ子構造

if(x != x0)
最初のこのif文では、変数xと、変数x0の中に入っている数字が同じか同じではないかを判断しています。
最後に出てくる、x0へのxの代入と組み合わせて使うと意味を持つプログラム。
プログラムはずっとループして廻っているのですが、ここではひとつ前のループの時と、今回の時で、スイッチの状態が同じであるか違っているかを見ています。

つまり、スイッチが
押されている→押されている
押されていない→押されていない
これは、「変化をしていない」という状況

押されている→押されていない
押されていない→押されている
これは、「変化している」状況

となります。
if文の中の、「!=」とは、イコールでない、つまり、xとx0の中身が違うものであったときif文のあとの{}の中身を実行する。というプログラム。
これによって、スイッチが「変化している」ときだけ実行するプログラムをif文の中に書いています。

そして肝心のif文のなか…にまたif文が
if((x & 0b00000001) == 0)
また&が…つまり今現在のswitchの状態が1か0かって事だよ!
そして、条件が「==」となっています。
これは先程の「!=」の逆。中身が同じものであったときに、if文の中身を実行します。
現在のスイッチの状態が0であったとき。
うえのif文と組み合わせて考えると、「スイッチの状態が変化したとき」に加えて「スイッチが押されているとき」つまりスイッチが「押されていない→押されている」と変化したときのみif文の中身を実行します!ということだ!

さて!ここまでながながと条件を付けてきたのだから!さぞかし中身は大層な事をしているに違いない!
y++;
…インクリメントである…
なんか…中身より箱のほうが豪華的な…
まぁ、プログラムとして重要なのは中身よりも条件分岐である。

yをインクリメントすることで、フルカラーLEDの色が変わるのだ。たった3文字のプログラムだけど重要なことなのよ

PORTB = y;
PORTD = y;
によって、頑張ってインクリメントしたyの値をLEDに出力。

ここまでをまとめると、スイッチが「押されていない→押されている」と変化したときにフルカラーLEDの色が変わる、というプログラムが完成したのだ!

…x0 = x;をお忘れなく…
これは、「今」のスイッチの状態を、過去として記憶しておく、ということだ。
未来は現在となり、現在は過去へと移り変わっていく…プログラムとはそういうものだ…



というわけで!色が変わるLEDライト完成~!あとはケースのデザインを考えれば、りっぱなLEDライトスタンドになるね!

おまけ
拡散キャップ無し
拡散キャップ無し
拡散キャップあり
拡散キャップあり

なぜか家にあった、LED光拡散キャップを付けてみた
キャップ無しではらぐらぐの足がすごい光って白く写っているのが見て取れるが、キャップを付けた場合全体的に赤く写っているのが見て取れる。
また、下の机の光り方にも注目だ。
キャップなしではLEDの真横にはひかりがあまり行かないが、キャップを付けた場合、LEDの真横に当たる机にも光が強くあたっているのがわかる。

ライトアップ用のスタンドとしてどちらが優れているかは目指したいデザインによる
お好みでってことだよ!
スポンサーサイト

コメントの投稿

非公開コメント

自分もこういった勉強を専門学校時代にしていたのですが、今となってはすっかり忘れました(^_^;)
回路図を見てももはやさっぱり…やらないと忘れてしまうものですね。
完成したらかなり綺麗になりそうですね(*^_^*)

一度やったことあるなら直ぐに思い出すハズ!
…というか図が適当すぎて学校で習ったのと違いますね…たぶん…
フルカラーLEDが思ってた以上に綺麗な色で光るので、上手く作ればだいぶかっこよくなるかもしれないです!

こんな書き方もあるんですねー
いろいろなのにいかせそうです
ありがとうございます!

すこしでもお役になてたらなによりです~
…適当すぎるので…参考程度にネ…orz
ご利用は自己責任でおねがいもうしあげます!(まるなげ)
プロフィール

てねひむ

Author:てねひむ
FC2ブログへようこそ!

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード