Pular para o conteúdo principal

Grove - Mini Track Ball

pir

Grove - Mini Track ball oferece um acesso fácil para prototipar um módulo prático de rastreamento de movimento para suas aplicações. Ele possui detecção de 360° e detecção de clique com alta precisão e resposta rápida. Com os chips STM32F103C8T6 e AN48841B integrados, você pode transformar muitas de suas ideias em coisas tangíveis. Ele também é padronizado com a interface Grove, o que economizará muito trabalho no processo de prototipagem.

pir

Recursos

  • Detecção rápida e de 360°.
  • Botão de clique translúcido.
  • Padronizado com interface Grove.
  • MCU poderosa para você enriquecer suas aplicações.
dica

Para mais detalhes sobre os módulos Grove, consulte o Grove System

Ideias de aplicação

  • Módulo de rastreamento para um gamepad.
  • Módulo de rastreamento para um controlador háptico.
  • Módulo de rastreamento para brinquedos.

Especificações

ParâmetroValor
Tensão de operação3,3V~5,5V (típico em 5V)
Corrente de operação28 mA (corrente máxima de operação: 40 mA)
Faixa de temperatura de operação-25 ~ 75 ℃
Frequência do MCU64 MHz
Frequência de operação105±5kHz
Faixa de intensidade de campo de efeito Hall(0,5) ~ (8) mT
Endereço I2C0x4A

Visão geral do hardware

pir

  • Interface Grove
    Conecte a placa de controle principal, como a placa Seeeduino, ao Grove - Mini Track Ball.

  • MCU (STM32F103C8T6)
    Microcontrolador.

  • Track ball
    Interface para controlar movimentos.

Primeiros passos

Brincar com Arduino

Hardware

  • Passo 1. Prepare os seguintes itens:
Seeeduino V4.2Grove-Mini_Track_Ball

pir

pir

Adquira agoraAdquira agora
  • Passo 2. Conecte o Grove-Mini_Track_Ball à porta I2C do Seeeduino.
  • Passo 3. Conecte o Seeeduino ao PC por meio de um cabo USB.

pir

Software

Passo 1. Baixe o demo do Github.

Passo 2. Abra o arquivo Grove - Mini Track ball test.ino



#include <Wire.h>

/*---------------------------------------------------------------------------------------//
* define the default data
*/
#define ReadMode 0
#define WriteMode 1
#define DeAddr 0X4A
#define ConfigValid 0x3a6fb67c


/*---------------------------------------------------------------------------------------//
* define the enum type for Register
*/
enum MOTION_REG_ADDR
{
MOTION_REG_UP = 0X00,
MOTION_REG_DOWN,
MOTION_REG_LEFT,
MOTION_REG_RIGHT,
MOTION_REG_CONFIRM,
MOTION_REG_NUM
};

enum CONFIG_REG_ADDR
{
CONFIG_REG_VALID = MOTION_REG_NUM,
CONFIG_REG_I2C_ADDR = CONFIG_REG_VALID + 4,
CONFIG_REG_I2C_SPEED,
CONFIG_REG_LED_MODE = CONFIG_REG_I2C_SPEED + 2,
CONFIG_REG_LED_FLASH_TIME,
CONFIG_REG_DATA_CLEAR_TIME = CONFIG_REG_LED_FLASH_TIME + 2, //CONFIG_REG_LED_FLASH_TIME has 2bytes
CONFIG_REG_DATA_READ_TIME = CONFIG_REG_DATA_CLEAR_TIME + 2,
CONFIG_REG_NUM = CONFIG_REG_DATA_READ_TIME + 2
};


/*---------------------------------------------------------------------------------------//
* define the LED word mode
*/
enum LED_MODE
{
LED_FLASH_1 = 0X00,
LED_FLASH_2,
LED_FLASH_TOGGLE,
LED_FLASH_ALL,
LED_ALWAYS_ON_1,
LED_ALWAYS_ON_2,
LED_ALWAYS_ON_ALL,
LED_ALWAYS_OFF,
LED_BREATHING_1,
LED_BREATHING_2,
LED_BREATHING_ALL,
LED_MOVE_FLASH,
LED_MODE_NUM
};



/*---------------------------------------------------------------------------------------//
* Write one byte into register
*/
void WriteByte(uint8_t Reg, uint8_t Value)
{
Wire.beginTransmission(DeAddr);
Wire.write(WriteMode);
Wire.write(Reg);
Wire.write(Value);
Wire.endTransmission();
}

/*---------------------------------------------------------------------------------------//
* Write N byte into register
*/
void WriteNByte(uint8_t Reg , uint8_t * Value , uint8_t len)
{
Wire.beginTransmission(DeAddr);
Wire.write(WriteMode);
Wire.write(Reg);
for(int i = 0;i<len;i++)
{
Wire.write(Value[i]);
}
Wire.endTransmission();
}

/*---------------------------------------------------------------------------------------//
* Write one word(4 bytes,32 bits) into register ,the register address must be continuous
*/
void WriteOneWord(uint8_t Reg, uint32_t Value)
{
uint8_t tmp[4]={0};
tmp[0] = (Value>>0)&0XFF;
tmp[1] = (Value>>8)&0XFF;
tmp[2] = (Value>>16)&0XFF;
tmp[3] = (Value>>24)&0XFF;
WriteNByte(Reg,tmp,4);
}


/*---------------------------------------------------------------------------------------//
* Write half word(2 bytes,16 bits) into register ,the register address must be continuous
*/
void WriteHalfWord(uint8_t Reg, uint16_t Value)
{
uint8_t tmp[2]={0};
tmp[0] = (Value>>0)&0XFF;
tmp[1] = (Value>>8)&0XFF;
WriteNByte(Reg,tmp,2);
}

/*---------------------------------------------------------------------------------------//
* Read one byte from register
*/
uint8_t ReadByte(uint8_t Reg)
{
Wire.beginTransmission(DeAddr);
Wire.write(ReadMode);
Wire.write(Reg);
Wire.write(1);
Wire.endTransmission();
Wire.requestFrom(DeAddr, 1);
return Wire.read();
}
/*---------------------------------------------------------------------------------------//
* Read half word from register
*/
uint16_t ReadHalfWord(uint8_t Reg)
{
uint16_t tmp;
tmp = ReadByte(Reg);
tmp |= ((uint16_t)ReadByte(Reg+1))<<8;
return tmp;
}
/*---------------------------------------------------------------------------------------//
* Read one word from register
*/
uint32_t ReadOneWord(uint8_t Reg)
{
uint32_t tmp;
tmp = ReadByte(Reg);
tmp |= ((uint32_t)ReadByte(Reg+1))<<8;
tmp |= ((uint32_t)ReadByte(Reg+2))<<16;
tmp |= ((uint32_t)ReadByte(Reg+3))<<24;
return tmp;
}

/*---------------------------------------------------------------------------------------//
* Set LED mode ,reference to the enum type LED_MODE
*/
void SetLedMode(uint8_t LED_MODE)
{
WriteByte(CONFIG_REG_LED_MODE,LED_MODE);
}

/*---------------------------------------------------------------------------------------//
* test api ,Set LED mode circularly ,reference to the enum type LED_MODE
*/
void test_SetLedMode(void)
{
unsigned char tmp[8]={0};
for(int i=0;i<LED_MODE_NUM;i++)
{
//WriteByte(CONFIG_REG_LED_MODE,(enum LED_MODE)i);
tmp[0] = i;
WriteNByte(CONFIG_REG_LED_MODE ,tmp , 1);
delay(5000);
}
}

/*---------------------------------------------------------------------------------------//
* test api,print the track ball data
*/
void test_PrintTrackData(void)
{
for(int i=0;i<500;i++)
{
Serial.print(ReadByte(MOTION_REG_UP));
Serial.print("-");
Serial.print(ReadByte(MOTION_REG_DOWN));
Serial.print("-");
Serial.print(ReadByte(MOTION_REG_LEFT));
Serial.print("-");
Serial.print(ReadByte(MOTION_REG_RIGHT));
Serial.print("-");
Serial.println(ReadByte(MOTION_REG_CONFIRM));
delay(100);
}
}

/*---------------------------------------------------------------------------------------//
* test api,Write register
*/
void test_WriteReg(void)
{
unsigned char tmp[8]={0};
tmp[0] = 0X4A;
WriteByte(CONFIG_REG_I2C_ADDR ,tmp[0]);
delay(100);
tmp[0] = 0X64;
tmp[1] = 0X00;
WriteByte(CONFIG_REG_I2C_SPEED ,tmp[0]);
WriteByte(CONFIG_REG_I2C_SPEED+1 ,tmp[1]);
delay(100);
tmp[0] = 10;
WriteByte(CONFIG_REG_LED_MODE ,tmp[0]);
delay(100);
tmp[0] = 0xc8;
tmp[1] = 0x00;
WriteByte(CONFIG_REG_LED_FLASH_TIME ,tmp[0]);
WriteByte(CONFIG_REG_LED_FLASH_TIME+1 ,tmp[1]);
delay(100);
tmp[0] = 0XEA;
tmp[1] = 0X14;
WriteByte(CONFIG_REG_DATA_CLEAR_TIME ,tmp[0]);
WriteByte(CONFIG_REG_DATA_CLEAR_TIME+1 ,tmp[1]);
delay(100);
tmp[0] = 0X22;
tmp[1] = 0X05;
WriteByte(CONFIG_REG_DATA_READ_TIME ,tmp[0]);
WriteByte(CONFIG_REG_DATA_READ_TIME+1 ,tmp[1]);
delay(1000);
Serial.println("Setted Value are over here");
Serial.print("valid:0x");Serial.print(ReadByte(CONFIG_REG_VALID+3),HEX);Serial.print(ReadByte(CONFIG_REG_VALID+2),HEX);Serial.print(ReadByte(CONFIG_REG_VALID+1),HEX);Serial.println(ReadByte(CONFIG_REG_VALID+0),HEX);
Serial.print("I2C_ADDR:0x");Serial.println(ReadByte(CONFIG_REG_I2C_ADDR+0),HEX);
Serial.print("I2C_SPEED:0x");Serial.print(ReadByte(CONFIG_REG_I2C_SPEED+1),HEX);Serial.println(ReadByte(CONFIG_REG_I2C_SPEED+0),HEX);
Serial.print("LED_MODE:0x");Serial.println(ReadByte(CONFIG_REG_LED_MODE+0),HEX);
Serial.print("LED_FLASH_TIME:0x");Serial.print(ReadByte(CONFIG_REG_LED_FLASH_TIME+1),HEX);Serial.println(ReadByte(CONFIG_REG_LED_FLASH_TIME+0),HEX);
Serial.print("DATA_CLEAR_TIME:0x");Serial.print(ReadByte(CONFIG_REG_DATA_CLEAR_TIME+1),HEX);Serial.println(ReadByte(CONFIG_REG_DATA_CLEAR_TIME+0),HEX);
Serial.print("DATA_READ_TIME:0x");Serial.print(ReadByte(CONFIG_REG_DATA_READ_TIME+1),HEX);Serial.println(ReadByte(CONFIG_REG_DATA_READ_TIME+0),HEX);
Serial.println();Serial.println();Serial.println();
delay(3000);

}


/*---------------------------------------------------------------------------------------//
* test api,Set all config to default value
*/
void test_SetDefault(void)
{
unsigned char Zero[]={0,0,0,0};
Serial.println("Setting Default Value");
WriteNByte(CONFIG_REG_VALID , Zero , 4);
delay(100);
Serial.println("Default Value are over here");
Serial.print("valid:0x");Serial.print(ReadByte(CONFIG_REG_VALID+3),HEX);Serial.print(ReadByte(CONFIG_REG_VALID+2),HEX);Serial.print(ReadByte(CONFIG_REG_VALID+1),HEX);Serial.println(ReadByte(CONFIG_REG_VALID+0),HEX);
Serial.print("I2C_ADDR:0x");Serial.println(ReadByte(CONFIG_REG_I2C_ADDR+0),HEX);
Serial.print("I2C_SPEED:0x");Serial.print(ReadByte(CONFIG_REG_I2C_SPEED+1),HEX);Serial.println(ReadByte(CONFIG_REG_I2C_SPEED+0),HEX);
Serial.print("LED_MODE:0x");Serial.println(ReadByte(CONFIG_REG_LED_MODE+0),HEX);
Serial.print("LED_FLASH_TIME:0x");Serial.print(ReadByte(CONFIG_REG_LED_FLASH_TIME+1),HEX);Serial.println(ReadByte(CONFIG_REG_LED_FLASH_TIME+0),HEX);
Serial.print("DATA_CLEAR_TIME:0x");Serial.print(ReadByte(CONFIG_REG_DATA_CLEAR_TIME+1),HEX);Serial.println(ReadByte(CONFIG_REG_DATA_CLEAR_TIME+0),HEX);
Serial.print("DATA_READ_TIME:0x");Serial.print(ReadByte(CONFIG_REG_DATA_READ_TIME+1),HEX);Serial.println(ReadByte(CONFIG_REG_DATA_READ_TIME+0),HEX);
Serial.println();Serial.println();Serial.println();
delay(3000);
}

void setup() {

Wire.begin();
Serial.begin(115200);
}

void loop() {

test_SetLedMode();

test_PrintTrackData();

test_WriteReg();

test_SetDefault();

delay(3000);
}


Passo 3. Envie seu código para a placa Seeeduino. Quando o processo de upload estiver concluído, para abrir a janela Serial Monitor, clique em Serial Monitor no menu Tool.

Passo 4. O LED indicador sob a trackball acenderá em diferentes modos, que durarão cerca de 50 segundos

Passo 5. Depois disso, você pode girar ou "clicar" na trackball para obter informações sobre sua trajetória.

Recursos

Suporte Técnico e Discussão de Produto

Obrigado por escolher nossos produtos! Estamos aqui para oferecer a você diferentes tipos de suporte para garantir que sua experiência com nossos produtos seja a mais tranquila possível. Oferecemos vários canais de comunicação para atender a diferentes preferências e necessidades.

Loading Comments...