ArduinoでGOOJPRTのコマンド使用例


Arduino等マイコンから手軽にプリントアウトしたいときサーマルプリンタが便利ですね。
AliExpress等で売っているサーマルプリンタで、最も手頃なのがGOOJPRT だと思います。
https://ja.aliexpress.com/item/GOOJPRT-QR203-58-RS232-TTL-EML203/32835660462.html?
APS ELM203-CH のマニュアルが参考になりますが結構違うところもあり、試行錯誤したので
お役に立てばと上げておきます。

ちなみに、arduinoへの接続は右下のコネクタのGNDとRX(3pin黄色)だけでOKです。もちろんプリンタ側のRXはarduinoのTXと繋ぎます。通信速度の変更は試していませんが少なくともデフォルトは9600です。電源は図右下の黒をGND 赤を+5~9Vですね。

白黒反転やピーク電流制限、逆回転(紙を戻す)や濃度設定はAPSでは定義されていますが少なくとも同じコマンドではGOOJPRTでは機能しませんでした。hackできた方いらっしゃいましたら是非教えてください。
通常のバーコードは印字させることはできましたがよくわからない部分があり、使いこなせていません。
QRコードは機能を持っていない様に思います。 バーコードについてもhackできた方是非情報下さい。

サンプルコード
私はSoftware serialはあまり好きで無いので、arduinoのTXをプリンタに繋いでおり、プリンタの電源を切って書き込んだ後電源を入れてからarduinoをリセットする という方法を採っています。


void setup() {
  Serial.begin(9600);
  delay(200);

  //文字間ピッチ
  Serial.write(0x1B);
  Serial.write(0x20);
  Serial.write(16);
  Serial.println("abcDEF");

  //行間設定
  Serial.write(0x1B);
  Serial.write(0x33);
  Serial.write(50);//50dot 4mmくらい
  Serial.println("a");
  Serial.println("50");
  Serial.write(0x1B);
  Serial.write(0x33);
  Serial.write(0);//33がデフォの様だが0でもOK
  Serial.println("xxx");
  Serial.println("0");

  //左端余白設定 8dot/mm 約200dpi
  Serial.write(0x1D);
  Serial.write(0x4C);
  Serial.write(50);//第一引数は x1
  Serial.write(0);//第二引数はx256≒32mm
  Serial.println("abCDEF");

  Serial.write(0x1D);
  Serial.write(0x4C);
  Serial.write(0x00);
  Serial.write(0x01);//第二引数はx256≒32mm
  Serial.print("abCDEF");

  Serial.write(0x1D);
  Serial.write(0x4C);
  Serial.write(0x00);//後出しでも改行しなければ同じ行に描画される
  Serial.write(0x00);
  Serial.println("xxxx");

  //タブ設定とタブ移動
  Serial.write(0x1B);
  Serial.write(0x44);
  Serial.write(10);//8dot単位
  Serial.write(20);//8dot単位
  Serial.write(0);//設定終了
  Serial.print("asd");
  Serial.write(9);
  Serial.print("fgh");
  Serial.write(9);//Serial.wirte("\t")でも可 多分 print("\t")も、、
  Serial.println("xxx");

  //文字コード国別指定通貨マークが変わる程度
  Serial.write(0x1B);
  Serial.write(0x52);
  Serial.write(8);//8:日本 0:USA 他
  for ( int i = 0x20; i < 0x7F; i++) {
    Serial.write(i);
    if (i % 32 == 0) {
      Serial.println("");
    }
  }

  //カタカナ出せる
  Serial.write(0x1B);
  Serial.write(0x74);
  Serial.write(1);//1:カタカナ 26タイ
  for ( int i = 0x80; i < 0xFF; i++) {
    Serial.write(i);
    if (i % 32 == 0) {
      Serial.println("");
    }
  }

  //小さいフォント
  Serial.write(0x1B);
  Serial.write(0x21);
  Serial.write(1);
  Serial.println("abCDEF");
  Serial.write(0x1B);
  Serial.write(0x21);
  Serial.write(0);//戻す
  Serial.println("abCDEF");

  //n倍幅
  Serial.write(0x1D);
  Serial.write(0x21);
  Serial.write(0x20);//16進のMSD n 倍幅 7まで
  Serial.println("a");

  //n倍高さ
  Serial.write(0x1D);
  Serial.write(0x21);
  Serial.write(0x02);//16進のLSD n倍高さ 7まで
  Serial.println("a");

  //倍幅
  Serial.write(0x1D);
  Serial.write(0x21);
  Serial.write(0x10);//16進のMSD 1が倍幅
  Serial.println("a");

  //倍高
  Serial.write(0x1D);
  Serial.write(0x21);
  Serial.write(0x01);//16進のLSD 1が倍高さ
  Serial.println("a");

  //下線
  Serial.write(0x1B);
  Serial.write(0x2D);
  Serial.write("1");//連続
  Serial.print("abCDE");
  Serial.write(0x1B);
  Serial.write(0x2D);
  Serial.write("2");//1dot というが連続している
  Serial.print("abCDE");
  Serial.write(0x1B);
  Serial.write(0x2D);
  Serial.write("0");//戻す
  Serial.println("abCDE");

  //90°回転右回り
  Serial.write(0x1B);
  Serial.write(0x56);
  Serial.write("1");
  Serial.println("abCDE");
  //回転を元に戻す
  Serial.write(0x1B);
  Serial.write(0x56);
  Serial.write("0");
  Serial.println("abCDE");

  //180°回転
  Serial.write(0x1B);
  Serial.write(0x7B);
  Serial.write(1);
  Serial.println("abcdDEFGhijklmn");
  //戻す
  Serial.write(0x1B);
  Serial.write(0x7B);
  Serial.write(0);
  Serial.println("abcdDEFGhijklmn");

  //右寄せ
  Serial.write(0x1B);
  Serial.write(0x61);
  Serial.write("2");
  Serial.println("abCDE");
  //中寄せ
  Serial.write(0x1B);
  Serial.write(0x61);
  Serial.write("1");
  Serial.println("abCDE");
  //左寄せ
  Serial.write(0x1B);
  Serial.write(0x61);
  Serial.write("0");
  Serial.println("abCDE");
}