Наливатор с ОЛЕД дисплеем , 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,192
1,281
Москва
@willi, Такие проекты требуют определенных навыков в ПОНИМАНИИ скетчей, не совсем для новичков, т.к. требуют некоторых настроек. Список можно понять исходя из варианта сборки. Но я попробую как то сгруппировать компоненты для облегчения задачи. Если бы была печатная плата, то это сильно бы облегчило сборку устрйства, но я не силен создании плат, все получается как то через одно место.

@Anatolyj, Да, так же как и все наливаторы. Тут я описал настройку/проверку датчиков. Кнопка так же устанавливается, проверяется и подключается. Я свою последнюю 223 куда то сунул и найти не могу, так что полноценно не могу выложить проверку. Но по сути она ни чем не отличается от подключения обычного концевика - при подтяжке к 5в кнопка при замыкании на землю даст низкий уровень сигнала.
 

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

★★★★★★★
14 Авг 2019
4,192
1,281
Москва
Добавил архив с поддержкой библиотеки microLED, памяти освободилось, но для ардуино леонардо все равно не хватит.

Для arduino every остаются ошибки в библиотеке EEPROMex.h и DIO2. От DIO2 достаточно просто избавиться, убрав ее заголовок и вернув стандартные функции digitlaRead вместо digitlaRead2 , digitalWrite вместо digitalWrite2 и pinMode вместо pinMode2
 

Anatolyj

★✩✩✩✩✩✩
30 Янв 2020
134
15
drinks_array[5].Input = A5; но это же пин scl, на нем дисплей висит.
 

Anatolyj

★✩✩✩✩✩✩
30 Янв 2020
134
15
10 - к RX плеера (через резистор 1к)
11 - к ТX плеера (через резистор 1к)
это пины Д 10 и Д 11 или пины, которые указаны на ардуино RX TX
 

Anatolyj

★✩✩✩✩✩✩
30 Янв 2020
134
15
#define RX_MP3_PIN 10
#define TX_MP3_PIN 11
значит здесь надо заменить на 0 и 1
 

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

★★★★★★★
14 Авг 2019
4,192
1,281
Москва
Нет! с пинами 0 и 1 библиотека не работает, в 1-ом сообщении темы есть схема подключения. можно поменять 10 и 11 на любые 2 других цифровых пина для софт сериала, но с хард не будет работать.
 

brabec86

✩✩✩✩✩✩✩
12 Ноя 2019
6
1
концевики с светодиодами подключаются как у гайвера?
 

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

★★★★★★★
14 Авг 2019
4,192
1,281
Москва
Практически так.

Разница в том, что А4 и А5 используются шиной i2C, вместо них можно использовать пины А6 и А7 с подтяжкой их через 10к резистор к 5в. я выше , во втором сообщении описал это.
Светодиоды точно так же, разница в том, что на одно место можно использовать несколько светодиодов. На каждое место должно быть равное кол-во светодиодов.
 

brabec86

✩✩✩✩✩✩✩
12 Ноя 2019
6
1
В режиме калибровки вращая энкодер в право или лево краник крутится только в одну сторону, как исправить?
 

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

★★★★★★★
14 Авг 2019
4,192
1,281
Москва
в меню энкодер работает как полжено в обе стороны ?
Проверил архивы, должно работать нормально. Ошибок не видел.
При вращении на экран должен быть показан угол . Не сразу, а после простоя в пол секунды. Он меняется верно или тоже в одну сторону ?

Функция калибровки - void Pos_conf(), находиться в eeprom_proc.ino

Фрагмент обработки вращения энкодера при калибровке:
      if (enc.isRight())
      {
        enc_pos = min(enc_pos + 1, 180);
      }
      if (enc.isLeft())
      {
        enc_pos = max(enc_pos - 1, 0);
      }
 
Изменено:

brabec86

✩✩✩✩✩✩✩
12 Ноя 2019
6
1
Энкодер в меню работает нормально. При включении зависает меню, серва работает неадекватно ( медленно дергается в сторону парковки) Через какое то время серва резко дергается и вроде как работает все нормально, после выключения, все повторяется. может с библиотеками что то. Сможете скинуть библиотеки?
 

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

★★★★★★★
14 Авг 2019
4,192
1,281
Москва
Библиотека стандартная серво, без изменений.
Если серва медленно двигается, значит что то берет в цикле loop очень много времени.
в конце setup есть пара строк
ServoInit(false);
Servo_St_Work = true;

поменяй
ServoInit(true);

Это значит быстрое перемещение сервы к положению парковки. За 1 раз. Без захода в цикл loop
Посмотри как все работает остальное.

в цикле loop убери комментарий со строки
// ShowFPS();
оставь
ShowFPS();
и посмотри монитор порта, что будет написано. Количество выполнений цикла loop в секунду. должно быть больше 10к точно, в районе 15к
если тормозит, то работать буде плохо , в т.ч. энкодер
Далее отключая по очереди функции из loop можно понять что тормозит. Примерная очередность отключения :

1) MusicTick();
2) time_out_tick();
3) Place_tick();
4) Motors_tick2();
5) ServoTick();

отключение остального скажется на отоборажении на дисплее. Но думаю до этого не дойдет.
 

brabec86

✩✩✩✩✩✩✩
12 Ноя 2019
6
1
проблема была при подключении RX_MP3_PIN 11, отпаял провод от 11 пина ардуино и все заработало. Как теперь наладить тосты?
 
  • Лойс +1
Реакции: Алексей Затеев

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

★★★★★★★
14 Авг 2019
4,192
1,281
Москва
Возможно перепутаны RX и TX мп3 плеера.
Для начала запустите пример из библиотеки DFPlayer, там вся информация выводиться в монитор порта, как только заработает, то и в наливаторе заработает.
На всякий случай спрошу: карточка стоит в плеере ?
Но странно, если инициация плеера проходит криво, он автоматом отключается и все должно работать без звука
 

Anatolyj

★✩✩✩✩✩✩
30 Янв 2020
134
15
Собирается все просто. К микро кнопке (такая же как стоит на ресете ардуино нано) подпаиваются 2 провода, кнопка вставляется в 1-ую деталь, вторая подпирает ее и изолирует от мотора. Носик надевается на вал двигателя. Его надо надежно закрепить так, что бы кнопка зажималась при вращении и он не мешал движению. Сверху носика еще будет достаточно места, что бы на валу закрепить что то.
Я напечатал 3 детали. Я понимаю так, что носик нажимает на микрокнопку и это будет нулевая позиция
 

Soni666

✩✩✩✩✩✩✩
30 Ноя 2019
24
4
Харьков
А как фоновую музыку и тосты добавлять?Пока жду ардуинку решил заморочиться поиском))
 

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

★★★★★★★
14 Авг 2019
4,192
1,281
Москва
У меня достаточно свободно, пластик PET-G, но внутренние размеры порой получаются меньше задуманных, отверстия разные. Я в настройках слайсера я поставил горизонтальное расширение -0.15 , это в ограждениях. На каждом принтере может быт индивидуально
 

Anatolyj

★✩✩✩✩✩✩
30 Янв 2020
134
15
У меня достаточно свободно, пластик PET-G, но внутренние размеры порой получаются меньше задуманных, отверстия разные. Я в настройках слайсера я поставил горизонтальное расширение -0.15 , это в ограждениях. На каждом принтере может быт индивидуально
Я печатаю PET-G и в куре ставлю масштаб 100,5%