こんにちは、「メカのりまき」です。

この記事では、「Arduino Micro」を使い、マウスの操作をするといったことを行いたいと思います。

この記事では、Windows11のPCを使用しています。

本記事で使用するもの

本記事で私が使用した物は以下の通りです。

  • 「Arduino IDE2.3.2」をインストールしたPC(Windows11)
  • Arduino Micro
  • USBケーブル(A-MicroB)
  • ジョイスティック
  • タクトスイッチ
  • ブレッドボード
  • ジャンパーワイヤー

今回使用した物は、記事の最後にある広告のところで紹介しています。

記事を見て、気になるものがあれば、是非チェックをしてみてください。

マウスの操作を行う

今回はジョイスティックでマウスを動かし、スイッチでマウスのボタンを押すといったことを行いたいと思います。

スイッチとジョイスティックでマウスを操作

空のスケッチを書き込む

回路を作成する前に、空のスケッチ(「ファイル」タブの「New Sketch」をクリックしたときに出てくる何の処理も書かれていないスケッチ)を書き込みます。

前に作成した回路がある場合は、その回路を崩す前に空のスケッチを書き込みます。

空のスケッチを書き込む

そうすることにより、前に書き込んだスケッチが、新しく作成しようとしている回路に影響を及ぼすことを防げます。

また、前に作成した回路を崩さずに空のスケッチを書き込むのは、ボードへの入力が無いことによって、PCへの操作が行われる場合があるからです。

新しい回路を作成するときは、いつもこの作業をやっておくと、安全に回路を作成することができます。

回路を作成する

以下のような回路を作成します。

回路図(ブレッドボード)

スケッチを書き込む

回路の作成が終わりましたら、以下のようなスケッチを書き込みます。

「void start()」にて、ジョイスティックの初期値を取得しているため、書き込みが完了して直ぐや、USBケーブルを差してから直ぐは、ジョイスティックに触れないようにしてください。

スケッチを書き込んだ後に、マウスの操作が勝手に行われる場合は、USBケーブルを抜いてください。

その後、回路とスケッチが間違っていないかの確認を行います。

ジョイスティックの初期値の取得が上手くいってない場合は、マウスカーソルが勝手に動いてしまいますが、ジョイスティックに触れていない状態で、USBケーブルを差し直すことで治る場合があります。

間違って書き込んだスケッチによる操作により、修正したスケッチの書き込みが困難な場合は、対策を次の節である「スケッチの解説」にて説明していますので、先にそちらをご覧ください。

回路とスケッチが正しい場合、ジョイスティックとスイッチの操作に応じてマウスの操作が行われます。

左のボタン:ホイールボタン 真ん中のボタン:右クリック 右のボタン:ホイールを下に回す ジョイスティック:マウスの移動、押し込みで左ボタン

スケッチの解説

暴走を止めるための文

私は「Arduino Micro」にスケッチを書き込むとき、以下のような文を書いて暴走したときの対処を行っています。

まず、スケッチの初めにある以下の文で、「pausePin」という定数を用意して暴走を止めるためのピンの番号を格納しています。

次に、「void setup()」初めに、以下の文を書くことにより、暴走を止めるためのピンがHIGHのとき空のループを行うようにしています。

上記の文が正しく書き込めていれば、PCとの接続前に「pausePin」に指定したピン(上記の場合だと13番ピン)と5Vピンを接続することで、暴走を止めることができます。

上記の文の詳細や上記の文が機能しなかったときの対処法は、以下の記事で説明していますので、良く分からないという方は、是非以下の記事をご覧になってください。

ジョイスティックを扱うための初期設定

ジョイスティックを扱うための初期設定は以下の通りです。

まず、スケッチの初めにある以下の文により、ジョイスティックに繋がっているピンの番号を定数として格納しています。

ジョイスティックのX,Y軸の動きは「analogRead()」にて読み取る予定なので、それぞれの値を格納するための変数を2つ用意しています。

また、ジョイスティックが中央にある時の値を格納するために、さらに2つの変数を用意しています。

続いて、「void setup()」の中で以下のような文を記述し、ジョイスティックのX,Yに繋いだピンを入力ピンに、ジョイスティックのスイッチに繋いだピンをプルアップ付きの入力ピンとして設定しています。

ピンの設定をした後は、以下の文により、スティックから手を放しているときのX,Y方向の値を取得しています。

ジョイスティックについての初期設定は以上です。

「void loop()」では、これらの変数を利用して、中央からどれだけジョイスティックを動かしたかを検知し、マウスの操作を行います。

今回は「void setup()」にて、スティックから手を放しているときのX,Y方向の値を自動的に取得しましたが、スティックが動いている状態でこの処理が行われると、スティックから手を放しているときのX,Y方向の値が上手く取得できず、誤作動を起こすため注意が必要です。

先にシリアル通信などで、手を放している状態の値を確認しておいて、スケッチでその値を記述する方法のほうが、面倒くさいですが安定するかもしれません。

以下の記事ではジョイスティックの使い方やシリアル通信でジョイスティックの値を取得する方法を説明していますので、ジョイスティックの使い方が良く分からないという方は、是非以下の記事をご覧になってください。

スイッチを扱うための初期設定

スイッチを扱うための初期設定は以下の通りです。

まず、スケッチの初めにある以下の文により、スイッチに繋がっているピンの番号を配列としてまとめています。

続いて、「void setup()」の中で以下のような文を記述しています。

上記の文では、「sizeof()」を利用して配列の要素数を確認し、さらに「for文」で要素の数だけ処理を繰り返すことにより、配列にまとめた番号のピンをすべてプルアップ付きの入力ピンとして設定しています。

上記の文の詳細は、以下の記事で説明していますので、良く分からないという方は、是非以下の記事をご覧になってください。

マウスの操作を行うための初期設定

Arduinoをマウスとして扱うためのライブラリが、標準ライブラリとして存在するため、それを利用します。

まず、スケッチの初めにある以下の文により、「Mouseライブラリ」を読み込みます。

続いて、「void setup()」の中にある以下の文により、マウスの初期設定を行います。

上記の「Mouse.begin()」は、マウスの操作を行うために必要な処理と「Arduino Reference」に書かれています。

しかし、ライブラリの中身を確認したところ、マウスの操作を行うための初期処理はライブラリを読み込んだ時に行っており、「Mouse.begin()」は空の処理になっているという状態だったため、スケッチに「Mouse.begin()」を記述しないで動かしてみました。(2024/8/26に確認)

その結果、「Mouse.begin()」の記述がなくても正常に動作することを確認しましたが、バージョンの違いなどにより、処理内容が変化する可能性があるため、素直に記述することにしました。

マウスを動かす処理

マウスを動かす際には、「Mouse.move()」という関数を利用します。

この「Mouse.move()」はマウスをどのように動かしたかという情報を送ることができます。

ここで、第一引数はどれだけマウスを右、左に動かすかを表し、第二引数はどれだけマウスを手前、奥に動かすかを表しています。

Mouse.move()とマウスの移動

引数の値は「-127~127」までの値を使用することができ、絶対値が大きければ大きい程、マウスを大きく動かしたという風に情報が送られます。

Mouse.move()の絶対値とマウスの移動

送る情報はマウスをどれだけ動かしたのかであるため、マウスカーソルの動きは、Windowsのマウス設定である「マウスポインターの速度」や「ポインタの精度を高める」などの影響を受けます。

今回のスケッチでは、以下のような文を「void loop()」の中で記述し、ジョイスティックの動きに応じて、マウスを動かすといったことを行っています。

xValueの値とマウスの移動

yValueの値とマウスの移動

ボタンを押す処理

ボタンを押すための関数はいくつかあるので、順番に説明していきたいと思います。

まず、「Mouse.press()」についてです。

「Mouse.press()」は( )内で指定したボタンが押されているという情報を送ります。

ここで、( )内の文とボタンの対応は以下のようになっています。

( )内の文とボタンの対応

また、( )の中が空の場合は、引数を「MOUSE_LEFT」として関数が実行されます。

続いて、「Mouse.release()」についてです。

実は「Mouse.press()」によって押されたボタンは、ずっと押されっぱなしの状態であると認識されます。

「Mouse.release()」を利用すると( )内で指定したボタンが押されているという情報を取り消すことができ、ボタンを離したと認識させることができます。

Mouse.press()とMouse.release()

ここで、( )内の文とボタンの対応は先程の「Mouse.press()」と同じです。

今回のスケッチでは、以下のような文を「void loop()」の中で記述し、スイッチが押されていたらボタンを押しているという情報を送り、離されたらその情報を取り消すという使い方をしています。

これにより、「joystickSw」のスイッチはマウスの左ボタン、「switches[0]」のスイッチはマウスのホイールボタンと同じような働きをするようになります。

最後に、「Mouse.click()」についてです。

「Mouse.click()」は( )内で指定したボタンが押されているという情報を一瞬だけ送ります。

Mouse.click()

ここで、( )内の文とボタンの対応は先程の「Mouse.press()」、「Mouse.release()」と同じです。

この「Mouse.click()」は、クリックなど長押しを必要としない場面で使用されます。

今回のスケッチでは、以下のような文を「void loop()」の中で記述し、スイッチが押されたら、ボタンをクリックするという使い方をしています。

