Заголовок сообщения: Термопринтер из старого терминала (кассового аппарата)
Добавлено: Ср сен 04, 2019 22:15:50
Вымогатель припоя
Карма: 1
Рейтинг сообщений: 10
Зарегистрирован: Вс дек 30, 2012 00:32:06 Сообщений: 542 Откуда: Николаев / Украина
Рейтинг сообщения:0
Всем привет! Имеется на руках дохлый терминал Ingenico I5100. Интересного в нем LCD дисплей wd-h12069-6ylyd и Термопринтер ELPM sen701130c. Очень интересно подключить термопринтер к Ардуино. Сам терминал признаков жизни не подает. По этому логическим анализатором (или осциллографом) смотреть нечего... Что удалось узнать: - скорость печати (ЛПС) 65 мм / С (при 7.2 В постоянного тока) - ширина печати (мм) и 48 мм (384 точек), - импульсный блок питания напряжением 5 ~ 8.5 отрицательного полюса источника питания логики 5В + 5% - Определение температуры печатающей головки - термистор (Перевод с Китайского) http://www.youboy.com/s502527612.html
Сама печатающая головка имеет маркировку gp16b337 (в Гугле пусто) Немного прошелся тестером по плате, получилась (примерно) следующая распиновка: Спойлер01 Steper Drive 02 Steper Drive 03 Steper Drive 04 Steper Drive 05 Оптопара (датчик наличия бумаги) 06 Оптопара (датчик наличия бумаги) 07 GND 08 VDD 09 VDD 10 VDD 11 sen723379d RAM FLASH MODULE 12 gnd 13 gnd 14 gnd 15 Соединен с 18 и идет на Триггер Шмидта (пин 6Y) 16 sen723379d RAM FLASH MODULE 17 +3.3 18 Соединен с 15 и идет на Триггер Шмидта (пин 6Y) 19 gnd 20 gnd 21 gnd 22 sen723379d RAM FLASH MODULE 23 sen723379d RAM FLASH MODULE 24 VDD 25 VDD 26 VDD Где: VDD - подключается (через мосфет) напрямую к блоку питания 15-й и 18-й соединены вместе sen723379d RAM FLASH MODULE - "Мозги" терминала. Запаянная коробочка и залитая эпоксидкой....
Примерная схема с некоторыми компонентами: Из распиновки складывается подозрение что принтер подключается по i2c...
Может у вас есть какие-то мысли и идеи как его запустить? Фото выложу чуть позже.
_________________ Сделать своими руками всегда интересней чем просто купить и пользоваться
Не могу сказать на 100% про вашу "ТермоПечатающуюГоловку", но те, с которыми я сталкивался- это "по сути" - сдвиговый регистр, в который по сигналу "строб" просто записываются "нолики" или "единички", по окончании записи этой "строки пикселей" на ТПГ поступает сигнал "нагрев" соответствующих резисторов, потом ШД перемещает бумагу на "одну строку", а в ТПГ "закачивается" следующая строка "пикселей".. Вот тут:
кто- то "баловался" с ТПГ от АМС-100..
Я так думаю, что ТПГ, "в основном" мало отличаются друг от друга - можно посмотрет, как реализуются подобные проекты на основе других ТПГ..
Может у вас есть какие-то мысли и идеи как его запустить?
А можно еще для начала поинтересоваться, в чем смысл всей затеи? Вот напечатал, допустим, с ардуины "нечто" вместо чека, а "оно" через пару месяцев поблекло и почти пропало, как это часто бывает с теми же чеками... И...?
_________________ Делай то, что тебе нравится и ты никогда не будешь работать
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Заголовок сообщения: Re: Термопринтер из старого терминала (кассового аппарата)
Добавлено: Чт сен 05, 2019 09:47:16
Вымогатель припоя
Карма: 1
Рейтинг сообщений: 10
Зарегистрирован: Вс дек 30, 2012 00:32:06 Сообщений: 542 Откуда: Николаев / Украина
Рейтинг сообщения:0
Один из пинов определен: 16 - термистор (второй контакт идет на GND), только он прозванивается только в одну сторону. Это точно термистор. Проверял на нагрев. остаются пины: 11 - ? 15+18 - ? 22 - ? 23 - ?
Осталось определить что из них: DI - данные для регистра (1 - точка, 0 - нет ) CLK - строб для них. LAT - защёлка для регистра STB - длительность импульса нагрева для нагревателей. (От неё зависит яркость отпечатка).
Можно как-то определить? Или только экспериментальным путем?
Фото:
Добавлено after 18 minutes 12 seconds: В саму Термо Печатающую Головку Шлейф заходит немного с другой распиновкой: 1 - VDD 2 - VDD 3 - ???? Пин 23 4 - ???? Пин 22 5 - GND 6 - GND 7 - Тр.Шм. Пин 18 8 - Тр.Шм. Пин 18 9 - Тр.Шм. Пин 18 10 - +3.3 11 - +3.3 12 - Термистор 13 - Тр.Шм. Пин 15 14 - Тр.Шм. Пин 15 15 - Тр.Шм. Пин 15 16 - GND 17 - GND 18 - ???? Пин 11 19 - NC 20 - VDD 21 - VDD
_________________ Сделать своими руками всегда интересней чем просто купить и пользоваться
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Здесь не хватает резинового ролика- вы его сами сняли, или его просто нет? От какого аппарата этот принтер? Вот здесь: http://www.kassmehanic.narod.ru/sheme.htm есть схемы от некоторых кассовых аппаратов, смотрите, может, что- нибудь подойдёт.. У меня есть распиновка ТПГ, но только у неё 28- выводной разъём..
Заголовок сообщения: Re: Термопринтер из старого терминала (кассового аппарата)
Добавлено: Чт сен 05, 2019 14:34:49
Вымогатель припоя
Карма: 1
Рейтинг сообщений: 10
Зарегистрирован: Вс дек 30, 2012 00:32:06 Сообщений: 542 Откуда: Николаев / Украина
Рейтинг сообщения:0
Разбираю терминал Ingenico I5100. Ролик есть, установлен на крышке держателя бумаги (часть корпуса). Все детали на месте. Я в сети много чего пересмотрел. Нашел несколько распиновок, но все они были от одной и той же печатающей головки и тоже на 28 выводов.
_________________ Сделать своими руками всегда интересней чем просто купить и пользоваться
Пример кода для Ардуино брал здесь: https://yadi.sk/d/xV_qJhSukBSlFg Но никак не могу заставить правильно печатать. В примере есть тестовая картинка. У меня она "троится". А именно не зеркальные копии, а три слоя печатаются на одной линии, из-за этого изображение получается сжатое по высоте:
Попробовал модифицировать скетч, но стало только хуже, прикрепляю скетч
вот есть у мя штук 5 касовых принтоф ..ума не хватает придумать ну нахуя они мне нужны и чо с ними делать...была мысль отдат мчстудням на пыты в Лабораторию ТС да далеко он
_________________ ZМудрость(Опыт и выдержка) приходит с годами. Все Ваши беды и проблемы, от недостатка знаний. Умный и у дурака научится, а дураку и .. Алберт Ейнштейн не поможет и ВВП не спасет.и МЧС опаздает
Я таки "многофайловики" под адуринкой малость удавил... Теперь можно будет и поиграться в свое удовольствие - может таки и до принтеров доберусь, чуток поотдохнувши.
Заголовок сообщения: Re: Термопринтер из старого терминала (кассового аппарата)
Добавлено: Пн сен 09, 2019 09:45:37
Вымогатель припоя
Карма: 1
Рейтинг сообщений: 10
Зарегистрирован: Вс дек 30, 2012 00:32:06 Сообщений: 542 Откуда: Николаев / Украина
Рейтинг сообщения:0
В общем, промучился я с весь день... Немного поигравшись с временем прожига выяснил что это не расслоение, а именно дублирование. Печатающая головка похоже неравномерно все пропечатывает, из-за чего копии казались слегка разными (и я подумал что изображение расслаивается). Дублируется изображение из-за неправильно заданных границ печати. Дублирование убрал. В строке for(int i=0; i<16; ++i)16 заменил на 48.
Настроил печать, теперь по высоте изображение получается нормальным. Печать ускорилась в 2 раза, но все равно очень медленно печатает: более 200!!! мс на каждую строку (длинной 384 точек). Вот код: Спойлерvoid processPrintBitmap() { int fireTime = 5; Serial.print("Burning: "); digitalWrite(TPH_PIN_ENABLE, LOW); // подаем питание на мотор и головку
for (int l=0; l<78; ++l) { for (int p = 0; p<12; ++p) //прогоняем 12 раза каждую строку, тк одновременно можно нагревать только 32 точки - да, это не оптимально... { for (int i = 0; i < 48; ++i) { for (int j = 0; j < 8; ++j) { uint8_t pinValue = LOW; if (i/4==p) //каждый цикл печатаем по 1 четвертой (32 точки) { pinValue = bitRead(bitmap[l*16+15-i], j) != 0 ? HIGH : LOW; } digitalWrite(TPH_PIN_INPUT, pinValue); delayMicroseconds(10); digitalWrite(TPH_PIN_CLOCK, HIGH); delayMicroseconds(10); digitalWrite(TPH_PIN_CLOCK, LOW); delayMicroseconds(10); } }
Но все равно мне очень сложно разобраться в том как происходит сам процесс вывода данных (прожига). К тому же код нужно оптимизировать. Скорость печати просто ужасная! Я пробовал оптимизировать Вывод данных, но не вышло. Стоит немного что-то изменить в функции, как все перестает вообще печатать. То есть выходит чистая бумага. Из минусов кода - удержание в памяти буфера печати. Который занимает абсолютно всю ОЗУ Atmega328, что тоже не фонтан... В качестве контроллера возьму плату stm32f103c8t6, это решит проблему с памятью и недостатком пинов, но на скорость печати не повлияет. Остается главный вопрос: как оптимизировать скорость печати??
_________________ Сделать своими руками всегда интересней чем просто купить и пользоваться
Вывод данных подобен выводу в растровой развертке. Засылаем строку из точек. Даем импульс нагрева. Смотрим температуру головки. Выполняем сдвиг ленты. Затем все повторяем. Одно замечание... Головка поделена на несколько секторов со своими сдвиговыми регистрами. Следовательно или те регистры включены последовательно или у каждого еще свой вывод CS. Если одновременно все получат данные - будем иметь столько копий, сколько тех регистров.
Буфер изображения может быть внешний (включая микроСД), расширение количества выводов - используем соответствующие микросхемы из логики-рассыпухи.
Заголовок сообщения: Re: Термопринтер из старого терминала (кассового аппарата)
Добавлено: Вт сен 10, 2019 09:27:31
Вымогатель припоя
Карма: 1
Рейтинг сообщений: 10
Зарегистрирован: Вс дек 30, 2012 00:32:06 Сообщений: 542 Откуда: Николаев / Украина
Рейтинг сообщения:0
Все регистры включены последовательно, всего 12 регистров по 32 точки. Дерганьем вывода LATCH определяется сколько регистров будут прожигаться. Ускорил вывод еще больше: убрал все паузы, и вместо digitalWrite(); прописал прямую запись в порт: PORTB &= ~(1<<1); Из минусов: сейчас нужно каждый регистр прожигать отдельно. То есть: закинули 32 точки - прожиг - пауза на прожиг 5 мс - следующий регистр... - сдвиг ленты (тоже пауза). В такой последовательности на печать строки в 384 точки (все 12 регистров) уходит ну очень много времени. Даже с удалением всех пауз и ускорением записи. Еще не понятно зачем 8 раз подряд передавать одну и ту же точку:
for (int i = 0; i < 48; ++i) { for (int j = 0; j < 8; ++j) { uint8_t pinValue = LOW; if (i/4==p) { ..читаем бит } ..записываем бит } }
Можете мне объяснить как это работает?
_________________ Сделать своими руками всегда интересней чем просто купить и пользоваться
может поискать листинги исходникоф для касовых дел? там вроде очень быстый код написан правда по семью мк51совместимых...но печатае влет даже новые чеки на стакрых касах после апгрейда прошивки где графическая херня идентификатор идут на чеке
_________________ ZМудрость(Опыт и выдержка) приходит с годами. Все Ваши беды и проблемы, от недостатка знаний. Умный и у дурака научится, а дураку и .. Алберт Ейнштейн не поможет и ВВП не спасет.и МЧС опаздает
Исходники вряд-ли найти удастся... А вот типовую схему и кратенькое описание от мини500-02 или ешшо чаво... вполне... Но там принтера другие... хотя... Разве что с шаговым движком дополнительно разбираться...
Хоть печать и ускорилась в несколько раз, но все же очень далека от той, какой должна быть. Сейчас картинка "Панды" (тестовой картинки) размерами 384х134 (48х16 мм) печатается за (примерно) 3 секунды. А это в 7 раз медленнее чем должно быть. Вот пример работы аппарата, с которого я взял термопринтер: https://youtu.be/NpgrLEuK3cg?t=57 Вот еще пример: https://youtu.be/pXnbft-Jdpk?t=131 Такая скорость печати возможна ТОЛЬКО если "прожиг" будет происходить вместе с шагом двигателя, то есть без пауз на печать, а одновременно.
Столкнулся еще с одной неприятной вещью. Нагар на печатающей головке. Он образуется сразу же после первой печати, и с каждой последующей печатью становится только хуже. Нагар легко убрать. Но все же он образуется потому что лента во время прожига стоит на месте и прилипает к головке. Кстати, время прожига на это не влияет. "Пригорание" происходит даже на самых блеклых отпечатках. Если делать печать на движущейся ленте, то такого не происходит (проверял). НО! Текущий алгоритм не подходит для печати "на лету". Я пробовал. Происходит расслоение изображения. Каждые 32 точки происходит 1/2 шага мотора (1 прожиг), таких сегментов 12, 12 полу-шагов мотора, соответствует 3-м строкам... На одной линии (строке) это не заметно, но вот следующая строка (линия) отстоит от первой в 3 раза дальше чем должна быть. Изображение пропечатывается хорошо, но "полосатое" и в 3 раза выше чем должно быть. В общем, данный алгоритм не подходит. Если бы можно было прожигать одновременно всю линию, или несколько сегментов то проблем бы не было... Может у кого-то есть идеи как сделать одновременный прожиг? То есть как сделать запись сразу во все регистры, а не в 1 из 12?
P.S. ...на заметку: скорость печати на прямую зависит от напряжения питания головки. Если напряжение питания 7-8 вольт то на прожиг одного сегмента нужно примерно 5 мс. Если напряжение 12 вольт то 1 мс вполне достаточно. Как результат - увеличение скорости в 2-3 раза...
Заголовок сообщения: Re: Термопринтер из старого терминала (кассового аппарата)
Добавлено: Чт сен 12, 2019 21:05:58
Вымогатель припоя
Карма: 1
Рейтинг сообщений: 10
Зарегистрирован: Вс дек 30, 2012 00:32:06 Сообщений: 542 Откуда: Николаев / Украина
Рейтинг сообщения:0
Спасибо! Заработало! Немного переделал, теперь летает! На печать всего буфера (384х134 точек) уходит в среднем 600 мс. При чем скорость печати зависит от количества точек в линии: меньше точек - меньше время на прожиг - быстрее печать. А если точек в линии нет, то вообще пропускается без задержки на прожиг! Три строчки "среднего" шрифта печатаются "примерно" за 500 мс!!! Картинка панды печатается дольше, до 1 сек. Из-за того что там много сплошных участков.
Функция печати: Спойлер
Код:
void processPrintBitmap() { for (int l=0; l<134; ++l) { for (int i = 0; i < 48; ++i) { for (int j = 7; j > -1; j--) { uint8_t pinValue = LOW; pinValue = bitRead(bitmap[l*48+i], j) != 0 ? HIGH : LOW; if (pinValue){ StrobeEn++; } digitalWrite(DATA_IN, pinValue); digitalWrite(CLOCK, HIGH); digitalWrite(CLOCK, LOW); } } digitalWrite(LATCH, LOW); digitalWrite(LATCH, HIGH); if (StrobeEn>0){ digitalWrite(POWER_ENABLE, HIGH); // подаем питание на мотор и головку digitalWrite(STROBE, HIGH); delay(2); _steper(); if (StrobeEn>32){ delay(((FireH-FireL)/100.0*(0.17667*(sq(StrobeEn)/100.0*StrobeEn)))/1000+FireL); }else{ delay(1); } digitalWrite(STROBE, LOW); digitalWrite(POWER_ENABLE, LOW); }else{ _steper(); // 1 шаг мотора delay(1); } digitalWrite(DATA_IN, LOW); digitalWrite(POWER_ENABLE, HIGH); // подаем питание на мотор и головку _steper(); // 1 шаг мотора delay(1); digitalWrite(POWER_ENABLE, LOW); StrobeEn=0; } _Standby(); digitalWrite(POWER_ENABLE, LOW); }
Я использовал не линейную зависимость длительности прожига от количества пикселей в линии. График функции выглядит как парабола. Формула выглядит так:
где: FireH - максимальное время прожига линий с наибольшим заполнением. Измеряется в мс. У меня установлено значение 12 мс FireL - минимальное время прожига, если точек очень мало (на пример одна...) Измеряется в мс. У меня установлено 2 мс StrobeEn - количество пикселей в строке 0.17667 - коэффициент: 100/566, как высчитал 566, уже не вспомню... расчеты не сохранил. Но он на прямую зависит от количества точек на головке (384). _Standby() - функция отключает питание шаговика, чтобы не перегрелся.
Функция принимает не линейное значение от 2 до 12 (FireH и FireL)
Конечно, можно было так не заморачиваться, но я хотел добиться одинаковой "яркости" линий с разным заполнением, и при этом не жечь на всю катушку... В общем пытался поймать золотую середину между пережиганием пикселей (когда точки расплываются и сливаются от нагрева) и пропусками от очень слабого нагрева. Остальной код не менял, но в будущем нужно будет переписать большинство функций. Завтра скину фотки и видео работы.
_________________ Сделать своими руками всегда интересней чем просто купить и пользоваться
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 25
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения