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軸方向それぞれに対して出力されます.
ソフトウェア
ジョイスティックの値を読んでシリアルコンソールに表示するプログラムは以下のようになります.
// 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); }
探していましたありがとうございます。
返信削除