Superb Garbages 2

千野純一(chinorin)のはてなダイアリーの続きです。

ある経路に流す電流の方向を制御する回路

・これに一般的な名前はあるんだろうか。たまーに必要になるんですわ。まあだいたいコイルに関することなんだけど、コイルって電流を流すと磁場が発生するじゃないですか。電流の方向を逆にすると発生する磁場の極性が逆になるので、ある種のモーターは逆方向に回ったり、ある種のソレノイドは逆方向に動いたり、ある種のラッチングリレー(スイッチ状態が常に保持されていて、変更するときだけ電流が必要なタイプのリレー)はこっち向きがセットであっち向きはリセットっていう仕組みになってたりする。

・今回はそのような、「ある経路(というかコイル)に流す電流の方向を制御する」仕組みの、最も単純と思われる回路、最も定番と思われる回路、それから自力で考えた実用性ありそうなくらいシンプルな回路、計3つ(+α)を紹介する。

・最も単純な形は、いきなり設計として現実的じゃないんだけど、独立した電源を2個使う方法だと思う。下に示す回路は、真ん中にあるスイッチを押すと反時計方向、下方にあるスイッチを押すと時計方向に電流が流れる。同時に押すと壊れる。w

・2つの電源が独立しておらず、1つの電源に1つの経路を順方向に接続したまま同時に逆方向にも接続した場合、このような単純な(SPSTの)スイッチを2個だけだと必ず短絡が発生する。それを解決するにはHブリッジの原理を使って4箇所にスイッチを配置するのが定番とされているみたい。

・それを物理的なスイッチ2個で実現するなら、スイッチ自体に2回路(DPST以上)のものを採用して、こんな感じにする。

・黄色いひとかたまりでDPSTスイッチを構成しており、押すと中にある2つの経路がそれぞれ別個に繋がると考えてほしい。ちなみにこれも、両方のボタンを同時に押すと壊れるな。抵抗はコイルの隣ではなく電源の直後とかに置くべきだ⋯。

・そんでもうひとつ。これは自力で思いついたということを明確に記しておくがw けっこう綺麗な回路ができたので見ておくれよ。

・ボタンを押すと「抵抗のみ」「コイル+抵抗」が並列に繋がり、押すボタンによってコイルに流れる電流の方向が変わるのがわかってもらえるだろうか。2つの抵抗によって必ず分流が起こってコイルに流れる電流はそれなりの値になるのでそこだけ注意。

・なお抵抗がないと壊れるのは当然として、例えばGND直前に1個だけ配置した場合、理論的には分流が起こらずコイル側の電流は0となる。導線の抵抗や接触抵抗などの働きで意外とうまくいくかもしれないけど、インダクタンスによっては立ち上がりにとても時間がかかる可能性はあるかな?

・ご存じの通りスイッチはトランジスタに置き換えることができるわけだけど、Hブリッジで4個使うのめんどくせーじゃん? っていう意味でこれを思いつけて嬉しかったというまあそれだけの、以上ディスクリート縛りでのお話でした。


・IC使うならこれでいけるのが切ない。(三角形はバッファ:入力された論理値と同じ論理値を出力する論理ゲート)

・あ、いや、でもこれは両方のバッファの入力直前にプルダウン*1が必要だ。習慣でパスコン*2も置くだろうし、そこまでするとやっぱりけっこう複雑になるよね。勝った⋯!


・突然だけど詳しくない人にクイズ。バッファというのは入力されたのと同じ論理値を出力する論理ゲート、つまりHIGHが入力されたらHIGHを出力し、LOWが入力されたらLOWを出力します。これはなんのために存在するでしょうか?

*1:プルダウン:10~47kΩ程度のプルダウン抵抗を介してGNDに落とす。

*2:パスコン:バイパスコンデンサのこと。ICの電源端子付近に0.1μFの積層セラミックコンデンサを配置するのはもはやICを使うときのお約束である。コンデンサの色も日本では青と決まっている。欧米は黄色らしい。もし君が大金持ちならフィルムコンデンサを使ってもいい。

錬金術師の苦悩

・先日ついに長年の研究の成果が実を結び、あの石を錬成することに成功しました。等価交換の理には逆らえずたいへんつらい思いをいたしましたが、その後鋭い痛みと共にそれがコロッと出てきた瞬間、頭の中では東京音頭が流れ始め⋯⋯違う違う、流したかったのは炭坑節です。

