Делаем сенсорный плеер наподобие IPod Touch


Вадим Цырульников. tzirulnikov@mail.ru

Если хочешь не отставать от современных микроконтроллерных тенденций и иметь возможность сделать свой планшет, спутниковую автомобильную сигнализацию или умный дом — пора разобраться с 32-разрядными микроконтроллерами. Сегодня мы посмотрим, как работать с основанным на Cortex M3 контроллером STM32 и сделаем собственный iPodоподобный плеер.

ЧТО НАМ НУЖНО?

Сейчас одни из самых популярных микроконтроллеров на ядре Cortex (на ядре семейства Cortex, кстати, делаются и гаджеты Apple] — микроконтроллеры семейства STM32. Именно с ним мы и будем работать на примере STM32F103.

Но вначале разберемся со средствами разработки. Нам нужна плата с уже впаянным микроконтроллером и максимумом периферии, чтобы в процессе разработки обойтись без паяльника. В качестве отладочной платы я взял на eBay один из клонов платы Ну Fireball (за 76 долларов продается на bit.ly/Q0o4zf. ART, 2 х I2C, 3 х SPI, CAN, USB 2.0 FS и другой фарш). Из периферии на плате расположено следующее богатство:

Отладочную плату мы выбрали, теперь встает вопрос, как зашивать микроконтроллер на ней. Можно обойтись ресурсами самой платы, заливая прошивку через последовательный порт (для этоп служат джамперы BootO, Bootl на плате], но гораздо удобнее пользоваться внутрисхемным отладчиком, который позволит в любой момент видеть все, что творится внутри микроконтроллера. Можно взять JTAG-дебаггер, но гораздо дешевле и целесообразнее будет взять любую из плат семейства STM32 Discovery. Я пользуюсь STM32LDISCOVERY со встроенным ЖК-экраном, предназначенной для разработки портативных устройств с малым энергопотреблением (стоит 22 доллара], но можно взять плату подороже и с более мощным МК — STM32F4DISCOVERY (за 30-35 баксов, например, на все том же eBay: bit.ly/LhOWV1 — на борту микроконтроллер STM32F407 (168 МГц, 1 Мб Flash, 192 Кб RAM, Ethernet, интерфейс камеры, DSP и другое), акселерометр, MEMS-микрофон, ЦАП, USE OTG разъем + примеры с исходными кодами по работе с акселерометром, диктофон/плеер с использованием внешней USB-флешки и так далее. Чтобы соединить отладчик с отладочной платой, удобно использовать джамперный кабель (2 доллара на bit.ly/N95Vip).

Что касается программного обеспечения — тут нет заведомо наилучшего решения, на вкус и цвет каждому свое. Есть бесплатная среда Eclipse/GCC, есть платные IAR и Keill ( www.keil.com/demo/eval/arm.html). Последняя наиболее распространена и, на мой взгляд, куда удобнее остальных. Бесплатная версия позволяет собирать до 32 Кб кода, но с волшебными лекарствами, исцеляющими от этого ограничения, проблем на просторах инета нет.

Залить прошивку в микроконтроллер можно через среду разработки либо отдельной утилитой STM32 ST-LINK Utility.


Рис. 1. Схема подключения внутрисхемного отладчика

Реализация

Весь аппаратный и программный инструментарий собрали, теперь самая пора начинать реализацию. Подключаем отладочную плату котладчику, как показано на рис. 1, подключаем по USB и отладчик, и саму плату (при этом если установлены Alcohol 120% или Daemon Tools, то их нужно удалить, иначе отладчик в системе не определится], выставляем джамперы в соответствии с табл. 2. Теперь пойдем по простому пути. Запускаем STM32 ST-LINK Utility, открываем project/Obj/MP3_Play.hex и прошиваем. Все, теперь нашим самодельным айподом можно пользоваться.

Прошивка самодельного гаджета поддерживает работу с картами SD/SDHC до 32 Гб с файловой системой FAT16/FAT32, воспроизведение МРЗ/WMA/WAV/MID-файлов с частотой дискретизации 5-384 Кбит/с (файлы нужно складывать строго в папку /Music/ на карте), LRC-файлы (тексты песен с метками синхронизации, файлы складывать в папку /Irc/ на карте). Управление плеером — полностью и исключительно сенсорное. Есть три режима воспроизведения: Mode Rep — проигрывается один и тот же файл, Mode Cyc — по порядку проигрываются циклично все файлы, Mode Rnd — проигрывание в случайном порядке всех файлов на карте.

Кастомизация

А теперь самое интересное — поговорим о том, как внутри все устроено и как подпилить этот гаджет под себя.

Для микроконтроллеров с ядром Cortex-МЗ (МО) базовой является библиотека CMSIS компании ARM — общая для всех микроконтроллеров всех производителей с данным ядром, стандарт взаимодействия ПО с ядром. Каждый производитель добавляет к ядру свой набор периферии и задействует те или иные возможности ядра, предоставляя библиотеку — надстройку над CMSIS. У STM32 такая библиотека именуется Standard Peripheral Library (SPL, библиотека драйверов периферийных устройств, в проекте нашего гаджета она в папке /source/Library). Если CMSIS компании ARM реализует программный интерфейс к самому ядру Cortex, то SPL компании ST реализует интерфейс к периферии микроконтроллера, лежащей за пределами ядра Cortex. CMSIS отдельно скачивать нет необходимости — она уже входит в комплект поставки SPL (bit.ly/NzzUu8).

В качестве графической библиотеки для рисования объектов на экране и работы с сенсорной панелью экрана выбрана адаптированная для STM32 библиотека Microchip Graphics Library (входит в состав бесплатного пакета Microchip Application Libraries, доступного по адресу: bit.ly/P6YU0f). Она содержит драйверы большинства распространенных контроллеров LCD-экранов, элементы взаимодействия с пользователем (кнопки, слайдеры, чекбоксы и так далее), то есть предоставляет интерфейс твоему приложению для работы с LCD-экраном и его сенсорной панелью. В проекте она лежит в /source/code/GUI/. К слову говоря, у производителя этих микроконтроллеров — компании ST есть своя собственная бесплатная графическая библиотека для микроконтроллеров STM32 — STM32 Embedded GUI Library, но она значительно менее распространена, и ее использование куда хуже разжевано в интернете, чем у Microchip Graphics Library.

Отдельно стоит упомянуть про одну из утилит, входящих в комплект этой библиотеки, — Graphic Resource Converter. Утилита позволяет конвертировать изображения в форматах BMP, JPEG, шрифты (как в виде отдельных файлов, так и установленных в систему, в том числе True Type] и бинарные файлы в НЕХ-формат (на выходе получаем Си-файл, который можно использовать в своем проекте]. Именно таким образом в наш проект загружаются нестандартные иконки, кнопки и шрифты, в том числе кириллические. Шрифты, сгенерированные этой утилитой, хранятся в нашем проекте в файле source/Fonts.с, а картинки и иконки — в source/ PicturesC32.c (кнопки «вперед», «назад», «стоп», «проигрывание» и иконка с изображением динамика].

Работа со средой KEIL

Среды могут быть разными, мы будем рассматривать далее на примере Keil. После того как установили Keil, открываем им файл project/MP3_Play.proj, далее уже в самом Keil открываем «code —> main.с» — это и есть «точка входа» программы МРЗ-плеера. Чтобы посмотреть, где описана та или иная функция, в исходнике кликаем правой кнопкой мыши по названию функции и в появившемся меню выбираем «Go To Definition Of '[название_функции]'». Чтобы посмотреть, как твоя программа работает на реальном девайсе, нужно проверить, что отладчик и плата МРЗ-плеера соединены друг с другом так, как показано на рис. 1, далее подключить по USB саму плату МРЗ-плеера (Ну Fireball) и плату отладчика [STM32 DISCOVERY] к компьютеру — при этом в системе отладчик должен определиться как STMicroelectronics STLink dongle. Плату МРЗ-плеера тоже необходимо подключать по USB, так как питания отладчика недостаточно для платы плеера. Для начала отладки выбираем «Debug —> Start/Stop debug session» — откроется окно, как на рис. 2, и при этом в микроконтроллер зальется уже собранная ранее прошивка МРЗ-плеера. Здесь можно отметить переменные твоей программы, изменение значений которых в микроконтроллере ты сможешь видеть на лету, — для этого в исходнике кликаем правой кнопкой мыши по названию нужной переменной и выбираем «Add 'название_переменной' to... -> Watch 1» — в дальнейшем значение указанной переменной можно будетувидеть в окне «View—> Watch Windows —► Watch 1».


Рис.2. Kell в режиме отладки

Сбросить микроконтроллер можно командой «Debug —» Reset CPU». Чтобы начать выполнение программы в твоем девайсе, выбираем «Debug —» Run». В процессе отладки бывает необходимо приостановить работу программы на нужных участках кода (чтобы посмотреть значения переменных в этот момент, например). Для этого существуют «точки останова» — Breakpoints. Для этого два раза кликаем по номеру строки в файле исходника — номер помечается красным прямоугольником, указывающим, что при попадании на эту строку выполнение программы будет приостановлено.

Также довольно часто для отладки используют СОМ-порт. В нужных местах программах ставится обычный вызов printfl), который перенаправляет вывод в порт USART микроконтроллера.Такая техника используется и в нашем МРЗ-плеере. Подключаем USART1 к ком-порту компьютера, открываем терминалку и смотрим выводимые программой отладочные данные.

Логика работы MP3-плеера:
Графический интерфейс

Начнем наконец вникать в работу МРЗ-плеера «изнутри». Для начала — работа с графической библиотекой (рис. 3). Вначале необходимо правильно настроить ноги микроконтроллера для работы с экраном и включить на этих ногах тактирование — за это отвечает LCD_Configuration|]. Отдельно настраиваются ноги, к которым подключен сенсорный экран, — TPJnitl) (на экране стоит четы-рехпроводная резистивная сенсорная панель, которая подключена к микросхеме АЦП AD7843 на борту экрана, а уже та, в свою очередь, по интерфейсу SPI подключена к STM32). После этого нам необходимо проинициализировать библиотеку Microchip Graphics Library, вызвав GOLInitl), далее обстрелять байтами экран — задать ему настройки для корректной работы — LCD_Initialized.


Теперь графическая система нашего плеера готова к работе, но рисовать графический интерфейс на экране еще рано — при первом включении нужно откалибровать экран (предлагаем пользователю три раза нажать по разным уголкам экрана), для этого и вызываем TouchPanel_Calibrate(). Только после этого самая пора начинать рисовать интерфейс на экране вызовом встроенной функции библиотеки GOLDraw() — тем самым мы вызовем определенную нами GOLDrawCallback(). При первом вызове она вызовет CreateMp3Gui(), где перечисляем используемые цветовые схемы и определяем выводимые на экран графические объекты (кнопки, слайдеры и прочее), а при повторных вызовах будет менять выведенные на экран данные (например, время проигрывания файла]. Заполняем структуру с координатами точки нажатия на сенсорном экране при помощи TouchGetMsg() и обрабатываем ее средствами графической библиотеки путем вызова GOLMsg() — эта функция определит, на какой объект пользователь нажал, и при следующем вызове GOLDrawl) наша программа обработает это нажатие и внесет соответствующие изменения в вывод на экране. Таким образом, мы циклически бегаем по цепочке GOLDraw() —> TouchGetMsg() —> GOLMsg().


