Elektronik Devreler Projeler Elektronik ve biraz daha fazlası İletişim - Araçlar - Dikkat - Topluluk
Elektronik / Mikrodenetleyici Projeleri/

MSP430F2274 CC2500 RF2500 Kit ile Kablosuz İletişim Uygulaması

Sponsorlu Bağlantılar

Merhabalar bu yazımda RF2500 kitinden ve bu kit ile yapmış olduğum uygulamadan bahsedeceğim. RF2500 kit Texas Instruments firması tarafından geliştirilmiş RF geliştirme kitidir. Paket içerisinde 2 adet target board ve programlama, Debug işlemleri için eZ430-RF USB Debug ara yüzü bulunmaktadır.

İki adet target board sayesinde karşılıklı olarak haberleşen sistemler tasarlayabilirsiniz. Target board üzerindeki ana elemanlar MSP430F2274 denetleyicisi ve CC2500 2.4 Ghz alıcı,verici tümdevresidir. Msp430f2274 denetleyicisi SPI iletişim ile CC2500 tümdevresini kullanarak kablosuz iletişimi gerçekleştirilir. RF2500 kit ile ilgili ayrıntılı anlatıma Fatih arkadaşımızın makalesinden ulaşabilirsiniz.

Benim RF2500 kit üzerinde gördüğüm eksiklikler target boardlar üzerinde bulunan denetleyicilerin dahili RC osilatör ile çalıştırılması. Ondanda geçtim diğer pinler dururken harici kristal bağlamak için kullanılan pinler CC2500 tümdevresi ile haberleşme için kullanılmış. TI sanki denetleyicilerin de harci kristal kullandırmak istemiyor. Belkide Harici kristal kullanınca denetleyici daha çok güç tüketiyordur. Belkide MSP430 serisinin düşük güç tüketmesinin nedeni budur :)

RF2500 kiti TI’nin kendi sitesinden sipariş edebilirsiniz. Kitin fiyatı 49 dolardır. Kablosuz iletişim uygulamalarına başlangıç ideal bir kit. Paket içeriğine bakılırsa 49 dolar fiyat ne ucuz ne pahalı normal bir fiyat.

msp430f2274-rf-cc2500-2-4-ghz-texas-instruments

ez430-rf-usb-debug-rf2500-kit-texas-instruments

Uygulamayı geliştirirken TI’nin MCU Teaching ROMs platformunda bulunan Beira Interior üniversitesi tarafından hazırlanmış MSP430 Teaching ROM CD’sindeki RF2500 uygulamasından faydalandım. Platform üzerinde msp430 ve diğer TI denetleyicileri ile ilgili faydalı eğitim CD’leri bulunmaktadır.

CD’ler direk olarak internet üzerinden indirilebilir. Ayrıca CD isteği de yapılabilir. TI’nin böyle bir hizmet vermesi çok güzel. Ben üniversite e-posta adresini kullanarak eğitim CD’lerinden istedim 1- 2 hafta içinde 5 eğitim CD’sini de ücretsiz olarak gönderdiler. Şansınızı denemekte fayda var.

texas-instruments-dps-teaching-rom-c5000-c2000-cd-msp430

Uygulamamızın çalışması basittir. Target boardlardan birisi Base (ana birim) diğeri de Remote (kontrol birimi) olarak adlandırılmıştır.

Arayüz programı

Target boardlar arasında haberleşirken veri göndermek için bilgisayar kısmında C# ile küçük bir arayüz programı yazdım. Şunu belirtmeden geçmeyeceğim target boardlar üzerlerinde bulunan denetleyici sayesinde bilgisayardan bağımsız olarak birbirleriyle haberleşebilirler. Ben uygulamada kolaylık olması açısından verileri bilgisayar üzerinden gönderdim.

Ara yüz programı comport üzerinden ana birime bağlanır. Program üzerinde bulunan düğmeler sayesinde kontrol birimi üzerinde ki yeşil ve kırmızı led yakılıp söndürülebilir. Ayrıca kontrol birimi tarafından gönderilen veriler program üzerindeki metin kutusunda görüntülenir.

