{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"オリジナルの作成:2016/04/10"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 0U-ジェスチャースクロール\n",
"\n",
"## 光学ジェスチャーセンサ\n",
"ジェスチャーセンサを調べて以下のサイトを見つけました。\n",
"\n",
"- [自作ジェスチャセンサ](http://meerstern.seesaa.net/article/419830439.html)\n",
"\n",
"そこで、秋月で600円で販売されているAPDS9960の存在を知りました。\n",
"\n",
"- http://akizukidenshi.com/catalog/g/gK-09754/\n",
"\n",
"[製造元のサイト](http://www.avagotech.co.jp/products/optical-sensors/integrated-ambient-light-and-proximity-sensors/apds-9960)\n",
"によると、このセンサはとても優れもので、以下の機能を持っています。\n",
"\n",
"- 上下左右と接近・離反のジェスチャー検出\n",
"- 照度検出\n",
"- 接近センサ\n",
"\n",
"このセンサの仕組は以下のサイトで丁寧に紹介されています。\n",
"\n",
"- [EdisonとAPDS9960でジェスチャー認識](http://qiita.com/masato_ka/items/37a5e89602ce3d1332be)\n",
"\n",
"また、Arduinoを使ったスケッチが以下のサイトに紹介されています。\n",
"\n",
"- [ジェスチャーセンサ(APDS-9960)を動作させて見ます](http://www.geocities.jp/zattouka/GarageHouse/micon/Arduino/Gesture/APDS.htm)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 子供たちにうけの良さそうな例題\n",
"APDS9960を使ってArduino勉強会に参加される子供たちに受けの良さそうな例題を探したところ、 以下のサイトを見つけました。\n",
"\n",
"- Arduinoでも使えるジェスチャーセンサAPDS-9960\n",
"\n",
"このサンプルには、Sparkfun版のライブラリが必要です。 Arduino IDEのメニューで「Include library」→「Manage library」を選択してライブラリマネジャーを開き、 そこでAPDS-9660を検索すると簡単にインストールできます。\n",
"\n",
"また、以下のサイトからもダウンロードできます。\n",
"\n",
"- https://github.com/sparkfun/SparkFun_APDS-9960_Sensor_Arduino_Library/\n",
"\n",
"### Arduino Uno互換機3.3V版を使って例題を試す\n",
"APDS9960は3.3Vを使用するので、Arduino勉強会でも紹介した 作って遊べるArduino互換機 の3.3Vを使って動かしてみます。\n",
"\n",
"Arduino Uno互換機3.3V版との接続は、以下の様にします。\n",
"\n",
" | Arduino\t | APDS-9960 | \n",
" |---|---|\n",
" | 3.3V\t | LED | \n",
" | 3.3V\t | VDD | \n",
" | GND\t | GND | \n",
" | D2\t | INT | \n",
" | A4(SDA)\t | SDA | \n",
" | A5(SCL)\t | SCL | \n",
" \n",
"\n",
"\n",
"上記サイトのサンプルプログラムからGestureTestDueP5.inoの内容を新規スケッチにコピーし、 Arduino Uno互換機3.3V版に書き込みます。 シリアルモニターを開いて、センサの上に手をかざして左右上下に動かしてみると、 数値が1個ずつ表示されます。 これでセンサのジェスチャ機能が正常に動作することが確認できました。\n",
"\n",
"\n",
"\n",
"シリアルモニターを閉じてProcessingを起動し、gesture.pdeを開きます。 Arduinoのシリアルポートで接続されたポートの番号(0始まりで何番目かをメモし、 setup関数のSerial.list()[n];のnの部分を変更します。\n",
"\n",
"```C++\n",
"void setup() {\n",
" size(800, 600);\n",
" String arduinoPort = Serial.list()[3];\n",
" port = new Serial(this, arduinoPort, 19200);\n",
" background(0);\n",
"}\n",
"```\n",
"\n",
"スケッチメニューのRunを実行するとウィンドウが表示され、センサの上に手をかざすと 画面の色が変わります。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## GestureScroll\n",
"ジェスチャーセンサAPDS9660の動作確認ができたので、 これを使って空中で手を動かすとスクロールキーをPCに送るキーボードを作ってみましょう。\n",
"\n",
"Arduino Leonardには、ArduinoをマウスやキーボードにするためのクラスMouseとKeyboardが用意 されています。今回は\n",
"Arduino/ATmega32UのArduino化\n",
"で紹介したArduino Leonard互換ボード ATmega32u4を使ってブレッドボードに以下のような回路を組みました。\n",
"\n",
"\n",
"\n",
"\n",
"### APDS9960とATmega32u4との接続\n",
"LeonardではD2がSDA、D3がSCLとなっているので、スケッチを作成するときには注意してください。\n",
"\n",
"以下にATmega32u4とAPDS9960の結線を示します。 \n",
"\n",
" | ATmega32u4のピン\t | Arduino Leonard\t | APDS9960 | \n",
" |---|---|---|\n",
" | 3.3Vを生成\t | 3.3V\t | LED | \n",
" | 3.3Vを生成\t | 3.3V\t | VDD | \n",
" | 未接続\t | 未接続\t | INT | \n",
" | D1\t | D2\t | SDA | \n",
" | D0\t | D3\t | SCL | \n",
"\n",
"### 特殊キーコード一覧\n",
"以下のサンプルスケッチでは、上下の動きにはスクロールキーを、左右の動きにはカーソルキーを割り当てました。 ArduinoのKeyboardで使えるキーは、以下のサイトを参照してください。\n",
"\n",
"- https://www.arduino.cc/en/Reference/KeyboardModifiers\n",
"\n",
"### スケッチを描く\n",
"以下のスケッチをATmega32u4に書き込むとジェスチャースクロールの完成です。 ブラウザーで手を上下に動かしてみて下さい。\n",
"\n",
"```C++\n",
"/****************************************************************\n",
"Shawn Hymel @ SparkFun Electronics May 30, 2014\n",
"modified by musashinodenpa 2015\n",
"\n",
"Hardware Connections:\n",
"IMPORTANT: The APDS-9960 can only accept 3.3V!\n",
" Arduino Pin APDS-9960 Board Function\n",
" 3.3V VCC Power\n",
" GND GND Ground\n",
" A4 SDA I2C Data\n",
" A5 SCL I2C Clock\n",
" 2 INT Interrupt\n",
"****************************************************************/\n",
"/**\n",
" 上記のサンプルを参考にキーボードに応用\n",
" 竹本 浩 (2016/04/09)\n",
" 対象のボードはスイッチサイエンスのATmega32u4ボード\n",
" 初期のボードで、基板のポート番号にATmega32u4のポート番号が記載されている\n",
" \n",
" 5Vなので、APDS-9960へは3.3Vを供給\n",
" ATmega32u4 Pin APDS-9960 Function\n",
" Converted 3.3V VCC Power\n",
" GND GND Ground\n",
" D1(SDA) SDA I2C Data\n",
" D0(SCL) SCL I2C Clock\n",
" D1(Interrup0) INT Interrupt\n",
" */\n",
"\n",
"#include \n",
"#include \n",
"\n",
"// Global Variables\n",
"SparkFun_APDS9960 apds = SparkFun_APDS9960();\n",
"int isr_flag = 0;\n",
"uint8_t proximity_data = 0;\n",
"\n",
"void setup() {\n",
"\n",
" // 割込の初期化(2番ピンはLeonardではSDAに割り当てられている)\n",
" pinMode(2, INPUT_PULLUP);\n",
" // キーボードになる前に0.5秒待つ\n",
" delay(500);\n",
" // キーボードの初期化\n",
" Keyboard.begin(); \n",
"\n",
" // 割込処理の初期化\n",
" attachInterrupt(0, interruptRoutine, FALLING);\n",
"\n",
" // APDS-9960の初期化\n",
" apds.init();\n",
"\n",
" // ジェスチャーエンジン開始\n",
" apds.enableGestureSensor(true);\n",
" \n",
"}\n",
"\n",
"void loop() {\n",
" if ( isr_flag == 1 ) {\n",
" detachInterrupt(digitalPinToInterrupt(2));\n",
" handleGesture();\n",
" isr_flag = 0;\n",
" attachInterrupt(digitalPinToInterrupt(2), interruptRoutine, FALLING);\n",
" }\n",
"}\n",
"\n",
"void interruptRoutine() {\n",
" isr_flag = 1;\n",
"}\n",
"\n",
"void handleGesture() {\n",
" if ( apds.isGestureAvailable() ) {\n",
" // ジェスチャーに応じてカーソル移動とスクロールを実行する\n",
" int c = apds.readGesture();\n",
" switch (c) {\n",
" case 1:\n",
" Keyboard.write(KEY_RIGHT_ARROW);\n",
" break;\n",
" case 2:\n",
" Keyboard.write(KEY_LEFT_ARROW);\n",
" break;\n",
" case 3:\n",
" Keyboard.write(KEY_PAGE_UP);\n",
" break;\n",
" case 4:\n",
" Keyboard.write(KEY_PAGE_DOWN);\n",
" break;\n",
" default:\n",
" ;\n",
" }\n",
" }\n",
"}\n",
"```\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.13"
}
},
"nbformat": 4,
"nbformat_minor": 0
}