アナログ回路部に必要な両電源を作ります。19VのACアダプターからの入力を7812を使って降圧しトランジスターで組んだレイルスプリッタで仮想GNDを作ります。
カテゴリー: ニュース
ニュース
実験用電源の作製05
諦めずに前に進みます。電圧が負荷により不安定になるならばツェナーダイオードを使えば良いとわかったので早速ネットで調べ試しました。
定格通りの電圧になることがわかり多段レイルスプリッタをばらさなくても良いかもしれないと期待しました。
ここで新たな問題に気付きました。電圧は制御できても電力が小さいのです。
トランジスタとツェナーダイオードを組み合わせて大きい電流を流せることが解り多段レイルスプリッタを諦めなくても良いかもしれないと調査を続けましが
またもダメでした。ツェナーダイオードとパワートランジスタを組み合わせ保護回路も付け加えていくとそれはレギュレータになるとどなたかのブログにあったのです。レギュレータは知っていて持ってもいたのですが発熱が気になり別の方法をとチャレンジしたのですが失敗に終わりました。
降圧には発熱が避けられないのです。
実験用電源の作製04
レイルスプリッタが思いのほか簡単に出来たので更にもう一段追加して4分割しました。
最初のレイルスプリッタの上下にもう一段追加したので19V/4=4.75Vが四つできます。GNDとする位置を変えればプラスマイナス様々な組み合わせで便利だと考えました。実際に電圧を測定すると均等に四分割されていたのです。
更に入力側にある上下の抵抗値を調整すれば分割の比率を変えることができるため実験用電源として申し分ない物ができたとその時は思いました。
しかし、この理屈はあくまでも負荷が均等であれば成り立つことに作ってから気付きました。実験用ですからそれぞれの電圧に様々な状態の負荷が接続されるので開放時の電圧がそのまま維持されるはずもありません。回路図上どこを見ても電圧を維持する機構がないからです。出力側のコンデンサは瞬間的な変動を抑えてくれるだけです。
ぞろぞろトランジスターを並べてみても上手くいかずまた失敗をしてしまいました。
実験用電源の作製03
実験用電源の作製02
ある物を利用してROMライターの電源を作ることにしたので、まず初めにATX電源を利用することにしました。
±5V、12Vが取れ数百Wの電力があれば何でも出来ると思い早速ネットで先達のチャレンジを調べました。
皆さんうまく利用できてることを知り真似してPower ONの端子をショートすると、
回ったのです。FANが。ATX電源単独で動き出しました。
幸先が良い気がして直ぐに各端子の電圧をテスターで調べたところマイナス5Vもプラス5Vも12Vもちゃんと出ていました。
念のため規格通りか一通りテスターを当てていたのですが突然「バンッ」と振動を伴うような音が出たのです。
壊れたようです。中を見たのですが全くわかりません。焼けたり焦げたり割れたりなど外面的な損傷は見つかりませんでした。
このような繊細な機器は実験用には向かないです。ATX電源の目的外使用は止めました。
実験用電源の作製01
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 の時学習結果集合に追加する。$$
ここまでを認識とし更に判断するためには勇気、創造、神、現実、空想等も属性に加えアナムネーシスの方法で学習する仕組みが良いと考えます。
自作ROMライター その7
変調波の周波数をもっと高くして実用的なデータ転送速度にする為に搬送波の周波数は高いほうを使います。
ステレオサウンド出力の左右それぞれ二つの変調波を載せて合計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; } } }
前書きによれば特殊相対性理論は初等的知識で理解することができるが不完全性定理は入門書を読んだくらいでは到底理解することはできないと威し文句が書かれています。恐ろしげな本ですが勉強してみます。
読んでみましたが前半の論文本体はやはり難しく理解が進みませんでしたが後半の解説でかろうじて概要を掴むことができたと思います。
ある数学の系に矛盾がないことをその系自体で証明できない。
自身の正当性を自身のみでは証明できないなんて人間のような話でした。
常々人工知能には「知」のみでは無く「能」もなければそれは単なる知の集合であって知能ではないと思っていました。
「能」に当たる部分を本能とすれば知の集合と本能を併せて人工知能ができると考えた訳です。
不完全性定理を読んで「知」と「能」のみならず「勇気」と「創造」も必要であると考えを改めました。
ゲーテルに勇気と創造がなければ系が持つ矛盾を乗り越えることはできなかったでしょう。
https://www.renesas.com/jp/ja/doc/DocumentServer/005/G10517JJ9V0DS00.pdf
https://ja.na4.teamsupport.com/knowledgeBase/17797905
ChatGPTに聞いてみた。
User
uPC339Cは何ですか。
ChatGPT
uPC339Cは、クアッドコンパレータ(Quad Comparator)IC(集積回路)の1つです。このICは、4つのコンパレータを持ち、入力信号を比較し、出力信号を生成することができます。また、このICは、低消費電力であるため、電池駆動のアプリケーションに適しています。
uPC339Cは、デュアルインラインパッケージ(DIP)で提供され、14ピンのパッケージングを採用しています。このICには、4つのコンパレータがあり、それぞれのコンパレータには、非反転入力ピン、反転入力ピン、出力ピン、電源ピンがあります。
uPC339Cは、入力信号の比較、スイッチング機能、オーバーボルテージ保護などのために広く使用されています。また、このICは、オーディオ機器、産業用途、自動車用途、モータードライブなどのアプリケーションにも使用されています。
相対性理論 電気力学の部
電気力学の部
運動学の部と同じように解るところまで数式を勉強します。
$$
\frac{1}{c^2}\frac{\partial E_x}{\partial t}=\frac{\partial B_z}{\partial y}-\frac{\partial B_y}{\partial z},
$$
$$
\frac{\partial B_x}{\partial t}=-\left(\frac{\partial E_z}{\partial y}-\frac{\partial E_y}{\partial z}\right),
$$
$$
\frac{1}{c^2}\frac{\partial E_y}{\partial t}=\frac{\partial B_x}{\partial z}-\frac{\partial B_z}{\partial x},
$$
$$
\frac{\partial B_y}{\partial t}=-\left(\frac{\partial E_x}{\partial z}-\frac{\partial E_z}{\partial x}\right),
$$
$$
\frac{1}{c^2}\frac{\partial E_z}{\partial t}=\frac{\partial B_y}{\partial x}-\frac{\partial B_x}{\partial y},
$$
$$
\frac{\partial B_z}{\partial t}=-\left(\frac{\partial E_y}{\partial x}-\frac{\partial E_x}{\partial y}\right),
$$
$$\left.\begin{array}{c}
\frac{1}{c^2}\frac{\partial E_x}{\partial \tau}=\frac{\partial}{\partial\eta}\left\{\beta\left(E_z-\frac{v}{c^2}E_y\right)\right\}-\frac{\partial}{\partial\zeta}\left\{\beta\left(B_y+\frac{v}{c^2}E_z\right)\right\},
\\
\frac{1}{c^2}\frac{\partial}{\partial \tau}\{\beta(E_y-vB_z)\}=\frac{\partial B_x}{\partial\zeta}-\frac{\partial}{\partial\xi}\left\{\beta\left(B_z-\frac{v}{c^2}E_y\right)\right\},
\\
\frac{1}{c^2}\frac{\partial}{\partial \tau}\{\beta(E_z+vB_y)\}=\frac{\partial}{\partial\xi}\left\{\beta\left(B_y+\frac{v}{c^2}E_z\right)\right\}-\frac{\partial}{\partial\eta}B_x,
\end{array}\right\}
$$
$$
\left.\begin{array}{c}
\frac{\partial B_x}{\partial\tau}=-\frac{\partial}{\partial\eta}\{\beta(E_z+vB_y)\}+\frac{\partial}{\partial\zeta}\{\beta(E_y-vB_z)\},
\\
\frac{\partial}{\partial\tau}\left\{\beta\left(B_y+\frac{v}{c^2}E_z\right)\right\}=-\frac{\partial}{\partial\zeta}E_x+\frac{\partial}{\partial\xi}\{\beta(E_z+vB_y)\},
\\
\frac{\partial}{\partial\tau}\left\{\beta\left(B_z-\frac{v}{c^2}E_y\right)\right\}=-\frac{\partial}{\partial\xi}\{\beta(E_y-vB_z)\}+\frac{\partial}{\partial\eta}E_x.
\end{array}\right\}
$$
$$\beta=\frac{1}{\sqrt{1-(v/c)^2}}$$
$$
\frac{1}{c^2}\frac{\partial E’_{\xi}}{\partial\tau}=\frac{\partial B’_{\zeta}}{\partial\eta}-\frac{\partial B’_{\eta}}{\partial\zeta},
$$
$$
\frac{\partial B’_{\xi}}{\partial\tau}=-\left(\frac{\partial E’_{\zeta}}{\partial\eta}-\frac{\partial E’_{\eta}}{\partial\zeta}\right),
$$
$$
\frac{1}{c^2}\frac{\partial E’_{\eta}}{\partial\tau}=\frac{\partial B’_{\xi}}{\partial\zeta}-\frac{\partial B’_{\zeta}}{\partial\xi},
$$
$$
\frac{\partial B’_{\eta}}{\partial\tau}=-\left(\frac{\partial E’_{\xi}}{\partial\zeta}-\frac{\partial E’_{\zeta}}{\partial\xi}\right),
$$
$$
\frac{1}{c^2}\frac{\partial E’_{\zeta}}{\partial\tau}=\frac{\partial B’_{\eta}}{\partial\xi}-\frac{\partial B’_{\xi}}{\partial\eta},
$$
$$
\frac{\partial B’_{\zeta}}{\partial\tau}=-\left(\frac{\partial E’_{\eta}}{\partial\xi}-\frac{\partial E’_{\xi}}{\partial\eta}\right).
$$
$$
E'_{\xi}=\psi(v)E_x,
\space
B’_{\xi}=\psi(v)B_x,
$$
$$
E'_{\eta}=\psi(v)\beta(E_y-vB_z),
\space
B’_{\eta}=\psi(v)\beta\{B_y+(v/c^2)E_z\},
$$
$$
E'_{\zeta}=\psi(v)\beta(E_z+vB_y),
\space
B’_{\zeta}=\psi(v)\beta\{B_z-(v/c^2)E_y\}.
$$
$$\psi(v)\cdot\psi(-v)=1.$$
$$\psi(v)=\psi(-v).$$
$$\psi(v)=1$$
$$E’_{\xi}=E_x,\space B’_{\xi}=B_x,$$
$$
E’_{\eta}=\beta(E_y-vB_z),\space B’_{\eta}=\beta\left(B_y+\frac{v}{c^2}E_z\right),
$$
$$
E’_{\zeta}=\beta(E_z-vB_y),\space B’_{\zeta}=\beta\left(B_z+\frac{v}{c^2}E_y\right).
$$
$$
E_x=E_{x0}\space sin\space\varPhi,\space B_x=B_{x0}\space sin\space\varPhi,
$$
$$
E_y=E_{y0}\space sin\space\varPhi,\space B_y=B_{y0}\space sin\space\varPhi,
$$
$$
E_z=E_{z0}\space sin\space\varPhi,\space B_z=B_{z0}\space sin\space\varPhi,
$$
$$
\varPhi=\omega\{t-(lx+my+nz)/c\}.
$$
$$
E’_{\xi}=E_{x0}\space sin\space\varPhi’,\space B’_{\xi}=B_{x0}\space sin\space\varPhi’,
$$
$$
E’_{\eta}=\beta(E_{y0}-vB_{z0})\space sin\space\varPhi’,\space B’_{\eta}=\beta\left(B_{y0}+\frac{v}{c^2}E_{z0}\right)\space sin\space\varPhi’,
$$
$$
E’_{\zeta}=\beta(E_{z0}-vB_{y0})\space sin\space\varPhi’,\space B’_{\zeta}=\beta\left(B_{z0}+\frac{v}{c^2}E_{y0}\right)\space sin\space\varPhi’,
$$
$$\varPhi’=\omega’\{\tau-(l’\xi+m’\eta+n’\zeta)/c\}.$$
$$\omega’=\omega\beta\left(1-l\frac{v}{c}\right),$$
$$l’=\left.\left(l-\frac{v}{c}\right)\middle/\left(1-l\frac{v}{c}\right)\right.,$$
$$m’=\left. m\middle/\beta\left(1-l\frac{v}{c}\right)\right.,$$
$$n’=\left. n\middle/\beta\left(1-l\frac{v}{c}\right)\right. .$$
$$\nu’=\left.\nu\left(1-\frac{v}{c}cos\space\varphi\right)\middle/\sqrt{1-\left(\frac{v}{c}\right)^2}\right.$$
$$\nu’=\nu\sqrt{\left.\left(1-\frac{v}{c}\right)\middle/\left(1+\frac{v}{c}\right)\right.}.$$
$$cos\space\varphi’=\left.\left(cos\space\varphi-\frac{v}{c}\right)\middle/\left(1-\frac{v}{c}cos\space\varphi\right)\right..$$
$$cos\space\varphi’=-\frac{v}{c}.$$
$$
(A’)^2=A^2\left.\left(1-\frac{v}{c}cos\space\varphi\right)^2\middle/\left\{1-\left(\frac{v}{c}\right)^2\right\}\right..
$$
$$\varphi=0$$
$$
(A’)^2=A^2\left.\left(1-\frac{v}{c}\right)\middle/\left(1+\frac{v}{c}\right)\right..
$$
この式のところで「観測者が速さcで光源に向かって走ればこの人から見たとき光源は無限に強い明るさに輝いて見えることになる」とあったのですが直ぐに理解できなかったので補足しておきます。
光源に向かっているのでvはマイナスの値になります。vがcに近づくほど分母は1+v/cなので0に近づきます。分子は1-v/cなので2に近づきます。従って限り無く2に近い値を限り無く0に近い値で割るので無限に大きい振幅になるということです。
$$w=(\vec E\cdot\vec D+\vec H\cdot\vec B)/2$$
$$(x-lct)^2+(y-mct)^2+(z-nct)^2=R^2$$
$$\left(\beta\xi-l\frac{v}{c}\beta\xi\right)^2+\left(\eta-m\frac{v}{c}\beta\xi\right)^2+\left(\zeta-n\frac{v}{c}\beta\xi\right)^2=R^2$$
$$
\frac{S’}{S}=\left.\sqrt{1-\left(\frac{v}{c}\right)^2}\middle/\left(1-\frac{v}{c}cos\space\varphi\right)\right.
$$
$$
\frac{E’}{E}=\frac{w’S’}{wS}=\frac{(A’)^2S’}{(A)^2S}=\frac{1-(v/c)cos\space\varphi}{\sqrt{1-(v/c)^2}}
$$
$$\varphi=0$$
$$\frac{E’}{E}=\sqrt{\frac{1-(v/c)}{1+(v/c)}}.$$
$$
A’=A\{1-(v/c)cos\space\varphi\}/\sqrt{1-(v/c)^2},
$$
$$
cos\space\varphi’=\{cos\space\varphi-(v/c)\}/\{1-(v/c)cos\space\varphi\},
$$
$$
\nu’=\nu\cdot\{1-(v/c)cos\space\varphi\}/\sqrt{1-(v/c)^2}
$$
$$
A^{\prime\prime}=A’,\space cos\space\varphi^{\prime\prime}=-cos\space\varphi’,\space\nu^{\prime\prime}=\nu’
$$
$$
A^{\prime\prime\prime}=A^{\prime\prime}\frac{1+(v/c)cos\space\varphi^{\prime\prime}}{\sqrt{1-(v/c)^2}}=A\frac{1-2(v/c)cos\space\varphi+(v/c)^2}{1-(v/c)^2},
$$
$$
cos\space\varphi^{\prime\prime\prime}=\frac{cos\space\varphi^{\prime\prime}+(v/c)}{1+(v/c)cos\space\varphi^{\prime\prime}}=-\frac{\{1+(v/c)^2\}cos\space\varphi-2(v/c)}{1-2(v/c)cos\space\varphi+(v/c)^2},
$$
$$
\nu^{\prime\prime\prime}=\nu^{\prime\prime}\frac{1+(v/c)cos\space\varphi^{\prime\prime}}{\sqrt{1-(v/c)^2}}=\nu\frac{1-2(v/c)cos\space\varphi+(v/c)^2}{\{1-(v/c)\}^2},
$$
$$
P=2w\frac{\{cos\space\varphi-(v/c)\}^2}{1-(v/c)^2}.
$$
$$P=2w\space cos^2\varphi$$
ようやく「力」が出てきました。
$$
\frac{\partial D_x}{\partial t}+\rho u_x=\frac{\partial H_z}{\partial y}-\frac{\partial H_y}{\partial z},\space\frac{\partial B_x}{\partial t}=-\frac{\partial E_z}{\partial y}+\frac{\partial E_y}{\partial z},
$$
$$
\frac{\partial D_y}{\partial t}+\rho u_y=\frac{\partial H_x}{\partial z}-\frac{\partial H_z}{\partial x},\space\frac{\partial B_y}{\partial t}=-\frac{\partial E_x}{\partial z}+\frac{\partial E_z}{\partial x},
$$
$$
\frac{\partial D_z}{\partial t}+\rho u_z=\frac{\partial H_y}{\partial x}-\frac{\partial H_x}{\partial y},\space\frac{\partial B_z}{\partial t}=-\frac{\partial E_y}{\partial x}+\frac{\partial E_x}{\partial y}.
$$
$$
\rho=\frac{\partial D_x}{\partial x}+\frac{\partial D_y}{\partial y}+\frac{\partial D_z}{\partial z}
$$
$$
\frac{\partial D’_\xi}{\partial\tau}+\rho’ u_\xi=\frac{\partial H’_\zeta}{\partial \eta}-\frac{\partial H’_\eta}{\partial \zeta},\space\frac{\partial B’_\xi}{\partial\tau}=-\frac{\partial E’_\zeta}{\partial \eta}+\frac{\partial E’_\eta}{\partial \zeta},
$$
$$
\frac{\partial D’_\eta}{\partial\tau}+\rho’ u_\eta=\frac{\partial H’_\xi}{\partial \zeta}-\frac{\partial H’_\zeta}{\partial \xi},\space\frac{\partial B’_\eta}{\partial\tau}=-\frac{\partial E’_\xi}{\partial \zeta}+\frac{\partial E’_\zeta}{\partial \xi},
$$
$$
\frac{\partial D’_\zeta}{\partial\tau}+\rho’ u_\zeta=\frac{\partial H’_\eta}{\partial \xi}-\frac{\partial H’_\xi}{\partial \eta},\space\frac{\partial B’_\zeta}{\partial\tau}=-\frac{\partial E’_\eta}{\partial \xi}+\frac{\partial E’_\xi}{\partial \eta}.
$$
$$u_\xi=\frac{u_x-v}{1-(u_xv/c^2)},\space u_\eta=\frac{u_y}{\beta\{1-(u_xv/c^2)\}},\space u_\zeta=\frac{u_z}{\beta\{1-(u_xv/c^2)\}},$$
$$\rho’=\frac{\partial D’_\xi}{\partial\xi}+\frac{\partial D’_\eta}{\partial\eta}+\frac{\partial D’_\zeta}{\partial\zeta}=\beta\left(1-\frac{u_xv}{c^2}\right)\rho.$$
$$
\mu\frac{d^2x}{dt^2}=\varepsilon E_x,
\space
\mu\frac{d^2y}{dt^2}=\varepsilon E_y,
\space
\mu\frac{d^2z}{dt^2}=\varepsilon E_z
$$
ここの説明に \(\mu\) は「その質量を表す」とあります。「力」に続き「質量」も登場してきました。
$$t=x=y=z=0$$
$$\tau=\xi=\eta=\zeta=0$$
$$\tau=\beta\{t-(v/c^2)x\},$$
$$\xi=\beta(x-vy),\space E’_\xi=E_x,$$
$$\eta=y,\space E’_\eta=\beta(E_y-vB_z),$$
$$\zeta=z,\space E’_\zeta=\beta(E_z+vB_y).$$
$$\left.\begin{array}{c}
\frac{d^2x}{dt^2}=\frac{\varepsilon}{\mu}\frac{1}{\beta^3}E_x,
\\
\frac{d^2y}{dt^2}=\frac{\varepsilon}{\mu}\frac{1}{\beta}(E_y-vB_z),
\\
\frac{d^2z}{dt^2}=\frac{\varepsilon}{\mu}\frac{1}{\beta}(E_z+vB_y).
\end{array}\right\}
$$
$$\mu\beta^3\frac{d^2x}{dt^2}=\varepsilon E_x =\varepsilon E’\xi,$$
$$\mu\beta^2\frac{d^2y}{dt^2}=\varepsilon\beta(E_y-vB_z) =\varepsilon E’\eta,$$
$$\mu\beta^2\frac{d^2z}{dt^2}=\varepsilon\beta(E_z+vB_y) =\varepsilon E’\zeta,$$
$$mass \times acceleration = power$$
$$longitudinal\space mass=\left.\mu\middle/\left\{\sqrt{1-\left(\frac{v}{c}\right)^2}\right\}^3\right.,$$
$$transverse\space mass=\left.\mu\middle/\left\{1-\left(\frac{v}{c}\right)^2\right\}\right.$$
$$W=\int\varepsilon E_xdx=\mu\int_0^v\beta^3vdv=\mu c^2\left\{\frac{1}{\sqrt{1-(v/c)^2}}-1\right\}.$$
$$A_m/A_e=v/c$$
$$P=\int E_xdx=\frac{\mu}{\varepsilon}c^2\left\{\frac{1}{\sqrt{1-(v/c)^2}}-1\right\}.$$
$$-\frac{d^2y}{dt^2}=\frac{v^2}{R}=\frac{\varepsilon}{\mu}vB\sqrt{1-(v/c)^2},$$
$$R=\mu v/\varepsilon B\sqrt{1-(v/c)^2}.$$
光速が不変となった為に運動学の部では時間と空間が可変となり、電気力学の部では質量までも可変になってしまいました。当時最新の科学であったであろう電磁波と数百年来慣れ親しんだ力学を統一した理論で再構築しあらゆる科学に見直しを迫るというとてつもない偉業が書かれている一冊でした。
自作ROMライター その6
パソコンから3バイト単位(アドレス16ビット、データ8ビット)で信号を送ることができるようになりました。クロック43Hz、アドレス+データ24ビット、リセット信号をキーボドから入力した値に応じて送りLEDを点灯しています。最後のビットを送った後に書き込み信号を送ることができればROMに書き込みができるはずです。
#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 d = 360.0 / wavelength; double pi = 3.14159265359; for (int i = 0; i < wavelength; i++) { lpData[i] = (WORD)(amplitude * sin(d * i / 180.0 * pi)); } } 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))) { return true; } } return false; } DWORD soundOut( LPWORD *lpWaveData, HWAVEOUT hWaveOut, unsigned char data, size_t bit, size_t cFrequency, BOOL reset ) { LPWORD lpSinWave; LPWORD lpWave; LPWORD lpWave1; LPWORD lpWave2; LPWORD lpWave3; LPWORD lpWave4; size_t i, j, end; size_t cWavelength = SAMPLING / cFrequency; size_t dataLength = (size_t)CHANNEL * (BITSPERSAMPLE / 8) * cWavelength * bit; size_t dWavelength; size_t dFrequency; WORD amplitude = MAXAMP / DIV; lpWave = (LPWORD)calloc(sizeof(WORD), dataLength); lpWave1 = (LPWORD)calloc(sizeof(WORD), dataLength); lpWave2 = (LPWORD)calloc(sizeof(WORD), dataLength); lpWave3 = (LPWORD)calloc(sizeof(WORD), dataLength); lpWave4 = (LPWORD)calloc(sizeof(WORD), dataLength); end = dataLength/(BITSPERSAMPLE / 8); for (i = 0; i < end; i++) { lpWave[i] = 0; lpWave1[i] = 0; lpWave2[i] = 0; lpWave3[i] = 0; lpWave4[i] = 0; } /* チャンネル1 ********************************/ lpSinWave = (LPWORD)calloc(sizeof(WORD), cWavelength); createWave(lpSinWave, cFrequency, SAMPLING, MAXAMP); for (i = 0, j = 0; i < end; i += CHANNEL) { lpWave[i] = lpSinWave[j]; ++j; if (j >= cWavelength) { j = 0; } } free(lpSinWave); /* チャンネル2 ********************************/ // クロック dFrequency = 3200; dWavelength = SAMPLING / dFrequency; lpSinWave = (LPWORD)calloc(sizeof(WORD), dWavelength); createWave(lpSinWave, dFrequency, SAMPLING, amplitude); for (i = 1, j = 0; i < end; i += CHANNEL) { lpWave1[i] = lpSinWave[j]; ++j; if (j >= dWavelength) { j = 0; } } for (i = 1, j = 0; i < end; i += CHANNEL, ++j) { if (j < cWavelength/2) { lpWave1[i] = 0; } if (j >= cWavelength) { j = 0; } } free(lpSinWave); // 制御データ dFrequency = 8000; dWavelength = SAMPLING / dFrequency; lpSinWave = (LPWORD)calloc(sizeof(WORD), dWavelength); createWave(lpSinWave, dFrequency, SAMPLING, amplitude); for (i = 1, j = 0; i < end; i += CHANNEL) { lpWave2[i] = lpSinWave[j]; ++j; if (j >= dWavelength) { j = 0; } } for (i = 1, j = 0; i < end; i += CHANNEL, ++j) { if (j < cWavelength/1.2) { lpWave2[i] = 0; } if (j >= cWavelength) { j = 0; } } free(lpSinWave); // シリアルデータ2 dFrequency = 11300; dWavelength = SAMPLING / dFrequency; lpSinWave = (LPWORD)calloc(sizeof(WORD), dWavelength); createWave(lpSinWave, dFrequency, SAMPLING, amplitude); for (i = 1, j = 0; i < end; i += CHANNEL, ++j) { lpWave3[i] = lpSinWave[j]; if (j >= dWavelength) { j = 0; } } for (i = 1; i < end; i += CHANNEL) { if (isON(data, bit, cWavelength * CHANNEL, i)) { lpWave3[i] = 0; } } free(lpSinWave); // リセット if (reset) { dFrequency = 17000; dWavelength = SAMPLING / dFrequency; lpSinWave = (LPWORD)calloc(sizeof(WORD), dWavelength); createWave(lpSinWave, dFrequency, SAMPLING, amplitude); for (i = 1, j = 0; i < cWavelength; i += CHANNEL, ++j) { lpWave4[i] = lpSinWave[j]; if (j >= dWavelength) { j = 0; } } free(lpSinWave); } // チャンネル2に合成 for (i = 1; i < end; i += CHANNEL) { lpWave[i] = lpWave1[i] + lpWave2[i] + lpWave3[i] + lpWave4[i]; } *lpWaveData = lpWave; return (DWORD)dataLength; } 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; waveOutOpen(&hWaveOut, 0, &wfe, 0, 0, CALLBACK_NULL); for (int i = 0; i < BUFFERING; i++) { whdr[i].dwFlags = WHDR_BEGINLOOP | WHDR_ENDLOOP; whdr[i].dwLoops = 1; lpWave[i] = NULL; } std::string str; do { std::cout << "2桁毎の16進コードを入力しEnterを押して下さい。(00 ~ FF)" << std::endl; std::cout << "続けて入力する場合は間を空けないでください。" << std::endl; std::cout << "Ctrl+Zを入力しEnterで終了します。" << std::endl; std::cin >> str; // Ctrl+Zで終了 if (std::cin.eof()) { break; } char strData[3]; strData[2] = 0x00; size_t bit = 9; size_t frequency = 43; 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) { std::cout << "free=" << std::dec << freeBuffer << std::endl; 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 (i % 3 == 0) { whdr[j].dwBufferLength = soundOut(&lpWave[j], hWaveOut, data, bit, frequency, true); } else { whdr[j].dwBufferLength = soundOut(&lpWave[j], hWaveOut, data, bit-1, frequency, false); } whdr[j].lpData = (LPSTR)lpWave[j]; waveOutPrepareHeader(hWaveOut, &whdr[j], sizeof(WAVEHDR)); waveOutWrite(hWaveOut, &whdr[j], sizeof(WAVEHDR)); std::cout << "no=" << std::dec << j << ", data=" << std::hex << (int)data << "H" << std::endl; 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); for (int i = 0; i < num; i++) { if (lpWave[i] != NULL) { std::cout << "free=" << std::dec << i << std::endl; free(lpWave[i]); lpWave[i] = NULL; } } } while (true); waveOutClose(hWaveOut); }
自作ROMライター その5
ソフトウェアを改良し複数バイトのデータを送り込めるようにしました。これでROMに書き込みたいデータとクロックや制御信号を混合してパソコンからサウンド出力し、受け側の装置で分離してロジックICを意図通りに動かすことができるようになりました。
#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 d = 360.0 / wavelength; double pi = 3.14159265359; for (int i = 0; i < wavelength; i++) { lpData[i] = (WORD)(amplitude * sin(d * i / 180.0 * pi)); } } 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))) { return true; } } return false; } DWORD soundOut(LPWORD *lpWaveData, HWAVEOUT hWaveOut, unsigned char data, size_t bit, size_t cFrequency) { LPWORD lpSinWave; LPWORD lpWave; LPWORD lpWave1; LPWORD lpWave2; LPWORD lpWave3; LPWORD lpWave4; size_t i, j, end; size_t cWavelength = SAMPLING / cFrequency; size_t dataLength = (size_t)CHANNEL * (BITSPERSAMPLE / 8) * cWavelength * bit; size_t dWavelength; size_t dFrequency; WORD amplitude = MAXAMP / DIV; lpWave = (LPWORD)calloc(sizeof(WORD), dataLength); lpWave1 = (LPWORD)calloc(sizeof(WORD), dataLength); lpWave2 = (LPWORD)calloc(sizeof(WORD), dataLength); lpWave3 = (LPWORD)calloc(sizeof(WORD), dataLength); lpWave4 = (LPWORD)calloc(sizeof(WORD), dataLength); end = dataLength/(BITSPERSAMPLE / 8); for (i = 0; i < end; i++) { lpWave[i] = 0; lpWave1[i] = 0; lpWave2[i] = 0; lpWave3[i] = 0; lpWave4[i] = 0; } /* チャンネル1 ********************************/ lpSinWave = (LPWORD)calloc(sizeof(WORD), cWavelength); createWave(lpSinWave, cFrequency, SAMPLING, MAXAMP); for (i = 0, j = 0; i < end; i += CHANNEL) { lpWave[i] = lpSinWave[j]; ++j; if (j >= cWavelength) { j = 0; } } free(lpSinWave); /* チャンネル2 ********************************/ // クロック dFrequency = 3200; dWavelength = SAMPLING / dFrequency; lpSinWave = (LPWORD)calloc(sizeof(WORD), dWavelength); createWave(lpSinWave, dFrequency, SAMPLING, amplitude); for (i = 1, j = 0; i < end; i += CHANNEL) { lpWave1[i] = lpSinWave[j]; ++j; if (j >= dWavelength) { j = 0; } } for (i = 1, j = 0; i < end; i += CHANNEL, ++j) { if (j < cWavelength/2) { lpWave1[i] = 0; } if (j >= cWavelength) { j = 0; } } free(lpSinWave); // 制御データ dFrequency = 8000; dWavelength = SAMPLING / dFrequency; lpSinWave = (LPWORD)calloc(sizeof(WORD), dWavelength); createWave(lpSinWave, dFrequency, SAMPLING, amplitude); for (i = 1, j = 0; i < end; i += CHANNEL) { lpWave2[i] = lpSinWave[j]; ++j; if (j >= dWavelength) { j = 0; } } for (i = 1, j = 0; i < end; i += CHANNEL, ++j) { if (j < cWavelength/1.2) { lpWave2[i] = 0; } if (j >= cWavelength) { j = 0; } } free(lpSinWave); // シリアルデータ2 dFrequency = 11300; dWavelength = SAMPLING / dFrequency; lpSinWave = (LPWORD)calloc(sizeof(WORD), dWavelength); createWave(lpSinWave, dFrequency, SAMPLING, amplitude); for (i = 1, j = 0; i < end; i += CHANNEL, ++j) { lpWave3[i] = lpSinWave[j]; if (j >= dWavelength) { j = 0; } } for (i = 1; i < end; i += CHANNEL) { if (isON(data, bit, cWavelength * CHANNEL, i)) { lpWave3[i] = 0; } } free(lpSinWave); // リセット dFrequency = 17000; dWavelength = SAMPLING / dFrequency; lpSinWave = (LPWORD)calloc(sizeof(WORD), dWavelength); createWave(lpSinWave, dFrequency, SAMPLING, amplitude); for (i = 1, j = 0; i < cWavelength; i += CHANNEL, ++j) { lpWave4[i] = lpSinWave[j]; if (j >= dWavelength) { j = 0; } } free(lpSinWave); // チャンネル2に合成 for (i = 1; i < end; i += CHANNEL) { lpWave[i] = lpWave1[i] + lpWave2[i] + lpWave3[i] + lpWave4[i]; } *lpWaveData = lpWave; return (DWORD)dataLength; } 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; waveOutOpen(&hWaveOut, 0, &wfe, 0, 0, CALLBACK_NULL); for (int i = 0; i < BUFFERING; i++) { whdr[i].dwFlags = WHDR_BEGINLOOP | WHDR_ENDLOOP; whdr[i].dwLoops = 1; lpWave[i] = NULL; } std::string str; do { std::cout << "2桁毎の16進コードを入力しEnterを押して下さい。(00 ~ FF)" << std::endl; std::cout << "続けて入力する場合は間を空けないでください。" << std::endl; std::cout << "Ctrl+Zを入力しEnterで終了します。" << std::endl; std::cin >> str; // Ctrl+Zで終了 if (std::cin.eof()) { break; } char strData[3]; strData[2] = 0x00; size_t bit = 9; size_t frequency = 43; 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) { std::cout << "free=" << std::dec << freeBuffer << std::endl; 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); // サウンド出力 whdr[j].dwBufferLength = soundOut(&lpWave[j], hWaveOut, data, bit, frequency); whdr[j].lpData = (LPSTR)lpWave[j]; waveOutPrepareHeader(hWaveOut, &whdr[j], sizeof(WAVEHDR)); waveOutWrite(hWaveOut, &whdr[j], sizeof(WAVEHDR)); std::cout << "no=" << std::dec << j << ", data=" << std::hex << (int)data << "H" << std::endl; 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); for (int i = 0; i < num; i++) { if (lpWave[i] != NULL) { std::cout << "free=" << std::dec << i << std::endl; free(lpWave[i]); lpWave[i] = NULL; } } } while (true); waveOutClose(hWaveOut); }
が究極のナチュラルコンピューティングかもしれない。導体に拘らなければ新しい世界が拓けるだろう。
2020年10月3日 近い理論を知りました。光で演算する方法です。
https://doi.org/10.1364/OE.399495
なので今後も「The Optical Society」を注目していきます。
自作ROMライター その4
74HC164Nでシリアルパラレル変換した後74LS273PCでその値を保持できるか実験してみました。同時にソフトウェアを改良しキーボードからバイト単位に信号を送出できるようにしました。
キーボードで16進数を1バイト分入力しEnterを押すとその値に応じてLEDが点灯しています。
#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; void createWave(LPWORD lpData, size_t frequency, size_t sampling, WORD amplitude) { size_t wavelength = SAMPLING / frequency; double d = 360.0 / wavelength; double pi = 3.14159265359; for (int i = 0; i < wavelength; i++) { lpData[i] = (WORD)(amplitude * sin(d * (i % wavelength) / 180.0 * pi)); } } BOOLEAN isON(unsigned char data, size_t bit, size_t i) { size_t bit9 = bit * 9; size_t bit8 = bit * 8; size_t bit7 = bit * 7; size_t bit6 = bit * 6; size_t bit5 = bit * 5; size_t bit4 = bit * 4; size_t bit3 = bit * 3; size_t bit2 = bit * 2; if (((data & 0x80) == 0x80) && 0 <= (i % (bit9)) && (i % (bit9)) < (bit)) { return true; } if (((data & 0x40) == 0x40) && (bit) <= (i % (bit9)) && (i % (bit9)) < (bit2)) { return true; } if (((data & 0x20) == 0x20) && (bit2) <= (i % (bit9)) && (i % (bit9)) < (bit3)) { return true; } if (((data & 0x10) == 0x10) && (bit3) <= (i % (bit9)) && (i % (bit9)) < (bit4)) { return true; } if (((data & 0x08) == 0x08) && (bit4) <= (i % (bit9)) && (i % (bit9)) < (bit5)) { return true; } if (((data & 0x04) == 0x04) && (bit5) <= (i % (bit9)) && (i % (bit9)) < (bit6)) { return true; } if (((data & 0x02) == 0x02) && (bit6) <= (i % (bit9)) && (i % (bit9)) < (bit7)) { return true; } if (((data & 0x01) == 0x01) && (bit7) <= (i % (bit9)) && (i % (bit9)) < (bit8)) { return true; } return false; } static LPWORD lpWave; static WAVEHDR whdr; void soundOut(HWAVEOUT hWaveOut, unsigned char data) { LPWORD lpData; LPWORD lpWave1; LPWORD lpWave2; LPWORD lpWave3; LPWORD lpWave4; // 最初と最後の1sは出力しないので3以上とする DWORD terms = 3; size_t i, j, k, start, end; size_t frequency = 9; size_t wavelength = SAMPLING / frequency; size_t dataLength = (size_t)CHANNEL * (size_t)SAMPLING * terms; lpWave = (LPWORD)calloc(sizeof(WORD), dataLength); lpWave1 = (LPWORD)calloc(sizeof(WORD), dataLength); lpWave2 = (LPWORD)calloc(sizeof(WORD), dataLength); lpWave3 = (LPWORD)calloc(sizeof(WORD), dataLength); lpWave4 = (LPWORD)calloc(sizeof(WORD), dataLength); end = SAMPLING * CHANNEL; WORD amplitude = 32767 / 4; for (i = 0; i < end; i++) { lpWave[i] = 0; lpWave1[i] = 0; lpWave2[i] = 0; lpWave3[i] = 0; lpWave4[i] = 0; } size_t bit = CHANNEL * SAMPLING / frequency; // 最初の1sは出力しない start = SAMPLING * CHANNEL; end = (size_t)CHANNEL * (size_t)SAMPLING * (size_t)terms; // 最後の1sは出力しない end -= SAMPLING * CHANNEL; size_t valWavelength; size_t valFrequency; /* チャンネル1 ********************************/ lpData = (LPWORD)calloc(sizeof(WORD), wavelength); createWave(lpData, frequency, SAMPLING, amplitude); for (i = start, j = 0; i < end; i += 2) { lpWave[i] = lpData[j]; ++j; if (j >= wavelength) { j = 0; } } free(lpData); /* チャンネル2 ********************************/ // クロック valFrequency = 3200; valWavelength = SAMPLING / valFrequency; lpData = (LPWORD)calloc(sizeof(WORD), valWavelength); createWave(lpData, valFrequency, SAMPLING, amplitude); for (i = start + 1, j = 0, k = 0; i < end; i += 2, ++j, ++k) { if (k < SAMPLING / frequency / 2) { lpWave1[i] = lpData[j]; } if (j >= valWavelength) { j = 0; } if (k >= SAMPLING / frequency) { k = 0; } } free(lpData); // シリアルデータ1 valFrequency = 8000; valWavelength = SAMPLING / valFrequency; lpData = (LPWORD)calloc(sizeof(WORD), valWavelength); createWave(lpData, valFrequency, SAMPLING, amplitude); for (i = 1, j = 0; i < end; i += 2, ++j) { lpWave2[start + i] = lpData[j]; if (j >= valWavelength) { j = 0; } } free(lpData); // シリアルデータ2 valFrequency = 11300; valWavelength = SAMPLING / valFrequency; lpData = (LPWORD)calloc(sizeof(WORD), valWavelength); createWave(lpData, valFrequency, SAMPLING, amplitude); for (i = 1, j = 0; i < end; i += 2, ++j) { lpWave3[start + i] = lpData[j]; if (j >= valWavelength) { j = 0; } } for (i = 1, j = 0; i < end; i += 2, j += 2) { if (j >= bit * 9) { j = 0; } if (isON(data, bit, i)) { lpWave3[start + i] = 0; } } free(lpData); // リセット valFrequency = 17000; valWavelength = SAMPLING / valFrequency; lpData = (LPWORD)calloc(sizeof(WORD), valWavelength); createWave(lpData, valFrequency, SAMPLING, amplitude); for (i = 1; i < end; i += 2, ++j) { lpWave4[start + i] = 0; } for (i = 1, j = 0; i < (end - bit * 9); i += 2, ++j) { if ((i % (bit * 9)) < bit) { lpWave4[start + i - bit] = lpData[j]; } if (j >= valWavelength) { j = 0; } } free(lpData); // チャンネル2に合成 for (i = 1; i < end; i += 2) { lpWave[i] = lpWave1[i] + lpWave2[i] + lpWave3[i] + lpWave4[i]; } // サウンド出力 whdr.lpData = (LPSTR)lpWave; whdr.dwBufferLength = SAMPLING * (CHANNEL * BITSPERSAMPLE / 8) * terms; whdr.dwFlags = WHDR_BEGINLOOP | WHDR_ENDLOOP; whdr.dwLoops = 1; waveOutPrepareHeader(hWaveOut, &whdr, sizeof(WAVEHDR)); waveOutWrite(hWaveOut, &whdr, sizeof(WAVEHDR)); } int main() { 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; waveOutOpen(&hWaveOut, 0, &wfe, 0, 0, CALLBACK_NULL); char str[128]; do { std::cout << "2桁の16進コードを入力しEnterを押して下さい。(00 ~ FF)" << std::endl; std::cout << "Ctrl+Zを入力しEnterを入力すると終了します。" << std::endl; std::cin >> str; // 入力された文字列をデータに変換 unsigned char data = (unsigned char)strtol(str, NULL, 16); // Ctrl+Zで終了 if (std::cin.eof()) { break; } // データをサウンド出力する soundOut(hWaveOut, data); } while (true); waveOutClose(hWaveOut); }
ここまででPCのサウンド出力を使ってデジタル素子を制御出来ることが解りました。