İnternet. Bilgisayar. Yardım. Tavsiye. Tamirat

Arduino'ya matris klavye bağlama. Arduino 16 tuşlu klavye stm32 arduino bağlantısına matris klavye bağlama

STM32 tabanlı F103C8T6 geliştirme kartı, parametreler açısından benzer boyuttaki Arduino Nano veya Leonardo'dan önemli ölçüde önde, hız olarak ise Arduino DUE'ye yakındır. Denemeye ilgi var, ancak yeni başlayan biri bu kartı ilk kez başlatıp programlamakta zorluk çekebilir. Artık Arduino IDE aracılığıyla eskizleri yüklemek mümkün. Daha fazla detay...

  1. STM32F103C8T6 ve Arduino Nano v3.0 arasındaki farklar
  2. Demir hazırlama
  3. Yazılım hazırlama
  4. Panoya bir çizim yükleniyor (yanıp sönüyor)

1. STM32F103C8T6 ve Arduino Nano v3.0 arasındaki farklar

2. Demir hazırlama

İş için ihtiyacımız olacak:

  • STM32F103C8T6 kartının kendisi
  • Dupont dişi-dişi bağlantı kabloları

Programlama modunu etkinleştirmek için STM kartında atlama telleri ayarlanmalıdır: birincisi 1'e, ikincisi 0'a.

FTDI dönüştürücüyü 3,3 Volt güç kaynağına (jumper/jumper) geçirin

Kartı (P) ve dönüştürücüyü (K) kablolarla bağlayın:

P(A9) -> K(RX)

P(A10) -> K(TX)

P(GND) -> K(GND)

P(3.3) -> K(VCC)

3. Yazılımın hazırlanması

  1. Arduino IDE için STM32 kartlarını destekleyecek bir eklenti indirin
  2. Arşivi, Arduino IDE klasörünüzde bulunabilecek HARDWARE klasörüne açın.
  3. Arduino IDE'yi başlatın (veya açıksa yeniden başlatın) ve bölümün görünüp görünmediğini kontrol edin STM32 Anakartları Plats listesinde

4. Bir taslağın panoya yüklenmesi (yanıp sönme)

Adım 3.b'de açtığımız klasörde Arduino_STM32\examples\Digital\Blink\ yoluna gidin ve Arduino IDE üzerinden Blink.ino dosyasını açın veya metni buradan alabilirsiniz:

geçersiz kurulum() ( // dijital pin PB1'i çıkış olarak başlatıyoruz. pinMode(PC13, ÇIKIŞ); ) // döngü fonksiyonu sonsuza kadar tekrar tekrar çalışır void loop () ( digitalWrite ( PC13 , YÜKSEK ) ; // LED'i açın (YÜKSEK voltaj seviyesidir) gecikme(1000); // ikinci bir digitalWrite bekleyin (PC13, LOW); // voltajı DÜŞÜK yaparak LED'i kapat gecikme(1000); // bir saniye bekle)
  • Pano seç Genel STM32F103C serisi
  • Seçmek Varyant: (20k RAM. 64k Flash)
  • Seçmek Yükleme yöntemi: "Seri"
  • Seçmek Liman:(FTDI dönüştürücüye karşılık gelen bağlantı noktası)

düğmesine basın Yükve sonuç hemen görünür olmalıdır.

  • öğretici

Arduino projelerinizi yükseltmek mi istiyorsunuz? Daha hızlı çalışmalarını sağlayın, ölçümleri ve ayarlamaları daha doğru yapın ve hatalar ekleyin (yeni cihazlarda bunlar kaçınılmazdır). O halde bu yazı tam size göre.

Arduino konusu giderek insanlığın zihnini meşgul ediyor, ancak er ya da geç bir şeyi kaçırdığımız gerçeğiyle karşı karşıya kalıyoruz, örneğin bütçe/boyut/bağlantı noktası pinleri/bit kapasitesi/performans... Bilge bir adamın dediği gibi: “İsteyen fırsat arar, istemeyen ise sebep arar.”

İyi insanlar bunu anlıyor ve yavaş yavaş STM32'yi Arduino konusuna tanıtmaya başlıyor çünkü birçok Arduino kartının temelini oluşturan sekiz bitlik AVR mikrokontrolörleri, verilen görevlerle her zaman baş edemiyor.

Bu makalenin video formatında kısa özeti:



Tamam, daha az şarkı sözü ve konuya daha yakın. Bu yazıda mikrodenetleyici tabanlı ucuz bir geliştirme kartına bakacağım:

Başlangıç ​​olarak, STM32 kartının ana parametrelerini ve fiyattaki analogunu - Arduino Nano V3.0 - karşılaştıralım:

  • Çalışma frekansı 72 MHz, Arduino için 16;
  • Flash bellek kapasitesi 64 KB, 32 KB;
  • STM32, RAM olarak da bilinen (değişkenlerin depolandığı yer) 20 KB kadar RAM'e sahiptir, Arduino'da ise yalnızca 2;
  • Hızlı bir 12 bitlik ADC, AVR mikrokontrolörlerini temel alan Arduino kartları (bu genellikle çoğunluktadır) 10 bitlik bir ADC kullanır. Bu, STM32 durumunda analogRead(*); fonksiyonunun olduğu anlamına gelir. 0..1023'e karşılık 0..4095 değerini döndürür; bu ilk durumda daha doğru ölçümlere yol açar;
  • 16 bit donanım PWM'si, Arduino kartlarındaki 8'e karşılık analogWrite(*) işlevi; pwmWrite(*); zayıf 0..255'e karşı 0..65535 değerini alabilir. Bu, PWM kullanılarak çalıştırılan motorlarımızı, servolarımızı ve diğer cihazlarımızı daha doğru bir şekilde kontrol etmemizi sağlayacak;
  • USB ile donanım çalışması, maliyeti 2 dolardan az olan tek bir Arduino kartının bile övünemeyeceği bir özellik;
  • Besleme voltajı - 2 ila 3,6V (doğrudan 2 AA pil için uyarlanmış), Arduino kartları için 2,7...5V;
  • Bu yazının yazıldığı sırada fiyatlar 1,9 dolara karşılık 1,8 (aliexpress) idi.
Açıkçası, STM32 tabanlı hata ayıklama kartı, maliyet haricinde her açıdan Arduino Nano'dan daha iyi performans gösteriyor, ancak 10 sentin daha yüksek performans için iyi bir fiyat olduğunu kabul etmelisiniz ve STM32'nin doldurulduğu çevre birimlerine gelince, ben Genel olarak sessizim, DMA'ların maliyeti veya mikro denetleyiciye entegre edilmiş gerçek zamanlı bir saat nedir?

Bütün bunlar bir araya geldiğinde bu anakartı her bakımdan son derece çekici kılıyor; tek bir şey dışında; benim gibi yeni başlayanlar için STM32 konusu çok zaman alıcı görünüyor; bu mikrokontrolörleri programlamaya adanmış birçok site var. Ancak STM32'yi Arduino IDE ile eşleştirirseniz giriş eşiği son derece düşük bir seviyeye düşer. Her ne kadar dedikleri gibi, "Her bal fıçısında merhemde bir sinek vardır" ama daha fazlası aşağıda.

Arduino IDE ile çalışacak şekilde tahtayı hazırlamaya başlayalım. Yapmanız gereken ilk şey, mikrodenetleyiciye özel bir önyükleyici yüklemektir; bu, kartı donanım USB'si aracılığıyla doğrudan geliştirme ortamından flaşlamanıza olanak tanır. Bunu yapmak için üstteki jumper'ı (“BOOT0” olarak da bilinir) “1” konumuna getirmeniz gerekir:

BOOT0 ve BOOT1 atlama telleri ne işe yarar?

Gerçek şu ki, STM32'nin fabrikadan sistem belleği adı verilen belleğe flaşla gönderilen özel bir önyükleyicisi var; bu, belirli tip programcılara başvurmadan kartı en yaygın USB'den UART'a adaptör aracılığıyla flaşlamanıza olanak tanıyor ST-Link V2.


Daha sonra USB'den UART'a bir adaptöre ihtiyacımız var. Bunu hatırlamakta fayda var STM32, bu 3,3 V mantığıdır, 5V ile uyumluluk garanti edilmediğinden, 3.3/5V mantığı ile çalışma modlarını seçebilme özelliğine sahip olan UART'a USB kullanılması tavsiye edilir. CH340G'ye dayalı ucuz bir adaptör kullandım:


* Gördüğünüz gibi üretici akı kaldırmakla uğraşmadı elbette, işi hiçbir şekilde etkilemiyor.

Kartı bir USB'den UART'a adaptöre aşağıdaki gibi bağladım:

G<->GND;
5V<->5V;
PA10<->TXD;
PA9<->RXD.


* Kart üzerindeki PA10/PA9 basitçe A10/A9 olarak etiketlenmiştir - bu portlar ilk donanım USART'tır, kartta 3 adet bulunmaktadır, ayrıca 2 adet donanım I2C ve 2 adet SPI bulunmaktadır.

Kolaylık olması açısından karta 5 V'tan güç verdim; 3,3 V'tan güç almak için kartta bir “3,3” pin var. Dikkat, 5 V mikrodenetleyiciye kolaylıkla zarar verebilir bu nedenle bağlantıya gereken özeni gösterin.

Flash Loader Göstericiyi indirin, kurun ve çalıştırın (makalenin arşivinde mevcuttur):

Adaptörümüzün COM port numarasını seçiyoruz, benim durumumda bu COM43 ve ardından “İleri” ye tıklayın:

Mikrodenetleyicim yeni olduğundan, henüz üzerine sinek oturmadığından, kimse bir şey yazmadı (tabii ki üreticinin kendisi dışında), o zaman varsayılan olarak okuma koruması var, program bizi “ Korumayı kaldır” butonuna bastığınızda Flash bellek temizlenecek, yani orada herhangi bir firmware varsa silinecektir. Benim durumumda orada işe yarar hiçbir şey yok, bu yüzden basmakta özgürüm. Sonra şunları görüyorum:

“Tamam”a tıklayın:

Geliştirme kartım STM32F103 mikrokontrolcüyü temel aldığından C8- 64 KB Flash hafıza var ayrıca STM32F103 var C.B. iki kat daha fazla Flash içeren mikrodenetleyici.

Tekrar “İleri” ve aşağıdaki pencereyi görüyoruz:

“Cihaza indir”i seçin ve “...”e tıklayın:

Dosya tipini *.bin olarak değiştirip STM32duino-bootloader projesinden alabileceğimiz “generic_boot20_pc13.bin” (arşivde de mevcut) dosyasını açıyoruz.

Daha sonra Arduino IDE geliştirme ortamı için özel bir STM32 çekirdeği indirmeniz gerekiyor (makalenin arşivinde de mevcut). Bu makalenin yazıldığı sırada burada bir nüans var; çekirdek, 1.6.5'in üzerindeki geliştirme ortamı sürümlerinde çalışmaz 1.6.5-r5'im var ve bu da .
Çekirdeğin performansı üzerinde test edilmiştir.

Benim durumumda tam yol şöyle görünüyor - “C:\Users\RSK\Documents\Arduino\hardware”

Elbette sistem cihazı algılayamayacağı için anakarta sürücüleri de yüklemeniz gerekiyor. “Belgelerim\Arduino\hardware\Arduino_STM32\drivers\win” (veya makalenin arşivi olması durumunda “drivers\win”) klasörüne gidin ve “install_drivers.bat” dosyasını yönetici olarak çalıştırın:

Bundan sonra, üst atlama kablosunu (“BOOT0” olan) “0” konumuna getirin ve kartı bir microUSB kablosuyla bilgisayara bağlayın:

Cihaz yöneticisinde “Maple DFU” veya “Maple Serial (COM*)” olarak tanımlanmalıdır:

İlk bağlantıdan sonra kartın neden farklı bilgisayarlarda farklı şekilde algılandığı tam olarak belli değil, ancak mesele bu değil, hadi Arduino IDE'yi kurmaya devam edelim.

Burada Arduino Due kartı için çekirdeği kurmanız gerekiyor. En son sürümü seçin ve “Yükle”ye tıklayın:

Sonra Araçlar -> Kart -> “Genel STM32F103C”, ardından Değişken: “STM32F103C8 (20k RAM. 64k Flash)”, Yükleme Yöntemi: “STM32duino bootloader”, Bağlantı Noktası - kartın COM bağlantı noktasının numarası, genel olarak her şey ekran görüntüsündeki gibi:

İşte bu, kart Arduino IDE geliştirme ortamında ürün yazılımı ve programlamaya hazır. Çekirdeğe "dikilmiş" örneklerden bazı eskizleri flashlayalım, Dosya -> Eskizlerin bulunduğu klasör -> donanım -> Arduino_STM32 -> STM32F1 -> kütüphaneler -> A_STM32_Examples -> Dijital -> Yanıp Sönme'ye gidin:

Mikrodenetleyiciler dünyasındaki klasik “Merhaba Dünya”. Karttaki LED bu bağlantı noktasına bağlı olduğundan PB1'i PC13 olarak değiştiriyoruz:


* Bu arada PC13 ayağında düşük seviyede yanıyor.

“Yükle” düğmesine tıklayın, ürün yazılımını yükledikten sonra geliştirme ortamı aşağıdaki gibi bir şey görüntüleyecektir:

"Tamamlamak!
Çalışma zamanı moduna geri dönmek için USB'yi sıfırlama
indirmeden sonra sıfırlama hatası: usb_reset: cihaz sıfırlanamadı, kazanma hatası: Belirtilen dosya bulunamıyor."

Ancak ürün yazılımı başarıyla yüklendi, ancak bu her zaman böyle olmasa da bazen Arduino IDE başka mesajlar görüntülüyor.

DFU cihazı bulunamadı

Şunun gibi bir mesaj gördüğünüzde:

"dfu-util - © 2007-2008, OpenMoko Inc.'e aittir.
DFU cihazı bulunamadı:
Bu Program Özgür Yazılımdır ve KESİNLİKLE GARANTİSİ YOKTUR"

Bu, kartın yanıp sönemeyeceği anlamına gelir.

DFU cihazı aranıyor...

Geliştirme ortamı sorun yaşadığında:

"DFU cihazı aranıyor...
Anakartın sürekli önyükleyici modunda olduğunu ve dfu programlamayı denemeye devam ettiğini varsayarsak..."

Ve başka hiçbir şey olmuyor, şu anda sıfırlama düğmesine tıklayarak kartı yeniden başlatmayı deneyin. Benzetme yapmak gerekirse, Arduino Pro Mini'deki gibidir.

Ve şimdi makalenin başında yazdığım "merhemde uçmak" konusuna gelince: Bazı nedenlerden dolayı, geliştirme ortamında kartın yanıp sönmesi her zaman mümkün olmuyor, dahası, bilgisayar tarafından her zaman algılanmıyor. . Buna kendim için şu şekilde karar verdim: Aygıt yazılımını yüklemeden önce ("Yükle" düğmesine basmadan önce), karttaki "Sıfırla" seçeneğine tıklıyorum ve aygıt yazılımını yükledikten sonra kartı yeniden başlatıyorum. Bu durumda tahtanın parlatılma olasılığı %99'dur. Neden bu şekilde çalıştığı belli değil ama bu bir gerçek. Er ya da geç bu hatanın düzeltileceğini ve gerektiğinde her şeyin otomatik olarak yeniden başlatılacağını düşünüyorum. Bunu daha hızlı düzeltmek için bu harika STM32 hata ayıklama panosunun topluluğunun büyümesi gerekiyor, bu nedenle bu makaleyi arkadaşlarınızla, özellikle de programcı arkadaşlarınızla paylaşın.

Pin çıkışıyla ilgili olarak:

Tıklanabilir

Bulabildiğim en iyi şey mikro denetleyicinin pin düzeniydi (yeni bir sekmede açın):


(c) www.stm32duino.com/viewtopic.php?p=11137

Bağlantı noktasına tam adıyla erişilmelidir, örneğin:

digitalWrite(PB0, DÜŞÜK);
analogWrite(PA8, 65535); pwmWrite(PA8, 65535);
analogRead(PA0);
LiquidCrystal lcd(PB0, PA7, PA6, PA5, PA4, PA3);

Ayrıca docs.leaflabs.com/docs.leaflabs.com/index.html web sitesine gitmenizi tavsiye ederim, İngilizce de olsa Arduino IDE'de programlama konusunda pek çok ilginç şey var.

Çekirdek dosyalarını karıştırdım ve ilginç bir dosya buldum:
Belgeler\Arduino\donanım\Arduino_STM32\STM32F1\varyantlar\generic_stm32f103c\board.cpp

Destekleyen tüm bağlantı noktaları burada listelenmiştir:

  • PWM, yani analogWrite() işlevi; pwmWrite(); - PB0, PA7, PA6, PA3, PA2, PA1, PA0, PB7, PB6, PA10, PA9, PA8 ve çip pin çıkışında işaretlenenlerin hepsi bu değil;
  • ADC, yani analogRead(); - PB0, PA7, PA6, PA5, PA4, PA3, PA2, PA1, PA0.

O yüzden bunu aklınızda tutun. Gerçi bu 1,9$'lık bir anakart için fazlasıyla yeterli.

Ayrıca PA12/PA11 pinlerinin D+/D- USB'ye bağlı olduğunu fark ettim, bir kez daha onlara hiç dokunmamak daha iyi çünkü söz konusu olan 2 dolarlık çipli bir fiberglas parçası değil, bilgisayarın anakartı. .

Geliştirme kurulu diyagramı:

Ve sonunda:

". Bugün Arduino kartına bir matris klavye bağlıyoruz ve onunla ilginç devrelere de bakıyoruz. Böyle bir klavyeyi düğmelerden ve baskılı devre kartından kendiniz yapabilirsiniz. Makalede video talimatları, program listeleri, bağlantı şemaları ve gerekli bileşenler yer almaktadır.

Metnin çoğu program kodunun açıklamasını içerir; onu indirebilir veya makalenin altındaki videoyu izleyebilirsiniz.

Böyle bir klavyeyi kendiniz yapabilirsiniz. Bunu yapmak için bir baskılı devre kartına, 12 veya 16 normal düğmeye ve bağlantı kablolarına ihtiyacınız olacak. Hazır olanı kullanacağım.

Matris klavye ne işe yarar?

Örneğin normal bir düğmeyi ele alalım. Bildiğiniz gibi bu en basit elektromekanik cihazdır. Panele bağlamak için bir aşağı çekme direnci kullanmanız ve ayrıca her biri için birer güç ve toprak kontağı kullanmanız gerekir. Böyle bir düğmeye basarak belirli bir eylemi gerçekleştirebilirsiniz; örneğin bir LED'i, çeşitli sürücüleri, mekanizmaları vb. kontrol edebilirsiniz. Peki ya birkaç düğmeyi bağlamamız gerekirse? O zaman daha fazla kontak ve daha fazla sayıda kablo kullanmanız gerekecek ve devre tahtası olmadan yapamayacaksınız, ayrıca daha fazla direnç kullanmanız gerekecek.

Bu nedenle daha fazla düğme bağlamayı kolaylaştırmak için böyle bir klavye geliştirdik. Bu tür cihazlar her yerde bulunur; bilgisayar klavyelerinde, hesap makinelerinde vb.

Karta 8 pin ile bağlanması gerekiyor, her biri belirli satır ve sütunlardan değerleri okuyor. Dijital panel üzerindeki pinlere bağlanmalıdırlar. Örneğin 2'den 9'a kadar olan pinlere bağlanacağım. UART arayüzü için tasarlandıkları için (örneğin, bir Bluetooth modülünü bağlamak için) sıfır ve ilklere dokunmanız önerilmez. Onları serbest bırakmak daha mantıklı.

Klavye kullanan en basit devre böyle görünür. Onunla çalışmayı daha kolay hale getirmek için Tuş Takımı kütüphanesi yazılmıştır. Onu ve diğer çizimleri indirebilirsiniz.

Kütüphaneye kurduktan sonra Arduino IDE'ye (Arduino web sitesinden bir program) gidebilir ve örnek çizimlere bakabilirsiniz.

Referans için en basit taslağı alalım. Belirli bir tuşa bastığınızda klavyeden değeri okumanızı ve bunları bağlantı noktasına göndermenizi sağlar. Bu durumda, bilgisayardaki bir bağlantı noktası monitörüdür.

#katmak // kütüphanemizi bağlayın




{"2","5","8","0"},
{"3","6","9","#"},
("A", "B", "C", "D")
};




