donderdag 18 augustus 2016

Subsystemen voor Zyptar: De bonnenprinter

Er rollen steeds meer onderdelen voor het Zyptar-project binnen. Ik ben nu bezig om alle deelsystemen aan de praat te krijgen.


Eén van die deelsystemen is een een bonnenprinter die een kaartje uitprint met een toekomstvoorspelling of horoscoop (of iets anders).


Ik heb de printer aan de Arduino Mega gekoppeld. De Arduino zit weer met een USB-kabel aan de computer. Hiermee kan ik een programma laden.


Zoals je ziet, zit er ook nog een labvoeding bij. Normaal voedt je de Arduino met de USB-kabel, maar deze printer trekt 1,5 Ampere (het is een thermische printer) en dat haalt USB niet.


Proefopstelling
Gisteravond lukt het me maar niet om de printer aan de praat te krijgen. Hij pruttelde een beetje maar er kwam geen print uit. En dat kwam dus omdat ik er een voeding van 0,8 Ampere aan had gehangen. Te weinig.... De labvoeding levert gelukkig 3 Ampere. Betekent wel dat ik nog een dikke voeding aan moet schaffen.


De printer heeft een seriële besturing, dit betekent dat hij aangesloten wordt met twee draadje, een zend-draad en een ontvangst-draad. Deze gaan naar twee digitale pinnen van de Arduino.


Nu heeft deze Arduino vier hardwarematige seriële poorten: Serial (de USB-aansluiting), Serial1, Serial2 en Serial3. Maar je kunt ook twee digitale pinnen van de Arduino softwarematig een seriële poort laten zijn. Ik kwam er achter dat je daar niet alle pinnen voor kunt gebruiken, want de lees-pin moet interrupts ondersteunen. Een interrupt betekent dat de processor een signaal krijgt wanneer de pin van spanning verandert. Je kunt alleen digitale pinnen 10, 11, 12, 13, 14, 15, 50, 51, 52 en 53 gebruiken (plus een aantal analoge pinnen).


Ik heb de printer aangesloten op Serial1, wat de pinnen 18 (TX) en 19 (RX) gebruikt. De T(ransmit) van de Arduino sluit je aan op de R(ead) van de printer en andersom. Ik hoef dan geen pinnen te specificeren, want die liggen hardwarematig vast.


Er is een demoprogrammaatje te downloaden om de printer te testen.



int heatTime = 80;
int heatInterval = 2;
char printDensity = 15;
char printBreakTime = 15;

void setup()
{
 Serial1.begin(19200); // to write to our new printer
}


void loop(){
 initPrinter();
 Serial1.println("Hallo Welt...");
 Serial1.write(10); //Sends the LF to the printer, advances the paper
 Serial1.write(10);
 Serial1.write(10);
 do { } while (1>0); // do nothing
}

void initPrinter()
{
 //Modify the print speed and heat
 Serial1.write(27);
 Serial1.write(55);
 Serial1.write(7); //Default 64 dots = 8*('7'+1)
 Serial1.write(heatTime); //Default 80 or 800us
 Serial1.write(heatInterval); //Default 2 or 20us
 //Modify the print density and timeout
 Serial1.write(18);
 Serial1.write(35);
 int printSetting = (printDensity<<4) | printBreakTime;
 Serial1.write(printSetting); //Combination of printDensity and printBreakTime
}


Kennelijk door een Duitser geschreven....


Resultaat
En ja hoor nu werkt de printer OK. In principe kan deze printer ook plaatjes en barcodes printen. Maar dat vergt wel wat meer programmeerkunst. Mogelijk ga ik dat wel doen om het kaartje er wat interessanter uit te laten zien. Maar dat is voor later. Ik weet nu dat ik printer kan laten werken, dus ik kan hem veilig inbouwen.


Het enige wat ik nog met deze printer moet doen is hem wat meer in "Zyptar-stijl" brengen. Dus een beetje meer versierd. Of moet ik zeggen protseriger? Het is wat lastig om hem goud te spuiten maar ik kan er wel een gouden lijstwerkje omheen maken.



Geen opmerkingen:

Een reactie plaatsen