構(gòu)建一個(gè)通過(guò)物體工作的手勢(shì)傳感器
幾年前,我創(chuàng)建了一個(gè)支持手勢(shì)交互的嵌入式項(xiàng)目,允許用戶通過(guò)向左或向右滑動(dòng)來(lái)翻頁(yè)。然而,一直困擾我的一個(gè)問(wèn)題是,傳統(tǒng)的手勢(shì)傳感器依賴于光信號(hào),這意味著它們必須保持暢通無(wú)阻。這需要切一個(gè)洞來(lái)暴露傳感器,這看起來(lái)并不美觀。所以,我想知道:有沒(méi)有一種方法可以隱藏手勢(shì)傳感器,同時(shí)保持良好的性能?這是一個(gè)我一直無(wú)法解決的挑戰(zhàn)。
現(xiàn)在,當(dāng)我開(kāi)始創(chuàng)建另一個(gè)有趣的互動(dòng)項(xiàng)目時(shí),我開(kāi)始再次尋找符合我要求的手勢(shì)傳感器。我不僅找到了一個(gè),而且它也更強(qiáng)大——提供更高的靈敏度、更高的精度,甚至可以精確地跟蹤手部運(yùn)動(dòng)的3D空間。有了這個(gè),我可以在我的項(xiàng)目中加入更多創(chuàng)造性的互動(dòng)。
最后,我成功地集成了一個(gè)可以通過(guò)實(shí)體物體檢測(cè)運(yùn)動(dòng)的手勢(shì)傳感器。它使用I2C協(xié)議,使其相對(duì)容易與微控制器接口。復(fù)雜的算法預(yù)先配置并存儲(chǔ)在傳感器的固件中,允許微控制器通過(guò)簡(jiǎn)單的I2C通信檢測(cè)手勢(shì)。
代碼
/**
* @fn begin
* @brief initialization function
* @return bool,returns the initialization status
* @retval true Initialization succeeded
* @retval fasle Initialization failed
*/
bool begin(void);
/**
* @fn reset
* @brief reset the sensor
*/
void reset(void);
/**
* @fn sensorDataRecv
* @brief get the sensor data
*/
void sensorDataRecv(void);
/**
* @fn enableGestures
* @brief enable gesture recognition function
* @return Result of enabling gesture recognition
* @retval -1 setup fails
* @retval 0 setup succeeds
*/
int8_t enableGestures(void);
/**
* @fn disableGestures
* @brief turn off gesture recognition function
* @return Result of disabling gesture recognition
* @retval -1 setup fails
* @retval 0 setup succeeds
*/
int8_t disableGestures(void);
/**
* @fn disableAirWheel
* @brief turn off AirWheel function
* @return Result of disabling AirWheel function
* @retval -1 setup fails
* @retval 0 setup succeeds
*/
int8_t disableAirWheel(void);
/**
* @fn enableAirWheel
* @brief enable AirWheel function
* @return Result of enabling AirWheel function
* @retval -1 setup fails
* @retval 0 setup succeeds
*/
int8_t enableAirWheel(void);
/**
* @fn disableApproachDetection
* @brief turn off proximity detection function
* @return Result of disabling proximity detection function
* @retval -1 setup fails
* @retval 0 setup succeeds
*/
int8_t disableApproachDetection(void);
/**
* @fn enableApproachDetection
* @brief enable proximity detection function
* @return Result of enabling proximity detection function
* @retval -1 setup fails
* @retval 0 setup succeeds
*/
int8_t enableApproachDetection(void);
/**
* @fn disableTouchDetection
* @brief turn off touch detection function
* @return Result of disabling touch detection function
* @retval -1 setup fails
* @retval 0 setup succeeds
*/
int8_t disableTouchDetection(void);
/**
* @fn enableTouchDetection
* @brief enable touch detection function
* @return Result of enabling touch detection function
* @retval -1 setup fails
* @retval 0 setup succeeds
*/
int8_t enableTouchDetection(void);
/**
* @fn getPositionX
* @brief get the X-axis position
* @return X-axis position
*/
uint16_t getPositionX(void);
/**
* @fn getPositionY
* @brief get the Y-axis position
* @return Y-axis position
*/
uint16_t getPositionY(void);
/**
* @fn getPositionZ
* @brief get the Z-axis position
* @return Z-axis position
*/
uint16_t getPositionZ(void);
/**
* @fn getTouchInfo
* @brief get touch information
* @return touch information
* @retval eDoubleTapCenter Double Tap Center electrode
* @retval eDoubleTapRight Double Tap Right electrode
* @retval eDoubleTapUp Double Tap Up electrode
* @retval eDoubleTapLeft Double Tap Left electrode
* @retval eDoubleTapDown Double Tap Down electrode
* @retval eTapCenter Tap Center electrode
* @retval eTapRight Tap Right electrode
* @retval eTapUp Tap Up electrode
* @retval eTapLeft Tap Left electrode
* @retval eTapDown Tap Down electrode
* @retval eTouchCenter Touch Center electrode
* @retval eTouchRight Touch Right electrode
* @retval eTouchUp Touch Up electrode
* @retval eTouchLeft Touch Left electrode
* @retval eTouchDown Touch Down electrode
*/
uint16_t getTouchInfo(void);
/**
* @fn getGestureInfo
* @brief get gesture information
* @return gesture information
* @retval eFilckR Flick Left to Right
* @retval eFilckL Flick Right to Left
* @retval eFilckU Flick Down to Up
* @retval eFilckD Flick Up to Down
* @retval eCircleClockwise Circle clockwise (only active if AirWheel disabled)
* @retval eCircleCounterclockwise Circle counterclockwise (only active if AirWheel disabled)
*/
uint8_t getGestureInfo(void);
/**
* @fn havePositionInfo
* @brief monitor position information
* @return Results of monitoring position information
* @retval true position information exists
* @retval false There is no position information
*/
bool havePositionInfo(void);
本文編譯自hackster.io