usb->arduino->lpt ?

art100
Offline
Зарегистрирован: 09.03.2014

Какие варианты?

1.Делаем тестер на светодиодах.

Я накидал такого кода

// art100 to write test pin centronics Blink leads 2-12
void setup() {                
  for(int n=2; n<=12; n++){  pinMode(n, OUTPUT); }
}
void loop() {
  for(int n=2; n<=12; n++){
   digitalWrite(n, HIGH);   // turn the LED on (HIGH is the voltage level)
   delay(1000);               // wait for a second
   digitalWrite(n, LOW);    // turn the LED off by making the voltage LOW
   delay(100);               // wait for a second
  }
}
//================================================================

 

2.Убедились что ничего не отпалим. Попробуем что-нибудь такое.

// art100 copy other 20140907 code usb->arduino->lpt
const int startup_charsPerLine = 80;
const int startup_num_lines = 2;
byte startup_message[startup_num_lines][startup_charsPerLine] = {
  "This is the startup message. It prints whenever",
  "the Arduino is reset.",
};

const int charsPerLine = 80;   // this is the max # of chars per line
const int num_lines = 10;
byte message[num_lines][charsPerLine] = {
  "    ",   // blank line
  "This is the normal message. It prints whenever",
  "you connect pin 14 (analog 0) to GND.",
  "  ",  // blank line
  "------------------------------------------------------------------------------",   // a spiffy line
  "1) More message content",
  "  ",
  "II) you can have up to about 80 chars per line ",
  "  ",
  "------------------------------------------------------------------------------",
};
// parallel port  = arduino //Centronics Connector    
const int nStrobe =  2;//1	1	nStrobe	(input)
const int data_0  =  3;//2	2	Data pin 0	(input)
const int data_1  =  4;//3	3	Data pin 1	(input)
const int data_2  =  5;//4	4	Data pin 2	(input)
const int data_3  =  6;//5	5	Data pin 3	(input)
const int data_4  =  7;//6	6	Data pin 4	(input)
const int data_5  =  8;//7	7	Data pin 5	(input)
const int data_6  =  9;//8	8	Data pin 6	(input)
const int data_7  = 10;//9	9	Data pin 7	(input)
const int nAck    = 11;//10	10	nAck	(output)
const int busy    = 12;//11	11	busy	(output)
                       //18-25	19-30	Ground (-)
const int strobeWait = 2;   // microseconds to strobe for
//-------------------------------------------------------------------------------------------
void setup() {
  Serial.begin(9600);

  pinMode(nStrobe, OUTPUT); digitalWrite(nStrobe, HIGH);       // is active LOW    // set HIGH
  pinMode(data_0,  OUTPUT);
  pinMode(data_1,  OUTPUT);
  pinMode(data_2,  OUTPUT);
  pinMode(data_3,  OUTPUT);
  pinMode(data_4,  OUTPUT);
  pinMode(data_5,  OUTPUT);
  pinMode(data_6,  OUTPUT);
  pinMode(data_7,  OUTPUT);
  pinMode(nAck,     INPUT);     // is active LOW
  pinMode(busy,     INPUT);  
  pinMode(13,      OUTPUT);
  pinMode(14,       INPUT); digitalWrite(14, HIGH);  // analog pin 0 on duemilanove and uno
  
  delay(1000);
  resetPrinter();
  printStartupMessage();
  resetPrinter();
  
  Serial.println("Delay for 5 sec");
  delay(5000);
  
  Serial.println("Startup complete");
}
//====================================
void loop() {
 while(digitalRead(14) == HIGH) {
   // wait
 }
  resetPrinter();
  printMessage();
  resetPrinter();
}
//====================================
void printByte(byte inByte) {
  while(digitalRead(busy) == HIGH) {
    // wait for busy to go low
  }

  int b0 = bitRead(inByte, 0);
  int b1 = bitRead(inByte, 1);
  int b2 = bitRead(inByte, 2);
  int b3 = bitRead(inByte, 3);
  int b4 = bitRead(inByte, 4);
  int b5 = bitRead(inByte, 5);
  int b6 = bitRead(inByte, 6);
  int b7 = bitRead(inByte, 7);

  digitalWrite(data_0, b0);        // set data bit pins
  digitalWrite(data_1, b1);
  digitalWrite(data_2, b2);
  digitalWrite(data_3, b3);
  digitalWrite(data_4, b4);
  digitalWrite(data_5, b5);
  digitalWrite(data_6, b6);
  digitalWrite(data_7, b7);

  digitalWrite(nStrobe, LOW);       // strobe nStrobe to input data bits
  delayMicroseconds(strobeWait);
  digitalWrite(nStrobe, HIGH);

  while(digitalRead(busy) == HIGH) {
    // wait for busy line to go low
  } 
}
//-------------------------------------------------------------------------------------------
void resetPrinter() {
  Serial.println("Reseting printer...");
  printByte(27); // reset printer
  printByte('E');
  Serial.println("Printer Reset"); 
}
//-------------------------------------------------------------------------------------------
void printMessage() {
  digitalWrite(13, HIGH);
  for(int line = 0; line < num_lines; line++) {  
    for(int cursorPosition = 0; cursorPosition < charsPerLine; cursorPosition++) {
      byte character = message[line][cursorPosition];
      printByte(character);
      delay(1);
    }
    printByte(10); // new line
    printByte(13); // carriage return
  }
  digitalWrite(13,LOW);
}
//-------------------------------------------------------------------------------------------
void printStartupMessage() {
  Serial.println("Print start-up mssage");
  digitalWrite(13, HIGH);
  for(int line = 0; line < startup_num_lines; line++) {  
    for(int cursorPosition = 0; cursorPosition < startup_charsPerLine; cursorPosition++) {
      byte character = startup_message[line][cursorPosition];
      printByte(character);
      //      delay(1);
    }
    printByte(10); // new line
    printByte(13); // carriage return
    Serial.print("Line ");
    Serial.print(line);
    Serial.println(" printed.");
  }
  Serial.println("Startup message printed");
  digitalWrite(13,LOW);
}
//-------------------------------------------------------------------------------------------

Железо в порядке.

 

art100
Offline
Зарегистрирован: 09.03.2014

Какая должна быть программа чтобы от компьютера печатать? Варианты? Скажем HP LaserJet LPT. Я думаю что привязать драйвер допустим HPLaserJet к COM27 не составляет труда ни у кого. А дальше что зашивать в arduino?

Пните ногой куда дальше копать?

 

 

toc
Offline
Зарегистрирован: 09.02.2013

драйвер принтера, который предназначен для работы через LPT порт не может работать через COM порт+ардуина. Варианты:
1. изменить устройство так чтобы ОС его определяла как lpt порт.
2. разработать свой драйвер или просто программу для печати ("блокнот" умеющий работать с вашим устройством и подключённым принтером).

MikSer
Offline
Зарегистрирован: 27.01.2012

а не проще комовский термопринтер подключить? У меня классно он работает.

http://www.adafruit.com/product/597

art100
Offline
Зарегистрирован: 09.03.2014

Какое-то грустное решение. Все варианты сходятся к usb-atmega8-lpt  или другими словами Травить платку искать atmega8 кварц12МГц кандер резисторы пара диодов

Вариант с Кипарисом(cupres) который прошивку каждый раз подгружает перед работой ради скорости странный. Делал я на нем осцилограф и 3Dочки работали ну там скорости всегда мало.

Что-то у меня совсем нет желания кварц12 искать по рынкам. Плату паять и в итоге получить глюкалово юсбишное.

Arduino-ами тут совсем не пахнет. :(

 

 

 

art100
Offline
Зарегистрирован: 09.03.2014

MikSer пишет:
а не проще комовский термопринтер подключить? У меня классно он работает.

хохма в том что я захотел для технологии РисовалкаPCB->LPT->СвободныйЛазерныйПринтерОтХьюлетта->БумажкуЮтугомКГетинаксуПрижат->ХлорноеЖелезоВВанночке->Какую-нибудь чудо платку вытравить. ЛУТ

А в ардуинах в лучшем случае текст выгоняли.

А графика никак.

Я как старый админ всегда от таких переходников плевался.

Чувствую что надо что-нибудь в духе на PCI-E->CH382->DB25(Lin/Win) за 10-20 баксов к принтеру прикупить и успокоится.

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

art100 пишет:

хохма в том что я захотел для технологии РисовалкаPCB->LPT->СвободныйЛазерныйПринтерОтХьюлетта->БумажкуЮтугомКГетинаксуПрижат->ХлорноеЖелезоВВанночке->Какую-нибудь чудо платку вытравить. ЛУТ

А в ардуинах в лучшем случае текст выгоняли.

там где ты скеч спионерил, у них все работает. мотай ниже, там они этот скеч ускорили еще

art100
Offline
Зарегистрирован: 09.03.2014

Puhlyaviy пишет:

art100 пишет:

хохма в том что я захотел для технологии РисовалкаPCB->LPT->СвободныйЛазерныйПринтерОтХьюлетта->БумажкуЮтугомКГетинаксуПрижат->ХлорноеЖелезоВВанночке->Какую-нибудь чудо платку вытравить. ЛУТ

А в ардуинах в лучшем случае текст выгоняли.

там где ты скеч спионерил, у них все работает. мотай ниже, там они этот скеч ускорили еще

не видел

я на arduino.cc что-то выковырял какой-то труп без графики

дай если видел

Только что победил связку Windows7(32бита)->rs232->ПолКилоЖелезаИзПринтераВыкинулНаДурныеДаташитыMAXIM232поплевалсяПоплевалсяcHPдибильныхДебильныхСайтовНалистался->rs232->HPLaserJet4P

Короче Косяки не только в том что на DTR сигналы уже можно забить, но и XON/XOFF у ХьюлеттовПаккардов не гарантирется на стандартных вындо 9600. Вот у меня 57600 работает и все остальные скорости вот такой прикол нет. Можетлюминисцентная лампа так влияла? Еще короче. Не верю ничему. Все сам проверяю. Еще короче фото.

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Чего дать то, ты ту тему на arduino.cc дальше прочитай.

art100
Offline
Зарегистрирован: 09.03.2014

Puhlyaviy пишет:
Чего дать то, ты ту тему на arduino.cc дальше прочитай.

щас поищу ссылку там вроде две с кодом были

art100
Offline
Зарегистрирован: 09.03.2014

код от куда брал не нашел

Чувствую что в этой цепочке Win7->HP древний прокалдывай не прокладывай arduino ни чего надежного или быстрого не получить. Ключевые слова

arduino

LPT

Надежно

или Быстро

не получить

psv1962
Offline
Зарегистрирован: 19.06.2019

Добрый день уважаемые !

Снова LPT порт. Есть принтер LX-300 c LPT портом  ,на него надо выводить время и расход газа ежечасно. Мега 2560 выдает в Serial  значение часового расхода и день и время.При выводе печать одного байта или одного символа , а не всю строку.

 

 

 

Morroc
Offline
Зарегистрирован: 24.10.2016

Вы шифруетесь или у вас буквы платные ? Мега выдает в Serial, принтер с LPT, ничего важного не пропустили ?

psv1962
Offline
Зарегистрирован: 19.06.2019

Спасибо ,что не пропустили.

Подскажите пожалуйста  как реализовать печать русских символов на принтер Epson LX-300 c ардуины.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

psv1962 пишет:

как реализовать печать русских символов на принтер Epson LX-300 c ардуины.

А зачем? 

Ну если уж очень надо, перекодируй CP1251 в CP866 и отправляй в свой принтер.  Только помни, что он печатать ничего не будет, пока в выводимой последовательности не встретится CR+LF.  Если эти аббревиатуры тебе ни о чём не говорят, забей, поручи дело программисту. 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

psv1962 пишет:

При выводе печать одного байта или одного символа , а не всю строку.

Принтер не печатная машинка, он так не умеет. Некоторые вообще ничего не печатают, пока FF (это не HEX, а управляющий символ так называеца)  не придет, тогда только выводят всё из буфера, что накопили. 

psv1962
Offline
Зарегистрирован: 19.06.2019

Спасибо за совет.

 

Green
Offline
Зарегистрирован: 01.10.2015

У LX300 ещё и RS232 есть для экономии пинов. Но печатает построчно, в любом случае.

psv1962
Offline
Зарегистрирован: 19.06.2019

Добрый День.

Спасибо за интерес к моему вопросу.Хочу сделать кабель COM-LPT с ардуинкой внутри залить скетч.Этот скетч с кабелем будет выводить строку.

*
This sketch translates the serial input to parallel output.

It can be used to print on a parallel printer using the default Generic / Text-only driver
in Windows if you don't have a parallel port.

The escape sequence for Start and End of print is <1B>E (for HP printers)

To use the default USB-serial connection you need to add a 10uF capacitor between the reset
line and ground.
*/

#define STROBE_WAIT 1 // 1ms strobe
#define SERIAL_BAUD 9600

// pin mappings
#define STROBE 2
#define ACK 11
#define BUSY 12

byte incomingByte = 0;   // for incoming serial data
byte pin[8];

// Set fonts routine (not used)
/*
byte setFont[] = {
  0x1B, 0x28, 0x31, 0x30, 0x55,
  0x1B, 0x28, 0x73, 0x31, 0x50,
  0x1B, 0x28, 0x73, 0x0A, 0x48,
  0x1B, 0x28, 0x73, 0x0C, 0x56,
  0x1B, 0x28, 0x73, 0x30, 0x53,
  0x1B, 0x28, 0x73, 0x30, 0x42,
  0x1B, 0x28, 0x73, 0x35, 0x32, 0x54
  }
*/

void setup()
{
  Serial.begin(SERIAL_BAUD);
  
  pinMode(STROBE, OUTPUT);      // is active LOW
  digitalWrite(STROBE, HIGH);   // set HIGH
   /*pinMode(ACK, INPUT);*/    // ACK not used
  pinMode(BUSY, INPUT);  

  pin[0] = 3;
  pin[1] = 4;
  pin[2] = 5;
  pin[3] = 6;
  pin[4] = 7;
  pin[5] = 8;
  pin[6] = 9;
  pin[7] = 10;
  
  for (uint8_t i = 0; i < 8; i++)
  {
    pinMode(pin[i], OUTPUT);
  }

  delay(1000);
  
  resetPrinter();
}

void loop()
{
  if (Serial.available() > 0)
  {
    // read the incoming byte
    incomingByte = Serial.read();
    
    // send to printer
    printByte(incomingByte);
  }
}

void printLine(char string[])
{
  for(int i = 0; i < strlen(string); i++)
  {  
    printByte(string[i]);
  }
 
  printByte(0xA); // new line
  printByte(0xD); // carriage return
}

void printByte(byte inByte)
{
  // wait for BUSY line to go low
  while(digitalRead(BUSY) == HIGH);

  for (uint8_t i = 0; i < 8; i++)
  {
    digitalWrite(pin[i], bitRead(inByte, i));    // direct port access will be faster
  }

  digitalWrite(STROBE, LOW);       // strobe STROBE to input data bits
  delayMicroseconds(STROBE_WAIT);
  digitalWrite(STROBE, HIGH);

  // wait for BUSY line to go low
  while(digitalRead(BUSY) == HIGH);
}

void resetPrinter()
{
  printByte(0x1B); // reset printer
  printByte('E');
}

 

Green
Offline
Зарегистрирован: 01.10.2015

В 22 не нагляднее ли пины вписать?
41-42, 84-85 поменять местами.
103 удалить.

psv1962
Offline
Зарегистрирован: 19.06.2019

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

не пойму, зачем тут Нано, наерна, чтоб патрахаца?  Замени ее на мамку с 4 пнём с авито, они счас как 2 Наны стоют и на них на всех LPT уже есть, и подключай свою Мегу к ней.  Там и дрова на принтер есть и сериал порт нормальный и печатать сможешь без бубна. 

psv1962
Offline
Зарегистрирован: 19.06.2019

Спасибо за конструктив.