NanoPi NEO2とLattePanda

NanoPi NEO2だがpinピンアサインをよく見ると、USBが2ポート分出ている。
また、このままだと放熱板を下向きで扱うことになるのでなんか気になる。
そこで、USBポートと音声系のジャックを付けたベース基板を作ってみた。

コンソールからI2Cのメッセージが出っ放しだったのは、プルアップ抵抗をつけてみたところ全く出なくなった。

装着したところ。
 
GPIOコネクタはNanoPi NEOの場合24ピンだが、RaspberryPiに合わせて26ピンにしてある。
25番ピンはGNDにして26番ピンはNCにしてある。
秋月電子のRaspberry Pi キャラクタ液晶ディスプレイモジュールキット バックライト付をつないで表示させてみたところ。

ピンアサインは同じなのでそのまま使うことができた。

それとは別にLattePandaも買った。
追加で液晶モニタやタッチパネルを買って繋いでみたが、タッチパネルの右側に行くほどずれて認識して右端は全然反応しない。
キャリブレーションしても右端の方は認識できずハズレを引いたかと思ったが、秋月電子のよくある質問(Q&A)のところにドライバの更新で改善されるとあったので試したところ、今度は正しく認識するようになった。
LattePanda用のケースはいくつか見かけたが、ディスプレイ込みのケースは見つけられなかったので、アクリル板を加工してケースをつくる。
ちなみにLattePandaの上に載せてる透明のアクリル板は別途買ったケースのもの
最初はディスプレイまでつけようとは思ってなかったので、買ったケースの物をそのまま使っている。
余った底板はどうしたものか。

ちなみに冷却ファンはケースの説明書にあったようにLattePandaの表側に付けてある。

秋月電子マルツの商品ページを見ると基板の裏面の方に付けているのだけど、表側でも大丈夫なのかしら。

背面の様子。

フラットケーブル長すぎ。
どういう使われ方をするかわからないから長めに作ったんだろうけど、余長の部分は無理矢理ケースの部分に押し込んである。

あとはスタンド。
いつものごとく切り取った残材を利用。
というか、今回は残材がわりと多かった。


今回は、冷却ファンやコネクタをふさがないようにちょっと凝ってみたけど、電源用のUSBケーブルやHDMIケーブルとぎりぎりの場所になってしまった。

ちなみに今回買ったのは4GB/64GBのほう。
ストレージが32GB版の方が安いのだけど、そんな容量だどすぐ残り容量が枯渇してくるのは目に見えていたので、奮発して64GB版の方にした。
それに32GBの方はWindows10 Homeに対して、64GB版の方はWindows10 Enterprise LTSBで、2万円台後半の値段でハードとEnterprise版がセットっていうのは結構いいほうなのかな。
秋月電子のページ
マルツのページ

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

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がはっきりしているので正しく印刷することができたってところか。

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

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

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のページはいつの間にか削除されていた。

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

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をてに入れたらなんか「アオイホノオ」や「監督不行届」も見たくなって、ネットでいろいろ記事を検索したりしてみた。

続きを読む →

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