05-25-2023 01:11 AM
電子工作界隈ではArduinoが定番を維持していますが、C言語はちょっと触りたくもないという方も多いと思います。
MicroPythonのSPIでAD変換ボード(ADS8688)を使ったデータ収録の方法を紹介します。
書店の棚にはPythonの書籍が他を圧倒しています。これからプログラミングを始めるならばPython、流行のPythonなら覚えておいて無駄にならないかもしれないという気になってもしょうがないでしょう。私もPythonは気になっていて数年前に2冊入門書を購入したのですが、インデントで見やすいのね..インタプリタね..ぐらいの感想で、本棚に入りっぱなしでした。
マイコンで使えるPythonがMicroPythonですが、機械語に変換してくれるコンパイラをファームウェアとしてマイコンに書き込んでおいて、PCからコマンドなどを送ると逐次動作をしてくれます。また、main.pyという名前でpythonプログラム(テキストファイル)をマイコンに書き込んでおくと機械語に変換して動作してくれます。図に書くと以下のようなイメージです。
MicroPythonを初めて使う方は、検索すれば簡単に情報が見つかると思いますが、「紫波町かいわいIT事情」num017(IT事情Num017k0.pdf)にサラッとまとめましたので添付ファイルをご覧ください。
ADS8688についてはArduino IDEで使用した記事https://forums.ni.com/t5/北東北-LabVIEWユーザー会/SPI接続のAD変換ボード-ADS8688-8ch-500kSPS-を使ってみる/td-p/4276283 をご覧ください。
この記事ではWaveshare RP2040-Zeroを使いますが、Raspberry Pi Picoでも同様に動くはず(未確認)です。
Waveshare RP2040-Zeroはhttps://www.switch-science.com/products/7886 で購入できます。売り切れの場合はAliExpress等からも購入できます。
配線
ADS8688--------RP2040-Zero
* CS: ------- GP5
* SDI: ------GP3
* SDO: ----GP4
* SCK: -----GP2
* GND: ----- GND
* V+: -------- 5V
from machine import Pin, SPI
from utime import sleep
MOSI_PIN = 3
MISO_PIN = 4
CLK_PIN = 2
CS_PIN = 5
SPI_CH = 0
NO_OP = 0x00
AUTO_RST = 0xA0
AUTO_SEQ_EN = 0x01
CH_PWR_DN = 0x02
RANGE_Ch_0 = 0x05 # Channel 0 Input Range: default 0x00 - bit 3-0 to select range
RANGE_Ch_1 = 0x06 # Channel 1 Input Range: default 0x00 - bit 3-0 to select range
RANGE_Ch_2 = 0x07 # Channel 2 Input Range: default 0x00 - bit 3-0 to select range
RANGE_Ch_3 = 0x08 # Channel 3 Input Range: default 0x00 - bit 3-0 to select range
RANGE_Ch_4 = 0x09 # Channel 4 Input Range: default 0x00 - bit 3-0 to select range
RANGE_Ch_5 = 0x0A # Channel 5 Input Range: default 0x00 - bit 3-0 to select range
RANGE_Ch_6 = 0x0B # Channel 6 Input Range: default 0x00 - bit 3-0 to select range
RANGE_Ch_7 = 0x0C # Channel 7 Input Range: default 0x00 - bit 3-0 to select range
R0 = 0x00 # Input range to -2.5/+2.5*Vref +/- 10.24V (Vref=4.096V)
R1 = 0x01 # Input range to -1.25/+1.25*Vref +/- 5.12V (Vref=4.096V)
R2 = 0x02 # Input range to -0.625/+0.625*Vref +/- 2.56V (Vref=4.096V)
R5 = 0x05 # Input range to +2.5*Vref 10.24V (Vref=4.096V)
R6 = 0x06 # Input range to +1.25*Vref 5.12V (Vref=4.096V)
def write_register(reg, val):
cs.high()
msg=bytearray()
reg = (reg << 1) | 0x01 #ADDR(7bit)+Write(1bit_High)
msg.append(reg)
msg.append(val)
msg.append(0x00)
cs.low()
spi.write(msg)
cs.high()
def cmd_register(reg):
cs.high()
cs.low()
val=spi.read(4,reg)
msb=val[2]
lsb=val[3]
result = (msb << 😎 | lsb
cs.high()
return result
# Setup SPI and ADC8688
cs = Pin( CS_PIN, Pin.OUT )
cs.high()
spi = SPI(SPI_CH, baudrate=100_000, polarity=0, phase=1, bits=8, firstbit=SPI.MSB, sck=Pin(CLK_PIN), mosi=Pin(MOSI_PIN), miso=Pin(MISO_PIN))
write_register(AUTO_SEQ_EN, 0b00000001) # Set ch_0 for Reading
write_register(CH_PWR_DN, ~0b00000001) # Not Use Except ch_0
write_register(RANGE_Ch_0, R6)
cmd_register(AUTO_RST)
# Continuous Reading
while True:
val = cmd_register(NO_OP)
#print(val)
print(val * 5.12 / 65535)
#print(hex(val)[2:])
#print(hex(val)[2:].upper())
sleep(0.1)
ほぼ0.1秒おきにサンプリングして、電圧値に変換してUSB経由で文字列を送るプログラムです。LabVIEWのExample「Continuous Serial Write and Read」を少しだけ改造した文字列を受け取ってチャートに表示するVIです。0Vから3Vの1Hzのノコギリ波を測定しています。
MicroPythonのprint文はUSB経由でPCに送られます。詳細は理解できていませんが、USB1.1相当で通信しているらしくLabVIEW側でボーレートを設定しても無視されます。速度的には充分速そうな感触です。
Webで見つかるMicroPythonのサンプルは少ないので動かすだけならArduino IDEの方が楽ですが、インタープリタというのはそれなりに使いやすい面もありますし、Pythonの方がC言語よりも取っ付きやすいと感じる人も多いかもしれません。
05-25-2023 01:38 AM
以下のファイルが添付されませんでしたので再度添付します。
「MicroPythonを初めて使う方は、検索すれば簡単に情報が見つかると思いますが、「紫波町かいわいIT事情」num017(IT事情Num017k0.pdf)にサラッとまとめましたので添付ファイルをご覧ください。」