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

2022年1月15日土曜日

Arduino LeonardoでUSBキーボード作成

 Arduinoの中でもArduino LeonardoはパソコンのUSB外付けキーボードやUSB外付けマウスとして動かすことができるようなので,やってみました.

ハードウェア

以下の部品を購入しました.



今回使用したM5Stack用のカード型キーボードユニットは,元々M5Stack用なのですが,Grove Aポート(I2Cインターフェース)で接続できるため,Arduinoでも使用できるようなので,使ってみました.
I2Cのアドレスは0x5Fに固定されています.
以下のように接続します.キーボードユニットはGROVEシールドのI2Cのコネクタに接続しました.

プログラミング

第一段階:キーボードから入力したコードをシリアルコンソールに表示

まず,入力されたキーコードを確認するために,シリアルコンソールに表示しました.ソースコードは以下のとおりです.

/*
 * I2Ckbd1
 * 2022/1/13
 * M5Stack用のI2CキーボードからArduinoでキー読み込み
 * コードが来るのでシリアルコンソールに表示する
 */

#include <Wire.h>
// I2C kbd
#define AclSenAdrs 0x5F
unsigned char AclSen;

void setup() {
  Wire.begin();
  Serial.begin(9600);
}

void loop() {
  int byteAvailable;

  // ArduinoがI2Cのマスター側になる
  Wire.beginTransmission(AclSenAdrs);
  // レジスタアドレスを定義する
  Wire.write(0x00);
  Wire.endTransmission();

  // レジスタアドレスから1アドレス分のデータを読む
  Wire.requestFrom(AclSenAdrs, 1);
  // 読み込めるバイト数(常に1が返る)
  byteAvailable = Wire.available();
  if ( byteAvailable > 0) {
    AclSen = Wire.read();
    // 0が返って来た時はキーが押されていない
    // キーが押されていたらコードが来る
    if (AclSen > 0) {
      Serial.println(AclSen);
    }
  }
  delay(50);
}

プログラムを書き込んだ後でシリアルコンソールを表示すると,押したキーのコードが表示されます.

第二段階:パソコンに対してキーボードとしての動作を確認

次に,USBキーボードとしての動作を確認しました.ソースコードは以下のとおりです.

/*
 * I2Ckbd2
 * 2022/1/15
 * Arduino Leonardoを,USB接続したパソコンのkbd, mouseにする
 * 書き込んだ後は常にキー入力があるので,最後のコメント内にカーソル
 * を置いてArduinoをUSBに接続し,コンパイル・書き込みする
 */

#include <Keyboard.h>

void setup() {
  Keyboard.begin();
}

void loop() {
  Keyboard.print("Hello World");
  delay(1000);
}

/*
 
 */

一度このソースコードを書き込むと,USBでパソコンに繋いでいる間,ずっとキー入力があるので,次の書き込みがなかなかできません.なので,2回目以降はArduinoソフトウェアで,コメント欄を作成しておいて,ここにカーソルを置いてからArduinoを USBでパソコンと接続すると,入力されてくる文字列が全てコメントとなるので,次のプログラムが書き込み可能になります.

第三段階:特定のキーが入力されたらまとめて文字列をパソコンに入力

ソースコードは以下のとおりです.

/*
 * I2Ckbd3
 * 2022/1/15
 * Arduino Leonardoを,USB接続したパソコンのkbd, mouseにする
 * 'h'を押したら'Hello World'をキーボードとして入力する
 */

#include <Wire.h>
#include <Keyboard.h>
// I2C kbd
#define AclSenAdrs 0x5F
int AclSen;


void setup() {
  Wire.begin();
  Keyboard.begin();
}

void loop() {
  int byteAvailable;
  Wire.beginTransmission(AclSenAdrs);
  Wire.write(0x00);
  Wire.endTransmission();

  Wire.requestFrom(AclSenAdrs, 1);
  byteAvailable = Wire.available();
  if (byteAvailable > 0) {
    AclSen = Wire.read();
    if (AclSen > 0) {
      if (AclSen == 'h') {
        Keyboard.print("Hello World");        
      }
    }
  }
  delay(50);
}

自作キーボードとして便利なのが,特定のキーでまとまった文字列を入力できる機能を組み込めることです.ここでは,キーボードで'h'キーを押すと,パソコンに'Hello World'という文字が入力されます.

第四段階:通常のキーボードとして使用

最後に,通常のキーボードとして使えるようにする作業です.普通の表示可能文字はASCIIコードが送信されるのですが,制御コードなどはキーコードとASCIIコードが異なるので,調整する必要があります.最初に処理したのがEnterキーで,そのままキーを押すと0x0dが来ます.Macでやっているので,ターミナルなどでは0x0aを入力しないと改行コードとして認識されません.その他に上下左右の矢印キーを対応してみました.キーボードとして送信できるコードの一覧はここにあります.一方で,入力されるコードの一覧は製品のページにあります.これらを比較して,違うコードを置き換えます.とりあえず上下左右とEnter,ESCを対応しました.ソースコードは以下のとおりです.

/*
 * I2Ckbd3
 * 2022/1/15
 * Arduino Leonardoを,USB接続したパソコンのkbd, mouseにする
 * 押されたキーコードを送信
 * scanするキーコードはI2Ckbd1で確認する.以下のコードが来ている.
 * https://docs.m5stack.com/en/unit/cardkb
 * 送信できるキーコードは以下
 * https://www.arduino.cc/reference/en/language/functions/usb/keyboard/keyboardmodifiers/
 */

#include <Wire.h>
#include <Keyboard.h>
// I2C kbd
#define AclSenAdrs 0x5F

#define KEY_ESC 0xb1
#define KEY_UP_ARROW 0xda
#define KEY_DOWN_ARROW 0xd9
#define KEY_LEFT_ARROW 0xd8
#define KEY_RIGHT_ARROW 0xd7

void setup() {
  Wire.begin(AclSenAdrs);
  Keyboard.begin();
}

void loop() {
  Wire.beginTransmission(AclSenAdrs);
  Wire.write(0x00);
  Wire.endTransmission();
  
  Wire.requestFrom(AclSenAdrs, 1);
  while (Wire.available()) {
    unsigned char c = Wire.read();
    switch (c) {
    case 0x0d: // 13 Enter
      Keyboard.write(0x0a);
      break;
    case 0x1b: // 27 ESC
      Keyboard.write(KEY_ESC);
      break;
    case 0xb4: // 180 Left
      Keyboard.write(KEY_LEFT_ARROW);
      break;
    case 0xb5: // 181 Up
      Keyboard.write(KEY_UP_ARROW);
      break;
    case 0xb6: // 182 Down
      Keyboard.write(KEY_DOWN_ARROW);
      break;
    case 0xb7: // 183 Right
      Keyboard.write(KEY_RIGHT_ARROW);
      break;
    default:
      Keyboard.write(c);  
    }
  }
  delay(50);
}



2019年8月12日月曜日

ESP-WROOM-02で9軸センサーBMX055を使う

I2Cで使えるBMX055 9軸センサーモジュール秋月のESP-WROOM-02ボードから使ってみました.

I2Cの配線について

BMX055は以下の端子が出ています.

  • ピン1: GND
  • ピン2: SDA (I2Cデータ)
  • ピン3: SCL: (I2Cクロック)
  • ピン4: 3V3 (BMX055用電源端子)

一方,こちらのページを参照すると,ESP8266のI2C端子は以下のようになっています.

  • SDA: 10(IO4)
  • SCL: 14(IO5)
これが,秋月のESP-WROOM-02ボードでは以下のピンに出ています.
  • ピン12: IO4 (SDA)
  • ピン16: IO5 (SCL)
ESP8266用のWireライブラリでも,これを使うことになっているようです.そこで,以下のように配線しました.

接続にあたって,Arduinoの場合と同様,JP4とJP5をpull upのために半田付けしました.電源は3.3Vを取っているので,とりあえず他の場所は触っていません.


プログラム

まずは,9軸センサーから読んだデータをシリアルポートに書き出して,Arduino IDEのシリアルモニタで表示することにしました.

秋月電子のBMX055のページにあるサンプルプログラムそのままでは動きませんでした.
27行目から29行目の
int xMag = 0;
int yMag = 0;
int zMag = 0;

short int xMag = 0;
short int yMag = 0;
short int zMag = 0;
に,
154行目と180行目の
int data[6];

unsigned char data[6];
に,
207行目の
int data[8];

unsigned short int data[8];
に書き換えたところ,それらしいデータが出てくるようになりました.

プログラムを動かすには,プログラムを書き込んだ後,リセットボタンを押す必要があります.

参照ページ:
ESP-WROOM-02ボードのI2C関係のピン配置 http://radiopench.blog96.fc2.com/blog-entry-661.html

秋月のESP-WROOM-02開発キットをmac OS上のArduino IDEから使えるようにする

Arduino開発環境からArduinoと同様にプログラミングができて,WiFiやBluetoothが使えるマイコンボードとして,秋月電子通商でESP-WROOM-02開発キットを購入しました.このボードは書き込み用のUSBジャックまで付いているので,パソコンとUSBケーブルで接続するだけで,すぐにプログラミング・書き込みが可能です.

ただ,素のArduino開発環境ではこのボードに対応していないので,追加インストールが必要です.

まず,Arduino IDEをインストールします.http://www.arduino.ccにアクセスして,上のメニューから「SOFTWARE」→「DOWNLOADS」をクリックします.

使用環境がmacOS 10.15 (Catalina) betaなので,ここではnightly buildsをダウンロード・インストールします.

zipファイルをダブルクリックするとアプリケーションが解凍されます.これを/Applicationsディレクトリにdrag&dropし,ダブルクリックして起動します.起動の際に,下記のようなワーニングが出て起動できません.
「システム環境設定」アプリの「セキュリティとプライバシー」にアクセスし,「ダウンロードしたアプリケーションの実行許可」で実行許可を出します(結局,自分の環境ではこれでも動かず,SIPをdisableにして実行しました).

環境設定から,ESP8266の開発ができるように追加のボードマネージャーをインストールします.まず,Arduino IDEを起動したら,メニューバーの「Arduino」をクリックし,「Preferences」をクリックして環境設定画面を開きます.「追加のボードマネージャのURL:」欄に以下のように記入します.

http://arduino.esp8266.com/stable/package_esp8266com_index.json

OKボタンを押して環境設定を終了します.

次に,メニューバーの「ツール」→「ボード」から「ボードマネージャ」をクリックし,選択します.

ボードマネージャーが開いたら,一番下までスクロールし,esp8266を確認し,「インストール」ボタンをクリックします.
ボードの定義は44Mbytesほどあるので,待ちます.ダウンロードが終了したら,メニューバーの「ツール」→「ボード」→「Generic ESP8266 Module」が選択可能になっているので,これを選択します.
「ツール」メニューで設定を以下のように書き換えます.
  • 書き換え場所:
  • Upload Speed: 115200 → 921600
  • CPU Frequency: 80MHz → 160MHz
  • Flash Size: 512K (no SPIFFS) → 4M (3M SPIFFS)
  • Flash Mode: DIO → QIO (fast)
  • Flash Frequency: 40MHz → 80MHz


書き換え前:
書き換え後:

シリアルポートを設定します./dev/cu.usbserial-????????に設定します.

これで設定が終了しました.

プログラムの書き込みの際には,以下のようにボタンを押して書き込みモードにする必要があります.
  1. デフォルト状態:RSTとPGMが両方押されていない
  2. リセット状態:RSTとPGMが両方押されている
  3. 書き込み準備状態:PGMが押されて,RSTは離されている.
  4. 書き込み可能状態:RSTとPGMが両方押されていない.

一言でいうと,PGMボタンを押した状態でRSTボタンを押して離し,そのあとでPGMボタンを離すと書き込み可能状態になります.

書き込みの一連の操作は以下のようになります.ここでは,Arduinoを立ち上げてプログラムを何も書いてない状態で書き込みのテストをしてみます.

まず,Arduinoで書き込み操作を行います.ウィンドウ下部に「Connecting......」というメッセージが表示されます.

ここで上記のボタンの操作を行うと,書き込みが始まります.

以下のように表示されれば書き込み終了です.

プログラムを書き込んだ後,そのままではプログラムの動作が始まらないようです.RSTボタンを一回押すと動作が始まります.

これで,Arduino IDEでESP-WROOM-02ボードの開発ができるようになりました.

2019年8月7日水曜日

9軸センサー(加速度,ジャイロ,地磁気)のデータを使う (1)

秋月電子で9軸センサーBMX055モジュールを購入してみました.これは,加速度3軸,ジャイロ3軸,地磁気3軸のセンサーで,Arduinoから簡単にデータが取れるようです.チップ自体は3.3V電源ですが,モジュール上にFXMA2102が載っていて,I2Cの電圧変換をしてくれるので,Arduinoの5V入出力でも使えるようです.

まず,マニュアルに従ってJP4, 5, 6を半田でショートした後,ジャンパーピンを接続し,配線しました.Arduino側がこんな感じ.

BMX055側はこんな感じ.

全体はこんな感じ.

とりあえず,サンプルソースコードを取得して,このソースコードに書いてある通りにArduinoと結線しました.

Arduinoのシリアルコンソールを開くと,9軸の値がちゃんと取れているようです.

あとやることは,以下のとおりです.

  • ジャイロのデータを使って,加速度から,重力加速度とモジュール自体の加速を分離する.
  • OSCデータで送るようにする.
  • WiFiでパソコンに飛ばす.
最終的には,ZIG SIMの置き換えを狙ってます.