Наливатор с ОЛЕД дисплеем , MP3-плееером, LED подсветкой , шаговиком или сервой.

Наливатор с ОЛЕД дисплеем , MP3-плееером, LED подсветкой , шаговиком или сервой.
ОБЩЕЕ ОПИСАНИЕ.
Наливатор на с дисплеем OLED , MP3 плеером, 3-мя режимами налива , светодиодной подсветкой , рассчитаный на максимум 6 рюмок.

Подробное описание подключения.

Контроллер
Вся конструкция тестировалась на ардуино нано.

nano.jpg

Распределение пинов:

0

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

1

Аппаратный сериал.

2

A энкодера

3

B энкодера

4

Кнопка энкодера

5

Канал управления адресной светодиодной лентой.

9

Канал управление сервоприводом

10

к RX плеера (через резистор 1к)

11

к TX плеера (через резистор 1к)

12

к BUSY плеера

13

Канал управление помпой

A0-A3

A4,А5
SDA, SCL

А6-А7
свободными остаются пины: 6, 7, 8. При смене сервопривода на шаговый двигатель они будут задействованы, а так же будет задействован пин 0 на концевик нулевого положения. 1-ый пин будет давать возможность выводить в монитор порта отладочные сообщения. Данный вид подключения пока реализован частично, рассчитан на микросхему ULN2003APC, которая часто идет в комплекте с шаговым двигателем 28BYJ-48.









Дисплей
Монохромный дисплей с разрешение 128х64
Подключение I2C, (А4 и А5 )
Скетч гарантированно поддержи
вает 2 дисплея: SH1106 1.3 дюйма и SSD1306 . По идее должен поддерживать графический ЖК дисплей 12864. Библиотека поддерживает и другие дисплеи.
1106.jpg1306.png12864.png
Библиотека U8glib.
В проект добавлены руссифицированные шрифты.
Настройка дисплея осуществляется выбором соотв. строки в файле silver_naliv_20.ino, строки 12-16
C++:
// выбор нужного драйвера дисплея
//U8GLIB_SH1106_128X64 Display(U8G_I2C_OPT_NONE);  // I2C / TWI
U8GLIB_SH1106_128X64 Display(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_FAST);  // Dev 0, Fast I2C / TWI
//U8GLIB_SSD1306_128X64 Display(U8G_I2C_OPT_NONE | U8G_I2C_OPT_DEV_0); // I2C / TWI
//U8GLIB_SSD1306_128X64 Display(U8G_I2C_OPT_DEV_0 | U8G_I2C_OPT_NO_ACK | U8G_I2C_OPT_FAST); // Fast I2C / TWI
Распиновка дисплеев в моем случае не совпадает! Будьте внимательны при подключении.

Энкодер.
Для работы используется мини-библиотека encMinim.h, работает без аппаратного прерывания, но вполне надежно. Для управления используется клик кнопкой, повороты вправо и влево, повороты с нажатой кнопкой, а так же удержание кнопки, как отмена.
Опробовано 2 типа энкодеров:
enc2.pngenc1.png
Отличие подключения 1-го от 2-го заключается в подключении +5 в для второго, и некотором отличии в коде.
Изменение в необходимо сделать в файле encMinim.h
Для первого типа:
C++:
 /* pinMode2 (_clk, INPUT);
  pinMode2 (_dt, INPUT);
  pinMode2 (_sw, INPUT);
*/
  pinMode2 (_clk, INPUT_PULLUP);
  pinMode2 (_dt, INPUT_PULLUP);
  pinMode2 (_sw, INPUT_PULLUP);
Для второго типа:
C++:
  pinMode2 (_clk, INPUT);
  pinMode2 (_dt, INPUT);
  pinMode2 (_sw, INPUT);
  /*
  pinMode2 (_clk, INPUT_PULLUP);
  pinMode2 (_dt, INPUT_PULLUP);
  pinMode2 (_sw, INPUT_PULLUP);
  */

MP3 - плеер
В качестве плеера используется DFPlayer , он же MP3-TF-16P
DFPlayer.png
У плеера есть встроенный усилитель, но звук от него довольно тихий. Так же есть возможность вывести часть управления на внешние кнопки миную контроллер, но я не увидел в этом необходимости.
Подключение питания к 5 вольтам.
Подключение к ардуино по 3-м (!) проводам. RX , TX и BUSY. Два первых провода передают и получают данные к/от ардуино по программному serual- порту, такие как : запуск и остановка треков, изменение громкости, получение кол-ва треков на мини-сд-карте. Эти провода надо подключать через резистор номиналом 1-2 килоОма. Третий провод предназначен для получения информации о состоянии плеера: идет воспроизведение или нет. В принципе такую информацию можно получить через команду по Serial, но это может подвешивать работу всего устройства, в то время как чтение порта практически ни на что не влияет.
Структура карты:
На карте должно быть 2 подкаталога "01" и "02". Каталог "01" содержит музыкальные треки для фоновой мелодии, а "02" содержит тосты для воспроизведения налива. В принципе названия могут быть любыми, главное что бы каталог с музыкальными фрагментами для фоновой мелодии были в начале по алфавиту. При изменении кол-ва музыкальных треков на карте при включении наливатора будет запущена конфигурационная процедура настройки, в которой следует указать кол-во мелодий для фона, все остальные скетч будет считать тостами.

ВАЖНО! Папка с музыкой должна копироваться или создаваться на карте 1-ой! Именно треки в 1-ой созданной папке будут считаться музыкой.
В отдельном посте опубликую ссылки на свои мелодии и тосты, с текстовыми описаниями. Попробуем сделать обмен тостами.
Библиотека для плеера

Подсветка мест для налива
Для подсветки мест используется адресная светодиодная лента и библиотека FastLED
LED.png
Можно использовать как 1 отдельный светодиод на место, так и вот такие кольца, а так же огрызки ленты по несколько светодиодов.
Ограничение одно - на всех местах для налива должно быть одинаковое число светодиодов.
Файл silver_naliv_20.ino
Общее число светодиодов рассчитывается как число светодиодов на 1 место помноженное на число мест.
В данном примере используется по 1-му светодиоду на место.
C++:
#define NUM_LEDS  LEDs_per_Drink*max_DrinkCount // Кол-во диодов (количество светодиодов на рюмку умножить на число рюмок, математика, 3-ий класс
Строки 42-45
C++:
#define max_DrinkCount 5               // Максимальное кол-во рюмок, при подключении на аналоговые пины максимум 6 рюмок при нано
#define LEDs_per_Drink 1               // Число светидиодов на рюмку, считается что под рюмкой такое число лампочек
Номер 1-го светодиода для каждого мест настраивается отдельно в файле drink_place.ino
C++:
// номер 1-го светодиода для каждой рюмки.  Могут быть не по порядку
  drinks_array[0].N_LED = 32768; // это место парковки и оно не подсвечивается !
  drinks_array[1].N_LED = 0;
  drinks_array[2].N_LED = 1;
  drinks_array[3].N_LED = 2;
  drinks_array[4].N_LED = 3;
  drinks_array[5].N_LED = 4;
В данном примере используется по 12 светодиодов на место.
C++:
#define max_DrinkCount 5               // Максимальное кол-во рюмок, при подключении на аналоговые пины максимум 6 рюмок при нано
#define LEDs_per_Drink 12               // Число светидиодов на рюмку, считается что под рюмкой такое число лампочек
C++:
// номер 1-го светодиода для каждой рюмки.  Могут быть не по порядку
  drinks_array[0].N_LED = 32768;
  drinks_array[1].N_LED = 0;
  drinks_array[2].N_LED = 12;
  drinks_array[3].N_LED = 24;
  drinks_array[4].N_LED = 36;
  drinks_array[5].N_LED = 48;

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

Дополнительные библиотеки
DIO2 - для более быстрого доступа к цифровым пинам.
EEPROMex - расширенное управление чтением и записью в EEPROM

Подключение шагового двигателя.
Для подключения шагового двигателя я предлагаю такой вариант:
входы 6 7 8 9 подключаются к in1 in2 in3 in4 платы с микросхемой ULN2003A.
на моторе.png
stepper.jpg
Собирается все просто. К микро кнопке (такая же как стоит на ресете ардуино нано) подпаиваются 2 провода, кнопка вставляется в 1-ую деталь, вторая подпирает ее и изолирует от мотора. Носик надевается на вал двигателя. Его надо надежно закрепить так, что бы кнопка зажималась при вращении и он не мешал движению. Сверху носика еще будет достаточно места, что бы на валу закрепить что то.
на мотор.png крышка.png носик.png
Ссылка на STL
Рыская на просторах Али нашел такое описание данного двигателя. шаг получается 5,625/64, т.е. 4096 шагов на оборот. В скетче изначально использовалось почему то 4076 шагов на оборот (не мое, брал из скетча). Число надо изменить на верное! Думаю сделать это каждый может самостоятельно.
step.png

Варианты корпусов:

Описание сборки мной на макетке, спустя некоторое время
 
Изменено:

Комментарии

LVit

★✩✩✩✩✩✩
2 Окт 2020
18
11
@Anatolyj, Только что я бился с этой проблемой. Помпа у меня производительная оказалась, питается 12 в от повышайки. Сразу отрубалась защитой ТР 4056. Решилось уменьшением напряжения питания помпы повышайкой, тактико строевым методом, пока перестанет срабатывать защита. Сейчас помпа работает от 10 В.
 

Anatolyj

★✩✩✩✩✩✩
30 Янв 2020
134
16
У меня помпа 5 вольтовая. Я просто поставил модуль заряда без защиты
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,267
1,303
Москва
Обновление. Продолжил неторопливую сборку
 

Anatolyj

★✩✩✩✩✩✩
30 Янв 2020
134
16
Не долго поработал наливатор. Насос не закачивает жидкость. Крутит в холостую. Вскрыл мембрана целая.
 

Anatolyj

★✩✩✩✩✩✩
30 Янв 2020
134
16
Всасывал. А потом перестал. Заказал новую. Есть 2 штуки, но они погружные. Мотор крутит.
 

Anatolyj

★✩✩✩✩✩✩
30 Янв 2020
134
16
Это кнопка R1 10 k на +. Но на плате даже контакты медные. Надо ставить резистор или программно подтянуть pinMode2 (_sw, INPUT_PULLUP);
 

Anatolyj

★✩✩✩✩✩✩
30 Янв 2020
134
16
У модулей энкодеров тактовые выходы и кнопка подтянуты к питанию, у круглого модуля также стоят RC цепи для аппаратного подавления дребезга контактов, а у KY-40 (прямоугольный) распаяна только подтяжка, а RC цепи для аппаратного подавления дребезга контактов отсутствуют. Значит это энкодер можно включать без питания.
 

Spectrum16

✩✩✩✩✩✩✩
22 Мар 2019
18
0
Старик,спасибо вам! Найден баг...в вашем скетче в новом и в старом по умолчанию стоит 5 рюмок и количество светодиодов на одну рюмку БОЛЬШЕ ОДНОГО....когда ставишь меньше пяти рюмок, то энкодер начинает работать только в одну сторону, скажем так, всегда вверх....Икогда ставишь один диод на одну рюмку, то работает через один.Проверьте пожалуйста, может это я уже что то наделал?
 

Spectrum16

✩✩✩✩✩✩✩
22 Мар 2019
18
0
Не знаю...я перекачал архив... Ничего не трогал...выставил 4 рюмки по 1диоду...Энкодер работает только в одну сторону, а диоды работают через один...дринк-плэйс.ино не трогал! А когда выставляет 5рюмок на два диода, то работает исправно. Как так? Видео прислать?
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,267
1,303
Москва
В drink_place.ino настраиваются номера диодов для каждого места.

Вот так должно быть для 4-х диолов.:
void Init_places()
{
  // Начальные углы для позиций
  // 0, 40, 75, 105, 140}
  drinks_array[0].Position = 0;  // паркинг
  drinks_array[1].Position = 53;
  drinks_array[2].Position = 69;
  drinks_array[3].Position = 84;
  drinks_array[4].Position = 101;
  //drinks_array[5].Position = 117;

  LoadEEPROM_POS();

  // Аналоговые пины для каждой рюмки
  //Обозначаем подключенные оптопары по выводам.
  drinks_array[0].Input = 255;  // нет такого
  drinks_array[1].Input = A0;
  drinks_array[2].Input = A1;
  drinks_array[3].Input = A2;
  drinks_array[4].Input = A3;
  //drinks_array[5].Input = A6;

  // номер 1-го светодиода для каждой рюмки.  Могут быть не по порядку
  drinks_array[0].N_LED = 32768;
  drinks_array[1].N_LED = 0;
  drinks_array[2].N_LED = 1;
  drinks_array[3].N_LED = 2;
  drinks_array[4].N_LED = 3;
  //drinks_array[5].N_LED = 4;
 

Anatolyj

★✩✩✩✩✩✩
30 Янв 2020
134
16
Пришла новая помпа. Ставлю 50 мл. Наливает 25 мл. Только в одном месте править время налива:
#define min_Drink_delay 300 // Калибровка за сколько наливается min_Drink EEPROM
#define max_Drink_delay 6000 // Калибровка за сколько наливается max_Drink EEPROM
 

Anatolyj

★✩✩✩✩✩✩
30 Янв 2020
134
16
Извиняюсь! Проверил шланг перегнулся. Поправил нормально стало.
Подключил плеер. Включил наливатор и сразу треск в динамике. Зашел в меню включил тосты и фоновую музыку и все зависает.
 

Spectrum16

✩✩✩✩✩✩✩
22 Мар 2019
18
0
Старик Похабыч
Наконец то я разобрался с диодами, но вопрос с энкодером остался в силе.... Ну не может же так быть, правда? Когда стоит 5 рюмок, то работает правильно в обе стороны, а когда 4 рюмки, работает всегда "вверх" в какю сторону не вращай.... Менял строчки ниже... Ничего не помогает. Идеи какие нибудь есть?
#define ENCODER_TYPE 2 // если пропуски, то поменять на 1 или 2
#define ENCODER_REV 1 // тут можно исправить направление крутилки энкодера
//#define ENC_PULLUP // Если так, то кнопки и контакты будут с подтяжкой.
 

Anatolyj

★✩✩✩✩✩✩
30 Янв 2020
134
16
Энкодер промывал? У меня были проблемы с ним. Опустил в спирт на 1 час, просушил и все. И еще прямоугольная плата на кнопке у меня не было резистора.
 

Spectrum16

✩✩✩✩✩✩✩
22 Мар 2019
18
0
Anatolyj
Я бы конечно промыл, если б он всегда тупил, но тупит именно тогда, когда выставляешь меньше 5 рюмок, это же какой то абсурд, но факт! А еще на моем энкодере все пины подтянуты.
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,267
1,303
Москва
я не могу понять что с энкодером. Погу предположить, что где то не сделаны еще какие то настройки, и тогда , когда выбрано 5 рюмок все работает, а когда меньше что то пишется в массивы под 5-ую рюмку и соотв. трет показания энкодера.

По треску: Как подключен громкоговоритель ?

Если подключить 1 динамик к sp- и sp+, то трещать должно меньше.
 

Anatolyj

★✩✩✩✩✩✩
30 Янв 2020
134
16
Динамик через усилитель.Но почему все зависает? И еще интересно после выключения питания в настройках плеер отключен
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,267
1,303
Москва
Настройки сохраняются если выйти из меню длинным нажатием, когда курсор не на промывке. Если выход по таймауту, то изменения до выключения питания.

Зависание не знаю почему.Что можно попробовать по быстрому: Выключить, вытащить карту, удалить один тост, посмотреть сколько треков музыки, сколько треков тостов, запомнить. Вставить карту и включиться. Должно выбраться меню настройки тостов/музыки. Проверить как оно.

Попробовать динамик без усилителя.