2018年5月19日土曜日

SparkFun Pro Micro(ATmega32u4)の素行調査とJoystickMouse

この前に続き、SparkFun Pro Microの素行調査、まだやってます。
元々、USB Serial+HIDを同時に実現できるArduino互換機ということで
ポチっておりましたので、その辺を確認しておきたいのです。

手元のSparkFun Pro Micro(ATmega32u4) Cloneは、これです。
ん? 改めて商品タイトルを読むと「For Leonardo」とありますね~
後で確認することにします。

SparkFunのサイトのここの[Documents]から
Schematic(PDF)、Graphical Datasheet(PDF)等が入手できます。
この図は、便利そうなので拝借m(_ _)m
www.sparkfun.com
手始めに、Arduino IDE v.1.8.3の
[スケッチの例]-[09.USB]-[Keyboard]-[KeyboardSerial]から。
シリアルモニタから文字を送信すると、 USB Keyboardとして文字を返しますが、
例えば「A」送信で、キーコードの次「B」を返すというシンプルなスケッチです。
使ったスケッチは、これです。
Arduino Leonardo、Micro、Duo用とあります。
USB-SerialとUSB-Keyboard同時は、ATmega32u4じゃないとできないのです。
これは、外部回路は不要です。
*****
/*
 Keyboard test

 For the Arduino Leonardo, Micro or Due

 Reads a byte from the serial port, sends a keystroke back.
 The sent keystroke is one higher than what's received, e.g.
 if you send a, you get b, send A you get B, and so forth.

 The circuit:
 * none

 created 21 Oct 2011
 modified 27 Mar 2012
 by Tom Igoe

 This example code is in the public domain.

 http://www.arduino.cc/en/Tutorial/KeyboardSerial
 */

#include "Keyboard.h"

void setup() {
  // open the serial port:
  Serial.begin(9600);
  // initialize control over the keyboard:
  Keyboard.begin();
}

void loop() {
  // check for incoming serial data:
  if (Serial.available() > 0) {
    // read incoming serial data:
    char inChar = Serial.read();
    // Type the next ASCII value from what you received:
    Keyboard.write(inChar + 1);
  }
}
*****

Arduino IDE v.1.8.3のこの設定で書き込みます。
例によって、これがちらっと出て
*****
 シリアルポート「COM12」を1200bpsで開いて閉じる事によって、
 リセットを行っています。
 PORTS {COM12, } / {} => {}
 PORTS {} / {COM11, } => {COM11, }
 Found upload port: COM11
*****
COM12が消え、COM11が現れます。
前回じっくり経験しているのでビビりません!
書き込みが完了するとすぐに
デバイスドライバ「SparkFun Pro Micro」のセットアップが始まり
ほどなく完了します。
デバイスマネージャーを見ると
4つ増えています。
ポート(COMとLPT)は、「USB シリアル デバイス(COM12)」⇒ COM14
変わっています。
Arduino IDEのシリアルモニタをCOM14にして
「A」ENTERすると
([送信]ボタンではダメで、ENTERじゃないといけません)
入力欄が「B」に書き換えられました。
ちなみに「1」ENTERでは、「2」に変わります。
USB SerialとUSB Keyboardが同時に実現できたわけです。

そして、Arduino IDE v.1.8.3の標準サンプルに
[スケッチの例]-[09.USB]-[Mouse]-[JoystickMouseControl]
が、あるのを知りました。
ノリでポチっていたジョイスティックが使えそうなのです。
一応、スケッチをコピペしておきます。
これもArduino Leonardo、Micro、Duo用とあります。
スケッチは、十分理解できておりませんが、動きは予想できるので、
いきなりやってみることにします。
*****
/*
  JoystickMouseControl

 Controls the mouse from a joystick on an Arduino Leonardo, Micro or Due.
 Uses a pushbutton to turn on and off mouse control, and
 a second pushbutton to click the left mouse button

 Hardware:
 * 2-axis joystick connected to pins A0 and A1
 * pushbuttons connected to pin D2 and D3

 The mouse movement is always relative. This sketch reads
 two analog inputs that range from 0 to 1023 (or less on either end)
 and translates them into ranges of -6 to 6.
 The sketch assumes that the joystick resting values are around the
 middle of the range, but that they vary within a threshold.

 WARNING:  When you use the Mouse.move() command, the Arduino takes
 over your mouse!  Make sure you have control before you use the command.
 This sketch includes a pushbutton to toggle the mouse control state, so
 you can turn on and off mouse control.

 created 15 Sept 2011
 updated 28 Mar 2012
 by Tom Igoe

 this code is in the public domain

 */

#include "Mouse.h"

// set pin numbers for switch, joystick axes, and LED:
const int switchPin = 2;      // switch to turn on and off mouse control
const int mouseButton = 3;    // input pin for the mouse pushButton
const int xAxis = A0;         // joystick X axis
const int yAxis = A1;         // joystick Y axis
const int ledPin = 5;         // Mouse control LED

// parameters for reading the joystick:
int range = 12;               // output range of X or Y movement
int responseDelay = 5;        // response delay of the mouse, in ms
int threshold = range / 4;    // resting threshold
int center = range / 2;       // resting position value

boolean mouseIsActive = false;    // whether or not to control the mouse
int lastSwitchState = LOW;        // previous switch state

void setup() {
  pinMode(switchPin, INPUT);       // the switch pin
  pinMode(ledPin, OUTPUT);         // the LED pin
  // take control of the mouse:
  Mouse.begin();
}

void loop() {
  // read the switch:
  int switchState = digitalRead(switchPin);
  // if it's changed and it's high, toggle the mouse state:
  if (switchState != lastSwitchState) {
    if (switchState == HIGH) {
      mouseIsActive = !mouseIsActive;
      // turn on LED to indicate mouse state:
      digitalWrite(ledPin, mouseIsActive);
    }
  }
  // save switch state for next comparison:
  lastSwitchState = switchState;

  // read and scale the two axes:
  int xReading = readAxis(A0);
  int yReading = readAxis(A1);

  // if the mouse control state is active, move the mouse:
  if (mouseIsActive) {
    Mouse.move(xReading, yReading, 0);
  }

  // read the mouse button and click or not click:
  // if the mouse button is pressed:
  if (digitalRead(mouseButton) == HIGH) {
    // if the mouse is not pressed, press it:
    if (!Mouse.isPressed(MOUSE_LEFT)) {
      Mouse.press(MOUSE_LEFT);
    }
  }
  // else the mouse button is not pressed:
  else {
    // if the mouse is pressed, release it:
    if (Mouse.isPressed(MOUSE_LEFT)) {
      Mouse.release(MOUSE_LEFT);
    }
  }

  delay(responseDelay);
}

/*
  reads an axis (0 or 1 for x or y) and scales the
 analog input range to a range from 0 to <range>
 */

int readAxis(int thisAxis) {
  // read the analog input:
  int reading = analogRead(thisAxis);

  // map the reading from the analog input range to the output range:
  reading = map(reading, 0, 1023, 0, range);

  // if the output reading is outside from the
  // rest position threshold,  use it:
  int distance = reading - center;

  if (abs(distance) < threshold) {
    distance = 0;
  }

  // return the distance for this axis:
  return distance;
}
*****
まずは、スケッチを書き込みます。配線は後です。
COM14が消え、COM11が現れます。
書き込み時は、常に「Arduino Micro bootloader(COM11)」が出現します。
書き込みが終わるとすぐに消えます。
書き込みが完了するとすぐに
また、デバイスドライバのセットアップが始まり
ほどなく完了します。
うっぷ!カーソルがデスクトップの左上端に張り付いて動きません!
まだ、アナログ入力に何も繋いでないからですね~。
一旦、外して配線します。
スケッチのコメントでは、
 A0:X軸
 A1:Y軸
 D2:Joystick Mouse機能を有効にする
 D3:Mouseの左ボタン
 D5:MouseControl有効表示のLED
とあります。
実験なので、A0、A1、D2だけ配線することにします。
Fritzing Partsは、近いやつから作りました。
Joystickは、これです。
X、Y軸に可変抵抗器。
右下のタクトスイッチは、ノブを押すとGNDに落ちます。

配線完了!
ピンヘッダのハンダ付けが面倒で、この様な事になっております^^;
デバイスマネージャーを確認すると、4つ増えています。
今度は、キーボードの[HIDキーボードデバイス]はなく、
マウスの所に[HID準拠マウス]が現れています。
ポート(COMとLPT)は、「USB シリアル デバイス(COM14)」⇒ COM15に!
毎回増えていくんでしょうかね?
では、動画で
面白いというか、こんなに簡単にマウスの様なUSBデバイスが作れることに感激!
実は、D2は、HIGHアクティブであることに、今頃気づきました(-_-;)
Joystickのノブで押すSWは、押すとGNDなのです。
D2にPull UP抵抗をつければ、スケッチはそのままでもトグル動作しますが、
設計者の意図「起動時Control OFF」になるようにD2をLOWアクティブにします。
スケッチの次の2箇所(赤文字部)を変更します。
*****
 int lastSwitchState = HIGH;        // previous switch state
*****
*****
  if (switchState == LOW) {
*****
D2にPull-UP抵抗を外付けしてもいいのですが、
スケッチを変更(赤文字部)して内蔵Pull-UP抵抗を使ってみます。
_PULLUP」を追加するだけなので便利です。
*****
 pinMode(switchPin, INPUT_PULLUP);       // the switch pin
*****
ちなみにATmega32u4のDatasheetを見ると
I/O pinのPull-Up抵抗値:20K~50KΩ だそうです。

動作確認するとJoystickのノブ(D2)でMouse ControlのON/OFFできました。
それに合わせボード内のTX LEDがON/OFFします。
スケッチでは、Mouse Control LED:D5
回路図を見るとD5には、TX LEDが接続されていますね~
ただ、マーティーのは、LED色が回路図とは、全部異なっております。

これで、Mouse Control ON/OFFとJoystickMouseの動きを確認できました!
USBで色んな事できそうでなかなかワクワクさせられる一品です。

ついでにもう一度、最初のスケッチ
[スケッチの例]-[09.USB]-[Keyboard]-[KeyboardSerial]を書き込むと
ポート(COMとLPT)の「USB シリアル デバイス(COMxx)」は、
COM15 ⇒COM14に戻りました。

更に前回やったSparkfunサイトのここにある
ボード上のTXとRXをBlinkさせるスケッチを書き込むと
COM14 ⇒ COM12 に戻りました。これは前回と同じCOM番号です。


そういえば、最初に気になっていた、商品タイトルの「For Leonardo
「pin header For Leonardo」? Leonardo化するシールドでもあるのだろうか?
Arduino IDE v.1.8.3で「Arduino Leonardo」としてやってみることにします。


最初の「KeyboardSerial」を「Arduino Leonardo」で書き込んでみます。
途中で[Arduino Micro bootloader(COM11)]が出現して
書き込みが完了すると消えて
おっ!「Arduino Leonardo」のデバイスドライバが入りました!
デバイスマネージャーには、
目出度く[Arduino Leonardo(COM16)]が出現しています。
この時点で[ボード情報]すると
お~!「Arduino Leonardo」になっています。
一体このボードは、いくつ顔をもっているのでしょう?
また、前回やったSparkfunサイトのここにある
ボード上のTXとRXをBlinkさせるスケッチを書き込んでみます。
[Arduino/Genuino Micro]では、書込成功なのに正常動作しなかったのですが、
こちらは正常動作! ちゃんとRXとTXが交互にブリンクしています!
そしてまた、ポートが COM16 ⇒ COM17 に増加しました。

今回と前回で、Arduino IDE v.1.8.3における、このボードの挙動を整理すると
<0.書き込み時のポート名称>
・Arduino Micro bootloader(COM11)・・・下記の3つの場合で共通
(Arduino IDEが、書込時だけ一時的に、これに切り換える)

<1.ボード:Arduino/Genuino Microとして書込>
 ボード情報:Arduino/Genuino Micro
 COM名称:Arduino Micro(COMxx)
 動作:正しく動作しない(マクロ命令 TXLED0/1 だけの原因かも)
 SparkFun Pro Microのボードマネージャーを入れる前は書き込みできなかった。

<2.ボード:SparkFun Pro Micro(5V,16MHz)として書込>
 ボード情報:不明なボード
 COM名称:USBシリアルデバイス(COMxx)
 動作:動作OK

<3.ボード:Arduino Leonardoとして書込>
 ボード情報:Arduino Leonardo
 COM名称:Arduino Leonardo(COMxx)
 動作:動作OK

ブートローダーの名称は、
「Arduino Micro bootloader」なのに
「Arduino/Genuino Micro」として書き込むと正しく動作しないのです。
不思議なボードだ~

後でスケッチを見ると
TX-LEDのON/OFFにマクロ命令「TXLED1、TXLED0」を使っていて
「Arduino/Genuino Micro」が正常動作しない原因は、これかと思われます。

書き込みの妙な癖は把握できたし、USBデバイスが簡単に作れて便利そうで、
USB抜き差しでは、DigisparkのV-USBと違って確実に認識してくれるので、
もう一個ポチッておきます。
今度は、タイトルに「Leonardo」がない別のセラーのにしてみます。

いつの間にか揃い始めた、マーティーコレクション!NOWです。
では、左から(US$ x.xx:購入時の価格)
・Digispark 直挿版(ATtiny85)US$ 1.25
・Digispark USB-Micro版(ATtiny85)US$ 1.34
・SparkFun Pro Micro(ATmega32u4)US$ 3.60
・Arduino NANO(ATmega328P+CH340G)US$ 2.75
・Arduino UNO R3(ATmega328P+CH340G)US$ 2.86(今は$3超えですね~)
当然ですが、純正は、ありません^^;
後、Arduino Mega2560も揃えて置きたい一品ですね~

2 件のコメント:

JunkHack さんのコメント...

Pro Micro ATmega32U4 に興味があって参考にさせていただきました。いつも詳しく、ハマりどころも記載してあるので読むのが面白いです。また遊びに来ます!

マーティーの工房日誌 さんのコメント...

JunkHackさん応答が遅れてすみません。
嬉しいコメントありがとうございますm(_ _)m
なぜかトラップに引っ掛り易いんですよね~(-_-;)
やりたいことは沢山あるのですが~
只今、訳あって活動休止中でして...(T_T)
また宜しくお願いします。