Arduinoでポケコンプリンタインターフェース その2

Arduinoを使ったインターフェースで、ハードコピーのデータをPCに取り込めれば、プリンタがだめでも取り込んだデータをもとに画像ファイルが作れるのではないだろうかと思った。
しかし、取り込んだデータを見たらなんかおかしい。
プリンタでもダンプを取ってみたが、こんな有様。

Arduinoを介したほうのデータがでたらめな状態に。
しかも、データ量もおかしい。
Logicと書かれたほうはICを使って作ったインターフェースのダンプ結果。
Arduinoと書かれたほうは、文字通りArduinoで作ったほうのダンプ結果で、明らかにデータ量が多い。
調べた結果、普通のLPRINTやLLISTで印刷した場合とハードコピーの場合のデータ転送速度が違うようで、ハードコピーの場合のデータ転送速度が速く、Arduinoが取り込むことができないようだ。
少し前に秋月でOSC001 PCB SCOPE (USBミニオシロ)を買ったので、早速使ってみることにした。

オシロのプローブ用にコネクタをつないであるが、今回はそちらは使わない。
ロジアナ用の端子でポケコンとArduino間の通信をモニタしてみた。

LPRINTした時の波形。
とりあえず、普通だ。

次にLLISTした時の波形

USBミニオシロの方がデータを取りこぼしている。
が、一応信号としては問題はなさそうなのはわかる。

最後にハードコピーを取った時の波形。

サンプリンレートを見てもらえればわかるが、LPRINTやLLISTは5KSa/secに対してハードコピーの時は500KSa/secでサンプリングして波形を表示している。
これだけでも100倍近く早いってことになるのか。
しかもポケコンのBusy(プリンタ側のSTROBE)の信号がおかしい。
配線の取り回しが悪くてノイズが乗ってしまっているのだろうか。
とにかくArduinoが信号を取りこぼしていることとBusy(プリンタ側のSTROBE)の信号がおかしいため、ハードコピーのデータは取り込むことはできなさそうだ。

これはハードコピーのデータ取り込みについてはあきらめるしかないかな。
それと、このUSBミニオシロを使って思ったことだけど、使い勝手はあまり良くない。
2,400円だしおもちゃと思って割り切るしかないな。

カテゴリー: Arduino, ポケコン, 電子工作 | コメントする

Arduinoでポケコンプリンタインターフェース

以前に書いたArduinoを使った印刷用のインターフェースについて、暫定版ができた。

基板に実装するため、秋月電子のAE-ATMEGA-328 MINIを使用。
当初はプリンタ側はデジタルポートで、ポケコン側はアナログポートをデジタルとする予定だったが、ポケコン側の信号を割り込み処理で実行するため、一部の配線がめんどいことになってしまった。

仕様としては以下の通り。

インターフェース仕様
・CE-126とLPRTの両方をサポート
・リセット時に文字セット初期化を行うので、ポケコン側から初期化コマンドを送る必要なし
・プリンタへの出力が、そのままシリアルポートに出力される
・プリンタへの出力をOFFにできる(シリアルポートはそのまま出力される)

CE-126 mode
・ポケコン側の仕様に影響される
・1行24桁固定
・シリアルポートの出力は24桁で、不足分は空白で置き換わる。
・空行でも24桁の空白
・7Fh~9Fh,F0h~F4h,F8h~FFhあたりはポケコン側で空白に変換したり、別のコードに変換している
・MONモードやTEXTモードなどでも印刷できる

LPRT mode
・LPRINT CHR$コマンドで、指定したコードをそのまま出力する。
・MONモードやTEXTモードなどでは印刷できない
プリンタが対応していればハードコピーが可能(予定)(暫定版では正常動作せず)9/14追記
・印刷が若干遅い(シフトレジスタICを使ったロジック回路でも同様)

まずはCE-126 modeで印刷してみる。

1行24桁固定で印刷され、一部の文字コードは印刷されない。
MONモードでダンプリストの印刷も行ってみる。

CE-126でなければ印刷できなかったものも印刷できた。
ついでにシリアルポートからの出力は以下のとおり。

 !"#$%&'()*+,-./01234567
89:;<=>?@ABCDEFGHIJKLMNO
PQRSTUVWXYZ[\]^_`abcdefg
hijklmnopqrstuvwxyz{|}~ 
                        
        。「」、・ヲァィゥェォャュョッ
ーアイウエオカキクケコサシスセソタチツテトナニヌ
ネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚
10:REM OPEN "LPRT:"     
11:REM LPRINT CHR$ &H1B;
  "t"; CHR$ 1           
12:REM LPRINT CHR$ &H1B;
  "R"; CHR$ 8           
20:FOR A=32 TO 255      
29:PRINT CHR$ A;        
30:LPRINT CHR$ A;       
40:NEXT                 
50:LPRINT               
0100 : AF CD 5F 11  ッヘ_.
(CB)   11 04 02 21  ...!
       42 01 CD 20  B.ヘ 
       11 CD 8F 0A  .ヘ .
0110 : 2A A2 11 56  *「.V
(E8)   23 5E 23 ED  #^# 
       53 01 7D 7E  S.}~
       32 03 7D 23  2.}#
0120 : 7E B7 F4 7B  ~キ
(1E)   0A 2A A4 11  .*、.
       22 04 7D 3E  ".}>
       01 32 00 7D  .2.}

次にLPRTモードで印刷した場合。

こちらは、20h以降の文字がすべて印刷されている。
また、1行も用紙の幅いっぱい印刷されている。
シリアルポートからの出力は以下の通り。

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~	


。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚珮粤蒟跚韜・・ⅰ涇・

80h~9Fh,E0h~FFhの部分はShiftJISで使っている領域になるので文字が化けている。

10:OPEN "LPRT:"
11:REM LPRINT CHR$ &H1B;"t"; CHR$ 1
12:REM LPRINT CHR$ &H1B;"R"; CHR$ 8
20:FOR A=32 TO 255
29:PRINT CHR$ A;
30:LPRINT CHR$ A;
40:NEXT
50:LPRINT

最後に、暫定版Arduinoスケッチ。

// Emulator Sharp CE-126P fur PC-1401 u. PC-E500
const int OUT_ACK = 17; // ACK  Sharp CE-126P, pin 9 der 11-pol. Buchsenleiste
const int IN_Xout = 3;  // Xout Sharp PC-1401, pin 7 der 11-pol. Buchsenleiste / INT1
const int IN_Dout = 16; // Dout Sharp PC-1401, pin 5 der 11-pol. Buchsenleiste
const int IN_Busy = 2;  // Busy Sharp PC-1401, pin 4 der 11-pol. Buchsenleiste / INT0
const int InfoLED = 13;

// printer interface
const int Pstrb = 15;  // Printer STROBE
const int PD0out = 14; // 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

// Mode SW
const int EMmode = 12; // Emulator mode SW (Hi:CE126P/Lo:LPRT)
const int EMsw = 18;   // Emulator SW (Hi:serial and pararel / Lo:serial only)

boolean Busy;  // Busy signal
boolean Xout;  // Xout signal
boolean Dout;  // Dout signal

int DataBit;   // work of CE-126P mode
int DataByte;  // work of CE-126P mode
long Timeout;
int i; 

byte SPif;       // work of LPRT mode

boolean PrtBusy; // work of Printer interface

////////////////////////////////////////////////////////////////////////////////////////////

void setup() {
  // Serial port 98600BPS
	Serial.begin(9600);

	// E500/G8xx interface set
	pinMode(OUT_ACK, OUTPUT);
	pinMode(IN_Xout, INPUT);
	pinMode(IN_Dout, INPUT);
	pinMode(IN_Busy, INPUT);
	pinMode(InfoLED, OUTPUT);

  // 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);

  // Emulator mode SW
  pinMode(EMmode, INPUT);
  pinMode(EMsw, INPUT);

  // Sirial header
  Serial.println();
  Serial.println("Bereit:");
  Serial.println();

  // Printer STROBE is HIGH
  digitalWrite(Pstrb, HIGH);
  
  // Printer BUSY pull up
  digitalWrite(Pbusy, HIGH);

  // sw port pull up
  digitalWrite(EMmode, HIGH);
  digitalWrite(EMsw, HIGH);

  // ESC/POS printer init
  PRTinit ();
}

////////////////////////////////////////////////////////////////////////////////////////////

void loop() {

  if (digitalRead(EMmode) == HIGH ){
    ce126pemu();
  } else {
    lprtemu();
  }

} // Ende loop

////////////////////////////////////////////////////////////////////////////////////////////

// Emulator Sharp CE-126P
void ce126pemu() {
  do{
    digitalWrite(InfoLED, LOW);
    Xout = digitalRead(IN_Xout);
  
    if (Xout) {
      // DeviceSelect:
      digitalWrite(InfoLED, HIGH);
      delayMicroseconds(50);
      i = 0;
      do {
        digitalWrite(OUT_ACK, HIGH);
        Timeout = millis();
        do {
          Busy = digitalRead(IN_Busy);
          if (millis() - Timeout > 50) break;
        } while (!Busy);
        delayMicroseconds(50);
        digitalWrite(OUT_ACK, LOW);
        do {
          Busy = digitalRead(IN_Busy);
        } while (Busy);
        delayMicroseconds(150);
        i++;
      } while (i < 8);
    }
  
    Busy = digitalRead(IN_Busy);
  
    if (Busy && !Xout) { 
      // Daten:
      digitalWrite(InfoLED, HIGH);
      i = 0;
      DataByte = 0;
      do {
        do {
          Busy = digitalRead(IN_Busy);
        } while (!Busy);
        delayMicroseconds(50);
        DataBit = digitalRead(IN_Dout);
        digitalWrite(OUT_ACK, HIGH);
        do {
          Busy = digitalRead(IN_Busy);
        } while (Busy);
        delayMicroseconds(50);
        if (i != 8) digitalWrite(OUT_ACK, LOW); // add : now receve to low. but printing is high 
        DataByte = DataByte | (DataBit << i);
        i++;
      } while (i < 8); // Ausgabe: switch (DataByte) { case 13: Serial.println(); praout(0x0d); // CR praout(0x0A); // LF break; case 48: Serial.print("O"); // Buchstabe "O" praout(0x4f); break; case 240: Serial.print("0"); // Ziffer Null praout(0x30); break; default: if (DataByte >= 31 && DataByte <= 255) {
            Serial.print(char(DataByte));
            praout(byte(DataByte));
          }
      }
      if (i == 8) digitalWrite(OUT_ACK, LOW); // add : print after ack low
    }
  } while (digitalRead(EMmode) == HIGH );

}

////////////////////////////////////////////////////////////////////////////////////////////

// Emulator LPRT:
void lprtemu() {

  // Interrupt set
  attachInterrupt(0,IntBusy,RISING);
  attachInterrupt(1,IntXout,RISING);

  do{
    digitalRead(EMmode); // dummy
  } while (digitalRead(EMmode) == LOW );

  // Interrupt off
  detachInterrupt(0);
  detachInterrupt(1);
  
}

////////////////////////////////////////////////////////////////////////////////////////////

// Interrupt routine
// BUSY to High (strobe)
void IntBusy() {
  digitalWrite(OUT_ACK, HIGH);
  digitalWrite(InfoLED, HIGH);
  Serial.print(char(SPif));
  praout(SPif);
  digitalWrite(InfoLED, LOW);
  digitalWrite(OUT_ACK, LOW);
}

// Xout to High (data clock)
void IntXout() {
  SPif = SPif << 1 ; if (digitalRead(IN_Dout) == HIGH) { SPif++; } } //////////////////////////////////////////////////////////////////////////////////////////// // 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(10); } //////////////////////////////////////////////////////////////////////////////////////////// // Parallel Printer interface void praout (byte POdata) { // If EMsw is low as no operation if (digitalRead(EMsw) == LOW) return; // wait busy low PrtBusy=digitalRead(Pbusy); do { PrtBusy=digitalRead(Pbusy); } while (PrtBusy != LOW); // 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(1); // Strobe to low digitalWrite(Pstrb,LOW); // wait busy high Timeout = millis(); do { PrtBusy=digitalRead(Pbusy); //if (millis() - Timeout > 50) break;
  } while (PrtBusy == HIGH);

  // Strobe to high
  delayMicroseconds(50);
  digitalWrite(Pstrb, HIGH);
  
  // wait busy low
  do {
    PrtBusy=digitalRead(Pbusy);
  } while (PrtBusy != LOW);
  delayMicroseconds(50);
}

シリアルポートから印刷データを垂れ流しているので、少し手直しすればプリンタシールドでも利用可能かもしれない。
雑な作りなので少し手直しは必要かも。

カテゴリー: Arduino, ポケコン, 電子工作 | コメントする

ポケコンのハードコピーのDumpとESC/PとESC/POS

ポケコンのハードコピーについて、ダンプした内容とネットで拾ってきた情報をてらしあわせてみる。

とりあえず上の画像は、brotherのESC/PのマニュアルとシチズンのESC/POSのマニュアルから引用したものでビットイメージを印刷するためのコマンドである。。
他のESC/P、ESC/POSのマニュアルについても確認してみたが、おおむね同じ内容であった。

ESC/P ESC * m n1 n2 data
(16進)1B 2A m n1 n2 datam=0,1,2,3,4,6,32,33,38,39,40,71,72,73
0≦n1≦255
0≦n2≦11
ESC/POS ESC * m n1 n2 data k
(16進)1B 2A m n1 n2 data km=0,1,2,32,33
0≦n1≦255
0≦n2≦2
k=n1+256*n2 (m=0,1)
k=(n1+256*n2)*3 (m=32,33)

コマンド自体は同じだが、微妙な差異がある。
まずは、mで指定できる値が異なる。
ESC/Pの場合は、0~6および32~40、71~73(10進数)と多いのに対し、ESC/POSの場合は0、1、32、33(10進数)の4つだけ。
あとは、ESC/POSにあるkというパラメータ。
このkはマニュアルによってあったりなかったりして、謎である。

これらを踏まえ、以前ダンプした結果を見てみる。

mで指定された値が10進数で39となっており、ESC/POSでは存在しない値であった。
ここさえ何とかなればハードコピーできたのかもしれない。
パラレルポートを持ったプリンタなんて、もはやジャンクで探すしかないのかなぁ・・・

カテゴリー: ポケコン, 電子工作 | コメントする

ポケコンのハードコピーについて

PC-G850VSだが、どうやら画面上の表示のハードコピーをとることができるようだ。
とりあえず確認できたのは、BASICの隠しコマンドでHDCOPYがあること。
引数に0と1が使えることだけで、実際プリンタをつないで試してみても印刷することはできなかった。

そこでナガイSCT株式会社に問い合わせてプリンタ・パソコンインターフェイス CT-431の在庫と一般販売の可否について問い合わせてみる。
そうしたら、在庫もあり一般向けにも売ってくれるとのことで、早速注文してみた。

届いたセットを早速試してみる。

まずは普通にBASICで印刷してみる。

OPEN ”LPRT:”コマンドでポートを開いて印刷するのは、本を参考に自作したインターフェースと同じである。

次にハードコピーを試してみる。
取説によると、以下の方法でハードコピーが取れるようだ。

表示済みの画面のハードコピー
[SHIFT]+[0] → ESC/P
[SHIFT]+[1] → PC-PR

BASICの画面のハードコピー
HDCOPY 0 → ESC/P
HDCOPY 1 → PC-PR

C言語の画面のハードコピー
void hdcopy (unsigned short printer);
printer = 0 → ESC/P
printer = 1 → PC-PR

試した結果は以下のとおり。
どうやらハードコピーをする際にはOPEN ”LPRT:”コマンドは必要がないみたいだ。

なんか三本線が大量に印刷されている。
やはりESC/PとESC/POSは別物なのだろうか。

それはともかく、CT-431だとハードコピーできるのはなぜだろうかと思い基板を見てみる。

なんかGALがのっている。
何かしら特別な処理を行って自作は不可なのだろうかと思いつつ、基板をひっくり返してみる。

・・・
・・・・・・
・・・・・・・・・
何だろう、この後付け感たっぷりな抵抗は。
もしやと思い自作のインターフェースの2番ピンと8番ピンを同じように10KΩでつないで確かめてみる。

早速ハードコピーを取ってみたら、三本線が大量に印刷された。
これでESC/Pに対応していたらちゃんと画像が印刷されるのだろうか。

とりあえずプリンタのダンプモードで印刷してみた。
ネットで拾ったESC/POSとESC/Pのコマンドと見比べて、ダンプされた内容を確認してみようと思う。
ESC-POSコマンド比較(ESC-POS.pdf)

ついでに、Arduinoを使って印刷用のインターフェースを作ってみようとしている。

使っているのは、秋月のAE-ATMEGA-328 MINI
ネットで調べて分かったことだが、ポケコン用のプリンタCE-126Pがあるが、Sharp_PC-G850VS_Interface.pdfによると独自のプロトコルで動いているらしい。
更に調べていくと、Arduinoを使ってプリンタをエミュレートしている人もいた。
公開されているソースをベースにパラレルインターフェースに出力するプログラムを書き足して実際に印刷できることを確認した。
CE-126Pの場合、
・BASICでOPENコマンドでポートを開く必要がない。
・TEXTモードで印刷できる。(パラレル変換インターフェース経由では印刷できない)
・MONモードで印刷できる。(パラレル変換インターフェース経由では印刷できない)
と、パラレルインターフェースでは印刷できないモードでも印刷が可能。
現在、CE-126PモードとLPRT:モードを切り替えて印刷できるArduinoのスケッチを作っているところ。
とはいえ、すごい今更感があるんだよなぁ・・・

カテゴリー: ポケコン, 電子工作 | コメントする

ポケコンの電源とシステムバス

この前買ったポケコンPC-G850VSなのだが、ACアダプタ用のジャックがついている。
昔、高校の頃に使っていた機種(PC-G803/813)にはついてなかった。
さて対応しているACアダプタなのだが、今は珍しいセンターマイナス型。
折角なので、ポケコン用アダプタを作ってみた。

12VのACアダプタをつないで8.5Vに降圧させるためにAZ1117D-ADJを利用している。
電流に余裕があるのでTA48M05Fも追加して5Vの出力もできるようにした。

システムバスだが、こちらのコネクタはもはや入手不可。
いま、代替できる物はないか探しているところ。
高校か社会人になって間もないころに購入したコネクタとコネクタ付き基板が未使用なまま保管してあったので引っ張り出してみる。

せっかくポケコンを手に入れたので、貴重なこれらを使ってみることにした。

ところでこの基板、ピンヘッダを取り付けようと思ったら1番ピンの位置に気を付ける必要がある。
ポケコンのシステムバスの1番ピンの位置が、上記写真の位置に来るので、フラットケーブルの1番ピンの位置と逆になる。

さて、コネクタの方だが、これを取り付けることができる基板がないものか探してみる。

1.27mmピッチの基板を使おうとしても細かすぎるし、基板に足が入らない。
ところがスイッチサイエンスで奇天烈(ジグザグ)ユニバーサル基板 Cタイプ(72×48mm)というものを見つけてもしかしたら使えそうかもと思い入手してみた。

思った通り、足の位置がちょうどぴったりだったので、基板をカットして取り付ける。


表面部分の足も延ばして、穴位置に合わせてまげて取り付ける。

ピンヘッダは、サンハヤトの基板に合わせたものにするか、フラットケーブルの1番ピンに合わせるかどっちにするか迷ったが、結局、シール基板の残りを見つけて両方に対応できるようにした。
これで、コネクタの心配をせずフラットケーブルを使ってシステムバスを使った工作を行うことができる。

さて、基板やコネクタだけあっても仕方ないので、貴重な最後の基板を使って82C55ボードを作ってみることにした。
高校時代にも作ったはずだが、どの本のどの回路をもとに作ったか思い出せない。
結局「ポケコン活用研究2」の3章に載っていた回路をアレンジして組み立てた。
最小のICの数で、アドレスデコードで手を抜いていないところがよいのだが、回路図に誤記があるので気を付ける必要がある。
他に見つけたものでは、74HC244,245でバスを切り分けているものがあって、最初はそっちで組み立てたかったが、ICの数が多く基板のサイズ上載せきれなさそうなので却下。
他にもICの数が少なくて済むものがあったが、そっちはA2,A3かつながってないものだったため却下した。

出来上がった82C55ボード。
I/Oアドレスは。ショートピンで選択できるようにしてある。
74HC32のOR回路が余っているので、/IORQが出ているときのみ82C55の/CSに信号が行くように手直ししたのと、割り込み用に利用。
/INTのところは単体で使う分にはいいけど、ちょっと手直しが必要かな。

ポケコンにつないでみたところ。

I/O確認ボードにつないで動作確認。

BASICでプログラムを組み、モード0でポートA,Bを出力、ポートCを入力に指定。
ポートA,Bに順次データを送りながらポートCの状態を読み込んでポケコンに値を表示するプログラムを組んで正しく動くことを確認。

先に 作ったコネクタ基板をフラットケーブルを使って延長してみる。

サンハヤト基板に合わせたほうのピンヘッダにフラットケーブルコネクタを接続し、反対側に82C55ボードに接続してみる。
延長した状態で正しく動くことを確認。

さて、次はなんとするかな。

カテゴリー: ポケコン, 電子工作 | コメントする

アンノカントク

テレビを見ていても、CMに入ると別のことをしていてテレビを見ていなかったりする。
ふと、テレビから何か聞き覚えのある声が。

 『!?』

しかしテレビの方を見てもすでに「HONDA」のロゴが。
あの独特の声は、でも、まさか。
2、3回同じことを繰り返していたら先日ようやく件のCMを見ることができた。

やっぱ庵野監督やんけ!

YouTubeでONE OK ROCK×庵野秀明 「Go, Vantage Point.」というタイトルでCM動画を見ることができる。

ついでにおおきなカブ(株)の動画も見ることができた。
原作についてもこちら。

そういえば、去年「シン・ゴジラ」を2,3回ぐらい見に行って、島本和彦「アンノ対ホノオ」も手に入れて、今年になってBDをてに入れたらなんか「アオイホノオ」や「監督不行届」も見たくなって、ネットでいろいろ記事を検索したりしてみた。

続きを読む →

カテゴリー: ひとりごと, マンガ・アニメ | コメントする

ポケコンにプリンタをつないでみた2

プリンタのコネクタについてピンアサインを眺めてみる。
アンフェノール14ピン、36ピン、Dサブ25ピンと種類があり、信号名を眺めていたら、もう一台作ってみたくなった。

今回作ったインターフェース基板・

コネクタはDサブ25ピンの物とした。
LEDバー2つ付けて、信号の状態を表示させている。
さらに、Init,AutoFeedのスイッチもつけてみた。

まずはポケコンに接続。
ポケコン本体の電源が切れていても、5V の電圧は出っ放しになっている。
昔使ってたやつは、電源と連動していたと思ったけど、どうだったけかな。

左のLEDはオプトサプライ10バーLEDアレイ 3色(赤4緑3青3)タイプのもの。
右のLEDは全色緑のものを使用。

プリンタをつないだところ。

順番に接続直後、プリンタ電源ON直後、プリンタ初期化終了。
電源ON直後に、SelectとBusyが出力。
初期化終了でBusyが消灯した。

印刷中、

右側のLEDはD0~D7、STROBE、Clockを表示させている。

プリンタの蓋を開けたところ。

BusyのLEDが点灯。

ついでに感熱紙ロールも取り外す。

Busyのほかに、PaperEnd、ErrorのLEDも点灯。

プリンタの電源を落としたところ。

Busy、PaperEnd、Errorのランプが一瞬ついて、ErrorのLEDだけ点灯状態となった。

前回作成したものと並べてみる。

コネクタから繋がっているケーブルと、UEWの配線で大変なことになっている。

LEDとタクトスイッチの部分。
テプラで信号名を書いたシールを作って貼った。

ちなみに、一番左のPOWはポケコンの電源で、次のDは、ポケコンから送信されるデータ(Dout)の状態を表示。
×印は未使用のところ。
左のLEDは、青、緑、赤の3色をうまく利用している。

Dサブコネクタの部分。

垂直取付用ブロック CB26-6
ジュラコン(R)スペーサー(2個入) M3用 4mm
ジュラコン(R)スペーサー(2個入) M3用 2mm
ジュラコン(R)スペーサー(2個入) M3用 3mm
スペーサー 六角両メネジ M3 (L=12mm)
これらを駆使して、基板、コネクタ、アクリル板を取り付けている。

印刷するときに各LEDがキラキラ点滅するだけの物だけど、見ているとそれなりに面白いので、ちょっとだけいい物ができたと思う。

カテゴリー: ポケコン, 電子工作 | コメントする

ポケコンのPIC開発環境

ポケコンのエミュレータをみつけたので、試してみることにした。
Linux/Windows/MacOSX用ソフトウェアから「g800win32.0.10.14.zip」(エミュレータ)と「copyrom.zip」(ROM吸出し)でPC上で動かすことに成功。

各ページのROMのアドレス0xC000-0xFFFF内容を0x1000-0x4FFFに転送して、それをHEXファイル(拡張子はTXT)として吸い出してエミュレータで動かすものだが、HEXファイルをバイナリにして中身をざっと覗いたところ、どうやら「rom14.txt」にPICのINIファイルが存在してるようなので、ちょっと調べてみた。

もう10年以上前のポケコンで、わざわざ制限付きのアセンブラ環境でPICのプログラムなんてする人なんてもういないだろうけど、ネットで調べてもあまり情報がなく、なんとなく気になったので調べてみる。

0x208DのところからINCファイルの一覧がある。

INCファイル定義部分

       00010203 04050607 08090A0B 0C0D0E0F  0123456789ABCDEF
02080                               075049               .PI
02090  432E494E 433ED10B 50313646 3632372E  C.INC>..P16F627.
020A0  494E43CB D10A5031 36463833 2E494E43  INC...P16F83.INC
020B0  F4D60A50 31364638 342E494E 43F4D60B  ...P16F84.INC...
020C0  50313646 3834412E 494E43F4 D60B5031  P16F84A.INC...P1
020D0  36463632 382E494E 43CBD10B 50313646  6F628.INC...P16F
020E0  3837302E 494E43CB D80B5031 36463837  870.INC...P16F87
020F0  312E494E 4394DE0B 50313646 3837322E  1.INC...P16F872.
02100  494E43DF E40B5031 36463837 332E494E  INC...P16F873.IN
02110  4334EB0B 50313646 3837342E 494E432D  C4..P16F874.INC-
02120  F30B5031 36463837 362E494E 4334EB0B  ..P16F876.INC4..
02130  50313646 3837372E 494E432D F3        P16F877.INC-.  

構成としては、
ファイル名長さ(1バイト)+ファイル名(可変長)+参照先ROMアドレス下上(2バイト)
となっているようなので、わかりやすく並べなおす。

長 P 1 6 F  x x x  . I N C  下上    ファイル名 参照先 転送後読み替え
+- +-+-+-+- +-+-+- +-+-+-+- +-+- ------------ ----    ----
07         504943 2E494E43 3ED1      PIC.INC D13E -> 213E
0B 50313646 363237 2E494E43 CBD1  P16F627.INC D1CB -> 21CB
0A 50313646 3833   2E494E43 F4D6   P16F83.INC D6F4 -> 26F4
0A 50313646 3834   2E494E43 F4D6   P16F84.INC D6F4 -> 26F4
0B 50313646 383441 2E494E43 F4D6  P16F84A.INC D6F4 -> 26F4
0B 50313646 363238 2E494E43 CBD1  P16F628.INC D1CB -> 21CB
0B 50313646 383730 2E494E43 CBD8  P16F870.INC D8CB -> 28CB
0B 50313646 383731 2E494E43 94DE  P16F871.INC DE94 -> 2E94
0B 50313646 383732 2E494E43 DFE4  P16F872.INC E4DF -> 34DF
0B 50313646 383733 2E494E43 34EB  P16F873.INC EB34 -> 3B34
0B 50313646 383734 2E494E43 2DF3  P16F874.INC F32D -> 432D
0B 50313646 383736 2E494E43 34EB  P16F876.INC EB34 -> 3B34
0B 50313646 383737 2E494E43 2DF3  P16F877.INC F32D -> 432D

マニュアルに書かれている以外にも対応しているPICがあるようだ。

ROMの内容が0xC000-0xFFFF内容を0x1000-0x4FFFに転送されているため、参照先のアドレスも読み替えてPIC.INCの参照先(0x213E )を見てみる。

PIC.INCファイル

       00010203 04050607 08090A0B 0C0D0E0F  0123456789ABCDEF
02130                                 0E57                .W
02140  00000000 00000000 00460000 00000000  .........F......
02150  00010049 4E444600 00000000 00544D52  ...INDF......TMR
02160  30000000 00010050 434C0000 00000002  0......PCL......
02170  00535441 54555300 00030046 53520000  .STATUS....FSR..
02180  00000004 00504F52 54410000 00050050  .....PORTA.....P
02190  4F525442 00000006 0050434C 41544800  ORTB.....PCLATH.
021A0  000A0049 4E54434F 4E00000B 004F5054  ...INTCON....OPT
021B0  494F4E5F 52810054 52495341 00000085  ION_R..TRISA....
021C0  00545249 53420000 008600             .TRISB.....     

どうやら、
1個目:定義数(1バイト)+定数名(8バイト)+値(1バイト)
2個目以降:0x00 or 0x01(1バイト)+定数名(8バイト)+値(1バイト)
と10バイトの固定長になっているようだ。

一つ一つ手作業で変換するのも面倒なので、ポケコンでBASICでプログラムを組んでみる。
前提条件としては、copyromでAレジスタで0x14を指定した後、ROMの内容を0xC000-0xFFFFから0x1000-0x4FFFに転送済みになっていること。
PCとポケコンを通信ケーブルでつないでTeraTermなどでデータを受信できる状態であること。

定数定義吸出しプログラム

 
100OPEN "COM1:"
110INPUT "ADDRESS: ";AD$
120IF AD$="END" OR AD$="EXIT" THEN PRINT "==END==":CLOSE :END
130DC= PEEK ( VAL ("&H"+AD$))
140PRINT #1,""
150PRINT #1,"ADD:"+AD$
160PRINT #1,"CNT:"+ STR$ DC
170PRINT #1,"     LABEL    VAL"
180PRINT #1,"---- -------- ----"
190FOR LC=1 TO DC
200PP$=""
210PB$=""
220PP$= RIGHT$ ("    "+ STR$ ( PEEK ( VAL ("&H"+AD$)+(LC-1)*10)),4)+" "
230FOR C=1 TO 8
240 DT= PEEK ( VAL ("&H"+AD$)+(LC-1)*10+C)
250 IF DT>=&H30 AND DT <&H7F THEN PP$=PP$+ CHR$ DT ELSE PP$=PP$+ " "
260NEXT
270PB$= " &H"+ RIGHT$ ("0"+ HEX$ ( PEEK ( VAL ("&H"+AD$)+9+(LC-1)*10)),2)
280PRINT #1,PP$;PB$
290NEXT
300PRINT #1,"==== ======== ===="
310PRINT #1,""
320GOTO 110


実行した結果は以下の通り。
長いので、実行結果は次のページで。
続きを読む →

カテゴリー: ポケコン | コメントする

ポケコンにプリンタをつないでみた

ポケコンを買って今度はプリンタを買って印刷をしてみることをした。
今回Amazonで買ったプリンタはエプソンのTM-T88IVというものだ。
中古で2,980円+送料手数料740円で合計3,720円と手ごろな値段。
当初の考えていたArduinoのプリンタシールドよりもはるかに安い。
しかし、ちょっとでかいしちょっと重い。
ACアダプタの大きさも半端ない。
これに感熱紙ロールを追加で買って印刷を行う準備をする。

『ポケコン・エレクトロニクス』に掲載されているセントロニクス・インターフェイスの回路図をもとに基板を組む。

たしか高校生の頃にも作ったはずだが、もう残ってないはず。
あの頃よりも配線はきれいにできているはずだ。

次に、ポケコンとプリンタをつなぐ。
アンフェノールコネクタなんてかなり久々に見た気がする。
14ピン-36ピンのケーブルなんて見かけないので自作する。
製作費の半分以上がこのコネクタに掛かってんじゃないだろうか。

実際につないで印刷してみたところ。

左は文字コードを印刷するプログラムを実行したところで、右はLLISTでプログラムを印刷しているところ。
BASICなんて何年ぶりだろうか。
ちなみにLLISTで印刷するためには、まずOPEN ”LPRT:”コマンドでプリンタポートを開く必要がある。

ちなみにインターフェース基板にLEDを追加している。
一番上にポケコンの電源表示の赤LED
二番目以降はオレンジのLEDで、ポケコンのXOUT(クロック)
三番目にポケコン側のBUSY~プリンタ側の/STROBE
四番目にプリンタ側のBUSY~ポケコン側のACK
ところが、二番目のBUSYは基本点灯しっぱなし(実際は点滅しているはず)
三番目のBUSYは消灯(一瞬だけついているのだろうけど視認できない)
唯一わかりやすいのは4番目のプリンタ側のBUSYだけだった。

印刷中に一瞬点灯することがあるし、プリンタ側でエラーなどが発生すると点灯する。
上の写真は、ロール紙のカバーを開けてプリンタ側でエラー状態にしている状態で、インターフェース基板上のLEDが点灯しているところ。

印刷した内容の前に、ポケコンの文字コードを表示させてみる。

次に、印刷したものを並べてみる。

なぜ2種類あるかというと、プリンタの文字コードセットがデフォルトではポケコンのコードとは異なっているのである。
プリンタの制御コードでESC/Pというものがあるが、このプリンタはESC/POSというもので制御している。
どうやらPOS用に特化した制御コードらしいが、基本的に使い方は似たようなもののようだ。
ただ、エプソンのサイトに登録しないとESC/POSの資料はもらえないようだが、ググってみたら資料はそれなりに見つかる。
ググった結果、シチズンの「モデル:CMP-20/30」用のコマンドリファレンスが見つかったので、それをもとに設定を変えてみる。

左がデフォルトの状態、右が国際文字セットとページ1を指定したもの。

&HF8(0xF8)以降の文字が異なっているが、まあ特に大きな問題ではなかろう。

デフォルト設定のまま

10:OPEN "LPRT:"
20:LPRINT "     0123456789ABCDEF"
30:LPRINT "---------------------"
40:FOR H=&H20 TO &HF0 STEP &H10
50: CC$=""
60: FOR L=0 TO 15
70:  CC$=CC$+ CHR$ (H+L)
80: NEXT
90: LPRINT HEX$ H;" : ";CC$
100:NEXT
110:FOR I=1 TO 10
120: LPRINT
130:NEXT
140:CLOSE
150:END

 

文字コードの初期化をして日本語の文字コードに設定。
20行目でESC tで文字コードテーブルの選択(ページ1カタカナ)
30行目でESC Rで国際文字セットの選択(日本)

10:OPEN "LPRT:"
20:LPRINT CHR$ &H1B;"t"; CHR$ 1
30:LPRINT CHR$ &H1B;"R"; CHR$ 8
40:LPRINT "     0123456789ABCDEF"
50:LPRINT "---------------------"
60:FOR H=&H20 TO &HF0 STEP &H10
70: CC$=""
80: FOR L=0 TO 15
90: CC$=CC$+ CHR$ (H+L)
100: NEXT
110: LPRINT HEX$ H;" : ";CC$
120:NEXT
130:FOR I=1 TO 10
140: LPRINT
150:NEXT
160:CLOSE
170:END

プリンタインターフェースのほかに、カセットインターフェースも作った。

こちらも高校時代に作ったが、実装密度は2倍近くになってサイズは約半分ぐらいになっているはず。
一応、ステレオプラグを使うかアナログプラグを使うかでジャンパーピンで選択できるようにしている。
時間がなかったので、手書きなのはご愛敬、


追記 2017/07/20
ESC/POSのコマンドリファレンスで、他にもいいものがあったので忘備もかねて記載しておく。
三栄電機プリンターコマンドリファレンス
ESC/POS – Epson
FAQ for ESC/POS

カテゴリー: ポケコン, 電子工作 | コメントする

思わずポチってしまった。後悔はしていない(ポケコンを買った)

Amazonで何気なくポケコンで検索してみたら、いくつか商品が出てきた。
新品だと2万円以上、中古だと数千円から。
本当なら新品が良かったけどちょっと高すぎなので、中古で状態のいいものということで14,000円のものを買った(それでも高いほうだが)
買ったのはSHARPのPC-G850VS。

工作するためにいろいろ計算することが多いのだが、電卓とメモ用紙に筆算では限界がある。
関数電卓でも良さそうだけど、昔使ったことがあったが何か使い慣れなかった。
ポケコンだと入力した式がそのまま見えるし、表示されていれば、数字を修正して式を使いまわせる。
Excelを使うまでもないけど、いろいろ数字を変えて何度も繰り返したいときはプログラムを組めばいい。
せっかくポケコンを買ったので周辺機器も作ってみた。
写真左下のは、高校生の頃に買った『ポケコン・エレクトロニクス』という本をもとに手持ちのパーツで作ったレベル変換器。
新規で買ったパーツは1μFの電解コンデンサ5つだけ。
右下のは「PC-G850用USB通信ケーブルを作ろう!」をもとに秋月のFT-232RQ USBシリアル変換キットを使って作ったUSB通信ケーブル。
元のページを見てもらえばわかるけど、USBシリアル変換キットのピン配置がポケコンのピン配置と酷似しているため多少の工夫だけですぐにつなぐことができる。
しかし、元ネタのままだと未使用ピンが不格好なので、ちょっと工夫して、ついでにLEDをつけてみた。
つけたのはポケコン側の電源LEDと、TxD,RxD,CTS,RTSのLED。
FT-232RQのCBUS0~4の端子が出ていないので、TxD,RxD,CTS,RTSに直接LEDをつけた。

次はプリンターをつないでみたいところだけど、プリンタは微妙なところだ。
シリアルポートは今のところサーバーやネットワーク装置のコンソールポートなどでかろうじて生き残っているが、パラレルポートのプリンタなんてそれこそ絶滅種である。
Arduinoのプリンタシールドで、ポケコンと直結してArduinoの内部で変換して印刷するスケッチでも組んでみるかと思ったが、AS-289R2プリンタシールドの値段を見て断念。
今回買った中古のポケコンより高いじゃねぇか。
Amazonで何とか3,000円弱の中古品のプリンタがあったのでそれをゲット。
あとはパラレル変換器を作るだけの状態。

ポケコンといえば、高校時代に配布されたのがPC-G803という機種。
そのころ『ポケコンジャーナル』(だったかな?)っていう雑誌があって毎回買っていた思い出がある。
そこでPC-G813という上位後継機種についての記事があったので、高校の先生に頼んでPC-G813をゲット。
しばらく2台持ちだったのだが、昔あった『ラジオの製作』(電波新聞社)の電子工作コンテストに出品した際にポケコンを紛失されてしまった。
以降はPC-G813が高校時代のメインマシンとなる。

社会人になってもポケコンは会社で大活躍。
ある数字の変換のためだけにパソコン1台占有していたのを、ポケコンで同じことができるものを作った。
他にも便利ツールを作ったら、自分のポケコンはいつの間にか職場の共有ポケコンになって便利に使われてしまった。
同じ高校の先輩後輩がいたので、そのポケコンにもプログラムをコピーしてやって複数のポケコンが職場の共有物となってしまった。
東京に転勤になる際に職場に置いてきてしまったわけだが、今頃どうなってしまったんだろうなぁ・・・

カテゴリー: ひとりごと, ポケコン, 電子工作 | コメントする