ラベル Arduino IDE の投稿を表示しています。 すべての投稿を表示
ラベル Arduino IDE の投稿を表示しています。 すべての投稿を表示

2023年4月13日木曜日

Raspberry Pi PicoをUSBマウスとして使う(2/3)(マウスボタンのクリック・ドラッグ)



前回の続きです.

Raspberry Pi PicoをUSBマウスとして使用するにあたって,マウスボタンの実装をします.

まずボタンは物理的にはスイッチとして実装されており,Raspberry Pi PicoではON (down)かOFF (up)かの状態が瞬間ごとに読み取れます.これだけではクリックとドラッグの区別ができませんので,ソフトウェアで実装します.

ソフトウェア

まず,ONかOFFかの読み取りは定期的に行われているので,前回の状態を記憶しておいて,ON→OFFとOFF→ONの状態変化を読み取ります.OFF→ONがボタンのdown,ON→OFFがボタンのupになります.

マウスのイベントとしては,MOUSE_DOWN, MOUSE_UP, MOUSE_CLICKを発出する必要があります.MOUSE_DRAGとMOUSE_CLICKのモードを作成して,MOUSE_DRAGモードの際にはMOUSE_DOWNとMOUSE_UPのイベントを発出します.MOUSE_CLICKモードの際には,マウスボタンを離した瞬間にMOUSE_CLICKイベントを発出することにします.

さらに,MOUSE_DRAGモードとMOUSE_CLICKモードの区別は以下のようにします.downの瞬間にdownしている時間の計測を始めます.初期状態はMOUSE_CLICKにしておいて,ある閾値(ここでは0.5秒)を超えたら,MOUSE_CLICKからMOUSE_DRAGに状態変化すると同時に,ここでMOUSE_DOWNイベントを発出します.

マウスボタンがupされた時点で,現在MOUSE_DRAGモードの場合にはMOUSE_UPイベントを,MOUSE_CLICKモードの場合にMOUSE_CLICKイベントを発出します.

図示すると以下のようになります.

ハードウェア

ハードウェアの製作は以下のようになります.push buttonの片方のピンを3.3Vに接続して,もう片方のピンをGPIOにpull down接続します.今回はGP16とGP17を使いました.

配線全体は以下のようになります.


以下の写真はボタンの部分の配線です.


以下の写真はRaspberry Pi Pico側の配線です.


ダブルクリックについて

ダブルクリックが未実装です.これも時間を測って,時間の閾値を決めてその時間内にマウスボタンがON→OFF→ON→OFFされたらダブルクリックイベントを発出する必要があるみたいです.

もしくは,OSに合わせてハードウェア側でクリックの時間をある程度決めないといけないのかも知れません.

続きはここで.

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);
}

マウスボタンの実装

続きはここで.

Raspberry Pi Pico/Pico WをArduino IDEから使う方法(macOS)

 Raspberry Pi Pico/Pico Wは通常のRaspberry Piと違い,OSが動いていないため,パソコンでプログラムを書いてこれらに書き込む必要があります.開発方法は以下の3種類あります.

  • ターミナルのコマンドプロンプトからgccとcmakeでbuild,installする
  • microPython用のファームウェアを書き込んで,Thonnyを使ってmicroPythonで開発する
  • Arduino IDEをRaspberry Pi Pico/Pico W対応にして,Arduinoのようにプログラムを書き込む
ここでは,Arduino IDEを使う方法をメモします.こちらのページを参照しました.

手順1:Arduino IDEをダウンロード,インストール

まずArduino IDEをインストールします.Arduino IDEはArduinoというマイコンボードのためのプログラムを書くために提供されている統合開発環境(IDE)ですが,拡張機能を入れることで,Raspberry Pi Pico/Pico Wでも使用できます.
以下のサイトにアクセスします.
以下のような画面が表示されます.

