Кинетический макет оборудования для производства ликера. Задачи и их решение
Ожидает приглашения
Этим летом 2013 года в нашу Макетную мастерскую «МАКЕТ-онлайн» пришел заказ на изготовление не совсем типичного макета для специализированной выставки. Задача стояла следующая: изготовить макет оборудования для производства ликера «Ягермейстер» и показать все этапы изготовления ликера наглядно: с движением, с жидкостями, с электронными приборами контроля качества. В течение всего дня работы на выставке макет должен был каждую минуту выдавать бутылочку готового ликера для посетителей выставки.
Около месяца понадобилось команде наших дизайнеров и разработчиков, чтобы смоделировать внешний вид элементов макета, продумать работу всех его механизмов, подготовить чертежи для сборки деталей макета.

Еще месяц понадобился на изготовление деталей и сборку установки.
Размер макета был утвержден: 3 метра на 1,5 м. Глубина 70 см. Во время производства макета были внесены дополнительные корректировки со стороны Заказчика, убрали переливания жидкостей. Упростили саму установку.
В конечном итоге в макете решено было показть 8 блоков установки:
1- шесть прозрачных емкостей, наполненных ингредиентами и несколько мешков с надписью SECRET HERBS
2- блок мацерации, где перемешиваются перемолотые ингредиенты со спиртом
3- пресс, где отжимается полученный настой трав, корений и специй
4- система фильтров (не менее 3-х фильтров)
5- большая бочка для 12 месячной выдержки ликера
6- блок контроля качества (не менее 3-х приборов)
7- барабаны для наполнения бутылочек (два барабана, крутящихся в противоположные стороны)
8- блок выдачи бутылочек с готовым ликером (выдача одной бутылочки осуществляется 1 раз минуту)
В макете нами были предусмотрены 2 режима работы:
1. последовательное включение всех механизмов, начиная с первого, в течение одной минуты, выход готовой бутылочки, снова включение первого и т.д.
2. Одновременная работа всех механизмов. Кроме выгрузки готовых бутылочек – включается один раз в минуту.
Контролеры выполнены на базе процессора ATmega16. На борту платы имеется интерфейс RS-485, позволяющий выполнять неограниченные расширения, а также осуществлять передачу данных и управление с ПК. Для написания программ использовали язык C, который позволяет ускорить процесс разработки и отладки.
Каркас макета было сделан сварным для прочности и устойчивости. Изнутри каркас был выстлан листами ДСП цвета Венго. У макета сделали фальш-стенку, за которой спрятали провода.


Осуществить выгрузку одной бутылочки раз в минуту смогли с помощью ленточного конвейера рольганга, изготовленного самостоятельно в условиях мастерской.
Для управления макетами наш микроэлектронщик специально разработал универсальную плату на базе микроконтроллера ATmega32A-SU. Плата имеет 32 конфигурируемых входа/выхода, к которым можно подключить соответствующее число датчиков/исполнительных устройств. На борту платы имеется интерфейс RS485, что позволяет строить сеть из данных плат, тем самым позволяя практически неограниченно увеличивть число входов/выходов. Также это позволяет подключать систему к ПК для управления с него и/или сбора информации от системы.
Другие отличительные особенности платы:
— возможность отладки по интерфейсу JTAG;
— программирование по интерфейсу ISP;
— питание от 2.7 до 24V (в зависимости от типа реле, устанавливаемых на выходах, если они необходимы);
— в состав Atmega32 входят таймеры – счётчики, аналоговый компаратор, АЦП, TWI, имеются различные режимы понижения энергопотребления.
Макет после сборки на выставке. Очередь за бутылочками

Алгоритм работы
///////////////////////////////////////////////////////////////////////////////////////////////////////
ISR(TIMER0_COMP_vect)
{
t++;
if ((PINC & 0b00000001) != 0) // Истина при 1, т.е. вывод не на земле, ПОШАГОВЫЙ РЕЖИМ РАБОТЫ
{
if (t <= 36) PORTA = 0b00000001; // 0+9=9 мешалка
else if (t <= 60) PORTA = 0b00000010; // 9+6=15 поршень вниз, фильтры
else if (t <= 84) PORTA = 0b00000100; // 15+6=21 поршень вверх, шестерёнки
else if (t <= 85) PORTA = 0b00001000; // 21+0.25=21.25 Сдвигаем ЧАСЫ с концевика
else if (t <= 120) {if ((PINC & 0b00000010) != 0) // 21.25+8.75=30 Пока не вышло время и на концевике HIGH
PORTA = 0b1000; // ЧАСЫ идут.
else PORTA = 0;} // а инначе — встают.
else if (t <= 156) PORTA = 0b00010000; // 30+9=39 контроль качества
else if (t <= 192) PORTA = 0b00100000; // 39+9=48 барабан_1
else if (t <= 228) PORTA = 0b01000000; // 48+9=57 барабан_2
else if (t <= 229) PORTA = 0b10000000; // 57+0.25=57.25 Сдвигаем КОНВЕЙЕР с концевика
else if (t <= 255) {if ((PINC & 0b10000000) != 0) PORTA = 0b10000000; // 57.25+6.5=63.75 Пока не вышло время и на концевике HIGH, КОНВЕЙЕР ползёт.
else {PORTA = 0; t = 0;} } // а иначе — встаёт, и начинается новый цикл.
}
else // ОДНОВРЕМЕННЫЙ РЕЖИМ РАБОТЫ
{
if (t <= 24) PORTA = 0b01111011; // 0+6=6 поршень вниз…
else if (t <= 48) PORTA = 0b01111101; // 6+6=12 поршень вверх…
else if (t <= 72) PORTA = 0b01111011; // 12+6=
18 поршень вниз…
else if (t <= 96) PORTA = 0b01111101; // 18+6=24 поршень вверх…
else if (t <= 120) PORTA = 0b01111011; // 24+6=30 поршень вниз…
else if (t <= 144) PORTA = 0b01111101; // 30+6=36 поршень вверх…
else if (t <= 168) PORTA = 0b01111011; // 36+6=42 поршень вниз…
else if (t <= 192) PORTA = 0b01111101; // 42+6=48 поршень вверх…
else if (t <= 216) PORTA = 0b01111011; // 48+6=54 поршень вниз…
else if (t <= 240) PORTA = 0b01111101; // 54+6=60 поршень вверх…
else if (t <= 241) PORTA = 0b10000000; // 60+0.25=60.25 Сдвигаем КОНВЕЙЕР с концевика
else if (t <= 255) {if ((PINC & 0b10000000) != 0) PORTA = 0b10000000; // 60.25+3.5=63.75 Пока не вышло время и на концевике HIGH, КОНВЕЙЕР ползёт.
else {PORTA = 0; t = 0;}} // а иначе — встаёт, и начинается новый цикл.
}
}
int main (void)
{
// НАСТРОЙКА портов
DDRA = 0b11111111; // Выходы
PORTA = 0b00000000; // 0 на выходах
DDRB = 0b00000000; // Входы
PORTB = 0b11111111; // с подтяжкой.
DDRC = 0b00000000; // Входы,
PORTC = 0b11111111; // с подтяжкой
DDR
D = 0b00000000; // Входы.
PORTD = 0b11111111; // С подтяжкой
// Настройка T/C0 — 8bit может считать внешние соббытия T0(PB0), выдавать ШИМ OC0(PB3)
TCCR0 = 0b00001101;
// |||| — 111 предделитель CLKi/o /1024 = 1000000/1024 = 976.5625; 1.024ms
// | — 1 сброс при совпадении с OCR0
TIMSK = 0b00000010;
// || — 1 прерывание по переполнению
// | — 1 прерывание по совпадению с OCR0
OCR0 = 243; // fOCn = 976.5625/(1+243) = 4.00230532786885; T=249.856ms ~=0.25s
sei(); // Общее разрешение прерываний.
///////////////////////////////////////////////////////////////////////////////////////////////////////
while (1);
} // main
Благодарю за внимание!
Около месяца понадобилось команде наших дизайнеров и разработчиков, чтобы смоделировать внешний вид элементов макета, продумать работу всех его механизмов, подготовить чертежи для сборки деталей макета.

Еще месяц понадобился на изготовление деталей и сборку установки.
Размер макета был утвержден: 3 метра на 1,5 м. Глубина 70 см. Во время производства макета были внесены дополнительные корректировки со стороны Заказчика, убрали переливания жидкостей. Упростили саму установку.
В конечном итоге в макете решено было показть 8 блоков установки:
1- шесть прозрачных емкостей, наполненных ингредиентами и несколько мешков с надписью SECRET HERBS
2- блок мацерации, где перемешиваются перемолотые ингредиенты со спиртом
3- пресс, где отжимается полученный настой трав, корений и специй
4- система фильтров (не менее 3-х фильтров)
5- большая бочка для 12 месячной выдержки ликера
6- блок контроля качества (не менее 3-х приборов)
7- барабаны для наполнения бутылочек (два барабана, крутящихся в противоположные стороны)
8- блок выдачи бутылочек с готовым ликером (выдача одной бутылочки осуществляется 1 раз минуту)
В макете нами были предусмотрены 2 режима работы:
1. последовательное включение всех механизмов, начиная с первого, в течение одной минуты, выход готовой бутылочки, снова включение первого и т.д.
2. Одновременная работа всех механизмов. Кроме выгрузки готовых бутылочек – включается один раз в минуту.
Контролеры выполнены на базе процессора ATmega16. На борту платы имеется интерфейс RS-485, позволяющий выполнять неограниченные расширения, а также осуществлять передачу данных и управление с ПК. Для написания программ использовали язык C, который позволяет ускорить процесс разработки и отладки.
Каркас макета было сделан сварным для прочности и устойчивости. Изнутри каркас был выстлан листами ДСП цвета Венго. У макета сделали фальш-стенку, за которой спрятали провода.


Осуществить выгрузку одной бутылочки раз в минуту смогли с помощью ленточного конвейера рольганга, изготовленного самостоятельно в условиях мастерской.
Для управления макетами наш микроэлектронщик специально разработал универсальную плату на базе микроконтроллера ATmega32A-SU. Плата имеет 32 конфигурируемых входа/выхода, к которым можно подключить соответствующее число датчиков/исполнительных устройств. На борту платы имеется интерфейс RS485, что позволяет строить сеть из данных плат, тем самым позволяя практически неограниченно увеличивть число входов/выходов. Также это позволяет подключать систему к ПК для управления с него и/или сбора информации от системы.
Другие отличительные особенности платы:
— возможность отладки по интерфейсу JTAG;
— программирование по интерфейсу ISP;
— питание от 2.7 до 24V (в зависимости от типа реле, устанавливаемых на выходах, если они необходимы);
— в состав Atmega32 входят таймеры – счётчики, аналоговый компаратор, АЦП, TWI, имеются различные режимы понижения энергопотребления.
Макет после сборки на выставке. Очередь за бутылочками

Алгоритм работы
///////////////////////////////////////////////////////////////////////////////////////////////////////
ISR(TIMER0_COMP_vect)
{
t++;
if ((PINC & 0b00000001) != 0) // Истина при 1, т.е. вывод не на земле, ПОШАГОВЫЙ РЕЖИМ РАБОТЫ
{
if (t <= 36) PORTA = 0b00000001; // 0+9=9 мешалка
else if (t <= 60) PORTA = 0b00000010; // 9+6=15 поршень вниз, фильтры
else if (t <= 84) PORTA = 0b00000100; // 15+6=21 поршень вверх, шестерёнки
else if (t <= 85) PORTA = 0b00001000; // 21+0.25=21.25 Сдвигаем ЧАСЫ с концевика
else if (t <= 120) {if ((PINC & 0b00000010) != 0) // 21.25+8.75=30 Пока не вышло время и на концевике HIGH
PORTA = 0b1000; // ЧАСЫ идут.
else PORTA = 0;} // а инначе — встают.
else if (t <= 156) PORTA = 0b00010000; // 30+9=39 контроль качества
else if (t <= 192) PORTA = 0b00100000; // 39+9=48 барабан_1
else if (t <= 228) PORTA = 0b01000000; // 48+9=57 барабан_2
else if (t <= 229) PORTA = 0b10000000; // 57+0.25=57.25 Сдвигаем КОНВЕЙЕР с концевика
else if (t <= 255) {if ((PINC & 0b10000000) != 0) PORTA = 0b10000000; // 57.25+6.5=63.75 Пока не вышло время и на концевике HIGH, КОНВЕЙЕР ползёт.
else {PORTA = 0; t = 0;} } // а иначе — встаёт, и начинается новый цикл.
}
else // ОДНОВРЕМЕННЫЙ РЕЖИМ РАБОТЫ
{
if (t <= 24) PORTA = 0b01111011; // 0+6=6 поршень вниз…
else if (t <= 48) PORTA = 0b01111101; // 6+6=12 поршень вверх…
else if (t <= 72) PORTA = 0b01111011; // 12+6=
18 поршень вниз…
else if (t <= 96) PORTA = 0b01111101; // 18+6=24 поршень вверх…
else if (t <= 120) PORTA = 0b01111011; // 24+6=30 поршень вниз…
else if (t <= 144) PORTA = 0b01111101; // 30+6=36 поршень вверх…
else if (t <= 168) PORTA = 0b01111011; // 36+6=42 поршень вниз…
else if (t <= 192) PORTA = 0b01111101; // 42+6=48 поршень вверх…
else if (t <= 216) PORTA = 0b01111011; // 48+6=54 поршень вниз…
else if (t <= 240) PORTA = 0b01111101; // 54+6=60 поршень вверх…
else if (t <= 241) PORTA = 0b10000000; // 60+0.25=60.25 Сдвигаем КОНВЕЙЕР с концевика
else if (t <= 255) {if ((PINC & 0b10000000) != 0) PORTA = 0b10000000; // 60.25+3.5=63.75 Пока не вышло время и на концевике HIGH, КОНВЕЙЕР ползёт.
else {PORTA = 0; t = 0;}} // а иначе — встаёт, и начинается новый цикл.
}
}
int main (void)
{
// НАСТРОЙКА портов
DDRA = 0b11111111; // Выходы
PORTA = 0b00000000; // 0 на выходах
DDRB = 0b00000000; // Входы
PORTB = 0b11111111; // с подтяжкой.
DDRC = 0b00000000; // Входы,
PORTC = 0b11111111; // с подтяжкой
DDR
D = 0b00000000; // Входы.
PORTD = 0b11111111; // С подтяжкой
// Настройка T/C0 — 8bit может считать внешние соббытия T0(PB0), выдавать ШИМ OC0(PB3)
TCCR0 = 0b00001101;
// |||| — 111 предделитель CLKi/o /1024 = 1000000/1024 = 976.5625; 1.024ms
// | — 1 сброс при совпадении с OCR0
TIMSK = 0b00000010;
// || — 1 прерывание по переполнению
// | — 1 прерывание по совпадению с OCR0
OCR0 = 243; // fOCn = 976.5625/(1+243) = 4.00230532786885; T=249.856ms ~=0.25s
sei(); // Общее разрешение прерываний.
///////////////////////////////////////////////////////////////////////////////////////////////////////
while (1);
} // main
Благодарю за внимание!