Pull to refresh

Степлер на микроконтроллере

Reading time6 min
Views53K


В ходе работы «инженером всего» в типографии приходится сталкиваться с ремонтом и апгрейдом некоторых хитрых устройств, в быту обычно не встречающихся. Одним из «любимчиков» у меня является детище сумрачного шведского гения, электрический степлер Rapid 106. С одной стороны, самый старый «рапид» у нас работает с начала двухтысячных, это показатель. С другой стороны, проблем с ними хватает. Некоторые приколы связаны со специфической электроникой.

И вот, однажды чаша терпения была переполнена. На тот момент я знал, что «рапиды» плохо относятся к помехам в сети (а мощные частотные приводы неподалеку имеются), что один из них недавно сказал: «ПЫЩЬ!» и больше не включался, и что новый аппарат стоит порядка 40 тысяч рублей.


Сначала я хотел провести реверс-инжиниринг родной платы. Но в процессе решил, что мне категорически не нравятся некоторые технические решения оригинала. Да, самонадеянно, но в голове уже оформлялась концепция «как сделать проще». Вот некоторые особенности схемотехники, казалось бы, такого простого устройства, как электрический степлер:

1. Четыре микросхемы — два мультивибратора, один счетчик, один набор триггеров.
2. Под сотню других элементов.
3. Питание микросхем (на минуточку, КМОП!) реализовано без гальванической развязки с сетью.
4. Имеется схема оптической синхронизации степлера с другим оборудованием. Можно два степлера использовать «в линию». Никогда не использовалось.
5. Электромагнит степлера коммутируется симистором.


Родная электроника степлера

Из этих пунктов волевым решением первые четыре признаны ненужными. Сформирован новый принцип работы:

1. Для управления электромагнитом используется типовое включение оптопары MOC3052. Силовой симистор и снаббер (резистор и конденсатор) перекочевывают в новую схему.
2. Управляющий импульс на оптопару дает микроконтроллер.

Таким образом, имеем ATTiny13A, в котором используются компаратор (для детектирования перехода сетевого напряжения через ноль), АЦП (переменным резистором на нем задается задержка выдачи ударного импульса), один вход (педаль-кнопка) и один выход (для выдачи импульса).

О нарезке синусоиды

Симистор, который управляет электромагнитом, открывается при подаче управляющего напряжения, а закрывается — при переходе сетевого напряжения через ноль (при отсутствии управляющего напряжения). Открывать симистор можно либо в ноле, либо на каком-то участке полупериода. Если мы открываем в ноле, то получается все очень красиво и гуманно, нет помех от резкого нарастания напряжения, но мы тогда мы можем оперировать только целым числом полупериодов. Оптопара MOC306x оснащена встроенным детектором ноля, т.е., включается и выключается только в ноле. По факту, объединив ее с силовым симистором, мы получим твердотельное реле переменного тока.


Исполнительное устройство

Но в нашем случае все хуже. «Рапид» по принципу управления похож не на твердотельное реле, а на диммер. То есть, по команде оператора наш блок управления должен включить симистор в определенном месте полупериода. Выключится он сам по достижению ноля. От того, насколько большой участок полупериода задействован, зависит в итоге сила удара. Так что, используем оптопару MOC305x, в которой нет схемы детектирования ноля.

Конкретика

Итак, алгоритм работы определен:
1. Нажатие на педаль оператором.
2. Определение задержки включения симистора. В зависимости от положения переменного резистора (включен делителем между Vcc и GND, средний вывод на входе АЦП) вычисляется задержка (мс), лежащая в заданном диапазоне (опытным путем подобрано, 3-5 мс).
3. Детектирование ноля сетевого напряжения (с помощью компаратора микроконтроллера).
4. Отработка задержки.
5. Выдача управляющего импульса длительностью 1 мс на оптопару.

Грабли были в пункте №3. Как ловить ноль микроконтроллером? Простейшее решение — даем на один вход компаратора с делителя сетевое напряжение, на второй — чуть больше ноля (с другого делителя). При этом нарушается гальваническая развязка высоко- и низковольтной частей схемы, а в реальных условиях получаем отвратительную помехоустойчивость и случайные срабатывания. На этом внутренний джедай сказал мне: «Решай проблему в лоб». Решение выглядит следующим образом: откуда-то вытащен маленький грязный трансформатор, выдающий 9 В переменного тока. На его выход ставятся два маломощных диодных моста. С одного берем измеряемое пульсирующее напряжение, на другой ставим конденсатор и стабилизатор — это питание микроконтроллера. И вот, она, стабильность!

Детали реализации


Новая плата

Схема — Eagle, разводка — Sprint Layout. Разработка прошивки — Sublime Text (Sublime-AVR). Программирование МК — ChipProg-40. ISP на плате не разведен для упрощения — отладка в железе заняла немного времени, максимум с десяток передергиваний МК из платы в программатор и обратно.

Код прошивки
#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 1200000UL

// Минимальная и максимальная задержки ударного импульса
#define MINDELAY 3
#define MAXDELAY 5

// Педаль на размыкание подключена к PB4. Активный уровень - низкий.
#define PEDAL PB4

// Выход - PB3. Активный уровень - высокий.
#define FIRE PB3 

void delaymsMod(unsigned char ms)
// Компилятор хочет, чтобы аргументом _delay_ms была константа.
// Поэтому приходится делать велокостыль.
{
	for (unsigned char counter=0; counter<ms; counter++)
	{
		_delay_ms(1);
	}
}


unsigned char fireDelay(void)
// Отключить компаратор. Включить АЦП. Получить уставку с переменного резистора.
// Вычислить время, которое будет между переходом через 0 и подачей ударного импульса
// Чем меньше это время, тем больший участок полупериода подается на электромагнит,
// соответственно, сильнее удар. Выключить АЦП.
{
	// ACD - отключение аналогового компаратора
	ACSR |= (1 << ACD); 

	// бит 5 - ADLAR, ориентация данных. Чтобы использовать только 8 бит ADCH
	// биты 0-1 - настройка входа. 01 соотв. ADC1 (PB2)
	ADMUX |= 0b00100001;  

	// ADPS2-1-0 задает делитель тактирования АЦП. 011 соотв. делителю 8
	// Результирующая частота АЦП 150 кГц (1.2 МГц / 8)
	ADCSRA |= (1 << ADPS1) | (1 << ADPS0);

	// Включить АЦП
	ADCSRA |= (1 << ADEN);

	// Начать преобразование
	ADCSRA |= (1 << ADSC);

	// Подождать, пока не сбросится бит преобразования
	while (ADCSRA & (1 << ADSC));

	// Получить 8 бит данных
	unsigned char rawADC = ADCH;

	// Отключить АЦП
	ADCSRA &= ~(1 << ADEN);

	// Вычислить задержку
	return MINDELAY + rawADC * (MAXDELAY - MINDELAY) / 255;
}

void waitForZero(void)
// Включить компаратор. Дождаться перехода через ноль. Выключить компаратор.
{
	ACSR &= ~(1 << ACD);
	_delay_ms(1);
	while ((ACSR & 0b00100000) == 0b00100000);
	ACSR |= (1 << ACD);
}

unsigned char pedal(void)
// Проверить нажатие педали. С подавлением дребезга. Педаль работает на размыкание.
{
	unsigned char pressed = 0; // флаг нажатия
	
	// время, в течение которого должно не прерываться нажатие
	unsigned char pressedTime = 100; 

	if (PINB & (1 << PEDAL)) // педаль нажата, цепь разомкнута, на входе 1
	{
		pressed = 1;

		for (unsigned char counter=0; counter < pressedTime; counter++)
		{
			
			// если в течение заданного интервала педаль отпущена, цепь
			// замкнута, на входе 0 - сбросить флаг нажатия
			if ( !(PINB & (1 << PEDAL)))
			{
				pressed = 0;
			}

			_delay_ms(1);
		}
	}

	return pressed;
}

void fire(void)
// ударный импульс длительностью 1 мс
{
	PORTB |= (1 << FIRE);
	_delay_ms(1);
	PORTB &= ~(1 << FIRE);
}

void setup(void)
{
	// режим порта
	DDRB=0b00001000;
}

int main(void)
{
	setup();

	while (1)
	{
		if (pedal())
		{
			waitForZero();
			delaymsMod(fireDelay());
			fire();

			while(pedal());
		}

	}
	return -1; // Никогда
}



Для освоения дополнительных навыков монтажа использованы SMD резисторы (1206) и конденсаторы (0805) в низковольтной части схемы. Технология изготовления платы:

1. Кусок какого-то текстолита. Очистка жесткой посудной губкой и «Пемолюксом».
2. Пленочный фоторезист (Ordyl Alpha 350). Прикатка ламинатором GMP (120 градусов, мин. скорость).
3. Фотошаблон (прозрачная пленка, принтер Oki 9655).
4. Засветка 20-ваттной УФ-сберегайкой (6 минут).
5. Смывка лишнего (поташ).
6. Травление (хлорное железо, водяная баня, периодическое воздействие мягкой кистью).
7. Сверление, лужение, запайка, испытания.


SMD-на-коленке и исправление ошибки при разводке

Итого

Потрачена уйма времени. От идеи до реализации прошло две недели, занимался проектом в «свободное рабочее время». Но зато теперь есть простой, понятный, дешевый и легко повторяемый блок управления степлером. Получен дополнительный скилл — использование оптопар и симисторов для управления нагрузкой.

Все наработки — на гитхабе.

UPD. Добавил видео. Снято на чайнафон с плохой камерой, но общее представление дает. Первые два удара «холостые» по причине практически полной убитости степлирующей головки, она использовалась для отладки общей концепции.

Tags:
Hubs:
+33
Comments27

Articles

Change theme settings