BAĞLAN

Arduino İle Kapasitif Algılama Cihazı Yapımı

  • Görüntülenme 3536
  • PAYLAŞ
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  

    Bu projemizde theremin müzik aletinin çalışma prensibine dayalı arduino tabanlı kapasitif algılama cihazının yapımından bahsedeceğiz.Öncelikle thermin hakkında bilgi verelim.

    Theremin ilk elektronik ve çalarken temas gerekmeyen müzik aletidir. İsmini mucidi olan Rus Profesör Leon Theremin’den alır, 1928 de mucidi tarafından patenti de alınmıştır. Gerçek adı Termenvox veya Aetherphone’dur. Daha sonra ingilizceleşerek zamanla “Theremin” adını almıştır. Kontrolü iki metal anten arasında sağlanır, bu antenler aleti çalan kişinin ellerinin pozisyonunu algılarlar. Bir el ile titreşim dalgaları gönderilir diğer el ile de sesin şiddeti ayarlanır. Theremin ürkütücü sesler ile birleşik bir alettir. Elektrik sinyalleri Theremin uzerinde büyütülür ve bağlı olan hoparlörlere gönderilir.

    Arduino tabanlı theremin yapımına başlayalım.

    Malzemeler:

    1. Arduino Uno
    2. 74HC00N Yükseltici
    3. Direnç
    4. Kondansatör
    5. Hoparlör

    Elektronik Kısım:

    Osilatör Devre Şeması:

    Osilatör devremizi şemadaki gibi kurduktan sonra arduino bağlantılarına geçebiliriz.Devre şemasında görüldüğü gibi arduino 5v ve gnd pinlerine bağlantıları yapıyoruz.

    Yazılım Kısmı:

    #include <Stdio.h>
    #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
    #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
     
    //! Macro that clears all Timer/Counter1 interrupt flags.
    #define CLEAR_ALL_TIMER1_INT_FLAGS (TIFR1 = TIFR1)
     
    int pinLed = 13; // LED connected to digital pin 13
    int pinFreq = 5;
     
    void setup()
    {
    pinMode(pinLed, OUTPUT); // sets the digital pin as output
    pinMode(pinFreq, INPUT);
    pinMode(8, OUTPUT);
     
    Serial.begin(57600); // connect to the serial port
     
    // hardware counter setup ( refer atmega168.pdf chapter 16-bit counter1)
    TCCR1A=0; // reset timer/counter1 control register A
    TCCR1B=0; // reset timer/counter1 control register A
    TCNT1=0; // counter value = 0
    // set timer/counter1 hardware as counter , counts events on pin T1 ( arduino pin 5)
    // normal mode, wgm10 .. wgm13 = 0
    sbi (TCCR1B ,CS10); // External clock source on T1 pin. Clock on rising edge.
    sbi (TCCR1B ,CS11);
    sbi (TCCR1B ,CS12);
     
    // timer2 setup / is used for frequency measurement gatetime generation
    // timer 2 presaler set to 256 / timer 2 clock = 16Mhz / 256 = 62500 Hz
    cbi (TCCR2B ,CS20);
    sbi (TCCR2B ,CS21);
    sbi (TCCR2B ,CS22);
     
    //set timer2 to CTC Mode
    cbi (TCCR2A ,WGM20);
    sbi (TCCR2A ,WGM21);
    cbi (TCCR2B ,WGM22);
    OCR2A = 124; // CTC at top of OCR2A / timer2 interrupt when coun value reaches OCR2A value
     
    // interrupt control
     
    sbi (TIMSK2,OCIE2A); // enable Timer2 Interrupt
     
    }
     
    volatile byte i_tics;
    volatile byte f_ready ;
    volatile byte mlt ;
    unsigned int ww;
     
    int cal;
    int cal_max;
     
    char st1[32];
    long freq_in;
    long freq_zero;
    long freq_cal;
     
    unsigned int dds;
    int tune;
     
    int cnt=0;
     
    void loop()
    {
    cnt++;
    // add=analogRead(0);
     
    f_meter_start();
     
    tune=tune+1;
    while (f_ready==0) { // wait for period length end (100ms) by interrupt
    PORTB=((dds+=tune) >> 15); // kind of DDS tonegenerator / connect speaker to portb.0 = arduino pin8
    }
    tune = freq_in-freq_zero;
    // use the tune value here for your own purposes like control of servos, midi etc.
     
    // startup
    if (cnt==10) {
    freq_zero=freq_in;
    freq_cal=freq_in;
    cal_max=0;
    Serial.print("** START **");
    }
     
    // autocalibration
    if (cnt % 20 == 0) { // try autocalibrate after n cycles
    Serial.print("*");
    if (cal_max <= 2) {
    freq_zero=freq_in;
    Serial.print(" calibration");
    }
    freq_cal=freq_in;
    cal_max=0;
    Serial.println("");
    }
    cal = freq_in-freq_cal;
    if ( cal < 0) cal*=-1; // absolute value if (cal > cal_max) cal_max=cal;
     
    digitalWrite(pinLed,1); // let LED blink
    Serial.print(cnt);
    Serial.print(" ");
     
    if ( tune < 0) tune*=-1; // absolute value
    sprintf(st1, " %04d",tune);
    Serial.print(st1);
    Serial.print(" ");
     
    Serial.print(freq_in);
    Serial.print(" ");
    /*
    Serial.print(freq_zero);
    Serial.print(" ");
    Serial.print(cal_max);
    */
    Serial.println("");
    digitalWrite(pinLed,0);
     
    }
    //******************************************************************
    void f_meter_start() {
    f_ready=0; // reset period measure flag
    i_tics=0; // reset interrupt counter
    sbi (GTCCR,PSRASY); // reset presacler counting
    TCNT2=0; // timer2=0
    TCNT1=0; // Counter1 = 0
    cbi (TIMSK0,TOIE0); // dissable Timer0 again // millis and delay
    sbi (TIMSK2,OCIE2A); // enable Timer2 Interrupt
    TCCR1B = TCCR1B | 7; // Counter Clock source = pin T1 , start counting now
    }
     
    //******************************************************************
    // Timer2 Interrupt Service is invoked by hardware Timer2 every 2ms = 500 Hz
    // 16Mhz / 256 / 125 / 500 Hz
    // here the gatetime generation for freq. measurement takes place:
     
    ISR(TIMER2_COMPA_vect) {
     
    if (i_tics==50) { // multiple 2ms = gate time = 100 ms
    // end of gate time, measurement ready
    TCCR1B = TCCR1B & ~7; // Gate Off / Counter T1 stopped
    cbi (TIMSK2,OCIE2A); // disable Timer2 Interrupt
    sbi (TIMSK0,TOIE0); // ensable Timer0 again // millis and delay
    f_ready=1; // set global flag for end count period
     
    // calculate now frequeny value
    freq_in=0x10000 * mlt; // mukt #ovverflows by 65636
    freq_in += TCNT1; // add counter1 value
    mlt=0;
     
    }
    i_tics++; // count number of interrupt events
    if (TIFR1 & 1) { // if Timer/Counter 1 overflow flag
    mlt++; // count number of Counter1 overflows
    sbi(TIFR1,TOV1); // clear Timer/Counter 1 overflow flag
    }
     
    }

     


    PAYLAŞ
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    Sezgin GÜL

    Sezgin GÜL

    Makine Mühendisi, Girişimci, Maker

    Kimler Neler Demiş?

    İlk Yorum Hakkı Senin!

    avatar
    wpDiscuz

    Yeni Projeler More

    • 16 Şubat 2017
      1 hafta ÖNCE 2 Yorum

      Öğrenme Fonksiyonuna Sahip Hareket Kopyalayan Robot Kol Yapımı

      Bu projede öğrenme yoluyla hareket kopyalayan robot kol yapımından bahsedeceğim. Endüstride kullanılan robot kollar, her zaman aynı hareketleri yapmaya odaklıdır. Örneğin ürün bandından bir nesneyi alıp başka bir banda aktarımını yapan robot kollar sürekli aynı hareketi yapmaktadır. Bu hareketler önceden öğretilerek robot kola aktarılır. Burada da aynı mantıkla robot ...

    • 11 Şubat 2017
      2 hafta ÖNCE 10 Yorum

      Arduino İle Labirent Çözen Robot Yapımı

      Kendi robotunu yap projelerimizin bu bölümünde arduino ile labirent çözen robot yapacağız. Labirent çözen robot özellikle robot yarışmalarında yer almaktadır. Bir labirentin çözüm yolunu bulmak aslında tek bir etkene bağlıdır. Bu etken sağ veya sol taraftaki herhangi bir duvarı takip ettirmektir. Bu etkenden yola çıkarak robot sol veya sağ ...

    • 07 Şubat 2017
      3 hafta ÖNCE Yorum Yok

      Arduino ile MLX90614 Kızılötesi Sıcaklık Sensörü Kullanımı

      Cisme temas etmeden, cismin sıcaklığını ölçen MLX90614 kızılötesi sıcaklık sensöründen bahsedeceğim. Dahili bir 17-bit ADC ve güçlü bir DSP, MLX90614'ün ölçümlerinde yüksek doğruluk ve çözünürlük verir. Vücut sıcaklığı ölçmek için uygundur. Ayrıca hareket algılamada da kullanabilirsiniz. MLX90614 Özellikler: Ortam sıcaklığı ölçme aralığı -40 ile + 125 ° C Nesne ...

    • 05 Şubat 2017
      3 hafta ÖNCE Yorum Yok

      Arduino ile Yazıyı Sese Dönüştüren Emic 2 Modülü Kullanımı

      Robotunuzu konuşturmak ve neler olup bittiğini söyletmek ister misiniz ? Emic 2 yazıyı sese çeviren modülle kolaylıkla projeleriniz konuşabilir. Emic-2, Parallax tarafından, ses sentezini tamamen zahmetsiz kılmak için Grand Idea Studio ile birlikte tasarlanmıştır.

    • 31 Ocak 2017
      4 hafta ÖNCE 7 Yorum

      Arduino ile DHT22 Sıcaklık Nem Sensörü Kullanımı

      DHT sensörleri, kapasitif nem sensörü ve bir termistör olmak üzere iki parçadan oluşur. DHT11 ve DHT22 olan iki DHT modelini ele alalım. Görünüm ve pin yapısı olarak benzer görünmelerine rağmen farklı ölçüm hassasiyetlerine sahiptirler. Aşağıda iki modelin karşılaştırmasına bakalım.

    Bizi Takip Et

    Son Yorumlar

    Sezgin GÜL
    Sezgin GÜL 2017-02-25 23:01:46
    merhaba batuhan, hatanın sebebi AFMotor.h kütüphanesini yüklemediğinden kaynaklanmış. Kütüphaneyi buradan indirebilirsin http://www.robimek.com/wp-content/uploads/AFMOTOR-master.rar
    batuhan 2017-02-25 21:52:21
    sezgin bey öncelikle çok teşekkür ediyorum proje için ; Arduino ya kodu derlediğimde şöyle bir sorun ile karşılaşıyorum Arduino:1.8.1 (Windows.....
    Emin ERKMEN 2017-02-25 19:55:34
    Bu robotun üstüne ekleme yapabilir misiniz? 1 hafta içinde? Bu bizim için çok önemli.
    Sezgin GÜL
    Sezgin GÜL 2017-02-25 19:48:46
    Çizgili olan labirenti çözen robotlarda o özellik mevcut. İlerleyen günlerde o tarz proje paylaşacağım.
    Emin ERKMEN 2017-02-25 19:34:28
    Peki bu robot. En kısa yolu nasıl bulabilir. İkinci kez aynı labirentten geçtiği zaman en kısa yoldan gitmesi için ne.....
    Sezgin GÜL
    Sezgin GÜL 2017-02-25 18:10:10
    Kodlarda sorun yok videodaki robotta kullanılan kodlardır. Motor yönlerini doğru taktınız mı. Yön komutlarında doğru yönde dönüyorlar mı bunları da.....
    Emin ERKMEN 2017-02-25 18:03:27
    kodlarda sıkıntı yok yani?
    Sezgin GÜL
    Sezgin GÜL 2017-02-25 17:17:46
    Bağlantılarınız doğru ve sensörlerin konumları uygun ise enerji yetersizliğinden kaynaklanabilir