Для изготовления bluetooth модуля для конструктора Знаток использовал модуль MLT-BT05 на чипе CC2541 от TI. Модуль по последовательному Serial порту соединяется с Arduino и поэтому его часто используют для самоделок.
В конструкторе Знаток Arduino mobile его используют в некоторых упражнениях для управления двигателями, светодиодами и машинкой из мобильного приложения на смартфоне.
Но MLT-BT05 грешит тем, что не все его версии хорошо коннектятся с adnroid устройствами. В моем случае, я мог увидеть модуль с помощью BLE Scanner на android, отправлять и получать команды, но при этом приложение Znatok Mobile обрывало соединение с bluetooth модулем. Перепробовал многое: разобрал APK приложения знаток до java кода, посмотрел логи android телефона, но проблему не нашел. В итоге решился перепрошить MLT-BT05.
В интернете было найдено много источников по прошивке CC2541 в HM10, клоном которого является MLT-BT05. К сожалению, прошивка модуля превратила его в кирпич. Но при этом он поддавался повторной перепрошивке, то есть физически он работает, но из-за разности реализаций программная часть контроллеров несовместимы.
Теперь у меня появился подопытный кролик, которого я буду изучать, пытаться запустить на нем хоть что-то полезное и в итоге адаптировать прошивку HM10 и вернуть его к полноценной жизни.
Сегодня будем делать "Hello World" для микроконтроллера - мигать светодиодом.
Что нужно:
- Сам bluetooth модуль с чипом СС2541 - MLT-BT05 или подобный. К нему нужно припаять 3 провода для программирования.
- Программатор CC-debugger или взамен его любой arduino. Я использовал из конструктора знаток модуль 111. Как за 5 минут из arduino сделать программатор в <этой> статье. И scetch для Arduino https://github.com/RedBearLab/CCLoader
- IAR embedded workbench for 8051 - это среда разработки с компилятором на языке СИ для контроллеров с ядром 8051. Есть 30-ти дневная бесплатная версия, но для России сейчас все доступ закрыт, поэтому ищем на просторах интернета любую версию 7.3, 8.3, 10+. Используем именно IAR, а не другие так как наша далекая цель взять проекты от корпорации TI по bluetooth BLE для СС2541 и восстановить работоспособность MLT-BT05.
- Батарейки на 3.6В. Подойдут 3 пальчиковых батарейки, Li-ion аккумулятор. По datasheet максимальное напряжение питания 3.9V. Но если модуль MLT-BT05 с платой и металлическими выводами, то можно подавать 5V, так как там уже стоит преобразователь напряжения.
- (желательно) конвертер логических уровней 5V в 3.3V, так как мы подпаиваемся к выводам CC2541 с уровнями 3.3 вольта. Но моя практика и обзоры в интернете показывают, что контроллер выдерживает до 5V.
Готовим схему
Схема, как и для перепрошивки. Но лучше перепроверить еще раз.
Дополнительный красный светодиод можно не подключать, тогда схема будет проще. Оранжевый провод подключенный к RX модуля arduino - он не нужен, забыл отключить.
Пишем программу
В основе CC2541/СС2540 лежит старое доброе ядро микроконтроллера 8051 с достаточно простой системой команд. Но мы будем программировать на языке C, что позволит писать программу сразу без вникание в детали работы контроллера.
1. Создаем проект в IAR
2. Собственно сама программа
Что бы программа работала со встроенным светодиодом необходимо скорректировать 2 строчки:
- #define LED P1_0 на #define LED P1_1
- P1DIR |= BV(0); на P1DIR |= BV(1);
BV(X) - Это макрос. Когда препроцессор будет проходить по коду, он сделает замену BV(0) на код 1<<0, а код BV(1) на 1<<1.
Операция << - это сдвиг числа на несколько бит влево. Сдвиг на 1 бит эквивалентно умножению числу на 2.
1<<0 = 1 = (00000001)
1<<1 = 2 = (00000010)
1<<2 = 4 = (00000100)
...
1<<7 = 128 = (10000000)
Операция ИЛИ ( |=) - побитовая операция или - краткая запись. Эквивалентная запись: P1DIR = P1DIR | BV(0). Фактически мы устанавливаем 0-ой бит в 1 не трогая остальные биты.
Порты P1_0, P1_1 .. - Это физически порты, которые были нарисованы на схеме. Если в порт запишем 0, то вывод на ножке будет содержать 3.3V, если запишем 1, то на выводе будет 3.3V
PxDIR -регистр управления режимом работы портов (dirrect - направление). Если в соответствующем бите стоит 1 - порт на ввод, если 0 - но вывод.
P1DIR=1 - все порты P1_y будут на ввод, кроме P1_0
P1DIR=2 - все порты P1_y будут на ввод, кроме P1_1
P1DIR=3 - все порты P1_y будут на ввод, кроме P1_1 и P1_0
Что бы удобно установить порт на вывод (1) и не помнить состояние других портов используем побитовое(бинарное) ИЛИ(OR):
P1DIR = P1DIR | BV(0) - все порты остаются в своем старом режиме, а порт P1_0 делаем на ввод
P1DIR = P1DIR | BV(1) - а тут дополнительно открываем еще и порт P1_1. Теперь у нас 2 порта на ввод.
3. Компилируем (получаем код прошивки)
Project -> Rebuild All
Прошиваем контроллер
После компиляции получаем HEX файл, то есть прошивку в 16-тиричной системе счисления. Его можно просмотреть любым текстовым редактором, так как это просто текст, а не бинарные данные (BIN). Я смотрю в FAR manager, но можно и в Блокноте.
Прошивальщик на Arduino умеет прошивать только BIN. Для конвертации используем Hex2bin (opensource проект).
Для прошивки используем команду: (как прошивать?)
ССLoader.exe port fille.bin 0, где port - номер COM порта к которому подключен arduino. У меня порт 4 и поэтому команды выглядит так:
> ССLoader.exe 4 fille.bin 0
Хвалим себя.
Итого
1. Проверили, что Bluetooth MLT-BT05 модуль рабочий. И что после неудачной прошивки модуль можно использовать как микроконтроллер и писать самостоятельно или искать подходящую прошивку
2. Следующим шагом будет попытка поднять BLE SDK для CC2541 от TI. Забегая вперед скажу, что сразу из коробки прошивка из BLE SDK не заработала, поэтому буду разбираться.