🐭 Rat√≥n sin contacto 🖱️

Usando un sensor de flujo óptico para convertir los gestos en el aire en movimientos del mouse.

 

Componentes y suministros

Desglose de flujo 585px 1 9tqjtxglmt
Escape de flujo Bitcraze
√ó1
A000057 Destacado
arduino leonardo
√ó1

Acerca de este proyecto

Este proyecto implementa un ratón sin contacto.

los Bitcraze flujo de escape contiene un sensor de flujo óptico capaz de detectar cómo se mueven las cosas frente a él y un sensor de rango para detectar la distancia al objeto más cercano. El sensor de flujo es básicamente un sensor de ratón óptico equipado con una lente enfocada para rastrear objetos distantes.

El mouse sin contacto puede detectar que una mano se acerca y detectar cómo se mueve, los movimientos se traducen en movimientos del mouse mediante un Arduino.

Usando un Arduino Leonardo (o cualquier otro Arduino compatible con un dispositivo USB), este proyecto se considera un mouse normal, por lo que funciona de inmediato en cualquier computadora.

configuración de hardware

La plataforma de flujo est√° conectada a dos buses Arduino:

  • El sensor de seguimiento √≥ptico PMW3901 est√° conectado al bus SPI
  • El tel√©metro VL53 est√° conectado al bus i2C

También necesitamos alimentar el puente de flujo, esto se hace conectándolo al pin 5V y GND del Arduino. Tenga en cuenta que en Arduino Leonardo, solo se puede acceder al bus SPI en el encabezado del pin ICSP.

Biblioteca requerida

Ambos sensores requieren bibliotecas para funcionar. Al usar el Administrador de la biblioteca Arduino IDE cargamos las dos bibliotecas:

  • VL53L0x para el sensor de telemetr√≠a
  • bitcraze_pmw3901 para sensor de flujo √≥ptico

¡El código!

El código está adaptado de Inicio de distribución de flujoacabamos de agregar la parte del mouse:

#include "Bitcraze_PMW3901.h" 
#include <Wire.h> 
#include <VL53L0X.h> 
#include <Mouse.h> 
VL53L0X rangeSensor; 
// Using digital pin 10 for chip select 
Bitcraze_PMW3901 flow(10); 
void setup() { 
 Serial.begin(9600); 
 // Initialize flow sensor 
 if (!flow.begin()) { 
   Serial.println("Initialization of the flow sensor failed"); 
   while(1) { } 
 } 
 // Initialize range sensor 
 Wire.begin(); 
 rangeSensor.init(); 
 rangeSensor.setTimeout(500); 
 // Initialize Mouse 
 Mouse.begin(); 
} 
int16_t deltaX,deltaY; 
void loop() { 
 // Get motion count since last call 
 flow.readMotionCount(&deltaX, &deltaY); 
 // Get single range measurement 
 float range = rangeSensor.readRangeSingleMillimeters(); 
 // Send motion as mouse movement when the hand is between 80 and 200mm
 if (range < 200 && range > 80) { 
   Mouse.move(deltaX, -deltaY, 0); 
 }
 // Press the left mouse button when the hand is bellow 50mm
 if (range < 50) { 
   Mouse.press(); 
 } else { 
   Mouse.release(); 
 } 
} 

Cuando el sensor de telemetr√≠a detecta un objeto, a una distancia entre 80 mm y 200 mm, el movimiento medido por el sensor de flujo se env√≠a como un movimiento de rat√≥n. Cuando el objeto detectado es inferior a 50 mm, pulsamos el bot√≥n del rat√≥n. La raz√≥n para mantener de 50 mm a 80 mm sin detecci√≥n de movimiento o clic es garantizar que el mouse haga clic sin ning√ļn movimiento: sin este espacio, el mouse siempre se mover√≠a un poco cuando la mano se moviera hacia abajo para hacer clic.

Manifestación

Ahora el video obligatorio:

codificado

ratón sin contactoarduino
Funciona en Arduino que tiene capacidad de dispositivo USB. Probado en Arduino Leonardo.
#include "Bitcraze_PMW3901.h" 
#include <Wire.h> 
#include <VL53L0X.h> 
#include <Mouse.h> 

VL53L0X rangeSensor; 

// Using digital pin 10 for chip select 
Bitcraze_PMW3901 flow(10); 

void setup() { 
 Serial.begin(9600); 
 // Initialize flow sensor 
 if (!flow.begin()) { 
   Serial.println("Initialization of the flow sensor failed"); 
   while(1) { } 
 } 
 // Initialize range sensor 
 Wire.begin(); 
 rangeSensor.init(); 
 rangeSensor.setTimeout(500); 
 // Initialize Mouse 
 Mouse.begin(); 
} 

int16_t deltaX,deltaY; 

void loop() { 
 // Get motion count since last call 
 flow.readMotionCount(&deltaX, &deltaY); 
 // Get single range measurement 
 float range = rangeSensor.readRangeSingleMillimeters(); 

 // Send motion as mouse movement when the hand is between 80 and 200mm
 if (range < 200 && range > 80) { 
   Mouse.move(deltaX, -deltaY, 0); 
 }

 // Press the left mouse button when the hand is bellow 50mm
 if (range < 50) { 
   Mouse.press(); 
 } else { 
   Mouse.release(); 
 } 
} 

diagramas

Diagrama del ratón sin contacto
Descargar
Diagrama del ratón sin contacto i3c2fomggq

Fuente Arduino.cc