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

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

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

Комментарии

Théo Jacobina

✩✩✩✩✩✩✩
21 Фев 2020
2
0
62
Кто-нибудь может мне помочь? Что мне нужно сделать для "При прикосновении к датчику ttp223 он должен оставаться включенным все время и выключаться только при удалении от него".
 

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

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Вроде как ttp223 так не может. у 229 получалось сделать, но это по отзывам других. У меня 223 держал только 4-5 секунд состояние
 

Théo Jacobina

✩✩✩✩✩✩✩
21 Фев 2020
2
0
62
Спасибо за быстрый ответ, какое руководство вы тогда используете?
 

MaxPadonak

★✩✩✩✩✩✩
26 Авг 2020
43
17
@Théo Jacobina, Приветствую. У VICLER есть пост по переделке TTP229. А вообще на Али рандомные TTP223 продаются. Я у трёх продавцов заказывал, только у одного датчики держали больше 4-7 секунд. Надо отзывы читать. Могу в личку скинуть продавца от которого нормальные пришли.
 

Вложения

ribik

✩✩✩✩✩✩✩
29 Июн 2021
7
6
подскажите , что нужно изменить ,чтобы заставить шаговый мотор работать в много оборотистом режиме , сделал сильно тяжелую конструкцию носика наливатора , хочу шаговик черз редуктор подключить
 

ribik

✩✩✩✩✩✩✩
29 Июн 2021
7
6
Спасибо , нашел выход из положения , не уверенн , что правильный , увеличил количество шагов на один оборот шд , и уменьшил скорость поворота , вроде получилось , можно ещё вопрос , при переходе в дежурный режим тухнет дисплей и подсветка диодов , когда ставишь рюмку наливатор работает , но при этом экран и подсветка не светиться , так и должно быть ? Или можно както сделать , чтобы диоды включались ?
 

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

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

ribik

✩✩✩✩✩✩✩
29 Июн 2021
7
6
Да , если энкодером то выходит , а от рюмок не зажигает ни дисплей ни диоды
 

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

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

ribik

✩✩✩✩✩✩✩
29 Июн 2021
7
6
в коде нашел такие строки
/* ----------------================= Переменные для меню ================--------------- */
#define COMMON_TIME_OUT 1000 // 1 секунда стандартного таймаута. через RET_TIME_OUT таких таймаутов выход в основное меню, через FULL_TIME таких выключается дисплей и LED
#define RET_TIME_OUT 10
#define FULL_TIME_OUT 60 видимо по истечению последнего таймера происходит переход в спячку , пробовал в одиночном режиме , но там это не проявляеться так как для начала налива необходимо взаимодействовать с энкодером и диоды с дисплеем зажигаються , а в авто режиме механика остаеться рабочая , мотор шагает , помпа наливает , а подсветки нету .изменил FUL_TIME_OUT на 600 перестал уходить в спячку. Собрал пока на макетке и еще не прицепил плеер , может что-то связанно с каналом BUSY ?
 

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

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Надо глянуть будет. Может с логикой где напутал.
А авто режимом надо подумать. Либо не выключать, все, либо например выключить только дисплей. И не включать его до кручения энкодера, а светодиоды включать при срабатывании концевика

Канал BUSY используется только для проверки состояния плеера (вроде)
 

ribik

✩✩✩✩✩✩✩
29 Июн 2021
7
6
собственно как и все столкнулся с плеером , не работает , в сериал выдает
Wrong Stack Error
на ардуновском форуме нашел такое //
Парни, небольшой отчет по MP3 модулям, с которыми я сталкивался лично. В связи с тем что алиэкспресс заполонило множество поделок с чипами , на которых даже нет даташитов , эта информация будет полезна и сбережет кому-то время и нервы. Все рабочие модули с 24 пиновыми чипами, нерабочие с 16 пиновыми

Идеально работают модули на микросхемах:

MH2024K-24SS ( синий светодиод )

AS20HH9190-74 ( синий светодиод )

AS20HH7159-74 ( синий светодиод )

AS20HHB589-74 ( красный светодиод )( слегка фонит усилок, может мне такие попались )

AS20HFJ616-94 ( красный светодиод )(Под вопросом, пока не затестил полностью, вроде работает , но один раз у меня подвис при воспроизведении)

Крайне нерекомендуемые !!!

GD3200B
( работает через одно место , ведет себя очень не стабильно )
MH2024K-16SS ( не работает вообще )

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

ribik

✩✩✩✩✩✩✩
29 Июн 2021
7
6
еще вопросик, не могу найти где поменять начльное направление вращения шд , когда он нюхает где ноль
 

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

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Поменять провода, или порядок номера пинов мотора:
C++:
const int motorPin1 = 6;
const int motorPin2 = 7;
const int motorPin3 = 8;
const int motorPin4 = 9;
Это просто изменит направление вращения в другую сторону
 
  • Лойс +1
Реакции: ribik

Pavel47

✩✩✩✩✩✩✩
8 Янв 2020
15
3
А, схему под этот проэкт где можно посмотреть, в шапке недоступна
 

Латвии Галочки

✩✩✩✩✩✩✩
7 Сен 2021
6
3
@Pavel47, Я вот тоже решил собрать, а схему найти не могу. Есть одна на 20 странице, отрисованная от руки, но там нет обозначений резисторов, конденсаторов и масфета (если он конечно присутствует). Так же нашел несколько схожих схем но без MP3.
 

Vladozzz

✩✩✩✩✩✩✩
28 Сен 2020
4
0
Избыточное цитирование
Собираю на дисплее олед 1.3 вообще прикольно получается.а то 0.96 маловат


Вот такой получился.Сейчас делаю другой с адресными кольцами шаговиком и ttp229.Старик ты лучший!!
Приветствую... Подскажите пожалуйста, а как вы подключали датчик уровня заряда батареи?

И ещё вопрос, объясните мне, пожалуйста, как должна работать микро кнопка с шаговиком? Куда её ставить? Можно ли без неё?
 

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

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
В моем варианте работа от батарей не предусмотрена, но некоторые делали.
Кнопка определяет ноль-положение мотора, это концевик. При включении носик двигается в одну сторону- в строну парковки и останавливается , когда нажимает на кнопку. И далее все отсчеты ведутся от этого положения.
 
  • Лойс +1
Реакции: MaxPadonak

4_KLIN_4

✩✩✩✩✩✩✩
29 Окт 2021
2
0
мужики ссори за банальный вопрос, а общая схема с плеером то есть?
прошивку нашёл, а схему нет(
 

юрий68

✩✩✩✩✩✩✩
11 Июл 2021
5
0
Привет мужики! Подскажите что поменять в скетче чтобы светодиоды по умолчанию не светились а загорались когда ставишь рюмку.
 

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

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Не забивал точные цвета в определения. поэтому править надо код.
Файл: drink_place.ino
Функция: void Place_LED_ON_OFF(uint8_t Nomer, bool L)
Далее есть выбор цвета в зависимости от состояния пина:
case pl_free: -на сколько я помню и есть пустое место. Далее задается цвет
d_color = CHSV(170, 255, 255);
Вот его и надо исправить на нужный