Модуль BT201 + STM32 (Arduino)

Модуль BT201 5.0 Bluetooth представляет собой единый чип 4-в-1, который поддерживает Bluetooth, USB-флешку и TF-карту.
Функции:
  • Поддержка Bluetooth-аудио, передача данных BLE, воспроизведение U-диска, воспроизведение TF-карты, SPIFLASH. Поддержка декодирования форматов MP3, WAV, WMA, FLAC, AAC, APE.
  • 16-битный стерео ЦАП с усилителем для наушников, отношение сигнал/шум >= 95 дБ
  • Последовательный порт управления командой AT. Поддержка изменения скорости передачи данных для изменения имени Bluetooth, указания воспроизведения устройства и передачи данных мобильного телефона.
  • Поддержка двухрежимной передачи данных BLE и SPP, в то же время может воспроизводить звук Bluetooth, без конфликтов.
  • Поддержка вызова Bluetooth, многокнопочного управления, последней музыки, следующей музыки, воспроизведения паузы, регулировки громкости и других простых функций.
  • Поддержка получения полного имени файла последовательного порта воспроизведения, указанного пути воспроизведения, цикла или одиночного воспроизведения.
  • Поддержка функции записи 128KBS. Запись на TF-карту или U-диск, запись, удаление, воспроизведение и т. д.
При тестировании модуля BT201 был выбран микроконтроллер STM32 (плата разработчика STM32F103C8T6), так он содержит несколько UART портов, один будет использован для вывода информации в монитор порта, другой (Serial3) для отправки АТ команд в модуль BT201.
Как прошивать STM32 в среде Arduino IDE написано в — http://rcl-radio.ru/?p=68376
Так как STM32 прошивается через переходник USB to COM (RS232) YP-01 на чипе PL2303HX, в котором имеются 2 источника напряжения, то напряжение 3,3 В будут использованы для питания STM32, а напряжение 5 В для питания модуля BT201.
Подключения STM32 к USB to COM и BT201
USB to COM STM32 BT201
3.3 V 3.3
5 V VCC
TX PA10 (RX1)
RX PA9 (TX1)
GND G GND
PB10 (TX3) RX
PB9 (RX3) TX
Тестовый скетч
void setup(){
Serial.begin(115200);
Serial3.begin(115200);
Serial.println();
delay(500);
}
 
void loop(){
if (Serial.available() > 0) {
String str = Serial.readString();
Serial.println(str);
Serial3.print(str+"\r\n");
}
 
if (Serial3.available() > 0) {
String str = Serial3.readString();
Serial.println(str);
}
}

Команды управления отсылаете через монитор порта, и они пересылаются на модуль BT201.
Все, что приходит с модуля (ответы, сообщения и т.д.), пишется в монитор порта.

Список АТ команд —BT201 Module _KT1025A_B_User Manual _V2.3.pdf

Список основных АТ команд:

  • AT+CB  — стоп\паузы
  • AT+CC — следующий трек
  • AT+CD — предыдущий трек
  • AT+CE — громкость +++
  • AT+CF — громкость —
  • AT+CA15 — громкость уровень 15 (0-30)
  • AT+CM01 — Bluetooth
  • AT+CM02 — USB

Ниже показан пример управления модулем BT201 при помощи STM32 и нескольких кнопок, режимы работы и другая информация отображается на дисплее 0.96′ I2C 128X64 OLED.

Дисплей 0.96′ I2C 128X64 OLED на контроллере SSD1306 имеет разрешение 128х64 пиксел и подключается к микроконтроллеру по интерфейсу I2C.

Параметры дисплея SSD1306:

  • Технология дисплея: OLED
  • Разрешение дисплея: 128 на 64 точки
  • Диагональ дисплея: 0,96 дюйма
  • Угол обзора: 160°
  • Напряжение питания: 2.8 В ~ 5.5 В
  • Мощность: 0,08 Вт
  • Габариты: 27.3 мм х 27.8 мм х 3.7 мм