これにより、「switches[1]」のスイッチを押すと右クリックが行われるようになります。

後ろの方に記述している「while文」では、スイッチが押されている間、空のループ処理を行い、長押しの際にもう一度入力が行われることや同時に他の処理が行われることを防いでいます。

また、最後の「delay(200)」はチャタリングにより、もう一度処理が行われてしまうことを防ぐために記述しています。

長押しとチャタリングの対策

ホイールを回す処理

ホイールを回す際には、マウスを動かすときにも使った「Mouse.move()」という関数を利用します。

実は、「Mouse.move()」は、第三引数を指定することにより、マウスのホイールを回したという情報を送ることができます。

Mouse.move()とホイールの回転

引数の値は「-127~127」までの値を使用することができ、この値が大きければ大きい程、ホイールを大きく回したという風に情報が送られます。

Mouse.move()の絶対値とホイールの回転

今回のスケッチでは、以下のような文を「void loop()」の中で記述し、スイッチが押されたら、ホイールを回すという使い方をしています。

これにより、「switches[2]」のスイッチを押すと下にホイールを少し回すといったことが行われるようになります。

マウスとキーボードの操作を行う

上記のスケッチでは、マウスの操作のみを行っていますが、同時にキー入力を行うことも可能です。

今回は、先程と同じ回路でキー入力とマウスの操作の両方を行ってみたいと思います。

スイッチでキー入力+マウスの操作 ジョイスティックでマウスの操作

キー入力については、以下の記事で説明をしていますので、「Arduino Micro」でキー入力をしたことが無いという方は、是非以下の記事をご覧になってください。

スケッチを書き込む

回路はそのままで以下のようなスケッチを書き込みます。

スケッチが正しい場合、ジョイスティックとスイッチの操作に応じて、マウスの操作とキー入力が行われます。

左のボタン:shiftキー 真ん中のボタン:ctrlキー+ホイールを上に回す 右のボタン:ctrlキー+ホイールを下に回す ジョイスティック:マウスの移動、押し込みで左ボタン

スケッチの解説

初期設定

初期設定は先程のスケッチとほとんど同じで、ライブラリの読み込みとキー入力の初期化処理を行う文だけ追加をしました。

これにより、キー入力とマウスの操作を同時に行うことができるようになります。

キー入力を行う処理

ジョイスティックで行っているマウスを動かす処理と左ボタンを押す処理については、先程のスケッチと同じです。

今回のスケッチでは、3つのスイッチを押した際の処理を、「Keyboard.press()」と「Keyboard.release()」を利用して、「shiftキー」を押す処理や「ctrlキー」を押しながらホイールを動かすという処理に変更しました。

「Keyboard.press()」と「Keyboard.release()」については、以下の記事で説明していますので、良く分からないという方は、是非ご覧になってください。

終わりに

皆さん、マウスの操作を行うことができたでしょうか。

今回までの記事では、「ArduinoMicroで操作(~,~);」という題で、「Arduino Micro」を使ったキー入力とマウスの操作を行いました。

通常のキー入力やマウスの操作を行う場合、市販のキーボードやマウスで十分だと思いますが、自分だけしか使わないだろうと思われるような操作を簡単に行えるようなデバイスや不便だけど面白いデバイスを作れるのが「Arduino Micro」の魅力だと思います。

また、他のArduinoボードと同じように、センサなどを扱うことができるので、色々と学習をしながらそれらを取り入れてみると面白いかもしれません。

「Arduino Micro」を使った工作は今後も行いたいと思いますが、「ArduinoMicroで操作(~,~);」の記事はこの記事で終わります。

「Arduino Micro」について、復習したいとき、「ArduinoMicroで操作(~,~);」の記事が役にたてば幸いです。

本記事はここまでです。ご清覧ありがとうございました。

広告

今回の主役である「Arduino Micro」です。

まだ持っていないという方は、この機会に是非購入を検討してみてください。

「Arduino Micro」とPCと接続するためのケーブルです。

MicroBタイプのUSBケーブルが無い場合は、合わせて購入を検討してみてください。

今回使用したカラフルなスイッチのセットです。

スイッチを色で判別したいときや見た目をカラフルしたいときにおすすめです。

今回使用したコンパクトなブレッドボードとジャンパーワイヤーのセットです。

コンパクトな回路を作成する際に役立ちます。

今回使用したジョイスティックです。

3個セットになっています。

今回ジョイスティックを接続するために使用したジャンパーワイヤーです。

オス-メスのジャンパーワイヤー以外にも、オス-オス、メス-メスのジャンパーワイヤーが入っています。

楽天モーションウィジェットとGoogleアドセンス広告です。

気になる商品がございましたら、チェックをしてみてください。