Superb Garbages 2

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

最近の不満(文句ばっかりフェイズ)

  • ATtiny10について悲しかったこと、つまり発動編をずらずらと3千文字くらい書いたのですがまるっとボツにして(要するにATtiny10へプログラムを転送する治具を作らなきゃいけなくて、最初のを数日かけて作った後にもっと簡単な仕組みを知って、それでやる気なくして放置って話よ)今はPlatformIO(@Microsoft Visual Studio Code)っていう開発環境でなんか色々触ってみてますがこれ本当に便利なものなのか? 昭和生まれのおっさんとしては疑問点がとてもとても多くて疑問点だらけだ。
  • まずオートコンプリートが基本的にうざい。人が気持ちよくdelayMicrosecondsとか打とうとしてるところにしたり顔で「これですよね!!!!!!」ってウインドウが出てお節介すぎる上にその窓の下が見えなくて邪魔だし、digitalWrite(0,HIGH⋯⋯って打ったときにいったんHIGHっていうのを決定してオートコンプリートの窓を消すためになんかEnter押さなきゃいけないし、その後にもう ) が出てる割に ; は出てなくて、 ) って出てるから(そのキーを打てばいいんだけど、その方法が一瞬わからず)アローキー右をわざわざ押すためにホームポジションから手を離さなきゃいけなくて、もうめんどくさいのでオート閉じ括弧も含めてぜんぶ切った。
  • オートインデントもうざい。オートインデントほんと苦手。インデントくらい全然手間じゃないんだから自分でやるというか自分の思った通りにインデントしたいし、変な印じゃなくてタブ文字出てればそれでいいし、カーソルをアローキーで操作したときにインデントした部分をスキップするのかそれともインデントの中にカーソルが入っていくのか、BackSpaceやDelete時にインデント部分を一発で消してくれるのかそれともインデントを構成する空白文字を1個だけ消すのか、そのあたりの挙動が全く理解できないのでぜんぶ切った。
  • ワークスペースの仕組みがうざい。開くファイルはいったんワークスペース上で開かなきゃいけないが、ワークスペース上でこっちのプロジェクトを途中で放ったままあっちのプロジェクトをコンパイルして⋯⋯というのが、本当にできないのかどうかは知らんができないので(放置した方でエラーが出るとコンパイルが完了しないように見える。よくわからん)、なので開いたファイルを閉じたいときはいちいちワークスペースから削除している。複数のワークスペースを開けばいいみたいだけどそもそもワークスペースの概念自体が今の俺には不要というか⋯。
  • それになんか通知とかきてめんどくさいし、いちいちMicrosoftにログインを要求されるし、プロジェクトを作るときにBoardの選択肢がいつまでも表示されないし、それが出たとしてもFinishボタンを押したあと数十分待たされることがたびたびあるし(Please Wait...と言われて数分そのまんまなので、目を離して別のことしてたらいつの間にかプロジェクトの作成が終わってる感じ)、便利なのはincludeしたいファイルをそのまんまincludeフォルダに入れればいいだけ、というところくらいかなあ⋯。
  • 入力支援機能をことごとくオフにして、ワークスペースの概念を邪魔に感じる自分にとって、PlatformIOを使う意味はあるのでしょうか。
  • なお、プログラム転送に関する部分もきっと便利なんだろう。というかArduinoIDEの、転送オプションのひとつの項目を決定するたびにメインメニューを最初っから開いて次の項目を探しにいかなきゃいけないあの構造は毎回毎回閉口するので、あれをやらなくていいというだけでずいぶんマシなはずだ。
  • そんでとりあえずSeeeduino XIAOのプログラムをしてたんだけど、これのGPIO番号とかってどうなってんの? そもそもの仕組みが理解できないというか、ArduinoにおけるD0/A0を数値としての0番で指定したいんだけどそれはできず、ArduinoにおけるD0/A0は2番という指定をしなきゃいけなくて、それ以降の番号もバラバラ(たぶんATSAMD21*1そのもののGPIO番号なんだろうけど)。ピンの別名一覧とか対応表とかがあれば自分で配列作るなんなりするんだがネットを探しても見当たらないし、それが実際に記述されていると思われる.cpp.oファイルはバイナリだし、テストして調べようにも所々の番号でプログラムの実行が詰まったりして(起こってる現象がよくわからんが、ある番号にdigitalWriteするとそこで何秒か止まったり、ハングアップ的な挙動を示して手動でリセットあるいはUSBケーブルを挿し直すまで新たなプログラムも転送できなくなったり、Windowsのドライバがエラーを出したりする)もう嫌になってしもうた。それともこのXIAOが壊れてるのか?w
  • ま、こんなことは言わずともみなさんわかっていることと思うが、この世界はこのように悲しいことばかりなのである。

 

  • 改めて書くんだけど、オートインデントってそんなに便利か????? オートインデントを使ってる人って、オートインデントを便利だと思った瞬間が一度でもあるの?(また極端なこと言い始めたぞ)
  • 例えば、インデントされたブロックの中身をコピペして使ってるときとか、インデントを消してる最中にオートインデントが発動して発狂したりしないの?
  • しかも近年はインデントに「複数の空白文字」を使うのが主流みたいだし、それもほんとめんどくせえというか、消したと思ったら消えてなくて空白と空白の間に文字打っちゃってバラッバラになったりしてそれを直してる最中にオートインデントが発生してそれを消して⋯⋯みたいな手間がものすごく増えるんだけどふつうそんなことないの? 空白文字によるオートインデント環境でプログラムしてる時って、本気で、作業時間の半分くらいはインデントを構成する空白文字を消すことに費やしてるような気がする。Tabっていう素晴らしいものがあるのになぜ使わないんだ⋯。もしかしてTab文字というのをみんな知らないのか?w
  • オートインデントを無視してあるべき場所に閉じカッコとかを書くとインデント分の桁を下げられたりしてすげえうざいしさ。w 内部的に今オートインデント中かどうかっていう状態があるように感じるんだけど、それを知る手段も解除する手段もユーザには与えられてないじゃん。とにかくカーソルっていう自分の体とPCとの唯一の(でもないが)インターフェースを強制的に操作されるというのは、個人の尊厳や自由を侵害されているように感じてしまうのは私だけでございましょうか。そうでないにしても、そこにあるはずのものが急にそこからなくなる、あるいはそこに移動するはずのものが別のところに移動しているというのはとにかく集中力が削がれて本当に腹立たしい。どんな権限でもって他人の身体的自由を奪ってるんじゃおのれは、って思う。
  • 例えば(最近はあまり見なくなったけど)自動マウスカーソル移動も同様。OKボタンが出たからそこへ向かって自分でカーソルを動かすんだが、その裏では自動マウスカーソル移動が発動していて、それに自分の操作も加わるから気づいたときにはカーソルはボタンの上から外れてるのよ。しかも一瞬何が起こったのかわからんのでマウスカーソルを探さなきゃいけないし。何のために何をしてるんだか全く意味がわからん。
  • 最近(少なくとも15年くらいは)Pythonを触ってないけど、Python統合開発環境もオートインデント使って書くのがデフォルトなんだろうか。Pythonでオートインデントなんて想像するだに恐ろしいが⋯。*2

