Клавіатура: 3D друк + Arduino + AS5600

Файли для завантаження
Клавіатура: 3D друк + Arduino + AS5600
Компоненти до проєкту
12мм міні чорний металевий кнопковий вимикач без підсвітки та блокування, водонепроникний
Кнопка 12 мм чорна
Новий Pro Micro для Arduino з 2-х рядним пін-хедером, ATmega32U4 5V/16MHz, в наявності
Arduino ATmega32U4
Тонкостінні металічні закриті підшипники 6800-6810-2RS з гумовим ущільненням.
Підшипники 30X42X7mm
Високоякісний понижуючий перетворювач напруги 3A MINI DC-DC 5V-23V до 3.3V 6V 9V 12V
Перетворювач напруги 3A
Набір з 4-х магнітних енкодерів AS5600 12 біт для високоточної вимірювання кута
Магнітний енкодер AS5600
Інструменти задіяні під час збірки
100 шт. пластмасові крапельниці з мікро-дрібним носиком для клею 7/12 см, точний аплікатор
Клейовий дозатор 100 шт.
Керамічні пінцети PINTUDY для електриків, термостійкі, корозійностійкі, антистатичні, 2 шт.
PINTUDY керамічні пінцети 2шт
Блок живлення FNIRSI DPS-150 програмований 30V 5A лабораторний регульований настільний
ЛБЖ FNIRSI DPS-150
Оригінальний розумний паяльник FNIRSI HS01
Паяльник FNIRSI HS-01
1 шт. Щипці з високо швидкісної інструментальної сталі для різання металу та пластику
Щипці для метала та пластику
1-3шт Deli 502 Суперклей Миттєвий швидкосохнучий ціанакрилатний клей для шкіри, гуми, дерева, металу
Суперклей Deli 502 1-3 шт.
Cтрипер Pro’sKit AWG 30-20 з антистатичним ізольованим руків’ям 1PK-3001E
Pro'sKit стрипер дроту 30-20 AWG
Вихідний код проєкту
#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 моделі
Як керувати:
  • Обертання
  • Переміщення
  • Зум

Інші проєкти

Обговорення

guest
Найстаріші
Найновіше Найбільше голосів
Зворотній зв'язок в режимі реального часу
Переглянути всі коментарі
keyboard_arrow_up
0
Буду радий вашим думкам, прокоментуйте.x