オフィスやショッピングモールなど、認証カードを持っている人だけが入室できる場所がたくさんあります。これらのシステムはRFID通信システムを使用しています。RFIDはショッピングモールで盗難を防ぐために使用されます。製品にはRFIDチップのタグが付けられており、RFIDチップを持って建物を離れると、アラームが自動的に鳴ります。RFIDタグは、砂の一部と同じくらい小さいように設計されています。RFID認証システムは設計が簡単で、コストも安いです。最近の一部の学校や大学では、RFIDベースの出席システムを使用しています。
このプロジェクトでは、セキュリティを目的としたRFIDベースの料金徴収システムを設計します。したがって、このシステムはゲートを開き、許可されたRFIDタグを持つ人々のみを許可します。許可されたタグ所有者IDはATMEGAマイクロコントローラーにプログラムされており、それらの所有者のみが敷地内への出入りを許可されています。
必要なコンポーネント
ハードウェア: ATmega32マイクロコントローラー、電源(5v)、AVR-ISPプログラマー、JHD_162ALCD(16x2 LCDモジュール)、100uFコンデンサー(電源に接続)、ボタン、10KΩ抵抗、100nFコンデンサー、LED(2個)、EM-18( RFIDリーダーモジュール)、L293DモータードライバーIC、5VDCモーター。
ソフトウェア: Atmel studio 6.1、progispまたはflashmagic。
回路図と動作説明
上記のRFID料金徴収システム回路では、ATMEGA32のPORTAがLCDのデータポートに接続されています。ここで、PORTCを通常の通信ポートとして使用したい場合は、ヒューズバイトを変更してPORTCからATMEGAへのJTAG通信を無効にすることを忘れないでください。 16x2 LCDでは、バックライトがある場合は全体で16ピン、バックライトがない場合は14ピンになります。バックライトピンに電力を供給するか、そのままにしておくことができます。 14ピンには8つのデータピン(7-14またはD0-D7)、2つの電源ピン(1&2またはVSS&VDDまたはgnd&+ 5v)、コントラスト制御用の3番目のピン(VEE-厚さを制御します文字を表示する必要があります)、3つの制御ピン(RS&RW&E)。
回路では、私が2つの制御ピンしか取っていないことがわかります。これにより、より良い理解の柔軟性が得られます。コントラストビットとREAD / WRITEはあまり使用されないため、グランドに短絡することができます。これにより、LCDが最高のコントラストと読み取りモードになります。ENABLEピンとRSピンを制御して、それに応じて文字とデータを送信する必要があります。
LCD用に作成された接続を以下に示します。
PIN1またはVSSをアースに接続
PIN2またはVDDまたはVCCから+ 5v電源
PIN3またはVEEを地面に接続(初心者に最適な最大のコントラストを提供)
MCUのPD6へのPIN4またはRS(レジスタ選択)
PIN5またはRW(読み取り/書き込み)をグランドに接続(LCDを読み取りモードにすると、ユーザーの通信が容易になります)
マイクロコントローラのPD5へのPIN6またはE(有効)
PIN7またはD0からPA0
PIN8またはD1からPA1
PIN9またはD2からPA2
PIN10またはD3からPA3
PIN11またはD4からPA4
PIN12またはD5からPA5
PIN13またはD6からPA6
PIN14またはD7からPA7
回路では、8ビット通信(D0-D7)を使用していることがわかります。ただし、これは必須ではなく、4ビット通信(D4-D7)を使用できますが、4ビット通信プログラムでは少し複雑になるため、8ビット通信を選択しました。
したがって、上記の表を単に観察するだけで、LCDの10ピンをコントローラーに接続します。8ピンはデータピンで、2ピンは制御用です。
先に進む前に、シリアル通信について理解する必要があります。ここでのRFIDモジュールは、データをコントローラーにシリアルに送信します。他の通信モードもありますが、簡単に通信できるようにRS232を選択しています。モジュールのRS232ピンはATMEGAのRXDピンに接続されています。
RFIDモジュールによって送信されるデータは次のようになります。
ここで、RFIDモジュールインターフェイスには、次の機能が必要です。
1.コントローラのRXDピン(データ受信機能)を有効にする必要があります。
2.通信はシリアルであるため、データバイが受信されるたびに知る必要があります。これにより、完全なバイトが受信されるまでプログラムを停止できます。これは、データ受信の完全な割り込みを有効にすることによって行われます。
3.RFIDは8ビットモードでデータをコントローラーに送信します。したがって、一度に2文字がコントローラーに送信されます。これを上の図に示します。
4.上の図から、モジュールによって送信されるデータにはパリティビットがなく、1ストップビットがあります。
上記の機能はコントローラレジスタに設定されています。それらについて簡単に説明します。
赤(RXEN):このビットはデータ受信機能を表します。モジュールからのデータをコントローラが受信するには、このビットを設定する必要があります。また、コントローラのRXDピンを有効にします。
ブラウン(RXCIE):このビットは、データ受信が成功した後に割り込みを取得するために設定する必要があります。このビットを有効にすることで、8ビットのデータを受信した直後に知ることができます。
PINK(URSEL):このビットは、UCSRCの他のビットを有効にする前に設定する必要があります。設定後、UCSRC、URSELの他の必要なビットを無効にするか、ゼロにする必要があります。
黄色(UCSZ0、UCSZ1、UCSZ2):これらの3ビットは、一度に受信または送信するデータビットの数を選択するために使用されます。
RFIDモジュールによって送信されるデータは8ビットデータタイプであるため、UCSZ0、UCSZ1を1に、UCSZ2を0に設定する必要があります。
オレンジ(UMSEL):このビットは、システムが非同期(両方とも異なるクロックを使用)または同期(両方とも同じクロックを使用)で通信しているかどうかに基づいて設定されます。
モジュールとコントローラーは異なるクロックを使用するため、このビットはデフォルトですべてゼロに設定されているため、ゼロに設定するか、そのままにしておく必要があります。
緑(UPM1、UPM0):これらの2つのビットは、通信で使用しているビットパリティに基づいて調整されます。
RFIDモジュールはパリティなしでデータを送信するため、UPM1、UPM0の両方をゼロに設定するか、レジスタのすべてのビットがデフォルトでゼロに設定されているため、そのままにしておくことができます。
青(USBS):このビットは、通信中に使用するストップビットの数を選択するために使用されます。
RFIDモジュールは1ストップビットでデータを送信するため、USBSビットをそのままにしておく必要があります。
最後に、ボーレートを設定する必要があります。上の図から、RFIDモジュールが9600bps(ビット/秒)のボーレートでデータをコントローラーに送信することが明らかです。
ボーレートは、適切なUBRRHを選択することによってコントローラーで設定されます。
UBRRH値は、ボーレートとCPU水晶周波数を相互参照することによって選択されるため、相互参照することにより、UBRR値は「6」と見なされ、ボーレートが設定されます。
図に示すように、コントローラーからの2つのピンはL293Dに接続されます。これは、低電力DCモーターの速度と回転方向を制御するために使用されるHブリッジです。
L293Dは、低電力DCモーターを駆動するために設計されたHブリッジICであり、図に示されています。このICは2つのHブリッジで構成されているため、2つのDCモーターを駆動できます。したがって、このICは、マイクロコントローラーの信号からロボットモーターを駆動するために使用できます。
前に説明したように、このICにはDCモーターの回転方向を変更する機能があります。これは、INPUT1とINPUT2の電圧レベルを制御することによって実現されます。
ピンを有効にする |
入力ピン1 |
入力ピン2 |
モーターの方向 |
高い |
低 |
高い |
右に曲がる |
高い |
高い |
低 |
左折してください |
高い |
低 |
低 |
やめる |
高い |
高い |
高い |
やめる |
したがって、上記の表に示すように、時計回りの回転では、2Aを高く、1Aを低くする必要があります。同様に、反時計回りの場合、1Aは高く、2Aは低くする必要があります。
承認されたカードがモジュールに近づくと、モーターは時計回りに1秒間移動するようにプログラムされ、料金所が戻ってきた1秒後に料金所が開かれ、料金所が閉じていることを示します。料金所の働きは、以下のCコードのステップバイステップで最もよく説明されています。
プログラミングの説明
以下は、RFID料金徴収システムのコードの行ごとの説明です。以下のコードを読むことで、このプロジェクトの概念と動作を理解できます。ダウンロードまたはコピーするには、ページの下部に完全なコードがあります。
#include //ピンのデータフロー制御を有効にするヘッダー
#define F_CPU 1000000 //接続されているコントローラーの水晶周波数を通知
#include
#define E 5 // LCDイネーブルピンに接続されているため、PORTDの5番目のピンに「enable」という名前を付けます
#define RS 6 // PORTDの6番目のピンに「registerselection」という名前を付けます。これは、LCDRSピンに接続されているためです。
void send_a_command(unsigned char command);
void send_a_character(unsigned char character);
void send_a_string(char * string_of_characters);
int main(void)
{{
DDRA = 0xFF; //ポルタを出力ピンとして配置
DDRD = 0b11111110;
_delay_ms(50); // 50msの遅延を与える
DDRB = 0b11110000; //いくつかのportBピンを入力として使用します。
UCSRB-=(1 <
UCSRC-=(1 <
UCSRC&=〜(1 <
UBRRH&=〜(1 <
UBRRL = 6; //ボーレートの設定//以下にはタグのIDが含まれています。これらはタグごとに変更する必要があります。プロジェクトを機能させるには、これらを更新する必要があります。
/ *プログラムをコントローラーにダンプした後、許可されている必要のあるカードを取得し、タグIDを取得する必要があります。これらはRFIDモジュールの近くにタグを配置することで取得され、IDが画面に表示されます。IDを取得したら、以下のID番号を新しいID番号に置き換えてプログラムを更新する必要があります。
char ADMIT = {{(0x97)、(0xa1)、(0x90)、(0x92)}、{(0x97)、(0xa1)、(0x90)、(0x93)}、{(0x97)、(0xa1)、( 0x90)、(0x94)}、{(0x97)、(0xa1)、(0x90)、(0x95)}、{(0x97)、(0xa1)、(0x90)、(0x96)}}; |
上記では、5枚のカードのみを承認しています。これらは任意の数に変更できます。
たとえば、デフォルトのプログラムがコントローラーにダンプされていると考えて、許可する必要のあるカードを入手します。モジュールの近くに次々に配置すると、それぞれのIDがxxxxxxxx(907a4F87)として取得されます。
タグが7つある場合、8ビットIDが7つあります。* /
//今では7枚のカードの場合は次のようになります // char ADMIT = {{(0x90)、(0x7a)、(0x4F)、(0x87)}、; //モジュールによって送信されたIDを表示するためのメモリを割り当てます int i = 0; intvote = 0; int k = 0; send_a_command(0x01); //画面をクリア0x01 = 00000001 _delay_ms(50); send_a_command(0x38); // 8ビットコマンド/データモードを使用していることをlcdに伝えます _delay_ms(50); send_a_command(0b00001111); // LCD画面がオンでコースラーが点滅 char MEM; //タグの完全なIDを格納するためのメモリの割り当て send_a_string( "RFID番号"); //文字列を送信します send_a_command(0x80 + 0x40 + 0); //コースラーを2行目に移動 while(1) {{ while(!(UCSRA&(1 <
{{ } COUNTA = UDR; // UDRは、受信した8ビットデータを格納し、整数に変換されます。 MEM = COUNTA; //最初の2文字がメモリに更新されます itoa(COUNTA、SHOWA、16); // LCDに変数番号を入力するコマンド(変数番号、置換する文字、ベースは可変(ここではbase10で数を数えているので10)) send_a_string(SHOWA); //コースターをLCDに配置した後、2人目の人物の文字(変数番号に置き換えられます)を表示するようにディスプレイに指示します while(!(UCSRA&(1 <
{{ } COUNTA = UDR; itoa(COUNTA、SHOWA、16); send_a_string(SHOWA); MEM = COUNTA; // 3番目と4番目の文字がメモリに更新されます while(!(UCSRA&(1 <
{{ } COUNTA = UDR; itoa(COUNTA、SHOWA、16); send_a_string(SHOWA); MEM = COUNTA; // 5番目と6番目の文字がメモリに更新されます while(!(UCSRA&(1 <
{{ } COUNTA = UDR; itoa(COUNTA、SHOWA、16); send_a_string(SHOWA); MEM = COUNTA; // 7文字目と8文字がメモリに更新されます send_a_string( ""); send_a_command(0x80 + 0x40 + 0); UCSRB&=〜(1 <
for(i = 0; i <5; i ++) {{ if((MEM == ADMIT)&(MEM == ADMIT)&(MEM == ADMIT)&(MEM == ADMIT)) {//一度に2文字をメモリ内の文字と比較して承認購入をチェックする PORTB-=(1 <
PORTB&=〜(1 <
_delay_ms(220); //遅延 _delay_ms(220); _delay_ms(220); _delay_ms(220); _delay_ms(220); _delay_ms(220); PORTB-=(1 <
PORTB&=〜(1 <
_delay_ms(220); _delay_ms(220); _delay_ms(220); _delay_ms(220); _delay_ms(220); _delay_ms(220); PORTB&=〜(1 <
PORTB-=(1 <
} } UCSRB-=(1 <
} } void send_a_command(unsigned char command) {{ PORTA =コマンド; PORTD&=〜(1 <
PORTD- = 1 <
_delay_ms(50); PORTD&= 〜1 <
PORTA = 0; } void send_a_character(unsigned char character) {{ PORTA =文字; PORTD- = 1 <
PORTD- = 1 <
_delay_ms(50); PORTD&= 〜1 <
PORTA = 0; } void send_a_string(char * string_of_characters) {{ while(* string_of_characters> 0) {{ send_a_character(* string_of_characters ++); } } |