*1:ATSAMD21:Seeeduino XIAOが搭載しているMPU。名前から想像できる通りAtmel製だがコアはArm Cortex-M0+。

*2:Pythonはブロックをインデントで表現する。

悲しい出来事(接触編)

  • 解説シリーズのフェイズなんですがショッキングな事件がありましたので聞いてくださいよ⋯。
  • ATtiny10っていうMCUがありまして、米粒AVRって呼ばれてたりするんですが、SOT-32-6っていう表面実装6本足パッケージがほんとにめっちゃちっちゃくて、足の幅は0.3mm、足の間隔は0.65mm0.95mm(間違えた)っていう⋯⋯米粒は言い過ぎだと思うけど、他にこれくらいの大きさのものって何があるだろう。とりあえずMINTIAの粒よりは小さい。
  • まー写真撮ってみるか。きっとインパクトのある絵ヅラになると思う。
f:id:chinorin:20210902211111j:plain
右の「T10E」がATtiny10
  • 12MHzで動作する歴としたマイコンです。しかし記憶領域がプログラムメモリ1024バイト+RAM32バイトとかなり厳しく、非常に限られた用途でしか使えない感じではありますが、なぜかGPIO*1が4つしかないのにADC*2が4系統もあって⋯⋯⋯⋯えぇ? 使える足ぜんぶ使って4つの配線の電圧を計っても、それを記憶しておく領域もそんなにないし*3、どーすんだ?
  • まーとにかくこのATtiny10、用途はないかもしれないけど安い(3個で100円とか)し、記念に(?)いくつか買ってあったんですわ。SOT-23→DIP変換基板と一緒に。それでしばらく放ってありました。

 

  • でね、ようやく使い道が思いついたんですよね。おそらく、何の判断もしないでただクロックを出力し続けるとか、ただパルス波(PWM)を出力し続けるとか、そういうのに向いているはずだ。ちょうど2系統の波形を出したり止めたりする仕組みをどうしようか考えてたところで、1つのマイコンから2つ出すのがちょっとめんどくさくて躊躇してたんです。ATtiny10みたいなのがとにかく波形を出し続けてアナログスイッチかフォトカプラかなんかに出したり止めたりをやってもらえばいいのではないか。あ、いや、それくらいの単なるON/OFFならATtiny10自身でもできるか⋯。
    • あとは例えばこの前ATtiny13でやったようなロータリーエンコーダデコーダもATtiny10版を作っておくべきだなあ。ATtiny10のサイズであれば、大きめのロータリーエンコーダに貼り付けてボタン電池で動作とかも可能だと思う。問題はピン数で、必要なのが2入力2出力だからリセットを無効にすればぴったりなんだけど、それやると二度とプログラムが書けなくなる⋯⋯ということはないんだがちょっとめんどくさくなるからめんどくさいんだよなあ。他の方法だと、例えば2入力を分圧してanalogReadしてみるとか? それで速度出せるんかいなというか、それだとたぶん割り込みができねーな。出力をいじる方が現実的だろうか⋯。
  • まーそれはさておき。つーわけで意を決してATtiny10と変換基板を取り出して、自分を信じてやってやりましたさ。はんだづけを。そもそも表面実装部品というのはペーストはんだってやつをステンシル(テンプレートみたいなやつ)を使って基板上のランド*4にしっかり塗りつけ、その上にピンセットでうまいこと部品を置き、リフロー炉っていうオーブントースターみたいなのに入れて焼くのが本来のやり方なんだけど、そういう道具は何ひとつ持ってないのでここは男らしく堂々と手はんだでやってやるぜ。まさにジェンダーロールに基づいたハラスメントである。
  • もーね⋯⋯まずATtiny10そのものを基板上の定位置に置くのが一苦労なのよ。ちょっと力加減を間違えただけですぐどっか飛んでっちゃうしw そもそも肉眼じゃちゃんと位置が合ってるかどうか見えねーっていうのも問題で、サードハンドについてる拡大鏡とハンディ虫眼鏡みたいなのを併用していろんな角度から見たりして⋯⋯でもまあ、粘度の高いフラックス*5をあらかじめランド周辺に塗りたくっておくことで少し作業が楽になった感はある。
  • そんで位置が決まったら何らかの力ではさんで仮固定しておきたいんだけど、今回使ってる変換基板が厚さ0.1mmのフレキシブルみたいなやつなので、はさむ力が強すぎると基板がたわんだりして不都合がある。これは結局逆作用ピンセット(握ると開いて、離すと閉じるピンセット)で事なきを得た。⋯⋯が、これってもしかしたら、普通のユニバーサル基板を同じ大きさに切り出して、重ねて使うべきものだったのかもしれない。将来的に強度が足りるかどうかが心配ではある。
  • そうやって固定したつもりでもプルプル震える手ではんだごてを当てたらズレて、直して、またズレて直して、はんだの量多すぎて吸い取ったらズレて、とかやってたらもうこて先がボロボロになってしまった*6。まあへたくそなのですぐボロボロになってちょくちょく交換するんだけど*7、次で4本目かな? はんだごて買ったときについてきたやつがそろそろ全滅するので補充しなければならん。買うのはたぶん1本100円未満のセット品だが⋯⋯⋯⋯なんかこて先の値段もピンキリで、1万円以上するのとかもたまにあるんだが、あれってやっぱ違うのかね。細くて取り回しやすいのに熱容量がアホみたいにでかくて、どの部分にはんだをあてても素直に溶けて素直に濡れる、夢のようなこて先だったりするんだろうか。
  • そんなのもまあいい。できたので、とにかくなんか書いてみるテストをしよう。AVRというのはふつう、SPIという方式でプログラムを転送する。詳細は省くがとにかく転送用のプログラムを書き込んでArduino as ISPにしたArduino UNOの13番SCK*8、12番MISO*9、11番MOSI*10、10番/SS*11から線を引き出して⋯
    f:id:chinorin:20210905035040j:plain
    (すんません無断転載です。原本は画像左下URLの方でどうぞ)
  • それをそのまんま受け側のSCK、MISO、MOSI、/RESETに⋯⋯
    f:id:chinorin:20210905035702p:plain
    (すんません無断転載です。原本は画像右下URLの方でどうぞ)
  • ATtiny10にそんなものはねえぞ⋯。
  • 超長くなったのでつづく!(つづくのか⋯)

*1:GPIO: 普通にINPUTとOUTPUTができる足のこと。ATtiny10は6本足で、そのうちの1本はVcc(電源)で、1本はGNDで、残りがぜんぶGPIO。

*2:ADC: Analog to Digital Converter:HIGHとかLOWとかじゃなくて、電圧を数値として取得するやつ。ATtiny10のADCは8ビットだそうなので、0~255か。狭いな⋯。

*3:32バイトということは、int型の変数を4つ定義したらそれで満杯。

*4:ランド:はんだづけをするための露出した金属面。

*5:フラックス:はんだづけに必要な薬品。これがないとはんだが溶けなかったりとか色々な役割がある重要なもの。はんだの中に練り込まれているのが普通だが、へたくそにとってはそれだけでは足りないのでどんどん注ぎ足して使う。

*6:こて先を長い時間高温にしておくと酸化して黒くなり、不均等にかさが減って痩せてきて、そうなると復活剤みたいなのを使って修復しないとはんだを当てても溶けないというただ熱いだけの棒になる。これをこて先の「食われ」と言うらしい。

*7:本来は部品やランドの形状によってこて先を使い分けるんだそうだが、そのたびにこて先を交換してまた暖め直すのとか面倒すぎてやってられんわ。そのあたりもへたくそたる所以であろう。

*8:SCK: Serial ClocK

*9:MISO: Master In Slave Out

*10:MOSI: Master Out Slave In

*11:/SS: (負論理)Slave Selectなんだけど、これは受け側の負論理RESETに入れればOK。

あちゃんでいいのがほんとにいいの

  • Arduino互換機「あちゃんでいいの」とArduino UNOを賞賛する記事を書いたのですが前半の文章が一部なぜか消えているのに気づいてなんとなく非公開にしましたがまあ別に置いといても構わんか。なんか気が向いたら壊れた箇所をもう一度書きます。悲しい⋯。

 

  • ちょっとATtiny13Aとか85(どっちもDIP-8)とかではピンが全然足りない感じのことをやっていて、ATtiny44(DIP-14/秋月で110円)とかATtiny2313(DIP-20/秋月で190円)あたりを視野に入れつつ、とりあえずArduino UNOの思想に敬意を表して、「プログラムとテストを終えたATmega328P(DIP-28/aitendoで230円)をArduinoから外して単体で実装する」ってのもやってみないとなーと思ったわけなんですよ。
  • [ここからが消えてた箇所。ATmega328PなArduinoの変わった互換機をいくつか検討したが、安いからという理由のみで「あちゃんでいいの」にした。本家のArduino UNOを買ってやれと思うがあれは高くて⋯。]
  • [「あちゃんでいいの」はこれはこれでよくできてる。5ピンのUSBシリアルを持ってるなら一番おすすめの互換機かもしれない。]特筆したい点はこれだけと言っても過言ではないが、とにかくスリム。細い系マイコンボードの標準的な幅が600mil(0.6インチ)のところ、あちゃんでいいのは500mil。これはほんとに最小限の数字でありまして、DIP版ATmega328Pをはじめとする「細い方のIC」が300mil幅で、そこから左右にブレッドボードの穴1個分ずつ広げただけなのよ。
  • そんでこのサイズなのにちゃんとリセットボタンと2つの角型LEDがのっかって、Arduinoとして必要な受動素子*1や16MHz*2のクリスタルは裏面に実装する。ピッチはぜんぶ2.54mm(100mil:0.1インチ)だから普段のユニバーサル基板とかと同じなんだけど、部品が詰まってたり表裏別のものをつけたりするのでちゃんと順番を考えてはんだづけしないといけないっつーのは一応要注意。
  • いやー、500milの何がいいかって、ブレッドボードにセンター合わせで刺せることなのですわ。片側5穴のボードだと左右それぞれ3穴使える。600milのは、何かしようと思ったときまず最初に右寄りに刺すか(使える穴が左3右2)左寄りに刺すか(同じく左2右3)で毎回2時間くらいは悩むからね。*3

 

  • Arduino UNOの元々の思想は本当によくできていると思う。Arduinoが出現する前はマイコンというのはきっともっと特殊なもので、PCに直接繋げて制御するなんてことは当然できず高価なROMライタを買う必要があったり、コンパイラはフリー版があっても機能が制限されてたりするのでちゃんとやりたい場合は高価なコンパイラを買う必要があったりした。そしてマイコンボードは試作や実験や評価に使うものなので、実装するときは実装用のチップ(MCU)を新たに用意しなければならず、それにプログラムを書き込む手間も当然ある。
  • まとめると、
     1. PCとの接続がめんどくさい問題
     2. コンパイラがめんどくさい問題
     3. 実装のために新しいチップを買ってこなきゃ問題

    Arduino UNOは、この3つの問題に対して明確な回答を用意したボードなのであった。
  1. Arduino UNOのメインMCUといえばATmega328Pだが、それと同じくらい優秀なMCUがもう1枚実装されているのをご存じだろうか。その名はATmega16U2。*4 こいつは基本的にUSBインターフェースとしての役割しかしない。こいつが載ってるからArduino UNOはUSBでPCに直接繋げることができるってわけ。
    • ちなみにファームウェアアップデートのためなのか、ATmega16U2のプログラムを書き換えるための仕組みもUNOのボード上にちゃんと存在する*5。それを使ってATmega16U2を普通のマイコンとして扱うことも可能らしいが、ちゃんとやらないとボード全体のUSB接続機能が喪失するので、まあそのへんは単なるおまけって感じ。
  2. Arduinoの開発統合環境Arduino IDEは無料で配布されており、C/C++⋯⋯じゃなかったArduino言語のコンパイラも全機能が無料で使える。まあこのへんは時代の流れを見るに当然とも言える展開かもしれない。
  3. 通常仕様*6Arduino UNOに搭載されているATmega328PはDIP版、すなわち古来より伝わる「ふつうのIC」と同じ形をしている。こいつはそもそも基板に直接はんだ付けするということをあまりしないパッケージなのだがUNOもその例に漏れず、基板にはICソケットがはんだ付けされていて、ATmega328Pはそこに刺さっているだけ。つまりこれを取り外して別の場所に単体で実装することができる。
    • もちろんATmega328Pを取り外したUNOは何の役にも立たないただの板になってしまい*7、また新たにDIP版のATmega328Pを買ってこなければ再利用することはできないのだが、それはまた用事のあるときに買ってこればよいのであって実装においての邪魔になることではないし、なにより⋯⋯例えばUNO以外のボードとか、UNOの表面実装版だと、そもそもチップを取り外すことすらできない上、チップ単体にプログラムを書き込むにもそれなりの工夫あるいは道具がいる。
    • ただねえ⋯⋯Arduino状態のATmega328Pを単体で動かすには16MHz(あるいは3.3Vで動かすなら8MHz)の外付け水晶振動子が必要で、それを簡単に内部クロックモードに移行させるような仕組みがArduinoIDEにあればよかったのにな、とは思う。そのへんを変更するにはフューズビットとか、そういうArduinoっぽくない部分を自分で触らなきゃいけないんだよね。あ、いや、ブートローダかも。まだやってないからよく知らない。
    • でもまあ、16MHzの水晶振動子なんてすんげえ安く売ってるし、内部クロックにすると動作周波数自体が遅くなる(8MHz)のでArduinoとしては推奨しないのかもしれないけど。
  • 水晶だけに。

*1:抵抗器とコンデンサ。それぞれ表面実装

*2:あるいは3.3Vで使うなら8MHz

*3:しかもどうせ足りなくなってボードで隠れてる穴からも配線しなきゃいけなくなったりするので左右どちら寄りに刺しても同じ。でも悩む。

*4:古いArduino(R2以前)はATmega8U2だったらしい。さらにそれより古いArduino DiecimilaやArduino Duemilanove等ではAVRではなくUSBシリアルICを載っけてたようだ

*5:USBの後ろにあるICSP(2x3のピンヘッダ)がそれ。

*6:表面実装(TQFP-32)のATmega328Pがボードに直接はんだ付けされているArduino UNO SMDというバージョンもある。意味ねぇ~って思うけど、まあきっとあの部分の容積を稼ぐことでシールドの裏側に何か実装したいとか、そういう理由があるのだろう⋯

*7:それでも上記の通り、ATmega16U2が残ってはいるが。w

電子回路の基礎の基礎①:回路図の基礎

  • 電子回路&マイコン解説シリーズ(そんなやつだったの?)なんですけど、予定を変更してなんか電子回路の基礎の基礎とかを説明してみようかと思いました。厳密な正しさとかは置いといて、全然わかんない人が見て、電気と回路とマイコンのことがなんとなくあるいはざっくりあるいはほんのりわかった気分になれればいいかなくらいの。
  • でも主目的は、何も知らない人でも理解できそうな感じに書くことによって、この界隈について自分の理解をより深めることです。
  • 適当に回路図からやろうか。以前からぜんぶそうなんだけど、このブログに掲載している回路図とかはScheme-itというオンラインツールのスクリーンショットから切り出してます。
  • 「電子回路」と呼べる最低限のものが↓これです。
    f:id:chinorin:20210816212648p:plain:w300
  • 左の図は、中学校の技術の授業とかで一応誰もがやったんじゃないかな?(今のカリキュラムは知らんけど)回路左側にある「ニ」を上下逆にしたようなやつが電源(電池)で、長い線で書かれてるプラス極から電気が出て、回路右側にある抵抗を通って電源のマイナス極に戻っていきます。電気は必ずプラス極から出てマイナス極に戻ります。プラスとマイナスの両方を電源に繋がない限り、電気が出てくることはありません。
  • 右の図は、まあだいたい左の図と同じ意味のものです。上のVccってところから電気が出てきて、抵抗を通って、下のGNDってところに吸い込まれて消える⋯⋯とみせかけてGNDは電源のマイナス極に繋ぐことになっているので、この右の図の通りの回路を実際に作ると、見た目的には左の図に似たような感じになるでしょう。つまりこれは電源周辺と横線を省略してスッキリ書くというやり方です。あるいは↓こんな考え方でもいいです。
    f:id:chinorin:20210817054625p:plain
    もちろん電池を実際に切断したわけではなく、電池のへそ(?)にこうやって両手の親指をつっこんで内側と外側をひっくり返すと、黒い線の部分が表すのは現実世界の全てで、それ以外の白い部分はぜんぶ電池の内側という想像です。ほら余計わかんなくなった。
  • このように回路図は、だいたい左とか上とかに電源があって、そこから出てきた電気はだいたい右の方とか下の方とかに行って、左下から電源のマイナス極に繋がったり、下の方に消えていく、という形にします。めっちゃ複雑な回路だとこの限りではない(このように書いた方がわかりにくい場合がある)んですが、基本的にはそういうお約束になっています。
  • ちなみに同じ意味の記号でも色々あったりするので、一応なんとなく例示しときます。
    f:id:chinorin:20210816214447p:plain:w250
  • まー図面の上の方に書いてあって横線から下に線が出てればだいたい電源(+)です。aaとかddとかはなんか習慣によるものなのでとりあえず違いは認識しなくていいみたいです。5Vっていうのはそのまんま「この電源は5V」って言ってます。1つの回路図に複数の電源が書かれていることもあり、特に指定がなければぜんぶまとめて電源のプラスにくっつけます。
    • ひとつの回路図に「+電源」と「-電源」の両方(と、それとは別にGND)があるという「両電源」「正負電源」(同じ意味です)と呼ばれるものもあります。例えば音(オーディオ)を扱うとよく出てくるやつで、真ん中に線があって波形がその上下に出てるあれを実現する回路なんですが、応用的なので今はこれ以上説明しません。
  • 真ん中のは抵抗の記号のバリエーション。いま大人の人は左のやつになじみがあると思います。しかしヨーロッパ方面とかで普及してるのは右のやつだそうで、実はJIS規格でも20年くらい前から右のが正しいことになってます。これらの記号のそばに単位のない数字が書いてあったらそのまんまΩ(オーム:抵抗値)です。
  • 下の方にあって横線に上から縦線がくっついてて、その下が逆三角とか斜線とかごにょごにょっとしてればだいたいGNDです。厳密には一番左が大地アースと言って地球の地面にくっつける端子、その右がシャーシグランドと言って機械のシャーシ(金属製の外装)にくっつける(どちらも、それによって巡り巡って電源のマイナス極に繋がる)端子なのですが、普段はあんまり区別しません。GNDは、1つの回路図に複数書かれている場合が(電源に比べたら非常に)多いです。実際に回路を組むときはぜんぶまとめて電源のマイナスにくっつけます。
  • まとめ。
    f:id:chinorin:20210817065702p:plain
    文脈とかの関係でどうしても①のようにするのがわかりやすい場合とかはそこまでお約束にこだわる必要はありません。まーどんな図でも接続さえ正しけりゃ再現できますしね。④はちょっとびっくりすると思いますがこれも正しいです。
  • えー、まだこんだけしか説明してないのにこんな分量になっちゃうのか⋯。しかもまだ全然面白くないところだし。なんなんだこの文章。

 

  • 豆知識としてもう一点。上では「プラス極から電気が出てくる」という表現をしていますが、実際の物理的な現象としてはまったく逆で、マイナス極から電子というものすごく小さな粒子が出てきます*1。その時点で草しか生えないんですが⋯⋯電子ってのはマイナスの電荷を持っており、マイナス電荷ってのはマイナス極とは反発し、プラス極に引きつけられるという性質があるので、電子は通りやすそうな道(つまり導体:電気の流れやすい物質)を通ってプラス極の方へ移動しようとします。
  • しかし電子は、移動先に空席みたいなのがないと移動できません。なので、もともとそこにいた別の電子をどかして、その席に座ります*2どかされた電子がどうなるかというと、そいつもプラス極の方へ移動しようとして、その先にいる電子をどかして、その席に座ります。この連鎖的な現象は、見方によってはあたかもプラスの電荷を持つ「電気」という仮想的な物質がプラスからマイナスの方へ移動しているかのようにも見えなくもないです*3
  • ⋯というか昔の人にはそう見えたらしく、これらの現象を「電気」っていうよくわかんないビリビリするやつがプラス極から出てきてマイナス極方向へ流れると定義しました。ずいぶん後になって実際に何が起こっているかが判明しましたが、その頃にはもう修正が不可能なほど「電気」の定義が定着してしまっていたということです。様々な理論がその定義を前提として組み立てられており、そこを直すとぜんぶ逆にしなきゃいけなくなって超めんどくさい。なのでそれから今に至るまでずっと、「電気が流れる」方向と電子が移動する方向は逆という気持ち悪い感じになってます。
  • そのような電子の移動がスムーズにいけば何事もないのですが、何らかの理由で抵抗が生じ、電子の動きが遅くなる場合があります。例えば道が狭いと前が詰まって移動しにくくなりますが、後ろにいる電子も移動したがっているため、後ろから押されて前にも進めず、その場でエネルギーが停滞し、余ってしまいます。その余ったエネルギーは居所がなく、熱に変わってしまうなど様々な仕事をします。これが電気の正体です。

*1:電気って意外と化学的な現象なので、波動ではなく粒子とみなした方がわかりやすいと思います。

*2:電子は物質のあるところならどこにでもあります。中性子と陽子のカタマリが原子核で、その周りを電子が回っているという図を思い出してください。そこに新たな電子がやってきたとき、前にいた電子が飛び出しやすい物質を導体、安定しまくっていてびくともしない物質を絶縁体、その中間くらいのやつを半導体と呼びます。

*3:「空席」はその場においては相対的にプラスの電荷があるように見える。その後ろ(マイナス極方向)にいたマイナス電荷の電子がその空席にスポッとはまると、(マイナス極方向に)また新たな空席ができる。この連鎖があたかも「プラスの電荷が、マイナス極方向に動いている」ように見えるということ。

可変抵抗についての解答、そんできっと些末な問題

f:id:chinorin:20210808012106p:plain:w200

  • まず分圧とか思うから話がややこしくなる。例えば10kΩの可変抵抗で、接点がちょうど半分のところにあるのだとしたら、つまりそこに5kΩの固定抵抗があるのと(ほとんど)等価だ。なぜなら、5kΩの抵抗と0Ωの抵抗を並列に繋ぐと、そもそも分流すらせずに全ての電気は0Ωの経路を通るからだ。(導線にも抵抗があるので実際はそうはならないが、誤差範囲と考えてよい)
  • そう考えるとわかりやすいね、これ。
  • いやしかしだ、
    f:id:chinorin:20210815040941p:plain:w200
    直接こんなことやっちゃっていいもんなのかね。でもなんかこえーよなあこれ。
    f:id:chinorin:20210815041027p:plain:w200
    するとこうかね。あるいは⋯
    f:id:chinorin:20210815041044p:plain:w200
    これはいくらなんでもキモいんだが。w
  • まーやっぱり真ん中のやつが一番自然だと思うんだけど、でもこうするんなら結局、PORTを可変接点に直接繋いでもそんなに変わらんような気が。

「HSP」と可変抵抗

  • 先日このブログのカテゴリを整理しようと思ったら、HSPっていうのが既にあったんだよね。わたくし明確にHighly Sensitive Personなので、その話をしたときに作ったのかなあ⋯⋯と思って見てみたらやっぱりHot Soup Processorだった。
  • 今やHSPぐぐるとひっかかるのはHighly Sensitive Personばかり。Hot Soup Processorが不憫でなりませんな。Hot Soup Processorも楽しいのよBASICに似てて。構文が優しいので初心者にもオススメみたいなところがあると思うんだけど、しかし何だ。そういうのもすっかりScratchとかにもっていかれた感があるよなあ。
  • ところで教育用プログラム言語と言えばPascalだと思うんですけど! なんか非常にマニアックなものになってしまったねえ。前からか。w ちなみにDelphiってちゃんとまだ開発されてて、最新バージョンは無料版と一番安い有料版*1の差がものすごいことになってて笑えたりとか、マイコン用のPascalコンパイラもあるんだけどこれも高かったり、AVR用のFree PascalとかもあるにはあるがAtmel Studio*2対応とか書いてあってどうしたもんやら。Pascalってコンパイル速くていいのになあ。
  • でもまあいいさ。Arduino言語にはbeginとendはないけれど、Cと違ってTrueとFalseがあるのでな!!!!!*3


  • やっと気づいたんだけど、普段やってる↓これ、よくないよな⋯。
    f:id:chinorin:20210806233933p:plain:w200
    せめて↓こうするべきだし、
    f:id:chinorin:20210806233936p:plain:w200
    もっと言うなら↓これくらいやっても罰は当たらんだろう。f:id:chinorin:20210806233949p:plain:w200
    コンデンサはついでだが。可変抵抗って「こすれ」でノイズ出てるよね。
  • R3があればR2はいらんのか? でも可変抵抗って、回転するやつは大丈夫そうだけどスライドするやつだと抵抗体とスライダーの接触がよくない個体がたまにあって、仮に浮いたりしたらポートがオープンに⋯⋯って、そもそも可変抵抗の値をそのまま読んでるってことはアナログ入力だろうから別に問題ないのか? いやいやもしかしたらデジタル入力でヒステリシスの実験をしてるのかもしれんぞ。w
  • っていうか、R3があるとこのPortで検知できる電圧が(10ビットADCの場合)0~1023の範囲からかなり狭まる気がするんだが、そういうもんでもないのか? っていうか、いつでもどんな値の可変抵抗を使っても、検知できる範囲がなぜか0~1023になってる気がするんだが、それはいくらなんでも気のせいだよな⋯?
  • そもそも俺はたぶん可変抵抗の使い方がよくわかっとらんぞ。例えば、
    ↓これはどんなときに使って、結局何を検知してるんだ?
    f:id:chinorin:20210808012106p:plain:w200
  • 等価回路を考えるに、単純に分圧するはずだから⋯⋯結局ここにINPUTを直結するなら、マイコン内でGNDに繋がってる以上、上のやり方と同じことになるような⋯⋯ってあーそうか、こうすると分流直後に合流だから、電流値が変化しないのね。なるほど。
  • 電圧については、まず分圧するのは間違いないんだが、それから抵抗のある線とない線に分岐して、並列の合成抵抗は逆数の和が逆数だから⋯⋯ゼロの逆数ってなんだっけ? 計算してみよう!(その後私の姿を見た者はいない⋯)
  • なんかね、この前Digisparkが相次いで壊れたのとか、よく電源をとってるUSBハブについてWindows10からサージ警告が出たりするの、可変抵抗の使い方が間違ってるせいなんじゃないかと思えてきたのです。可変抵抗を安全に運用しつつ、それで戻り値の範囲が狭すぎるなら analogReference() でなんとかできるようにしたいのだが⋯。

*1:確か20万くらいだった。

*2:Atmel Studio:AVRとかのネイティブな開発環境。Atmelがもうないので当然Atmel Studioももう存在せず、今はMicrochip Studioって名前になっててなかなか寂しげなものがある。

*3:当然constで書かれてるだけである。

マイコンで物理的に何ができるのか

  • 一般論として、エゴサーチは違法にすればいいと思う。w

 

  • ちゅーわけで。最近は無線機能(Wi-FiとかBluetoothとか)を内蔵しているマイコンがちょこちょこあって、そういうのを含めると話が複雑になるのでいったん置いとくとして、無線機能のない従来のマイコンをプログラムすることで物理的に何ができるのかまとめ。
  1. コンピュータなので、「計算」ができます。
  2. それから計算結果などの数値を「記憶」することができます。文字などを記憶するときは数値に置き換えて記憶します。記憶を取り出して、それを使って計算を行い、結果を記憶しておくという複合技ができます。
  3. マイコンに生えている足は全て電極になってまして、それらを使うことで「入力」ができます。
    • 指定した足にかかってる電圧がけっこう大きい(HIGH)か、それほど大きくないか(LOW)を検知します。これをINPUTと言います。
    • INPUTの亜種で、ADC*1という機能が使える場合は、指定した足にかかっている電圧の大きさを検知し、それをある範囲の相対的な整数値に置き換えて取得することができます。*2
  4. 同じく、足を使って「出力」ができます。
    • 指定した足に、大きめの電圧をかける(HIGH)か、電圧をかけない(LOW)かのどちらかをします。これをOUTPUTと言います。
    • OUTPUTの亜種で、PWM*3という機能が使える場合は、指定した足に大きな電圧*4をかけ、そのON/OFFを高速で切り替えることで擬似的に任意の電圧に見せかけるようなパルスを発生させることができます。*5
    • OUTPUTの亜種で、DAC*6という機能が使える場合は、指定した足に任意の電圧をかけることができます。旧来のAVR*7はたいていこの機能を持っていないので自分はまだ使ったことないです。
  • マイコンが物理的にできることは以上です*8。こうして全部挙げてみると種類も少ないし無力っぽくてなかなか絶望的な感じもするんですが、まー集積回路って所詮はこういうものなんですね。
  • ただ、これらの動作をとても高速にこなします。1秒間に数十万回とか数百万回とかのレベルで。16MHzで動作しているArduino UNOでも、普通にプログラムして1秒間に15万回くらい、効率的にやると1秒間に250万回くらい、足の(OUTPUT時の)HIGH/LOWを切り替えられるらしいです。
  • PCとの違いはやはりこの、チップに生えてる足のHIGH/LOWを直接制御することだと思います*9。ご存じの通りコンピュータは2進数で動いておりまして、お察しのいい方はもうお気づきでしょう。HIGHは1(真)、LOWは0(偽)に対応していて、それをプログラム言語でそのまんま扱うわけです。変数に代入 a=HIGH; とか普通にやります。その場合 !a(not a) はもちろん LOW です。
  • ソフトウェアのみ⋯⋯例えばPCでのプログラムをすることは、何か仮想的な電脳空間の内部のみを扱っているような感覚なのですが、それに比べてマイコンや電子回路をやっていると現実の物理現象を操作しているという実感があります。
  • マイコンは誰かが設計したものだけど、電圧や抵抗、静電容量や高周波ノイズ、クリスタルが発するクロックなどなど、マイコンを使うことによって操作したりまた影響を受けたりするものは、当然ながら誰かが作ったものではない(と思われる)この世界の法則に従います。この感覚は今までやっていた「創作」とはなんか違って、例えば釣りとか狩りとかに似ているものなのかもしれないなあとなんとなく思うことがありますね。

 

  • 次回は少ない足で色んなものを操作するための小技に関わるロジックICをいくつか紹介してみたい。

*1:Analog to Digital Converter

*2:例えばArduino UNOのADCは10ビットなので0~1023の範囲となる。デフォルトの設定だと、現在UNOを駆動している電源と同じ電圧が1023、GNDが0って感じ。

*3:Pulse Width Modulation

*4:HIGHと同じ電圧です。Arduino UNOなら普通は5V

*5:ローパスフィルタと言って、パルスの経路に容量が少なめのコンデンサ等を配置し、「ならす」ことによって実際に低い電圧にすることもできます。

*6:Digital to Analog Converter

*7:一応何度も説明するけど、Atmel社(現Microchip社)のマイコンのブランド。ATなんちゃらっていう型番のやつ。Arduinoに載ってるのはだいたいこれ。

*8:このほか、INPUTでもOUTPUTでもない、指定した足を「ハイインピーダンス」という状態にするというのも一応できますが、それってつまり「何もしない」ということなので省きます。

*9:PCでもやろうと思えばできると思うけど、それをやらなくて済むようにOSとかAPIとか色んなものが整備されてるというかね。