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用に買ったプリンタをつないでみるか。