この 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.c
に main
関数があります。
同様に spi_mcp3204.h
をインクルードすることで、ADC を使用したプログラムを作成できます。
MCP3204 のデータシートも参考にしてください。