Необходимо модифицировать прошивку Grbl для Arduino Uno

Job ID: 39005430

Budget: €30 – €250 EUR

Техническое задание: Интеграция функций из пользовательской прошивки в Grbl

Описание проекта
Необходимо модифицировать исходный код Grbl для Arduino Uno, чтобы он выполнял функции из моей пользовательской прошивки, сохранив основные возможности Grbl для управления шаговыми двигателями.

Функциональные требования
1. Обработка пина A2:
- Чтение состояния кнопки, подключённой к пину A2.
- Если кнопка нажата (LOW), в COM-порт должна отправляться строка `"ON"`.
- Добавить защиту от дребезга (debounce), интервал — 20 мс.

2. Работа с модулем HX711 (пины A0 и A1):
- Чтение данных с HX711:
- При получении команды `"1"` через COM-порт, отправлять в порт измеренные данные веса с использованием функции `scale.get_units()` (до одного десятичного знака).
- Сброс весов (tare):
- При получении команды `"2"` через COM-порт, выполнять сброс весов (`scale.tare()`).
- Коэффициент калибровки:
- Использовать заданный коэффициент калибровки -412.


- Основные функции Grbl, связанные с управлением шаговыми двигателями, должны работать как в стандартной прошивке.
- Использование пинов A0, A1 и A2 в Grbl (по умолчанию) должно быть отключено, так как они используются для реализации новых функций.

Оборудование
1. Arduino Uno
2. HX711 с подключёнными весами.
3. Кнопка, подключённая к пину A2 .

Ожидаемый результат
1. Я загружаю модифицированную прошивку Grbl в Arduino Uno.
2. Grbl продолжает управлять шаговыми двигателями через стандартный интерфейс (команды G-code).
3. Дополнительные функции работают следующим образом:
- Нажатие кнопки (пин A2) отправляет `"ON"` в COM-порт.
- Команды через COM-порт `"1"` и `"2"` вызывают взаимодействие с модулем HX711 (измерение веса и сброс соответственно).
4. Код протестирован и стабильно работает.

Пример кода из текущей прошивки
Для реализации новых функций можно использовать следующую логику:
cpp
HX711 scale(DOUT, CLK); // DOUT=A0, CLK=A1
#define calibration_factor -412

void setup() {
pinMode(A2, INPUT_PULLUP);
Serial.begin(9600);
scale.set_scale(calibration_factor);
}

void loop() {
// Логика для обработки кнопки
if (digitalRead(A2) == LOW) {
Serial.println("ON");
}

// Логика для обработки команд через COM-порт
if (Serial.available()) {
char c = (char)Serial.read();
if (c == '1') {
Serial.println(scale.get_units(), 1);
}
if (c == '2') {
scale.tare();
}
}
}


Важные требования
1. Код должен быть протестирован, чтобы исключить конфликты между стандартными функциями Grbl и новыми функциями.
2. Минимальное вмешательство в исходный код Grbl для упрощения дальнейших обновлений.
3. Подробные комментарии и описание изменений в коде.