рдПрдкреАрдбреАрдПрд╕ -9960 рдХреЗ рд╕рд╛рде рдЗрд╢рд╛рд░реЗ рдХреА рдорд╛рдиреНрдпрддрд╛

рдЫрд╡рд┐

рдПрдкреАрдбреАрдПрд╕ -9960 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдкрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдкрдврд╝рдирд╛, рдЬрд╣рд╛рдВ рдпрд╣ рд░рдВрдЧ рдорд╛рдиреНрдпрддрд╛ рдФрд░ рдкреНрд░рдХрд╛рд╢ рд╕реНрддрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдерд╛, рджреЛ рдмрд╛рддреЗрдВ рдореЗрд░реЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдИрдВ: 1) рдЗрд╢рд╛рд░рд╛ рдорд╛рдиреНрдпрддрд╛ рдХрд╛ рд╡рд┐рд╖рдп рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдФрд░ 2) рдЗрд╕ рд╡рд┐рд╖рдп рдХрд╛ рдЦреБрд▓рд╛рд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рджрд░рдЕрд╕рд▓, рдЕрдЧрд░ рдореИрдВрдиреЗ рдПрдкреАрдбреАрдПрд╕ -9960 рдХрд╛ рд╡рд░реНрдгрди рд▓рд┐рдпрд╛, рддреЛ рдЗрд╢рд╛рд░реЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдП рдмрд┐рдирд╛, рд╡рд░реНрдгрди рдХреБрдЫ рдЕрдзреВрд░рд╛ рд▓рдЧрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЗрд╕ рд╡рд┐рд╖рдп рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЦрд╛рд▓реА рд╕рдордп рдорд┐рд▓рд╛ред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЗ рдзреНрдпрд╛рди рдореЗрдВ рдЙрди рд╣рд╛рд╡рднрд╛рд╡ рдкрд╣рдЪрд╛рди рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдЕрд╡рд▓реЛрдХрди рд▓рд╛рддрд╛ рд╣реВрдВ рдЬреЛ APDS-9960 рд╕реЗрдВрд╕рд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рд▓реЗрдЦ рд╕реЗрдВрд╕рд░, рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣, рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдФрд░ рдкреНрд░рд╕реНрддреБрддрд┐ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдЧрд╛ред рдЖрдк рд╕реНрд╡рдпрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдкреАрдбреАрдПрд╕ -9960 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╢рд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдХрд┐рддрдирд╛ рдЖрд╕рд╛рди рд╣реИред

рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ, рд▓реЗрдЦ рдПрдХ рдХреЛрдб рдХреЗ рд╕рд╛рде рд╣реЛрдЧрд╛, рдЬреЛ рдХреБрдЫ рднреА рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдХреЛрдб рдХрд╛ рдкреВрд░реНрдг рд╕рдВрд╕реНрдХрд░рдг рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред

рддреБрд░рдВрдд рдПрдХ рдЫреЛрдЯреА рдЯрд┐рдкреНрдкрдгреА: APDS-9960 рдореЗрдВ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕реНрд╡рдд: рдЗрд╢рд╛рд░рд╛ рдкрд╣рдЪрд╛рди рддрдВрддреНрд░ рдирд╣реАрдВ рд╣реИ; рд╡рд╣ рдРрд╕рд╛ рд╣реИ, рдпрд╣реАрдВ, рдореИрдВрдиреЗ рдкрдврд╝рд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ, рд░рдЬрд┐рд╕реНрдЯрд░, рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрд╕рд╛рдзрд┐рдд рдЗрд╢рд╛рд░рд╛ рдирд┐рд╣рд┐рдд рд╣реИ - рдпрд╣ APDS-9960 рдореЗрдВ рдирд╣реАрдВ рд╣реИ; рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдЗрд╢рд╛рд░рд╛ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдПрд▓реНрдЧреЛрд░рд┐рдердо рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ рд╣рдо рдмрд╛рдж рдореЗрдВ рдХрд░реЗрдВрдЧреЗред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ рдФрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ - рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕рдВрд╡реЗрджрдХ рдХреЗ рдЕрдзреНрдпрдпрди рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЪреНрдЫрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐, рд╕рдиреНрдирд┐рдХрдЯрди рдкрд░ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде, рдЖрдк рд╢реЛрдзрди рджреНрд╡рд╛рд░рд╛, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХрд┐рд╕реА рднреА рдФрд░ рд╕рднреА рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ рдЗрд╢рд╛рд░реЛрдВ рдХреЛ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВред

рд▓реЗрдХрд┐рди, рдЪреВрдБрдХрд┐ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдЕрд╡рд▓реЛрдХрди рдХрд╛рд░реНрдп рд╣реИ, рд╣рдо рдЦреБрдж рдХреЛ рдХреЗрд╡рд▓ рдореВрд▓ UP-DOWN-LEFT-RIGHT рдХреЗ рдЗрд╢рд╛рд░реЛрдВ рддрдХ рд╕реАрдорд┐рдд рд░рдЦрддреЗ рд╣реИрдВред

рдЕрдЪреНрдЫрд╛, рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рд╕рд┐рджреНрдзрд╛рдВрдд


рдореИрдВ рдЦреБрдж рдХреЛ рдереЛрдбрд╝рд╛ рдореИрдЯрд░рд┐рдпрд▓ рд╣реЛрдиреЗ рджреВрдВрдЧрд╛ред

рдЖрдВрджреЛрд▓рди рдХреА рдЧрддрд┐ рдФрд░ рджрд┐рд╢рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдкреАрдбреАрдПрд╕ -9960 рдПрдХ рдЖрдИрдЖрд░ рдПрд▓рдИрдбреА рдФрд░ рдЪрд╛рд░ рдлреЛрдЯреЛрдбрд╛рдпреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЖрдВрдХрдбрд╝реЗ рдореЗрдВ рдЪрд┐рддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдирд┐рдХрдЯ рдЕрд╡рд░рдХреНрдд (рдПрдирдЖрдИрдЖрд░) рд░реЗрдВрдЬ рдореЗрдВ рд╕рдВрдХреЗрддреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИред

рдЫрд╡рд┐

рдЖрдИрдЖрд░ рдПрд▓рдИрдбреА (рдПрд▓рдИрдбреА) рдореЗрдВ рдмреИрдХрд▓рд╛рдЗрдЯ рдХрд╛ рдХрд╛рд░реНрдп рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдлреЛрдЯреЛрдбрд┐рдпреЛрдб (рдпреВрдбреАрдПрд▓рдЖрд░) "рдмрд╛рдзрд╛" рд╕реЗ рдкрд░рд┐рд▓рдХреНрд╖рд┐рдд рдкреНрд░рдХрд╛рд╢ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВред

рдлреЛрдЯреЛрдбрд┐рдпреЛрдбреНрд╕ рд╕реЗрдВрд╕рд░ рдкрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕реНрдерд┐рдд рд╣реЛрддреЗ рд╣реИрдВ рдХрд┐, "рдмрд╛рдзрд╛" рдХреА рдЧрддрд┐ рдХреА рджрд┐рд╢рд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╕рдВрдмрдВрдзрд┐рдд рдлреЛрдЯреЛрдбрд╛рдпреЛрдб рдЗрдирдкреБрдЯ рдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкрд░рд┐рд▓рдХреНрд╖рд┐рдд рдЖрдИрдЖрд░ рд╕рд┐рдЧреНрдирд▓ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рдПрдХ рдЫреЛрдЯрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ред рдЗрд╕реА рд╕рдордп, рдПрдкреАрдбреАрдПрд╕ -9960 рдкрд░ рдЕрд╕рдорд╛рди рд░реВрдк рд╕реЗ рдкреНрд░рд▓реЗрдЦрди рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдпреВрдбреАрдПрд▓рдЖрд░ рдлреЛрдЯреЛрдбрд╛рдпреЛрдб рд╕реЗ рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рдЖрдпрд╛рдо рдФрд░ рдЪрд░рдг рдХреЗ рдЕрдВрддрд░ рдХреЛ рдорд╛рдкрдиреЗ рдФрд░ рддреБрд▓рдирд╛ рдХрд░рдХреЗ рдЧрддрд┐ рдХреА рджрд┐рд╢рд╛ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЫрд╡рд┐

рдЕрднреНрдпрд╛рд╕


APDS-9960 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд╛рде рд╣реА рдкрд┐рдЫрд▓реА рдмрд╛рд░ , рд╣рдо STM32VLDISCOVERY рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдХрдиреЗрдХреНрд╢рди рднреА рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИред

APDS-9960 рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ

рд╣рдо рд╕реЗрдВрд╕рд░ рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реЗрдЯрдЕрдк рдХрд░рддреЗ рд╣реИрдВред

рдЗрд╕ рддрд░рд╣:

APDS9960_init
void APDS9960_init(void) { i2c1_write(APDS9960_CONTROL, DEFAULT_PGAIN); i2c1_write(APDS9960_GPENTH, DEFAULT_GPENTH); i2c1_write(APDS9960_GEXTH, DEFAULT_GEXTH); i2c1_write(APDS9960_GCONF2, DEFAULT_GGAIN); i2c1_write(APDS9960_GPULSE, DEFAULT_PULSE_LENGTH); i2c1_write(APDS9960_PPULSE, DEFAULT_PULSE_LENGTH); } 

рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ? рдЪрд▓реЛ рдареАрдХ рд╣реИред

 i2c1_write(APDS9960_CONTROL, DEFAULT_PGAIN); 

PGAIN (рдирд┐рдХрдЯрддрд╛ рд▓рд╛рдн рдирд┐рдпрдВрддреНрд░рдг) рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ рдЬреЛ рдирд┐рдХрдЯрддрд╛ рд╕рдВрд╡реЗрджрдирд╢реАрд▓рддрд╛ рдХреЗ рд▓рд╛рдн рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ 2 рдХрд╛ рдорд╛рди рдкреНрд░рджрд╛рди рдХрд░реЗрдВ, рдЬреЛ рд▓рд╛рдн рдХреЗ рдЪрд╛рд░ рдЧреБрдирд╛ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред

 i2c1_write(APDS9960_GPENTH, DEFAULT_GPENTH); i2c1_write(APDS9960_GEXTH, DEFAULT_GEXTH); 

GPENTH (Gesture рдирд┐рдХрдЯрддрд╛ рджрд░реНрдЬ рдереНрд░реЗрд╕рд╣реЛрд▓реНрдб рд░рдЬрд┐рд╕реНрдЯрд░) - рдпрд╣ рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЗрд╕реНрдЪрд░ рдкрд╣рдЪрд╛рди рдХреА рд╢реБрд░реБрдЖрдд рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдХрдЯрддрд╛ рд╕реАрдорд╛ рдореВрд▓реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред

GEXTH (Gesture Exit Threshold Register), рдХреНрд░рдорд╢рдГ, рдЗрд╢рд╛рд░рд╛ рдорд╛рдиреНрдпрддрд╛ рдХреЗ рдЕрдВрдд рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рджрд╣рд▓реАрдЬ рдореВрд▓реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред

 i2c1_write(APDS9960_GCONF2, DEFAULT_GGAIN); 

GCONF2 (рдЬреЗрд╕реНрдЪрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рджреЛ) рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ, рд╣рдордиреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ GGAIN (рдЬреЗрд╕реНрдЪрд░ рдЧреЗрдЯ рдХрдВрдЯреНрд░реЛрд▓) рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд▓рд╛рдн рдХреЗ рдореВрд▓реНрдп рд╕реЗ рдЪрд╛рд░ рдЧреБрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИред

 i2c1_write(APDS9960_GPULSE, DEFAULT_PULSE_LENGTH); i2c1_write(APDS9960_PPULSE, DEFAULT_PULSE_LENGTH); 

рдмреИрдХрд▓рд╛рдЗрдЯред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдЗрдиреНрдлреНрд░рд╛рд░реЗрдб рдПрд▓рдИрдбреА рдмреИрдХрд▓рд╛рдЗрдЯ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕реНрд░реЛрдд рдХрд╛ рдорд╛рди 0 рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдХрд┐ 100 рдПрдордП рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдпрд╣ рд╣рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реВрдЯ рдХрд░реЗрдЧрд╛ - рд╣рдо рдЗрд╕реЗ рдирд╣реАрдВ рдмрджрд▓реЗрдВрдЧреЗред

APDS-9960 рдореЗрдВ IR рд░реЛрд╢рдиреА рджрд╛рд▓реЛрдВ рдХрд╛ рдПрдХ рдЕрдиреБрдХреНрд░рдо рд╣реИ рдФрд░ рдЗрд╢рд╛рд░реЛрдВ GPULSE (рдЬреЗрд╕реНрдЪрд░ рдкрд▓реНрд╕ рдХрд╛рдЙрдВрдЯ рдФрд░ рд▓рдВрдмрд╛рдИ) рдХреЗ рд▓рд┐рдП рдЗрд╕реА рд░рдЬрд┐рд╕реНрдЯрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ: GPLEN (рдЬреЗрд╕реНрдЪрд░ рдкрд▓реНрд╕ рд▓рдВрдмрд╛рдИ) рдФрд░ GPULSE (рдЬреЗрд╕реНрдЪрд░ рдкрд▓реНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛), рд╕рд╛рде рд╣реА PPULSE (рдирд┐рдХрдЯрддрд╛ рдкрд▓реНрд╕ рдХрд╛рдЙрдВрдЯ рд░рдЬрд┐рд╕реНрдЯрд░) рдЕрдиреБрдорд╛рдирд┐рдд рд╣реИред ): PPLEN (рдирд┐рдХрдЯрддрд╛ рдкрд▓реНрд╕ рд▓рдВрдмрд╛рдИ) рдФрд░ PPULSE (рдкреНрд░реЙрдХреНрд╕рд┐рдорд┐рдЯреА рдкрд▓реНрд╕ рдХрд╛рдЙрдВрдЯ) рджрд╛рд▓реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрдХреНрддрд┐ рдкрд▓реНрд╕ рдХреА рдЕрд╡рдзрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ рдХрд┐ GPLEN рдФрд░ PPLEN 2 рдХрд╛ рдореВрд▓реНрдп 16 ╬╝s рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛, рдФрд░ GPULSE рдФрд░ PPULSE 9 рдХрд╛ рдорд╛рди, рдЬреЛ 10 рджрд╛рд▓реЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕реЗрдЯрдЕрдк рдкрд┐рдЫрд▓реЗ APDS-9960 рд╕рдореАрдХреНрд╖рд╛ рд╕реЗ рд░рдВрдЧ рдкрд╣рдЪрд╛рди рдФрд░ рдкреНрд░рдХрд╛рд╢ рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдирд┐рдХрд▓рд╛ред

рдбреЗрдЯрд╛ рдкрдврд╝рдирд╛

рдЕрдм рд╣рдо рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрдХреНрд░ рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рд╣рд░ рдЕрдм рдФрд░ рдлрд┐рд░ рдлреЛрдЯреЛрдбрд╛рдпреЛрдб рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдФрд░ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рднреА рд╕реАрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдЗрд╢рд╛рд░реЗ рдХреЛ рджреВрд╕рд░реЗ рд╕реЗ рдХреИрд╕реЗ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП APDS-9960 рдХреЛ рдЗрд╢рд╛рд░реЛрдВ рдФрд░ рдЬрд╝реВрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВред

 GesturesSet(GESTURES_START); 

рдФрд░ рддреБрд░рдВрдд рд╣рдо GVALID рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред GVALID (Gesture FIFO Data) GSTATUS рд░рдЬрд┐рд╕реНрдЯрд░ (Gesture Status Register) рдХрд╛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ, рдЬреЛ рдЧреИрд░-рд╢реВрдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рд╣рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕реЗрдВрд╕рд░ рдХреЗ рдкрд╛рд╕ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдЬреЗрд╕реНрдЪрд░ рдбреЗрдЯрд╛ рд╣реИред

рдкреНрд░рд▓реЗрдЦрди рд╣рдореЗрдВ рд╕рд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╢рд╛рд░реЗ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдмрдлрд░ рдореЗрдВ рд╣реИ, рд░реИрдо рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ, рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ 32 x 4 рдмрд╛рдЗрдЯреНрд╕ рдЖрдХрд╛рд░ рдореЗрдВ рд╣реИред

рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдЗрд╕ рдмрдлрд░ рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрдХрд╛рд░ GFLVL (рдЬреЗрд╕реНрдЪрд░ FIFO рд╕реНрддрд░) рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдкрдврд╝рдХрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддред рдореЗрд░реЗ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдЕрдиреБрднрд╡рдЬрдиреНрдп рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, GFLVL * 4 рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдХреБрдЫ рдЗрд╕ рддрд░рд╣:

рдЫрд╡рд┐

рдареАрдХ рд╣реИ, рдмрдлрд░ рдХреЗ рдирд╛рдо рд╕реЗ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░, рдЗрд╕рдореЗрдВ рдбреЗрдЯрд╛ рдХреНрд░рдо рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ - рдкрд╣рд▓реЗ рдЖрдЙрдЯред рдпрд╣реА рд╣реИ, рдореЛрдЯреЗ рддреМрд░ рдкрд░, "рдкрд╣рд▓реЗ" рдкреНрд░рддреНрдпреЗрдХ рдлреЛрдЯреЛрдбрд┐рдпреЛрдб рд╕реЗ рд╕рдВрдХреЗрдд рдЖрдпрд╛, "рдЙрдЪреНрдЪ" рдпрд╣ GFLVL рдореЗрдВ рд╣реИред

рдлреЛрдЯреЛрдбрд╛рдпреЛрдбреНрд╕ (рдпреВрдбреАрдПрд▓рдЖрд░) рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рдЬреЗрд╕реНрдЪрд░ рдлреАрдлреЛ рд░рдЬрд┐рд╕реНрдЯрд░ рд╕реЗ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

- GFIFO_U (рдЬреЗрд╕реНрдЪрд░ FIFO рдбреЗрдЯрд╛, рдпреВрдкреА)
- GFIFO_D (рдЗрд╢рд╛рд░рд╛ рдлреАрдлреЛ рдбреЗрдЯрд╛, рдбрд╛рдЙрдирд▓реЛрдб)
- GFIFO_L (Gesture FIFO рдбреЗрдЯрд╛, LEFT)
- GFIFO_R (рдЬреЗрд╕реНрдЯреНрдпреЛрд░ рдлреАрдлреЛ рдбреЗрдЯрд╛, рд░рд╛рдЗрдЯ)

рдЗрди рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рд╕реЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдЬреАрдПрдлрдПрд▓рд╡реАрдПрд▓ рдХреЛ рдШрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ; рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рдЕрдЪреНрдЫреЗ рддрд░реАрдХреЗ рд╕реЗ, рдЬреАрдПрдлрдПрд▓рд╡реАрдПрд▓ рдХреЗ рд╢реВрдиреНрдп рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рддрдХ рдкреВрд░реЗ рдмрдлрд░ рдХреЛ рдкрдврд╝рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдЗрд╢рд╛рд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЗрд╕ рдмрдлрд╝рд░ рдХреЗ рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ рдЪрд╛рд░ рдмрд╛рдЗрдЯреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрдзрд┐рдХ рдирд╣реАрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдХреЗрд╡рд▓ рдЙрдиреНрд╣реЗрдВ рдкрдврд╝реЗрдВрдЧреЗред

 GestureUp = i2c1_read(APDS9960_GFIFO_U); GestureDown = i2c1_read(APDS9960_GFIFO_D); GestureLeft = i2c1_read(APDS9960_GFIFO_L); GestureRight = i2c1_read(APDS9960_GFIFO_R); 

рдЗрд╢рд╛рд░реЗ рдХреА рдкрд╣рдЪрд╛рди

рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХрд┐рд╕ рддрд░рд╣ рдХрд╛ рдЗрд╢рд╛рд░рд╛ рд╣реБрдЖ, рд╣рдо рд╕рд░рд▓ рдЧрдгрдирд╛ рдХрд░реЗрдВрдЧреЗ:

 GestUpDown = GestureUp-GestureDown; GestLeftRight = GestureLeft-GestureRight; 

рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЗрд╕ рд╕рдордп рдХреМрди рд╕реЗ рдЗрд╢рд╛рд░реЗ рд╣реБрдП рд╣реИрдВ, рдпрд╣ GestUpDown рдФрд░ GestLeftRight рдХреЗ рдореВрд▓реНрдп рдирд╣реАрдВ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЗрд╕рдХрд╛ рд╕рдВрдХреЗрдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдмреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдЦреНрдпрд╛ред

рдпрд╣реА рд╣реИ, рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдПрдХ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ GestUpDown рдФрд░ GestLeftRight рдЪрд░ рдХреЗ рдирдХрд╛рд░рд╛рддреНрдордХ рдФрд░ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд▓реЗрддреЗ рд╣реБрдП, рд╣рдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕рд╛ рдЗрд╢рд╛рд░рд╛ рд╕рд╣реА рд╣реИред

GestUpDown рдФрд░ GestLeftRight рдЪрд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рддреНрдп рддрд╛рд▓рд┐рдХрд╛ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЪрд┐рддреНрд░ рдореЗрдВ рджрд┐рдЦрд╛рдИ рдЧрдИ рд╣реИред

рдЫрд╡рд┐

рдЕрдм GFLVL рд░реАрд╕реЗрдЯ рдХрд░реЗрдВ:

 GesturesSet(GESTURES_STOP); 

... рдФрд░ рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрдХреНрд░ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╡рд╛рдкрд╕ред

рдФрд░ рдЕрдм рдкреВрд░рд╛ рдХреЛрдб:

