Superb Garbages 2

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

はんだづけって怒られることしか想像できない

  • 金属接合の技術としてのはんだづけって5000年くらいの歴史があるらしくて、偶然はんだに導電性があったからこうして電子工作の技術としてもずっと使われてるんだろうけどさあ⋯。
  • いいかげんなんか新しいの思いついてよって感じ。もっとこう、導電性の粘土みたいなのをこねて詰めればOKとか、導電性の接着剤みたいなのとか、ねえ? そういうのも一応ないこともないみたいんだけど高いしそこまで万能で便利な感じではないみたいだ。はやくこいこいカーボンナノチューブ
  • つーか、絶対に意地でもはんだを流さないスルーホールとかたまにあるんだけどあれ何なの? 基板が焼け焦げてえぐれてフラックスでベタベタのドロドロのぐちゃぐちゃになってもなおはんだを弾きやがってまじでぜんぶまとめて燃やしてやろうかと思うわ。
  • つーかはんだもさー、仮にも物質なんだから融点になったら溶けろよ! そして重力に従って上から下に流れろ!!! なんで見るからに液体なのにピンの上の方で団子になってんだよ。そのまんま隣のピンにブリッジ作りやがるし、吸おうとしたらまた今度は全然溶けねえし、全くどいつもこいつも⋯。
  • それから、なんか最近いきなり妙に眠くなったり妙に喉がガリガリになったり妙に気分悪くて吐きそうになったりしてたんだけどはんだづけのときに煙吸ってるからじゃねーか!!!!! あいつらどんな姿勢でやってても必ず顔の方にくるの何なんだよほんと⋯⋯とか思って調べたら、そういうものらしい
  • ポイント使ってタダでもらったサウンドハウスの扇風機を使って今日は煙を吸わずに済んだぞ。ちゃんと換気もしような⋯。

ハイ&ローってなんだっけ。なんかそういうクイズ番組あったよね⋯

  • 最近どんなインターネッツを見ていても、視界の端でBanggoodだのAliExpressだのモノタロウだのといった奴らがちらちらと謎デバイスを見せびらかしてきやがるんだ。「ん? なんだこの謎デバイスは」⋯⋯そう思ってしまったらその日はもう終わりである。気がついたら日が暮れていて、ブラウザのタブは縦幅よりも横幅の方が狭くなっている。誰もが経験したことがあろうが、そんなタブを全て閉じるのはたいへんな苦痛を伴うのであった。

 

  • なぁるほどねぇ。ハードウェアを全くやらず、少年の頃にまずソフトウェアから入ってそれっきりだからなんだけど、「論理=2進数、真と偽、オンとオフ」みたいなイメージが頭の中に根強くあって、それが論理回路の理解を妨げてるよね。
  • デジタル回路においてHIGHとLOWは等価であって、どちらもオンであると理解するべきだ。それとは別にハイインピーダンスという状態があるので、それがオフに相当するかもしれない。
  • AND回路はHIGHのANDを正論理で出力しLOWのORを負論理で出力する。OR回路はHIGHのORを正論理で出力しLOWのANDを負論理で出力する。NOTは無条件の反転で、XORは反転するかどうかを論理で決める。
  • ええとつまり、XNOR(一致回路ってやつ。論理が一致していればHIGH)はAND(HIGHの正論理AND)とNOR(LOWの負論理ANDを反転)をORすれば作れるはずだ。ほんとか? 自明とは思うんだけどちゃんとやってみよう。
A B A AND B A NOR B (A AND B) OR (A NOR B)
L L L H H
L H L L L
H L L L L
H H H L H
  • よかった。
  • ソフトウェア的にはHIGHは肯定LOWは否定みたいなイメージもあるんだが、デジタル回路内では↑でやった「負論理の反転」とか、「まず反転してからNANDをとり、それを反転したのを反転バッファに入れたのちに分岐させ、ICの負論理に入れたいのでさらに反転」みたいな二重三重どころじゃない多重否定をすることがあるので、LOW自体を否定と捉えてしまうと否定がいっこ増えてまたわけわかんなくなるんだわ。

早めの謝意

  • あーー、NANDだけでNOTもANDもORも作れるんだ。頭いいなオメ―。

\bf{\rm{\overline{A} = \overline{A・A}}}
NOT A = (A NAND A)

\rm{A・B = \overline{ (\overline{A・B\ }) ・ (\overline{A・B\ })\ }}
A AND B = (A NAND B) NAND (A NAND B)

\rm{A + B = \overline{ (\overline{A・A\ }) ・ (\overline{B・B\ })\ }}
A OR B = (A NAND A) NAND (B NAND B)

  • つまり⋯⋯ 

\rm{\overline{A+B\ }=\overline{\overline{ (\overline{A・A\ }) ・ (\overline{B・B\ })\ } ・ \overline{ (\overline{A・A\ }) ・ (\overline{B・B\ })\ }}}
A NOR B =
{(A NAND A) NAND (B NAND B)} NAND {(A NAND A) NAND (B NAND B)}

A \oplus B = \overline{\overline{(\overline{A・A\ }) ・ (\overline{B・B\ })\ } ・ (\overline{A・B\ })}
A XOR B = {(A NAND A) NAND (B NAND B)} NAND (A NAND B)

  • なげーよ。

 

  • マイコン周りの色々な気持ちをだいぶ感覚的にとらえられるようになった気がしていて、その上で様々な周辺情報を覗いてみると、どうやらAVRなArduinoはやや時代遅れ感があるみたいね。まあ、Atmel(AVRのメーカ)はもうないしねえ⋯。今はESP32系か、ARM系か、あるいはRaspberry Pi Pico(PicoはOSをインストールして使うようないわゆるシングルボードコンピュータではなく、むしろArduinoとかに近いワンボードマイコン)あたりが主流なのかな。
  • 確かにESP32開発ボード(900円くらい~)とか、Seeeduino Xiao(500円くらい~)とか、Raspberry Pi Pico(700円くらい~)とかに比べるとArduino、特にちゃんとArduinoの名前がついてるやつは明らかに割高だ。例えばESP32みたいにWi-fiBluetoothが標準搭載ついでにARMアーキテクチャArduino M0 Proは最低でも6000円くらいはするようだし、Linuxも載ってるArduino YUNとか、いわゆるArduinoフォームファクタな製品はけっこうするんだわ。所有することの満足度みたいなのはちょっとあるけど、最終的には明らかに便利さの方が有利になる商品だしねえ。
  • しかしArduinoが未だに有用であるのは、ArduinoIDE(統合開発環境)とArduino言語(C言語に似てるんだけど、Cの型ってこんなに適当だったっけw)は未だに使われているところだ(とりあえずESP32とSeeeduinoはArduinoIDEで開発できる)。イタリアのメーカが中華系マイコンと価格競争するのはやっぱりムリがあると思うので、お約束通りというかなんというか、結局ソフトメーカになっていくのではないだろうか。w 今のところ無料のArduinoIDEをどうやって収益化するのかはよくわからんが。つーか元々「オープンソースハードウェア」だもんなあ。
  • で、しっかりArduino UNOから入ってしまったわたくしでありますが、まー現代における新マイコンの歴史をちゃんとたどった感じで、無駄ではなかったんじゃない。何よりArduinoは資料が多くて非常に助かったし、こんなに楽しくやれてるのもArduinoのおかげである。というか所有している限りUNOやLeonardoなんかは小規模な実験環境においてすごい便利だからこれからもずっと使うと思うよ。

ソフトでもハードでもATtinyをつけたまま

  • マイコンやってて一番面白いと感じるのは、どこまでハードウェアで実装してどこからソフトウェアで処理するかという境界線の自由度が高いところだ。もう線だけ繋いでチャタリングとかの諸問題はプログラムで対策することを選んでもいいし、回路をきっちり設計して単純で見通しのいいプログラムを書いてもいいし、その中間のうまい落とし所があればそれを選んでもいい。
  • というわけで、今のところは回路設計というものが新鮮で楽しいのでできる限りハードウェアで解決しようと試行錯誤しているが、複数のマイコンを組み合わせることを検討するのもなかなかエキサイティングだ。
  • 例えば今ロジック系のICを全然持ってない。いざというときのために論理ゲートくらいはひととおり揃えておくべきなのか…? とか考えながら集積回路の値段とか見てたら、ATtiny13とかの廉価マイコンチップがロジックICと同じかむしろ安いくらいの値段(60円とか)で売ってることに気づいてしまった。これをいくつか持っておいて、必要になったときに論理ゲートと同じ動きをするプログラムを書き込めばそれで済むのではないか。気分気分FPGAチックアハンである。
  • さすがにシュミットトリガとかをプログラムするのはめんどくさそうだけど⋯⋯いや、アナログ入力から電圧を見るだけだから逆にソフトの方が得意っぽい感じがしなくもないな。って、はあ? AVR(ATナントカっていうシリーズのマイコン)って全ピン必ずシュミットトリガなの? へえ、そうなんだ⋯。
  • それよりもATtiny13は使えるピンが5本しかないこととかプログラム領域が1KBしかないこととかの方が問題かもしれない。でもまあ5本のうちの3本はアナログ入力として使えるみたいだから、何らかの方法で入力ごとの電圧を変えることでなんかうまいことやれるんじゃないかとも思うが。

 

  • 前回の誤り:MCP23017を複数接続するときは、A0~A2という名前の3つの入力ピンでそのシリアル通信内でのユニークなアドレスを設定します。具体的にはA0~A2のHIGH/LOWを二進数として扱って0x20に足します。これにより0x20~0x27というアドレスで同時に8個のMCP23017を使用することができます。4個ではないです。つまりたった2ピンを占有するだけで新たに16×8=128のI/Oを追加することができるわけだ。
  • ちなみにMCP23008っていうMCP23017のポート数が半分になったバージョン(つまり8ビットI/Oエクステンダ)というのもありまして、そちらも同じように同時に8個使うことができ、調べたらアドレスも0x40~0x47というMCP23017と重複しない数字だったので、両方8台ずつ使うことでえっと……128+64=196ピン増えるのかな。つーかそもそもマイコンをI2Cのスレーブノードにすることも可能で、I2Cのアドレスの規格上最大112個までいけるそうだし以下略。

電子工作の沼

  • 底がねえ。
  • 新しく何かを作ろうと思うことがちょくちょくあるんだけど、そのたびに必ず何かしらのパーツが足りないんだよな。それでネットショップで足りないものを調達しようとすると⋯⋯
  • (その1)2個くらいあればいいのに100個単位でしか売ってなかったりする。探せば5個くらいで売ってるのを発見することもあるんだけどかなり割高、へたすると100個買うより絶対的に高かったりする。例えば、100個100円だけど5個だけ買うと200円とか。
  • (その2)パーツを見てると新たにどんどん作りたいものが思いついてしまってかなわん。これも興味あるしこれも面白そうみたいな感じでばんばんカートに入れてるといつの間にかたいへんなことになっている。しかし1個1個は50円とか100円とか高くても300円とかなので、どれを減らしても大して節約にならんというか。でも無駄なものは無駄なのでごっそりいろんなものを諦めて削除した上で注文し、それらが届いて検品してるとあーやっぱりあれは必要だったわってなる。そして最初に戻る。

 

  • ところで前回の(1)入出力が足りない問題については、「抵抗とボタンを並列に」と似たようなことをしているわけでは全然ないのだが、とにかくMCP23017というICを使ってI2Cで遊んでいる。I2Cというのは大昔からあるシリアル通信の規格だそうで、正しい表記は「\rm{I^2C}」。SDA(データ)とSCK(クロック)という2本のピン(と電源とGND)を接続するだけで、MCP23017(16ビットI/Oエクステンダと呼ばれている)1個につき16のI/Oを扱うことができ、さらにMCP23017自体は同時に最大4個、つまり1つのシリアル通信で最大64のI/Oを扱うことができる仕組みだ。
  • 制御はArduino環境だと標準ライブラリ <Wire.h> があり、MCP23017自体にプルアップも内蔵されてるし(ちゃんとそういう注文をしないと使ってくれないが)、I2Cの仕組みさえ理解してしまえば簡単なもの⋯⋯かと思いきや、プルアップの普段HIGHでスイッチONでLOWになるのとか全然慣れなくて、MCP23017の機能で取得するパラメータを反転させておくと楽なんだろうなあと思ってそうしたにも関わらずソフト側で取得するときにうっかり値をさらに反転して使ってしまったり、レジスタに渡すためのuint8_t型において左のビットと右のビットどっちが0番ポートについての値なのかいつまでたっても覚えられない上にICの足の番号も逆に読んじゃって何が何だかよくわかんなくなったり、まーいろいろたいへんである。前途多難だ。
  • で、I2Cで面白いのは、この方式を採用しているデバイスというのがそもそもけっこうあるらしいという点。この界隈で一番よく見かけるのはI2C接続のキャラクLCD(つまり文字を表示するための液晶)なんだけど、例えばWiiリモコンの下に刺すデバイス、つまりヌンチャクとかクラシックコントローラとかがI2Cだそうで、コネクタさえなんとかすれば(なんとかならない場合は線をぶった切って直結すれば)Arduinoでそのまんま使えるらしい。これはいいことを聞いた。もともと作りたいのものの一つにWindows用左手HIDというのがあるわけで、とりあえずヌンチャクで作ってみることを検討してみよう。とりあえず実験だー。

 

  • ところで前回の記述がけっこう間違っている。ATmega32U4からI/Oピンが全部出てるのはPro MicroではなくてArduino Microだったと思う。それからNANDを2個で作れるのはDフリップフロップではなくて\rm{\overline{SR}}ラッチ(Dラッチ?)あるいはRSフリップフロップとかそんな感じみたいだ。結局よくわからん。

最近やっていること―ArduinoとHIDの実験

  • まず「Arduino UNO R3」と「Arduino Leonardo」を買ってみて色々実験したり情報を漁ったりしているうち、ATmega32U4(マイコンチップの名前)を搭載したLeonardo互換な小型マイコンボード「Pro Micro」の存在を知ってそれも買った(すべて純正品ではなく互換品)。ちっちゃい。
  • 主目的は自分好みのHID―USB接続のヒューマンインターフェース、足用デバイスや左手用デバイスみたいなものを作ることなのだが、それならATmega32U4よりもっと小型のATTiny85でも最低限のことができると知り、「Digispark」ってのも2個買った(これも純正品ではなく互換品)。安いし(300円くらい)、すげえちっちゃい。
  • Pro MicroならマイコンからI/Oピンが全部出てるので色々やりようがあるんだが、Leonardoはそれよりも若干少なくて、ひとつのデジタル入力にボタンを1個つなぐくらいじゃ自分の作りたいHIDとしては心許ない。さらにDigisparkだと自由になるI/Oピンは2本しかない(とりあえずデフォルトでは)。(1)これの拡張について。
  • くるくる回すインターフェースが欲しいので、とりあえずロータリーエンコーダ(インクリメンタル型)を買ってきて試した。回転したこと自体はもちろん検知できるんだけど、順方向/逆方向のどちらに回ったのかをソフトで検知するのはなかなかめんどくさいのと、それからチャタリングが激しくてそれをソフトで検知しないようにするのもなかなかめんどくさい。(2)これの対策について。
  • この(1)と(2)をハードウェアで解決しようと画策している、というのが最近の活動。電子回路、特にアナログ回路っていうのは今まで全くやってこなかったので基礎から勉強の日々なんだけども、昔から「コンデンサって電気が溜まるのはわかったけど実際何に使うのよ」みたいなのはわりと興味があったのでわりと楽しくやっている。
  • (1)は、1つのアナログ入力に「ボタンと抵抗を並列につないだやつ」を直列にたくさん繋ぎ、全体の電圧の変化を見てどのボタンが押されたか検知する、という実験をしてうまくいったのだが、そんな感じのことを簡単に実現するICがあるみたいなのでそれを取り寄せ中。ちなみにキーマトリクスも検討したし実験もしたけどDigisparkではそれすらできない(2ピンのキーマトリクスは1接点である)ので却下。
  • (2)は、コンデンサとシュミットトリガインバータ(シュミットトリガっていう特殊な方法でHIGH/LOW判別をする論理NOT)でチャタリング対策、それからDフリップフロップ(NANDを2個組み合わせるだけでできる1ビット記憶回路)で回転方向の検知ができて、ソフト側は最終的に出てくる2つの入力を見ればOKという構造までもっていけるらしい。こちらも2種類のICを取り寄せ中。
  • なお、シュミットトリガNANDを2個使うだけでなんかうまいことできないのか? と思って計算とかせずにとりあえずそのICも注文してみた。届いたら試行錯誤して、不可能ならなぜできないのかを理解したいと思う
  • しかしこういう単純なロジックICって安いよね…。高くて50円とかだもんな。

テンキー+α

  • 俺がTrackpointがないと死んじゃうのと同じように、ノートPCにテンキーが標準搭載されてないと死んじゃう人ってのもいるんだろうか。すると最低でも15インチ以上ということになってしまうんだけど、そのサイズだとあんまり持ち歩く感じじゃないと思うし、普通に外付けのテンキーを買えばいいんじゃないかと思ってしまうよね。
  • いや、そういう方に不便を強いたいってわけじゃなくてw テンキーってなんか安いやつはやたら安いし、こういうやつの方がノートのキーより打ちやすいんじゃないかとか…。



  • で、テンキーボードって普通↑こういう形状じゃないですか。フルキーボードにおけるテンキーの部分だけを切り取ったような構成で、メーカによって「00」、Backspace、Tab、カンマ、イコールあたりのどれかが追加されてたりする、だいたい縦長長方形の。
  • 実はこちら方面にも新しいウェーブがありましてなあ。



  • こんなやつ。前回紹介したテンキーレスとは全く逆で、今度はテンキー側にアローキー周辺をくっつけてみましたという。
  • これはこれで便利そうな匂いがするのよね。自分はもうアローキー独立型のテンキーレス配列に適応しちゃったから必要ないんだけど、もし埋没型配列のPCを買ってしまって後悔してる人がいるならば、こういうのを繋いで本体のアローキーの機能は殺すというのも検討に値するのではないか。