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

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

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

Комментарии

wwwstas

✩✩✩✩✩✩✩
3 Июл 2020
26
0
В описании написано, что надо брать библиоткеу, которую я модифицировал для большей схожести с серво.
ссылку не дадите на эту библиотеку? как раньше писал, я далеко не профи к сожалению, пытаюсь, учусь)
 

wwwstas

✩✩✩✩✩✩✩
3 Июл 2020
26
0
Люди, подскажите что за трабл. Скетч скомпилировался, загрузился, и как только загрузка закончилась, серва стала крутить без остановки в круговую?? она ведь вроде ток на 180 должна, а тут как моторчик покругу и обороты, судя по звуку, то нарастают то чуть падают. Что может быть? Да, и дисплей в шахматную хаотичную сетку

с дисплеем наверное разобрался - в скетче:
//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
т.е. в работе sh1106 , у меня SSD1306
только честно говоря не знаю как активировать мой тип. Подскажите пожалуйста, из поста на первой странице видел, но незнаю...как я понял 1106 надо закоментить, а раскрыть какой ума не хватает
 
Изменено:

Soni666

✩✩✩✩✩✩✩
30 Ноя 2019
24
4
Харьков
Тот что надо раскоментируй.А те что не надо закоментируй.(в начале строки две косых палочки)))
 

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

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
1) серва физически не должна крутиться на 360 градусов. это может быть другая серва, есть сервоприводы постоянного вращения.

2) Диспелей выбрать один из 2-х нижних, они оба i2c и должны работать, тот что ниже на более быстрой шине
 

wwwstas

✩✩✩✩✩✩✩
3 Июл 2020
26
0
Старик, пробовал из нижних и тот и тот, результат один - куча мелких точек россыпью, че не так делаю?
 

Вложения

wwwstas

✩✩✩✩✩✩✩
3 Июл 2020
26
0
Ссылку на дисплей можно ?

читал в инете про подключение, пишут адрес его надо указывать, в вашем скетче смотрел, чего то не нашел( тежело быть малообразованным) уж прошу прощения что отнимаю время
 

wwwstas

✩✩✩✩✩✩✩
3 Июл 2020
26
0
да #define STEPPER_ON
я в 78 ничего не указывал, нет связи? по комменту вроде как надо указать количество
 

wwwstas

✩✩✩✩✩✩✩
3 Июл 2020
26
0
Ну в таком виде прошивка работает для шагового мотора, а у вас серва. Уберите ее под комментарий
ЗАРАБОТАЛ дисплей. Спасибо огромное

а по светодиодам, в 78 нужно количество прописывать? прошу прощения за глупый вопрос, диоды не горят
 

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

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Нет, там уже вычисляется полное число, менять надо тут:
42 строка
#define max_DrinkCount 5 // Максимальное кол-во рюмок, при подключении на аналоговые пины максимум 6 рюмок при нано
45 строка
#define LEDs_per_Drink 12 // Число светидиодов на рюмку, считается что под рюмкой такое число лампочек
 

wwwstas

✩✩✩✩✩✩✩
3 Июл 2020
26
0
Нет, там уже вычисляется полное число, менять надо тут:
42 строка
#define max_DrinkCount 5 // Максимальное кол-во рюмок, при подключении на аналоговые пины максимум 6 рюмок при нано
45 строка
#define LEDs_per_Drink 12 // Число светидиодов на рюмку, считается что под рюмкой такое число лампочек
тут указал все

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

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

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
1) проверить мультиметром кнопку для начала.
2) посмотреть в мониторе порта , может что то напишет. Например про плеер. Часто путают rx и tx местами.
3) Для проверки самого плееера в библиотеке есть примеры.
4) Концевики могут работать, но если подсветка выключена, то видно не будет. Для проверки можно взять отдельный скетч, для настройки , он есть то ли во 2-ом толи 3 -ем сообщении. Для определения оптопорога.
5) Хотя свет должен работать изначально, но проверить посмотрев переменную: uint8_t Light_ON_OFF = true;

Энкодер подключается к :
const int pin_A = 2; // Подключение вывода A (CLK) энкодера, если перепутать А и Б будет движение в другую сторону.
const int pin_B = 3; // Подключение вывода B (DT) энкодера
const int pin_SW = 4; // Подключение вывода кнопки (SW) энкодера

Адресные светодиоды к 5-му пину.

Концевики к аналоговым входам, исключая А4 и А5 (i2c шина)
 

wwwstas

✩✩✩✩✩✩✩
3 Июл 2020
26
0
1) проверить мультиметром кнопку для начала.
2) посмотреть в мониторе порта , может что то напишет. Например про плеер. Часто путают rx и tx местами.
3) Для проверки самого плееера в библиотеке есть примеры.
4) Концевики могут работать, но если подсветка выключена, то видно не будет. Для проверки можно взять отдельный скетч, для настройки , он есть то ли во 2-ом толи 3 -ем сообщении. Для определения оптопорога.
5) Хотя свет должен работать изначально, но проверить посмотрев переменную: uint8_t Light_ON_OFF = true;

Энкодер подключается к :
const int pin_A = 2; // Подключение вывода A (CLK) энкодера, если перепутать А и Б будет движение в другую сторону.
const int pin_B = 3; // Подключение вывода B (DT) энкодера
const int pin_SW = 4; // Подключение вывода кнопки (SW) энкодера

Адресные светодиоды к 5-му пину.

Концевики к аналоговым входам, исключая А4 и А5 (i2c шина)
кнопку не проверял, проверю мультиметром. rx tx, проверено, все как надо.энкодер так же вс ок.диоды на 5 пин. Вы пишите : "4) Концевики могут работать, но если подсветка выключена, то видно не будет.", а как проверить в скетче, отключена подсветка или нет? по оптопорогу нашел скетч. буду пробовать. Спасибо

переменная так же записана: uint8_t Light_ON_OFF = true;

экодер при прозвоне дает на выход кнопки при нажатии
 

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

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
По умолчанию энкодер должен быть притянут к земеле.
Что можно попробовать: в файле encMinim.h вместо строки pinMode2 (_sw, INPUT); поставить строку pinMode2 (_sw, INPUT_PULLUP);
 

wwwstas

✩✩✩✩✩✩✩
3 Июл 2020
26
0
По умолчанию энкодер должен быть притянут к земеле.
Что можно попробовать: в файле encMinim.h вместо строки pinMode2 (_sw, INPUT); поставить строку pinMode2 (_sw, INPUT_PULLUP);
спасибо, попробую. по энкодеру - я брал землю и вывод кнопки, без нажатия разрыв, при нажатии, на сигнальный приходит минус
 

wwwstas

✩✩✩✩✩✩✩
3 Июл 2020
26
0
какая то проблема с плеером. Запустил пример из библиотеке, как Старик советовал, выдает ошибку соединения:
DFRobot DFPlayer Mini Demo
Initializing DFPlayer ... (May take 3~5 seconds)
Unable to begin:
1.Please recheck the connection!
2.Please insert the SD card!
был еще один плеер (заказывал два сразу) тоже самое. Что может быть с ним, никто не сталкивался с такой проблемой. Пины все проверил сто раз, rx. tx через 1 Ком. на плате плеера еле горить красненький светодиод(
 

wwwstas

✩✩✩✩✩✩✩
3 Июл 2020
26
0
Есть у них такой глюк
Попробуй все включить. Вытащить карту. вставиьт карту. нажать ресет на ардуино.
уже по всякому) и формтировал и файлы по всякому тусил и переименовывал, причем две. Тут в инете гдето видел, что на плате смд резисторы с кондерами перепутаны, уж не знаю, разве может такое быть? плееры заказывал на дуино ру, если что, может брак гонят. Включл вынул вставил карту, перезагрузил, все так же(
 

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

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
В параллельной ветке было такое, что язычок удержания карты замыкался на пин и плеер не работал, человек откусил язычок
 

BARcyk

✩✩✩✩✩✩✩
21 Сен 2020
12
1
какая то проблема с плеером. Запустил пример из библиотеке, как Старик советовал, выдает ошибку соединения:
DFRobot DFPlayer Mini Demo
Initializing DFPlayer ... (May take 3~5 seconds)
Unable to begin:
1.Please recheck the connection!
2.Please insert the SD card!
был еще один плеер (заказывал два сразу) тоже самое. Что может быть с ним, никто не сталкивался с такой проблемой. Пины все проверил сто раз, rx. tx через 1 Ком. на плате плеера еле горить красненький светодиод(
У меня такая же проблема.
Плеера (2шт) рабочие 100% с примерами других библиотек все работает.
без Ардуины тоже все работает.
значит на пин ничего не замыкает так ?
собрал все на макетке, залил скетч все работает кроме звука, тишина .
Кудыть копать ?