・危機は去った。だが既に腎臓では第二第三の結石が、剥落して管に詰まるのを今か今かと待ち望んでいるのであった。為す術もなくたぶんつづく。

S-VHSの呪い、HD DVDの亡霊

・こういうの前にも書いたと思うし今更なんだけどたまたま4K Ultra HD Blu-rayっていう文字列を見かけて怒りを思い出してしまったからさ。

・古の昔、映像メディアというジャンルで競争があった。40代以上でないともう実感はないかもしれないが言わずと知れたベータマックス通称「β」対「VHS」の争いだ。さて、「ベータ」と「ブイエイチエス」(当時はエッチという発音が可能だったので「ブイエッチエス」と言ってたかもしれない*1)、どっちが言いやすいだろうか。電気屋さんで「ベータください」と「ブイエイチエスください」、言うとしたらどちらがいいだろう。

・まあ、これはまだよかった。「ブイエイチエス」は許容範囲だったということで、なんやかんやでVHSが勝利し、これで「言いにくい方」の1勝。のちにS-VHSとかD-VHSとかあったんだけどまあVHSにだいぶ慣れちゃったからまだやれたのかな。っていうかD-VHSって知ってる?

・次にCDからの派生*2でアナログ映像ディスクのけっこう地味な競争があった。レーザーディスク通称「LD」対「VHDの争いだ。さて、「エルディー」と「ブイエイチディー」(例によって「ブイエッチディー」って言ってたかも)のどちらが言いやすいだろうか。

・LDは非常に扱いにくい裸のでっかいディスクなんだけどVHDはカードリッジに入ってるやつを自動的に吸い込む方式だったりまあいろいろありつつもオタク文化のあれによってこれはLDが勝った。これで1勝1敗のドロー。

・次はデジタル映像ディスクなのであるが、これは目立った競争がなく、DVDのほぼ不戦勝というような感じだった。どうだろう。「ディーブイディー」って言いやすいと思う? 俺は言いにくいと思うんだ。技術畑では「デーブイデー」と呼ぶ人もけっこういたのも言いにくいことの証左だと考える。不戦勝ながら、言いにくい方の2勝1敗

・そんで青色レーザーデジタル映像ディスクの時代が幕を開け、新たな争いが始まった。そろそろディスクもどうなんだって世の中ではありつつも、Blu-ray Disk通称「ブルーレイ」あるいは「BD」対「HD DVDというカードである。さて⋯⋯ここまでくると非常に馬鹿馬鹿しい問いになってしまうのだが、一応やろう。どっちが言いやすいだろうか。俺は圧倒的に前者だと思う。「エイチディーディーブイディー」なんて言うのにいったい何秒かかるんだ。それに「ディーディー」なんて日本人が発音可能な文字列ではないのだ。(64DDに謝れ)

・これはさすがにブルーレイの勝利となった。当然だ。これも何度も言うけど、誰が店頭で
「これのエイチディーディーブイディー版ありますか?」
「お客様申し訳ありませんこちらのエイチディーディーブイディー版は品切れになっておりまして⋯」
「えー、エイチディーディーブイディー版ないのぉ? 困ったなあ、俺エイチディーディーブイディーデッキしかもってないからエイチディーディーブイディーじゃないと困るんだよなあ」
「こちらのエイチディーディーブイディーは2~3日で再入荷の予定となっておりまして、よろしかったらご予約いただければこちらのエイチディーディーブイディーが再入荷したときに確実にご購入いただけますが」
「そうですか、エイチディーディーブイディーは再入荷するんですか、じゃあエイチディーディーブイディーを予約しようかな」
「エイチディーディーブイディーのご予約ありがとうございます!」
みたいな会話をしたいと思うんだろうか。書いてて一度くらいはしてもいいなとちょっと思ったけど。これで2勝2敗、再びドロー。いい試合と言っていいのではないだろうか。

・そんで次が一番最近の流れね。ブルーレイでは容量が心許なくなり次世代メディアが望まれる時代となったが、もう本格的にディスクとかもういいだろって感じになってしまってライバルとなる陣営も出てこず、ここではブルーレイの後継メディアが一人勝ちというのが自明という状況が生まれた。最新規格ではどんな自由なことをやっても大丈夫なのだ。やったー! これで好きな名前をつけられる! と開発側の人たちが思ったのかどうかは知らん。

・そうして満を持して登場したのが「4K Ultra HD Blu-ray! ここにきてまさかの「HD」復活である。えぇ⋯⋯こんなのブルーレイ2とかでよくない?

・誰が店頭で
「これのヨンケーウルトラエイチディーブルーレイ版ありますか?」
「お客様申し訳ありませんこちらのヨンケーウルトラエイチディー⋯⋯オチは爆発でいいよね?

・かくして物理的な映像メディアというものは跡形もなく滅亡したのであった。お疲れさま。次回はUSB 3.2 Gen 2×2でロボトルファイト!

*1:現在の日本においては、公共の場所でHを「エッチ」と読むのは不可能になってしまった。昔はNHKをエヌエッチケイと言ってたし、鉛筆のHBもエッチビーって言ってたと思う。

*2:技術的には全然違うものだけど庶民としては銀色に光るディスクだったから似たようなものとして認識している人が多いだろうと思う

最近買ってよかったもの

・なんとなく。今日は2点紹介します。

・まず一点目はHAKKOのこて台。最近ずっとHAKKOのPRESTOっていうはんだごてを使ってるんです。なぜかガンタイプ。

・こいつがどこにどうやって置いてもいまひとつ安定せんのよ。それとちょっと置き場所を工夫しようと思って、あんまり粗末な、例えば金属板をバーンとプレスしてはい完成ってなやつじゃなくてそこそこちゃんとした⋯⋯具体的に言うと置いたときにこて先が露出せず筒に入れるような形状になっていて、かつ筒の外側がそれほど熱くならないものが欲しくて探した。ひたすら探した。

・で、どう探しても一番安かったのがこれだった。714円。うまい棒を59本我慢しなければならないので心の中でやおきんに謝りながら買ってみたらこれが非常によい出来で、買って届いて使ってみるまではんだごてと同じメーカ製であることを知らなかったんだが、こういうのって同じメーカで揃えるとメリットがあるもんなんだね⋯。

・まるでこのはんだごてのために作ったかのようにぴったりフィットで、かといってタイトなわけでもなくすんごいちょうどいい。というかはんだごてを置くのが気持ちいい。すごい。こんなことではんだごてを使うことについての億劫さが減るとは思わなかった。もう飽きたけど、最初の数回はほとんどこれにはんだごてを入れることを目的にはんだごての電源を入れてた。w

・ちゅーわけで、うん。はんだごてと同じメーカのこて台について、みんなも一応調べてみておいた方がいいかもしれないよ⋯。

・2点目は頭にマウントするルーペ。今までは、ICの刻印とかを見るときはメガネタイプのやつと手持ちのやつを、はんだづけのときはメガネタイプのやつとフレキシブルアームで保持するやつを併用してた。

・メガネタイプのやつって便利そうに見えて全然便利じゃないよね! メガネタイプのやつをかけてるときは最大1回の精密作業以外何もできないので、その都度完全に外す必要がある。一方こいつはレンズを跳ね上げる機構があって、それだけでこんなに面倒が少なくなるとは思わなかったわ。

・で、これはLED照明もついてるし、レンズの交換(5種類)も可能で、あとメガネっぽく保持するのが心許ない場合に使うゴムバンドみたいなやつも付属してる。例によって探した中で一番安いやつで、ぱっと見でも一番粗末っぽいのがわかると思うけど、それでも機能的には全然問題ないんじゃないかなあ。高いの使ったことないからわからんが。

・まだ慣れきってなくて上げたレンズを下げないで作業を再開しちゃったり、照明の方向がおかしいのを顔の方向で調整しようとして見えねえじゃんって思ったところでやっと照明の方向を手で修正できることに気づいたりもするんだが、まーそれがあったとしてもずっとつけてて大丈夫っていうのがやっぱり便利なのよ。そこまで重いわけでもないし。


・というわけで合計すると175本です。摂取するナトリウム量も減るのでこれなら脳もOKであるが、俺ががまんしてる間、みんながやおきんを支えておいてあげてくれ。たのんだぞ⋯。

薬飲み忘れマシーン

・飲み忘れるのが目的ではないのだが、タイトルというものはこれくらい自由でよいのです。

脳出血既往につき、とにかく1日1回朝食後に薬を飲まなきゃいけないのだがもうひたすら忘れるというか、薬を飲むことに興味がなさすぎて薬を飲むという行動をしたこと自体全然覚えられない。「薬飲まなきゃ」と思った記憶やシートから薬を出した記憶だけはあるのだが、果たしてその記憶は10分前のことなのか、それとも前日なのか、まさか前日も飲んでないのかも全くわからず、最初は曜日対応のピルケース的なものを自作してやってたんだけど、すぐに紛失した。(⋯)

・とにかく薬を飲むことが大脳的に意味がないから、必ず自動行動にしちゃうんだよなあ。自動行動っていうのは造語で「わざわざ俺の意識がやらなくてよい行動を全部無意識に任せて、意識はその間別のことを考えてる」という現象。トイレ、風呂、歯磨き、たいていの食事、パネルでポン(最近またやらなくなったけど)、サーモンランなどの時間がこれに該当する。そして自動行動している間のその行動に関する記憶のほとんどは速やかに消滅する。正に「メシはまだかいのう」状態だ。

・というわけで、薬を飲んだ時間を記憶してくれるデバイス&仕組みを作った。機能としてはくだらない部類だとは思うし基礎技術的ではあるものの、仕組み的にはなかなか楽しげなものができたんじゃないかな?

・それが表題の「薬飲み忘れマシーン」である。ウェブサーバに設置したPerlCGIスクリプトと、Seeed社のマイコンボードXiao ESP32C3Wi-Fi機能を使ったデバイスで、最後に薬を飲んでからだいたいどれくらい経ったかを常にLEDで表示するというもの。最後に薬を飲んだ時間はウェブ上に記録し、新たに薬を飲んだときはデバイスのボタンを押せばPerlスクリプトが記録を更新してくれる。また、(デバイスWi-Fiパスワードとかの関係で自宅用なので)自宅にいないときはブラウザでCGIにアクセスすればボタンを押したのと同じ操作をすることができる。

・相変わらず誰も読まないと思うが、そのスクリプト、スケッチ、回路図を公開しておく。ChatGPT先生*1と相談しながらほとんどのソースを書いてもらったので色々無駄があるというか、もっと洗練させた設計にもできたんだが、まーとりあえずね。動けばいいのよ動けばの精神で。

・例によってソースコード/スケッチのライセンスはCC0著作権は主張しません。ご利用は自己責任で。


・まずPerlスクリプト。ファイル名はtime.cgiで、URLの末尾に ?mode=xxx という文字列をくっつけるいわゆるGETメソッドにより指定する4つのモードがある。

  • デフォルト:マイコン用、最後にボタンを押してから何時間経ったかという数字(0~99の範囲)だけを返すモード。
  • ?mode=reset:マイコン用、ボタンを押したときのモード。サーバが起動してからの秒数をtime.txtに書き込む。
  • ?mode=html_disp:ブラウザ用、数値表示モード。最後にボタンを押してから何時間経ったかという数字(0~99の範囲)と、最後にボタンを押してからの秒数(これは動作確認のための仕組み)、それからhtml_resetモードへのリンクを表示するHTMLを返す。
  • ?mode=html_reset:ブラウザ用、ボタンを押したときと等価のモード。サーバが起動してからの秒数をtime.txtに書き込み、その後html_dispモードのURLにリダイレクトする。
#!/usr/bin/perl
use strict;
use warnings;
use CGI;

# CGIオブジェクトの作成
my $cgi = CGI->new;

# モードの取得
my $mode = $cgi->param('mode') || '';

# time.txtのパス
my $time_file = 'time.txt';

# モードに応じた処理
if ($mode eq 'html_disp') {
    # HTMLを出力
    print $cgi->header('text/html; charset=UTF-8');
    print "<html><body>\n";

    # time.txtの内容を表示
    open(my $fh, '<', $time_file) or die "Cannot open $time_file: $!";
    my $time = <$fh>;
    close($fh);

    # 現在の時刻から経過時間と経過秒数を計算
    my $current_time = time;
    my $elapsed_hours = int(($current_time - $time) / 3600);
    my $elapsed_seconds = $current_time - $time;

    # 経過時間を表示
    print "経過時間: $elapsed_hours 時間<br>\n";

    # 経過秒数を表示
    print "経過秒数: $elapsed_seconds 秒<br>\n";

    # RESETリンクを表示
    my $reset_url = $cgi->url() . '?mode=html_reset';
    print "<a href=\"$reset_url\">RESET</a>\n";

    print "</body></html>\n";
} elsif ($mode eq 'html_reset') {
    # 現在のlocaltimeをtime.txtに書き込む
    my $current_time = time;
    open(my $fh, '>', $time_file) or die "Cannot open $time_file: $!";
    print $fh $current_time;
    close($fh);

    # 1秒待ってhtml_dispにリダイレクト
    print $cgi->redirect(-url => 'time.cgi?mode=html_disp', -status => 302, -delay => 1);
} elsif ($mode eq 'reset') {
    # 現在のlocaltimeをtime.txtに書き込む
    my $current_time = time;
    open(my $fh, '>', $time_file) or die "Cannot open $time_file: $!";
    print $fh $current_time;
    close($fh);

    # 1秒待ってtime.cgiにリダイレクト
    print $cgi->redirect(-url => 'time.cgi', -status => 302, -delay => 1);
} else {
    # time.txtの内容を取得
    open(my $fh, '<', $time_file) or die "Cannot open $time_file: $!";
    my $time = <$fh>;
    close($fh);

    # 現在の時刻から経過時間を計算
    my $current_time = time;
    my $elapsed_hours = int(($current_time - $time) / 3600);

    # 経過時間の範囲を制限
    $elapsed_hours = 99 if $elapsed_hours > 99;

    # HTTPヘッダを出力
    print $cgi->header('text/plain; charset=UTF-8');

    # 経過時間を出力
    print $elapsed_hours;
}

・次、Arduino言語による、Xiao ESP32C3用のスケッチ。

・ピン名の定数とか無意味に冗長だったりwifiConnectedという変数に全く意味なかったりするけど気にしない。こういうのっておそらくWi-Fiに接続できなかったときの云々とかが必要なんじゃないか(そしてそのためにwifiConnetcted変数があるんじゃないか)と思うが、まー部屋の中で使うし、必ず一発で繋がる前提である。なんか困ったらマイコンのリセットボタンを押す。w

・GPIOにはとにかくLED5個とボタンがひとつ接続する。A0のLEDはパイロットランプの役割で、普通に点滅させるの目障りだったので滑らかに明るくなったり暗くなったりするようにした。D1~D4のLEDは経過時間インジケータ。6時間ごとに1個ずつ点灯していき、24時間以降は全点灯する。なおこれらのLEDは起動時とかWi-Fi接続時とかに軽く電飾動作をする。

・起動時と、その後10分ごとにWi-Fiに接続してCGIを見に行く。デフォルトモードのCGIは数字だけを返すので、それを見て上記LEDを光らせる。D5に接続されたボタンが押されたらCGIのリセットモードにアクセスする。って感じ。

#include <WiFi.h>
#include <HTTPClient.h>

const char* ssid = "Wi-Fi SSID";
const char* password = "Wi-Fi Password";
const char* url1 = "http://hoge.jp/fuga/time.cgi?reset"; // resetモードのURL
const char* url2 = "http://hoge.jp/fuga/time.cgi"; // デフォルトモードのURL

const int pinD1 = D1;  // D1ピンの番号 6~11high
const int pinD2 = D2;  // D2ピンの番号  12~17high
const int pinD3 = D3;  // D3ピンの番号  18~23high
const int pinD4 = D4;  // D4ピンの番号  24以上 high
const int pinD5 = D5;  // D5ピンの番号  ボタン(pullup)
bool wifiConnected = false;  // Wi-Fi接続状態のフラグ

unsigned long blink_time,now,min10;
bool first=false;  // 初回起動時フラグ
bool litplus=true; 
int litduty;

void setup() {
  pinMode(pinD1, OUTPUT);
  pinMode(pinD2, OUTPUT);
  pinMode(pinD3, OUTPUT);
  pinMode(pinD4, OUTPUT);
  pinMode(pinD5, INPUT_PULLUP);

  digitalWrite(pinD1, LOW);
  digitalWrite(pinD2, LOW);
  digitalWrite(pinD3, LOW);
  digitalWrite(pinD4, LOW);

  now=millis();
  min10=now;
  blink_time=now;
}

void loop() {
  now=millis();

  // A0ピン呼吸
  if((now-blink_time)>50){
    if(litplus){
      litduty++;
    } else {
      litduty--;
    }
    if(litduty==60) litplus=false;
    if(litduty==0) litplus=true;

    analogWrite(A0, litduty);
    blink_time=now;
  }

  // D5ピンを監視
  if (digitalRead(pinD5) == LOW) {
    if (!wifiConnected) {
      analogWrite(A0, 100);
      digitalWrite(pinD1, HIGH);
      digitalWrite(pinD2, HIGH);
      digitalWrite(pinD3, HIGH);
      digitalWrite(pinD4, HIGH);
      // Wi-Fiに接続
      connectToWiFi();
      // URL1にリクエストを送信
      sendRequest(url1);
      // Wi-Fiを切断
      disconnectFromWiFi();
      // D1~D4ピンをLOWにする
      digitalWrite(pinD4, LOW);
      delay(300);
      digitalWrite(pinD3, LOW);
      delay(300);
      digitalWrite(pinD2, LOW);
      delay(300);
      digitalWrite(pinD1, LOW);
      delay(300);
      analogWrite(A0, 0);
    }
  } else {
    // 10分ごとにWi-Fiに接続
    if (((now-min10)>=600000)||!first) {
      first=true;
      analogWrite(A0, 100);
      delay(200);
      digitalWrite(pinD1,LOW);
      delay(200);
      digitalWrite(pinD2,LOW);
      delay(200);
      digitalWrite(pinD3,LOW);
      delay(200);
      digitalWrite(pinD4,LOW);
      delay(200);

      min10=now;
      if (!wifiConnected) {
        // Wi-Fiに接続
        connectToWiFi();
        // URL2にリクエストを送信
        int response = sendRequest(url2);
        // Wi-Fiを切断
        disconnectFromWiFi();

        digitalWrite(pinD1,HIGH);
        delay(200);
        digitalWrite(pinD2,HIGH);
        delay(200);
        digitalWrite(pinD3,HIGH);
        delay(200);
        digitalWrite(pinD4,HIGH);
        delay(200);
        digitalWrite(pinD1,LOW);
        delay(200);
        digitalWrite(pinD2,LOW);
        delay(200);
        digitalWrite(pinD3,LOW);
        delay(200);
        digitalWrite(pinD4,LOW);
        delay(200);

        // 数字に基づいて処理を行う
        if (response >= 6) digitalWrite(pinD1, HIGH);
        delay(200);
        if (response >= 12) digitalWrite(pinD2, HIGH);
        delay(200);
        if (response >= 18) digitalWrite(pinD3, HIGH);
        delay(200);
        if (response >= 24) digitalWrite(pinD4, HIGH);
        delay(200);
        }
      }
    }
  }


void connectToWiFi() {
  WiFi.begin(ssid, password);
  Serial.print("Connecting to Wi-Fi");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  Serial.println("Connected to Wi-Fi");
  wifiConnected = true;
}

void disconnectFromWiFi() {
  WiFi.disconnect(true);
  WiFi.mode(WIFI_OFF);
  Serial.println("Disconnected from Wi-Fi");
  wifiConnected = false;
}

int sendRequest(const char* url) {

  HTTPClient http;
  
  // HTTPリクエストを開始
  http.begin(url);
  
  // GETリクエストを送信
  int httpResponseCode = http.GET();
  
  int response = 0;
  if (httpResponseCode == HTTP_CODE_OK) {
    // レスポンスの取得
    String payload = http.getString();
    response = payload.toInt();
  } else {
    Serial.print("HTTP Request failed with error code: ");
    Serial.println(httpResponseCode);
  }
  
  // リクエストの終了
  http.end();
  
  return response;
}

・そしてデバイスの回路図。実際は、ユニバーサル基板にピンソケットをはんだづけしてそこにピンヘッダ実装済Xiao ESP32C3やLEDが刺さる形にした。

・ま、単純なもんね。LEDは左から動作確認用、6時間経過、12時間経過、18時間経過、24時間経過のインジケータで、それぞれ緑,緑,黄,赤,自点滅の赤を使ったがこれらの色は何でもいい。

・その隣のボタンは薬飲んだ時に押す用。マイコン内でプルアップしているのでGNDに直接繋いでおり、つまりLOWでトリガー。

・右上のショットキーバリアダイオードは逆流防止用で5V端子から給電する場合は必須とのことだが、結局USB端子から給電しているのでこれも今のところ無意味だな。


・現状のいいところ:

  • 10分に1回軽くピカピカしてるのはがんばって仕事してる感じがしてよい。

・機能改善案:

  • やっぱり7セグかなんかで数字をそのまま表示した方がよくない?

  • CGIで書き込む時間は実時間にした方がいろいろ応用がきくんじゃない?

  • CGIで書き込む時間についてはログを残したり、間違えてボタンを押したときのためにキャンセルができたりした方がよくない?

  • ボタンを押したときにWi-Fiに接続するときのピカピカはやるが、もっとハッキリ「更新完了!」を主張するべき。(スケッチ書き換えるだけだから簡単にできるが)

・ そのうち作り直すかもしれないけど、まー要件は満たしており困っていることがあるわけでもないので、まー気が向いたときにマイコンのスケッチを書き換えるくらいかも。

*1:しかも3.5。GPT-4は喋るの遅いからめんどくさい

「許してジーメンス」って言いたいだけじゃねーか

キャパシタ いやいや、コンデンサでしょ。電気を濃縮するんだからコンデンサよ。コンデンスミルクのコンデンスと語源一緒なんだよね。これ豆な。

キャパシタンス? いやいや、静電容量でしょ。ちゃんと日本語があるんだから日本語を使おうよ。それにコンデンサンスとかならまだいいかもしれんが、コンデンサなのにキャパシタンスとか意味わかんねーのよ。

コイル? いやいや、インダクタでしょ。コイルって発生させた磁気でなんか引き寄せたり反発させたり回転させたりするやつじゃん。インダクタも磁界だけど、そういうなんか目に見える動作をさせるんじゃないわけよ。

インダクタンス? うん、インダクタの能力値で、単位はヘンリーな。いや、インダクタンス以外に言い方ねえだろ。じゃああれか? コイランスとか言っちゃうの? かつらとか作りそう。あるいはセンスみたいなの持っててギャラドスに進化しそう。


・おまけ。

レジスタ いやいや、抵抗っていう美しい日本語がだな。それにレジスタっつーとCPUの中にあってアセンブラとかで直接触れるメモリってイメージなんだけど⋯⋯調べたら、抵抗はresistorでCPUのはregisterですって。へー⋯。後者がorじゃなくてerなのすげー違和感。

レジスタンス? いやいや、反社会勢力なの? 体制にNoなの? 中二病か?


・まあ、レジスタンスに関してはけっこう苦しいと思うんだよね。抵抗値⋯? ってことで許してジーメンス⋯。正しくは(?)「電気抵抗」って言うらしいんだけど「値」って意味の文字がついてないの気持ちわりーよな。

・ここで唐突にタンスの一覧。

箪笥の呼び方 しまうもの
レジスタンス 電気抵抗(オーム/Ω)
キャパシタンス 静電容量(ファラド/F)
インダクタンス 誘導係数(ヘンリー/H)
コンダクタンス 電気の流れやすさ(ジーメンス/S)
電気抵抗の逆数
インピーダンス 交流にかかる電気抵抗(オーム/Ω)
リアクタンス インピーダンスに含まれる
レジスタンス以外の成分(オーム/Ω)
アドミタンス 交流の流れやすさ(ジーメンス/S)
インピーダンスの逆数
サセプタンス アドミタンスに含まれる
コンダクタンス以外の成分(ジーメンス/S)

・さらにリアクタンスは誘導性リアクタンスと容量性リアクタンス、サセプタンスは誘導性サセプタンスと容量性サセプタンスにそれぞれ分かれます。ちなみにインピーダンスアドミタンス複素数で表され、リアクタンスとサセプタンスはそれぞれの虚部。

・このタンスシリーズってエキサイ天狗とかインタレス天狗とかに似た趣があるよね。ワンダービットだったかインサイダーケンだったか⋯。

・例えばコンダクタンスは、観音開きのワードローブがガチャっと開いて中から燕尾服の人が指揮棒振りながら出てくるイメージ。

やっとオペアンプがだんだんわかってきた

・コンパレータはこのへんの勉強を始めてわりとすぐに理解したんだけど、オペアンプほんと意味わかんないよね。

・まず、巷でされている説明とか考え方のモデルを作るのがへたくそなんじゃないかなあ。トランジスタ類もそうだけど、こういうのは単純化モデル層と仕組みや構造を含めた厳密に正しく理解する層に分けて、違う説明をするべきなのではないか。PNPとNPNでエミッタとコレクタが逆であること、またはFETのPチャネルとNチャネルでドレインとソースが逆であること、物理的、論理的、色々な面においてそれが正しいのかもしれないけど、初学者に対してそのような説明をするべきではない。⋯と◯ぬまで言い続けるつもりだ。

・だいぶわかってきたから個人的にはもういいといえばもういいんだけど、オペアンプの説明についてまずいところを2つ指摘したい。

・ひとつは入力抵抗の説明。オペアンプの入力抵抗は非常に高いので、例えば非反転入力の直前までやってきた電流はオペアンプ側に流れ込むことはできない。なのでここの電流はゼロ、ってところから計算を始めるんだけど、入力の直前までやってきた電流はどこへ行っちゃうの? さらに反転増幅回路の場合は出力からの帰還電流もそこで合流するわけじゃん。オペアンプに電流が入らないということは、より電圧が低い入力側に⋯⋯⋯あ、違った、出力は反転してるから、より電圧が低いのは帰還側か。ということは帰還の経路は結局何してんの? 全然帰還じゃなくて逆に入力電流を出力側に回してるように見えるが、それが増幅ってことなの? は? 自分でも何言ってんのかわからん。

・で、もういっこはイマジナリーショートよ。反転入力と非反転入力は短絡されているとみなすとかなんとかってやつ。これほんと言ってることがめちゃくちゃなのよ。だとすると、理想的なオペアンプは絶対に何もせず電気も全く通らないただの石になってしまうじゃないか。

・理想的なオペアンプを考えると、反転入力と非反転入力は短絡とみなすそうだから実際に短絡すればそれが実現するじゃん? で、短絡ってことは反転入力と非反転入力に電圧の差はぴったりゼロということだから、差分を出力するはずのオペアンプは何もせずただ基準電圧を出力する。つまり、2つの入力を短絡し、オペアンプをまるごと取り除いて出力があったところをGNDにでも繋げばそれが理想オペアンプの等価回路である。って、そんなわけあるかいな。何のために俺は30円もの高い金出してオペアンプを買ったのよ。

理想オペアンプとその等価回路?

・仕組みや論理的挙動について、なるべく正しくあろうとしながら説明を試みた結果がこれなんですよ。中途半端に正しさを保とうとしても結局何も正しくなくなるわけ。

・そこで思い出すのが技術者の話を真に受けたネーミングの話な。USB 3.1以降の迷走なんかが近年の代表的なものだけど、技術者が正しくあろうとする発言に対してマーケティング関係の人は耳を貸すべきではない。技術者とマーケティング関係の人を両方兼ねてる人は技術者としての自分に対して耳を塞げ。世界は第二のスティーブ・ジョブズを待ちわびているというが、彼は常に正しくあろうとしたか? 答えは明確にNoだ。

・第二のスティーブ・ジョブズを目指している人や求めている人は、以下のことを肝に銘じていてほしい。商品名や素人への説明に関して技術者の意見を聞かないこと。新しい技術を試しているだけの技術者を警告なしでいきなり逮捕しないこと。この2点なくして第二のスティーブ・ジョブズはあり得ない。

・で、何の話だっけ? ああ、オペアンプね。分圧による仮想GNDじゃなくて実際に負電圧を発生させるとき、電荷が貯まったコンデンサが放電して元に戻るときの力を利用して電気を引っ張るの面白いよね。え? 全然オペアンプの話じゃない? いや、負電源ってオペアンプ以外に何に使うのさ⋯。


オペアンプとは関係なく、やっとはっきりわかったことメモ:デュアル軸ポテンショメータやデュアル軸ロータリーエンコーダに適合するノブは、楽器系流通において「スタックノブ」あるいは「デュアルポットノブ」という名前で出回っている。

・つまり楽器界隈ではデュアル軸可変抵抗のことを「デュアルポット」と呼ぶようだ。

・いやまじで、電子部品界隈ではデュアル軸用のツマミが全然売ってねーのよ。まー部品本体もほとんど見かけないんだけど、実は去年勢い余ってロータリーエンコーダを個人輸入したのにツマミがないので使ってないという。