CircuitPython 10行プログラミング Step8 (5) アナログ入力
マイコン・ボードSeeed XIAO BLE Senseのアナログ入力にGroveのジョイスティックをつなぎます。CircuitPython のアナログ入力は0~65535の値を返します。Seeed XIAO BLE SenseにはA0からA5のアナログ入力ポートがあります。
- 動作電圧 5V
- 出力 X、Y
- 押したとき Xに電源電圧が出る
●動作環境
Macでマウントできなくなったら、Windowsで正常にマウントできるようになりました。理由は不明です。
- Windows10 21H2
- Mu 1.1.1
●接続
Vccは3.3Vで動作させます。
●プログラム①
X、Yのアナログ入力を読み取って表示します。
いろいろな角度に動かして、最小値と最大値を記録します。2個のボリュームの中点の電圧を読んでいるので、安定しません。
from board import *
import analogio
import time
pin0 = analogio.AnalogIn(A0)
pin1 = analogio.AnalogIn(A1)
while 1:
print("---")
print(pin0.value)
print(pin1.value)
time.sleep(1)
●プログラム②
X、Yのデータから、角度とベクトルのデータを作りました。
コネクタの方向に、7割ぐらい倒したときの様子です。
from board import *
import analogio
import time
import math
pin0 = analogio.AnalogIn(A0)
pin1 = analogio.AnalogIn(A1)
while 1:
print("---")
x = 2*(((pin0.value-15280)/33400)-0.5365)
y = 2*(((pin1.value-16144)/34951)-0.4558)
print('x={:f} y={:f}'.format(x,y))
th = math.atan2(y,x)*180/3.141592
Ve = math.sqrt(x*x + y*y)
print('Theta ={:.4f} Vector ={:.2f}'.format(th,Ve))
time.sleep(0.5)
pin0.deinit()
pin1.deinit()
実行中の様子です。
参考文献 「4.ロボットの運動学と制御の基礎」
●プログラム③
角度とベクトルのデータをBLEで送ります。
# SPDX-FileCopyrightText: Copyright (c) 2020 Bryan Siepert for Adafruit Industries
from adafruit_ble import BLERadio
from adafruit_ble.advertising.standard import ProvideServicesAdvertisement
from adafruit_ble.services.nordic import UARTService
from board import *
import analogio
import time
import math
ble = BLERadio()
uart = UARTService()
advertisement = ProvideServicesAdvertisement(uart)
pin0 = analogio.AnalogIn(A0)
pin1 = analogio.AnalogIn(A1)
def getPosition():
x = 2*(((pin0.value-15280)/33400)-0.5365)
y = 2*(((pin1.value-16144)/34951)-0.4558)
th = math.atan2(y,x)*180/3.141592
Ve = math.sqrt(x*x + y*y)
return th, Ve
print('start')
ble.name = 'XIAO joystick'
while 1:
ble.start_advertising(advertisement)
while not ble.connected:
pass
ble.stop_advertising()
print('connected ')
while ble.connected:
print("---")
(th, Ve) = getPosition()
uart.write('{:.1f} {:.2f} '.format(th, Ve))
print('Theta ={:.1f} Vector ={:.2f}'.format(th,Ve))
time.sleep(0.2)
pin0.deinit()
pin1.deinit()
実行中の様子です。
BLEセントラルとして利用しているのは、onsemiのRSL10 Bluetooth Low Energy Explorerです。Notificationをチェックすると、キャラクタリスティックUUIDの6E400003-B5A3-F393-E0A9-E50E24DCCA9Eに、テキストで角度とベクトル値のデータが0.2秒ごとに交互に送られてきています。