keiske-hongyo が 2023年10月21日15時52分59秒 に編集
初版
タイトルの変更
TinyGoとRKJXV122400Rを利用したマウスの製作実験
タグの変更
tinygo
Xiao
RKJXV122400R
メイン画像の変更
記事種類の変更
セットアップや使用方法
ライセンスの変更
(CC BY-NC 4+) Creative Commons Attribution-NonCommercial CC BY-NC version 4.0 or later
本文の変更
# 今回の内容 今回はTinyGoを使用してADCからジョイスティックの状態を取り出し、制御をしたいと思います。また、TiinyGoは簡単にHIDのライブラリを標準で準備されているので、今回はジョイステックの情報を利用してマウスを作成したいと思います。 # 使用部品 | 使用部品| 購入先|備考| |:---:|:---:|:---:| | Seed Xiao RP2040| 秋月電子|RP2040| | RKJXV122400R |秋月電子|アナログジョイスティック| | アナログジョイスティック用変換基板 |秋月電子|ブレッドボードで使用するため| # 回路図 回路としてはX軸のAD値をA0、Y軸のAD値をA1、スイッチをD3に接続しています。 ![回路図](https://camo.elchika.com/c892b4d3a1590457ba7686da225a9f414a7d7afc/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f33646164353039642d616133622d343132302d616433622d6638623565376137366139332f33306235323832302d333838632d346134322d383664302d343039393736313435636163/) # プログラムについて 今回もTinyGoを使用してプログラムを作成しています。TinyGOがUSBHIDのライブラリを持っているのでインポートして使用すれば簡単にUSB機器を製作できます。処理的には、アナログジョイスティックのアナログデータをA/Dポートで読み込み、その値から移動方向と移動量を計算し、マウスカーソルを移動させています。 ```golang:RKJXV122400.go package joystick import ( "machine" ) // Joystick アナログジョイスティック制御用 構造体 type Joystick struct { xStick machine.ADC yStick machine.ADC sw machine.Pin } // New 初期化 func New(xStick machine.Pin, yStick machine.Pin, sw machine.Pin) (Joystick, error) { var err error joystick := Joystick{} joystick.xStick = machine.ADC{Pin: xStick} joystick.yStick = machine.ADC{Pin: yStick} joystick.sw = sw err = joystick.xStick.Configure(machine.ADCConfig{}) if err != nil { return Joystick{}, err } err = joystick.yStick.Configure(machine.ADCConfig{}) if err != nil { return Joystick{}, err } joystick.sw.Configure(machine.PinConfig{Mode: machine.PinInputPullup}) return joystick, nil } // GetDataX X軸のアナログ値を取得 func (j Joystick) GetDataX() uint16 { return j.xStick.Get() >> 12 // 16bit -> 12bit 変換 } // GetDataY Y軸のアナログ値を取得 func (j Joystick) GetDataY() uint16 { return j.yStick.Get() >> 12 // 16bit -> 12bit 変換 } // GetDataSw スイッチの状態を取得 func (j Joystick) GetDataSw() bool { return j.sw.Get() } ``` ```golang:main.go #define LED_PIN 13 package main import ( "JoyMouse/RKJXV122400R" "machine" "machine/usb/hid/keyboard" "machine/usb/hid/mouse" "time" ) // スティックの値格納用構造体 type switchState struct { xValue uint16 yValue uint16 swState bool } func getData(ch chan<- switchState) { var s switchState // ジョイスティックで使用するのポート初期化 j, err := joystick.New(machine.A0, machine.A1, machine.D2) if err != nil { panic(err) } for { // 取得データから移動量を計算 s.xValue = j.GetDataX() >> 12 // 16bit -> 4bit 変換 s.yValue = j.GetDataY() >> 12 // 16bit -> 4bit 変換 // スイッチの状態を取得 if j.GetDataSw() == false { time.Sleep(100 * time.Millisecond) if j.GetDataSw() == false { s.swState = false } else { s.swState = true } } else { s.swState = true } ch <- s time.Sleep(5 * time.Millisecond) } } // LED点灯制御用 func ledCtrl(ch chan<- bool) { ledR := machine.LED_RED ledG := machine.LED_GREEN ledB := machine.LED_BLUE ledR.Configure(machine.PinConfig{Mode: machine.PinOutput}) ledG.Configure(machine.PinConfig{Mode: machine.PinOutput}) ledB.Configure(machine.PinConfig{Mode: machine.PinOutput}) ledG.High() ledB.High() for { ledR.High() time.Sleep(100 * time.Millisecond) ledR.Low() time.Sleep(100 * time.Millisecond) ch <- true } } // 初期化ルーチン func init() { // ADC初期化 machine.InitADC() } // メインルーチン func main() { var s switchState ch1 := make(chan switchState, 1) ch2 := make(chan bool, 1) m := mouse.Port() kb := keyboard.Port() go getData(ch1) go ledCtrl(ch2) for { // Receive channel data from Goroutine select { // Control of ADC case s = <-ch1: m.Move(int(s.yValue)-8, int(s.xValue)-8) if s.swState == false { _, err := kb.Write([]byte("Hello !!")) if err != nil { panic(err) } time.Sleep(200 * time.Millisecond) } // Control of LED case <-ch2: } } } ``` # 最後に 今回のプログラムでは、TinyGoを使用してADコンバータの取得、USBを利用した例を紹介しました。TinyGoは日々バージョンアップが行われ、使用できるマイコンの種類や使用できる機能が増えてきています。今までの紹介した記事を参考にして、少しでもTinyGoに興味を持ってもらえたらと思います。