全9件 (9件中 1-9件目)
1

Arduinoだけでも、プリンタポートのチェックは可能なのですが、Arduinoの電源供給がUSBであることもあり、どのみちUSBで接続するなら、モニタ用のPC側で、状況を確認する方法もあります。Arduinoのプログラム開発環境にはシリアルモニタが付属しています。シリアルモニタを起動すると、STROBEがONになるのを待ち受ける画面が表示されます。98ノート側で、作成したPRNCHK.BATをDOS環境(又はDOS窓)で保存したフォルダにカレントディレクトリを移動してから実行します。(PRNCHK リターン)起動すると0-7、S、B、Qのキー入力待ちが表示されます。入力するキーでの動作は以下のとおりです。・0:bit 0をHighにする(0b00000001をプリンタポートに出力する)・1:bit 1をHighにする(0b00000010をプリンタポートに出力する)・2:bit 2をHighにする(0b00000100をプリンタポートに出力する)・3:bit 3をHighにする(0b00001000をプリンタポートに出力する)・4:bit 4をHighにする(0b00010000をプリンタポートに出力する)・5:bit 5をHighにする(0b00100000をプリンタポートに出力する)・6:bit 6をHighにする(0b01000000をプリンタポートに出力する)・7:bit 7をHighにする(0b10000000をプリンタポートに出力する)・S:STROBE信号のON/OFFをトグルする・B:BUSY信号の状態をモニタする・Q:スクリプトを抜けてDOSプロンプトに戻るここでは0(bit 0)を選択して、0b00000001をプリンタポートのData bitに送信します。Arduinoでプリンタラインの状況がモニタされ、モニタ用PCに結果を表示します。この例では、モニタ用PCにbit0のラインがHIGHになり、0b00000001を受信したことが示されています。途中、98ノートとArduino間のネゴシエーションのためのSTROBE信号やBUSY信号に変化についてもモニタ用PCに表示されます。98側のスクリプトが正常に終了して、次の入力の待ち受けになった場合は、98ノートのプリンタポートのSTROBEとBUSYが正常であることが判ります。98ノート側の画面で、Waiting.....と表示される様な場合は、STROBEまたはBUSYが故障していることになります。DATAラインは8本あるので、bit 0からbit 7まで順にこの作業を繰り返します。これらが、正常動作した場合は、98ノートの単方向データ通信に問題はなく、正常であるという結論になります。98ノートのプリンタポートチェッカー の記事は、以上です。
2022.05.06
コメント(0)

