Beschimpfungsdrucker nachbauen?

Der chaotische Hauptfaden

Moderatoren: Heaterman, Finger, Sven, TDI, Marsupilami72, duese

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

Re: Beschimpfungsdrucker nachbauen?

Beitrag von Finger »

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: 1160
Registriert: So 11. Aug 2013, 21:16
Wohnort: Regensburg

Re: Beschimpfungsdrucker nachbauen?

Beitrag von Harley »

Wo kann man denn die Beschimpfungsdatei downloaden?
Benutzeravatar
Zummmsel
Beiträge: 650
Registriert: Di 26. Mai 2020, 00:23
Wohnort: Südliches Tor zur Fränkischen
Kontaktdaten:

Re: Beschimpfungsdrucker nachbauen?

Beitrag von Zummmsel »

Schau mal weiter oben, als TXT-Anhang an meinem Beitrag
Benutzeravatar
Finger
Administrator
Beiträge: 7447
Registriert: Di 12. Jun 2012, 20:16
Kontaktdaten:

Re: Beschimpfungsdrucker nachbauen?

Beitrag von Finger »

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

Re: Beschimpfungsdrucker nachbauen?

Beitrag von Harley »

Genau. Das sind die Richtigen! Danke! :mrgreen:
xanakind
Beiträge: 12592
Registriert: So 11. Aug 2013, 21:55

Re: Beschimpfungsdrucker nachbauen?

Beitrag von xanakind »

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: 3741
Registriert: So 11. Aug 2013, 15:15
Wohnort: Bw
Kontaktdaten:

Re: Beschimpfungsdrucker nachbauen?

Beitrag von Hansele »

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: 3741
Registriert: So 11. Aug 2013, 15:15
Wohnort: Bw
Kontaktdaten:

Re: Beschimpfungsdrucker nachbauen?

Beitrag von Hansele »

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
Name vergessen
Beiträge: 3261
Registriert: Mo 12. Aug 2013, 19:47

Re: Beschimpfungsdrucker nachbauen?

Beitrag von Name vergessen »

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...
Benutzeravatar
MichelH
Beiträge: 1732
Registriert: Mi 6. Nov 2013, 19:49
Wohnort: Nord-West

Re: Beschimpfungsdrucker nachbauen?

Beitrag von MichelH »

Die kleine Buchse ist zum Anschluss einer Geldschublade. Die wird dann dadurch entriegelt
Benutzeravatar
Hansele
Beiträge: 3741
Registriert: So 11. Aug 2013, 15:15
Wohnort: Bw
Kontaktdaten:

Re: Beschimpfungsdrucker nachbauen?

Beitrag von Hansele »

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: 3741
Registriert: So 11. Aug 2013, 15:15
Wohnort: Bw
Kontaktdaten:

Re: Beschimpfungsdrucker nachbauen?

Beitrag von Hansele »

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...
Name vergessen
Beiträge: 3261
Registriert: Mo 12. Aug 2013, 19:47

Re: Beschimpfungsdrucker nachbauen?

Beitrag von Name vergessen »

Den Drucker einfach auf die andere Seite zu legen oder die Steckplatine auf irgendwas draufzustellen wäre nicht gegangen? ;)
Benutzeravatar
Hansele
Beiträge: 3741
Registriert: So 11. Aug 2013, 15:15
Wohnort: Bw
Kontaktdaten:

Re: Beschimpfungsdrucker nachbauen?

Beitrag von Hansele »

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
andreas6
Beiträge: 4152
Registriert: So 11. Aug 2013, 15:09

Re: Beschimpfungsdrucker nachbauen?

Beitrag von andreas6 »

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
thinkpad
Beiträge: 847
Registriert: Fr 6. Feb 2015, 16:53
Wohnort: Rhein Neckar

Re: Beschimpfungsdrucker nachbauen?

Beitrag von thinkpad »

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: 3741
Registriert: So 11. Aug 2013, 15:15
Wohnort: Bw
Kontaktdaten:

Re: Beschimpfungsdrucker nachbauen?

Beitrag von Hansele »

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
andreas6
Beiträge: 4152
Registriert: So 11. Aug 2013, 15:09

Re: Beschimpfungsdrucker nachbauen?

Beitrag von andreas6 »

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: 3741
Registriert: So 11. Aug 2013, 15:15
Wohnort: Bw
Kontaktdaten:

Re: Beschimpfungsdrucker nachbauen?

Beitrag von Hansele »

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: 2304
Registriert: Mo 12. Aug 2013, 21:30
Wohnort: Bühl (Baden)

Re: Beschimpfungsdrucker nachbauen?

Beitrag von Anse »

Setzt den Code bitte in die Code Tags

Code: Alles auswählen

Beispiel
andreas6
Beiträge: 4152
Registriert: So 11. Aug 2013, 15:09

Re: Beschimpfungsdrucker nachbauen?

Beitrag von andreas6 »

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: 1063
Registriert: Di 22. Aug 2017, 05:19
Wohnort: Berlin

Re: Beschimpfungsdrucker nachbauen?

Beitrag von berlinerbaer »

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: 3741
Registriert: So 11. Aug 2013, 15:15
Wohnort: Bw
Kontaktdaten:

Re: Beschimpfungsdrucker nachbauen?

Beitrag von Hansele »

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: 550
Registriert: Fr 29. Nov 2019, 01:15

Re: Beschimpfungsdrucker nachbauen?

Beitrag von j.o.e »

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: 3011
Registriert: Mo 19. Aug 2013, 22:12

Re: Beschimpfungsdrucker nachbauen?

Beitrag von MatthiasK »

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)?
Benutzeravatar
RMK
Beiträge: 5400
Registriert: Di 20. Jan 2015, 14:59
Wohnort: östlich von Stuttgart

Re: Beschimpfungsdrucker nachbauen?

Beitrag von RMK »

hmmm, kann man dafür irgendwie einen (USB...)-Dymo Labelwriter 400 benutzen?

dann könnt man sogar Beschimpfungsaufkleber drucken (und ich hab hier so ein Teil stehen,
das ist der Hauptgrund... ähem. :) )

jemand ne Idee?
berlinerbaer
Beiträge: 1063
Registriert: Di 22. Aug 2017, 05:19
Wohnort: Berlin

Re: Beschimpfungsdrucker nachbauen?

Beitrag von berlinerbaer »

Das wird unverhältnismäßig sportlich, USB-host aufm Mikrocontroller. Am ehesten würde sich da wohl ein olles smartphone eignen, aber es gibt natürlich auch muskulösere Mikro-Controller, die das können.

Ich würd' das Ding aufmachen und gucken, wo aus dem USB2serial-chip das serielle Signal rausfällt und da einen Arduino anflanschen.

Als nächstes musst Du dann noch die Geschwindigkeit rausfinden (9600-19200 sind gute Kandidaten, entweder mit XON/XOFF oder hardware handshake), das Protokoll herausfinden (ausprobieren (einfach mal ASCII draufschmeißen), Doku auftreiben oder logic-Analyser während Du vom Computer drauf druckst).
Benutzeravatar
Fritzler
Beiträge: 12597
Registriert: So 11. Aug 2013, 19:42
Wohnort: D:/Berlin/Adlershof/Technologiepark
Kontaktdaten:

Re: Beschimpfungsdrucker nachbauen?

Beitrag von Fritzler »

berlinerbaer hat geschrieben: So 7. Jun 2020, 01:13 Das wird unverhältnismäßig sportlich, USB-host aufm Mikrocontroller.
Nö, STM32 haben das eingebaut.
Nur der ST Cube HAL Treiber ist maximal besch*ssen.

Meine E-Last kann daher aufn USB Stick loggen ;)
Benutzeravatar
Hansele
Beiträge: 3741
Registriert: So 11. Aug 2013, 15:15
Wohnort: Bw
Kontaktdaten:

Re: Beschimpfungsdrucker nachbauen?

Beitrag von Hansele »

Hallo zusammen,

mittlerweile habe ich es (mit Hilfe, vielen Dank nochmals!) hinbekommen,
dass der Drucker einen Text (steht alleine und fest im Code) druckt und den Zettel abschneidet.

Bild

Das Problem mit den vielen Leerzeichen beim ausdrucken, kann ich mir nicht erklären,
als ich die Verkabelung nochmals nachgesteckt habe, sahen die Ausdrucke gut aus:
(vermutlich hat das Breadboard eine Macke :-()
Bild

aktueller Code:

Code: Alles auswählen

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

"Wenn mein Hund Dein Gesicht haette wuerde ich ihm den Arsch rasieren und ihm beibringen rueckwaerts zu laufen !!!!"
};


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

}

void loop() {
while(digitalRead(14) == HIGH) {}
  printMessage();  // Druckausgabe aktiv
  abschneiden();  // aktiviert cutter
  delay(500);

}

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 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);
    }
  }
  digitalWrite(13,LOW);
}

void abschneiden()
{
 // const char schnipp = "\n\r\x1dVB" ;
 // printByte(schnipp);
   
    printByte(10); // new line
    printByte(13); // carriage return
    printByte(10); // new line
    printByte(0x1D); // cut befehl = 29 als Zahl
    printByte('V'); // cut befehl
    printByte(66); // cut befehl    
    printByte(27); // reset printer
 
}
Wegen der SD-karte habe ich nun das hier bestellt, auf China mag ich jetzt nicht warten:
https://www.amazon.de/gp/product/B06XHJTGGC/


Nächste Schritte:
- versuchen mehr Texte einzubinden und einen davon zufällig auszudrucken, wenn der Taster gedrückt wird

Schritte danach:
- SD-Karten Modul verdrahten und Karte einbinden (geht das überhaupt noch, digitale Pins belegt D2-D12?)
-- Texte darauf ablegen und im Code verarbeiten
- Layout für Bons erzeugen (Überschrift, Formatierung)
- ggf. Statistik (Anzahl, Uhrzeit, Datum, etc.)


Wenn das alles klappt, bin ich schon dermaßen zufrieden, dass der Benzinkanister und die Streichhölzer wohl nicht mehr zum Einsatz kommen ;-).

Gruß Pascal
sysconsol
Beiträge: 4059
Registriert: Fr 8. Jul 2016, 17:22

Re: Beschimpfungsdrucker nachbauen?

Beitrag von sysconsol »

Fritzler hat geschrieben: So 7. Jun 2020, 11:40 Meine E-Last kann daher aufn USB Stick loggen
Zum USB-Stift lesen/schreiben dürfte es sogar IC geben, die mit dem µC per RS232 sprechen und auf dem FAT-formatierten USB-Speicher Textdateien erwarten.

Mir dünkt, sowas hat mit mal jemand zugespielt.
Benutzeravatar
Fritzler
Beiträge: 12597
Registriert: So 11. Aug 2013, 19:42
Wohnort: D:/Berlin/Adlershof/Technologiepark
Kontaktdaten:

Re: Beschimpfungsdrucker nachbauen?

Beitrag von Fritzler »

sysconsol hat geschrieben: Mo 8. Jun 2020, 13:48 Zum USB-Stift lesen/schreiben dürfte es sogar IC geben, die mit dem µC per RS232 sprechen und auf dem FAT-formatierten USB-Speicher Textdateien erwarten.
War glaube son USB Host IC von FTDI.
Aber diese Firma sollte man nach deren Treibergebahren eh nicht mehr verbauen.
sysconsol
Beiträge: 4059
Registriert: Fr 8. Jul 2016, 17:22

Re: Beschimpfungsdrucker nachbauen?

Beitrag von sysconsol »

Fast.
CH376S

Und wer bei Amazon bestellt kann auch FTDI verbauen (gehört aber nicht hier her...).
j.o.e
Beiträge: 550
Registriert: Fr 29. Nov 2019, 01:15

Re: Beschimpfungsdrucker nachbauen?

Beitrag von j.o.e »

Howdy!
Hansele hat geschrieben: So 7. Jun 2020, 21:06 - SD-Karten Modul verdrahten und Karte einbinden (geht das überhaupt noch, digitale Pins belegt D2-D12?)
[/quote

A0 .. A5 sind noch frei?

SD-Karten werden imho per SPI angeschlossen. Das belegt:
MOSI - pin 11 on Arduino Uno
MISO - pin 12
CLK - pin 13
CS - da tuts glaub irgendwas

Mach halt mal eine Aufstellung was womit belegt ist.

Im Notfall: Ein etwas größerer Arduino kostet nich die Welt

Grüße
-J
Zuletzt geändert von j.o.e am Di 9. Jun 2020, 20:00, insgesamt 1-mal geändert.
Benutzeravatar
Fritzler
Beiträge: 12597
Registriert: So 11. Aug 2013, 19:42
Wohnort: D:/Berlin/Adlershof/Technologiepark
Kontaktdaten:

Re: Beschimpfungsdrucker nachbauen?

Beitrag von Fritzler »

sysconsol hat geschrieben: Mo 8. Jun 2020, 20:44 Fast.
CH376S
Durchaus interessant was die Chinesen da wieder fabrizieren.
sysconsol hat geschrieben: Mo 8. Jun 2020, 20:44 Und wer bei Amazon bestellt kann auch FTDI verbauen
Hatte ich ja eigentlich auch nicht nicht vor :mrgreen:
Oder wo bekomme ich noch nen raaco 8x4 und die Einlagen extra?
Antworten