main.c
 #include "stm32f10x.h" #define APDS9960_I2C_ADDR 0x39 #define APDS9960_ENABLE 0x80 #define APDS9960_GSTATUS 0xAF #define APDS9960_GFLVL 0xAE //Gesture FIFO Register (0xFC тАУ 0xFF): #define APDS9960_GFIFO_U 0xFC #define APDS9960_GFIFO_D 0xFD #define APDS9960_GFIFO_L 0xFE #define APDS9960_GFIFO_R 0xFF #define APDS9960_CONTROL 0x8F #define APDS9960_GPENTH 0xA0 #define APDS9960_GEXTH 0xA1 #define APDS9960_GCONF2 0xA3 #define APDS9960_GPULSE 0xA6 #define APDS9960_PPULSE 0x8E #define GESTURES_START 0x01 #define GESTURES_STOP 0x02 #define DEFAULT_GPENTH 40 // Threshold for entering gesture mode #define DEFAULT_GEXTH 30 // Threshold for exiting gesture mode #define DEFAULT_PGAIN 8 // Proximity Gain Control: 4X #define DEFAULT_GGAIN 0x40 // Gesture Gain Control: 4X #define DEFAULT_PULSE_LENGTH 0x89 // 16us, 10 pulses /* Bit fields */ #define APDS9960_PON 0x01 #define APDS9960_AEN 0x02 #define APDS9960_PEN 0x04 #define APDS9960_WEN 0x08 #define APSD9960_AIEN 0x10 #define APDS9960_PIEN 0x20 #define APDS9960_GEN 0x40 #define APDS9960_GVALID 0x01 int GestUpDown = 0; int GestLeftRight = 0; //----------------------------------------------------------------------- uint8_t i2c1_read(uint8_t addr); void i2c1_write(uint8_t addr, uint8_t data); void I2C1_init(void) { I2C_InitTypeDef I2C_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB| RCC_APB2Periph_AFIO , ENABLE); GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_Init(GPIOB, &GPIO_InitStructure); I2C_StructInit(&I2C_InitStructure); I2C_InitStructure.I2C_ClockSpeed = 100000; I2C_InitStructure.I2C_OwnAddress1 = 0x01; I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; I2C_Init(I2C1, &I2C_InitStructure); I2C_Cmd(I2C1, ENABLE); } //----------------------------------------------------------------------- void APDS9960_init(void) { i2c1_write(APDS9960_CONTROL, DEFAULT_PGAIN); i2c1_write(APDS9960_GPENTH, DEFAULT_GPENTH); i2c1_write(APDS9960_GEXTH, DEFAULT_GEXTH); i2c1_write(APDS9960_GCONF2, DEFAULT_GGAIN); i2c1_write(APDS9960_GPULSE, DEFAULT_PULSE_LENGTH); i2c1_write(APDS9960_PPULSE, DEFAULT_PULSE_LENGTH); } //----------------------------------------------------------------------- uint8_t i2c1_read(uint8_t addr) { uint8_t data; while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); I2C_GenerateSTART(I2C1, ENABLE); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); I2C_Send7bitAddress(I2C1, APDS9960_I2C_ADDR<<1, I2C_Direction_Transmitter); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); I2C_SendData(I2C1, addr); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_GenerateSTART(I2C1, ENABLE); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); I2C_Send7bitAddress(I2C1, APDS9960_I2C_ADDR<<1, I2C_Direction_Receiver); while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED)); data = I2C_ReceiveData(I2C1); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)); I2C_AcknowledgeConfig(I2C1, DISABLE); I2C_GenerateSTOP(I2C1, ENABLE); while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); return data; } //----------------------------------------------------------------------- void i2c1_write(uint8_t addr, uint8_t data) { I2C_GenerateSTART(I2C1, ENABLE); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); I2C_Send7bitAddress(I2C1, APDS9960_I2C_ADDR<<1, I2C_Direction_Transmitter); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); I2C_SendData(I2C1, addr); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_SendData(I2C1, data); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_GenerateSTOP(I2C1, ENABLE); while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)) {}; } //----------------------------------------------------------------------- void GesturesSet(uint8_t GestSel) { switch (GestSel) { case GESTURES_START: i2c1_write(APDS9960_ENABLE, APDS9960_GEN | APDS9960_PEN | APDS9960_PON); break; case GESTURES_STOP: i2c1_write(APDS9960_ENABLE, APDS9960_PEN | APDS9960_PON); break; default: i2c1_write(APDS9960_ENABLE, APDS9960_GEN | APDS9960_PEN | APDS9960_PON); } } //----------------------------------------------------------------------- int main() { uint8_t GFLVL_buf = 0; uint8_t GSTATUS_buf = 0; uint8_t GestureUp = 0; uint8_t GestureDown = 0; uint8_t GestureLeft = 0; uint8_t GestureRight = 0; I2C1_init(); APDS9960_init(); while (1) { GFLVL_buf = 0; GSTATUS_buf = 0; GestureUp = 0; GestureDown = 0; GestureLeft = 0; GestureRight = 0; GestUpDown = 0; GestLeftRight = 0; GesturesSet(GESTURES_START); GSTATUS_buf = i2c1_read(APDS9960_GSTATUS); if(GSTATUS_buf & APDS9960_GVALID) { GFLVL_buf = i2c1_read(APDS9960_GFLVL); if(GFLVL_buf) { GestureUp = i2c1_read(APDS9960_GFIFO_U); GestureDown = i2c1_read(APDS9960_GFIFO_D); GestureLeft = i2c1_read(APDS9960_GFIFO_L); GestureRight = i2c1_read(APDS9960_GFIFO_R); //Truth table: //UP: GestUpDown(+) | GestLeftRight(+) //DOWN: GestUpDown(-) | GestLeftRight(-) //LEFT: GestUpDown(+) | GestLeftRight(-) //RIGHT: GestUpDown(-) | GestLeftRight(+) GestUpDown = GestureUp-GestureDown; GestLeftRight = GestureLeft-GestureRight; GesturesSet(GESTURES_STOP); } } } } 


рдореИрдВ рдпрд╣ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ APDS-9960 рдХрд╛ рдЬреЗрд╕реНрдЪрд░ рдореИрдХреЗрдирд┐рдЬреНрдо рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдорд╛рдиреНрдпрддрд╛ рд╕реНрдерд┐рд░ рд╣реИ, APDS-9960 рдпреВрд╡реА рдФрд░ рдЖрдИрдЖрд░ рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдлрд┐рд▓реНрдЯрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╛рдордЧреНрд░реА рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

Source: https://habr.com/ru/post/hi424947/


All Articles