2023年4月12日水曜日

Raspberry Pi PicoをUSBマウスとして使う(1/3)(マウスカーソルの移動)

Raspberry Pi PicoをArduino IDEから使うと,USBマウスのサンプルソースコードがあります.メニューバーで[File]→[Examples]→[Mouse]→[Circle]のプログラムです.

このプログラムをArduino IDEからRaspberry Pi Picoに書き込み,Raspberry Pi PicoのBOOTSELボタンを押すと,マウスカーソルが円形に一周動きます.macOSのシステム設定でマウスの軌跡の速さを変更すると,この円の半径が変わるので,Raspberry Pi PicoがUSBマウスとして認識されていることが分かります.

ハードウェア

まず,ジョイスティックを使ってマウスカーソルを動かします.ジョイスティックとしてはスイッチサイエンスで購入できるAdafruitの小型アナログジョイスティック小型アナログジョイスティック用ピッチ変換基板をつけた物を,ブレッドボードに挿して用います.

まず,Raspberry Pi Picoのピン配置はこちらにあります.

36pin(3.3V),34pin(GP28),32pin(GP27),28pin(0V)を用います.結線は以下の写真のようにします.全体の写真が以下です.

ジョイスティックのハードウェアは,ただのボリューム(反固定抵抗)で,0Vと+の電圧を与えると,x軸方向とy軸方向の変位に比例した0Vと+の電圧の間の電圧が,x軸方向とy軸方向それぞれに対して出力されます.


次に,Raspberry Pi Pico側の結線の写真が以下です.


最後に,ジョイスティック側の結線の写真が以下です.


ソフトウェア

ジョイスティックの値を読んでシリアルコンソールに表示するプログラムは以下のようになります.

// read joystick and print to serial console
// 2023/4/12

#include <Mouse.h>

void setup() {
  Serial.begin(9600);
  Mouse.begin();
  delay(5000);
}

#define MIN_RAW 3
#define MAX_RAW 1023
#define MIDDLE_RAW ((MAX_RAW - MIN_RAW)/2)

void loop() {
  uint16_t raw_x = analogRead(28); // 3..1023
  int16_t value_x = (raw_x - MIDDLE_RAW)/10; // -50..51
  uint16_t raw_y = analogRead(27); // 3..1023
  int16_t value_y = (raw_y - MIDDLE_RAW)/10; // -50..51

  Serial.print("X raw=");
  Serial.print( raw_x );
  Serial.print(", Value=");
  Serial.print( value_x );

  Serial.print(", Y raw=");
  Serial.print( raw_y );
  Serial.print(", Value=");
  Serial.println( value_y );

  delay(10);
}

次に,ジョイスティックの値を見てマウスカーソルを動かすプログラムは以下のようになります.

// move mouse cursor by joystick
// 2023/4/12

#include <Mouse.h>

void setup() {
  Serial.begin(9600);
  Mouse.begin();
  delay(5000);
}

#define MIN_RAW 3
#define MAX_RAW 1023
#define MIDDLE_RAW ((MAX_RAW - MIN_RAW)/2)

void loop() {
  uint16_t raw_x = analogRead(28); // 3..1023
  int16_t value_x = (raw_x - MIDDLE_RAW)/10; // -50..51
  uint16_t raw_y = analogRead(27); // 3..1023
  int16_t value_y = (raw_y - MIDDLE_RAW)/10; // -50..51

  Serial.print("X raw=");
  Serial.print( raw_x );
  Serial.print(", Value=");
  Serial.print( value_x );

  Serial.print(", Y raw=");
  Serial.print( raw_y );
  Serial.print(", Value=");
  Serial.println( value_y );

  float dx=0.0;
  float dy=0.0;
  if (value_x > 0) {
    dx = -((float)value_x * value_x / 200.0);
  } else {
    dx = ((float)value_x * value_x / 200.0);
  }
  if (value_y > 0) {
    dy = (float)value_y * value_y / 200.0;
  } else {
    dy = -(float)value_y * value_y / 200.0;
  }
  Mouse.move(dx, dy, 0);
  delay(10);
}

マウスボタンの実装

続きはここで.

1 件のコメント: