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

前回、ORANGE pico (pocket)にポケコン用に買ったプリンタをつないで印刷してみた。
それではと今度はポケコンにORANGE pico用に買ったプリンタをつないでみることにした。
TM-T88IVはポケコンに対してでかいし、電源もでかい。
小さければ小さいで不満はあるし、大きければ大きいで不満がある。
いかんともし難いものである。

さてとして、方法は2つある。
・パラレル→シリアル変換を行って印刷する。
・OPEN “COM:”コマンドでシリアルポートを開く、もしくはTEXTモードのSioで送信する。

最初のパラレル→シリアル変換についてだが、ポケコンからの信号を一旦パラレルにする必要もなく、Arduinoでダイレクトにシリアル変換すればよいわけだが、それについてはすでに以前作った変換ボードが使える

こちらは、テキスト印刷には対応できるがハードコピーの処理速度にはついていけず一度は没にしたもの。
今回はテキストの印刷をシリアル出力させるだけなので、これだけで十分。
LPTモードとCE126Pエミュレートモードの両方で出力先をシリアルのみにして実行。
LPTモードはCHR$コマンドでプリンタのコマンドを送れるので、ESC/POSのコマンドを送って文字セットの変更ができる(左の写真)。
一方CE126Pエミュレートモードではプリンタのコマンドが送れないのでデフォルトの文字セットで印刷されてしまうが、MONモードでのダンプ印刷もできた(右の写真)。

CE126Pエミュレートモードで使うのであればこのプリンタはちょうどいい感じの大きさである。
初期化の部分でシリアルポートにもESC/POSで文字セットのコマンドを送るように手なおせばうまい具合に使えそうだ。

次はシリアルで出力させてみる。

ポケコンのTEXTモードでシリアルポートの設定を行い、SIO画面でSaveを行うとTextエディタの内容が印刷された。
ただし、EOF(0x1a)も送られるので2回目以降の印刷でゴミ(1桁の空白)が出てくる。
ちなみにポケコンの信号は反転された出力なので、トランジスタ2石使って反転させている。

ポケコンの仕様では+5VがGNDで0VがVddとなっているが、+5VをGNDとしてみた場合にRS232Cの規格からすると信号的にはあっていたはず。
この仕様はもっと他にも要因があるらしいけどね。

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

ORANGE picoにプリンタ(TM-T88IV)をつないでみた

ORANGE picoにはシリアルポート経由で印刷することができる。
公式ショップで買ったプリンタは小さくていいのだが、その分印刷の幅が狭かったり感熱紙ロールが短かったりする。

それではとポケコン用に買ったプリンタ(TM-T88IV)につながらないかと思い、秋月電子のAE-ATMEGA-328 MINIを使ってシリアルからパラレルへの変換するのを作った。

AE-ATMEGA-328 MINIは5V動作で、ORANGE picoは3.3Vで動作している。
多分なくても動作するかもしれないが、念のためレベル変換用に秋月の4ビット双方向ロジックレベル変換モジュールを使っている。
実際印刷してみたところ。

右の写真は、TM-T88IVと小型のプリンタの印刷結果を比較したところ。
やはり幅が広い分若干見やすくなっている。
しかし、いずれの場合もlptコマンド実行時にゴミが印字されるみたいだ。
気が向いたらTeraTermでバイナリログ取ってみるかな。

下はArduinoのスケッチ。
ESC/POSで言語の初期化ON/OFFのほか、CR(0x0d)をLF(0x0a)に変換する処理を入れてある。
これは、ORANGE picoが印刷時の改行コードがCR(0x0d)なのに対して、プリンタ(TM-T88IV)はLF(0x0a)で改行するようになっているため。
TM-T88IVのディップスイッチでCR(0x0d)で改行できるように変更できるが、そうするとこんどはポケコンで印字した時に二重に改行されてしまうので、いちいちプリンタ側で設定変更をしなくていいように変換器側で変換できるようにした。

調べてみるとCR,LFの解釈のしかたはどうもプリンタごとに違うようだ。

// serial to printer interface
// 2019.2.23

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

// other port
const int LEDout = 13; // LED
const int DIP4   = 14; // DIP SW 4
const int DIP3   = 15; // DIP SW 3
const int DIP2   = 16; // DIP SW 2  CR(0x0d) -> LF(0x0a)
const int DIP1   = 17; // DIP SW 1  ESC/POS init


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

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

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

  // Pbusy pull up
  digitalWrite(Pbusy, HIGH);

  // LED
  pinMode(LEDout, OUTPUT);
  digitalWrite(LEDout, HIGH);

  // DIP sw
  pinMode(DIP1, INPUT);
  pinMode(DIP2, INPUT);
  pinMode(DIP3, INPUT);
  pinMode(DIP4, INPUT);
  digitalWrite(DIP1, HIGH);
  digitalWrite(DIP2, HIGH);
  digitalWrite(DIP3, HIGH);
  digitalWrite(DIP4, HIGH);
  
  // ESC/POS printer init
  if (digitalRead(DIP1) == LOW ){
     PRTinit();
  }
}

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

void loop() {

  int input;

  // read serial
  input = Serial.read();

  if(input != -1 ){

    //  DIP SW 2  CR(0x0d) -> LF(0x0a)
    if (digitalRead(DIP2) == LOW && input == 0x0d){
       input = 0x0a;
    }

    // out parallel
    praout((byte)input);
  }

} // Ende loop

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

// 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(1);
}

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

// Parallel Printer interface
void praout(byte POdata) {

  int PrtBusy;

  // wait busy low
  digitalWrite(LEDout, LOW);
  do {
    PrtBusy=digitalRead(Pbusy);
  } while (PrtBusy != LOW);
  digitalWrite(LEDout, HIGH);

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

  // Strobe to low
  digitalWrite(Pstrb,LOW);
  delayMicroseconds(50);

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

今度は。ポケコンにORANGE pico用に買ったプリンタをつないでみるか。

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

どうぶつの森ポケットキャンプ その4

休憩がてら、ポケットキャンプを起動して島に行ってみる。

暗黒の島!

たまにガーデンでも真っ黒になることあったけど、島でこれはびっくりした。
この前のアップデートでこれも直ったかしら・・・

アップデートといえば、『ぺりおの宅急便』という機能が実装された。
これを使うと、わざわざぱしりどうぶつのお願いのためにフィールドの移動をする必要がなくなるので、休憩時間にちょこちょこいじる分にはすごく便利になった。

何故かフレンドが4人になった。
うれしいのだけどちょっと複雑・・・

カテゴリー: どうぶつの森ポケットキャンプ, ゲーム | コメントする

どうぶつの森ポケットキャンプ その3

暇つぶしに始めた割に、結構ガチではまってしまっている。

さて先週の月曜日の夕方ごろに休憩がてら起動してみると、見知らぬ通知が。
フレンド申請?
え、なぜ、どうして((((;゚Д゚))))ガクガクブルブル
たまに他のプレイヤーのキャンプ場なんか見に行っていいねすることはあったけど、フレンドとかあまり考えずにプレイしていたので、フレンド申請が来るとは思ってなかった。
始めは戸惑ったけど承認してフレンドになった。
そしていまはフレンドが2名になった。

コテージの方をちょっと改装してみた。

キャンピングカーの2階といい、なんのオフィスだよ(笑)
配置して思ったけど、思ったより置けるもの多くないな。
また気が向いたら何かしてみよう。

キャンプ場の様子。
 
釣り大会の景品の雪像とワカサギ釣り場を配置してみる。
冬って感じだな。
こっちは春になるころまでこのままにしよう。

キャンピングカー(1階)の様子。

自転車がバイクに進化。
ラーメンがカップラーメンに進化。
あとは、後部の方に釣り大会の景品の水槽を並べてみた。

キャンピングカーのローンを払い終わったと思ったら、ベルがたまりまくってきたので、製作可能な家具等をクラフトしまくっている。
リーフチケットはなるべく使いたくないけど、ある程度まとめて使おうと思うと課金しなきゃならんのがなぁ・・・
2月に入ったら1月ほどプレイできるタイミングも限られてくるだろうから、どうしたものかな。

カテゴリー: どうぶつの森ポケットキャンプ, ゲーム | コメントする

ORANGE pico Pocketを作ってみた

ORANGE pico Pocket 半完成キット V.1.1というものを見つけたので、早速買って作ってみた。

サイズはポケコンよりも小さい。
結構入力が面倒なので、ORANGE pico USB I/O UNITを追加で買って接続することにする。

ORANGE pico Pocketからは3.3Vの出力しかなく、USB用に5Vを準備する必要があるので、小型のPololu ステップアップ/ステップダウン 電圧レギュレータ S7VF5というものを使って5Vに昇圧してUSB用の電源を確保。
ORANGE pico Pocket側のコネクタについて、シリアルポート用のコネクタとI/Oポート用のコネクタの幅が2.54mmではないので、ORANGE pico Pocketに合わせるようにずらして半田付けしている。

実際につないでUSBメモリの中身をxfilesコマンドで表示させてみた。
USBメモリにはORANGE pico 公式サイトのサンプルやオレンジピコにベーシックのプログラムを書き込んである。
いくつかORANGE picoの不具合に引きずられて使い勝手の悪い部分はあるけど、これはこれで面白いと思った。

不具合の例
・USBでファイルをロード・セーブする場合、半角カナが消える。
・LCD表示の場合、スクリーンエディタモードでBSキーやDELキーを使うと表示がおかしくなり、修正がしづらい。(ラインエディタモードならOK)
・LCDでは正しく動かないプログラムがある
等・・・

この辺が修正されればもっと使い勝手が良くなるんだけどなぁ・・・

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

どうぶつの森ポケットキャンプ その2

合間を見てはポケットキャンプをやっている。
基本、キャンピングカーに全振りして、たまにキャンプ場やコテージの方を手入れしている。
どうぶつ達のパシリ希望をかなえてベル(どうぶつの森の通貨)をためてキャンピングカーの面積を増やして、家具等のアイテムなんかはキャンピングカーに置くものを優先。
たまにどうぶつを呼ぶために必要なのものを作っていった。

ただ、キャンプ場についてはイベントがあったので、それに合わせて手に入れたものでそろえてみた。

右のスケートリンクは、たまにどうぶつ二人が滑っていたるする。

キャンピングカーの内装はについては面積MAXの状態にした。
1階の様子
 

2階の様子

電話は広場で売っていた黒電話に進化。

カテゴリー: どうぶつの森ポケットキャンプ, ゲーム | コメントする

どうぶつの森ポケットキャンプ

Nintendo Switch向けのゲーム『大乱闘スマッシュブラザーズ SPECIAL』でしずえインフィニティなるバグの動画を見た。
バグのインパクトに爆笑しつつ、それでは『とびだせどうぶつの森』ってどんなゲームなのかプレイ動画も見て面白そうだと思った。
しかし、そもそもあまりゲームをするほうではないので、わざわざニンテンドー3DSを買ってまでやってみようとまでは思わなかった。
そしたらスマホ向けに『どうぶつの森ポケットキャンプ』というのがあるので、それならばとそれをダウンロードしてプレイすることにした。

もともとは、年末年始に帰省した際になにもやることがなくて始めることにしたのだけど、思った以上に面白くてはまってしまった。
ちょうど元日の夜から始めて今日までほとんどポケットキャンプに費やしてしまった。
現在Lv.37なんだけどこれって高いのか低いのかよくわからん。

キャンプ場の様子

コテージの様子

キャンピングカーの様子。

今後は移動時間や休日ぐらいしかできないと思うけどまたーりとやっていこうかな。

カテゴリー: どうぶつの森ポケットキャンプ, ゲーム | コメントする

Z80-MBCが売り切れになっているので、ユニバーサル基板で作ってみた。

Z80-MBCの部品セットがいつのまにか売り切れになっていた。
遊ぶ用と保守用で2台作ったが、2台目を注文した時点ではまだ在庫は各色合わせてまだ数台ほど残っていたはず。

とりあえず緑が1台目。
何かあった時の保守用として2台目として白の部品セットを買った。
白基板は妙に半田付けがしづらかったのはなぜだろう。
2台買ってもう十分だろうと思っていたのだが、そのうちに件のサイトを見ると部品セットも基板のみも売り切れになってしまっていた。

売り切れになったのを眺めているうちに、何故か、無いなら自分で作ればいいじゃないかという思いが生まれてきて、何故か、ユニバーサル基板を使って製作してみることにしてしまった。

そして、連休を費やして何とかつくりあげた。
とにかく配線が面倒だった。
左側にまだ余白があるのは、ここからポケコン用の82C55ボードをつなげるためのピンヘッダを付けるつもりでいたから。
しかし、Z80のバスがむき出しの状態にして実装するのは、誤って端子に触れて誤動作を起こす可能性があることと、それ以上に配線が面倒だからやめた。

主要なIC付近の配線と基板の裏面の様子。
 
片面基板でもよかったような気もするが、コネクタの部分って結構力がかかって銅箔が応力ではがれることもあるので、端子数が多いコネクタやピンヘッダ・ピンソケットを使う場合は両面基板を好んで使ったりする。
裏面は基本的に電源ラインのみにして、信号は表面でポリウレタン線を使って配線している。
結果、表面のポリウレタン線がものすごい状態になってしまった。

回路図は本家のサイトにあるので、そこから各PDFファイルを落として参考に配線を行った。そのほか必要となるファイルもここにあるので今更ながら書いておく。
前回作ったHEXファイルをATMEGA32Aに書き込んで、実際に動かしてみたところ、無事動いてくれた。
これもCP/Mを使えるようにEEPROMにディスクイメージを書き込んでいく。
USERボタンを押しながらリセットボタンを押し、メニューが表示されるまでUSERボタンは押しっぱなしにする。

ファイル転送でも行間の遅延設定ができたと思ったのだが、ちょっと見当たらなかったので、コピペの設定で行間遅延を100ミリ秒に設定。
ここを忘れるとHEXファイルを転送する際にバッファあふれでHOLT状態になってしまうので注意。

メニューで「3」を選んで「iDisk – S250317.hex」をコピペする。

転送が終わると今度はディスクイメージのHEXファイルを転送するように表示される。
「D0CPM_SEG0.hex」をコピペで転送する。

転送が終わると書き込みを実施するか聞かれるので「W」→「Y」を順に選ぶ。

EEPROMにデスクイメージが書き込まれて、次のイメージの入力待ちになるので続いて「D0CPM_SEG1.hex」「D0CPM_SEG2.hex」……「D1PAS_SEG3.hex」と順番に繰り返していく。

最後のHEXファイルを書き終えたらUSERボタンを押しながらリセットボタンを押し、メニューが表示されるまでUSERボタンは押しっぱなしにする。
メニューが出たら「4」でCP/Mを起動する。

CP/MからMBASICを起動して、OUT 0,1としてUSER LEDを点灯させたところ。

USER LEDやほかのLEDはやたらとまぶしいので、拡散キャップを付けてある。

1台目と2台目と自作の3台目

別に3台目までほしいと思わなかったのに、何故ユニバーサル基板で作ろうなんて思ってしまったのだろう。

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

ダイドーブレンドのCM

ダイドーブレンドのCM
どうみてもアオイホノオアンノにしか見えないw

カテゴリー: ひとりごと | コメントする

Z80-MBCのファームウェアをなおしてみた

Z80-MBCでI/Oを使えるようにするため、ファームウェアの修正を行うことにした。
ソースを眺めてどう直すべきかは見当はついているが、まずはその前にArduino IDEの準備を行う。

Arduino IDEでATMEGA32Aを扱えるように準備する。
「ファイル」→「環境設定」で、「追加のボードマネージャのURL」に次のURLを指定。
https://mcudude.github.io/MightyCore/package_MCUdude_MightyCore_index.json

次に「ツール」→「ボード」→「ボードマネージャ」を選択。
ボードマネージャで「MigtyCore」を選んでインストールする。
ちなみに、下のボードマネージャの画面はインストール済みの場合。

インストールが済むと、ATMEGA32が使えるようになるのでATMEGA32を選択して他のパラメータも設定する。
 

設定が済んだら準備完了。
ファームウエアの修正を行う。
「S221116_R100218_Z80.ino」を読み込んで、修正して別名で保存する。
修正内容はI/Oの読み込みの際にATMEGA32Aのポートを出力に設定してデータを出力するところ。
元のプログラムではI/O処理の後に無条件で出力に設定してデータを出力しているので、これをI/Oアドレスが0x0f以下のときのみ出力するように修正。
切りのいいところで0x10からは自由にI/Oが使えるようにした。
修正前

        DDRA = 0xFF;                               // Configure Z80 data bus D0-D7 (PA0-PA7) as output
        PORTA = ioData;                            // Current output on data bus

修正後

        if (ioAddress <= 0x0f)
        {
          DDRA = 0xFF;                               // Configure Z80 data bus D0-D7 (PA0-PA7) as output
          PORTA = ioData;                            // Current output on data bus
        }

修正が終わったらコンパイルしてATMEGA32Aに書き込みをおこなう。
「スケッチ」→「コンパイルしたバイナリを出力」でコンパイルする。

コンパイルが済んだら2つのHEXファイルが作られるので、とりあえず「with_bootloader」と付いたほうのHEXファイルをライターで書き込む。
念のため新品のATMEGA32Aに新しいファームウェア書き込んで、ダメだったら元のATMEGA32Aに取り換えれば済むようにした。
新品なので、ヒューズの設定を忘れないように。
ネットでいろいろ調べて以下のようにした。
HIGH = 0xD6
LOW = 0xE4
LOCKBIT = 0xCF

ATMEGA32Aに書き込んだ後、早速ボードに取り付けて起動してみる。

変更したファームウェアであることがわかるように、修正の際にバージョン情報のところにFJTとつけてみた。
正しく起動できているようなので、早速82C55ボードをつないでMBASICでプログラムを実行してみる。

正しくI/Oデータの読み取りができるようになった。
スイッチで値を変更したらそれに合わせて表示される値も変更されることを確認。
MCP23017のI/Oも試して正しく動くことを確認して、ほかに影響が出ていないことも確認。

これでI/Oを拡張して遊ぶことも可能になった。
さて、どうやって遊ぼうかな。

カテゴリー: Arduino, Z80-MBC, 電子工作 | コメントする