マイコンの基礎

マイコンとは

「マイコン」とはマイクロコントローラ (Microcontroller) やマイクロコンピュータ (Microcomputer) の略の和製英語で, 特定の機能に特化して小型化したコンピュータであり, 計算よりも制御用途として広く用いられている.

現在では, CPU, メモリ(ROM,RAM), I/O コントローラなど, 必要な部品を一つ のパッケージに集積した「ワンボードマイコン」が主流であり,自動車やエア コンなどの家電製品, あるいは玩具などに組み込まれ, 製品の動作を制御する ために用いられる.

マイコン上で動作する制御用プログラムは, 用途に合わせて作成したものを マイコンの ROM などに書き込んで動作させている. そのためマイコンプログラミングにおいては, パソコン上でプログラムを開発し, それをコンパイルした結果のバイナリを ROM に書き込むことになる.

プログラミング言語

現在, マイコンのプログラミングにおいては, C 言語の利用が主流である (Arduino も広義では C 言語). ごく一部で Java, C++, Python (micropython),Ruby (mruby, mruby/c) などの高級言語が使われている. C 言語と高級言語の一般的な特徴は以下の通りであるが, マイコンは CPU の計算能力, メモリ容量, 電力, 価格といったリソースが 限られているために C 言語が使われることが多い.マイコンメーカの提供する SDK (Software Development Kit,プログラム開発環境) は基本的に C 言語である.

  • C 言語
    • 実行速度が早い. 極限までの高速化もしくは時間厳密性が狙える.
    • 実行時に使うリソースが少ない.
    • コンピュータの都合に沿ったプログラムを強いられ, 開発生産性が悪い.
  • 高級言語
    • 実行速度が遅い. 一方で高速に開発できる.
    • 実行時に使うリソースが多い
    • コンピュータの都合により必要な雑多な処理は言語側が面倒を見てくれる.
    • 表現力が高い (柔軟な記述, 可読性の高さ)

複雑な機能を短期間で開発という場合には C 言語では限界があり, 高級言語が利用されるケースが増えてきている. あらゆるシステムを 1 つのプログラミング言語で作らねばならないことはなく, 様々なプログラミング言語が適材適所で使われている.

ESP 32 マイコン

ESP 32 マイコンは, 近年, 「電子工作」の分野で非常によく使われるマイコンである. 上海に拠点を置く Espressif System 社が 2016 年に開発したマイコンである. 2020年頃の雑誌などでは,ESP32 マイコンは,ラズベリーパイ,Arduino に続く「第 3 の定番」という言い方がされていた. 最近は,ラズベリーパイ pico も人気が高い.

ESP32 マイコンは Arduino やラズベリーパイと同様に,

  • 小型.
  • I2C や SPI などの標準的なマイコン機能が使える.
  • オープンソースでソフトウェアが提供されている.
  • 性能の割に高性能・低価格.

といった特徴がある. これらに加えて ESP32 マイコンは,低価格でありながら,

  • Wi-Fi と Bluetooth が同時に使える
    • IoT センサとして簡単に使える
  • 低消費電力モード対応
    • メインコアが停止していてもタイマや外部割り込みで自ら起動して専用メモリ内のプログラムを実行可能
  • リアルタイム OS 対応
    • freeRTOS が動作. マルチタスクプログラムの開発も比較的容易.
  • デュアルコアの高性能な CPU を備える.

といった特徴を持っている.この特徴ゆえに,

  • Wi-Fi でネットワーク接続することを考えると, Arduino に Wi-Fi モジュールを接続するよりも ESP32 を使う方が簡単である.
  • 電源の取れない屋外などでの利用においては, ラズベリーパイよりも省電力であり, かつ電池で長時間稼働させることが可能な ESP32 の方が有利である.

であり, ESP32 は IoT の流れにうまく合致したマイコンと言うことができる.

ピンアウト

ESP32 の各ピンは複数の役割を持っていることを理解しておく必要がある. プログラムの初期化プロセスにおいて,どのピンをどの機能として利用するか宣言せねばならない.

