Thermodrucker mit dem Arduino ansteuern

Es gibt verschiedene Anwendungen wo es Sinn macht, dass Daten ausgedruckt werden können. Dazu ist kein großer Drucker erforderlich, kompakte Thermodrucker ähnlich einem Kassenbon-Drucker eignen sich ganz hervorragend dafür.

Im Internet (z.B. bei Adafruit) kann man an verschiedenen Stellen einen günstigen Thermo-Drucker bestellen. Dieser Drucker entspricht einfachen Kassenbon-Drucker. Der Thermodrucker nimmt ein 2,55″ (57 mm) breites Thermopapier mit einem maximalen Rollendurchmesser von 1,5″ (39 mm) auf. Möglicherweise muss etwas Papier von diesen Rollen entfernen, damit es in den Drucker passt. Aber man kann immer das überschüssige Papier im Drucker verwenden, da kein “Kern” im Papier vorhanden sein muss, damit es eingezogen werden kann.

Die Rückseite meines Druckers hat zwei Anschlüsse; einen für die Stromversorgung und einen (5-poligen) für die serielle Kommunikation (Varianten die davon abweichen sind möglich). Der Thermodrucker wird mit einer Standard-Baudrate von 19200 Bit ausgeliefert. Wenn der Drucker in Verbindung mit einem Arduino verwendet werden soll, muß ein externes Netzteil (5V/2A) angeschlossen werden, da der Drucker mehr Strom aufnimmt, als USB liefern kann.

Rückseite mit Anschlussbildern des Thermodruckers

Ich habe den Drucker in ein einfaches Holzgehäuse eingebaut um erste Test durchführen zu können. Zum Test habe ich 3 der 5 Leitungen verwendet und zwar die blaue mit dem RX-Pin und die grüne mit dem TX-Pin am Arduino (näheres siehe im Quellcode). Ebenso wurde die schwarze Leitung mit GND am Arduino verbunden und natürlich die externe Stromversorgung des Druckers mit 5-9V. Wichtig ist noch auf die Baudrate zu achten. Hier gibt es 2 Versionen. Die 19200 und die 9600 Rate… je nach dem mit welcher der Drucker vorkonfiguriert wurde.

Ich habe den Drucker in ein einfaches Holzgehäuse eingebaut um erste Test durchführen zu können. Zum Test habe ich 3 der 5 Leitungen verwendet und zwar die blaue mit dem RX-Pin und die grüne mit dem TX-Pin am Arduino (näheres siehe im Quellcode). Ebenso wurde die schwarze Leitung mit GND am Arduino verbunden und natürlich die externe Stromversorgung des Druckers mit 5-9V. Wichtig ist noch auf die Baudrate zu achten. Hier gibt es 2 Versionen. Die 19200 und die 9600 Rate… je nach dem mit welcher der Drucker vorkonfiguriert wurde.

Ansteuerung

Um Daten an den Drucker zu übertragen, wird eine 5V TTL Verbindung aufgebaut. Bitte nicht verwechseln, mit der RS232 Schnittstelle eines PCs, die mit 10V arbeitet, damit würde man den Drucker zerstören.

Die Verwendung mit dem Arduino ist sehr einfach möglich, da Adafruit eine entsprechende Bibliothek entwickelt hat, die die Kommunikation mit dem Drucker sehr erleichtert. Die Bibliothek stellt folgende Funktionen bereit:

  • Inverted text: this is invoked by calling inverseOn() — you will get text that’s white-on-black instead of black-on-white. inverseOff() turns this off.
  • Double height: this makes text thats extra tall, call doubleHeightOn() — likewise, turn off with doubleHeightOff()
  • Left/Center/Right justified: this aligns text to the left or right edge of the page, or centered. You can set the alignment by calling justify(‘R’) (for right-justified), justify(‘C’) (for centered) or justify(‘L’) (for left-justified). Left-justified is the default state.
  • Bold text: makes it stand out a bit more, enable with boldOn() and turn off with boldOff()
  • Underlined text: makes it stand out a bit more, enable with underlineOn() and turn off with underlineOff()
  • Large/Medium/Small text: by default we use small, medium is twice as tall, large is twice as wide/tall. Set the size with setSize(‘L’)setSize(‘M’) or setSize(‘S’)
  • Line spacing: you can change the space between lines of text by calling setLineHeight() where numpix is the number of pixels. The minimum is 24 (no extra space between lines), the default spacing is 32, and double-spaced text would be 64.

Der erste Test erfolgte mit der Library von Adafruit und funktionierte nach einigem Drucken einwandfrei. Das Beispiel-Programm basiert auf dem das mit der Bibliothek mit geliefert wird. Ich habe es etwas modifiziert, da bei mir keine Bitmaps ausgedruckt werden sollen, sondern im wesentlichen Texte.

//==============================
// PH TestThermo Printer
//==============================
#include "Adafruit_Thermal.h"
#include "SoftwareSerial.h"

#define TX_PIN 6 // Arduino transmit  YELLOW WIRE  labeled RX on printer
#define RX_PIN 5 // Arduino receive   GREEN WIRE   labeled TX on printer

SoftwareSerial mySerial(RX_PIN, TX_PIN); // Declare SoftwareSerial obj first
Adafruit_Thermal printer(&mySerial);     // Pass addr to printer constructor

void setup() {
  mySerial.begin(9600);  // Initialize SoftwareSerial
  printer.begin();       // Init printer 

  // Test inverse on & off
  printer.inverseOn();   printer.println(F("Inverse ON"));
  printer.inverseOff();

  // Test character double-height on & off
  printer.doubleHeightOn(); printer.println(F("Double Height ON"));
  printer.doubleHeightOff();

  // Set text justification (right, center, left) 
  //-- accepts 'L', 'C', 'R'
  printer.justify('R');
  printer.println(F("Right justified"));
  printer.justify('C');
  printer.println(F("Center justified"));
  printer.justify('L');
  printer.println(F("Left justified"));

  // Test more styles
  printer.boldOn();
  printer.println(F("Bold text"));
  printer.boldOff();

  printer.underlineOn();
  printer.println(F("Underlined text"));
  printer.underlineOff();

  printer.setSize('L');   // Set type size, accepts 'S', 'M', 'L'
  printer.println(F("Large"));
  printer.setSize('M');
  printer.println(F("Medium"));
  printer.setSize('S');
  printer.println(F("Small"));

  printer.justify('C');
  printer.println(F("normal\nline\nspacing"));
  printer.setLineHeight(50);
  printer.println(F("Taller\nline\nspacing"));
  printer.setLineHeight(); // Reset to default
  printer.justify('L');

  printer.sleep();      // Tell printer to sleep
  delay(3000L);         // Sleep for 3 seconds
  printer.wake();       // MUST wake() before printing again, even if reset
  printer.setDefault(); // Restore printer to defaults
}

void loop() {}

Schreibe einen Kommentar