Arduino勉強会

2016/04/10からのアクセス回数 4868

光学ジェスチャーセンサ

ジェスチャーセンサを調べて以下のサイトを見つけました。

そこで、秋月で600円で販売されているAPDS9960の存在を知りました。

製造元のサイト によると、このセンサはとても優れもので、以下の機能を持っています。

このセンサの仕組は以下のサイトで丁寧に紹介されています。

また、Arduinoを使ったスケッチが以下のサイトに紹介されています。

子供たちにうけの良さそうな例題

APDS9960を使ってArduino勉強会に参加される子供たちに受けの良さそうな例題を探したところ、 以下のサイトを見つけました。

このサンプルには、Sparkfun版のライブラリが必要です。 Arduino IDEのメニューで「Include library」→「Manage library」を選択してライブラリマネジャーを開き、 そこでAPDS-9660を検索すると簡単にインストールできます。

また、以下のサイトからもダウンロードできます。

Arduino Uno互換機3.3V版を使って例題を試す

APDS9960は3.3Vを使用するので、Arduino勉強会でも紹介した 作って遊べるArduino互換機 の3.3Vを使って動かしてみます。

Arduino Uno互換機3.3V版との接続は、以下の様にします。

ArduinoAPDS-9960
3.3VLED
3.3VVDD
GNDGND
D2INT
A4SDA
A5SCL

Uno-apds9960.png

上記サイトのサンプルプログラムからGestureTestDueP5.inoの内容を新規スケッチにコピーし、 Arduino Uno互換機3.3V版に書き込みます。 シリアルモニターを開いて、センサの上に手をかざして左右上下に動かしてみると、 数値が1個ずつ表示されます。 これでセンサのジェスチャ機能が正常に動作することが確認できました。

Serial_monitor.png

シリアルモニターを閉じてProcessingを起動し、gesture.pdeを開きます。 Arduinoのシリアルポートで接続されたポートの番号(0始まりで何番目かをメモし、 setup関数のSerial.list()[n];のnの部分を変更します。

void setup() {
  size(800, 600);
  String arduinoPort = Serial.list()[3];
  port = new Serial(this, arduinoPort, 19200);
  background(0);
}

スケッチメニューのRunを実行するとウィンドウが表示され、センサの上に手をかざすと 画面の色が変わります。

GestureScroll

ジェスチャーセンサAPDS9660の動作確認ができたので、 これを使って空中で手を動かすとスクロールキーをPCに送るキーボードを作ってみましょう。

Arduino Leonardには、ArduinoをマウスやキーボードにするためのクラスMouseとKeyboardが用意 されています。今回はArduino/ATmega32UのArduino化で紹介したArduino Leonard互換ボード ATmega32u4を使ってブレッドボードに以下のような回路を組みました。

GestureScroll-pict.png

APDS9960とATmega32u4との接続

LeonardではD2がSDA、D3がSCLとなっているので、スケッチを作成するときには注意してください。

以下にATmega32u4とAPDS9960の結線を示します。 *1

ATmega32u4のピンArduino LeonardAPDS9960
3.3Vを生成3.3VLED
3.3Vを生成3.3VVDD
未接続未接続INT
D1D2SDA
D0D3SCL

特殊キーコード一覧

以下のサンプルスケッチでは、上下の動きにはスクロールキーを、左右の動きにはカーソルキーを割り当てました。 ArduinoのKeyboardで使えるキーは、以下のサイトを参照してください。

スケッチを描く

以下のスケッチをATmega32u4に書き込むとジェスチャースクロールの完成です。 ブラウザーで手を上下に動かしてみて下さい。

/****************************************************************
Shawn Hymel @ SparkFun Electronics May 30, 2014
modified by musashinodenpa 2015

Hardware Connections:
IMPORTANT: The APDS-9960 can only accept 3.3V!
 Arduino Pin  APDS-9960 Board  Function
 3.3V         VCC              Power
 GND          GND              Ground
 A4           SDA              I2C Data
 A5           SCL              I2C Clock
 2            INT              Interrupt
****************************************************************/
/**
 上記のサンプルを参考にキーボードに応用
 竹本 浩 (2016/04/09)
 対象のボードはスイッチサイエンスのATmega32u4ボード
 初期のボードで、基板のポート番号にATmega32u4のポート番号が記載されている
 
 5Vなので、APDS-9960へは3.3Vを供給
 ATmega32u4 Pin APDS-9960      Function
 Converted 3.3V VCC            Power
 GND            GND            Ground
 D1(SDA)        SDA            I2C Data
 D0(SCL)        SCL            I2C Clock
 D1(Interrup0)  INT            Interrupt
 */

#include <Wire.h>
#include <SparkFun_APDS9960.h>

// Global Variables
SparkFun_APDS9960 apds = SparkFun_APDS9960();
int isr_flag = 0;
uint8_t proximity_data = 0;

void setup() {

  // 割込の初期化(2番ピンはLeonardではSDAに割り当てられている)
  pinMode(2, INPUT_PULLUP);
  // キーボードになる前に0.5秒待つ
  delay(500);
  // キーボードの初期化
  Keyboard.begin();  

  // 割込処理の初期化
  attachInterrupt(0, interruptRoutine, FALLING);

  // APDS-9960の初期化
  apds.init();

  // ジェスチャーエンジン開始
  apds.enableGestureSensor(true);
  
}

void loop() {
  if ( isr_flag == 1 ) {
    detachInterrupt(digitalPinToInterrupt(2));
    handleGesture();
    isr_flag = 0;
    attachInterrupt(digitalPinToInterrupt(2), interruptRoutine, FALLING);
  }
}

void interruptRoutine() {
  isr_flag = 1;
}

void handleGesture() {
  if ( apds.isGestureAvailable() ) {
    // ジェスチャーに応じてカーソル移動とスクロールを実行する
    int c = apds.readGesture();
    switch (c) {
    case 1:
      Keyboard.write(KEY_RIGHT_ARROW);
      break;
    case 2:
      Keyboard.write(KEY_LEFT_ARROW);
      break;
    case 3:
      Keyboard.write(KEY_PAGE_UP);
      break;
    case 4:
      Keyboard.write(KEY_PAGE_DOWN);
      break;
    default:
      ;
    }
  }
}

コメント

選択肢 投票
おもしろかった 1  
そうでもない 0  
わかりずらい 0  

皆様のご意見、ご希望をお待ちしております。勉強会で分からなかったこと等、お気軽に問い合わせて下さい。

スパム防止に画像の文字列も入力してください。


(Input image string)

*1 最初の例題ではD2が割込に使用されていましたが、LeonardではそのピンがSDAと重なっていますが、何とか動いています。

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
SmartDoc