Bluetoothサーマルプリンター
2023.08.01
YouTube でも紹介しています。画像をクリックすると再生できます。

ナダ電子 AS-289R2プリンタシールド
過去の記事「ナダ電子 AS-289R2プリンタシールド」では、サーマルプリンターとラズベリーパイをUART接続して、ソースコードを印刷しました。
今回はBluetooth接続により、ソースコードを印刷できるようにして、利便性を高めてみました。
●概要図
ナダ電子 9600bos AS-289R と 38400bps AS-289R2 に対応させています。
●DP-EH600

日本語非対応の19200bos DP-EH600 も使用できますが、漢字が含まれる場合はその部分を「?」で印刷しています。

分解してディスプレイケースに固定しています。
●Seeed Studio XIAO ESP32C3
パソコンとサーマルプリンターの中継には 安価で入手した XIAO ESP32C3 を使いました。
ですが、XIAO ESP32C3 のシリアルポートはちょっと独特なので、あまりお勧めしません。
この ESP32C3 自体、Bluetooth機能を持っていますが、Bluetooth 5.0 のBLEライブラリを用いたコーディングが面倒だったので、
後述する HC-02 Bluetooth モジュールを使っています。
●HC-02 Bluetooth Serial Port Module
HC-06 はBluetoot非接続時に設定が可能ですが、HC-02はKEY端子をHIGHにすることで設定が可能になります。
通信速度の異なるサーマルプリンターに応じてBluetooth通信速度を動的に変更しようと考え、
通信モジュール名、アドレスを動的に変えてみたのですが、ペアリングの挙動が安定しません。
現状では、プリンターとマイコン間でのUART通信速度のみ動的に変更しています。
Bluetooth 2.0 serial port module.
| MODEL | HC-02 Slave |
| Work band | 2.4G |
| Communication interface | UART3.3V TTL |
| Working voltage | 3.0~3.6V |
| Baud rate | 1200~115200bps |
| Communication level | 3.3V |
| Communication current | 30mA |
| The transmitting power | 6dBm (maximum) |
| Reference distance | 10m |
HC-02の設定は下記の過去記事も参考にしてください。
番外編 mirco:bit 磁気・加速度センサ
ATコマンドモードによるモジュールの設定
User Manual of HC-02 V1.1 Bluetooth Serial Port ...
ラズベリーパイとシリアル接続し、KEY端子を3.3Vに接続してATコマンドモードに切り替えます。
HC-02(RXD,TXD,GND,VCC,KEY)→RaspberryPi(TX,RX,GND,3V,3V)
PlatformIOのデバイスモニタで接続します。Bluetoothモジュールの初期通信速度は9600bpsとなっています。
$ pio device monitor -p /dev/ttyAMA0 -b 9600
Bluetooth名を変更します。
AT+NAMEhc_02_9600
OKsetname
PIN番号は初期値「1234」になっています。任意の番号に変更します。
AT+PIN〇〇〇〇
OKsetPIN
再度設定内容を確認します。
AT+RX
OK+NAME=hc_02_9600
OK+PIN=〇〇〇〇
OK+ADDR=XXXXXXXXXXXX
OK+BAUD=9600
Bluetoothモジュールの通信速度は、サーマルプリンタの中でもっとも低速なAS-289Rに合わせるので、9600bpsから変更しません。
HC-02のKEY端子を開放して設定モードから抜けます。
HCシリーズのATコマンド仕様は機種により異なるのでデータシートで確認してください。
●Bluetoothペアリング

PIN番号入力の際には、
AT+PIN〇〇〇〇
で指定した番号を入力します。

Bluetoothとその他のデバイス画面を下にスクロールして、デバイスとプリンターをクリックします。

該当するデバイス名を右クリックしてプロパティを開きます。

hc_02_9600のプロパティのハードウェア・タグを開くと COM12ポートを使用していることがわかります。
AS-289R/R2 DP-EH600 | - | ESP32C3 | - | HC-02 |
| | | RX0(D7) | - | TXD |
| | | TX0(D6) | - | RXD |
| RX | - | RX1(D9) | | |
| | | TX1(D10) | | |
| GND | - | GND | - | GND |
| | | 3V | - | VCC |
| | | D0 | - | KEY |
| | | D1(pullup) for AS-289R | | |
| | | D2(pullup) for DP-EH600 | | |
| | | D3(pullup) for AS-289R2 | | |
| Vin(5V) | | 5V-(Battery 3.7V) | | |
| GND | | GND-(Battery GND) | | |
AS-289R:9600bps, DP-EH600:19200bps, AS-289R2:38400bps。D1, D2, D3ピンのいずれかを1KΩを介してGNDに落とすことで、サーマルプリンターを選択しています。

右側がプリンターとパソコンを仲介しているモジュールです。

ジャンクのカメラにはいっていたリチウムバッテリーを電源として取り付けています。

サーマルプリンターは入力電圧5~9Vのものもありますが、AS-289の場合は入力電圧は5V±5%ですので注意が必要です。
ソースコードのビルドには、PlatformIOを使用しています。
Arduino開発環境構築 PlatformIO
$ pio boards xiao
Platform: atmelsam
=========================================================
ID MCU Frequency Flash RAM Name
---------- ---------- --------- ----- ---- --------------
seeed_xiao SAMD21G18A 48MHz 256KB 32KB Seeeduino XIAO
Platform: espressif32
==========================================================================
ID MCU Frequency Flash RAM Name
------------------ ------- --------- ----- ----- -------------------------
seeed_xiao_esp32c3 ESP32C3 160MHz 4MB 320KB Seeed Studio XIAO ESP32C3
seeed_xiao_esp32s3 ESP32S3 240MHz 8MB 320KB Seeed Studio XIAO ESP32S3
$ mkdir -p ~/XiaoEsp32c3/As289r2
$ cd ~/XiaoEsp32c3/As289r2
$ pio init -b seeed_xiao_esp32c3
$ vi src/ble_prn.ino
#include <Wire.h>
#include <HardwareSerial.h>
HardwareSerial SerialBLE(0);
HardwareSerial SerialPRN(1);
#define INTERVAL (50)
#define PIN_09600 D1
#define PIN_19200 D2
#define PIN_38400 D3
int baudrate;
int max_column = 48;
void set_prn(HardwareSerial *serial)
{
// 初期化(印字バッファ内データ抹消))
serial->write(0x1b);
serial->write(0x40);
if (baudrate == 19200) {
max_column = 42;
// Character font B (9*17)
serial->write(0x1b);
serial->write(0x21);
serial->write(0x01);
// Set line spacing
serial->write(0x1b);
serial->write(0x33);
serial->write(0x14);
}
if ((baudrate == 9600)||(baudrate == 38400)) {
max_column = 48;
// ANK文字フォント指定(8x16ドット)
serial->write(0x1b);
serial->write(0x68);
serial->write(0x30);
// 漢字フォント指定(16x16ドット)
serial->write(0x12);
serial->write(0x53);
serial->write(0x31);
// 文字コード指定(UTF-8)
serial->write(0x1b);
serial->write(0x24);
serial->write(0x30);
}
// 行間スペース量指定(0ドット)
serial->write(0x1b);
serial->write(0x41);
serial->write(0x01);
// 文字間スペース量指定(0ドット)
serial->write(0x1b);
serial->write(0x20);
serial->write((uint8_t)0x00);
}
void put_prn(HardwareSerial *serialin, HardwareSerial *serialout)
{
int ch;
int row = 0;
int col = 4;
int numByte;
int i;
while(1) {
while (serialin->available()) {
if (row == 0) {
serialin->write(0x0a);
serialout->write(0x0d);
serialout->printf("%03d ",++row);
serialin->printf("%03d ",row);
}
ch = serialin->read();
switch(ch) {
case 0x09: // TAB
serialin->write(' ');
serialout->write(' ');
++col;
break;
case 0x0d:
--col;
break;
case 0x0a:
// 行末に改行コードがきた場合は、自動改行されるので無視する
if ( col % max_column ) {
serialin->write(ch);
serialout->write(0x0d);
}
serialout->printf("%03d ",++row);
serialin->printf("%03d ",row);
col = 4;
break;
case EOF: // EOF
case 0x1a:
serialin->write(0x0a);
serialin->write(0x0a);
serialout->write(0x0d);
serialout->write(0x0d);
serialout->write(0x0d);
return;
break;
default:
if ((ch & 0x80) == 0x00) { // 1byte文字
serialin->write(ch);
serialout->write(ch);
++col;
} else {
// 48桁目に2バイト文字がきた場合は、改行する
if ( !((++col) % max_column)) {
serialout->write(0x0d);
col = 2;
} else {
++col;
}
// UTF-8文字コードのバイト数判定
if ((ch & 0xE0) == 0xC0) { numByte=2; // 2byte文字
} else if ((ch & 0xF0) == 0xE0) { numByte=3; // 3byte文字
} else if ((ch & 0xF8) == 0xF0) { numByte=4; // 4byte文字
} else if ((ch & 0xFC) == 0xF8) { numByte=5; // 5byte文字
} else if ((ch & 0xFE) == 0xFC) { numByte=6; // 6byte文字
} else { numByte=0;
}
if ((baudrate == 9600)||(baudrate == 38400)) {
serialout->write(ch);
} else {
serialin->write('?');
serialout->write('?');
}
for(i=1;i<numByte;) {
if (serialin->available()) {
ch = serialin->read();
if ((baudrate == 9600)||(baudrate == 38400)) {
serialin->write(ch);
serialout->write(ch);
}
i++;
} else {
delay(10);
}
}
}
break;
}
if (!(col % max_column)) {
// AS-289R2は自動改行される
serialin->write(0x0a);
if ((baudrate == 9600)||(baudrate == 38400)) serialout->write(0x0a);
}
}
}
}
void setup()
{
Wire.begin();
pinMode(PIN_09600, INPUT_PULLUP);
pinMode(PIN_19200, INPUT_PULLUP);
pinMode(PIN_38400, INPUT_PULLUP);
if (digitalRead(PIN_09600) == LOW) {
baudrate = 9600;
} else if (digitalRead(PIN_19200) == LOW) {
baudrate = 19200;
} else if (digitalRead(PIN_38400) == LOW) {
baudrate = 38400;
} else {
baudrate = 9600;
}
SerialBLE.begin(9600, SERIAL_8N1, RX, TX);
SerialPRN.begin(baudrate, SERIAL_8N1, 9, 10);
set_prn(&SerialPRN);
}
void loop()
{
if (SerialBLE.available()) put_prn(&SerialBLE, &SerialPRN);
}
【コード解説】
void setup()
初期設定ではサーマルプリンターを識別し、動的に通信速度を設定しています。
ただし、Bluetoothモジュール、パソコン間通信は9600bpsで固定です。
void set_prn()
AS-289シリーズとDP-EH600では使える最小フォントが異なります。
AS-289では1行に最大48文字、DP-EH600では42文字です。
set_prn()では機種別のフォントサイズ指定、行間指定を行っています。
void put_prn()
漢字コード識別、行末制御、行番号出力、制御コード評価などを行っています。
$ pio run -t upload

TeraTermを起動して、COMポートを開きます。

Tera Term 端末設定の改行コードを送受信ともに[LF]にします。
画面上から文字列を入力すると、行番号の付いた文字列がプリント出力されると同時にTeraTermの画面上に印刷イメージが表示されます。
●テキストファイルを印刷する場合

漢字コード:UTF-8、改行コード:LF のファイルを用います。
TeraTermで「ファイル送信」を開いて、ファイルを選択、バイナリにチェックを入れて送信します。

サーマルプリンター DP-EH600 でプリントアウトした様子です。漢字コードが含まれる場合はその部分を「?」で出力しています。
●行番号をリセットする場合
テキストファイル送信では、ファイル終端のEOFを検知して、行番号をリセットしています。
ここでは、TeraTerm画面上から入力した際の行番号リセットの方法を説明します。
send $1A
上記マクロを、eof.ttl という名前でTeratermディレクトリに保存します。

TeraTerm の[コントロール]→[マクロ]で eof.ttl を開くと EOFが送信され。行番号がリセットされます。
■参考文献
・Arduino環境でXIAO ESP32C3を使う
・XIAO ESP32C3 wiki
・PlatformIOでXIAO ESP32C3を動かす
|
Raspberry Pi(ラズベリー パイ)は、ARMプロセッサを搭載したシングルボードコンピュータ。イギリスのラズベリーパイ財団によって開発されている。
たいていのことは100日あれば、うまくいく。長田英知著
「時間がなくて、なかなか自分のやりたいことができない」
「一念発起して何かを始めても、いつも三日坊主で終わってしまう」
「色んなことを先延ばしにしたまま、時間だけが過ぎていく」
そこで本書では、そんな著者が独自に開発した、
まったく新しい目標達成メソッド「100日デザイン」について、
その知識と技術を、余すところなくご紹介します。
まんがで納得ナポレオン・ヒル 思考は現実化する
OLとして雑務をこなす日々に飽き足らず、科学者だった父が残した薬品を商品化すべく、起業を決意した内山麻由(27)。彼女はセミナーで知り合った謎の女性からサポートを得ながら、彼女と二人三脚でナポレオン・ヒルの成功哲学を実践し、さまざまな問題を乗り越えていく。
ヒル博士の<ゴールデンルール>に従い、仕事に、恋に全力疾走する彼女の、成功への物語。
今日は人生最悪で最高の日 1秒で世界を変えるたったひとつの方法 ひすいこたろう著
偉人の伝記を読むと、最悪な日は、不幸な日ではなく、新しい自分が始まる日であることがわかります。最悪な出来事は、自分の人生が、想像を超えて面白くなる兆しなのです。偉人伝を読むことで、このときの不幸があったおかげで、未来にこういう幸せがくるのかと、人生を俯瞰する視線が立ち上がるのです。
ご飯は私を裏切らない heisoku著
辛い現実から目を背けて食べるご飯は、いつも美味しく幸せを届けてくれる。
29歳、中卒、恋人いない歴イコール年齢。バイト以外の職歴もなく、短期バイトを転々とする日々。ぐるぐると思索に耽るけど、ご飯を食べると幸せになれる。奇才の新鋭・heisokuが贈るリアル労働グルメ物語!
【最新版Gemini 3に対応!】できるGemini (できるシリーズ)
Geminiを「最強の知的生産パートナー」として使いこなすための、実践的なノウハウを凝縮した一冊です。
基本的な操作方法から、具体的なビジネスシーンでの活用、日々の業務を自動化するGoogle Workspaceとの連携、さらには自分だけのオリジナルAIを作成する方法まで余すところなく解説します。
Rustプログラミング完全ガイド 他言語との比較で違いが分かる!
Rustの各手法や考え方を幅広く解説!
500以上のサンプルを掲載。実行結果も確認。
全24章の包括的なチュートリアル。
ポチらせる文章術
販売サイト・ネット広告・メルマガ・ブログ・ホームページ・SNS…
全WEB媒体で効果バツグン!
カリスマコピーライターが教える「見てもらう」「買ってもらう」「共感してもらう」すべてに効くネット文章術
小型で便利な Type-C アダプター USB C オス - USB3.1 オスアダプター
Type-C端子のマイコンボードをこのアダプタを介して直接Raspberry Piに挿すことができます。ケーブルなしで便利なツールです。
Divoom Ditoo Pro ワイヤレススピーカー
15W高音質重低音/青軸キーボード/Bluetooth5.3/ピクセルアート 専用アプリ/USB接続/microSDカード
電源供給USBケーブル スリム 【5本セット】
USB電源ケーブル 5V DC電源供給ケーブル スリム 【5本セット】 電源供給 バッテリー 修理 自作 DIY 電子工作 (100cm)
|