audiohobby.ru audiohobby.ru

Индикатор уровня на основе платы Arduino DUE с 3,5-дюймовым TFT-дисплем для RPi

Внешний вид


Меня в своё время заинтересовала идея реализации такого индикатора, которую предложил Артём (getsket), правда он рассматривал возможность использовать для этого микрокомпьютер Raspberry Pi 3 и дисплей большего размера. У меня же лежал без надобности 3,5-дюймовый сенсорный дисплей, который я безуспешно пытался подключить к плееру RuneAudio (а его использование совместно с системой Raspbian, на мой взгляд, лишено всякого смысла, хотя с ней он заработал).


Рассматриваемый дисплей имеет разрешение 480x320 точек и активные размеры экрана 75x50 мм (следует заметить, что рабочая область экрана смещена несколько влево — это видно на фотографии, но это просто нужно учесть при монтаже дисплея). Он управляется по последовательной шине SPI, но, несмотря на это, совместно с платой Arduino DUE обладает достаточным быстродействием, высокой яркостью и контрастностью. Подсветка экрана — равномерная, без пятен и засветов,  с отличной прорисовкой мелких деталей (очень хорошо читается текст из символов высотой 1,5 мм), приличные углы обзора (имеющаяся фотография всего этого передать не может). На основе используемой графической библиотеки GxTFT нетрудно реализовать и другие подобные проекты, например для «Умного дома», или для автомобиля, где требуется наглядное представление информации от различных датчиков. Можно использовать дисплеи с другими размерами экрана, главное, чтобы они поддерживались указанной библиотекой. Дальше — что, где и как отображать — зависит от фантазии программиста. Мне пришлось вспоминать школьный курс тригонометрии и преобразование координат.


Решение использовать плату Arduino DUE было совершенно не очевидным. Мне помогла статья Александра Жорника Соединяем несоединимое.  3.5" TFT цветной дисплей на чипе ILI9486 от Raspberry Pi подключаем к Arduino DUE. В этой статье довольно доходчиво расписано, как можно в принципе реализовать такую связку, правда за подробностями пришлось обращаться к автору — большое ему спасибо за оказанную помощь. Для меня вообще было открытием, что существует такая плата Arduino с 32-разрядным микроконтроллером ARM (AT91SAM3X8E), работающим на тактовой частоте 84 МГц! При работе с описываемой платой необходимо учитывать, что напряжение её питания и логические уровни сигналов составляют +3.3В.


На мой взгляд, приобретать оригинальную плату Arduino DUE не имеет никакого смысла — её стоимость может в несколько раз превышать стоимость китайского клона, который прекрасно работает. Единственное, что нужно сделать — провести небольшую доработку, которая устраняет возможный неустойчивый запуск после включения — без доработки для нормального запуска может потребоваться нажатие кнопки Reset. На оригинальных платах эта доработка R3 уже проведена, на китайских клонах — обычно нет. Здесь подробно описан способ решения этой проблемы. Суть доработки сводится к тому, что нужно запаять резистор 10 кОм типоразмера 0603 между истоком и затвором полевого транзистора T3 рядом с 6-контактным разъёмом ICSP. Я не стал проверять работоспособность своего экземпляра китайского клона платы Arduino DUE без этого резистора, и сразу запаял его, и никаких проблем в работе замечено не было.


Arduino DUE


Можно подключить дисплей к плате Arduino DUE с помощью обычных проводов со штырьками, которые используются на макетных платах Arduino. Поначалу, для первой проверки, я так и сделал, но это очень неудобно, так как провода перекручиваются, штырьки выскакивают и даже обламываются. Поэтому для дальнейших экспериментов для дисплея был сделан переходник на основе 7-проводного ленточного кабеля — именно столько контактов используются дисплеем для отображения информации (функции сенсорного экрана мы не используем). На одном конце кабеля распаивается 26-контактный разъём «папа» для подключения непосредственно к дисплею:


Плата переходника сверху


Плата переходника снизу


а на другом конце кабеля — 7-контактный разъём CHU-7 (с ответной частью для монтажа на плату CWF-7), или другой подходящий:


Переходник