geçersiz kurulum())(
Seri.begin(9600);
}
geçersiz döngü ()

if (özelAnahtar)(
Serial.println(customKey);
}
}

Taslak çok basit. Kodun ilk satırlarına dikkat etmek önemlidir. Öncelikle kütüphaneyi bağlarız, ardından klavyenin kaç satır ve sütuna sahip olduğunu belirtiriz ve ardından çalışmayı daha kolay hale getirmek için tuşların adlarını doğru şekilde düzenlememiz gerekir.

Bu yanlış yapılırsa, örneğin 4 rakamına bastığınızda, 6 rakamı veya başka herhangi bir sembol bağlantı noktasına çıkacaktır. Bu ampirik olarak belirlenebilir ve karakterler klavyede bulundukları şekilde düzenlenebilir.

İşlevde geçersiz kurulum port monitörüne seri bağlantının hızını gösterir 9600 baud. Fonksiyon yalnızca modüllere güç sağlamak için gereklidir. İşlevde Geçersiz Döngü durumu yazıyoruz. Değişken Karakter duruma uygun olan 1, A veya 5 gibi yalnızca bir karakteri depolamak için kullanılır. Baskı kayıtlıysa sembol, fonksiyon kullanılarak port monitörüne gönderilir. Seri Baskı. Parantez içinde hangi değişkenin bağlantı noktasına gönderildiğini belirtmeniz gerekir. Her şey doğru yapılırsa port monitöründe tıklanan sembolü alacağız. Sağ alttaki port monitöründeki veri aktarım hızını çizimdekiyle aynı olacak şekilde ayarlamayı unutmayın.

Ekranlı ve matris klavyeli devre

Verileri gösterelim.

Kablolamayı kolaylaştıran bir I2C modülüyle eşleştirilmiş bir ekran kullanıyorum. I2C veriyoluna sahip bir ekranla çalışmak için başka bir kitaplık kurmanız gerekir. İndirebilirsin.

Daha sonra ekran boyutunu belirtmeniz gerekir. Örnekte kullanılan ekran 2 satırın her birinde 16 karakter içeriyor, benim belirttiğim de bu. İşlevde Kurulumu Geçersiz Kıl Ekrana güç sağlamanız ve arka ışığı açmanız gerekir. Bu, iki işlev kullanılarak yapılır: lcd.begin Ve LCD.arka ışık.

#katmak // kütüphanemizi bağlayın
#katmak
LiquidCrystal_I2C lcd(0x27, 16, 2);
sabit bayt SATIRLAR = 4; //klavyemizdeki satır sayısı
sabit bayt COLS = 4; //klavyemizin sütun sayısı
char hexaKey'ler = (
(“S”,”4”,”7”,”*”), // kullanım kolaylığı için buraya klavyedeki gibi tuşlarımızın adlarını yerleştiriyoruz
("O", "5", "8", "0"),
("S", "6", "9", "#"),
("I", "B", "C", "D")
};
bayt satırPinleri = (5, 4, 3, 2); //hat kontrolünü hangi pinlere bağlıyoruz
bayt colPin'ler = (9, 8, 7, 6); //kolon kontrolünü hangi pinlere bağlıyoruz
//NewKeypad sınıfının bir örneğini başlat
Tuş takımıcustomKeypad = Tuş takımı(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
geçersiz kurulum())(
Seri.begin(9600);
lcd.begin(); // Ekranı başlat
lcd.backlight();
}
geçersiz döngü ()
char özelKey = özelKeypad.getKey();
if (özelAnahtar)(
Serial.println(customKey);
lcd.setCursor(1,4); //imleci ayarla
lcd.print(customKey);
}
}

