2016/04/10からのアクセス回数 5379
ジェスチャーセンサを調べて以下のサイトを見つけました。
そこで、秋月で600円で販売されているAPDS9960の存在を知りました。
製造元のサイト によると、このセンサはとても優れもので、以下の機能を持っています。
このセンサの仕組は以下のサイトで丁寧に紹介されています。
また、Arduinoを使ったスケッチが以下のサイトに紹介されています。
APDS9960を使ってArduino勉強会に参加される子供たちに受けの良さそうな例題を探したところ、 以下のサイトを見つけました。
このサンプルには、Sparkfun版のライブラリが必要です。 Arduino IDEのメニューで「Include library」→「Manage library」を選択してライブラリマネジャーを開き、 そこでAPDS-9660を検索すると簡単にインストールできます。
また、以下のサイトからもダウンロードできます。
APDS9960は3.3Vを使用するので、Arduino勉強会でも紹介した 作って遊べるArduino互換機 の3.3Vを使って動かしてみます。
Arduino Uno互換機3.3V版との接続は、以下の様にします。
Arduino | APDS-9960 |
3.3V | LED |
3.3V | VDD |
GND | GND |
D2 | INT |
A4 | SDA |
A5 | SCL |
上記サイトのサンプルプログラムからGestureTestDueP5.inoの内容を新規スケッチにコピーし、 Arduino Uno互換機3.3V版に書き込みます。 シリアルモニターを開いて、センサの上に手をかざして左右上下に動かしてみると、 数値が1個ずつ表示されます。 これでセンサのジェスチャ機能が正常に動作することが確認できました。
シリアルモニターを閉じて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を実行するとウィンドウが表示され、センサの上に手をかざすと 画面の色が変わります。
ジェスチャーセンサAPDS9660の動作確認ができたので、 これを使って空中で手を動かすとスクロールキーをPCに送るキーボードを作ってみましょう。
Arduino Leonardには、ArduinoをマウスやキーボードにするためのクラスMouseとKeyboardが用意 されています。今回はArduino/ATmega32UのArduino化で紹介したArduino Leonard互換ボード ATmega32u4を使ってブレッドボードに以下のような回路を組みました。
LeonardではD2がSDA、D3がSCLとなっているので、スケッチを作成するときには注意してください。
以下にATmega32u4とAPDS9960の結線を示します。 *1
ATmega32u4のピン | Arduino Leonard | APDS9960 |
3.3Vを生成 | 3.3V | LED |
| 3.3Vを生成 | 3.3V | VDD |
- | - | INT |
D1 | D2 | SDA |
D0 | D3 | SCL |
以下のサンプルスケッチでは、上下の動きにはスクロールキーを、左右の動きにはカーソルキーを割り当てました。 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: ; } } }
皆様のご意見、ご希望をお待ちしております。勉強会で分からなかったこと等、お気軽に問い合わせて下さい。
スパム防止に画像の文字列も入力してください。