Pull to refresh

Кинетический макет оборудования для производства ликера. Задачи и их решение

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

image

Еще месяц понадобился на изготовление деталей и сборку установки.
Размер макета был утвержден: 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, который позволяет ускорить процесс разработки и отладки.
Каркас макета было сделан сварным для прочности и устойчивости. Изнутри каркас был выстлан листами ДСП цвета Венго. У макета сделали фальш-стенку, за которой спрятали провода.

image

image

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

Макет после сборки на выставке. Очередь за бутылочками

image



Алгоритм работы

///////////////////////////////////////////////////////////////////////////////////////////////////////

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

Благодарю за внимание!
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.