İşlevde Voil Döngüsü koşulun kendisine bir satır yazmanız gerekir lcd.baskı Verileri görüntülemek için. Ayrıca önce imleç konumunu da ayarlamanız gerekir. Parantez içinde 2 rakam vardır: Birincisi karakter numarası, ikincisi ise satır numarasıdır. Bu ekranın satırları ve sütunları saymaya birden değil sıfırdan başladığını unutmamak gerekir. Yani ilk bakışta göründüğü gibi 1 ve 2 değil, 0 ve 1 numaralı satırlar var. Daha sonra kodu panoya yükleyeceğiz ve ne olacağını göreceğiz.

Ekran I2C arayüzü üzerinden çalıştığı için analog pinlere bağlıyoruz. SDA ve SCL çıkışlarını sırasıyla A4 ve A5'e bağlıyoruz ve geri kalan ikisi zaten güç ve toprak.

Gördüğünüz gibi herhangi bir sembole tıkladığımızda onun ekrandaki görüntüsünü görüyoruz.

Bir satırı silmek için hesap makinesini hatırlayın. Bir değeri silmemiz gerektiğinde sıfırlama butonuna bastık. Tahtadaki bu düğmeye tıklayın ve karakterleri yeniden yazabiliriz.

Klavyeyi Arduino'ya bağlama ve eylemi kontrol etme

Dersteki son diyagram, belirli bir tuşa basıldığında belirli bir eylemi gerçekleştirmektir. Arduino'ya matris klavye bağlamanın temel amacı budur. Bu konuyla ilgili daha karmaşık ve ilginç devreleri anlatan iki ayrı makale ve video olacak. Şimdi bu modülü tanıyalım ve onu kullanarak nasıl kod oluşturulacağını hatırlayalım.

Belirli bir tuşa basarken LED'i açmayı veya kapatmayı deneyelim. Diyagrama ekleyin.

LED bağlantısı

Bir devre tahtası ve bir direnç kullanacağım (tercihen 150 ila 220 ohm arasında). Devreyi iki jumper ile kapatacağım ve bunları Arduino kartındaki güç ve toprak pinlerine bağlayacağım.

Devre şu şekilde çalışacak: 1'e bastığınızda LED yanar, 2'ye bastığınızda söner.

Örnekteki LED, Arduino kartındaki pin 8'e bağlanmıştır.

#katmak
sabit bayt SATIRLAR = 4; // Dört satır
sabit bayt COLS = 4; // Üç sütun
char tuşları = ( // Tuş Haritasını tanımlayın
("1", "4", "7", "*"), // kullanım kolaylığı için buraya klavyedeki gibi tuşlarımızın adlarını yerleştiriyoruz
{"2","5","8","0"},
{"3","6","9","#"},
("A", "B", "C", "D")
};
byte rowPins = ( 5, 4, 3, 2 ); // ROW0, ROW1, ROW2 ve ROW3 tuş takımını bu Arduino pinlerine bağlayın.
bayt colPins = ( 9, 8, 7,6); // COL0, COL1 ve COL2 tuş takımını bu Arduino pinlerine bağlayın.
Tuş takımı kpd = Tuş takımı(makeKeymap(anahtarlar), rowPins, colPins, ROWS, COLS); // Tuş takımını oluşturun;
#ledpin 8'i tanımla
geçersiz kurulum ()
{
pinMode(ledpin,ÇIKIŞ);
Seri.begin(9600);
}
geçersiz döngü ()
{
karakter anahtarı = kpd.getKey();
if(key) // Geçerli bir anahtar olup olmadığını kontrol edin.
{
anahtar (anahtar)
{
dava 1":
digitalWrite(ledpin, YÜKSEK);
kırmak;
durum "2":
digitalWrite(ledpin, DÜŞÜK);
kırmak;
}
}
}

Taslağa bakalım.

Dersin ilk taslağını alalım ve ona ekleyelim. Başlangıçta yararlı bir işlevle Tanımlamak pin 8'e bağlı LED'e bir ad atayın LEDpin. İşlevde Kurulumu geçersiz kıl LED'den gelen sinyali çıkış olarak belirtin.

Kütüphane olmasaydı Klavye klavye için ise klavyenin bağlı olduğu 8 pin için aynısını yazmanız gerekir. İşlevde geçersiz döngü durum. Belirli bir tuşa basmak değişkenin değerine "eşittir" anahtar. Switch deyimi bir değişkenin değerlerini karşılaştırır anahtar ve bu değere bağlı olarak belirli komutları “verir”. İki yardımcı operatörden oluşur Dava Ve Kırmak. Basitçe söylemek gerekirse, 1'e eşit bir değişken değeri bulunursa eylem gerçekleştirilecektir. Şebeke kırmak ifadeden çıkış komutu görevi görür Dava.

Buna göre 1’e bastığınızda LED’e maksimum voltaj verilecek ve yanacaktır. 2'ye bastığınızda ışık yanmayacaktır. Bu fonksiyonda belirtilmiştir Dijital yazma Burada parantez içinde değişkenin adı ve "göstergesi" verilir. Böylece her buton için özel komutlar yazabilir ve çok sayıda LED'i kontrol edebilir veya tüm LED'leri aynı anda açacak bir komut oluşturabilirsiniz.

Bazen Arduino'da port eksikliği sorunuyla karşılaşıyoruz. Çoğu zaman bu, az sayıda pime sahip modeller için geçerlidir. Bu amaçla bir matris klavye icat edildi. Bu sistem bilgisayar klavyelerinde, hesap makinelerinde, telefonlarda ve çok sayıda düğme kullanan diğer cihazlarda çalışır.

Arduino için en sık kullanılan klavyeler şunlardır:

En yaygın olanı 16 tuşlu 4x4 klavyelerdir. Çalışma prensibi oldukça basittir, Arduino dönüşümlü olarak her 4 sütuna mantıksal bir tane sağlar, şu anda Arduino'nun 4 girişi değerleri okur ve yalnızca bir giriş yükseğe gönderilir. Giriş/giriş bağlantı noktalarının yanı sıra Arduino'daki çıkış bağlantı noktalarını yönetme yeteneklerini biliyorsanız oldukça basittir.

Programlama için özel Tuş Takımı kütüphanesini kullanabilirsiniz, ancak bu makalede matris klavyeyle çalışmayı daha iyi anlamak için onu kullanmayacağız.

Klavyeyi herhangi bir giriş/çıkış bağlantı noktasına bağlarız.

Kırmızı portlara sinyal gönderip, mavi portlardan alacağız. Genellikle çekme dirençleri mavi kablolara bağlanır, ancak bunları Arduino mikro denetleyicisinin içine bağlayacağız.

