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

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

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

Комментарии

Anatolyj

★✩✩✩✩✩✩
30 Янв 2020
134
16
Спасибо! Заработало! А мне надо еще много изучить,
 

Zenit

✩✩✩✩✩✩✩
13 Авг 2020
10
0
А как допилить обратний отщет милилитров при розливе Я не очень силен в коде
Пока все собрал скопировал работает
 

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

★★★★★★★
14 Авг 2019
4,266
1,303
Москва
На примере файла auto_naliv.ino
есть такой код:
// тут модно что то сделать с светодиодами во время налива!
Procent = map(millis(), StartDrinkTime, EndDrinkTime, 0, 100);

Это кол-во налитого в настоящее время, даже вернее процент завершения налива. Далее он используется в подсветке мест. Теоретически его можно использовать для подсчета кол-ва налитого. но не напрямую, т.к. помпа может какое то время работать без налива, пока жижа идет от сосуда к носику.
А дальше самое сложное. переписать соотв. функцию в файле menu_proc.ino для вывода полученного значения. Вот эту функцию
void auto_nenu(byte n)
в ней непосредственно вот эта строка:
DrinkInfo(58, Drink);
отвечает за вывод объема налитого. Самое простое, что приходит в голову : Drink*100/Procent;
но не факт, что Procent видим в menu_proc.ino, и непонятно, что будет при выборе объема налива. Если же при выборе объема писать Procent=100, то это может повлиять на подсветку. Возможно надо будет ввести новую переменную, типа ShowProcent и использовать ее.
 

Zenit

✩✩✩✩✩✩✩
13 Авг 2020
10
0
Спасибо буду експериминтировать

Может не так поняли -))) не подсветка А что б во время налития обем милилитров на дисплее обратний отщет висвечивал ну например виставил 50 мл а во время налива начинало считать 49 48 47 46 итд
 

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

★★★★★★★
14 Авг 2019
4,266
1,303
Москва
Подсветка меняется в зависимости от процента налива. Коммент для себя делал. Но процент выполнения задачи можно снять там
 

Anatolyj

★✩✩✩✩✩✩
30 Янв 2020
134
16
Собрал наливатор танк. Все заработало но энкодер не работает пока до платы энкодера не дотронешся пальцем.
может надо раскоментировать эти строки
//#define ENC_PULLUP // Если так, то кнопки и контакты будут с подтяжкой.
//#define ENC_BUT_PULLUP
да и почему-то после каждого включения на экране появляется надпись калибровка
 

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

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

2) Посмотрю, возможно это как то связано с кнопкой энкодера и 1-ой проблемой.
 

Anatolyj

★✩✩✩✩✩✩
30 Янв 2020
134
16
При калибровке происходит следующее. Ствол упирается в концевик и останавливается. Дальше нажимаю кнопку энкодера и ствол едет к первой позиции. Когда я пытаюсь подогнать к центру позиции (вращаю энкодер) ствол уезжает к второй позиции и так далее. После этого уезжает в ноль и загораются диоды
 

Вложения

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

★★★★★★★
14 Авг 2019
4,266
1,303
Москва
Что то с кнопкой похоже, надо 1) отключить и посмотреть что будет 2) проверить соединение. Получается при касании корпуса как будто кнопка срабатывает
 

Anatolyj

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

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

★★★★★★★
14 Авг 2019
4,266
1,303
Москва
да, при калибровке, если позиции были выставлены правильно, то носик доходит до : сначала парковка , потом все места по порядку, место подсвечивается. Просто кликнув позиция остается, так по всем прокликать
 

Zenit

✩✩✩✩✩✩✩
13 Авг 2020
10
0
Да с 12, сейчас включил, уже не виснит, но почему-то вход А1 не реагирует на концевик, перекидываю на А2 - работает...
Привет у меня точно такая проблема с плеером не мног не понял про 12 пин как решил проблему

переписал пин с 12 на 8, Ардуинку поменял ,меню настройки музики показалось только раз потом тишина делал все как на форуме форматировал флешку итд так и не настроил фоновую музику Может что то посоветуете что в коде подправить
 

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

★★★★★★★
14 Авг 2019
4,266
1,303
Москва
Второй раз настройка музыки будет если только если измениться общее кол-во треков, например добавить или убрать тост
 

Zenit

✩✩✩✩✩✩✩
13 Авг 2020
10
0
спасибо уже поздно завтра попитаюсь отпишусь а где вкоде строки за ето отвечают
 

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

★★★★★★★
14 Авг 2019
4,266
1,303
Москва
где то в начале при вызове плеера проверяется кол-во треков на диске. Функция ChikTrak(). Вызывается из setup , а сама находится в eeprom_proc.ino
 

Zenit

✩✩✩✩✩✩✩
13 Авг 2020
10
0
пришол новий плеер запустилось Вопрос а можно фоновой музики более 4 вайлов ставить, читает все хорошо распознает тости фон ,откалибровал жидкость доволен

Не знаю что помогло, но в свойствах звукового файла удалил ( удаление свойств и личной информации) виндовс 10 Изменил номерацию то есть в папке 01 номера треков 1234 ав папке 02 номера 5678 ,раньше и ето не помогало -))))
 

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

★★★★★★★
14 Авг 2019
4,266
1,303
Москва
Можно. Важна очередь с какой создавались папки. Т.е. сначала надо создать папку 01 а потом 02. Потом спокойно можно докинуть музыки в папку 01 и она должна распознаваться как музыка. У меня во всяком случае распознается.
 

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

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

MaxPadonak

★✩✩✩✩✩✩
26 Авг 2020
50
19
@Anatolyj, В прикреплении видоизмененная библиотека, рассчитана на 5 оборотов шаговика, вроде бы корректно работает по углам.
С этими изменениями :
#define KP 4.36
каждый write на:
stepper1.Write(enc_pos * KP);
еще!
там где получаем позицию башни, а именно читаем положение шаговика, такая конструкция:
stepper1.GetCurrentAngleMath();
пример:
int16_t old_enc_pos = stepper1.GetCurrentAngleMath();
надо привести к углам башни, т.е.
int16_t old_enc_pos = stepper1.GetCurrentAngleMath()/KP;

Это строка
enc_pos = min(enc_pos + 1, 180);
ограничивает вращение башни от 0 до 180 градусов. Ее не трогать. Если надо увеличить угол расстаноки стаканов, то надо 180 заменить на требуемое.


Может быть стоит библиотеку кинуть локально, прям в каталог проекта.
А чисто теоретически, если угол сменить с 180 на 360, то КР можно на 2 поделить ? Или я что то не так посчитал ? Возникла идея одна, у меня просто КР не 4.5 а 12(!)
 

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

★★★★★★★
14 Авг 2019
4,266
1,303
Москва
Нет, нельзя. KP это передаточное число редуктора. Я основывался на том, что сзади может быть какая то преграда и носик не будет делать полный оборот. Где то в коде есть ограничение на 180 градусов. можно его изменить и сделать скажем 340. И тогда угол поворота будет больше. Но передаточное отношение всегда останется одним и тем же. Если надо будет повернуть на 30 градусов носик, то шаговик надо будет крутить на 30*КР, т.е. для вас на 360 градусов. для 300 градусов это будет 3600. Я в библиотеке сделал ограничение на 5 оборотов мотора, т.е. на 1800 градусов выходит. Что бы поменять надо найти там 5 и заменить на .. 20 например. Вроде даже типы данных менять не придется.
Вопрос тогда в другом. не будет ли это оч. медленно ?
 
  • Лойс +1
Реакции: MaxPadonak

MaxPadonak

★✩✩✩✩✩✩
26 Авг 2020
50
19
Нет, нельзя. KP это передаточное число редуктора. Я основывался на том, что сзади может быть какая то преграда и носик не будет делать полный оборот. Где то в коде есть ограничение на 180 градусов. можно его изменить и сделать скажем 340. И тогда угол поворота будет больше. Но передаточное отношение всегда останется одним и тем же. Если надо будет повернуть на 30 градусов носик, то шаговик надо будет крутить на 30*КР, т.е. для вас на 360 градусов. для 300 градусов это будет 3600. Я в библиотеке сделал ограничение на 5 оборотов мотора, т.е. на 1800 градусов выходит. Что бы поменять надо найти там 5 и заменить на .. 20 например. Вроде даже типы данных менять не придется.
Вопрос тогда в другом. не будет ли это оч. медленно ?
Я хочу собрать не совсем обычный наливатор, хочу использовать корпус струйного принтера и родные направляющие. А вместо обычного мотора использовать шаговик, чтобы он знал позиции, а краник примудрить на салазки. Ну и переделать OLED на LCD, слишком мелко на ОЛЕДе.
 

Вложения

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

★★★★★★★
14 Авг 2019
4,266
1,303
Москва
@MaxPadonak, У самого в голове сидит такая мысль о линейном наливаторе. Но пока отложена

Если посмотреть библиотеку дисплея , то там достаточно широкий выбор дисплеев. в т.ч. и графический ЛСД , но как он будет работать (я про скорость) не могу сказать.
 

wolka1

✩✩✩✩✩✩✩
5 Сен 2020
1
0
Добрый день. А где и как можно купить готовый наливатор собранный?