Superb Garbages 2

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

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

  • 一般論として、エゴサーチは違法にすればいいと思う。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を駆動している電源と同じ電圧(通常5V)が1023、GND(通常0V)が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とか色んなものが整備されてるというかね。