Beschimpfungsdrucker nachbauen?

Der chaotische Hauptfaden

Moderatoren: Sven, TDI, Heaterman, Finger, duese

Benutzeravatar
Finger
Administrator
Beiträge: 4406
Registriert: Di 12. Jun 2012, 20:16
Kontaktdaten:

Re: Beschimpfungsdrucker nachbauen?

Beitrag von Finger » Di 2. Jun 2020, 18:52

Hier gibts schonmal ein Handbuch: https://download.epson-biz.com/modules/ ... t=3&pid=22
oder hier: https://www.bartec.de/de/downloads/mess ... Manual.pdf

Zumindest für die Dipschalter. Das netzteil nennt sich EPSON PS-170

Hier drin ist das Pinning der Schnittstelle beschrieben: https://files.support.epson.com/pdf/pos ... g_revb.pdf

Fuck, das ist tatsächlich die Parallelversion. Ist halt etwas mehr Aufwand, geht aber auch. Zum Netzteil hab ich noch nichts gefunden.....

Benutzeravatar
Harley
Beiträge: 838
Registriert: So 11. Aug 2013, 21:16
Wohnort: Regensburg

Re: Beschimpfungsdrucker nachbauen?

Beitrag von Harley » Di 2. Jun 2020, 18:54

Wo kann man denn die Beschimpfungsdatei downloaden?

Benutzeravatar
Zummmsel
Beiträge: 185
Registriert: Di 26. Mai 2020, 00:23
Wohnort: Südliches Tor zur Fränkischen
Kontaktdaten:

Re: Beschimpfungsdrucker nachbauen?

Beitrag von Zummmsel » Di 2. Jun 2020, 18:57

Schau mal weiter oben, als TXT-Anhang an meinem Beitrag

Benutzeravatar
Finger
Administrator
Beiträge: 4406
Registriert: Di 12. Jun 2012, 20:16
Kontaktdaten:

Re: Beschimpfungsdrucker nachbauen?

Beitrag von Finger » Di 2. Jun 2020, 18:59


Benutzeravatar
Harley
Beiträge: 838
Registriert: So 11. Aug 2013, 21:16
Wohnort: Regensburg

Re: Beschimpfungsdrucker nachbauen?

Beitrag von Harley » Di 2. Jun 2020, 19:16

Genau. Das sind die Richtigen! Danke! :mrgreen:

Benutzeravatar
xanakind
Beiträge: 5854
Registriert: So 11. Aug 2013, 21:55
Wohnort: in der nähe von Frankfurt/Main

Re: Beschimpfungsdrucker nachbauen?

Beitrag von xanakind » Di 2. Jun 2020, 19:20

Die Pinbelegung des Netzteilsteckern sollte sich relativ einfach ausmessen lassen.
Zuerst GND ausmessen, die anderen beiden sollten dann VCC sein.
Vorher aber mal die Leiterbahnen verfolgen ob das Sinn macht.

Benutzeravatar
Hansele
Beiträge: 2632
Registriert: So 11. Aug 2013, 15:15
Wohnort: Bw
Kontaktdaten:

Re: Beschimpfungsdrucker nachbauen?

Beitrag von Hansele » Di 2. Jun 2020, 19:39

Das Pinout habe ich gefunden, über dem etwas dünneren Pin ist GND und daneben +.

Wenn man von hinten auf die Buchse schaut ist links GND und rechts +.

Der Drucker lässt sich anschalten und auch das Papier wird gefördert,
eine Testseite kann der Möller offenbar nicht.

Benutzeravatar
Hansele
Beiträge: 2632
Registriert: So 11. Aug 2013, 15:15
Wohnort: Bw
Kontaktdaten:

Re: Beschimpfungsdrucker nachbauen?

Beitrag von Hansele » Di 2. Jun 2020, 19:58

Hier sieht es schonmal gut aus:
https://www.youtube.com/watch?v=yNPC8QJPuZ4

Die Musik ist fürchterlich, aber das sieht für mein Vorhaben ganz richtig aus,
die Platine von dem Kerl ist auch 25 Polig aber der Selbsttest sagt Serial.

Das ganze sieht man bei Minute 4:34 Minuten.

Mein Selbsttest (Feed-Taste gedrückt halten und einschalten) ist wie vermutet:
Bild

Mal sehen, wenn sich meine Belagerung auf den WAF auswirkt:
Bild


Hier hat jemand einen Drucker (kein Thermodrucker, sondern einen normalen) rangetüdelt:
https://forum.arduino.cc/index.php?topic=74776.0

Könnte es damit funktionieren?
Was meinen die Experten dazu?

Gruß Pascal

Benutzeravatar
Name vergessen
Beiträge: 2689
Registriert: Mo 12. Aug 2013, 19:47

Re: Beschimpfungsdrucker nachbauen?

Beitrag von Name vergessen » Di 2. Jun 2020, 20:16

Was steht denn an der "Telefonbuchse" neben dem Centronicsport dran? Im Handbuch liest es sich so, als gäbe es beide Anschlüsse, nur Ethernet wäre optional, und eine Beschreibung der Buchsen ist nicht im Handbuch?
Seriell gab es auch mit 25 poligem Dsub, aber ist schon ewig her...

MichelH
Beiträge: 1460
Registriert: Mi 6. Nov 2013, 19:49
Wohnort: Nord-West

Re: Beschimpfungsdrucker nachbauen?

Beitrag von MichelH » Di 2. Jun 2020, 20:20

Die kleine Buchse ist zum Anschluss einer Geldschublade. Die wird dann dadurch entriegelt

Benutzeravatar
Hansele
Beiträge: 2632
Registriert: So 11. Aug 2013, 15:15
Wohnort: Bw
Kontaktdaten:

Re: Beschimpfungsdrucker nachbauen?

Beitrag von Hansele » Di 2. Jun 2020, 20:21

Da steht DK, laut Anleitung ist das der Drawer-Kickout,
ich könnte somit nach der Beleidigung noch eine Kasse öffnen oder eine Arschtrittmaschine starten.

€dit für mich:

https://github.com/SilverGreen93/USB-Centronics

Benutzeravatar
Hansele
Beiträge: 2632
Registriert: So 11. Aug 2013, 15:15
Wohnort: Bw
Kontaktdaten:

Re: Beschimpfungsdrucker nachbauen?

Beitrag von Hansele » Mi 3. Jun 2020, 19:57

Heute wollte ich mal das hier testen:

https://forum.arduino.cc/index.php?topic=74776.0

Hier sah es noch knapp aber möglich aus:
Bild

Da ich die Leitungen von der Platine zu kurz gemacht habe,
war das eine ganz schöne Friemlei:
Bild

Leider sind die Drähtchen wieder aus dem Board gerutscht,
somit habe ich das für heute abgebrochen und versuche es morgen nochmals in Ruhe mit längeren Drähten...

Benutzeravatar
Name vergessen
Beiträge: 2689
Registriert: Mo 12. Aug 2013, 19:47

Re: Beschimpfungsdrucker nachbauen?

Beitrag von Name vergessen » Mi 3. Jun 2020, 23:10

Den Drucker einfach auf die andere Seite zu legen oder die Steckplatine auf irgendwas draufzustellen wäre nicht gegangen? ;)

Benutzeravatar
Hansele
Beiträge: 2632
Registriert: So 11. Aug 2013, 15:15
Wohnort: Bw
Kontaktdaten:

Re: Beschimpfungsdrucker nachbauen?

Beitrag von Hansele » Do 4. Jun 2020, 19:52

Ja war gestern alles zu einfach :-).

Man will noch kurz was machen, hat aber eigentlich gar keine Zeit dafür,
dann reicht die Zeit dennoch und man verbockts halt doch wieder.

Daher lieber einen Schritt zurück und nochmals vorne mit passender Zeit-/Materialplanung ;-).

Der Kübel druckt:
Bild

Code: Alles auswählen

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 pin# = arduino pin#
const int nStrobe = 2;
const int data_0 = 3;
const int data_1 = 4;
const int data_2 = 5;
const int data_3 = 6;
const int data_4 = 7;
const int data_5 = 8;
const int data_6 = 9;
const int data_7 = 10;
const int nAck = 11;
const int busy = 12;

const int strobeWait = 2;   // microseconds to strobe for


void setup() {
  Serial.begin(9600);

  pinMode(nStrobe, OUTPUT);      // is active LOW
  digitalWrite(nStrobe, HIGH);   // 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);   // analog pin 0 on duemilanove and uno
  digitalWrite(14, HIGH); // enable pull-up
 
  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);
}





Jetzt kann ich weiter forschen um diese Punkte zu klären:
- Drucker das Papier abschneiden beibringen
- Drucker einen zufälligen Text ausgeben lassen, anhand einer TXT Datei oder so?

Mal schauen wie es weiter geht, der wichtigste Schritt ist jedenfalls gemacht :-).

Grüßle Pascal


€dit:
Das hier habe ich zum Thema Cut in der Anleitung gefunden, wie bekomme ich das in meinen Code?
Und wohin damit?
Bild

Online
andreas6
Beiträge: 2573
Registriert: So 11. Aug 2013, 15:09

Re: Beschimpfungsdrucker nachbauen?

Beitrag von andreas6 » Do 4. Jun 2020, 20:15

Das Schneiden sollte nach dem Ausdruck erfolgen. Es wird entweder direkt nach dem Ausdruck geschnitten (m=1 oder 49), oder mit wählbarem Abstand (m=66, n=Abstand). Die Anleitung ist insofern Murks, als dass das Format von m und n nicht benannt ist, Du musst es probieren. Da es für alle Zahlenformate gleich dargestellt ist, wird es definitiv falsch sein und nur für ein Format passen. Eine typisch miserable Anleitung, von denen ich schon zu viele lesen durfte. Viel Erfolg...

MfG. Andreas

Online
thinkpad
Beiträge: 551
Registriert: Fr 6. Feb 2015, 16:53
Wohnort: Rhein Neckar

Re: Beschimpfungsdrucker nachbauen?

Beitrag von thinkpad » Fr 5. Jun 2020, 10:58

ich hab noch einen Epson 88 in Seriell.
der soll auch mal Beschimpfungen drucken, oder Witze.

Epson Bon Drucker brauchen einen Steuerbefehl damit das Messer abschneidet.
Ist bei Epson POS dokumentiert.

Benutzeravatar
Hansele
Beiträge: 2632
Registriert: So 11. Aug 2013, 15:15
Wohnort: Bw
Kontaktdaten:

Re: Beschimpfungsdrucker nachbauen?

Beitrag von Hansele » Fr 5. Jun 2020, 11:54

Ja da findet sich doch ruckzuck was "passendes":
https://reference.epson-biz.com/modules ... tent_id=72


Hier ist der Cut-Befehl zu finden:

https://reference.epson-biz.com/modules ... tent_id=87

Aber wie ich das in meinen Code bekomme ist mir noch total schleierhaft.

Auch scheint der Sketch den ich verwende extrem Speicherhungrig zu sein,
denn viel Text kann ich da nicht reinpacken.


Wenn du mit dem Cut Befehl weiter kommst, wäre es super,
wenn du es hier posten würdest.

Grüßle Pascal

Online
andreas6
Beiträge: 2573
Registriert: So 11. Aug 2013, 15:09

Re: Beschimpfungsdrucker nachbauen?

Beitrag von andreas6 » Fr 5. Jun 2020, 12:29

Die Anleitung auf der Webseite legt nahe, dass es sich bei m und n um Dezimalwerte handelt. Probiere erst man den einfachen Schnitt aus. Das sind simple Textzeichen, die zum Drucker geschickt werden. Mit PrintByte() kannst Du die Zeichen übertragen, in Deinem Code findest Du schon Beispiele dazu.

MfG. Andreas

Benutzeravatar
Hansele
Beiträge: 2632
Registriert: So 11. Aug 2013, 15:15
Wohnort: Bw
Kontaktdaten:

Re: Beschimpfungsdrucker nachbauen?

Beitrag von Hansele » Fr 5. Jun 2020, 14:31

const int startup_charsPerLine = 80; definiert die Anzahl Zeichen je Zeile auf 80
const int startup_num_lines = 2; Anzahl der Zeilen der Startnachricht
byte startup_message[startup_num_lines][startup_charsPerLine] = { "startup_message = Name der Variable für den Druck // {=Beginn der Nachricht?
"This is the startup message. It prints whenever", Zeile 1 Startnachricht
"the Arduino is reset.", Zeile 2 Startnachricht
}; } Ende der Nachricht?

const int charsPerLine = 80; // this is the max # of chars per line maximal 80 Zeichen je Zeile wie oben
const int num_lines = 10; Anzahl Zeilen für Pin A0 auf GND Druckausgabe
byte message[num_lines][charsPerLine] = { "message" ist der Name der Variable die später für den Druck aufgerufen wird?
" ", // 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 pin# = arduino pin#
const int nStrobe = 2;
const int data_0 = 3;
const int data_1 = 4;
const int data_2 = 5;
const int data_3 = 6;
const int data_4 = 7;
const int data_5 = 8;
const int data_6 = 9;
const int data_7 = 10;
const int nAck = 11;
const int busy = 12;

const int strobeWait = 2; // microseconds to strobe for


void setup() {
Serial.begin(9600);

pinMode(nStrobe, OUTPUT); // is active LOW
digitalWrite(nStrobe, HIGH); // 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); // analog pin 0 on duemilanove and uno
digitalWrite(14, HIGH); // enable pull-up

delay(1000);

resetPrinter();

printStartupMessage(); Aufruf Druckbefehl für Startdruck

resetPrinter();

Serial.println("Delay for 5 sec"); Ausgabe Serielle Schnittstelle Log?
delay(5000); Wartezeit 5 Sekunden, bis der nächste Resetbefehl kommen darf?

Serial.println("Startup complete"); Ausgabe Serielle Schnittstelle Log?
}

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..."); Ausgabe Serielle Schnittstelle Log?
printByte(27); // reset printer 27= setzt den Drucker tatsächlich zurück?
printByte('E'); ?
Serial.println("Printer Reset"); Ausgabe Serielle Schnittstelle Log?
}

void printMessage() {
digitalWrite(13, HIGH);
for(int line = 0; line < num_lines; line++) { legt die Zeile 1 als Zeile 0 fest und gibt die Addition der nächsten Zeilen vor?
for(int cursorPosition = 0; cursorPosition < charsPerLine; cursorPosition++) {
byte character = message[line][cursorPosition]; Variable "message" wird aufgerufen
printByte(character);
delay(1);
}
printByte(10); // new line ?
printByte(13); // carriage return ?
}
digitalWrite(13,LOW);
}

void printStartupMessage() {
Serial.println("Print start-up mssage"); Ausgabe der Seriellen Schnittstelle, als Log?
digitalWrite(13, HIGH);
for(int line = 0; line < startup_num_lines; line++) {
for(int cursorPosition = 0; cursorPosition < startup_charsPerLine; cursorPosition++) { was bedeutet das cursorPosition?
byte character = startup_message[line][cursorPosition]; Variable "startup_message" wird aufgerufen
printByte(character);
// delay(1);
}
printByte(10); // new line
printByte(13); // carriage return
Serial.print("Line "); Ausgabe Serielle Schnittstelle Log, Line ist der Text der ausgegeben wird
Serial.print(line); Ausgabe Serielle Schnittstelle Log, "line" die Zahl der Zeile?
Serial.println(" printed."); Ausgabe Serielle Schnittstelle Log?
}
Serial.println("Startup message printed"); Ausgabe Serielle Schnittstelle Log?
digitalWrite(13,LOW);
}





------------------------------------------------------------------------------------
Ich habe mal versucht den Code/Sketch zu kommentieren, mit dem was ich zum Teil meine wofür das gut sein soll.



@andreas6:
Ich bin dafür glaub echt zu doof, bzw. einfach noch zu weit weg von dem ganzen Thema,
ich habe das vorhin einfach mal versucht. Das einzige was ich hinbekommen habe war,
dass vor meinem Text eine Zahl/Buchstabe vorne angestellt wurde.

Kannst du mir sagen wo ich das einfügen müsste und wie es genau aussehen müsste?




Jetzt geht´s erstmal mit dem Sohnemann spazieren, so kann man nicht arbeiten mit einem schreiendem Baby :-)

Gruß Pascal

Anse
Beiträge: 1570
Registriert: Mo 12. Aug 2013, 21:30
Wohnort: Bühl

Re: Beschimpfungsdrucker nachbauen?

Beitrag von Anse » Fr 5. Jun 2020, 15:05

Setzt den Code bitte in die Code Tags

Code: Alles auswählen

Beispiel

Online
andreas6
Beiträge: 2573
Registriert: So 11. Aug 2013, 15:09

Re: Beschimpfungsdrucker nachbauen?

Beitrag von andreas6 » Fr 5. Jun 2020, 15:42

Davon abgesehen, ist das ein Beispielprogramm. Es soll zeigen, was dort möglich ist und wie man es macht. So etwas passt man behutsam an und vermerkt sich auch die Änderungen, erzeugt sozusagen neue Versionen und testet die aus. Eigene Kommentare sind ganz wichtig, damit man Jahre später auch noch was damit anfangen kann. Wesentlich leichter fällt der Umgang damit, wenn man einen Editor für Programmierer benutzt, der auch mit Einrückungen und Schlüsselworten umgehen kann. Ich nutze gewöhnlich Programmers Notepad und selten mal Notepad++ (das kann auch hex). Das Verstehen des Programms wird Dir keiner abnehmen können, da musst Du selber durch. Dann werden Dir auch Änderungen leichter fallen.

MfG. Andreas

berlinerbaer
Beiträge: 867
Registriert: Di 22. Aug 2017, 05:19
Wohnort: Berlin

Re: Beschimpfungsdrucker nachbauen?

Beitrag von berlinerbaer » Fr 5. Jun 2020, 23:38

Hansele hat geschrieben:
Di 2. Jun 2020, 18:36
Heute ist mein Spielzeug gekommen, in der schönsten Gilbfarbe überhaupt:
Bild
Wenn Dich der Gilb stört, such mal nach retrobrite, da gibts jede Menge dazu im Netz.

TL;DR: H2O2 + UV
Ich muss mal schauen, wir ich am sinnvollsten die Textdatei einbinde......
Kein Problem, dafür gibt es wahlweise EEPROMs oder SD-Karten-Module:

256kB:
https://www.aliexpress.com/item/32837253262.html
Datasheet: http://ww1.microchip.com/downloads/en/d ... oc0670.pdf

SD:
https://www.aliexpress.com/item/2046499166.html

Benutzeravatar
Hansele
Beiträge: 2632
Registriert: So 11. Aug 2013, 15:15
Wohnort: Bw
Kontaktdaten:

Re: Beschimpfungsdrucker nachbauen?

Beitrag von Hansele » Sa 6. Jun 2020, 09:49

Hallo zusammen,

SD-Karte wäre glaub das richtige, dann kann ich einfach die Funktion austauschen,
mal Beschimpfungen, mal Komplimente, mal Trinksprüche, etc. :-)

Aber dafür es ist noch zu früh.


Gestern Abend habe ich noch mit dem printByte Befehlen gespielt,
der Drucker hat doch tatsächlich geschnitten.
Der Text wird noch abgeschnitten (erster Buchstabe und das Ende) und seltsam formatiert,
aber er druckt und schneidet, dass freut mich schonmal :-).

Bild

Code gesamt:

Code: Alles auswählen

const int charsPerLine = 80;   // this is the max # of chars per line
const int num_lines = 1;
byte message[num_lines][charsPerLine] = {

// "    ",   // blank line
" Als Kind hat dir doch Deine Mutter ein Kotelett umgehängt, damit wenigstens der Hund mit dir spielt!",
// "    ",   // blank line
//"------------------------------------------------------------------------------",   // a spiffy line
};



// parallel port pin# = arduino pin#
const int nStrobe = 2;
const int data_0 = 3;
const int data_1 = 4;
const int data_2 = 5;
const int data_3 = 6;
const int data_4 = 7;
const int data_5 = 8;
const int data_6 = 9;
const int data_7 = 10;
const int nAck = 11;
const int busy = 12;

const int strobeWait = 2;   // microseconds to strobe for


void setup() {
  Serial.begin(9600);

  pinMode(nStrobe, OUTPUT);      // is active LOW
  digitalWrite(nStrobe, HIGH);   // 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);   // analog pin 0 on duemilanove and uno
  digitalWrite(14, HIGH); // enable pull-up
 
  delay(1000);
 
  resetPrinter(); 
  Serial.println("Delay for 5 sec");
  delay(5000);
  Serial.println("Startup complete");
}

void loop() {
while(digitalRead(14) == HIGH) {
   // wait
}

  resetPrinter();

  printMessage();  // Druckausgabe aktiv
  delay(1000);
  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
  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
    printByte(0x1D); // cut befehl = 29 als Zahl
    printByte('V'); // cut befehl
    printByte(66); // cut befehl

  }
  digitalWrite(13,LOW);
}
Das passiert im Seriellen Monitor:

Code: Alles auswählen

09:37:18.082 -> Reseting printer...
09:37:18.082 -> Printer Reset
09:37:18.082 -> Delay for 5 sec
09:37:23.055 -> Startup complete  
09:37:30.363 -> Reseting printer...  --> A0 auf GND gezogen
09:37:30.363 -> Printer Reset
09:37:31.448 -> Reseting printer...
09:37:31.448 -> Printer Reset

Diese 3 printByte Befehle haben den Drucker zum schneiden gebracht:

Code: Alles auswählen

   
 printByte(0x1D); // cut befehl = 29 als Zahl
    printByte('V'); // cut befehl
    printByte(66); // cut befehl

Leider wird der Text nicht richtig gedruckt:
Bild




Kann mir jemand die genaue Funktion (steht am Anfang des Codes) dieses Schnipsels erklären?
const int, sind nach meinem Verständnis feste Werte, was aber ja in meinem Fall falsch ist, da die Werte nicht feststehen?
Es könnte ja ein kürzerer oder längerer Text kommen?

Code: Alles auswählen

const int charsPerLine = 80;   // this is the max # of chars per line
const int num_lines = 1;
byte message[num_lines][charsPerLine] = {
Hier stehe ich auf auf dem Schlauch:

Code: Alles auswählen

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);

Gruß Pascal

j.o.e
Beiträge: 70
Registriert: Fr 29. Nov 2019, 01:15

Re: Beschimpfungsdrucker nachbauen?

Beitrag von j.o.e » Sa 6. Jun 2020, 15:23

printByte sieht nach Paralleldrucker aus, ebenso wie der Centronics-Stecker an deinem Spielzeug - aber das nur am Rande.


Strings in C (C++) sind null-terminiert.

Das Ganze erst mal für eine Message:

Code: Alles auswählen

char * message = "Hello World!";

byte character;
int i = 0;

while ((character = message[i]) != '\0') {
   i++;
   printf("%c", character);
}
Würde ich aber in eine Funktion packen, z.B. printString und den Pointer übergeben ...

Code: Alles auswählen

while ((character = message[i]) != '\0') {
   i++;
   ....
}
lässt sich zusammenfassen zu

Code: Alles auswählen

while ((character = message[i++]) != '\0') {
  ....
}
Edith meinte: Centronics schreibt sich so ...
FYI: https://www.c64-wiki.de/wiki/Centronics-Schnittstelle - mal was aus "der guten alten Zeit".
HANDSHAKE: https://www.cfd.tu-berlin.de/Lehre/EDV1 ... de164.html

Benutzeravatar
MatthiasK
Beiträge: 1095
Registriert: Mo 19. Aug 2013, 22:12

Re: Beschimpfungsdrucker nachbauen?

Beitrag von MatthiasK » Sa 6. Jun 2020, 23:43

Nachdem ich hier dauernd von so Druckern lesen muss, habe ich mal meinen Thermopapierdrucker rausgekramt, den ich im Winter auf nem Flohmarkt gekauft hatte. Jetzt muss ich auch mal damit was bauen.

Mein Drucker RS232, Ethernet und USB. Auf der Unterseite sind noch ein paar Dip-Schalter hinter einer Abdeckung. Typenbezeichnung - öh ja, die steht hoffentlich unter dem Aufkleber, nicht auf dem fehlenden Gehäuseteil.

Hinten hat der so einen Stecker, wie die Metcal PS-900 für den Lötkolben:
https://res.cloudinary.com/iwh/image/up ... PS-900.jpg
Irgendwas mit 24V/5A habe ich dazu im Kopf. Kennt jemand die Typenbezeichnung und eine Bezugsquelle (außer Lötkolben abschneiden)?

Antworten