За работу с папками и файлами на SD/SDHC-карте отвечает бесплатная китайская библиотека Чана — FatFs Module (bit.lv/NXY833) реализующая функции для работы с файловыми системами FAT16/ FAT32 на микроконтроллерах ARM, AVR, PIC24 и многих других. Она не заточена под какой-то определенный носитель (SD-карта, USB-флеш) и при наличии соответствующего драйвера может работать хоть с жестким диском, подключенным к микроконтроллеру.

Работа по воспроизведению музыкальных файлов, за исключением рассмотренного выше вывода на экран, выглядит следующим образом:

Инициализация:

1.   SPI_Configuration — конфигурациявыводов5ТМ32 для SD-карты.

2.   SDJnit() — инициализация SD-карты.

3.   Vs1003_lnit() — конфигурация выводов SТМ32 для Vs1003. A. Mp3Reset(),Vs1003SoftReset() —сброс Vs1003.

5.   Load Patch() — инициализация Vs1003.

6.   f_mount() — монтированиефайловойсистемы SD-карты.

7.   FiltrateMusic() — считывание информации по MP3/WMA/WAV/ MID-файлам на карте.

Рабочий цикл (воспроизведение):

1.   f_open() — открытие выбранного музыкального файла.

2.   FindLrc() — поиск соответствующего lrc-файла для открытого ранеефайла.

3.   Vs1003_CMD_Write(SPI_VOL,volt) — установка выбранного уровя громкости.

4. Пишем b Vs1003 аудиоданные блоками по 512 байт. Аудиокодек каждый раз, когда готов принятьотнасочередную порциюдан-ныхдля воспроизведения, дергаетлинию DREQ.


Рис.4. Графический интерфейс МРЗ-плеера

Что дальше?

