Слава роботам! Оно заработало!
Итак, хорошие новости. Вчера как следует загуглил проблему своего тупящего трекера, а именно - судорог двигателя и отсутствия вращения.
В процессе гугления местный ИИ (Gemini), которого я попросил проанализировать скетч автора OG трекера, сообщил, что в коде есть ошибка и один недостаток, смотрим сюда:
const int EN=2; //ENABLE PIN
const int Step=3; // STEP PIN
const int dir=4; // DIRECTION PIN
void setup()
{
pinMode(EN,OUTPUT); // ENABLE AS OUTPUT
pinMode(dir,OUTPUT); // DIRECTION AS OUTPUT
pinMode(Step,OUTPUT); // STEP AS OUTPUT
digitalWrite(dir,HIGH);
}
void loop()
{
digitalWrite(dir,HIGH);
digitalWrite(Step,HIGH); // STEP HIGH
delay(66.48 ); // WAIT
digitalWrite(Step,LOW); // STEP LOW
delay(66.48); // WAIT
}
Что мы видим?
Задействованы пины D2...D4 для выходов Enable, Step и Direction соответственно.
А дальше?
Смотрим Void setup и видим, что несмотря на то, что пин D2 у нас - Enable, функция выходу не придана.
А TMC2209 любит, когда сигнал с пина Enable имеет значение LOW. А у нас никакого значения нет.
Я провел опыт, отсоединив провод от пина Enable и мотор вовсе заглох (что странно, т.к. без управляющего сигнала этого выхода все равно что нет).
Чтобы это исправить, вставляем перед строчкой digitalWrite (dit, HIGH) строчку digitalWrite (EN, LOW)
На выходе имеем:
const int EN=2; //ENABLE PIN
const int Step=3; // STEP PIN
const int dir=4; // DIRECTION PIN
void setup()
{
pinMode(EN,OUTPUT); // ENABLE AS OUTPUT
pinMode(dir,OUTPUT); // DIRECTION AS OUTPUT
pinMode(Step,OUTPUT); // STEP AS OUTPUT
digitalWrite(EN, LOW);
digitalWrite(dir,HIGH);
}
void loop()
{
digitalWrite(dir,HIGH);
digitalWrite(Step,HIGH); // STEP HIGH
delay(66.48); // WAIT
digitalWrite(Step,LOW); // STEP LOW
delay(66.48); // WAIT
}
Обратите внимание, что вместо просто delay, измеряемой в миллисекундах у нас написано delayMicroseconds и указано число в 1000 раз большее.
По мнению Gemini это должно уменьшить накапливаемую ошибку ведения, т.к. дробные значения контроллером округляются и ошибка возникает.
С другой стороны, такое большое значение в микросекундах плохо воспринимается Ардуиной, хотя, как говорится, если нельзя, но очень хочется, то можно - в простых скетчах такое делать не возбраняется. Как это будет работать - проверим позже, на натуре.
ВАЖНОЕ ДОПОЛНЕНИЕ:
Всё-таки код в этой части лучше не трогать. В случае микросекунд вращается слишком быстро.
КОД ВЫШЕ - ПРАВИЛЬНЫЙ И 100% РАБОЧИЙ!!! Все ошибки исправлены.
Ну и вишенка на торте, главная причина тупизны - это разное расположение контактов на шлейфе мотора и на колодке драйвера. Каюсь, моя вина, не подумал даже, что у разных моторов и плат расширения для драйверов разное расположение контактов, а вот поди ж ты.
Разобрал штекер, переставил контакты, все заработало ровно и тихо. Ура, я молодец! Ну и все, кто помогал советами в комментариях к предыдущему посту - вы крутые, спасибо!
Вечером соберу трекер обратно (пришлось разбирать) и буду ждать неба!
P.S.: по дурости чуть не спалил Ардуино. Когда засовывал ее в кроватку, то ошибся на зуб и она сдвинулась. Появился дымок, но я вовремя отрубил питание и ничего не успело сдохнуть.

Исследователи космоса
20.2K постов49.7K подписчиков
Правила сообщества
Какие тут могут быть правила, кроме правил установленных самим пикабу :)