Arduino UNO R4 Minimaを使ってLチカを学ぶ

年末にルネサスさんの「Arduinoで学ぶ、はじめてのLチカ(オンデマンドセミナー)」(動画を見るタイプのもの)の申し込みを行ってArduino UNO R4 Minima(以下ArduinoR4とする)を入手しました。好評だったようですでに、ArduinoR4の配布は終了しているようです。

www.renesas.com

せっかく頂いたので動画を見ながらLチカを行いました。最近は、ArduinoR4よりRaspberryPiというような事が多いので、久しぶりのArduinoになります。大きくは変わってはいないとは思いますが、IDEも2系にバージョンアップして結構時間が経っているので、リハビリを兼ねて使用のメモを残そうと思います。

Arduino IDEのダウンロードとインストール

久しぶりにArduinoのサイトにアクセスを行ったところ、デザインがガラッと変わってしまってダウンロードどこだ🫠?って感じになってました。メニューにもダウンロードはないし、ソフトエアも表示されておらず、迷いましたがようやくボタンを見つけました。一番わかりやすいところにありますが、ボタンだとは…

ボタンを押すと、ようやくARDUINO SOFTWAREの文字が出てきます。下にある、ダウンロード先のリンクをクリックします。

ここからの画面は以前にもあったところなのでわかりやすいです。使用するOSのパッケージのリンクをクリックします。自分はWindowsなのでインストーラー付きバイナリ(MSIではない方)を選択してダウンロードしました。

あとはダウンロードをしていけばOKです。

ダウンロードすると以下のファイルが入手できます。

あとはインストールを行うだけです。

インストール後はパッケージやサンプルなどのダウンロードが行われるので、しばらくまちます。ひとしきり処理が終わったら言語を日本語しておきましょう。

これでダウンロードとインストールは完了です。

ArduinoR4を接続し、Lチカを行う

ArduinoR4をUSBケーブルで接続し、ウインドウ上部のプルダウンから接続ボードとシリアルポートを選択すると、自動的にArduinoR4のドライバがインストールされます。特にこのあたりの作業では苦労はしません。

ここまでくれば、あとはスケッチファイルを編集してLチカを行います。

参考

www.arduino.cc

/*
  Blink

  Turns an LED on for one second, then off for one second, repeatedly.
(中略)
  This example code is in the public domain.

  https://www.arduino.cc/en/Tutorial/BuiltInExamples/Blink
*/

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);  // turn the LED on (HIGH is the voltage level)
  delay(1000);                      // wait for a second
  digitalWrite(LED_BUILTIN, LOW);   // turn the LED off by making the voltage LOW
  delay(1000);                      // wait for a second
}

ArduinoR4も本体にLEDがあり、D13ポートにLEDが接続をしているようです。上記のコードをコンパイルしてダウンロードすれば無事にLチカ完成です。このあたりはおなじみの作業です。

USBのHIDデバイスエミュレートのサンプルコードにもチャレンジ

動画セミナーの中ではUSBHIDデバイスの動作についての言及がありました。以前から対応していると知っていたのですが、使ったことがなかったので今回はLチカの応用としてこちらも動作させてみました。

ところが、ここでハマります😭

メニューの【ファイル】>【スケッチ例】>【09.USB】>【KeyboardAndMouseControl】を選択してスケッチ例を開きます。このコードはシリアルポートから文字(u,d,l,r,m)を送信するとそれに合わせて、マウスを上下左右に動かす、マウスの左ボタンをクリックし、加えてデジタルPinにボタンをつけて、キーボード入力をすることもできるようです。

ただ今回はタクトスイッチなどのデバイスがなかったので、回路は作成していません。

セミナー動画ではそのまま動きますというような話だったのですが、そのままで動作しませんでした。回路を組んでいないのが原因?かなと思ったのですが、ポートの接続を行っていなければ電圧はLOWになっているはず(コードでは確認してみた)なのでそのままでも大丈夫と思っていたのですが。

ネットで調べると以下の情報がありました。知り合いだった😊

qiita.com

こちらで紹介されている中でも回路部分の処理はオミットされていました😭

※ とりあえずのお試しに、電子工作パーツを取り出してくるのが面倒だったとも言う...

そこから、いろいろ調べて見た結果、D6の入力処理(digitalRead(mouseButton)の判定処理)のON/OFF時の処理のみをコメントアウトするとうまく動くようになりました。ArduinoR4ではまだ対応されていない部分があるのかもしれません。

/*
  KeyboardAndMouseControl

  Controls the mouse from five pushbuttons on an Arduino Leonardo, Micro or Due.
(中略)
  This example code is in the public domain.

  https://www.arduino.cc/en/Tutorial/BuiltInExamples/KeyboardAndMouseControl
*/

#include "Keyboard.h"
#include "Mouse.h"

// set pin numbers for the five buttons:
const int upButton = 2;
const int downButton = 3;
const int leftButton = 4;
const int rightButton = 5;
const int mouseButton = 6;

void setup() {  // initialize the buttons' inputs:
  pinMode(upButton, INPUT);
  pinMode(downButton, INPUT);
  pinMode(leftButton, INPUT);
  pinMode(rightButton, INPUT);
  pinMode(mouseButton, INPUT);

  Serial.begin(9600);
  // initialize mouse control:
  Mouse.begin();
  Keyboard.begin();
}

void loop() {
  // use serial input to control the mouse:
  if (Serial.available() > 0) {
    char inChar = Serial.read();

    switch (inChar) {
      case 'u':
        // move mouse up
        Mouse.move(0, -40);
        break;
      case 'd':
        // move mouse down
        Mouse.move(0, 40);
        break;
      case 'l':
        // move mouse left
        Mouse.move(-40, 0);
        break;
      case 'r':
        // move mouse right
        Mouse.move(40, 0);
        break;
      case 'm':
        // perform mouse left click
        Mouse.click(MOUSE_LEFT);
        break;
    }
  }

  // use the pushbuttons to control the keyboard:
  if (digitalRead(upButton) == HIGH) {
    Keyboard.write('u');
  }
  if (digitalRead(downButton) == HIGH) {
    Keyboard.write('d');
  }
  if (digitalRead(leftButton) == HIGH) {
    Keyboard.write('l');
  }
  if (digitalRead(rightButton) == HIGH) {
    Keyboard.write('r');
  }
  if (digitalRead(mouseButton) == HIGH) {
    //Keyboard.write('m'); // この行をコメントアウトするとうまく動く
  }
}

それ以外の箇所をコメントアウトしても動作に変化はなかったのですが、なぜかこの部分をコメントアウトすると動作するようになりました。原因知りたい…

おわりに

積み基板になりそうだったArduinoR4をようやく使用することができた(Lチカしたぐらいで解消といえるのか…)感じですが、今回はArduinoでもUSBのHIDデバイスのエミュレートができることがわかったのが今回の収穫でしょうか。

ルネサスさんArduino UNO MINIMAいただきまして、ありがとうございました!

/* -----codeの行番号----- */