Наливатор с ОЛЕД дисплеем , 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

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

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

Комментарии

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

★★★★★★★
14 Авг 2019
4,266
1,303
Москва
1106 второй версии, я с таким не пробовал. Есть еще 1 вариант объявления такого дисплея
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NO_ACK); // Display which does not send ACK
по второму посмотрю еще

ЗЫ.
Вот возможные варианты для 1306
C++:
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);    // I2C / TWI
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_NO_ACK|U8G_I2C_OPT_FAST);    // Fast I2C / TWI
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NO_ACK);    // Display which does not send AC
 
Изменено:

Anatolyj

★✩✩✩✩✩✩
30 Янв 2020
134
16
1106 второй версии, я с таким не пробовал. Есть еще 1 вариант объявления такого дисплея
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NO_ACK); // Display which does not send ACK
по второму посмотрю еще

ЗЫ.
Вот возможные варианты для 1306
C++:
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);    // I2C / TWI
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_NO_ACK|U8G_I2C_OPT_FAST);    // Fast I2C / TWI
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NO_ACK);    // Display which does not send AC
если сделать так
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NO_ACK); // Display which does not send ACK то при компиляции ошибка Display.firstPage();

Если открыть пример U8gLogo, в нем раскоментировать:
U8GLIB_SH1106_128X64 Display(U8G_I2C_OPT_DEV_0 | U8G_I2C_OPT_FAST); // Dev 0, Fast I2C / TWI
то экран показывает логотип
 

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

★★★★★★★
14 Авг 2019
4,266
1,303
Москва
Если открыть пример U8gLogo, в нем раскоментировать:
U8GLIB_SH1106_128X64 Display(U8G_I2C_OPT_DEV_0 | U8G_I2C_OPT_FAST); // Dev 0, Fast I2C / TWI
то экран показывает логотип
Значит работать надо с этим вариантом

если сделать так
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NO_ACK); // Display which does not send ACK то при компиляции ошибка Display.firstPage();
Вот так будет вернее
8GLIB_SH1106_128X64 Display(U8G_I2C_OPT_NO_ACK);
 

Anatolyj

★✩✩✩✩✩✩
30 Янв 2020
134
16
Вот так будет вернее
8GLIB_SH1106_128X64 Display(U8G_I2C_OPT_NO_ACK);
тогда вылезает ошибка компиляции
C:\Users\Анатолий\Desktop\silver_naliv_20_step\silver_naliv_20\menu_proc.ino:204:5: note: suggested alternative: 'DisplOFF'
C:\Users\Анатолий\Desktop\silver_naliv_20_step\silver_naliv_20\menu_proc.ino: In function 'void Show_pos(uint8_t, uint8_t)':
menu_proc:233:3: error: 'Display' was not declared in this scope
C:\Users\Анатолий\Desktop\silver_naliv_20_step\silver_naliv_20\menu_proc.ino:233:3: note: suggested alternative: 'DisplOFF'
 

pahan_set2005

✩✩✩✩✩✩✩
7 Май 2020
10
0
Простите если повторюсь вопросом... Собрал наливатор, не работает фоновая музыка. В меня даже не включается, а тосты работают, только иногда вместо тоста начинает воспроизводится фоновая музыка. Копировал папки с фоном и тостами по инструкции, то есть 01 папку первой копировал на флэшку.
 

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

★★★★★★★
14 Авг 2019
4,266
1,303
Москва
Надо попробовать временно удалить 1 тост с карты и так запустить наливатор. Должно появиться меню выбора фоновых треков, при кол-ве фоновой музыки больше 0 активируется громкость фоновой музыки.
 

pahan_set2005

✩✩✩✩✩✩✩
7 Май 2020
10
0
Надо попробовать временно удалить 1 тост с карты и так запустить наливатор. Должно появиться меню выбора фоновых треков, при кол-ве фоновой музыки больше 0 активируется громкость фоновой музыки.
Удалил один тост, при включении появилось меню выбора фоновых треков, в настройках музыка включилась и вроде всё заработало, теперь после первого налива произносит тост, затем включается музыка и всё зависает, музыка продолжает петь...
 

pahan_set2005

✩✩✩✩✩✩✩
7 Май 2020
10
0

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

★★★★★★★
14 Авг 2019
4,266
1,303
Москва
Ну тут только проверить отдельно А1, на правилность работы. Можно посмотреть 2-ой пост. там есть скетч для проверки концевиков или любых других датчиков подключенных к пинам А0-А3, А6,А7
 

pahan_set2005

✩✩✩✩✩✩✩
7 Май 2020
10
0
Ну тут только проверить отдельно А1, на правилность работы. Можно посмотреть 2-ой пост. там есть скетч для проверки концевиков или любых других датчиков подключенных к пинам А0-А3, А6,А7
Проверил, вход А1 всегда 0 был, поменял китайскую ардуину, А6 и А7 подтянул резистором, теперь нормально показывает оптопорог по всем.
Дальше подключил светодиодную ленту ws2812b, указал в скетче 1 диод на рюмку. У меня только первый диод зажигается, остальные молчат. Если указать 5 светодиодов на место, то они все к одному месту привязаны. Ленту ещё не нарезал, проверяю на столе, 5 пин подключил к Din ленты.

Проверил, вход А1 всегда 0 был, поменял китайскую ардуину, А6 и А7 подтянул резистором, теперь нормально показывает оптопорог по всем.
Дальше подключил светодиодную ленту ws2812b, указал в скетче 1 диод на рюмку. У меня только первый диод зажигается, остальные молчат. Если указать 5 светодиодов на место, то они все к одному месту привязаны. Ленту ещё не нарезал, проверяю на столе, 5 пин подключил к Din ленты.
Забыл поменять N_LED в drink_place. Прошу прощения 😁
 

Хирург

✩✩✩✩✩✩✩
17 Мар 2020
12
7
При касании проводочков энкодера или самого энкодера, пропадает меню на дисплее, и переключается в Милилитры
 

qbaddev

✩✩✩✩✩✩✩
23 Апр 2020
54
8
23
[email protected]
t.me
@Anatolyj, Нет, прошивка бесплатная, хотя и делал я ее для продажи, но т.к. заказчик самоустранился, я выложу ее в открытый доступ после написания инструкции на условиях некоммерческого использования. Т.е. продажа наливаторв в массовом виде, под заказ, будет запрещена. Для себя, в подарок родственникам и друзьям (на по 255 штук за месяц) разрешена.
До написания инструкции выкладывать не хочу, что бы избежать лишних вопросов.
И всеровно тебя никто не послушает)
 

Anatolyj

★✩✩✩✩✩✩
30 Янв 2020
134
16
Хочу вместо ttp 229 поставить концевики. У меня концевики с 3 мя контактами. Как их подключать как нормально замкнутые или нормально разомкнутые
 

pahan_set2005

✩✩✩✩✩✩✩
7 Май 2020
10
0
При включении наливатора, сразу толкает помпу кратковременно, подключена помпа и серво через драйвер. Ещё повесил латунную трубку - теперь дёргается постоянно, нет плавного движения носика.
 

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

★★★★★★★
14 Авг 2019
4,266
1,303
Москва
Посмотреть как работает подключение. Что на пинах. у меня такого не было
Плавность движения достигается задержками между движением и паузой. Сейчас не могу осмотреть, но там есть настройки . Время движения серы должно быть минимально достаточным для выполнения одного шага - 22,23,24 мс обычно. Паузу между шагами можно сделать минимальной. 1-2-3мс.
Самая плавность достигается шаговым двигателем. И тишина...
 

pahan_set2005

✩✩✩✩✩✩✩
7 Май 2020
10
0
Посмотреть как работает подключение. Что на пинах. у меня такого не было
Плавность движения достигается задержками между движением и паузой. Сейчас не могу осмотреть, но там есть настройки . Время движения серы должно быть минимально достаточным для выполнения одного шага - 22,23,24 мс обычно. Паузу между шагами можно сделать минимальной. 1-2-3мс.
Самая плавность достигается шаговым двигателем. И тишина...
А может быть из-за того, что я на помпу конденсатор не повесил?
 
Изменено:

pahan_set2005

✩✩✩✩✩✩✩
7 Май 2020
10
0
Скиньте пожалуйста библиотеку servo.h у кого не дёргается серво, я уже со всеми значениями step time и servo delay поиграл и ничего не помогает, дёргает её даже с пластмассовой трубкой, и серво уже три штуки сменил...
 

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

★★★★★★★
14 Авг 2019
4,266
1,303
Москва
Даже если так ?
C++:
#define STEP_TIME 0                      // свободное время между дрыгами сервы, чем больше время, тем проше играть энкодером во время движения, но и серва будет работать медленне
#define SERVO_DELAY 23                      // время необходимое серве для завершения 1-го шага движения.
При установке начальных углов тоже дергается ?
 

pahan_set2005

✩✩✩✩✩✩✩
7 Май 2020
10
0
Даже если так ?
C++:
#define STEP_TIME 0                      // свободное время между дрыгами сервы, чем больше время, тем проше играть энкодером во время движения, но и серва будет работать медленне
#define SERVO_DELAY 23                      // время необходимое серве для завершения 1-го шага движения.
При установке начальных углов тоже дергается ?
При установке начальных углов работает без дерганья.