Кнопки управления:

  • PLAY / STOP — воспроизведение \ пауза в режиме Bluetooth и USB
  • >>> — следующий трек (файл, ролик) в режиме Bluetooth и USB
  • <<< — предыдущий трек (файл, ролик) в режиме Bluetooth и USB
  • Bluetooth \ USB — кнопка выбора Bluetooth или USB
  • VOLUME UP — громкость прибавить на 1 ед.
  • VOLUME WD — громкость удавить на 1 ед.

Меню Bluetooth

  1. Bluetooth
  2. Режим работы:
    1. not connected — нет соединения
    2. connected — соединение установлено
    3. play — воспроизвидение
  3. Уровень громкости

Меню USB

  1. USB
  2. Номер воспроизводимого файла (кол-во файлов на носителе*)
  3. Время звучания воспроизводимого файла
  4. текущее время проигрывания файла
  5. Уровень громкости

*Звуковые файлы на USB устройстве должны быть записаны й в корень файловой системы.

Подключения STM32, кнопок и дисплея

STM32 Кнопка** 0.96′ I2C 128X64 OLED
PB12 Bluetooth \ USB
PB14 >>>
PB15 <<<
PA12 PLAY / STOP
PA15 VOLUME UP
PA11 VOLUME DW
PB7 SDA
PB6 SCL

** Подключение кнопок

 

Подключения STM32 к  BT201
STM32 BT201
5V VCC
G GND
PB10 (TX3) RX
PB9 (RX3) TX
#include <Arduino.h>
#include <U8x8lib.h>
 
U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE);           
//U8X8_SSD1306_128X64_NONAME_SW_I2C u8x8(/* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE);  
 
String str;
 
int a,usb,trek,trek_time,trek_all,trek_off,blu_sos,vol;
unsigned long times,times0;
bool pp,w=1,w0;
 
 
 
void setup(){  
  u8x8.begin();
  u8x8.setPowerSave(0);
  Serial.begin(115200);
  Serial.println();
  Serial3.begin(115200);
  pinMode(PB12,INPUT_PULLUP);//pb12 usb/blu
  pinMode(PB14,INPUT_PULLUP);//pb14 >>
  pinMode(PB15,INPUT_PULLUP);//pb15 <<
  pinMode(PA12,INPUT_PULLUP);//pa12 >/=
  pinMode(PA15,INPUT_PULLUP);//pa15 vol+
  pinMode(PA11,INPUT_PULLUP);//pa11 vol-
  delay(300); 
  Serial3.print("AT+QM\r\n");
  delay(300); 
  Serial3.print("AT+QA\r\n");
  delay(300); 
  Serial3.print("AT+M1\r\n");
}
 
