İçindekiler:

C: 4 Adımda UART Kodlu AVR/Arduino RFID Okuyucu
C: 4 Adımda UART Kodlu AVR/Arduino RFID Okuyucu

Video: C: 4 Adımda UART Kodlu AVR/Arduino RFID Okuyucu

Video: C: 4 Adımda UART Kodlu AVR/Arduino RFID Okuyucu
Video: Amazing arduino project 2024, Kasım
Anonim
C UART Kodu ile AVR/Arduino RFID Okuyucu
C UART Kodu ile AVR/Arduino RFID Okuyucu

RFID, envanter sistemlerinden rozet kimlik sistemlerine kadar her yerde bulunan çılgınlıktır. Daha önce bir mağazaya gittiyseniz ve giriş/çıkış noktalarındaki metal dedektörü görünümlü şeylerden geçtiyseniz, RFID'yi görmüşsünüzdür. RFID kurulumu hakkında iyi bilgiler bulabileceğiniz birkaç yer vardır ve bu talimat, seri girişi okumak için gereken C koduna vurgu yaparak Paralaks RFID okuyucusunu (Seri TTL) bir AVR'ye kurmaya odaklanır. Kod C'dedir ve herhangi bir harici kitaplık kullanmaz. Aslında, RFID okuyucunun baud hızına senkronize ederek ve bağlı olduğu dijital pini okuyarak UART kullanmadan doğrudan 2400 baud konuşur. Heyecanlı? Ben de.

Adım 1: Malları Alın

Malları Al
Malları Al

Aşağıdaki parça listesine ihtiyacınız olacak:

  • RFID Okuyucu (Paralaks #28140 39,99 $)
  • RFID etiketi (Paralaks #32397 0,99 ABD doları)
  • AVR veya Arduino klonu (stok AVR kullanıyorsanız, ayrıca bir max232, 5 x 1uF kapasitör ve bir DE9 konektörüne ihtiyacınız olacaktır)
  • lehimsiz devre tahtası

İsteğe bağlı

  • 4 konumlu başlık
  • Tel

(ve etiket bilgilerinin iletişimi için max232 vb.) Etiket verilerini RS232 üzerinden göndermek yerine favori LCD ekranınızı da bağlayabilirsiniz.

2. Adım: Parçaları Bağlayın

Parçaları Bağlayın
Parçaları Bağlayın
Parçaları Bağlayın
Parçaları Bağlayın
Parçaları Bağlayın
Parçaları Bağlayın

Şeylerin donanım tarafı oldukça kolaydır. RFID okuyucumu doğrudan devre tahtama yerleştirmek yerine, RFID okuyucuyu biraz daha iyi hareket ettirebilmek için hızlı bir kablo yapmayı seçtim. Bunun için, yalan söylediğim ve üç kabloya lehimlediğim dişi soket başlık şeridinden 4 konum kestim. Elektrik bandı getto konektörünü tamamladı. RFID okuyucunun 4 bağlantısı vardır:

  • Vcc
  • ETKİNLEŞTİRME
  • DIŞARI
  • Gnd

Muhtemelen tahmin ettiğiniz gibi, Vcc'yi +5V'ye ve Gnd'yi toprağa bağlayın. RFID okuyucu çok fazla güç tükettiğinden, çeşitli aralıklarla kapatıp açmak için ENABLE pinine vurabilirsiniz. Ben sadece devam etmeyi seçtim. Ters çevrildiği için, etkinleştirmek için DÜŞÜK çekersiniz. Alternatif olarak, toprağa bağlayabilirsiniz. Karar verirsem etkinleştirme/devre dışı bırakma seçenekleri vermesi için PIND3'e bağladım. OUT pini, okuyucunun bir etiketi okuduktan sonra seri verilerini gönderdiği yerdir. PIND2. Note'a bağladım, Paralaks Evreninde kırmızı, git demektir. Yani yeşil LED, ünitenin etkin olmadığı ve boşta olduğu anlamına gelirken kırmızı LED, ünitenin aktif olduğu anlamına gelir. *omuz silker* Git figürü.

Adım 3: Kodu Yazın

Kodu Yaz
Kodu Yaz

RFID okuyucudan veri okumak için, bir etiketin ne zaman gönderildiğini bilmeli, veriyi seri porttan çekmeli ve sonra bir yere göndermelisiniz.

RFID Okuyucu Veri Formatı

Paralaks RFID okuyucu, verileri 2400 baud'luk sabit, buzul hızında gönderir. Bir RFID etiketi 10 bayttır. Hata tespitine/düzeltmesine izin vermek için, okuyucu rastgele gürültüden yola çıkabileceğinden, 10 baytlık RFID bir başlatma ve durdurma nöbetçisi ile sınırlandırılmıştır. Başlangıç nöbetçisi satır besleme (0x0A) ve durdurma nöbetçisi satır başıdır (0x0D). Şuna benziyor:

[Sentinel'i Başlat |Byte 1|Byte 2|Byte 3|Byte 4|Byte 5|Byte 6|Byte 7|Byte 8|Byte 9|Byte 10| Sentinel'i Durdur]Bunlar üç temel adımdır.

Bir etiketin ne zaman gönderildiğini bilin

AVR'de, izlenen bir pinde bir değişikliğin meydana geldiğini üretici yazılımına bildiren bir Pin Değiştirme Kesintisi kullandım. Bunun için AVR'yi yapılandırmak kolaydır ve bayrağı ayarlamayı, MCU'ya hangi pini izlemek istediğinizi söylemeyi ve global kesme bitini ayarlamayı gerektirir. PCINT'i yapılandır

BSET(PCICR, PCIE2); // pin değiştirme kesme kontrol kaydı pcie2 BSET(PCMSK2, PCINT18); // PCINT18 (PD2) için pin değiştirme kesmesini etkinleştir BSET(SREG, 7); // SREG I-bit'i ayarlaKesinti hizmeti rutininizi yazın ISR'nizi kısa tutmak istiyorsunuz, bu nedenle kesinti vektörümde tüm baytı parça parça okuyorum ve baytı küresel bir geçici karakter dizisinde saklıyorum. Her kesintide aşağıdakileri yapıyorum:

  • Başlangıç noktasında olduğumdan emin olmak için kontrol et
  • Zamanlamayı 2400 baud'da (RFID okuyucunun hızı) orta darbeye ortalayın
  • Başlangıç bitini atla ve bir sonraki bitin ortasına kadar duraklat
  • Her biti işaretsiz bir tamsayıya okuyun
  • 8 bitim olduğunda, baytı bir karakter dizisine koy
  • 12 bayt topladığımda, MCU'ya etiketin hata tespiti için okunduğunu bildirin.

Seri rutinlerde deneysel olarak belirlenen gecikmeler için David Mellis'in kodunu değiştiren Mikal Hart'ın SoftSerial kodunu değiştirdim.

RS232 Çıkışını Ayrıştırma

PCINT rutini, RFID okuyucudan RS232 çıkışını okumak için kodu içerir. 12 bayt (10 bayt RFID artı sentinels) aldığımda, bDataReady'yi 1'e ayarladım ve ana döngünün verileri işlemesine ve görüntülemesine izin verdim.

// bu kesme işleyicisidirISR(PCINT2_vect){ if (BCHK(PIND, RFID_IN)) // Başlangıç biti düşük dönüşe gider; uint8_t bit = 0; TunedDelay(CENTER_DELAY); // Başlangıç bitinde merkez (uint8_t x = 0; x < 8; x++) { TunedDelay(INTRABIT_DELAY); // biraz geç kardeşim… if (BCHK(PIND, RFID_IN)) BSET(bit, x); başka BCLR(bit, x); } TunedDelay(INTRABIT_DELAY); // durdurma bitini atla RFID_tag[rxIdx] = bit; ++rxIdx; if (rxIdx == 12) bDataReady = 1;}

Etiketinizi Görüntüleyin

main()'de, for(ever) döngüsü sırasında, tüm RFID yapısının gönderildiğini belirten bDataReady'nin ayarlanıp ayarlanmadığını kontrol ediyorum. Daha sonra bunun geçerli bir etiket olup olmadığını kontrol ediyorum (yani başlangıç ve bitiş karakterleri sırasıyla 0x0A ve 0x0D'dir) ve eğer öyleyse, RS232 bağlantımdan gönderirim.

for (;;){ if (bDataReady) {#ifdef _DEBUG_ USART_tx_S("Başlangıç baytı: "); USART_tx_S(itoa(RFID_tag[0], &ibuff[0], 16)); buff[0] = 0; buff[1] = 0; USART_tx_S("\nBitti durdur: "); USART_tx_S(itoa(RFID_tag[11], &ibuff[0], 16));#endif if (ValidTag()) { USART_tx_S("\nRFID Etiketi: "); for(uint8_t x = 1; x < 11; x++) { USART_tx_S(itoa(RFID_tag[x], ibuff, 16)); if (x != 10) USART_tx(&apos:&apos); } USART_tx_S("\n"); } rxIdx = 0; bDataReady = 0; }}

4. Adım: Kodlama ve Veda

Bu sayfa, ilgili kodu içeren bir zip dosyası içerir. AVR Studio 4.16'da yazılmıştır. Programcının not defteri, Eclipse veya vi (veya başka bir şey) kullanıyorsanız, güvenilir bir Makefile dosyasını dizine kopyalamanız ve bu dosyaları kaynak satırına eklemeniz gerekir. Ayrıca, seri okuma bölümünün zamanlamasının bir 16MHz MCU. Farklı bir saat frekansında çalışıyorsanız, baud hızı darbelerini merkezlemek için ayarlanmış gecikmeleri deneysel olarak belirlemeniz gerekecektir. Umarım bu talimat size bir şekilde yardımcı olmuştur. Nasıl geliştirilebileceğine dair herhangi bir öneriniz varsa, bana bildirmekten çekinmeyin!

Önerilen: