ORANGE picoにはシリアルポート経由で印刷することができる。
公式ショップで買ったプリンタは小さくていいのだが、その分印刷の幅が狭かったり感熱紙ロールが短かったりする。
それではとポケコン用に買ったプリンタ(TM-T88IV)につながらないかと思い、秋月電子のAE-ATMEGA-328 MINIを使ってシリアルからパラレルへの変換するのを作った。
AE-ATMEGA-328 MINIは5V動作で、ORANGE picoは3.3Vで動作している。
多分なくても動作するかもしれないが、念のためレベル変換用に秋月の4ビット双方向ロジックレベル変換モジュールを使っている。
実際印刷してみたところ。
右の写真は、TM-T88IVと小型のプリンタの印刷結果を比較したところ。
やはり幅が広い分若干見やすくなっている。
しかし、いずれの場合もlptコマンド実行時にゴミが印字されるみたいだ。
気が向いたらTeraTermでバイナリログ取ってみるかな。
下はArduinoのスケッチ。
ESC/POSで言語の初期化ON/OFFのほか、CR(0x0d)をLF(0x0a)に変換する処理を入れてある。
これは、ORANGE picoが印刷時の改行コードがCR(0x0d)なのに対して、プリンタ(TM-T88IV)はLF(0x0a)で改行するようになっているため。
TM-T88IVのディップスイッチでCR(0x0d)で改行できるように変更できるが、そうするとこんどはポケコンで印字した時に二重に改行されてしまうので、いちいちプリンタ側で設定変更をしなくていいように変換器側で変換できるようにした。
調べてみるとCR,LFの解釈のしかたはどうもプリンタごとに違うようだ。
// serial to printer interface // 2019.2.23 // printer interface const int Pstrb = 2; // Printer STROBE const int PD0out = 3; // Printer D0 const int PD1out = 4; // Printer D1 const int PD2out = 5; // Printer D2 const int PD3out = 6; // Printer D3 const int PD4out = 7; // Printer D4 const int PD5out = 8; // Printer D5 const int PD6out = 9; // Printer D6 const int PD7out = 10; // Printer D7 const int Pbusy = 11; // Printer BUSY // other port const int LEDout = 13; // LED const int DIP4 = 14; // DIP SW 4 const int DIP3 = 15; // DIP SW 3 const int DIP2 = 16; // DIP SW 2 CR(0x0d) -> LF(0x0a) const int DIP1 = 17; // DIP SW 1 ESC/POS init //////////////////////////////////////// void setup() { // Serial port 9600BPS Serial.begin(9600); // Printer interface set pinMode(PD0out, OUTPUT); pinMode(PD1out, OUTPUT); pinMode(PD2out, OUTPUT); pinMode(PD3out, OUTPUT); pinMode(PD4out, OUTPUT); pinMode(PD5out, OUTPUT); pinMode(PD6out, OUTPUT); pinMode(PD7out, OUTPUT); pinMode(Pstrb, OUTPUT); pinMode(Pbusy, INPUT); // Pbusy pull up digitalWrite(Pbusy, HIGH); // LED pinMode(LEDout, OUTPUT); digitalWrite(LEDout, HIGH); // DIP sw pinMode(DIP1, INPUT); pinMode(DIP2, INPUT); pinMode(DIP3, INPUT); pinMode(DIP4, INPUT); digitalWrite(DIP1, HIGH); digitalWrite(DIP2, HIGH); digitalWrite(DIP3, HIGH); digitalWrite(DIP4, HIGH); // ESC/POS printer init if (digitalRead(DIP1) == LOW ){ PRTinit(); } } //////////////////////////////////////// void loop() { int input; // read serial input = Serial.read(); if(input != -1 ){ // DIP SW 2 CR(0x0d) -> LF(0x0a) if (digitalRead(DIP2) == LOW && input == 0x0d){ input = 0x0a; } // out parallel praout((byte)input); } } // Ende loop //////////////////////////////////////// // init ESC/POS printer caractor set to Jananese void PRTinit() { // init print char set // ESC t n : Select international character set praout(0x1b); // ESC praout(0x74); // t praout(0x01); // 1:Katakana // ESC R n : Select character code table praout(0x1b); // ESC praout(0x52); // R praout(0x08); // 8:Japan delay(1); } //////////////////////////////////////// // Parallel Printer interface void praout(byte POdata) { int PrtBusy; // wait busy low digitalWrite(LEDout, LOW); do { PrtBusy=digitalRead(Pbusy); } while (PrtBusy != LOW); digitalWrite(LEDout, HIGH); // Printer data output digitalWrite(PD0out, bitRead(POdata,0)); digitalWrite(PD1out, bitRead(POdata,1)); digitalWrite(PD2out, bitRead(POdata,2)); digitalWrite(PD3out, bitRead(POdata,3)); digitalWrite(PD4out, bitRead(POdata,4)); digitalWrite(PD5out, bitRead(POdata,5)); digitalWrite(PD6out, bitRead(POdata,6)); digitalWrite(PD7out, bitRead(POdata,7)); delayMicroseconds(10); // Strobe to low digitalWrite(Pstrb,LOW); delayMicroseconds(50); // Strobe to high digitalWrite(Pstrb, HIGH); // wait busy low digitalWrite(LEDout, LOW); do { PrtBusy=digitalRead(Pbusy); } while (PrtBusy != LOW); digitalWrite(LEDout, HIGH); delayMicroseconds(10); }
今度は。ポケコンにORANGE pico用に買ったプリンタをつないでみるか。