HM-10 modülü ile BLE haberleşmesi

taydin

Timur Aydın
Staff member
Katılım
24 Şubat 2018
Mesajlar
21,724
Benim çekmeceleri bugün biraz kurcaladım ve çok önce aldığım HM-10 modülünü buldum. Bununla BLE testi yapmak için interneti araştırınca şu sayfa çıktı:


Hemen oradaki sayfaya göre devreyi kurayım dedim. Kodu da aynen kopyaladım. Ama akıllı telefon uygulaması olarak sayfada verileni değil de google play'den şu BLE terminal uygulamasını yükledim:

 
Neyse programı derledim ve yükledim. Sistem hiç çalışmadı. Uzun lafın kısası, sayfada verilen bilgilerde bir sürü hata var. BLE Terminalden gönderdiğim hiçbir bilgi arduino'ya gitmiyor. Arduino'dan gönderilen bilgiler de terminale ulaşmıyor. Sonra programdaki gereksiz şeyleri çıkardım, UART pin bağlantıları yanlış verilmiş onu düzelttim, sonra haberleşme çalıştı.

IMG_20220427_212922.jpg
 
Kullandığım Arduino programı

C++:
#include <SoftwareSerial.h>

SoftwareSerial HM10(2, 3);

char rx_buffer[150];
unsigned int index = 0;

void setup()
{
  Serial.begin(115200);
  HM10.begin(9600);
}

void loop()
{
  HM10.listen();
  while (HM10.available() > 0)
  {
    char data = HM10.read();
    if (index < (sizeof(rx_buffer) - 1))
    {
      rx_buffer[index++] = data;
      if (data == '\n')
      {
        rx_buffer[index++] = '\0';
        Serial.println(rx_buffer);
        index = 0;
      }
    }
  }

  if (Serial.available())
  {
    HM10.write(Serial.read());
  }
}
 
Bu modülden ben de de 3-4 tane var Bluetooth bağlantı sevmediğim için çok kulanmiyorum
 
Neyse programı derledim ve yükledim. Sistem hiç çalışmadı. Uzun lafın kısası, sayfada verilen bilgilerde bir sürü hata var. BLE Terminalden gönderdiğim hiçbir bilgi arduino'ya gitmiyor. Arduino'dan gönderilen bilgiler de terminale ulaşmıyor. Sonra programdaki gereksiz şeyleri çıkardım, UART pin bağlantıları yanlış verilmiş onu düzelttim, sonra haberleşme çalıştı.

17045 eklentisine bak
Bu orjinal HM-10
Şuan pek bulunmuyor piyasada.
 
Yalnız bu modül sadece AT komutunu kabul ediyor, ona da yalnış cevap veriyor. Diğer hiçbir AT komutunu kabul etmiyor. Herhalde bundaki firmware güncellenecek.
 
Abi Şöyle denedin mi
AT+NAME?

AT+BAUD?
 
Hepsine ERROR diyor dangalak.
 
Hepsine ERROR diyor dangalak.
O zaman benim engin tecrübemden istifade edip update yapacaksın :katil1:

 
Abi bana da esp01 öyle diyip duruyodu chip en pinini lojik 1 yapmak lazımmış uykusundan uyanıp cevap vereye tenezzül etmesi için belki seninkide en pinine birşeyler bekliyordur

Uyku modunda olsa haberleşme çalışmazdı herhalde. Haberleşme iyi çalışıyor

a.jpg


1651092359680.png
 
Son düzenleme:
Bu da arduinodan terminale

1651093104112.png


a.jpg
 
Kullandığım Arduino programı

C++:
#include <SoftwareSerial.h>

SoftwareSerial HM10(2, 3);

char rx_buffer[150];
unsigned int index = 0;

void setup()
{
  Serial.begin(115200);
  HM10.begin(9600);
}

void loop()
{
  HM10.listen();
  while (HM10.available() > 0)
  {
    char data = HM10.read();
    if (index < (sizeof(rx_buffer) - 1))
    {
      rx_buffer[index++] = data;
      if (data == '\n')
      {
        rx_buffer[index++] = '\0';
        Serial.println(rx_buffer);
        index = 0;
      }
    }
  }

  if (Serial.available())
  {
    HM10.write(Serial.read());
  }
}

Bu kodu referans alarak kullandığım işlemci için bir kod yazdım. Arduino ile deneme yaptığımda modül AT komutlarına cevap verdi yani çalışıyor. Fakat kendi işlemcim ile çalıştırmayı denediğimde henüz iletişim kuramadım. Kullandığım işlemci MS51FB9AE. Nuvoton'un yapmış olduğu 8051 mimarili bir işlemci.

C:
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* SPDX-License-Identifier: Apache-2.0                                                                     */
/* Copyright(c) 2020 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/
#include "ms51_16k.h"

#define STATE_DELAY_TIME       1000
#define RECEIVE_DATA_LENGTH     30

// Global variables
volatile uint16_t systemTick = 0;

uint8_t state = 0;
uint16_t stateFirstTime = 0;
uint16_t stateSecondTime = 0;

volatile uint8_t rxBuffer[RECEIVE_DATA_LENGTH];
volatile uint8_t index = 0;

/************************************************************************************************************/
/* PROTOTYPES                                                                                                                  */
/************************************************************************************************************/
void timer_1ms_init();
uint16_t millis();

void UART_Init(void);
void analyse_data(char*);


/************************************************************************************************************/
/* ISR FUNCTIONS                                                                                                          */
/************************************************************************************************************/
void Timer2_ISR (void) interrupt 5        // Vector @  0x2B
{
_push_(SFRS);
        systemTick++;
    clr_T2CON_TF2;
_pop_(SFRS);
}

void SerialPort1_ISR(void) interrupt 15
{
    _push_(SFRS);
 
    if (RI_1)
        {
            uart1_receive_data = SBUF_1;
            if (index < RECEIVE_DATA_LENGTH - 1)
            {
                rxBuffer[index++] = uart1_receive_data;
                if (uart1_receive_data == '\n')
                {
                    rxBuffer[index] = '\0';
                    analyse_data(rxBuffer);
                    index = 0;
                }
            }
            
            RI_1 = 0;
        }

    if (TI_1)
    {
                TI_1 = 0;
    }

    _pop_(SFRS);
}

/************************************************************************************************************/
/* FUNCTION_PURPOSE: Main Loop                                                                              */
/************************************************************************************************************/
void main (void)
{
        // Init functions
    MODIFY_HIRC(HIRC_24);
    Enable_UART0_VCOM_printf_24M_115200();
    UART_Init();
    timer_1ms_init();        // led blink on electronic board
        
    P12_PUSHPULL_MODE;
    P12 = 1;
    ENABLE_GLOBAL_INTERRUPT;
    
    
    while(1)
        {
            switch(state)
            {
                case 0:
                {
                    state = 1;
                }break;
                
                case 1:
                {
                    stateFirstTime = millis();
                    // printf("stateFirstTime = %u\r",stateFirstTime);
                    state = 2;
                }
                case 2:
                {
                    stateSecondTime = millis();
                    // printf("stateSecondTime = %u\n",stateSecondTime);
                    if (stateSecondTime - stateFirstTime > STATE_DELAY_TIME)
                    {
                        P12 ^= 1;
                        state = 0;
                    }
                }
            }
        }

}


/************************************************************************************************************/
/* TIMER RELATED FUNCTIONS                                                                                        */
/************************************************************************************************************/
void timer_1ms_init()
{
    // Timer2_AutoReload_Interrupt_Initial(24,300000);
        TIMER2_DIV_128;
    TIMER2_Auto_Reload_Delay_Mode;
    RCMP2L = TIMER_DIV128_VALUE_1ms_FOSC_24000000;
    RCMP2H = TIMER_DIV128_VALUE_1ms_FOSC_24000000 >> 8;
    TL2 = 0;
    TH2 = 0;

    set_ET2;    // Set timerinterrupt
    set_TR2;    // Start timer
}

uint16_t millis()
{
    return systemTick;
}


/************************************************************************************************************/
/* UART RELATED FUNCTIONS                                                                                          */
/************************************************************************************************************/
void UART_Init(void)
{
    P16_QUASI_MODE;
    P02_INPUT_MODE;
    UART_Open(24000000, UART1_Timer3 , 9600);
    ENABLE_UART1_INTERRUPT;
}

void analyse_data(char* buffer)
{
    int i = 0;
    
    while (buffer[i] != '\0')
    {
        printf("%X", buffer[i]);
        i++;
    }
    
    printf("\r\n");
    
    index = 0;
}

Yazdığım kodda bir sorun var mı? Yoksa Putty'den vs. kaynaklanan bir hata olabilir mi burada? Donanımsal olarak da HM-10'un RX pinine bir gerilim bölücü koydum 3.3 volt seviyesinde tutmak için.
 

Forum istatistikleri

Konular
5,787
Mesajlar
98,968
Üyeler
2,464
Son üye
s4met

Son kaynaklar

Son profil mesajları

cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Kesici/Spindle hızı hesaplamak için SpreadSheet UDF'leri kullanın, hesap makinesi çok eski kalan bir yöntem :)
Dr. Bülent Başaran,
Elektrik ve Elektronik Mühendisi
Yonga Tasarım Özdevinimcisi
Üç güzel "çocuk" babası
Ortahisar/Ürgüp/Konya/Ankara/Pittsburgh/San Francisco/Atlanta/Alaçatı/Taşucu...

Back
Top