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

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

Вітаю! проект цікавий але нажаль вмене не працює. Все підпаяно вірно, комп пристрій бачить але не керується. Без магніту скролер на екрані хаотично скролить (дригається.). З магнітом перестає. Пробував на кільох компах та з різними кабелями

Andrijchenko Andrij
Andrijchenko Andrij
10 днів тому назад
Відповісти на  CHD Maker

Дуже дякую за швидку відповідь. Так, магніт точно від цього енкодера. Цікаво те що скролер дригається коли нема магніту близько (інших магнітів нема теж), а от коли його рідний магніт приблизити до енкодера то дригання припиняється. Але всерівно не керується. Гадаю що бракований енкодер. Вольтаж на енкодер приходить близько 3.3v

keyboard_arrow_up
3
0
Буду радий вашим думкам, прокоментуйте.x