Контакты дисплея, используемые для вывода информации:



















































Контакт переходника
Контакт дисплея Сигнал дисплея Сигнал Arduino Примечание
1 2 +5V +5V На плате дисплея уже имеется стабилизатор +3,3V
2 6,9,20,25 Gnd Gnd  
3 22 RST D5  
4 18 DC D6  
5 24 CS D10  
6 19 MOSI D75 Разъём SPI, контакт 4
7 23 SCK D76 Разъём SPI, контакт 3

Так выглядит дисплей с переходником:


Дисплей с переходником


Для защиты дисплея от внешних воздействий, а также для возможности его крепления, из оргстекла для него был изготовлен корпус, состоящий из 6 частей: переднее тонированное серое стекло толщиной 2 мм размерами 104x73 мм, задняя крышка такого же размера из прозрачного оргстекла толщиной 2 мм с вырезом, и 4 бортика шириной 8 мм из оргстекла толщиной 6 мм (покупалось когда-то в Чип и Дип), прикреплённые к переднему стеклу клеем B7000. По углам конструкции просверлены 4 отверстия под винты M2x12 с потайными головками. Во вложении вместе с рисунком печатной платы переходника для дисплея приведена разметка корпуса для дисплея. Оргстекло я резал на станке, установив в него пильный диск для стеклотекстолита.


Для выполнения функций измерителя уровня необходимо собрать узел полуволновых пиковых детекторов, преобразующих звуковые сигналы с (линейного) выхода усилителя к уровням до +3,3В, которые будут подаваться на аналоговые входы A0, A1 платы Arduino (являющиеся на самом деле входами АЦП):


Пиковые детекторы V1.0


Схемы пиковых детекторов «подсмотрены» в статье ATmega8 — VU5 Светодиодный индикатор уровня. Их особенностью является использование однополярного питания с  сохранением достаточной линейности и практическим отсутствием начального напряжения смещения на выходах, что обеспечивает нормальную работу в диапазоне сигналов примерно до 30..40дБ. При слишком малых уровнях сигнала возможно влияние помех по цепям питания и проявление разбаланса каналов. Ввиду последнего обстоятельства желателен подбор диодов VD1, VD2 по прямому падению напряжения (с помощью мультиметра). Может быть также потребуется подбор микросхемы компаратора LM393 (из-за заметной разницы в отображении каналов на малых уровнях мне пришлось заменить свой первоначальный экземпляр LM393 на другой, более «удачный»).  Выбор такой схемы пиковых детекторов является компромиссным: он в целом обеспечивает приемлемую точность измерений при относительной простоте схемы. Лучших результатов можно достичь применением пиковых детекторов на основе ОУ с двухполярным питанием. Однако в этом случае придётся дополнительно использовать DC-DC инвертор для получения отрицательного напряжения -5В. Рабочий пример подобной реализации описан здесь


Для сборки необходимых узлов можно изготовить отдельную печатную плату, которая устанавливается сверху платы Arduino DUE. Однако, мне приглянулся другой вариант — использовать для этих целей готовую макетную плату для Arduino MEGA 2560 — по размерам и распиновке она подходит для Arduino DUE. На ней мы соберём пиковые детекторы и скоммутируем разъём для подключения дисплея:


Вид сверху


Рядом с разъёмом для дисплея к шинам питания +5В необходимо подключить фильтрующий электролитический конденсатор номиналом 100 мкФ — без него возможны сбои в работе.


Для монтажа соединений удобно использовать тонкий лужёный одножильный провод в цветной изоляции — можно сразу приобрести катушку с проводами 8 цветов (Multi). Во вложении приведён рисунок печатной платы переходника для дисплея в формате программы Sprint Layout 5, а также схема монтажа проводов на макетной плате.


Вид снизу


Для разводки сигналов SCK (D76) и MOSI (D75), идущих к разъёму SPI Arduino DUE, на макетную плату снизу припаивается разъём PBS-2. Схема всех контактов Arduino DUE приведена ниже:


Arduino DUE


Теперь рассмотрим не менее важную программную часть устройства. Как уже указывалось, она основана на использовании готовой библиотеки GxTFT, автором которой открыт небольшой форум.


Для первоначального запуска графической демо-программы необходимо сначала загрузить и затем распаковать архивный файл библиотеки GxTFT-master.zip (на всякий случай этот файл библиотеки V2.1.0 я прикрепил в конце статьи) в папку Arduino\libraries, расположенную в папке «Мои документы» («Документы» в системе Windows 10) — после этого библиотека будет установлена. То же самое можно сделать через среду Arduino IDE, если зайти в меню Скетч | Подключить библиотеку | Добавить .ZIP библиотеку… и выбрать файл с архивом GxTFT-master.zip. После этого нужно перейти во вложенную папку распакованного архива examples\GxTFT_DUE_HVGA_graphicstest и откорректировать файл скетча GxTFT_DUE_HVGA_graphicstest.ino — в нём необходимо после строки:


// ***> select a pre-configured display header <***


заменить имя файла в заголовке #include:


#include «myTFTs/my_3.5_HVGA_480x320_DUE_direct.h»


на имя файла, соответствующего нашему дисплею:


#include «myTFTs/my_3.5_RPi_480x320_DUE.h»


Теперь нужно открыть файл скетча GxTFT_DUE_HVGA_graphicstest.ino в среде Arduino IDE. Далее через меню Инструменты | Платы | Менеджер плат в среде Arduino IDE необходимо добавить плату Arduino DUE, если она отсутствует. Плата Arduino DUE подключается к компьютеру через разъём USB «Programming», находящийся рядом с разъёмом питания платы, а в настройках среды Arduino IDE требуется выбрать соответствующий COM-порт: «Programming Port».


Arduino DUE снизу


Если нажать на кружок со стрелкой в меню Arduino IDE, начнётся компиляция программы с последующей записью полученной прошивки в плату (на это потребуется некоторое время — объём прошивки может составляет порядка 60 кбайт). После этого на экране должны появиться демонстрационные изображения.


Документации на библиотеку нет. Чтобы облегчить её применение, приведу краткий список использованных мной в программе индикатора уровня графических процедур и функций с небольшими пояснениями (или неиспользованных, но понятных). Полный перечень и примеры их использования можно найти в файлах src\GxTFT.cpp и examples\GxTFT_DUE_HVGA_graphicstest\GxTFT_DUE_HVGA_graphicstest.ino. Для доступа к ним необходимо создать в программе экземпляр (объект) класса TFT_Class (или, что то же самое, класса GxTFT): в нашей программе этот объект создаётся в файле src\myTFTs\my_3.5_RPi_480x320_DUE.h и имеет имя tft. После этого в программе можно использовать методы (процедуры и функции) этого объекта:














































































Метод Пояснение
tft.init (); Выполняет сброс и инициализацию дисплея (должно выполняться первым)
tft.setRotation ( r ); Устанавливает ориентацию экрана r=0..3 (по умолчанию 0)
tft.width () Возвращает ширину экрана в пикселях (480)
tft.height () Возвращает высоту экрана в пикселях (320)
tft.fillScreen (color); Очищает экран заданным цветом color
tft.drawPixel (x,y,color); Рисует точку заданного цвета в позиции (x,y), где 0 <= x <= 479, 0 <= y <= 319, причём координатам (0,0) соответствует верхний левый угол экрана
tft.drawLine (x1,y1,x2,y2,color); Рисует линию заданного цвета между точками (x1,y1) и (x2,y2)
tft.drawFastHLine (x,y,w,color); Рисует горизонтальную линию заданного цвета шириной w от точки (x,y)
tft.drawFastVLine (x,y,h,color); Рисует вертикальную линию заданного цвета высотой h от точки (x,y)
tft.drawTriangle (x1,y1,x2,y2,x3,y3,color); Рисует треугольник заданного цвета по координатам его вершин (x1,y1), (x2,y2), (x3,y3)
tft.fillTriangle (x1,y1,x2,y2,x3,y3,color); Рисует залитый треугольник заданного цвета по координатам его вершин (x1,y1), (x2,y2), (x3,y3)
tft.drawRect (x,y,w,h,color); Рисует прямоугольник заданного цвета с координатами левого верхнего угла (x,y), шириной w и высотой h пикселей
tft.fillRect (x,y,w,h,color); Рисует залитый прямоугольник  заданного цвета с координатами левого верхнего угла (x,y), шириной w и высотой h пикселей
tft.drawRoundRect (x,y,w,h,r,color); Рисует прямоугольник заданного цвета со скругленными углами радиусом r, с координатами левого верхнего угла (x,y), шириной w и высотой h пикселей
tft.fillRoundRect (x,y,w,h,r,color); Рисует залитый прямоугольник заданного цвета со скругленными углами радиусом r, с координатами левого верхнего угла (x,y), шириной w и высотой h пикселей
tft.drawCircle (x,y,r,color); Рисует окружность заданного цвета с центром в точке (x,y) и радиусом r
tft.fillCircle (x,y,r,color); Рисует залитый круг заданного цвета с центром в точке (x,y) и радиусом r
tft.drawEllipse(x,y,rx,ry,color); Рисует эллипс заданного цвета с центром в точке (x,y), радиусами горизонтальной rx и вертикальной ry дуг
tft.fillEllipse(x,y,rx,ry,color); Рисует залитый эллипс заданного цвета с центром в точке (x,y), радиусами горизонтальной rx и вертикальной ry дуг
tft.setTextSize (s); Устанавливает размер шрифта (0..7)
tft.setTextColor ( c ); Устанавливает заданный цвет текста c (с прозрачным фоном)
tft.setTextColor (c,b); Устанавливает заданные цвета текста c и фона b
tft.setCursor (x,y); Устанавливает текстовый курсор в графическую позицию (x,y)
tft.print (a);  Выводит значение параметра a на экран в текущую позицию текстового курсора

Для цветового  параметра color можно использовать следующие предопределённые названия констант:
BLACK, NAVY, DARKGREEN, DARKCYAN, MAROON, PURPLE, OLIVE, LIGHTGREY, DARKGREY, BLUE, GREEN, CYAN, RED, MAGENTA, YELLOW, WHITE, ORANGE, GREENYELLOW, PINK.


При желании программу можно доработать или написать заново, используя имеющиеся наработки. Скетч индикатора уровня приведён во вложении (для зарегистрированных пользователей). Достаточно распаковать загруженный архив, перейти в папку DUE_3.5_RPi_VU_meter  и открыть файл DUE_3.5_RPi_VU_meter.ino. Библиотека GxTFT-master должна быть предварительно установлена либо через меню Скетч | Подключить библиотеку | Добавить .ZIP библиотеку…, либо путём распаковки в папку Мои документы\Arduino\libraries. После компиляции и заливки скетча в плату Arduino DUE индикатор уровня должен заработать.


 

 

 

 

 

 
Вложение:
gxtft-master.zip 1 Мбскачан 34 раза
Вложение:
bom-vu-meter.xls 31 Кбскачан 8 раз
+6
+1
caleb caleb 1 месяц назад #

Допилить до отображения выбранного входа, уровня выставленной громкости, режима защиты, можно температуры, цены ему не будет.

Точнее даже так, управления выбранным входом, уровнем, защитой, вентиляторами.

+1
Pushok62 Pushok62 1 месяц назад #

Да, можно отображать что угодно, в зависимости от потребностей и фантазии, индикатор и библиотека GxTFT это позволяют :) Тем более, что для Arduino имеется множество разных готовых датчиков и соответствующих библиотек, и всё довольно просто с точки зрения программирования реализуется.

0
caleb caleb 1 месяц назад #

В данном применении его сенсорность я так понимаю не используется ? 

0
Pushok62 Pushok62 1 месяц назад #

Нет, не используется.

0
caleb caleb 17 дней назад #

Статью потом обновите?

0
Pushok62 Pushok62 17 дней назад #

А в связи с чем обновлять статью? Пока ничего нового не появилось. В ближайшее время, когда придут платы, добавлю улучшенный вариант пиковых детекторов, а потом в проекте — доделать сервисный блок для УНЧ.

0
caleb caleb 17 дней назад #

Ну потом естественно.