TTP223B Modülü ile Mini Piyano Uygulaması
Merhaba arkadaşlar, bu yazımızda Trudyo Geliştirme Kartı kullanarak mini piyano uygulaması yapacağız. Dokunmaları algılamak için TTP223B Dokunma Sensörü Modülü ve ses sinyalleri üretmek için Buzzer Kartı kullanacağız. Her bir TTP223B Dokunma Sensörü Modülü‘ne farklı bir nota değeri atayarak temel sesleri kolaylıkla oluşturabileceğiz. Dilerseniz, sizler buton sayısını arttırarak daha gelişmiş uygulamalar tasarlayabilirsiniz. Yeni yıl ruhunu yansıtmak adına biz Jingle Bells notaları üzerinden örnek bir melodi dizisi oluşturduk. Bu örnekten faydalanarak farklı melodi dizileri de oluşturabilirsiniz.
Eğer TTP223B Dokunma Sensörü hakkında ayrıntılı bilgi almak isterseniz ürün sayfamızı incelemenizi öneririz. Ek olarak, Trudyo Geliştirme Kartı‘nın konfigürasyon ayarlarını yapmak için aşağıdaki yazımızı inceleyebilirsiniz.
TTP223B, mikrodenetleyicili uygulamalara kolayca entegre edilebilen bir kapasitif dokunma algılama sensörüdür. Dokunma kontrollü sistemlerde kullanılmak...
https://youtu.be/Cox4RN5P_pQ Merhaba arkadaşlar, Trudyo Geliştirme Kartı’nızı ile ilk uygulamalarınızı gerçekleştirmek mi istiyorsunuz? Başlamadan önce konfigürasyon...
TTP223B, Buzzer ve Trudyo Geliştirme Kartı Pin Şeması
TTP223B Dokunma Sensörü Modülü Pin Şeması
Buzzer Kartı Pin Şeması
TTP223B Dokunma Sensörü Modülü‘nü 3 pin ( VCC GND SIG ) ile devrelerinize bağlayabilirsiniz. Uygulamamız için 8 adet TTP223B Dokunma Sensörü Modülü kullanacağımız için sinyal bağlantıları SIG1 SIG2 SIG3 SIG4 SIG5 SIG6 SIG7 SIG8 olarak tanımlanmıştır.
Buzzer Kartı ise, TTP223B Dokunma Sensörü Modülü gibi 3 pin ( VCC I/O GND ) ile devrelerimize bağlayabileceğimiz bir modüldür. Buzzer Kartı, I/O bağlantısı üzerinden tetiklenebilmektedir.
TTP223B Dokunma Sensörü Modülü ve Buzzer Kartı‘nın Trudyo Geliştirme Kartı ile bağlantı şeması aşağıda belirtilmiştir. Ayrıca kablo bağlantı şeması da aşağıdaki tabloda belirtilmiştir.
Trudyo Geliştirme Kartı | TTP223B ve Buzzer Modülü |
---|
5V | VCC | |
E1 | I/O | |
D0 | SIG1 | |
D1 | SIG2 | |
D2 | SIG3 | |
D3 | SIG4 | |
D4 | SIG5 | |
D5 | SIG6 | |
D6 | SIG7 | |
D7 | SIG8 | |
GND | GND |
Bu Uygulamada Kullanılan Malzemeler
Yukarıda paylaşılan uygulama bağlantı şeması referans alındığında ihtiyaç duyabileceğiniz malzemeler aşağıda listelenmektedir.
Trudyo Geliştirme Kartı
TTP223B Dijital Dokunma Sensörü Modülü
TTP223B Modülü ile Mini Piyano Uygulama Kodları
// Connections
sbit LED at LATA4_bit; // Dahili LED RA4 Pinine Bagli
sbit BUZZER at LATE1_bit; // Buzzer D1 Pinine Bagli
// TTP223B Baglantilari
sbit DO at RD0_bit; // DO Dokunmatik Butonu D0 Pinine Bagli
sbit RE at RD1_bit; // RE Dokunmatik Butonu D1 Pinine Bagli
sbit MI at RD2_bit; // MI Dokunmatik Butonu D2 Pinine Bagli
sbit FA at RD3_bit; // FA Dokunmatik Butonu D3 Pinine Bagli
sbit SOL at RD4_bit; // SOL Dokunmatik Butonu D4 Pinine Bagli
sbit LA at RD5_bit; // LA Dokunmatik Butonu D5 Pinine Bagli
sbit SI at RD6_bit; // SI Dokunmatik Butonu D6 Pinine Bagli
sbit JB at RD7_bit; // JB Dokunmatik Butonu D7 Pinine Bagli
// Nota Listesi
const unsigned int _DO = 523; // DO = c
const unsigned int _RE = 587; // RE = d
const unsigned int _MI = 659; // MI = e
const unsigned int _FA = 698; // FA = f
const unsigned int _SOL = 784; // SOL = g
const unsigned int _LA = 880; // LA = a
const unsigned int _SI = 987; // SI = b
// JingleBells Melodisi
char JingleBells[]="2e2e3e1 2e2e3e1 2e2g3c1d4e4 2f2f3f0 1f2f2e2e0 1e1e2g2g2f2d4c4 ";
void PlayMelody(char *melody, unsigned int tempo){
unsigned int i;
unsigned int frequency;
unsigned short beats;
for(i=0; melody[i]!='\0'; i+=2){ // i=0'dan basla ve melody[i] degeri \0 (dizi sonu karakteri) degilse i'yi 2 arttir
// Vurus secimi
beats=melody[i]-48; // 0 karakterinin tamsayi karsiligi 48'dir. (0->48, 1->49, 2->50,...)
// Karakter formundaki sayisal degerlerden 48 çikararak
// tamsayi formuna dönüstürebiliriz.
// Frekans secimi
switch(melody[i+1]){
case 'c': frequency=_DO; break;
case 'd': frequency=_RE; break;
case 'e': frequency=_MI; break;
case 'f': frequency=_FA; break;
case 'g': frequency=_SOL; break;
case 'a': frequency=_LA; break;
case 'b': frequency=_SI; break;
}
Sound_Play(frequency, tempo*beats); // Belirlenen frekansta, belirlenen tempoda ve belirlenen vurus süresi kadar ses üret.
vdelay_ms(tempo/5); // Tempo süresinin %20'si kadar bir süre bekleme
}
}
void main() {
// Port Giris-Çikis Seçimi (0:Çikis, 1:Giris)
TRISA=0b00000000;// [][][][LED][][][][]
TRISB=0b00000000;// [][][][][][][][]
TRISC=0b00000000;// [][][][][][][][]
TRISD=0b11111111;// [DO][RE][MI][FA][SOL][LA][SI][OTO]
TRISE=0b00000000;// [][][][][][][BUZZER][]
// Port Analog-Dijital Giris Seçimi (0:Dijital, 1:Analog)
ANSELA=0b00000000;// [][][][][][][][]
ANSELB=0b00000000;// [][][][][][][][]
ANSELC=0b00000000;// [][][][][][][][]
ANSELD=0b00000000;// [][][][][][][][]
ANSELE=0b00000000;// [][][][][][][][]
// Port Temizleme
LATA=0x00;
LATB=0x00;
LATC=0x00;
LATD=0x00;
LATE=0x00;
Sound_Init(&PORTE, 1); // Buzzer'i Hazirla
// Sonsuz Dongu
while(1){
if(DO) Sound_Play(_DO, 100); // DO notasini 100ms çal
else if(RE) Sound_Play(_RE, 100); // RE notasini 100ms çal
else if(MI) Sound_Play(_MI, 100); // MI notasini 100ms çal
else if(FA) Sound_Play(_FA, 100); // FA notasini 100ms çal
else if(SOL) Sound_Play(_SOL, 100); // SOL notasini 100ms çal
else if(LA) Sound_Play(_LA, 100); // LA notasini 100ms çal
else if(SI) Sound_Play(_SI, 100); // SI notasini 100ms çal
else if(JB) PlayMelody(JingleBells, 150); // JingleBells melodisini 150ms'lik tempo ile çal
}
}
Uygulama Kodları Açıklaması
1. TTP223B ve Buzzer Bağlantı Tanımlamaları
sbit
tanımlaması ile bir pine farklı bir isim ataması yapılabilir. Bu sayede, gerekmesi durumunda bağlantı noktalarını dilediğiniz başka bir pine aktarabilirsiniz. Bu yöntem ile çok daha anlaşılabilir program kodları yazabilirsiniz.
// Connections
sbit LED at LATA4_bit; // Dahili LED RA4 Pinine Bagli
sbit BUZZER at LATE1_bit; // Buzzer D1 Pinine Bagli
// TTP223B Baglantilari
sbit DO at RD0_bit; // DO Dokunmatik Butonu D0 Pinine Bagli
sbit RE at RD1_bit; // RE Dokunmatik Butonu D1 Pinine Bagli
sbit MI at RD2_bit; // MI Dokunmatik Butonu D2 Pinine Bagli
sbit FA at RD3_bit; // FA Dokunmatik Butonu D3 Pinine Bagli
sbit SOL at RD4_bit; // SOL Dokunmatik Butonu D4 Pinine Bagli
sbit LA at RD5_bit; // LA Dokunmatik Butonu D5 Pinine Bagli
sbit SI at RD6_bit; // SI Dokunmatik Butonu D6 Pinine Bagli
sbit JB at RD7_bit; // JB Dokunmatik Butonu D7 Pinine Bagli
A0 pini giriş olarak kullanılacak ise RA0_bit olarak tanımlanmalı,
A0 pini çıkış olarak kullanılacak ise LATA0_bit olarak tanımlanmalıdır.
2. Nota Tanımlamaları
// Nota Listesi
const unsigned int _DO = 523; // DO = c
const unsigned int _RE = 587; // RE = d
const unsigned int _MI = 659; // MI = e
const unsigned int _FA = 698; // FA = f
const unsigned int _SOL = 784; // SOL = g
const unsigned int _LA = 880; // LA = a
const unsigned int _SI = 987; // SI = b
Uygulamamızda kullanacağımız notaların frekans karşılıklarını program kodlarımıza ekliyoruz. Bu sayede mikroC SoundLibrary kütüphanesini kullanarak notaları ses sinyallerine çevirebileceğiz.
3. Jingle Bells Notaları
// JingleBells Melodisi
char JingleBells[]="2e2e3e1 2e2e3e1 2e2g3c1d4e4 2f2f3f0 1f2f2e2e0 1e1e2g2g2f2d4c4 ";
Notalarını bildiğiniz melodileri buzzer ile seslendirebilmek için yukarıda paylaşıldığı şekilde bir melodi dizisi oluşturabilirsiniz. Burada dizi sırayla önce notanın kaç vuruşluk olduğunu ve sonrasında hangi nota olduğu bilgisini içerir. “2e2e3e1 …” başlangıç kısmını inceleyecek olursak sırayla;
“2e” -> 2 vuruşluk Mi notası
“2e” -> 2 vuruşluk Mi notası
“3e” -> 3 vuruşluk Mi notası
“1 ” -> 1 vuruşluk bekleme
bilgisini içermektedir. PlayMelody(JingleBells, 150);
fonksiyonu ile JingleBells melodisini 150ms’lik tempo ile buzzer üzerinde seslendirebiliriz.
4. PlayMelody Fonksiyonu
void PlayMelody(char *melody, unsigned int tempo){
unsigned int i;
unsigned int frequency;
unsigned short beats;
for(i=0; melody[i]!='\0'; i+=2){ // i=0'dan basla ve melody[i] degeri \0 (dizi sonu karakteri) degilse i'yi 2 arttir
// Vurus secimi
beats=melody[i]-48; // 0 karakterinin tamsayi karsiligi 48'dir. (0->48, 1->49, 2->50,...)
// Karakter formundaki sayisal degerlerden 48 çikararak
// tamsayi formuna dönüstürebiliriz.
// Frekans secimi
switch(melody[i+1]){
case 'c': frequency=_DO; break;
case 'd': frequency=_RE; break;
case 'e': frequency=_MI; break;
case 'f': frequency=_FA; break;
case 'g': frequency=_SOL; break;
case 'a': frequency=_LA; break;
case 'b': frequency=_SI; break;
}
Sound_Play(frequency, tempo*beats); // Belirlenen frekansta, belirlenen tempoda ve belirlenen vurus süresi kadar ses üret.
vdelay_ms(tempo/5); // Tempo süresinin %20'si kadar bir süre bekleme
}
}
PlayMelody()
fonksiyonu ile dizi halinde hazırlanan melodileri çalabileceğiniz bir fonksiyondur. Bir for
döngüsü ile ‘\0’ (dizi sonu) karakteri gelene kadar dizi karakterleri ikişer ikişer olarak işletilir. Okunan ilk değer vuruş değeridir. İkinci değer ise nota bilgisini içerir. Daha sonra belirlenen değerler Sound_Play
fonksiyonu ile ses sinyallerine dönüştürülür.
5. Giriş/Çıkış Seçimleri
// Port Giris-Çikis Seçimi (0:Çikis, 1:Giris)
TRISA=0b00000000;// [][][][LED][][][][]
TRISB=0b00000000;// [][][][][][][][]
TRISC=0b00000000;// [][][][][][][][]
TRISD=0b11111111;// [DO][RE][MI][FA][SOL][LA][SI][OTO]
TRISE=0b00000000;// [][][][][][][BUZZER][]
TRIS
kaydedicisi bir portun pinlerinin giriş olarak mı, yoksa çıkış olarak mı kullanılacağını belirleyen kaydedicidir. 0 değeri bir pinin çıkış olarak kullanıldığını belirtirken, 1 değeri ise ilgili pinin giriş olarak kullanılacağını belirtir. Burada TRISD kaydedicisinin 7, 6, …, 0 nolu bitleri TTP223B Dokunma Sensörü Modülü girişleri olduğu için 1 değerini almıştır. TRISE kaydedicisinin 1 nolu biti Buzzer Kartı kontrol çıkışı olduğu için 0 değerini almıştır.
6. Analog/Dijital Giriş Seçimleri
// Port Analog-Dijital Giris Seçimi (0:Dijital, 1:Analog)
ANSELA=0b00000000; // [][][][][][][][]
ANSELB=0b00000000; // [][][][][][][][]
ANSELC=0b00000000; // [][][][][][][][]
ANSELD=0b00000000; // [][][][][][][][]
ANSELE=0b00000000; // [][][][][][][][]
ANSEL
kaydedicisi bir portun pinlerinin dijital giriş olarak mı, yoksa analog giriş olarak mı kullanılacağını belirleyen kaydedicidir. 0 değeri bir pinin dijital giriş olarak kullanıldığını belirtirken, 1 değeri ise ilgili pinin analog giriş olarak kullanılacağını belirtir.
7. Portları Temizleme
// Port Temizleme
LATA=0x00;
LATB=0x00;
LATC=0x00;
LATD=0x00;
LATE=0x00;
LAT
kaydedicisi çıkış olarak ayarlanan bir portun pinlerini lojik-1 veya lojik-0 olarak ayarlamak için kullanılan kaydedicidir. Program başlangıcında portların varsayılan değerleri eğer gerekiyorsa güncellenmeli, gerekmiyor ise temizlenmelidir.
8. SoundLibrary Hazırlama
Sound_Init(&PORTE, 1); // Buzzer'i Hazirla
Sound_Init
fonksiyonu buzzer bağlantısının hangi port ve hangi pin üzerinden yapılacağının belirlenmesi için tanımlanır. Ugulamamız için Buzzer Kartı bağlantımız PORTE ‘nin E1 nolu pinine bağlanmıştır.9. Piyano Kodları
// Sonsuz Dongu
while(1){
if(DO) Sound_Play(_DO, 100); // DO notasini 100ms çal
else if(RE) Sound_Play(_RE, 100); // RE notasini 100ms çal
else if(MI) Sound_Play(_MI, 100); // MI notasini 100ms çal
else if(FA) Sound_Play(_FA, 100); // FA notasini 100ms çal
else if(SOL) Sound_Play(_SOL, 100); // SOL notasini 100ms çal
else if(LA) Sound_Play(_LA, 100); // LA notasini 100ms çal
else if(SI) Sound_Play(_SI, 100); // SI notasini 100ms çal
else if(JB) PlayMelody(JingleBells, 150); // JingleBells melodisini 150ms'lik tempo ile çal
}
Sonsuz döngü içerisinde ilk 7 TTP223B Dokunma Sensörü Modülü için doğrudan nota karşılıkları tanımlanmıştır. Örneğin; DO girişi yani ilk TTP223 Dokunma Sensörü Modülü sinyali algılandığında Sound_Play(_DO, 100);
fonksiyonu çalıştırılır.
8. TTP223B Dokunma Sensörü Modülü için ise JingleBells melodisi 150ms’lik bir tempo ile otomatik olarak seslendirilir.
Bir uygulamanın daha sonuna gelmiş bulunmaktayız. Uygulamaya ait dosyaları program kodları bölümünden indirebilirsiniz. Merak ettiğiniz ve aklınıza takılan soruları aşağıda 👇 yorum olarak bize iletebilirsiniz. İyi çalışmalar. 🙂 #geliştirmeyebaşla
Yorum yapmak için giriş yapmalısınız.