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秒ごとに交互に送られてきています。