カテゴリー
学術

波形測定器5

 555で発振がうまくできたので今後も考えて固定周波数から可変周波数にしました。発振器も大事な測定器の一つです。100kΩの三端子可変抵抗とコンデンサを複数適当に並べて2Hzから30kHzまで発振できるように改造しました。コンデンサを選びレンジを切り替える、可変抵抗を回しレンジ内で周波数を合わせる操作方法です。

555発振器2Hz付近
555発振器2Hz付近

 周波数が低いとこんな感じの表示になりました。

555発振器1kHz付近
555発振器1kHz付近

 1kHz付近では綺麗な矩形波になりました。

555発振器10kHz付近
555発振器10kHz付近

 10kHz位になると高調波を取りきれなくなり段々と正弦波に近づいているようです。

555発振器20kHz付近
555発振器20kHz付近

 20kHzになるとほぼ高調波が取れないようで見るからに正弦波のようです。これがパソコンのマイク入力の限界なのでしょう。

カテゴリー
学術

波形測定器4

ダイオードを入れて波形を観測
ダイオードを入れて波形を観測

 パソコンから正弦波を出力し波形を加工した様子を見てみます。ダイオードを入れて半波整流すると、

 波形の上下が半分になり順方向電圧分下がっているのがわかります。ただGNDが勝手に調整されているのは使い勝手が悪いので何とかしたいのですが、どこで調整されているのかわからないので今後の課題とします。

555で発振し波形を観測
555で発振し波形を観測

次に555で発振した波形を見てみます。

 中々良い感じに表示されています。555を数十年ぶりに手に入れて発振させました。ここまでは意図通りに出来上がりました。トランジスタでもICでも発振すると何故か楽しいです。

カテゴリー
学術

SN74LS193N

SN74LS193N
SN74LS193N

ChatGPTに聞いてみた。

User
SN74LS193Nは知っていますか。

ChatGPT
はい、SN74LS193Nは4ビット同期アップ/ダウンカウンターIC(集積回路)の1つです。このICは、同期カウンター回路で使用され、クロックパルスに同期して、カウントアップまたはカウントダウンを行います。

SN74LS193Nは、高速動作、広い動作電圧範囲、低消費電力などの特徴を持ち、通常、カウントダウンを行うために使用されるカウンター回路に最適です。また、カスケード接続を使用してより高精度なカウントを実現することもできます。

SN74LS193Nは、入力ピンがいくつか用意されており、それらを制御することで、カウントモード、カスケード接続、クロック信号の同期/非同期動作などを設定できます。このICは、デジタル回路やカウンター回路を設計する際によく使用されます。

カテゴリー
学術

NE555P

NE555P
NE555P

ChatGPTに聞いてみた。

User
NE555Pは知っていますか。

ChatGPT
はい、NE555Pは一般的に使用されるタイマーIC(集積回路)の1つで、一般的に単一の電源電圧を使用するアナログ回路のタイミング機能を提供するために使用されます。NE555Pは、内部的に2つの比較器、1つのSRフリップフロップ、およびディスチャージトランジスタを備えたオペアンプ(オペレーションアンプ)を使用して構成されています。このICは、正弦波発振回路、パルス幅変調回路、タイマー回路、トリガー回路などのアプリケーションで使用されます。

NE555Pは、比較的低コストで入手可能であり、入門者からエキスパートまで、多くのエレクトロニクス技術者によって使用されています。また、NE555Pは単一のICで複数のタイマー回路を構成できるため、回路が簡素化され、スペースやコストが節約できるという利点があります。

カテゴリー
学術

AIを作ってみよう10

D28C64C-25
D28C64C-25

 AIを作るための最低限のシルテム構成を考えてみましょう。構成を考える上での条件は
8ビット ー ビット以外でバイトが最小単位だから
マイコン ー 最小の安価なコンピュータだから
ロジックIC ー 論理演算できるから
アセンブラ ー 最も実行効率の良いプログラム言語だから
実数は使わない ー 演算上効率が悪いから
とします。

 8ビットのマイコンは大概16ビットのアドレス空間にアクセスできます。記憶装置は必ず必要なので16ビットのアドレスであれば64KByteのメモリが1セットです。

 RAMを使うと補助記憶装置からデータロードが必要となるのでそれがいらないROMを使います。記憶のアップデートはできませんが計算原理の確認なのでこれで良しとします。

カテゴリー
学術

情報科学の基礎

情報科学の基礎
情報科学の基礎

 集合、帰納法、グラフ、計算の数学的モデル、アルゴリズム、データ、暗号と解説されていて、コンピュータの基礎が数学だったことが思い出されました。アルゴリズムからコンピュータの動作までは良く解っていますが、数学とアルゴリズムの間の繋がりがまだ良く解っていません。数学→計算モデル→アルゴリズムという流れなのか、未だ不明です。

カテゴリー
学術

AIを作ってみよう09

半加算器
半加算器

 AI開発で欠かせないのはどのように計算させるかです。あまりにも多くの計算を短時間で実行しなければならないので、その計算能力によって性能が左右されるだけではなく、そのAIの存在自体をも問われます。

 コンピュータは計算が得意と言われていますが、その計算の中にも得意不得意があります。例えば桁数がある一定の値よりも大きい数値、乗除算を何度も繰り返す計算、極めて小さい数値等です。なぜこのようなことが起こるかというとコンピュータの中で実際に行われている演算とは論理演算だからです。

 論理演算には小数点もなければ桁上がりもありません。計算方法だけ見れば算盤以下です。随分昔ですが算盤の上級者になるとπの算出を暗算でできると聞いたことがあります。論理演算とは電気で計算させるための原始的な方法なのです。

 ではなぜコンピュータは計算では人を凌駕できるのか。それは単純な論理演算を一瞬の間に膨大な回数を実行できるからです。2進数の論理演算を組み合わせて10進数の四則演算や難しい関数演算を行える複雑なハードウェアとソフトウェアでコンピュータはできています。

 最もコンピュータに向いているのは論理演算なのでそれを基本に計算装置を作ることができれば製造費も電気代も安価な高性能AIができるはずです。

カテゴリー
学術

AIを作ってみよう08

高級言語
高級言語

 AIシステム構築には良くPythonが使われいるようです。Wikiによると「インタープリタ型の高水準汎用プログラミング言語である。」とあるように30年前からあるようですがだいぶ高級な言語のようです。

 Pythonもコンパイルしてネイティブ実行ファイルを作ることができますが今はインタープリタ型のプログラムが動作する仕組みを考えてみます。

パソコンでPythonプログラムを実行

Pythonプログラムを読んで実行するプログラム

オペレーティングシステム&デバイスドライバー

ベーシックIOシステム

ハードウェア

 Pythonプログラムをハードウェアが実行するまでに何層ものプログラムが動かなければなりません。もし同じプログラムをマイコンで実行するとどうなるでしょうか。

マイコン用プログラム

ハードウェア

 マイコン用プログラムであれば直接ハードウェアを実行することができます。もちろん高級言語では簡単なことでもマイコン用プログラムでは大変な労力を必要とすることが多いので単純に比較して優劣を云々できません。しかしAIの中枢は単純な計算の繰り返しなはずです。マイコン用プログラムでもできるに違いありません。

 同じ計算でも全体の計算量が大きく違えばその性能差も大変な違いが生まれます。

カテゴリー
学術

AIを作ってみよう07