target-board-remote-msp430-c-rf2500

Ana (Base) birim

Ana birim arayüz programından uart aracılığı ile aldığı verileri kablosuz olarak kontrol birimine iletir. Normal durumda ana birimde bulunan denetleyici uyku modundadır. Bilgisayardan yada kontrol biriminden bir veri geldiğinde denetleyici uyanarak çalışmasına devam eder.

Kontrol (Remote) birimi

Kontrol birimi ana birim tarafından aldığı veriye göre üzerinde bulunan kırmızı ve yeşil ledin durumlarını kontrol eder. Ayrıca üzerinde bulunan SW1 butonuna basıldığında ana birime deneme amaçlı “Merhaba Ben Remote 03(xx) ” yazısını gönderir. Burada xx kısmı yazının kaçıncı kez gönderildiğini gösterir. Normal şartlarda kontrol birimi uyku modundadır. Ana birimden veri alınması durumunda yada SW1 butonuna basılması ile kesme oluşturularak uyku modundan çıkar işlemine devam eder.

Görüldüğü üzere hem ana birim hem de kontrol birimi veri haberleşmesi olmadığında LPM4 modundadır. Yani tüm saat kaynakları ve işlemci kapalıdır. LPM4 modunda tüm saat kaynakları ve işlemci kapalı olduğundan denetleyici çok düşük güç tüketir. Bu sayede pil destekli uygulamalarınızı daha uzun süre çalıştırabilirsiniz. Bizim uygulamamızda da kontrol birimi pil ile çalıştığından bu özellik önemlidir!


/****************************************************************
*  İsim    : RF2500 Kablosuz iletişim uygulaması	     	*
*  Yazar   : Erhan YILMAZ                                       *
*  E-posta : erhan_yilmazz@hotmail.com                          *
*  Tarih   : 15.08.2011                                         *
*  Sürüm   : 1.0                                                *
****************************************************************/

//#define   BASE			Bu satır Base olarak derlemek için aktif Remote olarak derlemek için pasif yapılmalı
#include "include.h"

extern char paTable[];
extern char paTableLen;

char txBuffer[30];
char rxBuffer[30];
char sayac = 0;
void main (void)
{
   WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
    /* configure internal digitally controlled oscillator */
  DCOCTL  = CALDCO_8MHZ;//BSP_CONFIG_MSP430_DCOCTL;
  BCSCTL1 = CALBC1_8MHZ;//BSP_CONFIG_MSP430_BCSCTL1;
  BCSCTL3 |= LFXT1S_2;                      // LFXT1 = VLO
  TI_CC_SPISetup();                         // Initialize SPI port

  TI_CC_PowerupResetCCxxxx();               // Reset CCxxxx
  writeRFSettings();                        // Write RF settings to config reg
  TI_CC_SPIWriteBurstReg(TI_CCxxx0_PATABLE, paTable, paTableLen);//Write PATABLE

 // Configure ports -- switch inputs, LEDs, GDO0 to RX packet info from CCxxxx
#ifndef BASE
  //Remote kısmı için RF2500 üzerindeki buton kesme oluşturacak şekilde ayarlanıyor.
  TI_CC_SW_PxIES = TI_CC_SW1;               // Int on falling edge
  TI_CC_SW_PxIFG &= ~(TI_CC_SW1);           // Clr flags
  TI_CC_SW_PxIE = TI_CC_SW1;                // Activate enables
  TI_CC_SW_PxOUT |=  TI_CC_SW1 ;
  TI_CC_SW_PxREN |=  TI_CC_SW1 ;
#endif
 //LEDs SETUP
  TI_CC_LED1_PORT |= TI_CC_LED1_BIT;
  TI_CC_LED1_DDR  |= TI_CC_LED1_BIT;
  TI_CC_LED2_PORT |= TI_CC_LED2_BIT;
  TI_CC_LED2_DDR  |= TI_CC_LED2_BIT;
  TI_CC_Wait(4000);
  TI_CC_LED1_PORT &= ~TI_CC_LED1_BIT;
  TI_CC_LED2_PORT &= ~TI_CC_LED2_BIT;
  //GD0 SETUP
  //GDO pini düşen kenarda(Paket alındığında) kesme oluşturacak şekilde ayarlanıyor.
  TI_CC_GDO0_PxIES |= TI_CC_GDO0_PIN;       // Int on failing edge (end of pkt)
  TI_CC_GDO0_PxIFG &= ~TI_CC_GDO0_PIN;      // Clear flag
  TI_CC_GDO0_PxIE |= TI_CC_GDO0_PIN;        // Enable int on end of packet
  TI_CC_GDO0_PxSEL &= ~TI_CC_GDO0_PIN;

#ifdef BASE
  halUARTSetup();		//Base aygıt için uart'ı kur.
#endif
  TI_CC_SPIStrobe(TI_CCxxx0_SRX);           // Initialize CCxxxx in RX mode.
                                            // When a pkt is received, it will
                                            // signal on GDO0 and wake CPU
 #ifdef BASE
  TI_CC_SPIWriteReg(TI_CCxxx0_ADDR,     0x43);  // Base aygıt addres.
#else
   TI_CC_SPIWriteReg(TI_CCxxx0_ADDR,     0x03);  //Remote aygıt addres.
#endif
  _BIS_SR(LPM4_bits + GIE);                 // LPM4 moduna gir kesmeleri aç
}

