負荷を接続しどの程度電流が流れるか測定します。放熱の状態も見て電圧が安定しているか確認します。
デジタル用電源12V
11.26V/11.54Ω=976mA
デジタル用電源5V
4.311V/6.0Ω=719mA
アナログ用電源12V
11.26V/15.6Ω=722mA
アナログ用電源±6V
5.67V/10.4Ω=545mA
ニュース
実験用なので金属ケース入れないでブレッドボードのまま使用するためには放熱器を工夫しなければなりません。金属を加工する腕も設備も有りませんのでアルミ缶かアルミホイルで何とかします。
100cm位の長さのアルミホイルを長い方の中心線で二つ折りにしダブルクリップの中サイズの幅位で蛇腹にします。ハリセン状に出来たらレギュレータの金属部分に被せてダブルクリップ中で上から挟みます。
更に両脇をダブルクリップ小で押さえ込み密着度を高めます。
使用する時は蛇腹を広げて、しまう時は閉じて曲げればコンパクトになり便利かもしれません。百均で揃うし余っても家庭で使えるので無駄にもならないと思います。後は能力が有れば申し分ありません。
※放熱器とレギュレータの間の絶縁を忘れていました。
諦めずに前に進みます。電圧が負荷により不安定になるならばツェナーダイオードを使えば良いとわかったので早速ネットで調べ試しました。
定格通りの電圧になることがわかり多段レイルスプリッタをばらさなくても良いかもしれないと期待しました。
ここで新たな問題に気付きました。電圧は制御できても電力が小さいのです。
トランジスタとツェナーダイオードを組み合わせて大きい電流を流せることが解り多段レイルスプリッタを諦めなくても良いかもしれないと調査を続けましが
またもダメでした。ツェナーダイオードとパワートランジスタを組み合わせ保護回路も付け加えていくとそれはレギュレータになるとどなたかのブログにあったのです。レギュレータは知っていて持ってもいたのですが発熱が気になり別の方法をとチャレンジしたのですが失敗に終わりました。
降圧には発熱が避けられないのです。
レイルスプリッタが思いのほか簡単に出来たので更にもう一段追加して4分割しました。
最初のレイルスプリッタの上下にもう一段追加したので19V/4=4.75Vが四つできます。GNDとする位置を変えればプラスマイナス様々な組み合わせで便利だと考えました。実際に電圧を測定すると均等に四分割されていたのです。
更に入力側にある上下の抵抗値を調整すれば分割の比率を変えることができるため実験用電源として申し分ない物ができたとその時は思いました。
しかし、この理屈はあくまでも負荷が均等であれば成り立つことに作ってから気付きました。実験用ですからそれぞれの電圧に様々な状態の負荷が接続されるので開放時の電圧がそのまま維持されるはずもありません。回路図上どこを見ても電圧を維持する機構がないからです。出力側のコンデンサは瞬間的な変動を抑えてくれるだけです。
ぞろぞろトランジスターを並べてみても上手くいかずまた失敗をしてしまいました。
ある物を利用してROMライターの電源を作ることにしたので、まず初めにATX電源を利用することにしました。
±5V、12Vが取れ数百Wの電力があれば何でも出来ると思い早速ネットで先達のチャレンジを調べました。
皆さんうまく利用できてることを知り真似してPower ONの端子をショートすると、
回ったのです。FANが。ATX電源単独で動き出しました。
幸先が良い気がして直ぐに各端子の電圧をテスターで調べたところマイナス5Vもプラス5Vも12Vもちゃんと出ていました。
念のため規格通りか一通りテスターを当てていたのですが突然「バンッ」と振動を伴うような音が出たのです。
壊れたようです。中を見たのですが全くわかりません。焼けたり焦げたり割れたりなど外面的な損傷は見つかりませんでした。
このような繊細な機器は実験用には向かないです。ATX電源の目的外使用は止めました。
ChatGPTに聞いてみた。
User
UPD8048Cは何ですか。
ChatGPT
UPD8048Cは、NEC(日本電気株式会社)が開発した8ビットマイクロコントローラ(MCU)の1つです。UPD8048Cは、インテル(Intel)の8048マイクロコントローラと互換性があります。
UPD8048Cは、40ピンのデュアルインラインパッケージ(DIP)で提供され、8ビットのデータバス、16ビットのアドレスバス、1KBのROM、64バイトのRAM、2つのタイマ/カウンタ、および入出力ポートを備えています。また、UPD8048Cは、最大2MHzのクロック周波数に対応しています。
UPD8048Cは、多くのアプリケーションに使用されています。具体的には、電子レンジ、自動販売機、自動車用途、家庭用電子機器、制御装置などがあります。UPD8048Cは、低消費電力設計であるため、電池駆動のアプリケーションにも適しています。
UPD8048Cは、インテルの8048と互換性があるため、既存の8048ベースのシステムをアップグレードするためにも使用されます。また、UPD8048Cは、NECのマイクロコントローラファミリーの1つであり、他のNEC MCUとの互換性があるため、システム設計者が複数の製品を開発する場合に便利です。
ChatGPTに聞いてみた。
User
M80C39は何ですか。
ChatGPT
M80C39は、インテル(Intel)が開発した8ビットマイクロコントローラ(MCU)の1つです。このMCUは、8039とも呼ばれます。M80C39は、周辺デバイスとのインタフェースが容易であるため、多くのアプリケーションに使用されています。
M80C39は、40ピンのデュアルインラインパッケージ(DIP)で提供され、8ビットのデータバス、16ビットのアドレスバス、128バイトのRAM、2つのタイマ/カウンタ、および入出力ポートを備えています。また、M80C39は、外部クロックソースによって駆動され、最大12MHzのクロック周波数に対応しています。
M80C39は、多くのアプリケーションに使用されています。具体的には、自動車用途、産業用途、制御装置、セキュリティシステム、家庭用電子機器などがあります。M80C39は、堅牢なデザインと高い信頼性を備えているため、長期にわたって使用され続けています。
User
OKI M80C39は何ですか。
ChatGPT
OKI M80C39は、インテル(Intel)が開発した8ビットマイクロコントローラ(MCU)の1つで、OKIがライセンス生産したものです。M80C39と同様の機能を持ち、互換性がありますが、OKI M80C39にはいくつかの異なる特徴があります。
OKI M80C39は、OKIの製造プロセスで製造されたため、一部のパラメーターが異なる場合があります。たとえば、M80C39には最大動作周波数12MHzのバージョンと16MHzのバージョンがありますが、OKI M80C39には最大動作周波数12MHzのバージョンしかありません。
また、OKI M80C39には、内部ROM(Read-Only Memory)が8KBまたは16KBのバージョンがありますが、M80C39には内部ROMがないため、外部ROMを使用する必要があります。
OKI M80C39は、同様のアプリケーションに使用されます。自動車用途、産業用途、制御装置、セキュリティシステム、家庭用電子機器などに使用され、長期間にわたって信頼性が高いことが証明されています。
ChatGPTに聞いてみた。
User
M82C37A-5は何ですか。
ChatGPT
M82C37A-5は、8ビットのプログラマブルインタフェースコントローラ(PIC)の1つです。このICは、複数のデバイスを制御するために使用されます。具体的には、キーボード、マウス、ディスクドライブ、プリンターなど、様々な入出力デバイスを制御するために使用されます。
M82C37A-5は、PLCC(プラスチックリード付きチップキャリア)パッケージで提供され、68ピンのパッケージングを採用しています。このICには、8つのビット幅のデータバス、8つの入力/出力ポート、および制御信号を生成するための論理回路があります。
M82C37A-5は、DMA(Direct Memory Access)制御機能を持ち、高速なデータ転送を実現することができます。また、このICは、CPUとの接続が容易であるため、多くのシステムで使用されています。M82C37A-5は、PC/AT互換機、POS端末、携帯型デバイスなどのアプリケーションに広く使用されています。
コンピュータを使って情報の認識を行なってみます。
$$認識対象o、認識関数f、認識結果c$$
$$c_n=f_n(o)$$
$$認識結果集合C$$
$$C=\begin{Bmatrix}c_{1}, c_{2}, \dots, c_{n}\end{Bmatrix}$$
$$本能p、本能集合P$$
$$P=\begin{Bmatrix}p_{1}, p_{2}, \dots, p_{n}\end{Bmatrix}$$
$$学習対象関数g$$
$$g:P\stackrel{onto}{\longrightarrow}C$$
$$学習結果l$$
$$l=\left( o,g \right)$$
$$学習結果集合L$$
$$L=\begin{Bmatrix}l_{1}, l_{2}, \dots, l_{n}\end{Bmatrix}$$
$$新しい認識対象o’$$
$$l’=\left( o’,g \right)$$
$$l’ \in L の時答え有りとする。$$
$$l’ \notin L の時学習結果集合に追加する。$$
ここまでを認識とし更に判断するためには勇気、創造、神、現実、空想等も属性に加えアナムネーシスの方法で学習する仕組みが良いと考えます。
変調波の周波数をもっと高くして実用的なデータ転送速度にする為に搬送波の周波数は高いほうを使います。
ステレオサウンド出力の左右それぞれ二つの変調波を載せて合計4チャンネルの信号を装置に送ります。
搬送波:19kHz, 21kHz
変調波:700Hz
をそれぞれ左右に出力
この時アナログ/デジタル変換にシュミットトリガーを使っていたのですが上手くいかずヒステリシス付きのコンパレータに変更しました。
#include <iostream> #include <windows.h> #include <math.h> #include <MMSystem.h> #pragma comment (lib, "winmm.lib") constexpr auto SAMPLING = 192000; constexpr auto CHANNEL = 2; constexpr auto BITSPERSAMPLE = 16; constexpr auto MAXAMP = 32767; constexpr auto DIV = 4; constexpr auto BUFFERING = 10; void createWave(LPWORD lpData, size_t frequency, size_t sampling, WORD amplitude) { double wavelength = (double)sampling / (double)frequency; // double pi = 3.14159265359; for (int i = 0; i < wavelength; i++) { lpData[i] = (WORD)(amplitude * sin((i*6.28318530718) / wavelength)); } } BOOLEAN isON(unsigned char data, size_t bit, size_t bitLength, size_t value) { int oneByte = 8; for (int i = 0; i < oneByte; i++) { unsigned char mask = 0x80 >> i; if (((data & mask) == mask) && // (bitLength * ((bit - oneByte) + i)) <= (value % (bitLength * bit)) && // (value % (bitLength * bit)) < (bitLength * ((bit - oneByte + 1) + i))) { (bitLength * (bit - oneByte + i)) <= (value % (bitLength * bit)) && (value % (bitLength * bit)) < (bitLength *(bit - oneByte + 1 + i))) { return true; } } return false; } void addWave(LPWORD param1, LPWORD param2, size_t length) { for (int i = 0; i < length; i++) { param1[i] += param2[i]; } } DWORD soundOut( LPWORD* lpWaveData, HWAVEOUT hWaveOut, unsigned char data, size_t bit, size_t cFrequency, BOOL reset, BOOL control ) { LPWORD lpSinWave; LPWORD lpWave; LPWORD lpWaveTemp; size_t i, j; size_t cWavelength = SAMPLING / cFrequency; size_t dataLength; size_t andSequence = 0; size_t dWavelength; size_t dFrequency; dataLength = (size_t)CHANNEL * (BITSPERSAMPLE / 8) * cWavelength * bit / sizeof(WORD); if (control == TRUE) { andSequence = (size_t)CHANNEL * (BITSPERSAMPLE / 8) * cWavelength / sizeof(WORD); } lpWave = (LPWORD)calloc(sizeof(WORD), dataLength + andSequence); for (i = 0; i < dataLength + andSequence; i++) { lpWave[i] = 0; } lpWaveTemp = (LPWORD)calloc(sizeof(WORD), dataLength + andSequence); lpSinWave = (LPWORD)calloc(sizeof(WORD), SAMPLING); /* チャンネル1 ********************************/ // シリアルデータ dFrequency = 21000; dWavelength = SAMPLING / dFrequency; createWave(lpSinWave, dFrequency, SAMPLING, MAXAMP / 2); memset(lpWaveTemp, 0x00, (dataLength + andSequence) * sizeof(WORD)); for (i = 0, j = 0; i < dataLength; i += CHANNEL, ++j) { lpWaveTemp[i] = lpSinWave[j]; if (j >= dWavelength) { j = 0; } } for (i = 0; i < dataLength; i += CHANNEL) { if (isON(0xff- data, bit, cWavelength * CHANNEL, i)) { lpWaveTemp[i] = 0; } } addWave(lpWave, lpWaveTemp, dataLength + andSequence); // 制御データ if (andSequence > 0) { dFrequency = 16000; dWavelength = SAMPLING / dFrequency; createWave(lpSinWave, dFrequency, SAMPLING, MAXAMP / 2); memset(lpWaveTemp, 0x00, (dataLength + andSequence) * sizeof(WORD)); for (i = dataLength + andSequence / 2, j = 0; i < dataLength + andSequence; i += CHANNEL, ++j) { lpWaveTemp[i] = lpSinWave[j]; if (j >= dWavelength) { j = 0; } } addWave(lpWave, lpWaveTemp, dataLength + andSequence); } /* チャンネル2 ********************************/ // クロック dFrequency = 21000; dWavelength = SAMPLING / dFrequency; createWave(lpSinWave, dFrequency, SAMPLING, MAXAMP / 2); memset(lpWaveTemp, 0x00, (dataLength + andSequence) * sizeof(WORD)); for (i = 1, j = 0; i < dataLength; i += CHANNEL) { lpWaveTemp[i] = lpSinWave[j]; ++j; if (j >= dWavelength) { j = 0; } } for (i = 1, j = 0; i < dataLength; i += CHANNEL, ++j) { if (j < cWavelength/1.4) { lpWaveTemp[i] = 0; } if (j >= cWavelength) { j = 0; } } addWave(lpWave, lpWaveTemp, dataLength + andSequence); // リセット if (reset == TRUE) { dFrequency = 16000; dWavelength = SAMPLING / dFrequency; createWave(lpSinWave, dFrequency, SAMPLING, MAXAMP / 2); memset(lpWaveTemp, 0x00, (dataLength + andSequence) * sizeof(WORD)); for (i = 1, j = 0; i < cWavelength/2; i += CHANNEL, ++j) { lpWaveTemp[i] = lpSinWave[j]; if (j >= dWavelength) { j = 0; } } addWave(lpWave, lpWaveTemp, dataLength + andSequence); } free(lpSinWave); free(lpWaveTemp); *lpWaveData = lpWave; return (DWORD)(dataLength + andSequence) * sizeof(WORD); } int main() { LPWORD lpWave[BUFFERING]; WAVEHDR whdr[BUFFERING]; WAVEFORMATEX wfe; HWAVEOUT hWaveOut; wfe.wFormatTag = WAVE_FORMAT_PCM; wfe.nChannels = CHANNEL; wfe.wBitsPerSample = BITSPERSAMPLE; wfe.nBlockAlign = CHANNEL * BITSPERSAMPLE / 8; wfe.nSamplesPerSec = SAMPLING; wfe.nAvgBytesPerSec = wfe.nSamplesPerSec * wfe.nBlockAlign; for (int i = 0; i < BUFFERING; i++) { whdr[i].dwFlags = WHDR_BEGINLOOP | WHDR_ENDLOOP; whdr[i].dwLoops = 1; lpWave[i] = NULL; } std::string str; std::cout << "2桁毎の16進コードを入力しEnterを押して下さい。(00 ~ FF)" << std::endl; std::cout << "続けて入力する場合は間を空けないでください。" << std::endl; std::cout << "Ctrl+Zを入力しEnterで終了します。" << std::endl; std::cin >> str; waveOutOpen(&hWaveOut, 0, &wfe, 0, 0, CALLBACK_NULL); char strData[3]; strData[2] = 0x00; size_t bit = 9; // 変調波 size_t frequency = 700; int freeBuffer = 0; for (int i = 0, j = 0, k = 0; i < str.size(); i += 2, j++, k++) { if (j >= BUFFERING) { j = 0; } freeBuffer = j + 1; if (freeBuffer >= BUFFERING) { freeBuffer = 0; } if (lpWave[freeBuffer] != NULL) { free(lpWave[freeBuffer]); lpWave[freeBuffer] = NULL; } strData[0] = str[i]; strData[1] = str[(size_t)i + 1]; // 入力された文字列をデータに変換 unsigned char data = (unsigned char)strtol(strData, NULL, 16); // サウンド出力 if (j % 3 == 0) { whdr[j].dwBufferLength = soundOut(&lpWave[j], hWaveOut, data, bit, frequency, TRUE, FALSE); } else if (j % 3 == 2) { whdr[j].dwBufferLength = soundOut(&lpWave[j], hWaveOut, data, bit -1, frequency, FALSE, TRUE); } else { whdr[j].dwBufferLength = soundOut(&lpWave[j], hWaveOut, data, bit - 1, frequency, FALSE, FALSE); } whdr[j].lpData = (LPSTR)lpWave[j]; waveOutPrepareHeader(hWaveOut, &whdr[j], sizeof(WAVEHDR)); waveOutWrite(hWaveOut, &whdr[j], sizeof(WAVEHDR)); if (k > BUFFERING - 3) { Sleep((1000 * (DWORD)bit) / (DWORD)frequency); } } int num = (int)str.size() / 2; if (num == 0) { num = 1; } else if (num > BUFFERING) { num = BUFFERING; } Sleep((1000 * (DWORD)bit * (num + 1)) / (DWORD)frequency); waveOutReset(hWaveOut); waveOutClose(hWaveOut); for (int i = 0; i < num; i++) { if (lpWave[i] != NULL) { free(lpWave[i]); lpWave[i] = NULL; } } }