アセンブラ
アセンブラ

 ハードウェアの話が続いたのでここでソフトウェアに話題を切り替えます。AIを構築するためには膨大な計算を処理する装置が必要です。その計算をこなすためには電力が必要です。なぜ計算機は電力を必要とするのか。それは電気の有無を2進数として論理演算を繰り返すため電気がある状態とない状態を何度も何度も繰り返し作らなければならなくなったからです。

 であれば使う電力を減らすためには計算の回数が減るようにするのも一つの方法です。性能を上げるためには計算量を増やさなければならない、消費電力を減らすためには計算量を減らなさければならない。矛盾してますね。

 電子計算機が生まれたと同時にソフトウェアをどう効率よく製造するかの悩みも双子のように誕生したのです。それから幾十年人類の効率の良いソフトウェア製造方法へのチャレンジは続いています。

 プラグ付きケーブルをあっちこっち挿したり抜いたりして作っていたソフトウェアがメモリ内蔵にされるようになった時にマシン語が生まれ、すぐにマシン語と一対になったアセンブラ言語が作られました。この時人類は抽象化された言語でコンピュータと交流できるようになりました。

カテゴリー
学術

AIを作ってみよう06

 現在世界最速のスパコンの1コアあたりの予算を計算すると

158,976ノード × 52コア = 8,266,752コア

予算1,120億円 ➗ 総コア数8,266,752 = 13,548円

➗ 2.2GHz = 1コア1GHzあたり6,158円

 同じ計算を価格コムのデスクトップパソコンの本体だけのモデル価格.com限定 Core i7 に適用すると

予算72,800円 ➗ 8コア ➗ 3GHz =
1コア1GHzあたり3,033円

 予算に含まれる項目が異なり比較できる同士ではありませんがこれらの計算力を手に入れという観点で考えれば目安になります。

 クロック周波数100MHzあたり300円を目指せばこれらに対抗できるマシンができるかもしれません。

 20MHzのクロックで一個50円、5個で250円みたいな計算をしていると夢が広がります。64bitもいらないので8bitか16bitであれば可能性があるかもしれません。更に今のマイコンは低電力に向かっているのでそう遠くない未来に実現できるかもしれません。

 マイコンの方が目的にあったハードウェアを構成できるので構築費も電気代も安くなって良いと思います。

 パソコンとテンソルフローで何をやっているかわからないAIを作るよりもハードウェアレベルから動作を見ながら構築していく方が未来は広がると思いませんか。

カテゴリー
学術

やわらかい情報処理

やわらかい情報処理
やわらかい情報処理

 生物やその営みメカニズムを情報処理による問題解決に応用する試みが学べます。第二次AIブームの後に出版された本ですが既にディープラーニングと同じような考えが記述されています。第三次AIブーム前夜といったところでしょうか。

カテゴリー
学術

波形測定器3

 Audacityで波形を表示できるようになったのですが電圧をどう読み取ったら良いかが解りませんでした。オシロスコープの代わりにしようとしているので波形と電圧について調べました。

 初めにテスターで測りやすいように正弦波を出力するプログラムを作成しました。

#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;

int main() {

    LPWORD lpWave;
    WAVEHDR whdr;
    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;

    size_t frequency;
    DWORD dataLength;
    DWORD wavelength;
    DWORD i;
    std::string str;

    std::cout << "周波数を入力しEnterで開始します。" << std::endl;
    std::cin >> str;
    frequency = std::atoi(str.c_str());

    wavelength = (DWORD)SAMPLING / (DWORD)frequency;
    dataLength = (DWORD)((size_t)CHANNEL * (BITSPERSAMPLE / 8) * wavelength);
    lpWave = (LPWORD)calloc(sizeof(WORD), dataLength);

    for (i = 0; i < wavelength; i++) {
        lpWave[i * 2] = (WORD)(MAXAMP * sin((i * 6.28318530718) / wavelength));
        lpWave[i * 2 + 1] = (WORD)(MAXAMP * sin((i * 6.28318530718) / wavelength));
    }

    whdr.dwBufferLength = dataLength;
    whdr.lpData = (LPSTR)lpWave;
    whdr.dwFlags = WHDR_BEGINLOOP | WHDR_ENDLOOP;
    whdr.dwLoops = UINT32_MAX;

    waveOutOpen(&hWaveOut, 0, &wfe, 0, 0, CALLBACK_NULL);
    waveOutPrepareHeader(hWaveOut, &whdr, sizeof(WAVEHDR));
    waveOutWrite(hWaveOut, &whdr, sizeof(WAVEHDR));

    std::cout << "何か入力しEnterで終了します。" << std::endl;
    std::cin >> str;

    waveOutReset(hWaveOut);
    waveOutClose(hWaveOut);

    free(lpWave);
}

 このプログラムは入力した周波数の正弦波を左右最大の値で音声出力します。

ステレオ差動増幅器出力電圧
ステレオ差動増幅器出力電圧

 音量0から10刻みで100まで増やした時の交流電圧です。ピークの算出は√2×1.1をテスターで測った交流電圧値にかけています。使ったテスターの値は多分平均値出力と思いましたので。

 音声出力レベル70でピークが±1Vになるようです。

ステレオ差動増幅器電圧調整
ステレオ差動増幅器電圧調整

 出力側それぞれに4.7KΩの抵抗を並列にして約2.3KΩにしたものを入れて出力値を調整します。

ステレオ差動増幅器出力波形マイクレベル18
ステレオ差動増幅器出力波形マイクレベル18

 マイクレベル18でピーク±1Vの正弦波をAudacityで表示しました。右側の目盛0.1で1V表示になります。

ステレオ差動増幅器出力波形マイクレベル38
ステレオ差動増幅器出力波形マイクレベル38

 マイクレベル38でピーク±1Vの正弦波をAudacityで表示しました。右側の目盛0.2で1V表示になります。

可聴範囲に限定ですがデジタルストレージオシロスコープが出来ました。

カテゴリー
学術

波形測定器2

 オペアンプで作った差動増幅器をステレオにし入出力の電圧差が少なくなるように調整しました。

ステレオ差動増幅器入力電圧
ステレオ差動増幅器入力電圧

 乾電池2本分を入力電圧とします。

ステレオ差動増幅器出力電圧右
ステレオ差動増幅器出力電圧右

 手持ちの抵抗を色々取り替えて入出力電圧が同じになるように調整しました。

ステレオ差動増幅器出力電圧左
ステレオ差動増幅器出力電圧左

 もう一つのチャンネルも抵抗を取り替えて入出力電圧が同じになるように調整しました。普通のカーボン抵抗でも誤差同士のバランスが合えばそこそこの精度が得られます。安定性には疑問がありますがデジタル信号であればまあいけると思います。

ステレオ差動増幅器信号入出力
ステレオ差動増幅器信号入出力

 では実際に信号を入れて結果をAudacityで観察します。右が入力信号、左が出力信号です。出力レベル80、入力レベル67でほぼ入力と出力のレベルが同じになりました。

ステレオ差動増幅器信号入力
ステレオ差動増幅器信号入力

 入力信号を拡大した様子です。

ステレオ差動増幅器信号出力
ステレオ差動増幅器信号出力

 出力信号を拡大した様子です。入力の極を入れ替えて反転を無くしほぼ入出力同じにできました。オシロスコープを買わなくても波形が確認できそうです。測定器を買うのではなく用途に合わせて簡易でも作ることができれば勉強にもなり経済的かつ達成感を味わえます。更に問題が起きても解決の糸口を見つけやすくなります。

カテゴリー
学術

AIを作ってみよう05

人工知能入門
人工知能入門

 なぜ8ビットマイコンを今更取り上げてAIを作ろうとしているかの経緯を話します。

 元々AIには興味を持っていたのですがGPUによる高速演算とテンソンフローの公開により続々と個人ベースで高性能な人工知能システムを完成させている事例を見聞きするにつれ自分もそれに参加したくなったのです。

 特にスマホにニューロエンジンと呼ばれる専用ハードウェアが搭載されたことが決定的な出来事でした。

 現在スマホのアプリエンジニアとして仕事をしておりいよいよ直ぐそこまでAIが近いてきています。

 今後もアプリ開発の現場に留まるためにはAIのスキルも必要と思いました。

 西暦2000年前後の頃に汎用ICやPCのグラッフィックボードを使用して低価格で高速計算機を構築する研究結果が出始めその後FPGAを使うなど高性能化が更に進んでいきました。このような背景が第三次AIブームを引き起こした遠因なのでしょう。スーパーコンピュータ並みの計算能力を個人が手に入れることができる時代になったのです。

 1995年に完成したGRAPE-4は5Wで243.2GFLOPSを達成したそうです。https://ja.m.wikipedia.org/wiki/濱田剛

 個人にとってはその計算機の開発費用もさることながら消費電力も重要な所有の条件です。大容量電力を個人ではとても用意できません。

 5Wなら自分でも容易に環境を作ることができます。

カテゴリー
学術

ディープラーニング

ディープラーニング
ディープラーニング

 第三次AIブームの中心話題であるディープラーニングを体験できる本です。技術の背景たる数学の基礎から実際のプログラミングとオープンソース化されたテンソルフローの使い方まで解説されています。日本語で書かれているのがとても便利です。

カテゴリー
学術

人工知能入門

人工知能入門
人工知能入門

 1990年代中葉までの人工知能をまとめた内容です。第二次AIブームを網羅的に解説しています。ディープラーニングが出る直前なので今から見ると歴史的経緯が述べられていると感じます。その時のコンピュータにいかに知能を載せていくかを模索しています。

カテゴリー
学術

AIを作ってみよう04

 CPUは決まったのでそれを動かすにはどうしたら良いか勉強を始めました。

マイコンの勉強
マイコンの勉強

 8085はかなり古い初期型に近いマイクロプロセッサであるため電源を繋げばすぐ使えるというものではありません。目的にもよりますが多くの周辺ICや部品が必要です。

 8080になるともっと多くの部品が必要になり更に入手の難しいものもあるので一旦使用するのは保留とします。8085の周辺ICであればまだなんとか手に入れることができそうです。

カテゴリー
学術

AIを作ってみよう03

 マイクロプロセッサでAIを作るにしても具体的にどうするか決めてからではないと行動できません。ネットで「マイコン」と調べても無数に情報があり的を絞ることができません。

 第一条件として予算、高価で揃えられないものを夢みても空論で終わってしまうので費用を第一の条件とします。

 第二条件として普及度、今この時にしかないような特殊なものは使わないようにします。過去も有ったし未来も有るだろう、それは汎用品だからというものを第二の条件とします。

 この条件に当てはまると思ったのがIntel系の8ビットCPUです。極めて広範囲に普及した為に情報量が多く数十年間様々な分野で君臨しています。これからも廃れることはないでしょう。

UPD8080A
UPD8080A
D8085AC-2
D8085AC-2

 このCPUは割と今でも手に入ります。最新のCPUより割高ですが機能が少なく作りが大きいので素人が学習するには良い教材です。秋月であれば100円以下のCPUもありますが基本から技を得るためにヴィンテージCPUを選択しました。

カテゴリー
学術

AI開発のアプローチ方法に誤りがある

 今のコンピュータに知的活動をソフトウェアに置き換えて載せようとしているのは間違いではないか。

カテゴリー
学術

AIを作ってみよう02

 鉄筋コンクリートではゲルマニュームラジオを動かすとができなかったのでトランジスタの力を借ります。

ダーリントン接続ラジオ
ダーリントン接続ラジオ

https://www.zea.jp/audio/schematic/sc_file/022.htm

 アンテナはベランダに出したビニール線(LANケーブルをばらしたもの)、コイルとバリコンとクリスタルイヤホンはゲルマニュームラジオで使ったもの、ダイオードをやめて高周波増幅に2SC1815を2個ダーリントンにし、低周波増幅も2SC1815を使いました。電源は単3電池2個です。

 鳴りました。分離性が悪い為、受信できた放送局は少ないですが確かに鳴りました。円筒型バリコンの内側を引き出せば短波放送も受信できたのです。

 実用性がないものですが動くととても楽しいものです。出だし吉と占われたと思いAIが完成するまで頑張ろうと思います。

 部品数が十数点の小さな電子回路からの出発ではゴールは見えない遥か彼方です。少しずつ進めていく過程をここで報告致します。