Programda basılan butonu hesaplayıp Seri porta yazacağız.
Bu yöntemin önemli bir dezavantajı vardır: denetleyici artık standart yöntemleri kullanarak diğer görevleri gerçekleştiremez. Bu sorun, kesintileri kullanarak bir matris klavye bağlayarak çözülebilir.

Int PinOut(5, 4, 3, 2); // pinler çıktıları int PinIn (9, 8, 7, 6); // giriş pinleri int val = 0; const karakter değeri ("1", "4", "7", "*"), ("2", "5", "8", "0" ), ("3", "6", " 9", "#"), ("A", "B", "C", "D")); // butonu belirten çift dizi int b = 0; // diziden bir sayının yerleştirildiği değişken (düğme numarası) void setup() ( pinMode (2, OUTPUT); // çıkış portlarını başlatın (sütunlara sıfır verin) pinMode (3, OUTPUT); pinMode (4) , OUTPUT) ; pinMode (5, OUTPUT); pinMode (6, INPUT); // giriş portlarını pozitif değerlerle başlat (satırlardaki sıfırları kabul et) digitalWrite(6, INPUT ); ; digitalWrite(8, HIGH); digitalWrite(9, HIGH); // Seri bağlantı noktasını açın) void matrisi () // düğmeleri okumak için fonksiyon oluşturun ( for (int i = 1; i)<= 4; i++) // цикл, передающий 0 по всем столбцам { digitalWrite(PinOut, LOW); // если i меньше 4 , то отправляем 0 на ножку for (int j = 1; j <= 4; j++) // цикл, принимающих 0 по строкам { if (digitalRead(PinIn) == LOW) // если один из указанных портов входа равен 0, то.. { Serial.println(value); // то b равно значению из двойного массива delay(175); } } digitalWrite(PinOut, HIGH); // подаём обратно высокий уровень } } void loop() { matrix(); // используем функцию опроса матричной клавиатуры }

Kütüphaneyi kullanarak sayısal tuş takımından veri okumak basitleştirilmiştir.

#katmak sabit bayt SATIRLAR = 4; sabit bayt COLS = 3; karakter tuşları = ("1", "2", "3"), ("4", "5", "6"), ("7", "8", "9"), ("#" ,"0","*")); bayt satırPinleri = (5, 4, 3, 2); bayt colPin'ler = (8, 7, 6); Tuş takımı tuş takımı = Tuş takımı(makeKeymap(keys), rowPins, colPins, ROWS, COLS); void setup())( Serial.begin(9600); ) void loop())( char key = keypad.getKey(); if (key != NO_KEY)( Serial.println(key); ) )

STM32 mikrodenetleyici serisi, üzerinde çalışılması oldukça ilginç bir nesnedir. Onunla çalışmanın yeni başlayanlar için zor olduğu ve daha basit bir şeyi üstlenmenin daha iyi olduğu fikrini sıklıkla duyabilirsiniz. Bu yazımızda STM32 mikrodenetleyicilerin o kadar da korkutucu olmadığını göstermeye çalışacağız.

Mikroişlemci teknolojisine sahip cihazların geliştirilmesinde yer alan herkesin cephaneliğinde, gelecekteki projeler için iyi bir temel oluşturacak bir dizi hazır çözüm bulunmalıdır. Bize göre bu tür çözümler, bir ekranın, klavyenin kullanımını, transistör anahtarlarıyla çalışmayı, bir düğme/sensörden gelen harici kesintileri işlemeyi vb. içerir.

Bu makalede anlatılan iş için STM32F4Discovery hata ayıklama kartını ve bizim durumumuzda 7 pinli bir matris klavyeyi kullandık. Geliştirme ortamı CoIDE 1.7.6.

Bu işlemi uygulayan programı anlamak için, G/Ç bağlantı noktaları ve sistem zamanlayıcılarıyla çalışma konusunda minimum bilgi ve beceriye sahip olmanız gerekir. Klavyeyi bağlamak için mevcut yöntemleri burada bulabilirsiniz.

Programı yazmaya başlamadan önce kuralları tanımlayalım:

  1. Klavyenin bağlandığı pinler tarama ve güç kaynağı olmak üzere iki gruba ayrılmaktadır (Şekil 1). Tarama pinleri giriş olarak çalışır. Tüm besleme pinleri varsayılan olarak sıfıra ayarlanmıştır, ancak TIM2 zamanlayıcısının ilk sıfırlanmasından sonra, mantıksal voltaj "1" PA3 pinine ayarlanacaktır, dolayısıyla bazı yaklaşımlarla "1" kombinasyonunun pin üzerinde ayarlandığını söyleyebiliriz. Pinleri başlangıçtaki -0-0-0"a yakın bir zamanda besleyin.
  2. Program metnine göre pin tanımları Şekil 1'e karşılık gelecektir, yani. PA0, PA1, PA2 pinlerinin değerleri, onları yoklarken, onlarla daha fazla işlem yapmak için sırasıyla a, b, c değişkenlerine yazılır.
  3. PA3 - PA4 besleme pinleri 1'den 4'e kadar belirtilmiştir, bunlar program metninde belirtilen numaralardır.

Şekil 1 – Klavye bağlantısı

Programın algoritmasının açıklamasına geçelim. Gücü açtıktan sonra döngüsel olarak çalışan iki zamanlayıcı başlatılır (TIM2 ve TIM3). sayma tamamlandığında bazı eylemler gerçekleştirilir (bu eylemler, TIM2 ve TIM3 zamanlayıcılarındaki kesme işleyicilerinin işlevlerinde belirtilir) ve sayma yeniden başlar. TIM2 zamanlayıcısının ilk sayımının sonunda, PA3 pininde mantıksal bir “1” seviyesi belirir ve bu zamanlayıcının sayımı her bittiğinde bir konum aşağı kaydırılır. Bu durumda mikrokontrolör mantıksal “1”in voltaj seviyesinin o anda hangi pinte bulunduğunu her zaman “bilir”; bu bilgi out_state değişkeninde saklanır. Mantıksal “1”in “kaydırılması” işlemi TIM2_IRQHandler fonksiyonu (zamanlayıcı 2'den kesme işleyicisi) tarafından gerçekleştirilir.

Her döngünün sonunda, TIM3 zamanlayıcısı PA0-PA2 pinlerinin durumunu tarayarak sonuçları a, b ve c değişkenlerine yazar. Daha sonra mikrodenetleyici, besleme pinlerinden hangisinin mantıksal “1” voltajına sahip olduğunu (out_state değişkeni) ve PA0 – PA2 pinlerinden hangisinin yüksek mantıksal seviyeye sahip olduğunu (a, b, c değişkenleri) karşılaştırır. Bu eylemler TIM3_IRQHandler işlevi (zamanlayıcı 3'teki kesme işleyicisi) tarafından gerçekleştirilir.

Örneğin “3” butonuna basıldığında, PA3 pininde yüksek bir mantık seviyesi ayarlanmalı ve PA0 pinine kaydedilmelidir. Bu mantıksal ifade çalıştırıldığında mikrodenetleyici “3” tuşuna basıldığını “anlayacak” ve bu tuşa basıldığında bizim durumumuzda kendisine öngörülen eylemi gerçekleştirecek, tüm LED'leri kapatacaktır; ve ardından yeşil LED'i açın.

Kullanılan karşılaştırma prosedürü, bir, iki, üç veya daha fazla tuşa aynı anda basılması (TIM3_IRQHandler işlevini değiştirirken) ile böyle bir olaya belirli bir eylemin atanması arasında ayrım yapmayı mümkün kılar.

Bu örnekte programın doğru yazıp yazmadığını anlamak için kart üzerinde bulunan LED'lerin çeşitli kombinasyonları kullanılmıştır; 5 tuşu tüm LED'leri kapatmaktadır.

Klavyede hangi pinlerin basılan tuşlara karşılık geldiğini anlamak çok önemlidir. Satırları ve sütunları seçmek gerekir (bu durumda satırlara ve sütunlara bölünme, klavyenin şekline ve konumuna bağlı olduğundan çok keyfidir. Varsayılan olarak sütunların "3-6-" satırı olduğunu varsayalım. 9-#” vb. ve satırlar “3-2-1” vb.'dir), çünkü sütunlar tarama pinlerine, sıralar ise güç pinlerine bağlanır. Matris klavyesindeki pinleri doğru bir şekilde belirlemek için, çevirme modundaki multimetrenin problarından birini herhangi bir aşırı kontağa bağlamanız ve ikinci probu kalan kontaklara bağlamanız ve aynı anda bulunan tuşlara basmanız gerekir. aynı sütunda. Herhangi bir tuşa bastığınızda iki pin çalmıyorsa bu her ikisinin de aynı gruba (satır veya sütun pinleri) ait olduğu anlamına gelir. Tüm sonuçlar iki gruba ayrıldıktan sonra, gruplara yerleştirilme sırasını belirlemeye devam edebilirsiniz. Bu durumda, bir sütun çıkışına sabit bir bağlantı ile, yalnızca bir sütuna ait tuşlara aynı anda basarak ikinci gruptaki kişileri değiştirmek gerekir.

Yukarıdakileri bir örnekle açıklayalım. Multimetre probunu en dıştaki sütunlu terminale ve ikincisini herhangi bir sıra terminaline bağlarız ve seçilen sütun terminaline karşılık gelen sütundaki her anahtarı süreklilik açısından sırayla kontrol ederiz. Bir kişi göründüğünde, basılan tuş sayısına ve bu olayın Şekil 1'deki hangi sonuçlara karşılık geldiğine bakarız. Daha sonra sırasıyla sütun ve hat kontaklarının değerini aktarıyoruz.

Şimdi kullanılan çevre birimlerinin başlatılmasından bahsedelim. Bu proje, G/Ç bağlantı noktaları olarak A ve D bağlantı noktalarının yanı sıra TIM2 ve TIM3 zamanlayıcılarını kullanır. Program listesi, çevre birimi ayarları öğelerine ilişkin ayrıntılı yorumlarla birlikte sağlanır.

Makaleyi beğendin mi? Arkadaşlarınla ​​paylaş!
Bu makale yardımcı oldu mu?
Evet
HAYIR
Geri bildiriminiz için teşekkürler!
Bir şeyler ters gitti ve oyunuz sayılmadı.
Teşekkür ederim. Mesajınız gönderildi
Metinde bir hata mı buldunuz?
Seçin, tıklayın Ctrl + Enter ve her şeyi düzelteceğiz!