void loop(){
  u8x8.setFont(u8x8_font_chroma48medium8_r);
  if(w==1){w=0;
  u8x8.setCursor(0,1);u8x8.print("----------------");
  u8x8.setCursor(0,4);u8x8.print("----------------");
  u8x8.setCursor(0,6);u8x8.print("----------------");
  u8x8.setCursor(0,7);u8x8.print("USB+Bluetooth");
  }
//// BUTTON  
  if(digitalRead(PB12)==LOW && usb==0){pp=0;w0=1;times0=millis();Serial3.print("AT+CM02\r\n");Serial.println("USB");delay(20);} // start usb
  if(digitalRead(PB12)==LOW && usb==1){pp=0;w0=1;times0=millis();Serial3.print("AT+CM01\r\n");Serial.println("BLUT");delay(20);}// start bl
  if(digitalRead(PB14)==LOW){pp=0;w0=1;times0=millis();Serial3.print("AT+CC\r\n");Serial.println(">>>");delay(500);Serial3.print("AT+M1\r\n");}// >>>
  if(digitalRead(PB15)==LOW){pp=0;w0=1;times0=millis();Serial3.print("AT+CD\r\n");Serial.println("<<<");delay(500);Serial3.print("AT+M1\r\n");}// <<<
  if(digitalRead(PA12)==LOW && usb==0){Serial3.print("AT+CB\r\n");Serial.println("PLAY/PAUSE");delay(200);}// >/=
  if(digitalRead(PA12)==LOW && usb==1 && pp==0){pp=1;Serial3.print("AT+AA02\r\n");Serial.println("PAUSE");delay(200);}// >/=
  if(digitalRead(PA12)==LOW && usb==1 && pp==1){pp=0;Serial3.print("AT+AA01\r\n");Serial.println("PLAY");delay(200);}// >/=
  if(digitalRead(PA15)==LOW){Serial3.print("AT+CE\r\n");Serial.println(">vol+");delay(200);Serial3.print("AT+QA\r\n");}// vol+
  if(digitalRead(PA11)==LOW){Serial3.print("AT+CF\r\n");Serial.println(">vol-");delay(200);Serial3.print("AT+QA\r\n");}// vol-
 
  if (Serial.available() > 0) {str = Serial.readString();Serial.println(str);Serial3.print(str+"\r\n");}
 
  if (Serial3.available() > 0) { str = Serial3.readString();Serial.println(str); 
 
  a = str.indexOf("QM+01");if(a>=0){w0=1;times0=millis();usb = 0;Serial.print(str.substring(a+0,a+5));}//blu
  a = str.indexOf("QM+02");if(a>=0){w0=1;times0=millis();usb = 1;Serial.print(str.substring(a+0,a+5));}//usb
  a = str.indexOf("M1+");if(a>=0){str.setCharAt(a+4, 'x');trek = strtol(str.substring(a+3,a+11).c_str(),NULL,0);}
  a = str.indexOf("M2+");if(a>=0){str.setCharAt(a+4, 'x');trek_all = strtol(str.substring(a+3,a+11).c_str(),NULL,0);}
  a = str.indexOf("MT+");if(a>=0){str.setCharAt(a+4, 'x');trek_time = strtol(str.substring(a+3,a+11).c_str(),NULL,0);}
  a = str.indexOf("MK+");if(a>=0){str.setCharAt(a+4, 'x');trek_off = strtol(str.substring(a+3,a+11).c_str(),NULL,0);}
  a = str.indexOf("TS+00");if(a>=0){blu_sos=0;}
  a = str.indexOf("TS+01");if(a>=0){blu_sos=1;}
  a = str.indexOf("TS+02");if(a>=0){blu_sos=2;}
  a = str.indexOf("QA+");if(a>=0){vol = str.substring(a+3,a+5).toInt();}//vol
 }
 
  if(usb==0){
  u8x8.setCursor(0,0);u8x8.print("Bluetooth ");
  u8x8.setCursor(0,2);
    switch(blu_sos){
      case 0: u8x8.print("not connected");break;
      case 1: u8x8.print("connected    ");break;
      case 2: u8x8.print("play         ");break;
      }
    u8x8.setCursor(0,3);u8x8.print("              ");
    }
 
if(usb==1){
  if(pp==0){u8x8.setCursor(0,0);u8x8.print("USB play     ");}
  if(pp==1){u8x8.setCursor(0,0);u8x8.print("USB pause    ");}
  u8x8.setCursor(0,2);u8x8.print("File ");u8x8.print(trek);u8x8.print("(");u8x8.print(trek_all);u8x8.print(")     ");
  u8x8.setCursor(0,3);u8x8.print("Time ");
  int minut = trek_time / 60;int secon = trek_time - (minut * 60);u8x8.print(minut);u8x8.print(":");u8x8.print(secon/10);u8x8.print(secon%10);
  u8x8.print(" ");
  int minut_off = trek_off / 60;int secon_off = trek_off - (minut_off * 60);
  u8x8.print(minut_off);u8x8.print(":");u8x8.print(secon_off/10);u8x8.print(secon_off%10);u8x8.print(" ");
  if(millis()-times>999 && pp==0){times=millis();trek_off=trek_off+1;}
  if(millis()-times0>1999 && w0==1){w0=0;Serial3.print("AT+M1\r\n");}
}
  u8x8.setCursor(0,5);u8x8.print("VOLUME ");u8x8.print(vol/10);u8x8.print(vol%10);
 
}

Comments

    1. В мониторе порта отображаются только 8 символов названия трека, точнее путь к файлу, символы кириллицы вообще не отображаются, если ли смысл выводить эту информацию на дисплей?

  1. я тут тоже разбирался с этим модулем,выяснялось что их 2 вида.В общем у меня не выводит название файлов как положено.заказал другой тип

Добавить комментарий

Войти с помощью: