コロナパンデミックのこの時期、エレベーターは誰もが同じボタンに触れるリスクの高い場所になりました。多くの場所で、人々は、ポンプ紙、つまようじ、または衛生ティッシュを使用してリフトボタンを押すなど、エレベーターボタンとの接触を防ぐためのトリックを発見しました。
したがって、自動消毒機、非接触温度監視、社会距離検出器などの以前のコロナ安全プロジェクトの続きとして、ここではArduinoNanoを使用してジェスチャー制御エレベーターのプロトタイプを作成します。
この非接触型エレベーターは、Arduino Nano、APDS9960ジェスチャセンサー、およびOLEDディスプレイモジュールを使用しています。このジェスチャーベースのコントロールパネルを使用すると、手のジェスチャーを行うことでリフトを簡単に制御できます。APDS9960センサーは、ジェスチャを読み取るために使用されます。上と下のジェスチャはフロア番号を設定するために使用され、左のジェスチャはリフトドアを閉じてフロア番号に従ってリフトを移動することであり、右のジェスチャはドアを開くために使用されます。
必要なコンポーネント
- Arduino Nano
- OLEDディスプレイモジュール
- APDS9960 RGB&ジェスチャーセンサー
- ブレッドボード
- ジャンパー線
APDS9960 RGB&ジェスチャーセンサー
APDS9960 RGB&ジェスチャ検出モジュールは、APDS-9960センサー、UVおよびIRブロッキングフィルター、異なる方向に敏感な4つの個別のダイオード、およびI2C互換インターフェイスが組み込まれた小さなブレークアウトボードです。このセンサーは、周囲光と色の測定、近接検出、およびタッチレスジェスチャセンシングに使用できます。10〜20 cmのジェスチャ検出範囲があり、マイクロコントローラ、ロボット、およびその他の多くのプロジェクトの制御に使用できます。
特徴:
- 動作電圧:2.4V〜3.6V
- 動作範囲:4-8インチ(10-20cm)。
- I2Cインターフェース(I2Cアドレス:0x39)。
- 周囲光とRGBカラーセンシング、近接性
- 光学モジュールでのセンシングとジェスチャ検出
- 最大400kHzのデータレートを備えたI2Cバス高速モード互換インターフェイス。
回路図
APDS9960を使用した非接触型エレベータの回路図を以下に示します。
ArduinoNanoをAPDS9960センサーおよびOLEDディスプレイとインターフェースしています。APDS9960センサーとOLEDディスプレイの両方のVCCピンとGNDピンは、Arduinoの3.3VとGNDに接続されています。一方、APDS9960センサーとOLEDディスプレイのSCLピンとSDAピンは、それぞれArduinoのA5ピンとA4ピンに接続されています。
OLED&APDS9960ピン |
Arduinoナノピン |
VCC |
3.3v |
GND |
GND |
SCL |
A5 |
SDA |
A4 |
Arduinoを使用したジェスチャー制御エレベーターの完全なセットアップは次のようになります。
OLEDディスプレイと他のマイクロコントローラーとのインターフェースの詳細については、リンクをたどってください。
コードの説明
APDS9960を使用する非接触型エレベーターの完全なコードは、ページの最後に記載されています。ここでは、コードのいくつかの重要な部分について説明します。このプログラムでは、APDS9960および Adafruit_SH1106ライブラリ を使用し ます 。APDS9960ライブラリは、ArduinoIDEからダウンロードできます。ライブラリをダウンロードするには、 [スケッチ]> [ライブラリマネージャー]> [検索]に移動 し、ArduinoAPDS9960と入力します。一方で Adafruit_SH1106ライブラリは ここからダウンロードすることができます。
したがって、通常どおり、必要なすべてのライブラリを含めてコードを開始します。 Adafruit_SH1106.h は、元のAdafruitライブラリの修正バージョンです。
#include
次の行で、ユーザーが行きたい現在のフロアとフロア番号を格納する変数を定義します。
int floornum = 0; int currentfloor = 0;
その後、上向き矢印、下向き矢印、開いたドア、および閉じたドアの画像のビットマップを入力します。画像のHEXコードは、Image2cppなどのコンバーターを使用して生成できます。Image2cppの使用方法の詳細については、このArduinoQRコードジェネレーターチュートリアルに従ってください。
const unsigned char up PROGMEM = {0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、…………………………… ………………………………………………………..}; const unsigned char down PROGMEM = {0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、…………………………… ………………………………………………………..}; const unsigned char dooropen PROGMEM = {0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x0f、0xff、0xff、0xc0、0x1f、0xff、0xff、0xe0 、、………………………… …………………………………………………………..};
で 、セットアップ() 関数で、デバッグ目的のための9600のボーレートでシリアルモニタを初期化します。次に、次の行で、次の ようにbegin() メソッドを使用してOLEDディスプレイとAPDS9960センサーを初期化します。
Serial.begin(9600); if(!APDS.begin()){Serial.println( "APDS9960センサーの初期化中にエラーが発生しました!"); } Serial.println( "ジェスチャを検出しています…"); display.begin(SH1106_SWITCHCAPVCC、0x3C);
ディスプレイ及びセンサーを初期化した後、と表示バッファクリア clearDisplay() メソッドを使用し、フォントのサイズと色を設定 display.setTextSize() と display.setTextColor() メソッドを。
display.setTextSize(2); display.setTextColor(WHITE); display.clearDisplay(); display.display();
内部 のボイドループ() 、 任意のジェスチャが行われた場合は常に確認してください。はいの場合、ジェスチャ値を読み取り、それがどのジェスチャ(UP、DOWN、RIGHT、LEFT)であるかを確認し、対応する読み取り値をシリアルモニターに出力します。 UPおよびDOWNジェスチャは、ユーザーが行きたいフロア番号を設定するために使用されます。左のジェスチャはリフトドアを閉じ、フロア番号に従ってリフトを移動し、右のジェスチャはドアを開くために使用されます。
if(APDS.gestureAvailable()){intジェスチャー= APDS.readGesture(); switch(gesture){case GESTURE_UP:Serial.println( "Detected UPgesture"); display.clearDisplay();フロアナム++; home1();ブレーク; case GESTURE_DOWN:Serial.println( "Detected DOWNジェスチャー"); display.clearDisplay();フロアナム-; home1();ブレーク; case GESTURE_LEFT:Serial.println( "検出されたLEFTジェスチャ"); display.clearDisplay();開始();ブレーク; case GESTURE_RIGHT:Serial.println( "Detected RIGHTジェスチャー"); display.clearDisplay(); home1();ブレーク;デフォルト:ブレーク; }
HOME1() 関数は、エレベータのホーム画面を描画するために使用されます。これは、上向き矢印、下向き矢印、開いたドア、閉じたドアの標識、および現在のフロア番号で構成されます。 drawBitmap() 関数は、OLEDディスプレイに画像を描画するために使用されます。 drawBitmap() 関数の構文を以下に示します。
drawBitmap(int16_t x、int16_t y、ビットマップ、int16_t w、int16_t h、colour);
どこ:
int16_t x、int16_t y は、OLEDディスプレイのX座標とY座標です。
ビットマップはビットマップの名前です
int16_t w、int16_t hは、画像の高さと重さです。
void home1(){display.setCursor(101,23); display.println(floornum); display.drawBitmap(23、0、uparrow、40、18、WHITE); display.drawBitmap(26、46、downarrow、40、18、WHITE); display.drawBitmap(0、15、dooropen、29、30、WHITE); display.drawBitmap(60、15、closedoor、29、30、WHITE); display.display(); }
開始() 関数は、リフト上方または下方に移動させるために使用されます。そのために、現在のフロア番号は、ユーザーが行きたいフロア番号と比較されます。フロア番号が現在のフロア番号よりも大きい場合。その後、エレベーターは上に移動し、フロア番号が現在のフロア番号よりも少ない場合。その後、リフトは下に移動します。現在のフロア番号が両方ともなると、リフトは停止します。とフロア番号。同じだ。
void start(){while(floornum> currentfloor){Serial.println( "going UP"); currentfloor ++; display.drawBitmap(0、0、up、100、64、WHITE); display.setCursor(101,23); display.println(currentfloor); display.display(); display.clearDisplay(); delay(2000); } while(floornum <currentfloor){Serial.println( "going Down"); currentfloor--; display.drawBitmap(0、0、down、100、64、WHITE); display.setCursor(101,23); display.println(currentfloor); display.display(); display.clearDisplay(); delay(2000); } if(floornum == currentfloor){Serial.println( "Reached"); display.clearDisplay(); home1(); Serial.print(currentfloor); }}
ジェスチャ制御のタッチレスリフトのテスト
ハードウェアとコードの準備ができたら、Arduino Nanoをラップトップに接続し、以下に示す完全なコードをアップロードします。ご覧のとおり、デフォルトでOLEDはエレベーターUIを表示します。
次に、下のビデオに示すように、手を上下に振って、行きたい場所に床を設定します。次に、その階に行くためのリフトを確認するための左ジェスチャーを行います。リフトを停止したい場合は、手で正しいジェスチャーをしてください。
このプロジェクトの完全な作業ビデオとコードを以下に示します。このプロジェクトの構築を楽しんでいただけたでしょうか。このプロジェクトに関して質問がある場合は、コメントセクションに残してください。