Электронная панель - игрушка для детей и опыт для «ардуинщиков» - Своими руками
Своими руками

Электронная панель – игрушка для детей и опыт для «ардуинщиков»

>

Зачастую многие начинающие ардуищники, «загоревшись» идеей освоить данное устройство, покупают набор Ардуино и немного поигравшись не знают, что с ним делать дальше.

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

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

Инструменты и материалы:-Две платы Arduino Uno;-2,8-дюймовый ЖК-экран TFT Arduino;-Модуль поворотного энкодера KY-040 (с ручкой);-Модуль джойстика Arduino;-Два модуля расширения MCP23017 I2C GPIO;-8-битный модуль аналого-цифрового преобразователя PCF8591 8-бит I2C;
-LGB LED модуль Arduino;
-Robotdyne 4-значный 7-сегментный дисплейный модуль;
-Модуль светодиодной матрицы 8×8;
-Модуль клавиатуры 4×4;
-4 тактильные кнопки;-Мембранная буквенно-цифровая клавиатура 4×4;-Индикатор уровня заряда батареи;-4 тумблера;-30 винтов M2x10;-4 винта M3x5;-Перемычки;-Макетная плата или плата расширения Ардуино;-Два литий-ионных аккумулятора 18650 с держателем;-Разъем и штекер постоянного тока 2.1 / 5 DC;-Модуль зарядки 2S BMS;-11 светодиодов диаметром 3 мм, разных цветов;-4 резистора 220R
-Фанера;
-Отвертка;
-Лазерный резак;
Шаг первый: концепция
Приблизительное представление о том, насколько большой должна быть панель для размещения всех компонентов, является необходимым условием.

Первоначальная идея заключалась в том, чтобы смоделировать панель управления по образцу бортовой электроники самолетов: три приборных панели соединены с основным корпусом с помощью винтов M2. Каждая панель будет иметь слоты для компонентов: светодиодная матрица и клавиатура слева, 7-сегментный дисплей и несколько светодиодов в центре вверху, а также ЖК-экран с поворотной ручкой, джойстиком и некоторыми кнопками справа.

Изначально все светодиоды в конструкции – как автономные, так и сегментные / матричные дисплеи – предполагалось подключить через модули расширения GPIO к Arduino. Как оказалось, GPIO в этих устройствах не дают достаточно тока для питания светодиода. Все светодиоды должны быть подключены напрямую к Arduino.

Как видно в правом верхнем углу схемы, в первоначальном дизайне было место для четырех сенсорных кнопок с подсветкой. В центральной приборной панели также есть вырезы для них (четыре маленьких выреза в самом верху). Однако эти модули оказались не очень удобными для пользователя. Кроме того, вырезы были слишком близко друг к другу, чтобы вместить четыре модуля, поэтому мастер их полностью выбросил. В процессе разработки программного обеспечения для Arduino было внесено намного больше изменений, поэтому приведенная здесь диаграмма является лишь иллюстрацией общей концепции этой панели управления.
Электронная панель - игрушка для детей и опыт для «ардуинщиков»Электронная панель - игрушка для детей и опыт для «ардуинщиков»Шаг второй: корпус
Для проектирования корпуса мастер использовал программу FreeCAD Part Design и Sketcher. Корпус состоит из девяти частей:
Передняя панель
Задняя панель
Четыре стенки
Трехкомпонентные панели
В FreeCAD дизайн детали начинается с эскиза. Каждая панель рисуется, если смотреть сверху, со всеми краями, вырезами и отверстиями для винтов / креплений, а затем выдавливается вдоль оси.

После проектирования всех панелей их можно перемещать с помощью операции FreeCAD «Преобразовать», которая позволяет перемещать деталь по каждой оси и вращать ее по мере необходимости. Все сделано в 3D, так что это отличный способ увидеть, как детали будут выглядеть и будут, совмещены друг с другом.

Поскольку детали корпуса будут вырезаны на лазерном резаке, то мастер добавил соединительные детали, но для большей прочности корпус будет так же собран с помощью шурупов.
Электронная панель - игрушка для детей и опыт для «ардуинщиков»Электронная панель - игрушка для детей и опыт для «ардуинщиков»Электронная панель - игрушка для детей и опыт для «ардуинщиков»Электронная панель - игрушка для детей и опыт для «ардуинщиков»Электронная панель - игрушка для детей и опыт для «ардуинщиков»Электронная панель - игрушка для детей и опыт для «ардуинщиков»Резьбовые стойки для крепления крышки к коробке устанавливаются по углам корпуса.
Электронная панель - игрушка для детей и опыт для «ардуинщиков»Электронная панель - игрушка для детей и опыт для «ардуинщиков»Стенки коробки мастер покрывает морилкой.
Электронная панель - игрушка для детей и опыт для «ардуинщиков»Электронная панель - игрушка для детей и опыт для «ардуинщиков»Электронная панель - игрушка для детей и опыт для «ардуинщиков»Чертежи для резки деталей корпуса можно скачать ниже.
kids control panel cutout drawings.svg
Шаг третий: сборка
Теперь, когда корпус готов, можно производить сборку устройства.
Поскольку этот проект сильно зависит от интерфейса I2C, мастер начинает с нее. На Arduino Uno выводы I2C есть как на отдельных выводах, так и на выходах A4 / A5. Мастер предлагает использовать отдельные выводы – P3.1 и P3.2 на схеме. Все устройства I2C также должны быть запитаны, поэтому все четыре линии (SCL, SDA, + 5V и GND) должны быть подключены к коммутационной плате I2C (или макетной плате). Эти линии должны идти как к модулям расширения GPIO ( GPIO_A и GPIO_B для упрощения), так и к модулю ADC.

Оба модуля расширения GPIO должны иметь подключенные контакты сброса и адресации. Сброс – это активный вывод низкого уровня, поэтому он должен быть подключен к + 5В (желательно через резистор). Контакты адреса должны быть настроены так, чтобы оба устройства могли работать на I2C под разными адресами, то есть их можно было отличить друг от друга. Мастер установил адресные контакты на GPIO_A на ноль (все подключены к земле), а на GPIO_B на один (A0 подключен к + 5V, остальные к земле). Эти настройки преобразуются в адреса I2C 0x20 и 0x21 соответственно. Адрес по умолчанию для модуля АЦП – 0x48, поэтому никаких конфликтов здесь не будет.

Контакты A и B поворотного энкодера должны быть подключены к контактам 2 и 3 Arduino Uno.
Светодиодный модуль RGB необходимо подключить к контактам с поддержкой ШИМ (отмечены знаком «~» на плате Arduino). ШИМ позволяет регулировать яркость.

Питание 7-сегментного дисплея, питание светодиодной матрицы и второй Arduino (Arduino B, как указано на схеме; те, которые управляют ЖК-экраном) подключаются через переключатели.

Также есть два рычажных переключателя без фиксации (ВКЛ-ВКЛ). Один используется для включения светодиода уровня заряда батареи, другой подключается к земле и служит для сброса Arduino A.

Специальная четырехцветная светодиодная полоса использует 3-миллиметровые цветные светодиоды, подключенные к отдельным контактам на Arduino через резисторы 220R.
Электронная панель - игрушка для детей и опыт для «ардуинщиков»Электронная панель - игрушка для детей и опыт для «ардуинщиков»Электронная панель - игрушка для детей и опыт для «ардуинщиков»Электронная панель - игрушка для детей и опыт для «ардуинщиков»Электронная панель - игрушка для детей и опыт для «ардуинщиков»Электронная панель - игрушка для детей и опыт для «ардуинщиков»Большинство компонентов приклеены и / или прикручены к передней панели. Как Arduino, так и прочее, связанное с подачей питания (элементы батареи, плата защиты батареи, плата отключения питания), установлены внутри корпуса. Светодиодный модуль RGB также установлен (в данном случае приклеен) внутри, прямо под модулем клавиатуры 4х4. Расстояние между печатной платой клавиатуры и самим светодиодом составляет примерно 2 см, поэтому светодиод RGB освещает всю плату.

Второй Arduino Uno – Arduino B – подключается только к экрану LCD TFT. Обратите внимание, что все восемь линий данных, все контакты интерфейса SPI и + 5V и + 3.3V должны быть подключены.
Электронная панель - игрушка для детей и опыт для «ардуинщиков»Электронная панель - игрушка для детей и опыт для «ардуинщиков»Электронная панель - игрушка для детей и опыт для «ардуинщиков»Электронная панель - игрушка для детей и опыт для «ардуинщиков»Электронная панель - игрушка для детей и опыт для «ардуинщиков»Шаг четвертый: программирование
Учитывая набор используемых компонентов, мастер запланировал следующие возможности панели для Arduino A:
Отображать символы с буквенно-цифровой клавиатуры на 7-сегментном дисплее
Включать светодиоды на матрице 8×8 при нажатии клавиш на клавиатуре 4×4
Отображать некоторые шаблоны с помощью цветной светодиодной полосы
Использование четырех тактильных кнопок для переключения режимов работы джойстика и энкодера:
управлять светодиодной полосой
контролировать цвет светодиода RGB
светодиоды управления на матрице 8х8
Поскольку Arduino B подключается только к ЖК-дисплею TFT, он будет запускать своего рода приложение для рисования.
Здесь очень мало пользовательских аппаратных компонентов, поэтому большая часть программного обеспечения будет обрабатываться библиотеками Arduino. Используемые библиотеки:
Энкодер – для поворотного энкодера
Adafruit MCP23017 – для расширителей GPIO
TM1637 для 7-сегментных и светодиодных матричных модулей
Клавиатура – для всех видов клавиатур (библиотека достаточно универсальна, чтобы правильно работать даже с четырьмя тактильными кнопками, используемыми здесь)
Adafruit PCF8591 – для модуля АЦП
MCUFRIEND_kbv – для управления LCD TFT дисплеем, в том числе сенсорным
Мастер добавил несколько пользовательских оболочек для некоторых из этих библиотек.

Оболочка для светодиодов RGB
Эта оболочка используется для обеспечения высокоуровневого интерфейса для управления светодиодом RGB, включая преобразование декартовых координат XY в значения красный-зеленый-синий.
Электронная панель - игрушка для детей и опыт для «ардуинщиков» Показать / Скрыть текстclass RgbLed
{
private:
/* data */
uint8_t pin_red;
uint8_t pin_green;
uint8_t pin_blue;
protected:
Color color;
void setRGB(void);
uint32_t hsv2rgb(uint16_t hue, float saturation, float value);
public:
RgbLed(uint8_t pin_red, uint8_t pin_green, uint8_t pin_blue);
~RgbLed();
void setColor(rgbled::Color color);
void lighten(uint8_t amount);
void darken(uint8_t amount);
void changeBrightness(int delta);
Color getColor(void);
uint32_t rectToRGB(float x, float y);
};
Во фрагменте кода ниже показано применение функции Arduino atan2. Расчет угла выполняется только при наклоне джойстика в любом направлении (координаты от джойстика плавающие в диапазоне -1..1).
если (abs (x)> 0,1 или abs (y)> 0,1) <br> {
theta = atan2 (y, x) + PI;
}
float ro = sqrt (x * x + y * y);
Функция, отвечающая за преобразование угла в цветовую координату.
auto cval = [](float theta, float ro, float phase, float neg_phase) {<br> float val = sin(0.666 * theta – phase);
if (val < 0)
val = sin(0.666 * theta – neg_phase);
return val;
};
float r = cval(theta, ro, -PI / 2, PI);<br>float g = cval(theta, ro, 0, 3 * PI / 2);
float b = cval(theta, ro, PI / 2, 5 * PI / 2);
Color c = Color(r, g, b);

