Componentes y suministros
|
× | 1 | ||||
|
× | 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: