2023年4月16日日曜日

Raspberry Pi PicoをUSBマウスとして使う(3/3)(マウスボタンのダブルクリックが使えるようにする)

マウスのダブルクリックが動くようにする

前の投稿で,マウスのダブルクリックができませんでしたが,このサイトで確認したところ,クリックも判定してもらえていないことが分かりました.

改めて,サンプルプログラムで確認しました.

Arduino IDEのメニューをたどると,サンプルプログラムとして[File]→[Examples]→[09.USB]→[Mouse]→[ButtonMouseControl]というのがあります.このサンプルでは,Mouse.press()とMouse.release()だけを使っており,Mouse.click()を使っていないのですが,このプログラムを用いると,このサイトのシングルクリックの判定とダブルクリックの判定がうまくいきました.また,ドラッグの動作もうまく行きました.

そこで,シンプルに,クリックとドラッグの判定をせずに,マウスボタンのdownとupそのものを送出するようにしました.

これが以下のプログラムです.

// move mouse cursor by joystick
// implement left/right button
// 2023/4/16

#include <Mouse.h>

void setup() {
  Serial.begin(9600);
  // joystick
  gpio_init(27);
  gpio_set_dir(27, GPIO_IN); // GP27 in:0(false) out:1(true)
  gpio_init(28);
  gpio_set_dir(28, GPIO_IN); // GP28 in:0(false) out:1(true)
  // button
  gpio_init(16); // right button
  gpio_set_dir(16, GPIO_IN);
  gpio_pull_down(16);
  gpio_init(17); // left button
  gpio_set_dir(17, GPIO_IN);
  gpio_pull_down(17);
  Mouse.begin();
  delay(5000);
}

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

#define MOUSE_DOWN 1
#define MOUSE_UP 0

void loop() {

  //----------------------------------------
  // move
  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

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

  //----------------------------------------
  // click/drag
  bool left_button_val = gpio_get(17);
  bool right_button_val = gpio_get(16);

  // left button down
  if (left_button_val == MOUSE_DOWN) {
    // if the mouse is not pressed, press it:
    if (!Mouse.isPressed(MOUSE_LEFT)) {
      Mouse.press(MOUSE_LEFT);
    }
  } else {
    // if the mouse is pressed, release it:
    if (Mouse.isPressed(MOUSE_LEFT)) {
      Mouse.release(MOUSE_LEFT);
    }
  }
  // right button down
  if (right_button_val == MOUSE_DOWN) {
    // if the mouse is not pressed, press it:
    if (!Mouse.isPressed(MOUSE_RIGHT)) {
      Mouse.press(MOUSE_RIGHT);
    }
  } else {
    // if the mouse is pressed, release it:
    if (Mouse.isPressed(MOUSE_RIGHT)) {
      Mouse.release(MOUSE_RIGHT);
    }
  }
  delay(10);
}

これでめでたく,USBマウスとして使用することができるようになりました.

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」の中に色々とサンプルプログラムが入っているので試してみてください.

2023年4月11日火曜日

Raspberry Pi Pico/Pico WからI2SでPCM5102ボードにオーディオ出力(USB-DAC)

この記事では,Raspberry Pi Picoをpico audioボードに接続して,ここにあるプログラムをRaspberry Pi Picoに書き込んで,USB-DACとして使いました.

ここでは,ここで購入できる一般のPCM5102 I2Sボードを使ってUSB-DACを作成します.

プログラムの書き込みはここと一緒です.配付されたプログラムから何も書き換えていません.

ハードウェアの結線は以下のとおりです.このDACボードは5V電源なので,以下のように接続します.


USB-DACボードの左から順に書いています.

  • GND→接続なし
  • MCLK→接続なし
  • BICK→PICO 31pin
  • DATA→PICO 34pin
  • LRCK→PICO 32pin
  • GND→PICO 38pin
  • MUTE→結線なし
  • VCC→PICO 40pin

Raspberry Pi Pico/Pico Wのピン配置はこのようになっています.

これでパソコンからUSB-DACとして認識して音が出ました.


2023年4月7日金曜日

Eclipse (pleiades 2023)のセットアップ(Windows 11用)

 Eclipseのダウンロード

まずWebブラウザーを開き,「Eclipse pleiades」で検索します.

一番上に表示される「統合開発環境Eclipse日本語化プロジェクト」をクリックしてください.pleiadesのダウンロードページに移動します.


3つ並んでいる青いボタンのうち,一番左の「Eclipse 2023」をクリックしてください.

ダウンロードするEclipseの種類を選びます.ここでは「Windows x64」「Java」「Full Edition」に該当する「Download」を選んでクリックします.

ダウンロードが始まります.始まらない場合は,真ん中の青色のURLをクリックしてください.

Google Chromeの場合にはダウンロード先のフォルダを選ぶダイアログが表示されます.どこにダウンロードされるか確認して「保存」ボタンをクリックしてください.ここでは「ダウンロード」フォルダにダウンロードされます.Edgeだと「名前をつけて...」というポップアップが出ますので,下向きの矢印をクリックして「保存」をクリックすると,「ダウンロード」フォルダにファイル「pleiades-2023-03-java-win-64bit-jre-20230326.exe」がダウンロードされます.


Eclipseのインストール

ファイル「pleiades-2023-03-java-win-64bit-jre-20230326.exe」がダウンロードされるので,ダブルクリックしてこのファイルを実行します.

インストール先を確認します.フォルダ「C:\pleiades」の中にインストールされることを確認して「解凍」ボタンをクリックしてください.

ファイル解凍の進捗が表示されます.解凍が終了するとこのダイアログは自動的に閉じます.

エクスプローラーでフォルダ「C:\pleiades\2023-03\eclipse\」を開くと,ファイル「eclipse.exe」があるのが分かります.これがEclipseの実行ファイルです.

実行ファイルをダブルクリックすると,ダイアログが開いてプログラムが起動します.しばらく時間がかかります.

ワークスペースを指定するダイアログが表示されます.以下の設定では「C:\pleiades\2023-03\workspace\」の中にプロジェクトとJavaのファイルが作成されます.

「起動」ボタンをクリックすると,このフォルダをワークスペースとしてプログラムが再起動します.

各種のウィンドウが邪魔なので,左上に表示されている「パッケージ・エクスプローラー」以外を閉じます.タブバー上でマウスを右クリックしてメニューで「閉じる」を選択してください.「×」マークが表示されている場合には,これをクリックしても閉じることができます.

間違ってパッケージ・エクスプローラーを削除してしまった場合は,メニューバーで「ウィンドウ」→「ビューの表示」→「パッケージ・エクスプローラー」を選択すると再表示できます.

初期設定(ウィンドウの表示色とフォント)

メニューから「ウィンドウ」→「設定」を選択すると「設定」ダイアログが開きます.

「一般」の左の「>」をクリックし,さらに「外観」の左の「>」をクリックします.ここで外観をクリックするとルック&フィールを選択できます.

ルック&フィールは現在「ダーク」モードになっているので,これを「ライト」モードに変更します.

「適用」ボタンをクリックします.

ダイアログが開いて「再起動しますか?」と聞かれるので「再開しない」をクリックして,このダイアログを閉じます.

再起動していないので,このように中途半端なライトモードの表示になりました.ここでさらに,「外観」の中にある「色とフォント」をクリックします.

一番上の行の「テキスト・エディター・ブロック選択フォント」の次の行の「テキスト・フォント」を選択して右の「編集」ボタンをクリックします.

フォント名:「MS ゴシック」スタイル:「標準」サイズ:「9」が選択されています.

ここではサイズを「12」にしてフォントのサイズを大きくしてみます.「OK」ボタンをクリックしてこのダイアログを閉じてください.

したの「プレビュー」でフォントが「MSゴシック12」になっています.「適用して閉じる」ボタンをクリックするとこのダイアログが閉じます.以上で初期設定を終了します.Eclipseを一度終了して再起動してください.

Javaプロジェクトの作成と実行

メニュー「ファイル」→「新規」→「Javaプロジェクト」を選択します.「新規Javaプロジェクト」ダイアログが開きます.

一番上の「プロジェクト名」を入力します.ここでは「JavaTest1」と入力します.

その下の「ロケーション」で,プロジェクトが作成される場所を確認してください.この設定では,「C:\pleiades\2023-03\workspace\JavaTest1」となります.「完了」ボタンをクリックすると,ダイアログが閉じて,パッケージ・エクスプローラーにプロジェクトが表示されます.

このパッケージ・エクスプローラーのプロジェクト「JavaTest1」の上で右クリックして,表示されたポップアップメニューで「新規」→「クラス」を選択してください.「新規Javaクラス」ダイアログが開きます.

※パッケージを作成する場合には「パッケージ」にパッケージ名を入力します.ここではパッケージを作成しないので,ここは空白のままにしておきます.

「名前」にクラス名を入力します.ここではプロジェクト名と同じ「JavaTest1」と入力します(プロジェクト名と違っても構いません).また,下の「public static void main(String[] args)」にチェックを入れると,作成したクラスの中に自動的にmain()関数が作成されます.Javaプログラムでは,CやC++のプログラムと同じく,プログラムの動作はmain()関数の1行目から始まります.

「完了」ボタンをクリックしてください.ダイアログが閉じて,メインウィンドウのパッケージ・エクスプローラーにJavaTest1.javaというファイル名が表示され,右側のコードエディタにJavaTest1.javaの中身が表示されます.

ここでは標準出力(コンソール)に「Hello, Java!」と表示するプログラムを作成します.main()関数の中身の1行目に書かれている,「//」で始まる行はコメント行なので,削除して構いません.以下のようにプログラムを書き換えてください.

左のパッケージ・エクスプローラーで,ファイル名「JavaTest1.java」の上で右クリックして,ポップアップしたメニューで「実行」→「Javaアプリケーション」を選択すると,プログラムがコンパイルされ,実行されます.

新しく「コンソール」が開いて,「Hello, Java!」と表示されます.これでプログラムが実行されました.

作成されたファイルの保存される場所

このとき,プロジェクトは「C:\pleiades\2023-03\workspace\」フォルダの中に「JavaTest1」フォルダが作成されます.この中の「src」フォルダの中にプログラムのソースコードファイル「JavaTest1.java」が作成され,コンパイルされたファイル「JavaTest1.class」が「bin」フォルダの中に作成されます.