LoginSignup
1
0

More than 1 year has passed since last update.

M5 Paper から bluetooth プリンタへ画面出力 備忘録

Posted at
  • この記事には Fortran は出てきません。

M5 Paper

知識が無いながらも youtube 動画とネットの記事を見ているうち、欲しくなったので先週の amazon のポイント還元増量の時にポチってみました。正直、使い道が思いつきませんw

電子インク紙と ESP32 マイコンをセットにまとめた中国製品です。M5EPD (M5 Electronic Paper Device ?) という略号でも呼ばれます。M5 Stack という、電子ブロックのように、モジュールを組み合わせてマイコン実験が出来るようになっているシリーズの一つのようです。ESP32 マイコンは WiFi と Bluetooth 機能を内蔵していてとても人気があるようです。

零知識から始めたので、Arduino と Platform IO という二つの開発環境の違いが分かりませんが、Platform IO の方でないと SD card から画像ファイルを読み込むことが出来ませんでした。開発元提供のサンプルも画面表示がなされません。Arduino 環境の方で数時間を無駄にしました。

この他に UIFlow という micro python を使う環境もありますが、まだいじっていません。

Phomemo M02S

ESC/POS の ラスターグラフィックのみに対応した Bluetooth プリンタです。Bluetooth も USB も仮想シリアル接続されます。

M5 Paper から Phomemo M02S へ出力

画面のドットを読んでハードコピーを取ります。コンセプト実証だけを目的として、細かいことは気にしないことにします。

プリンタが二値しか取らないので、グレースケールには対応しないことにします。また電子ペーパー面の短辺のドット数が 8 の倍数ではないので、padding などをサボるため適当に切り捨てることにします。

ソース

SD カードから読み込んだ画像を Bluetooth プリンタへ書き出します。
元としたプログラムは、URL を与えた画像を表示するプログラムです。ここでは、SD card から画像を読むことにして、WiFi 接続の部分を消しました。

ライブラリのソースをみると canvas.readPixel 関数というものがあったので、これによって画面のドットを読んで、プリンタに送る形式にまとめます。

Bluetooth に関しては、以下のサイトを参考にしました。

#include <M5EPD.h>
#include "BluetoothSerial.h"

void setup()
{
  M5.begin();

  M5.EPD.SetRotation(90);
  M5.EPD.Clear(true);

  M5EPD_Canvas canvas(&M5.EPD);
  canvas.createCanvas(540, 960);
  canvas.setTextSize(3);
  // canvas.drawJpgUrl("https://m5stack.oss-cn-shenzhen.aliyuncs.com/image/example_pic/flower.jpg");
  //canvas.drawJpgFile(SD, "/flower.jpg");
  //canvas.drawPngFile(SD, "/jsd.png");
  canvas.drawPngFile(SD, "/KZR.png");
  canvas.pushCanvas(0, 0, UPDATE_MODE_GC16);
//e-paper end

// Bluetooth Printer
  // prepare bluetooth  
  BluetoothSerial SerialBT;
  String MACadd = "00:15:83:54:A2:7F";
  uint8_t address[6]  = {0x00, 0x15, 0x83, 0x54, 0xa2, 0x7f};
  String name = "M02S";
  bool connected;
  uint8_t m; 

  SerialBT.begin("M5EPD", true);  // true: master mode
  Serial.println("The device started in master mode, make sure remote BT device is on!");

  // connect(address) is fast (upto 10 secs max), connect(name) is slow (upto 30 secs max) as it needs
  // to resolve name to address first, but it allows to connect to different devices with the same name.
  // Set CoreDebugLevel to Info to view devices bluetooth address and device names
  //connected = SerialBT.connect(name);
  connected = SerialBT.connect(address);
  
  if (connected) {
    Serial.println("Connected Succesfully!");
  } else {
    while(!SerialBT.connected(10000)) {
      Serial.println("Failed to connect. Make sure remote device is available and in range, then restart app."); 
    }
  }
    
  // Phomemo M02S ESC/POS  
  SerialBT.write(0x1e);
  SerialBT.write(0x40); // ESC @ ; reset

  SerialBT.write(0x1f);
  SerialBT.write(0x11);
  SerialBT.write(0x02);
  SerialBT.write(0x04); // US 11 02 04; concentration 01,03,04 thin..thick

  SerialBT.write(0x1d);
  SerialBT.write(0x76); 
  SerialBT.write(0x30);
  SerialBT.write(0x00); // ESC v ' ' mode ; graphic ; mode 00 normal 01double_x 02double_y 03quadruple
  SerialBT.write(0x43); // 536dots = 67byte (43h)
  SerialBT.write(0x00); //  dx / 8 ; 16bit little endian
  SerialBT.write(0xC0); // 960dots (3C0h)
  SerialBT.write(0x03); //  dy     ; 16bit little endian

  for (int iy = 0; iy < 960; iy++) {
    for (int ix = 0; ix < 536; ix += 8) {
      m = 0;
      for (int k = 0; k < 8; k++) {
        m *= 2;
        if ( canvas.readPixel(ix + k, iy) > 0 ) {
           m++;
        };
      }        
      SerialBT.write(m);
     }
  }
  
  Serial.println("Finished");
    // disconnect() may take upto 10 secs max
  if (SerialBT.disconnect()) {
    Serial.println("Disconnected Succesfully!");
  }

  M5.shutdown();
}

void loop()
{
}

//reference: bluetooth
//https://github.com/espressif/arduino-esp32/tree/master/libraries/BluetoothSerial/examples/SerialToSerialBTM

C のビット演算関数が分からないので、算術計算で画像に対応するビット並びを作りました。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0