#ifdef BASE
#pragma vector = USCIAB0RX_VECTOR
__interrupt void USCI_UART_0_RX_ISR(void)
{if(IFG2 & UCA0RXIFG){
  if (P1OUT & 0x01) P1OUT &= ~0x01; else P1OUT |= 0x01;
    TI_CC_Wait(3000);
    // Build packet
	//Paketi oluştur.
    txBuffer[0] = 2;                       // Paket uzunuluğu (not inc. len byte)
    txBuffer[1] = 0x03;                    // Paket addresi
    txBuffer[2]= UCA0RXBUF;
    RFSendPacket(txBuffer, 3);             // Paketi gönder.
}  }
#else
#pragma vector=PORT1_VECTOR
__interrupt void port1_ISR (void)
{
  unsigned int i;
  const char yazi[] = "Merhaba Ben Remote 03(xx) "; 

  if(P1IFG&TI_CC_SW1)                       // Butona basıldı mı?
  {
    TI_CC_Wait(3000);
    // Build packet
	//Paketi oluştur.
    txBuffer[0] = 27;                       // Paket uzunluğu (not inc. len byte)
    txBuffer[1] = 0x43;                     // Paket addresi
    for(i=0;i99) sayac=0;
    RFSendPacket(txBuffer, 28);             // Paketi gönder.
  }

  P1IFG &= ~(TI_CC_SW1);     // Kesme bayrağını temizle
}
#endif

#ifndef BASE
#pragma vector=PORT2_VECTOR
__interrupt void port2_ISR (void)
{
  char len;
  if(P2IFG&TI_CC_GDO0_PIN)             // Paket alındı mı?
  {
    if (RFReceivePacket(rxBuffer,&len))   //Alınan paketteki veriye göre ledlerin durumu düzenlenir.
    {
      if (rxBuffer[1] == '1')			//Gönderilen veri '1' ise kırmızı LED'i yak.
      P1OUT |= 0x01;
      else if (rxBuffer[1] == '2')		//Gönderilen veri '2' ise kırmızı LED'i söndür.
      P1OUT |= 0x02;
      else if (rxBuffer[1] == '3')		//Gönderilen veri '3' ise yeşil LED'i yak.
      P1OUT &= ~0x01;
      else if (rxBuffer[1] == '4')		//Gönderilen veri '4' ise yeşil LED'i söndür.
      P1OUT &= ~0x02;
      else if (rxBuffer[1] == '5')		//Gönderilen veri '5' ise her iki LED'i yak.
      {P1OUT |= 0x01; P1OUT |= 0x02;}
      else if (rxBuffer[1] == '6')		//Gönderilen veri '6' ise her iki LED'i söndür.
      {P1OUT &= ~0x01; P1OUT &= ~0x02;}
     }
    P2IFG &= ~(TI_CC_GDO0_PIN);     // Kesme bayrağını temizle
   }
}
#else
#pragma vector=PORT2_VECTOR
__interrupt void port2_ISR (void)
{
  char len;

  if(P2IFG&TI_CC_GDO0_PIN)             // paket alındı mı?
  {
    if (RFReceivePacket(rxBuffer,&len))     // Alınan paket uart üzerinden bilgisayara gönderilir.
    {
      if (P1OUT & 0x02) P1OUT &= ~0x02; else P1OUT |= 0x02;
      blastString(rxBuffer+1,len-1);
     }
    P2IFG &= ~(TI_CC_GDO0_PIN);     // Kesme bayrağını temizle
   } 

}
#endif

Görüldüğü gibi uygulama da denetleyici kısmında tek bir program bulunmaktadır. Program hem kontrol birimi hem de ana birim için kullanılabilir. Ana birim için kullanmak için programın başına “#define BASE” ifadesini ekleyip derlemek yeterlidir. Bu sayede program ana birim için derlenecektir.

Programa hiçbir ekleme yapılmadan derlendiğinde ise program kontrol birimi için derlenir. Bu sayede proje kalabalığı olmadan IAR IDE’si üzerinde tek bir proje oluşturarak hem ana birim hem de kontrol birimi programlanabilir.

merhaba-target-board-remote-msp430-c-rf2500-2

Ana birim ile kontrol birimi sağlıklı bir şekilde haberleşmektedir. Target boardlar üzerinde bulunanan CC2500 tümdevresi gerçekten kaliteli bir tümdevredir. Uygulamanın çalışma resminden de görüldüğü gibi kontrol birimi tarafından gönderilen 43 paket veri ana birim tarafından herhangi bir kayıp olmadan sorunsuz bir şekilde alınmıştır. Kit ile yaptığım denemelerde sadece bir kez veri kaybına denk geldim. Onun haricinde target boardlar sorunsuz bir şekilde haberleşmektedir.

Uygulamanın kodları IAR IDE üzerinde derlenmiştir.

Uygulamaya ait IAR ve C# proje dosyaları: msp430f2274-cc2500-rf2500-kit-ile-kablosuz-iletisim-uygulamasi.ZIP

Uygulamanın çalışma videosu

Bir sonraki yazıda görüşmek üzere!

  • Mehmet Emre Terzi

    Su altında çalışır mı bu kablosuz iletişim? Çalışırsa ne kadar derinliğe kadar çalışır ?

  • Erhan

    Merhabalar,
    Tahsiliniz nedir bilmiyorum ama mesafeyi hesaplayabilmek için vericiden yayılan dalganın gücünü, kullanılan suyun dielektrik katsayısını ve en önemlisi elektromanyetik dalga teorisi hakkında bilgi sahibi olmak lazım. Fakat suyun iletkenliği boşluğa göre yüksek olduğu için su altınca çalışacağını düşünmüyorum.

  • Ali Ercan Zeytin

    Merhabalar ben üniversite 2. sınıf Mekatronik bölümü okumaktayım. Proje olarak 16F877A pic’i ile “KABLOSUZ ÇAĞRI CİHAZI” ödevi verilmiştir. ne yazık ki okuldaki uygulama öğretimleri yetersiz olduğu için nasıl yapacağım konusunda bilgim bulunmamakta ve internette “KABLOSUZ ÇAĞRI CİHAZI” hakkında hiçbir bilgi alamamaktayım. Neler yapmam gerektiğini ne parçaları almam gerektiğini bilen kişi varsa yardımcı olabilirse çok sevinirim. hevesim var yapmak için kendim uğraşarak yapmak istiyorum ama hiçbir bilgi vb şeyler bulamadığım için tıkandım bilgisi olanların yardımına ihtiyacım var :/