Отображение оболочки
Оболочка дисплея поддерживает функции, которые преобразуют необработанные символы, полученные с клавиатуры, в необработанные битовые значения, необходимые библиотекам дисплея для фактического отображения символа.
const uint8_t digitToSegment[16] = {<br> //XGFEDCBA
0b00111111, // 0
0b00110000, // 1
0b01011011, // 2

Клавиатура
Все клавиатуры подключаются через GPIO, что исключает использование собственных функций. Перегрузка методов pin_mode (), pin_read () и pin_write () в подклассе позволяет переопределить их поведение, чтобы использовать расширители GPIO, а не собственные функции Arduino, без необходимости изменять какое-либо поведение в родительском классе.
Электронная панель - игрушка для детей и опыт для «ардуинщиков» Показать / Скрыть текстPanelKeypad(Adafruit_MCP23017 *gpio, char *userKeymap, byte *row, byte *col, byte numRows, byte numCols)<br> : Keypad(userKeymap, row, col, numRows, numCols)
{
PanelKeypad::gpio = gpio;
}

void pin_mode(byte pinNum, byte mode);

void pin_write(byte pinNum, boolean level)
{
if (PanelKeypad::gpio != NULL)
{
PanelKeypad::gpio->digitalWrite(pinNum, level);
}
}

int pin_read(byte pinNum)
{
if (PanelKeypad::gpio != NULL)
{
return PanelKeypad::gpio->digitalRead(pinNum);
}
else
{
return -1;
}
}

Оболочка светодиодной полосы
Электронная панель - игрушка для детей и опыт для «ардуинщиков» Показать / Скрыть текстvoid move_bar(int direction)<br>{
// make sure that direction is either 1 or -1
if (direction != 0)
{
direction = direction / abs(direction);
LedBar::leds[led_ptr] = !LedBar::leds[led_ptr];
LedBar::color(led_ptr, LedBar::leds[led_ptr]);
if (direction > 0)
{
++led_ptr %= numColors;
}
else if (direction < 0)
{
if (led_ptr == 0)
led_ptr = numColors;
led_ptr–;
}
}
}

Оболочка джойстика
Этот код переносит все логические операции на джойстик, а также маскирует тот факт, что джойстик подключен к внешнему аналого-цифровому преобразователю.
Электронная панель - игрушка для детей и опыт для «ардуинщиков» Показать / Скрыть текст class Joystick<br> {
public:
Joystick(Adafruit_PCF8591 *adc, uint8_t pinx, uint8_t piny);
Joystick(uint8_t pinx, uint8_t piny);
float getX(bool update_coords = true);
float getY(bool update_coords = true);
bool isTilted(float threshold = TILT_THRESHOLD, bool update_coords = true);
int getDirection(float axis_coords, bool update_coords = true);
protected:
Coordinates coords = {0};
void read();
private:
uint8_t pinx = 0;
uint8_t piny = 0;
Adafruit_PCF8591 *adc = NULL;
float read_pin(uint8_t pin);
};
Модуль джойстика – это, по сути, двухосевой потенциометр. Контакты X и Y модуля джойстика выводят напряжение, масштабированное от GND (0) до VCC (в данном случае + 5 В), где 0 и + 5 В соответствуют максимальному наклону по любой оси. Из-за этого джойстик в нерабочем положении выдает 0,5 * VCC на выводах X и Y.
Метод Joystick :: read () выполняет чтение напряжения с выводов X и Y и преобразует результат в число с плавающей запятой в диапазоне -1..1:
auto convert = [](int value, uint16_t size) {<br> float x = (((float)value / size) – 0.5) * 2;
return x;
};

Эскиз Arduino
Сам скетч Arduino представляет собой обычную инициализацию требуемых объектов с их конфигурацией, выполняемой в функции setup (). Loop непрерывно считывает все входы (клавиатуры, джойстик, кодировщик), обновляет общую переменную, которая содержит положение кодировщика, вычисляет направление его движения и вызывает обработчики экранов, светодиодов и т. д.
Электронная панель - игрушка для детей и опыт для «ардуинщиков» Показать / Скрыть текстif (current_mode == RGB_LED_MODE)<br>{
#ifdef RGB_LED_CONNECTED
rgb_led_handler(joy_sw, delta);
#endif led_bar.move_bar(1);
}
else if (current_mode == LED_BAR_MODE)
{
led_bar.move_bar(delta);
}
else if (current_mode == LED_MATRIX_MODE)
{
led_matrix_handler();
}
else if (current_mode == LCD_MODE)
{
}

Ардуино В
Мастер попытался использовать один Arduino Uno для обработки всех входов / источников света и экрана LCD TFT, но это оказалось довольно сложно, в основном из-за ограниченного количества доступных контактов. Для экрана LCD TFT требуется как 5-проводный интерфейс SPI (сенсорный), так и 8-проводный параллельный интерфейс данных (дисплей). Все эти контакты должны использоваться совместно с другими устройствами ввода.

Arduino В запускает приложение tftpaint, из библиотеки MCUFRIEND_kbv , без изменений. Это базовое приложение для рисования, которое позволяет рисовать точки с использованием нескольких предопределенных цветов.
Скачать для него код можно здесь.
Электронная панель - игрушка для детей и опыт для «ардуинщиков»Электронная панель - игрушка для детей и опыт для «ардуинщиков»Все готово. В будущем мастер планирует модернизировать панель. В частности он планирует обновить ПО и добавить в устройство одну или несколько простых игр на логику, внимательность и реакцию.

SitesReady

Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного. - Альберт Эйнштейн

Follow us

Don't be shy, get in touch. We love meeting interesting people and making new friends.