Как приручить свой Bluetooth. Часть 5

Эта часть посвящена программе «Конфигуратору». В задачи Конфигуратора входит узнать и при необходимости изменить некоторые параметры модуля Bluetooth HC-05.

Модули Bluetooth HC-03/05 имеют два режима работы:

  • режим конфигурирования,
  • режим передачи данных.

Режим работы определяется при подаче питания на модуль. Если на 34-ом контакт в момент включения модуля будет присутствовать логическая единица, то модуль перейдет в режим конфигурирования. Если на контакте будет присутствовать логический ноль, то модуль будет работать в режиме передачи данных.

Изображение модуля с обозначением контактов я позаимствовал у лоботрясов (http://lobotryasy.net/learning_bluetooth_part_1.php)

В режиме конфигурирования модуль принимает от хоста (микроконтроллер, компьютер) AT-команды и отвечает на них. Обмен ведется в текстовом режиме. При этом UART модуля настроен на скорость работы 38400 бод.

В режиме передачи данных модуль передает через радиоканал другому модулю всё, что приходит к нему на контакт 2 (RX). А на контакте 1 (TX) появляются байты, которые модуль принимает по радиоканалу от другого модуля.

Скорость работы UART в режиме передачи данных задается пользователем при конфигурации модуля. Поэтому на практике очень часто можно видеть, что в разных режимах работы UART модуля функционирует на разных скоростях.

Всё это очень хорошо описано в интернете. Моя же задача обнародовать программу-конфигуратор для работы с модулем. Собственно, программа представлена ниже, но я рекомендую брать её из репозитория, а не копипастить отсюда.

#!/usr/bin/env python
#coding: utf-8

'''
Конфигуратор модуля Bluetooth HC-05
Программа позволяет посмотреть и при необходимости изменить параметры модуля
'''

# Задайте правильные для вашего компа параметры:
PORT = "/dev/ttyUSB0"
BAUD = 38400


import threading
import serial
import time

################################################################################
'''
Класс дочернего потока.
Дочерний поток должен иметь атрибут self.daemon = True, иначе при завершении
главного потока он не завершиться и программа никогда не прекратит свое
выполнение
'''
class Bluetooth(threading.Thread):

  '''
  Обычный конструктор
  '''
  def __init__(self):
    threading.Thread.__init__(self)
    self.daemon = True
    
    try:
      self.ser = serial.Serial(PORT)
    except: # SerialException:
      print "Не могу открыть порт", port
      exit(0)
      
    self.ser.baudrate = BAUD
    self.ser.bytesize = serial.EIGHTBITS
    self.ser.parity   = serial.PARITY_NONE
    self.ser.stopbits = serial.STOPBITS_ONE
    self.ser.timeout  = None
  
  '''
  Функция потока.
  Эта функция не должна вызываться напрямую из главного потока.
  Запуск функции потока осуществляется вызовом метода start
  '''
  def run(self):
    answer = ""                      # Заготовка для новой строки
    # Бесконечный цикл
    while True:
      byte = str(self.ser.read())    # Читаем один байт
      if len(byte) == 1:
        answer += byte               # Составляем строку
        
        # Вывод ответа на консоль произведём только тогда, когда строка будет
        # сформирована полностью
        if len(answer) >= 2:         
          if answer[-2:] == "\r\n":  # Окончание строки
            print answer[:-2]        # Выводим строку на консоль без окончания
            answer = ""              # Заготовка для новой строки          

  '''
  Отправка команды в Bluetooth
  '''
  def write(self, cmd):
    if len(cmd) > 0:
      cmd += "\r\n"
      # print "Команда:", cmd
      self.ser.write(cmd)

################################################################################
def show_help():
  print """
  Команды Bluetooth
  
  AT             : пустая команда. Ответ от BT должен быть "OK"
  AT+RESET       : программный сброс модуля BT
  AT+ORGL        : вернуться к параметрам по умолчанию
  AT+VERSION?    : поучить имя версии
  AT+STATE?      : получить состояние модуля
  AT+NAME=имя    : задаить имя модуля (не более 20 символов)
  AT+NAME?       : получить имя модуля
  AT+ROLE=роль   : установить роль
  AT+ROLE?       : получить роль                    
  AT+PSWD=пароль : задать пароль (не более 4 символов)
  AT+PSWD?       : получить пароль
  AT+UART=скорость,стопы,чётность : задать параметры работы UART
  AT+UART?       : получить параметры UART
  AT+CMODE=режим : задать режим подключения
  AT+CMODE?      : получить режим подключения
  AT+BIND=адрес  : задать MAC-адрес устройства к которому хотим присоединиться
  AT+BIND?       : получить MAC-адрес устройства
  AT+PMSAD=адрес : удалить из списка адрес подключённого к модулю устройства
  AT+RMAAD       : удалить из списка все адреса
  AT+FSAD=адрес  : искать адрес в списке подключённых к модулю устройств
  AT+ADSN?       : получить количество подключённых к модулю устройств
  AT+MRAD?       : получить MAC-адрес недавно подключённого к модулю устройства
  """
  
################################################################################
if __name__ == "__main__":

  bt = Bluetooth()
  bt.start()
  
  prevcmd = "HELP"  # Предыдущая команда
  
  print "Для получения списка Bluetooth-команд наберите HELP"
  print "Для выхода из программы наберите QUIT"
  while True:
    command = raw_input(">").strip()
    if len(command) == 0:
      command = prevcmd
      
    CMD = command.upper()
    if CMD == "QUIT":
      break
    elif CMD == "HELP":
      show_help()
    else:
      prevcmd = command
      bt.write(command)
      time.sleep(0.1)  # Небольшая задержка, чтобы успеть напечатать ответ от BT

А вот так можно клонировать программу к себе на комп:

$ git clone https://github.com/zhevak/bluetooth

bt-1

Поскольку программа Конфигуратор теперь под руками, а модуль уже подключен к USB-UART переходнику, то грех не ввести кое-какие команды не посмотреть настройки модуля.

Вот как это выглядит на практике:

bt-2

Ну, вот, примерно так можно работать с модулем в режиме конфигурации. Мне остается заметить, что нажатие на клавишу Enter при пустой строке выполняет предыдущую команду.

В следующий раз я планирую рассказать о пересылке информации. А пока привыкаем к мысли, что соединение двух модулей по Bluetooth — это соединение, аналогичное соединению по RS232, но по радио-каналу.

Advertisements

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

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s