右側の「DOWNLOAD OPTIONS」から使用しているOSに合わせてダウンロードします.ここでは「macOS Apple Silicon」用の行をクリックします.
以下のような画面が表示されます.

寄付するかどうかを聞かれています.寄付しない場合は「JUST DOWNLOAD」をクリックしてください.ここではイメージファイル「arduino-ide_2.0.4_macOS_arm64.dmg」がダウンロードされました.

このファイルをダブルクリックして開くと,以下のようなウィンドウが開きます.


左のアイコンがアプリケーションのアイコン,右のアイコンが「アプリケーション」フォルダなので,左のアイコンを右のフォルダの中にドラッグ&ドロップすると,アプリケーション「Arduino IDE.app」が「アプリケーション」フォルダの中にコピーされます.
コピーが終了したら,「アプリケーション」フォルダの中,もしくはLaunch Padから起動します.以下のようなウィンドウが開きます.

手順2:Raspberry Pi Pico/Pico Wを使用するための初期設定

この状態ではRaspberry Pi Pico/Pico Wを使用できないので,初回のみ,使用するための初期設定を行います.メニューバーの「Arduino IDE」から「Preferences...」をクリックしてください.以下のような設定ウィンドウが開きます.

一番下にある「Additional boards manager URLs:」のテキストボックスに,以下のURLをコピー&ペーストしてください.

https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json

貼り付けたら右下の「OK」ボタンをクリックします. 

次にメニューバーの「Tools」から「Board」→「Boards Manager...」を選択してください.

以下のように,ウィンドウの左側にBoards Managerが表示されます.

一番上のテキストボックスに「pico」と打ち込んでください.

左のboards managerの表示をマウスでドラッグして広げると,以下のように「pico」にマッチするモジュールとして「Arduino Mbed OS RP2040 Boards by Arduino」,「Raspberry Pi Pico/RP2040 by Earle F. Philhover, III」と「[DEPRECATED - Please install standalone packages] Arduino Mbed OS Boards by Arduino」が表示されます.


2番目の「Raspberry Pi Pico/RP2040 by Earle F. Philhover, III」の「INSTALL」をクリックしてください.インストールが終了すると,以下のような表示に変わります.


これでインストールは終了です,左の縦バーで上から2番目のアイコン「Boards Manager」をクリックしてください.

ボード・マネージャーが閉じてスケッチブックに戻ります.

手順3:ボードと書き込みポートの選択

次にArduino IDEでプログラミングするボードを選びます.ここでは,Raspberry Pi Picoを選択します.メニューバーから「Tools」→「Board」→「Arduino Mbed OS RP2040 Boards」→「Raspberry Pi Pico」(Raspberry Pi Pico Wを使っている場合は「Raspberry Pi Pico W」)を選んでください.


「Tools」メニューに表示される項目が増えます.

ここで,Raspberry Pi Pico/Pico WボードをUSBケーブルでパソコンに接続してください.認識されていない場合は,Raspberry Pi Pico/Pico Wの「BOOLSEL」ボタンを押しながらUSBケーブルを接続してください.すると,接続用のUSBポートが新しくできるので「Port:」で「/dev/cu.usbmodem2201」(最後の4桁の番号は違う場合があります)を選択してください.

手順4:サンプルスケッチの書き込み

メニューバーで「File」→「Examples」→「01.Basics」→「Blink」を選択してください.新しくウィンドウが開いて,Blinkのソースコードが表示されます.


ボードとして「Raspberry Pi Pico」もしくは「Raspberry Pi Pico W」が表示されていること,メニューバーの「Tools」→「Port:」で「/dev/cu.usbmodem????」が選択されていることを確認して,左から2番目の書き込みボタンをクリックしてください.

Raspberry Pi Picoのボードに載っているLEDが点滅します.


Raspberry Pi Pico Wでも,ボードの選択をすれば同じプログラムが動きます.


メニューバーの「File」→「Examples」の中に色々とサンプルプログラムが入っているので試してみてください.