NanoPi NEO2

NanoPi NEO2を手に入れて遊んでみる。

コンソールをつなぐと、延々と「i2c i2c-0: mv64xxx: I2C bus locked, block: 1, time_left: 0」のメッセージが出続けている。

 
pi@NanoPi-NEO2:~$
pi@NanoPi-NEO2:~$ [   24.062267] i2c i2c-0: mv64xxx: I2C bus locked, block: 1, time_left: 0
[   26.110219] i2c i2c-0: mv64xxx: I2C bus locked, block: 1, time_left: 0
[   28.158041] i2c i2c-0: mv64xxx: I2C bus locked, block: 1, time_left: 0
[   30.206210] i2c i2c-0: mv64xxx: I2C bus locked, block: 1, time_left: 0
[   32.254037] i2c i2c-0: mv64xxx: I2C bus locked, block: 1, time_left: 0

NanoPi NEO/NEO2を販売しているページに載っている注釈にRaspberryPiとは互換性はありませんと書かれてはいるが、ピンアサインを見ると、実は結構RaspberryPiを意識しているのではないかと思わされる。
図のように、+5V,+3.3V,GND,i2c,UART,SPIの位置が一致している。
もちろんピン数が違うので、RaspberryPiでしか使えないものもあるし、UARTの使われ方も若干違うが、そこは設定や使い方次第だし、SPIも1デバイス分しかないけど、その辺を押さえておけば結構流用できる物もあるのではないだろうか。
どちらかというと初期型のRaspberryPiが近いのかな。



そこで、メッセージが鬱陶しいのでなんとなくRaspberryPi用のRTCモジュールをつないでみた。

 
root@NanoPi-NEO2:~#
root@NanoPi-NEO2:~# i2cdetect 0
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-0.
I will probe address range 0x03-0x77.
Continue? [Y/n] y
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
root@NanoPi-NEO2:~#
root@NanoPi-NEO2:~#

結果、「i2c i2c-0: mv64xxx: I2C bus locked, block: 1, time_left: 0」のメッセージは出なくなって、RTCも認識しているようだ。
あとは、RTCモジュールを使えるように設定してやればOKかな?

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

続・MSXのプリンタを手に入れた。そしてポケコンにつないでみた。

前回MSXプリンタを手に入れた際、自作のインターフェースでは印刷に不具合が発生していた。
少し気になったことがあったので、自作2号で試してみることにした。

Dサブ25ピン用に作ってあるので、変換ケーブルを作る。
PaperEnd、Errorまで考慮に入れていないのでPaperEnd、ErrorのLEDは付きっぱなしだが、信号をモニタしているだけなので、とりあえず無視する。
気が向いたら変換ケーブルの方手直ししておくか。

そして実際印刷させてみた。

案の定LLISTもハードコピーもうまくいっている。

1号機2号機の違いについてみてみる。

1号機は元にした本をそのまま作っているのに対し、2号機では74HC05ではなく74HC04を使ってアレンジを加えている。

回路図は以下の通り。

74HC04と74HC05の違いについてデータシートを確認すると、74HC05のデータシートには『ピン接続、機能はTC74HC04A と同じですが、すべての出力がNチャネルFET のオープンドレインになっており、ワイヤード接続が可能です。』と記述されている。
元の回路を見るに、プリンタ側でプルアップされているだろうことを前提に、74HC05を使用しているようだ。

ところが今回のMSXプリンタの場合、74HC05がオープンドレインになっていることでプリンタ側でHレベルが十分認識できない場合があって1号機では正しく印刷できず、74HC04を使った2号機ではH/Lがはっきりしているので正しく印刷することができたってところか。

こうして原因を調べたらあっけないものだったな。

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

MSXのプリンタを手に入れた。そしてポケコンにつないでみた。

16日の土曜日。
秋葉原でいつものようにジャンク巡りをしていた。
昔に比べてジャンク屋が確実に減っているよなと思いつつ、まだ入ってみたことがない店があったので、入ってみる。
なんと、昔MSXで使っていたプリンタと同じものがジャンク扱いで480円(税別)で売っていた。
懐かしさもあいまって、値段もお得なのでダメ元で速攻購入。
それがこのPanasonicのFS-PC1というプリンタ。

カラー印刷もできる機種だが、もはやインクリボンは売ってないだろうからもっぱら感熱紙専用のプリンタとしか使いようがない。
早速100円ショップでFAX用の感熱紙ロールを買う。

A4サイズ用の感熱紙ロール用の止め具はついているが、100円ショップで売ってたのはB4サイズの物のみだった。
とりあえず、Lアングルの残材を用いてB4ロールの止め具を作る。
オプションを取り付けるための穴があるのでそれを利用して固定。

高校時代も確かB4サイズのロールを使ったような記憶があるのだが、そのときどうやったのかよく覚えてない。
針金を使って何とかしたような気もするのだがよく思い出せない・・・

本来なら針金でできた印刷された紙が給紙側に巻き込まれるのを防止するための金具があるのだが、ジャンクのためかついてなかったので、塩ビ板を適当に加工して代用品を作って準備完了。

ただ懐かしさと値段の安さだけで買ったわけではない。
高校時代にポケコンとこいつをつないで印刷してみたりしていたこともあったので、今回もこいつでポケコンから印刷をしてみようと思ったわけだ。

まずはCT-431をつないで印刷してみる。

OPEN ”LPRT:”したあとにLLISTコマンド。
ちゃんとリストが印刷された。
いったんCLOSEしてプログラムを実行。
ポケコンの表示はこんな感じ。

FS-PC1(というかMSX用のプリンタ)はPC-PR系のコマンドが使われているのをだいぶ昔に調べたことがあったので、もしやと思って確かめてみる。

うん、OPEN前のHDCOPYは正しく印刷されている。
というか、なぜか左上に「P」と印刷されているが。
OPEN後にLPRINTとかした後とかCLOSE後のHDCOPYコマンドはなぜかゴミが混ざってしまっている。
[SHIFT]+[1]でもハードコピーを取ってみる。

一応うまくいっている。
なぜかやっぱり左上に「P」と印刷されているが。
もひとつおまけに文字コードで印刷してみる。

80h~9FhとE0h~FFhはMSXではひらがなが割り当てられているので、プリンタもその通りに印刷されている。
ちなみにLPRINTで「;」を付けて連続印刷した場合、最後に「;」を付けずでLPRINTしてやらないとプリンタのバッファに残って印刷されないことがあるので注意しなければ。

次に本を参考に自分で作ったインターフェースで確かめてみる。

LLISTが正しく印刷されていない。
ハードコピーもうまくいっていない。
自作のインターフェースが悪いのか、それとも別の何かがあるのか。
高校時代にPC-G803・PC-G813とつないだ時は正しくLLISTで印刷できたのに。
TM-T88IVの場合もLLISTは正しく印刷できているし、いったい何が何やらわけがわからなくなってきた。

ちなみにエプソンのTM-T88IVのページはいつの間にか削除されていた。

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

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, PC-G850VS, ポケコン, 電子工作 | コメントする

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 Parallel / 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);
  SPif=0;
  delay(5);
  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, PC-G850VS, ポケコン, 電子工作 | コメントする

ポケコンのハードコピーの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, ポケコン, 電子工作 | コメントする

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

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, ポケコン, 電子工作 | コメントする

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

この前買ったポケコン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ボードに接続してみる。
延長した状態で正しく動くことを確認。

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

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

アンノカントク

テレビを見ていても、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がキラキラ点滅するだけの物だけど、見ているとそれなりに面白いので、ちょっとだけいい物ができたと思う。

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