Howto

SPI 接続の ADC を使用する方法 (Armadillo-IoT ゲートウェイ A9E または Armadillo 900)

この Howto では、Armadillo 900 開発セットに SPI 接続の ADC を接続し、電圧を取得する方法をご紹介します。

Armadillo 900 開発セットをベースにした内容になっていますが、Armadillo-IoT ゲートウェイ A9E でも動作確認しています。

使用する ADC

この HowTo で使用した SPI 接続の ADC を以下に示します。

  • Microchip MCP3204

この ADC は 4 入力 12 ビットの逐次比較式 ADC です。
出力される値は 0 から 4095 までで、 4096 × VIN / VREF です。
疑似差動モードを使用する場合、 -100mV < VIN < 100mVとなるようにしなければいけないなど、入力電圧範囲に注意が必要です。

接続方法

Armadillo-900 では LPSPI1、または M33コア上の RTOS で実装した GPIO-SPI を利用できます。

LPSPI で利用できるピンは Armadillo-900 マルチプレクス表 で確認してください。
GPIO-SPI の実装は PTA, PTB, PTC からのピンを自由に選べます。

Armadillo IoT ゲートウェイ A9E を利用する場合は Armadillo-IoTゲートウェイ A9E マルチプレクス表 をご確認ください。

Microchip MCP3204 の接続仕様

この ADC では、SPI はモード 0 か 3 、周波数は 50kHz から 1MHz まで( 5V では 2MHz まで)にしてください。
また、この ADC は 2.7 ~ 5.5V で動作するデバイスなので、レベル変換回路が必要です。
この後のサンプルプログラムでは /dev/spidev10.0 にセンサーを接続しています。

Armadillo Base OS 3.21-at.14 現状では SPI モード 0 以外を対応してませんのでそちらで利用してください。 他のモードが必要の場合はフォーラムまでご連絡ください。

Armadillo上の設定

DTBO ファイルを利用して SPI デバイスを登録します。

こちらの設定は Armadillo Base OS 3.21-at.14 に含まれてる Linux 5.10.238-r0 と imx-boot 2023.04-at5 以上が必要です。
前のバージョンで GPIO の設定は可能になっていますが、Linux と m33 コアの間のプロとコーロが上記のバージョンで更新されたのでアップデートを推奨します。「abos-ctrl upgrade」等で更新してください。

howto_a9_spi_adc_mcp3204.tar.gz に dts とビルド済の dtbo ファイルを添付しましたので、ダウンロードして利用してください。

  • LPSPI を利用する場合は howto_a9_spi_adc_mcp3204/armadillo_900-spi-lpspi.dts を参考にしてください。
  • GPIO-SPI を利用する場合は howto_a9_spi_adc_mcp3204/armadillo_900-spi-gpio.dts を参考にしてください。

各設定は以下の通りです:

  • aliases: spi10 の部分で /dev/spidev10.0 デバイス名の 10 を設定します。右側の文字列は次のノードのパスです。
  • spi_type: SPI_TYPE_LPSPI または SPI_TYPE_GPIO
  • LPSPI の場合の spi_index: LPSPI1
  • GPIO-SPI の場合の spi_MISO_pin, spi_MOSI_pin, spi_SCK_pin: PIN_PTxy ( imx8ulp-pinfunc-m33.h 参照、PIN_PTA0 から PIN_PTC23 まで)
  • cs-gpios Linux カーネルが制御する CS ピン
  • gpioa_iomuxc または gpiob_iomuxc, gpioc_iomuxc: M33 コア側の pinctrl 設定

DTS ファイルを Linux カーネルソースディレクトリの arch/arm64/boot/dts/freescale/armadillo_900-customize.dts にコピーして、マニュアルの「独自の DTS overlay を追加する」を参照しながらビルドして Armadillo の /boot/overlays.txt で利用してください。

サンプルプログラム

約 1 秒周期で ADC の値を取得して表示する、 C 言語のサンプルプログラムを用意しました (howto_a9_spi_adc_mcp3204.tar.gz)。
サンプルプログラムの動かし方を以下に示します。

コンテナの準備

本来でしたら C 言語によるアプリケーションの開発 等でアプリケーションを開発しますが、 本 Howto でコンテナの管理を手短くするため Armadillo 上でコンテナを構築して利用します。

Debian の場合

[armadillo ~]# vi Dockerfile-debian
FROM docker.io/debian

RUN --mount=type=cache,target=/var/lib/apt apt update && apt install -y gcc wget spi-tools
[armadillo ~]# abos-ctrl podman-rw build -t debian-spi -f Dockerfile-debian /var/empty/
[armadillo ~]# vi /etc/atmark/containers/debian-spi.conf
set_image debian-spi
set_command sleep infinity
add_devices /dev/spidev10.0
set_autostart no
[armadillo ~]# podman_start debian-spi
[armadillo ~]# podman exec -ti debian-spi bash

Alpine の場合

[armadillo ~]# vi Dockerfile-alpine
FROM docker.io/alpine

RUN apk add --no-cache gcc wget spi-tools musl-dev linux-headers
[armadillo ~]# abos-ctrl podman-rw build -t alpine-spi -f Dockerfile-alpine /var/empty/
[armadillo ~]# vi /etc/atmark/containers/alpine-spi.conf
set_image alpine-spi
set_command sleep infinity
add_devices /dev/spidev10.0
set_autostart no
[armadillo ~]# podman_start alpine-spi
[armadillo ~]# podman exec -ti alpine-spi sh

デバイスとの接続確認

MCP3204 は レジスタなどを持たないため、確認できません。
後述のサンプルプログラムの表示値と、実際の入力電圧が一致しているかどうかで確認してください。

サンプルプログラムのダウンロード・解凍

[container /]# cd
[container ~]# wget https://armadillo.atmark-techno.com/system/files/blog/howto_a9_spi_adc_mcp3204.tar.gz
(省略)
2025-06-26 03:09:48 (18.7 MB/s) - 'howto_a9_spi_adc_mcp3204.tar.gz' saved [2273/2273]
[container ~]# tar zxvf howto_a9_spi_adc_mcp3204.tar.gz
howto_a9_spi_adc_mcp3204/
howto_a9_spi_adc_mcp3204/spi_mcp3204.c
howto_a9_spi_adc_mcp3204/test.c
howto_a9_spi_adc_mcp3204/spi_mcp3204.h
howto_a9_spi_adc_mcp3204/armadillo_900-spi-gpio.dtbo
howto_a9_spi_adc_mcp3204/armadillo_900-spi-lpspi.dtbo
howto_a9_spi_adc_mcp3204/armadillo_900-spi-gpio.dts
howto_a9_spi_adc_mcp3204/armadillo_900-spi-lpspi.dts
[container ~]# cd howto_a9_spi_adc_mcp3204/

サンプルプログラムのコンパイル・実行

[container ~/howto_a9_spi_adc_mcp3204]# gcc test.c spi_mcp3204.c -o test
[container ~/howto_a9_spi_adc_mcp3204]# ./test /dev/spidev10.0
ch0:  761  ch1:  103  ch2: 2108  ch3: 2107  diff(ch0-ch1):  659
ch0:  760  ch1:  102  ch2: 2107  ch3: 2108  diff(ch0-ch1):  659
ch0:  761  ch1:  102  ch2: 2107  ch3: 2108  diff(ch0-ch1):  660
ch0:  761  ch1:  103  ch2: 2107  ch3: 2106  diff(ch0-ch1):  659
ch0:  761  ch1:  102  ch2: 2107  ch3: 2105  diff(ch0-ch1):  659
(無限ループ)

サンプルプログラムについて

サンプルプログラムは test.cmain 関数があります。
同様に spi_mcp3204.h をインクルードすることで、ADC を使用したプログラムを作成できます。
MCP3204 のデータシートも参考にしてください。