プリンタポートチェッカーの操作の説明をします。単方向通信のみサポートしている9801シリーズのプリンタポートが正常に動作するかの確認は、PC側から周辺機器側に送られる・DATAの8本のライン・STROBEの1本のライン周辺機器側からPC側に送られる・BUSYの1本のラインの合計10本のライン全てが、操作したとおりにHIGHまたは、LOWに移行するかを見ることです。まずは、簡単な方法である、Arduino nanoに結線したLEDを確認する方法です。とは言っても、Arduino nanoの電源供給は、USBポートなので、どのみちPCに接続して作業する場合は、その9を見てください。こちらは、LEDなどの機能を示しています。但しこれは、作成者の配線や部品配置によって異なってきます。私が作成したもののLED配置は写真のとおりです。BUSY信号のみArduinoのオンボードのLEDを使用していて、合計10個のLEDでプリンタのラインの状態を確認することができます。98ノート側で、作成したPRNCHK.BATをDOS環境(又はDOS窓)で保存したフォルダにカレントディレクトリを移動してから実行します。(PRNCHK リターン)起動すると0-7、S、B、Qのキー入力が表示されます。入力するキーでの動作は以下のとおりです。・0:bit 0をHighにする(0b00000001をプリンタポートに出力する)・1:bit 1をHighにする(0b00000010をプリンタポートに出力する)・2:bit 2をHighにする(0b00000100をプリンタポートに出力する)・3:bit 3をHighにする(0b00001000をプリンタポートに出力する)・4:bit 4をHighにする(0b00010000をプリンタポートに出力する)・5:bit 5をHighにする(0b00100000をプリンタポートに出力する)・6:bit 6をHighにする(0b01000000をプリンタポートに出力する)・7:bit 7をHighにする(0b10000000をプリンタポートに出力する)・S:STROBE信号のON/OFFをトグルする・B:BUSY信号の状態をモニタする・Q:スクリプトを抜けてDOSプロンプトに戻るまずは、プリンタポートのデータラインのbit 0をHighにしてみます。0を選択すると、Arduino側のbit 0に相当するLEDが点灯すれば、データラインのbit 0が正常動作していることを確認できます。もしLEDに変化が見られなければ、98ノートのプリンタポートのbit 0が故障していることになります。途中、98ノートとArduino間のネゴシエーションのため、STROBE信号やBUSY信号に変化します。正常に終了して、次の入力の待ち受けになった場合は、98ノートのプリンタポートのSTROBEとBUSYが正常であることが判ります。98の画面で、Waiting.....と表示される様な場合は、STROBEまたはBUSYが故障していることになります。DATAラインは8本あるので、bit 0からbit 7まで順にこの作業を繰り返します。これらが、正常動作した場合は、98ノートの単方向データ通信に問題はなく、正常であるという結論になります。その9では、Arduinoのシリアルモニタを使用する方法を示します。
2022.05.06
コメント(0)
STROBE関連、同期シグナルラインの制御用のサブルーチンのバッチファイルです。STB_ON.BATSTB_OF.BATSTROBE信号を操作するためにDBUG.EXEにリダイレクトするI/Oは、読み取りが44hなのですが、書き込みはコントロールレジスタの46hで、I/Oが異なることに注意を要します。レジスタの値は、先人が情報公開されています。バッチファイルの作成は、ここまでです。作成したバッチファイルは同じフォルダに存在する必要があります。外部DOSコマンドのDEBUG.EXE、FIND.EXE、CHOICE.COMも同じフォルダにおいておくか、PATHが通っているフォルダにある必要があります。その8では、使い方を示します。====================STB_ON.BATの記述(2重破線内をコピーペーストしてください)====================REM STROBEREM **********REM STROBE ONREM **********echo o 46 0E > STROBE.RSPecho i 44 >> STROBE.RSPecho q >> STROBE.RSPdebug < STROBE.RSP >nulecho STROBE ON(0x00) LINE LOW====================STB_OF.BATの記述(2重破線内をコピーペーストしてください)====================REM STROBEREM **********REM STROBE OFFREM **********echo o 46 0F > STROBE.RSPecho i 44 >> STROBE.RSPecho q >> STROBE.RSPdebug < STROBE.RSP > nulecho STROBE OFF(0x80) LINE HIGH====================
2022.05.06
コメント(0)
プリンタBUSY関連のサブルーチンのバッチファイルCHK_BS.BATWT_BS_ON.BATWT_BS_OF.BAT3つの記述を示します。DOS外部コマンドのDEBUG.EXEでプリンタBUSYのレジスタの値をファイルに出力し、そのファイル内にあるレジスタ値をDOS外部コマンドのFIND.EXEを利用してレジスタ値が0x90か0x94であるかの判定を行い、BUSYのステータスを判断しています。その7では、STROBE関連のサブルーチンのバッチファイルを示します。====================CHK_BS.BATの記述(2重破線内をコピーペーストしてください)====================REM ********************REM Check PRN BUSY statusREM ********************echo i 42 > BUSY.RSPecho q >> BUSY.RSPdebug < BUSY.RSP > RSLTBUSY.TXTrem type RSLTBUSY.TXTfind "90" RSLTBUSY.TXT > nulif errorlevel 1 goto NOT_BUSYif errorlevel 0 goto IN_BUSY:IN_BUSYecho BUSY(0x90)goto END_CHK_BS:NOT_BUSYecho NOT BUSY(0x94)goto END_CHK_BS:END_CHK_BS====================WT_BS_ON.BATの記述(2重破線内をコピーペーストしてください)====================REM BUSY LOOPREM **********:BUSYLOOPecho i 42 > BUSY.RSPecho q >> BUSY.RSPdebug < BUSY.RSP > RSLTBUSY.TXTrem type RSLTBUSY.TXTfind "90" RSLTBUSY.TXT > nulif errorlevel 1 goto NOT_BUSYif errorlevel 0 goto IN_BUSY:NOT_BUSYecho LOOP waiting for BUSYpausegoto BUSYLOOP:IN_BUSYecho BUSY====================WT_BS_OF.BATの記述(2重破線内をコピーペーストしてください)====================REM BUSY LOOPREM **********:BUSYLOOPecho i 42 > BUSY.RSPecho q >> BUSY.RSPdebug < BUSY.RSP > RSLTBUSY.TXTrem type RSLTBUSY.TXTfind "90" RSLTBUSY.TXT > nulif errorlevel 1 goto NOT_BUSYif errorlevel 0 goto IN_BUSY:IN_BUSYecho LOOP waiting for NOT BUSYpausegoto BUSYLOOP:NOT_BUSYecho NOT BUSY====================
2022.05.06
コメント(0)
以下にメインとなるバッチファイルの記述を示します。適当なエディタで、テキスト編集し、ファイル名を"PRNCHK.BAT"として保存下さい。このファイルを実行することになります。パイプやリダイレクト外部callなど、MS-DOSのバッチファイルを書くのは結構たいへんでした。日頃は、C言語をメインに使用するのですが、DEBUG.EXEの外部DOSコマンドを利用することで、バッチファイルだけでも、意外にも色々なことが出来ることを初めて知りました。DEBUG.EXEにリダイレクトで渡すパラメーターは、一旦RSPの拡張子のテキストファイルに書き出していますが、40hなど、I/Oに指定している値は、単方向プリンタの設定で、この値を変更すれば9821シリーズやDOS/V機にも対応できます。レジスタの値等の情報は、先人が情報を公開されています。ユーザーの操作は、choice.comとerrorlevel で判定しています。if errorlevel X goto Yの構文は、はまりました。プログラミング言語では、if(errorlevel >=X){goto Y}に相当し、『以上』の判定だとは、全く思いつかず、ここで苦労しました。その6では、サブルーチンとしてコールするバッチファイルを示します。====================@echo offBREAK ONREM ********************REM STROBE OFF (Initialize)REM ********************echo Initialize PRN portcall STB_OF.BATecho o 40 00 > DATA.RSPecho i 40 >> DATA.RSPecho q >> DATA.RSPdebug < DATA.RSP > nulecho Write 0x00(0b00000000)echo Printer Port check script by Rom_OkpauseclsREM ********************REM Waiting operationREM ********************echo Printer Port check script by Rom_Ok:STARTecho ====================echo Enter bit "0-7" to write PRN, "S" to toggle Strobe ON OFF, echo "B" to check PRN BUSY or "Q" to Quitecho ====================choice /C:01234567SBQif errorlevel 11 goto ENDif errorlevel 10 goto CHK_BUSYif errorlevel 9 goto STROBEif errorlevel 8 goto WRI_0x80if errorlevel 7 goto WRI_0x40if errorlevel 6 goto WRI_0x20if errorlevel 5 goto WRI_0x10if errorlevel 4 goto WRI_0x08if errorlevel 3 goto WRI_0x04if errorlevel 2 goto WRI_0x02if errorlevel 1 goto WRI_0x01goto START:WRI_0x01call WT_BS_OF.BATecho o 40 01 > DATA.RSPecho i 40 >> DATA.RSPecho q >> DATA.RSPdebug < DATA.RSP > nulecho Write 0x01(0b00000001)goto NEGO_PRN:WRI_0x02call WT_BS_OF.BATecho o 40 02 > DATA.RSPecho i 40 >> DATA.RSPecho q >> DATA.RSPdebug < DATA.RSP > nulecho Write 0x02(0b00000010)goto NEGO_PRN:WRI_0x04call WT_BS_OF.BATecho o 40 04 > DATA.RSPecho i 40 >> DATA.RSPecho q >> DATA.RSPdebug < DATA.RSP > nulecho Write 0x04(0b00000100)goto NEGO_PRN:WRI_0x08call WT_BS_OF.BATecho o 40 08 > DATA.RSPecho i 40 >> DATA.RSPecho q >> DATA.RSPdebug < DATA.RSP > nulecho Write 0x08(0b00001000)goto NEGO_PRN:WRI_0x10call WT_BS_OF.BATecho o 40 10 > DATA.RSPecho i 40 >> DATA.RSPecho q >> DATA.RSPdebug < DATA.RSP > nulecho Write 0x10(0b00010000)goto NEGO_PRN:WRI_0x20call WT_BS_OF.BATecho o 40 20 > DATA.RSPecho i 40 >> DATA.RSPecho q >> DATA.RSPdebug < DATA.RSP > nulecho Write 0x20(0b00100000)goto NEGO_PRN:WRI_0x40call WT_BS_OF.BATecho o 40 40 > DATA.RSPecho i 40 >> DATA.RSPecho q >> DATA.RSPdebug < DATA.RSP > nulecho Write 0x40(0b01000000)goto NEGO_PRN:WRI_0x80call WT_BS_OF.BATecho o 40 80 > DATA.RSPecho i 40 >> DATA.RSPecho q >> DATA.RSPdebug < DATA.RSP > nulecho Write 0x80(0b10000000)goto NEGO_PRNREM ********************REM STROBE ON/OFF toggleREM ********************:STROBEecho i 44 > DATA.RSPecho q >> DATA.RSPdebug < DATA.RSP > RESULT.TXTfind "00" RESULT.TXT > nulif errorlevel 1 goto STROB_ONif errorlevel 0 goto STROB_OF:STROB_ONcall STB_ON.BATgoto START:STROB_OFcall STB_OF.BATgoto STARTREM ********************REM Check PRN BUSY statusREM ********************:CHK_BUSYcall CHK_BS.BATgoto STARTREM ********************REM Negotiation with PRNREM ********************:NEGO_PRNcall STB_ON.BATcall WT_BS_ON.BATcall STB_OF.BATcall CHK_BS.BATgoto START:END
2022.05.06
コメント(0)

続いて、98ノート側のプリンタ制御用のスクリプトについてです。本来であれば、コンパイラによる実行ファイルを作成したいところですが、PC-98用のコンパイラをもっていないので、DOSのバッチファイルを作成しました。バッチファイルから呼び出すDOSの外部コマンドはDEBUG、CHOICE、FINDで、これらのDOSの実行ファイルはバッチファイルと同じディレクトリにあるかPATHを指定しておく必要があります。このうち、DEBUG.EXEは、MS-DOSでは、プログラム開発ツールのディスク内にありますが、持っていなければ、Win95/98では標準でHDD内にあるはずです。プログラムを書いて実行ファイルを作成しなくとも、このDEBUG.EXEを使用することで、プリンタポートの制御用レジスタにアクセスできます。その方法は、先人が紹介されています。必要なMS-DOSの外部コマンド(EXE)と作成するバッチファイルは以下のとおりです。つぎに、バッチファイルの記述を示しますs。
2022.05.06
コメント(0)
Arduino Nanoに書き込んだスケッチ(プログラム)は以下のとおりです。Arduino Nanoのほぼ全I/Oピンを使用します。A0からA7で8bitのプリンタライン信号を読み取ります。Arduinoアナログ入力ピンは、デジタル入力ピンとして設定して利用します。但しArduino NanoのA6とA7については、デジタル入力ピンとしては利用できず、アナログ入力ピンとしての利用になりますが、analogRead関数でも対応可能です。PC-9801NX/Cのプリンタ信号のHIGHおよび、Arduino NanoのI/OのHIGHの電圧はともに約5Vですので、analogRead関数の返り値で閾値を300で判断するとうまく動作します。また、9801側からデータ送信時の同期のためSTROBE信号は、他のラインとは異なり、ビット反転しています。STROBE ONではLOW、STROBE OFFではHIGHとなります。Arduino NanoのD13は、Arduino NanoのオンボードLEDに接続されていますが、I/OPinの数が足りなくなることから、BUSY信号の出力と内蔵LEDをモニタとして兼用しています。通信手順の処理については、少々難解かもしれません。詳しくは、以下のスケッチ(プログラム)を読み解いてみてくださいもし、Bugがあれば教えてください。#define LED_PRN_Data_Bit_0 2#define LED_PRN_Data_Bit_1 3#define LED_PRN_Data_Bit_2 4#define LED_PRN_Data_Bit_3 5#define LED_PRN_Data_Bit_4 6#define LED_PRN_Data_Bit_5 7#define LED_PRN_Data_Bit_6 8#define LED_PRN_Data_Bit_7 9#define LED_PRN_Strobe 10#define BTN_Busy_Toggle 11#define IN_PRN_Strobe 12#define OUT_and_LED_PRN_Busy LED_BUILTIN //13と同じ定義#define IN_PRN_Data_Bit_0 A0#define IN_PRN_Data_Bit_1 A1#define IN_PRN_Data_Bit_2 A2#define IN_PRN_Data_Bit_3 A3#define IN_PRN_Data_Bit_4 A4#define IN_PRN_Data_Bit_5 A5#define IN_PRN_Data_Bit_6 A6#define IN_PRN_Data_Bit_7 A7unsigned char Bit_Data = 0b00000000;unsigned char Bit_Data_Back = 0b00000000;boolean Status_BUSY = false;boolean Status_STROBE = false;char sendPacket[24] = "";int Status_Flag = 0;// the setup function runs once when you press reset or power the boardvoid setup(){ // initialize serial communication at 9600 bits per second: Serial.begin(9600); pinMode(LED_PRN_Data_Bit_0, OUTPUT); pinMode(LED_PRN_Data_Bit_1, OUTPUT); pinMode(LED_PRN_Data_Bit_2, OUTPUT); pinMode(LED_PRN_Data_Bit_3, OUTPUT); pinMode(LED_PRN_Data_Bit_4, OUTPUT); pinMode(LED_PRN_Data_Bit_5, OUTPUT); pinMode(LED_PRN_Data_Bit_6, OUTPUT); pinMode(LED_PRN_Data_Bit_7, OUTPUT); pinMode(LED_PRN_Strobe, OUTPUT); pinMode(BTN_Busy_Toggle, INPUT_PULLUP); pinMode(IN_PRN_Strobe, INPUT_PULLUP); pinMode(OUT_and_LED_PRN_Busy, OUTPUT); pinMode(IN_PRN_Data_Bit_0, INPUT_PULLUP); pinMode(IN_PRN_Data_Bit_1, INPUT_PULLUP); pinMode(IN_PRN_Data_Bit_2, INPUT_PULLUP); pinMode(IN_PRN_Data_Bit_3, INPUT_PULLUP); pinMode(IN_PRN_Data_Bit_4, INPUT_PULLUP); pinMode(IN_PRN_Data_Bit_5, INPUT_PULLUP);// pinMode(IN_PRN_Data_Bit_6, INPUT_PULLUP);//Arduino Nanoは、A6とA7がアナログ入力専用// pinMode(IN_PRN_Data_Bit_7, INPUT_PULLUP);//Arduino Nanoは、A6とA7がアナログ入力専用}// the loop function runs over and over again forevervoid loop() {//================================================ //Printer Data bit(0-9), Strobeのステータスの読み込み及びLED出力 //================================================ if (digitalRead(IN_PRN_Data_Bit_0)) { Bit_Data = Bit_Data | 0b00000001; digitalWrite(LED_PRN_Data_Bit_0, HIGH); } else { Bit_Data = Bit_Data & 0b11111110; digitalWrite(LED_PRN_Data_Bit_0, LOW); } if (digitalRead(IN_PRN_Data_Bit_1)) { Bit_Data = Bit_Data | 0b00000010; digitalWrite(LED_PRN_Data_Bit_1, HIGH); } else { Bit_Data = Bit_Data & 0b11111101; digitalWrite(LED_PRN_Data_Bit_1, LOW); } if (digitalRead(IN_PRN_Data_Bit_2)) { Bit_Data = Bit_Data | 0b00000100; digitalWrite(LED_PRN_Data_Bit_2, HIGH); } else { Bit_Data = Bit_Data & 0b11111011; digitalWrite(LED_PRN_Data_Bit_2, LOW); } if (digitalRead(IN_PRN_Data_Bit_3)) { Bit_Data = Bit_Data | 0b00001000; digitalWrite(LED_PRN_Data_Bit_3, HIGH); } else { Bit_Data = Bit_Data & 0b11110111; digitalWrite(LED_PRN_Data_Bit_3, LOW); } if (digitalRead(IN_PRN_Data_Bit_4)) { Bit_Data = Bit_Data | 0b00010000; digitalWrite(LED_PRN_Data_Bit_4, HIGH); } else { Bit_Data = Bit_Data & 0b11101111; digitalWrite(LED_PRN_Data_Bit_4, LOW); } if (digitalRead(IN_PRN_Data_Bit_5)) { Bit_Data = Bit_Data | 0b00100000; digitalWrite(LED_PRN_Data_Bit_5, HIGH); } else { Bit_Data = Bit_Data & 0b11011111; digitalWrite(LED_PRN_Data_Bit_5, LOW); } if (analogRead(IN_PRN_Data_Bit_6) > 300)//Arduino Nanoは、A6とA7がアナログ入力専用 { Bit_Data = Bit_Data | 0b01000000; digitalWrite(LED_PRN_Data_Bit_6, HIGH); } else { Bit_Data = Bit_Data & 0b10111111; digitalWrite(LED_PRN_Data_Bit_6, LOW); } if (analogRead(IN_PRN_Data_Bit_7) > 300)//Arduino Nanoは、A6とA7がアナログ入力専用 { Bit_Data = Bit_Data | 0b10000000; digitalWrite(LED_PRN_Data_Bit_7, HIGH); } else { Bit_Data = Bit_Data & 0b01111111; digitalWrite(LED_PRN_Data_Bit_7, LOW); } if (!digitalRead(IN_PRN_Strobe))//Printer Strobe信号は反転している STROBE ONでLOW、STROBE OFFでHIGH { Status_STROBE = true; digitalWrite(LED_PRN_Strobe, HIGH); } else { Status_STROBE = false; digitalWrite(LED_PRN_Strobe, LOW); }//================================================ //BUSY トグル ボタンの処理//================================================ if (!digitalRead(BTN_Busy_Toggle))//ボタンが押されLOW { if(Status_BUSY) { Status_BUSY = false; digitalWrite(OUT_and_LED_PRN_Busy, LOW); Serial.print("BUSY => NOT BUSY by user\r\n"); if(Status_STROBE) { Status_Flag = 1; } else { Status_Flag = 4; } } else { Status_BUSY = true; digitalWrite(OUT_and_LED_PRN_Busy, HIGH); Serial.print("NOT BUSY => BUSY by user\r\n"); if(Status_STROBE) { Status_Flag = 2; } else { Status_Flag = 3; } }// Status_Flag = 0;//STROBE ON and BUSY delay(100); }//================================================ //プロトコル(通信手順)の処理//================================================ if (Status_STROBE && !Status_BUSY) { if(Status_Flag!=1) { Serial.print("====================\r\n"); Serial.print("Detect STROBE ON\r\n"); Status_BUSY = true; digitalWrite(OUT_and_LED_PRN_Busy, HIGH); Serial.print("NOT BUSY => BUSY (Auto)\r\n"); Serial.print("Read PRN Data bit\r\n"); Serial.print("--------------------\r\n"); putb(Bit_Data); Serial.print("--------------------\r\n"); Status_Flag = 1;//STROBE ON and BUSY } } else if (Status_STROBE && Status_BUSY) { if(Status_Flag!=2) { Serial.print("Waiting STROBE OFF\r\n"); Status_Flag = 2;//STROBE ON and BUSY } delay(100); } else if (!Status_STROBE && Status_BUSY) { if(Status_Flag!=3) { Serial.print("Detect STROBE OFF\r\n"); Status_BUSY = false; digitalWrite(OUT_and_LED_PRN_Busy, LOW); Serial.print("BUSY => NOT BUSY (Auto)\r\n"); Status_Flag = 3;//STROBE OFF and NOT BUSY } } else//!Status_STROBE && !Status_BUSY { if(Status_Flag!=4) { Serial.print("Waiting STROBE ON\r\n"); Serial.print("Ready to read bit DATA!\r\n"); //putb(Bit_Data); Status_Flag = 4;//STROBE OFF and NOT BUSY } delay(100); }}void printb(unsigned char v) { unsigned char mask = (char)1 << (sizeof(v) * 7); do Serial.print(mask & v ? '1' : '0'); while (mask >>= 1);}void putb(unsigned char v) { Serial.print('0'), Serial.print('b'), printb(v), Serial.print("\r\n");}
2022.05.06
コメント(0)

PC-9801単方向通信のラインとArduino Nanoによる制御についてです。単方向通信のプリンタポートの通信は、各ラインに1bitが割り当てられ、8ラインを使用して、8bitを同時に送信します。これ以外にSTROBEに1ライン、唯一プリンタ側から送られるBUSYに1ライン、グランドに1ライン、合計で11ラインが使用されます。このあたりは、先人の方々が色々調査され情報を公開されています。これらの11ラインをArduino NanoのInput、Output、GNDに接続して、制御を行います。なお、GND以外は、10kオームの保護抵抗を入れています。9801とプリンタ間の通信手順についても、先人の方が調査され公開されています。通信手順に応じて、Arduino NanoにBUSY信号の制御を行うプログラミングや、プリンタポートそれぞれのラインの状態をArduino Nanoから、Serial.printで、シリアルモニタ(Arduinoのプログラミングツール付属の簡易ターミナルソフトウェア)に出力するプログラミングを行いました。また、Arduino側には、プッシュボタンを取り付けていますが、これは、BUSY信号のオン/オフのトグル用で、プリンターの動作を手動でエミュレートします。 なお、モニタ用のPCやシリアルモニタがなくとも、各ラインのチェックが行える様に9個のLEDを取り付けました。(追加で、1個はArduino内蔵LEDを使用します)Arduino Nano周辺の配線図は、以下を確認ください。アンフェノールセントロニクスハーフピッチ20Pinプリンタコネクタ側のPin番号は、以下の写真のとおりとなります。なお、98ノート側のPin番号は、この写真の鏡面像に相当するPin番号の配置となります。9801シリーズに20Pinのプリンタポートが登場するよりも以前には、14Pinのアンフェノールセントロニクスフルピッチのプリンタポートがありましたが、Pin番号を読み替えて配線すると、今回作成したプリンタポートチェッカーは、そのまま利用することができます。Pin番号読み替えの為の情報は、先人のブログで紹介されていますので、ここでは述べません。9821シリーズで採用された36Pinのアンフェノールセントロニクスハーフピッチのプリンタポートについては、双方向通信が可能なため、今回の様なプリンタポートチェッカーに頼らずとも、2台のPC間をパラレルクロスリンクケーブルでつなぎ、RDiskなのどDOSアプリで動作確認が可能です。また、双方向通信が可能な9821シリーズでは、プリンタのI/Oアドレスが異なっていて、この後で紹介する9801ノート側のチェッカースクリプトはそのままでは動作しません。今回作成したチェッカーは、あくまでも単方向通信しかサポートされていない9801シリーズでの使用を前提にいています。その3では、プログラム(スケッチ)を紹介します。
2022.05.06
コメント(0)

98ノートのプリンタポートチェッカーを作った背景です。98ノートは、1990年代に国民機としてたいへん普及したNEC製のノートPCで、その仕様は、海外製のPCと互換性がなく、Windows95発売までは、国内のPC市場は鎖国状況にあり、NECの98シリーズの1人勝ちの時代がありました。最近になって、当時使用していたPC-9801NX/Cを押し入れ深くから、引っ張り出して電源を入れてみましたが、30年前の製品であり、さすがに起動しませんでした、電源を入れっぱなしにしてしばらく放置すると起動することもあったのですが、電解コンデンサの液漏れによる故障の症状の様です。ネットで色々物色していると、壊れた98ノートであっても、いまだにオークションでさかんに取引されていて、メンテナンス済の完動品であれば、かなり高額で取引されていること知りました。ネット情報では、電解コンデンサの全交換というのが、キーワードの様でしたので、私もオークションでの高額売却を夢見て、メンテナンスにチャレンジし成功しました。メンテナンス後の98ノートの外部マウスポート、10Keyポート、110pin拡張ポート、PCカード、モデムスロット、外部ディスプレイアダプタ接続用コネクタなどのI/Oの動作確認は、何らかの周辺機器を取り付けて調べることができましたが、プリンタポートだけは、動作確認環境がなく、チェックすることが出来ませんでした。9821シリーズや、DOS/V互換機のプリンタポートであれば、インターリンクケーブルでつないで、パラレル双方向データ通信によるファイル送信などにより、プリンタポート(パラレルポート)の動作確認ができるものの、9801ノートシリーズは、単方向通信しかできず、同様の確認方法がとれません。単方向通信しかできない98ノートのプリンタポートは、下の写真にあるアンフェノールセントロニクスハーフピッチ20PinのコネクタがPC-9801N、PC-9801NS、PC-9801NV、PC-9801NC、PC-9801NS/E、PC-9801NS/T、PC-9801NL、PC-9801NS/L、PC-9801NA/C、PC-9801NS/R、PC-9801NX/C、PC-9801NL/Rで使用されています。なお、PC-9801NS/Aでは、アンフェノールセントロニクスハーフピッチ36Pinが使用されていますが、双方向通信に対応しているか否かは未確認です。(それ以前の9801シリーズではアンフェノールセントロニクスフルピッチ14Pinもあるそうです)プリンタポートの動作確認方法として、実際にプリンタを繋げてみることも考えられますので、当時のプリンタをオークションで入手も検討しました。ところが、30年前の正常動作するプリンタの入手は困難で、プリンタリボンなどのサプライン品の供給もされておらず、98ノートのプリンタポートの動作確認のためにオークションで当時のプリンタを入手する気にはなれませんでした。そこで、メンテナンスの終わった98ノートを『プリンタポート動作環境なしのため未チェック』と注意書きを書いて、オークションに強行出品したのですが、かなり高額な取引となりました。ところが、直ぐに落札者の方から連絡が来ました。落札者の方に状況を聞くと、プリンタポートに異常があるとのことでした。プリンタを繋いでるのではなく、工場の保守用の機器をプリンタポートに繋いでいて、当時の98用のソフトウェアしか使えず、非常に困られているとのことでした。改めて、98ノートの産業用の需要が、今だにあることに気づかされました。さて、送り返されてきた98ノートPCですが、どうやってプリンタポートの動作チェックをすれば良いか色々と検討してみました。単方向通信の仕様(アンフェノールセントロニクスハーフピッチ20pin)なので、動作するプリンタがなければ、チェックする手段としてのハードルは高いと言えます。そこで、家に転がっていた、Arduino Nanoの互換品(AVR マイコン)を利用して、プリンタポートチェッカー (PC-9801単方向 20pinタイプ)を作成してみました。その2のブログから、作成記事を書きます。
2022.05.05
コメント(0)
全9件 (9件中 1-9件目)
1

![]()
