Париться - так по полной!
Если делать всё более идеально, то стоит сразу реализовать LUT.
Таблицу сопоставления пикселя картинки RGB, пикселю 3х лазеров.
Лучше сразу работать в 16 битах на канал.
Какой там ЦАП ставят на LED контроллер? Очень хочется работать 16 бит.
По этому, если есть возможность менять уровень яркости лазера от 0 до 3999 - то будет шикарно.
Таблицу LUT будем забивать с компа и хранить прямо в контроллере. Это что-бы кормить контроллеру обычное изображение. Не подготавливая его на компе.
Три буфера по 16 бит (8 бит маловато).
Сначала инициируем таблицу LUT. Забьём её последовательностью чисел в обратном порядке, так как 100%'ный чёрный цвет на картинке файла, равняется 100%'ному белому, засвечивающего бумагу.
Заполняем каждый из каналов.
a = 65535 (16 бит) - это размер цветового пространства нашей картинки, что мы будем печатать, одного из RGB канала пикселя, минус 1.
n = перечисляем от 0 до a.
b = 3999 - Это максимальное число для самого мощного сигнала на лазер, минус 1. 4000 хватит на самый качественный градиент, с учётом преобразований.
R[n]=(a-n)/a*b
G[n]=(a-n)/a*b
B[n]=(a-n)/a*b
Это первоначальный LUT.
В будущем, для ручной калибровки цвета, будем корректировать цвет смещением каналов в LUT, можно сделать регулировку с помощью "Кривой" как в фотошопе.
Для автоматической же коррекции, достаточно будет какого-нить сканера от Эпсон.
Печатаем шкалы. Сканируем. Конвертируем в LUT профиль. Передаём LUT в контроллер. Стандартная модель для калибровки лабов.
Всё конечно в специально написанном софте для PC. Софт написать, для меня не проблема.
Далее дело за железяками.
Вертикальная развёртка:
Передаём контроллеру изображение, пропуская через таблицу LUT.
Если хотя-бы рассчитывать на фотку размером 305x457мм, 300dpi, 16 бит - это примерно буфер размером 40 мегабайт.
Память должна уметь отдавать одну линию данных изображения быстрее, чем луч пройдёт от края до края бумаги.
Теперь про горизонтальную:
ДВА СУПЕРШУСТРЫХ буфера, примерно по 22 килобайта каждый, для одной линии изображения (3600 RGB пикселей 16 бит).
В первом буфере уже хранится первая линия изображения, которая после срабатывания датчика оборота зеркала, начинает передавать на лазер попиксельно эту линию.
Во втором буфере, к достижению лучом конца листа, уже должна быть следующая линия передаваемого изображения.
Два буфера - это что-бы не ждать заполнения только что освободившегося буфера, бесполезно крутя зеркало, а начать сразу експонирование следующей линии, одновременно заполняя освободившийся буфер следующей линией.
По достижению конца листа лучом - делаем шаг протяжки бумаги.
Повторяем всё до конца буфера с картинкой.
Это так. Вкратце