また, 内部 FLASH につながっているために使えないピンがあることにも気をつける必要がある.

  • 赤色のピン (SD2, SD3, CMD, CLK, SD0, SD1) は内部 FLASH との接続に使用されているため利用できない.
  • 青色のピン (SENSOR_VP, SENSOR_VN, IO34, IO35) は入力専用
  • 緑字のピン (IO12,IO15, IO2, IO0, IO5) は起動に関係があるため, プルアップまたはプルダウンされている事がある.


ESP32 のピン配置. <URL:https://ht-deko.com/arduino/pic/esp-wroom-32_pinout_01.png> より.

マイコン実習ボード

実験で用いるマイコンボードのピンアウトは以下の通りである.


パーツPin など
LED左からGPIO13, 12, 14, 27, 26, 25, 33, 32
スイッチ左からGPIO34, 35, 18, 19
サーミスタ温度計GPIO39 (ADC1_CH3)
圧電ブザーGPIO15
GPS (GYSFDMAXB)GPIO16 (TX), GPIO17 (RX) (電源 GPIO5)
LCD (AQM0802A-RN-GBW)I2C (SDA: GPIO21, SCL: GPIO22, アドレス: 0x3E)
RTC (RC-8035SA)I2C (SDA: GPIO21, SCL: GPIO22, アドレス: 0x32) (電源 GPIO4)
SD cardSPI (MOSI: GPIO23, MISO: GPIO19, SCK: GPIO18, CS: GPIO2)
SHT75COM1: GPIO25,26, COM2: GPIO32,33 [LED と共有]

マイコンの周辺機能.

マイコンの主要な周辺機能として以下が挙げられる. センサなどをつなげたりするためにはシリアル通信が利用される.

  • 汎用入出力 (GPIO, General Purpose Input/Output):
    • 入出力ポート. ピンポートに接続された信号線を 1 または 0 の数値にセットして制御する.
  • パルス幅変調 (PWM, Pulse Width Modulation):  
    • パルス幅を変えることで出力される電力電圧を制御する. LED の明るさを変化させたり, ヒーターやモーターを制御することができる.
  • A/D コンバータ:
    • アナログ (Analog) の入力信号をデジタル (Digital) の値に変換する
  • D/A コンバータ:
    • デジタル (Digital) の値をアナログ (Analog) の出力信号に変換
  • シリアル通信:
    • 1 つの伝送路を使い, デジタルデータを 1 ビットずつ順次伝送する通信方式. マイコンに接続されたデバイスと通信するために使われる.
  • その他

汎用入出力 (GPIO)

電気回路をマイコンに置き換えた時のイメージを以下に示す.

出力で使う場合のイメージ

入力で使う場合のイメージ
  • スイッチの状態を取得する場合は,PULL_UP回路(電源→抵抗(10kΩ程度 )→スイッチの手前)が必須.
  • マイコンのGPIOピンによってはPULL_UP抵抗を内蔵するものがあるので,その際はPULL_UP回路は不要.

注意) GPIOのピンによって PULL_UP 抵抗を内蔵するものとそうでないものがある. 上記の図は PULL_UP 抵抗を内蔵しないピンを使う場合を想定して,マイコンの外部に PULL_UP 回路を付した形としている. PULL_UP 抵抗内蔵のピンを使う場合であれば,マイコンの内に抵抗が存在するような回路図となる. なお,PULL_UP 抵抗の大きさは接続する回路によっても変える必要があるため,内蔵の抵抗値では不足する場合もある. 内蔵する抵抗は数kΩの場合が多く、接続する回路によっては大きさが足りない場合もある.

パルス幅変調 (PWM)

パルス幅を変えることで出力される電力電圧を制御する. 周期 [s] の逆数が周波数 [Hz] であり, パルス幅と周期の比をデューティー比と言う.

デューティー比を変化させることで, 実効電圧を変化させることができる.

圧電スピーカーから音を出す場合は, 特定の周波数の波 (矩形波) を作れば良い. デューティー比を 50% で固定し, 出力したい音に合わせた周波数を設定することになる.

ESP-IDF では,デューティー比はパーセントで与えるのではなく, タイマーの分解能 (1 周期を何ビットで表現するか) を決め, その分解能に合わせた数字で指定する.例えば, タイマーの解像度を 8 bit とすると,1 周期は 2 の 8 乗の 256 として 表現されることになり,デューティ比 50 % は 256 * 0.5 = 128 という数字となる.

A/D コンバータ

アナログセンサの出力電力はアナログ値 (連続値) であるのに対して, マイコンが扱えるのはデジタル値 (離散値) である.プログラム処理するためには アナログ値からデジタル値に変換する必要があり,この機能を提供するのが A/D コンバータである.

アナログ値からデジタル値に変換する場合には,分解能を指定する必要がある. 以下の図のように分解能を 2 bit にすると,2 の 2 乗の 4 階調でアナログ値が 表現される.分解能を高くすれば,計算リソースが余計に使われるが, デジタル値とアナログ値の誤差は小さくなる.

シリアル通信

シリアル通信は 1 つの伝送路を使い, デジタルデータを 1 ビットずつ順次伝送する通信方式である. 伝送路が 1 つなので低コストで済むが伝送速度は遅い.

⇔ パラレル通信. 複数の伝送路を使って一度に複数のデータを送信する通信方式. 伝送路が複数になるために高コストだが伝送速度は速い.

以下にマイコンでよく使われる代表的なシリアル通信の規格を挙げる.

I2C (Inter-Integrated Circuit)

フィリップス社が提唱した周辺デバイスとのシリアル通信の方式.

  • マスタ側とスレーブ側を分け, マスタ側が全ての制御を行う.
  • 2 本の信号線から構成される.
    • SDA : シリアルデータ入出力
    • SCL : シリアルクロック信号 (送信側と受信側の同期に利用)
  • 信号線にはプルアップ抵抗が必要.
    • プルアップ抵抗の説明は例えばここを参照
  • スレーブの識別にはアドレスを使う.
  • 多数のデバイスを接続する場合にも信号線が 2 本で済む (GPIO ピンを節約できる)
  • 1 バイト転送毎に受信側から ACK 信号を返送し, 互いに確認を取りながらデータ転送を行う.
  • 通信速度は遅い (標準モードで 0~100 kbps)
  • 同じ基板内など, 近距離で直結したデバイスでシリアル通信を行うために使われることが多い.

SPI (Serial Peripheral Interface)

モトローラ社が提唱した周辺デバイスとのシリアル通信の方式.

  • I2C と同様に, マスタ側とスレーブ側を分け, マスタ側が全ての制御を行う.
  • 4 本の信号線から構成される. I2C と異なりデータ入力と出力は別の信号線を用いる.
    • SDI (MOSI): シリアルデータ入力
    • SDO (MISO): シリアルデータ出力
    • SCK (SCLK): シリアルクロック信号
    • SS: スレーブセレクト. スレーブが複数存在する場合には, SS1, SS2, SS3,... というように別々の信号線が必要となる.
  • 信号線にはプルアップ抵抗が必要.
    • プルアップ抵抗の説明は例えばここを参照
  • 通信速度は I2C よりも速い (1~2Mbps).
  • 同じ基板内など, 近距離で直結したデバイスでシリアル通信を行うために使われることが多い.
    • 通信速度が必要な SD カードドライブは SPI 接続することが多い.

UART (Universal Asynchronous Reciever/Transmitter) (RS-232-C)

非同期のシリアル通信. 非同期のためにクロック用のラインは存在しない.

  • 2 本の信号線で構成される (全二重通信)
    • TX: データ出力
    • RX: データ入力
  • クロック同期式と比べて伝送速度は低速 (最大 20 kbps)
  • UART にはクロック信号がないため, 通信をする前に送受信するデバイス間で通信速度 (ボーレート) を決める必要がある.
  • パソコンとマイコンボードの接続などで利用される.

謝辞

本節をまとめるにあたって以下の資料を参照した.

  • 東裕人 (しまねソフト研究開発センター 専門研究員) 「高級言語による 組み込みシステム開発」, 2020/04/08 松江高専特別講義
  • 月刊 Interface 2020 年 1 月号別冊付録, 「コンピュータ手帳 2020」, CQ 出版.
  • 松江高専 2 年生向け実験手順書「マイコン入門」(川見昌春 著)