İçindekiler:
Video: C: 4 Adımda UART Kodlu AVR/Arduino RFID Okuyucu
2024 Yazar: John Day | [email protected]. Son düzenleme: 2024-01-30 13:22
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
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
Ş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
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:
5 Kolay Adımda Doom'u iPod'unuzda Oynayın!: 5 Adımda
5 Kolay Adımda Doom'u iPod'unuzda Oynayın!: Rockbox'ı iPod'unuzda Doom ve düzinelerce başka oyunu oynamak için nasıl çift önyükleme yapacağınıza dair adım adım kılavuz. Yapması gerçekten kolay bir şey, ancak birçok insan iPod'umda doom oynadığımı görünce şaşırıyor ve talimatla karıştırılıyor
6 Ucuz ve Kolay Adımda Arduino Uno Balık Besleyici!: 6 Adımda
6 Ucuz ve Kolay Adımda Arduino Uno Balık Besleyici!: Yani bu proje için biraz arka plan gerekli olabilir. Evcil balıkları olan insanlara muhtemelen benimle aynı sorunla karşılaşıldı: tatiller ve unutkanlık. Balığımı beslemeyi sürekli unutuyordum ve balıklar suya girmeden önce bunu yapmak için uğraşıyordum
4 Adımda 3D Baskılı Protez El!: 4 Adımda
4 Adımda 3D Baskı Protez El!: Bu proje benim tarafımdan basılmış bir protez eldir, protez ve 3D baskı hakkında biraz daha bilgi edinmek istiyorum. Bu en iyi proje olmasa da, biraz deneyim sahibi olmanın ve nasıl oluşturulacağını öğrenmenin harika bir yolu
Roomba'dan Rover'a Sadece 5 Adımda!: 5 Adımda
Roomba'dan Rover'a Sadece 5 Adımda!: Roomba robotları, robot dünyasına parmaklarınızı sokmanın eğlenceli ve kolay bir yoludur. Bu Eğitilebilir Kitapta, basit bir Roomba'nın çevresini aynı anda analiz eden kontrol edilebilir bir geziciye nasıl dönüştürüleceğini detaylandıracağız. Parça Listesi1.) MATLAB2.) Roomb
Sadece 10 Adımda Ucuza Taşınabilir Reklam Tabelası!!: 13 Adımda (Resimli)
Sadece 10 Adımda Ucuza Taşınabilir Reklam Tabelası !!: Kendi, ucuz, taşınabilir reklam tabelanızı yapın. Bu işaret ile mesajınızı veya logonuzu şehrin herhangi bir yerindeki herkese gösterebilirsiniz. Bu talimat, https://www.instructables.com/id/Low-Cost-Illuminated-… adresindeki/iyileştirme/değişime bir yanıttır