На самом деле вовсе необязательно использовать аппаратный МРЗ-декодер (Vs1003). Микроконтроллер STM32 вполне способен самостоятельно справиться с задачей декодирования МРЗ, и для этого производитель (ST) предоставляет бесплатную библиотеку для работы с МРЗ. Но по патентным соображениям данная библиотека не распространяется свободно, требуется подписание соглашения на ее использование — в основном по этой причине декодирование выполняется в нашем плеере отдельной микросхемой. Также существует вариант использования Helix МРЗ Decoder [datatvpe.helixcommunity.org/Mp3dec) для программного декодирования МРЗ силами STM32.

Во многих МРЗ-плеерах имеется встроенный FM-радиоприемник, который можно добавить и в наш плеер. Наиболее распространена для этих целей пускай и не новая, но зато дешевая (2 доллара) микросхема ТЕА5767, которая общается с микроконтроллером через интерфейс I2C и не требует внешней антенны. Винтернете можно найти много примеров работы с ней плюс ее не нужно искать в магазинах — велика вероятность, что, если разберешь старый ненужный плеер с FM-радио, увидишь эту микросхему. Также можно купить отладочную плату на eBay. Встроенной поддержки RDS нет — предлагается использовать для этого отдельный RDS-декодер SAA6588, либо можно перейти на использование более новой, но куда более дорогой микросхемы FM-радио SM735 — там поддержка RDS уже встроена.

Наигравшись с воспроизведением МРЗ и прослушиванием радиолы можешь захотеть добавить возможность просмотра фильмов в MPEG4. Просмотр видео можно реализовать на STM32, но в ограниченном виде (вряд ли сумеешь выжать более 20 fps 16-bit QVGA видео на Cortex МЗ либо 30 fps QVGA MotionJPEG на Cortex М4), поэтому тут нужно будет переходить на использование старших Cortex'ов. Для этого можно присмотреться к отладочной плате FriendlyARM (например, FriendlyARM Mini2440— 85 долларов на eBay), на которую ставятся микроконтроллеры с ядром ARM8/9/11. А это уже возможность запуска Linux/WinCE/Android на самодельном девайсе (в случае с STM32 линукс не поставить, только его обрезанный вариант ucLinux). Таким образом можно плавно перейти от создания своего Apple iPod к разработке самодельного Apple iPad.

Но в большинстве случаев использование старших кортексов — это стрельба из пушки по воробьям, плюс с ними на порядок сложнее работать, чем с Cortex M, поэтому сейчас наиболее распространены STM32 при решении бытовых задач. И уж точно не стоит начинать изучение микроконтроллеров с FriendlyARM.

В заключение не могу не упомянуть про один очень полезный инструмент для отладки микроконтроллерных (и не только) устройств. Допустим, у нас есть ненужный рабочий промышленный МРЗ-плеер с микросхемой FM-радио на борту, эту микросхему хочется прикрутить к своему девайсу, и из даташита не совсем понятно, как с ней работать. Тут на помощь приходит логический анализатор, которым мы можем подрубиться к исследуемому устройству и посмотреть, как производится обмен данными с микросхемой — что, например, нужно сделать, чтобы увеличить громкость. Также бывает необходимость в своем устройстве посмотреть, «что же там происходит на уровне сигналов», — внутрисхемная отладка далеко не всегда позволяет решить все проблемы.

Наиболее популярны логические анализаторы (которые также умеют работать и как осциллографы) USBee AX/DX и Saleae — подключаются к компьютеру через USB-интерфейс, на выходе — щупы для подключения к отлаживаемому устройству. На eBay/Alibaba/ DealExtreme большое разнообразие клонов, которые умеют работать с софтом как USBee, так и Saleae, по цене от 20 долларов. Также у них есть поддержка большинства популярных протоколов — I2C, SPI, CAN, USB, RS232, RS485 и множества других.

Вместо послесловия

Вот и все — плеер готов. По ссылке files.mail.ru/0F2SSL выложен полный проект МРЗ-плеера со всеми исходниками, можешь ковырять его и совершенствовать.

Даже если ты никогда раньше не имел дело с микроконтроллерами, этот самодельный МРЗ-плеер будет полезен и наверняка даст стимул и дальше осваивать эту область, ведь куда приятнее начинать изучение не с банального моргания светодиодом,а с чего-то более полезного и функционального. А куда развиваться дальше — решать тебе: можешь добавить поддержку OBD-II и сделать бортовой компьютер для машины медиацентром или целую систему домашней автоматизации. Не бойся и твори!


Рис. 5. МРЗ-плеер в сборе с отладчиком


Хакер 10\2012