ORANGE picoにプリンタ(TM-T88IV)をつないでみた

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

カテゴリー: Arduino, ORANGE pico, 電子工作 パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください