#include <Wire.h>
#include <Mouse.h>
#include <Keyboard.h>
// AS5600 I2C address
#define AS5600_ADDR 0x36
// AS5600 register addresses
#define RAW_ANGLE_HIGH 0x0C
#define RAW_ANGLE_LOW 0x0D
// Button pin definitions
#define ESC_BUTTON_PIN 4
#define ENTER_BUTTON_PIN 5
#define SPACE_BUTTON_PIN 6
// Variables to track the encoder state
uint16_t lastAngle = 0;
int16_t scrollDelta = 0;
void setup() {
Wire.begin(); // Initialize I2C
Mouse.begin(); // Initialize HID Mouse
Keyboard.begin(); // Initialize HID Keyboard
// Set button pins as input with pull-up resistors
pinMode(ESC_BUTTON_PIN, INPUT_PULLUP);
pinMode(ENTER_BUTTON_PIN, INPUT_PULLUP);
pinMode(SPACE_BUTTON_PIN, INPUT_PULLUP);
Serial.begin(9600);
Serial.println("AS5600 with Buttons: ESC, Enter, Spacebar");
}
void loop() {
// Handle encoder scrolling
uint16_t currentAngle = readRawAngle();
scrollDelta = calculateScrollDelta(currentAngle, lastAngle);
// Scroll if there's a significant change in angle
if (abs(scrollDelta) > 3) { // Adjust threshold for sensitivity
Mouse.move(0, 0, scrollDelta); // Perform scroll
Serial.print("Scroll Delta: ");
Serial.println(scrollDelta);
}
lastAngle = currentAngle;
// Handle buttons
handleButton(ESC_BUTTON_PIN, KEY_ESC);
handleButton(ENTER_BUTTON_PIN, KEY_RETURN);
handleButton(SPACE_BUTTON_PIN, ' ');
delay(10); // Add a slight delay for smooth operation
}
// Function to read the raw angle from AS5600
uint16_t readRawAngle() {
Wire.beginTransmission(AS5600_ADDR);
Wire.write(RAW_ANGLE_HIGH);
Wire.endTransmission();
Wire.requestFrom(AS5600_ADDR, 2);
uint16_t highByte = Wire.read();
uint16_t lowByte = Wire.read();
return (highByte << 8) | lowByte;
}
// Calculate scroll delta based on angle difference
int16_t calculateScrollDelta(uint16_t current, uint16_t last) {
int16_t delta = current - last;
// Handle overflow
if (delta > 2048) delta -= 4096;
if (delta < -2048) delta += 4096;
// Scale the angle difference for smoother scrolling
return delta / 100; // Adjust scaling factor as needed
}
// Function to handle button presses
void handleButton(int pin, uint8_t key) {
static bool keyStates[3] = {false, false, false};
int buttonIndex = pin - ESC_BUTTON_PIN; // Map pin to index
if (digitalRead(pin) == LOW && !keyStates[buttonIndex]) {
// Button pressed
Keyboard.press(key);
Serial.print("Button Pressed: ");
Serial.println(key);
keyStates[buttonIndex] = true;
} else if (digitalRead(pin) == HIGH && keyStates[buttonIndex]) {
// Button released
Keyboard.release(key);
Serial.print("Button Released: ");
Serial.println(key);
keyStates[buttonIndex] = false;
}
}
Клавіатура: 3D друк + Arduino + AS5600
Компоненти до проєкту
Інструменти задіяні під час збірки
Вихідний код проєкту
Попередній перегляд 3D моделі
Як керувати:
- Обертання
- Переміщення
- Зум
Інші проєкти
Обговорення
Найстаріші