CircuitPython 10行プログラミング Step9 (9) D-Aコンバータを作る
今回利用しているESP32-S3-DevKitC-1-N8には、D-Aコンバータはありません。I/Oポートを使ってD-Aコンバータを作ります。CircuitPython は8.0.0-rc.1です。
●実験回路
4ビットのR-2R抵抗ラダー型のD-Aコンバータを作ります。12ビットあれば実用的になりますが、まずは動作を確認します。
OPアンプのプラス電源はマイコン・ボードの3.3Vで、マイナス電源はエネループ(1.2V)を3本つないで作りました。-3.3Vより少し高めです。OPアンプはOP1612で、電源電圧まで出力がスイングします。
抵抗は、20kと10kで構成したかったのですがなかったので、22kΩを使いました。パラレルにして11kΩです。
●配線
マイコン・ボードは、1、2、42、41と印刷された端子を、回路図のda0、da1、da2、da3につなぎます。
●プログラム
三つの出力を試しました。最初は全部 '1'、最後は全部'0'です。二つめは'0001'でMSBが'1'です。
import digitalio
from board import *
import time
da0 = digitalio.DigitalInOut(IO1)
da1 = digitalio.DigitalInOut(IO2)
da2 = digitalio.DigitalInOut(IO42)
da3 = digitalio.DigitalInOut(IO41)
da0.direction = digitalio.Direction.OUTPUT
da1.direction = digitalio.Direction.OUTPUT
da2.direction = digitalio.Direction.OUTPUT
da3.direction = digitalio.Direction.OUTPUT
while True:
da0.value = True # ①
da1.value = True
da2.value = True
da3.value = True
time.sleep(0.02)
da0.value = False # ②
da1.value = False
da2.value = False
da3.value = True
time.sleep(0.01)
da0.value = False # ③
da1.value = False
da2.value = False
da3.value = False
time.sleep(0.01)
実行例です。上の黄色の波形がOPアンプの+側入力端子、下の青色がOPアンプの1番の出力です。
階段状に値を増やしました。
import digitalio
from board import *
import time
da0 = digitalio.DigitalInOut(IO1)
da1 = digitalio.DigitalInOut(IO2)
da2 = digitalio.DigitalInOut(IO42)
da3 = digitalio.DigitalInOut(IO41)
da0.direction = digitalio.Direction.OUTPUT
da1.direction = digitalio.Direction.OUTPUT
da2.direction = digitalio.Direction.OUTPUT
da3.direction = digitalio.Direction.OUTPUT
while True:
da0.value = True
da1.value = True
da2.value = True
da3.value = True
time.sleep(0.02)
da0.value = False
da1.value = False
da2.value = True
da3.value = True
time.sleep(0.01)
da0.value = True
da1.value = True
da2.value = False
da3.value = True
time.sleep(0.01)
da0.value = False
da1.value = False
da2.value = False
da3.value = True
time.sleep(0.01)
da0.value = False
da1.value = True
da2.value = True
da3.value = False
time.sleep(0.01)
da0.value = True
da1.value = True
da2.value = False
da3.value = False
time.sleep(0.01)
da0.value = False
da1.value = True
da2.value = False
da3.value = False
time.sleep(0.01)
da0.value = True
da1.value = False
da2.value = False
da3.value = False
time.sleep(0.01)
da0.value = False
da1.value = False
da2.value = False
da3.value = False
time.sleep(0.01)
実行例です。