Ок...спасибо!Схемы подключения есть в 1-ых сообщениях, Что то точно как у Алекса, что то на других пинах
собираю другу подарок из модели танка т 34. Напечатал две шестеренки большую на башню и маленькую на шаговик. Подключил к ардуино крутится плавно. Подключаю концевик, экран и энкодер больше 40 градусов не поворачивает. Полагаю надо менять шаги в скетче. Это здесьТочно! я ж когда разворачивал направление в принтере просто переворачивал колодку полностью
enc_pos = min(enc_pos + 1, 180);
}
if (enc.isLeft())
{
enc_pos = max(enc_pos - 1, 0);
stepper1.Write(enc_pos); // устанавливаем текущую позицию
stepper1.Write(enc_pos);
Так должно получитьсяМенять можно. Там такая ситуация, что я считаю нулевой концевик стоит где то и я не кручу более какого то кол-ва градусов. Есть софт. ограничение. Его надо поменять в зависимости от передаточного числа шестеренок.
вот тут: eeprom_proc.ino, строки в р-не 157
Если максимум 40 градусов, то отношение шестеренок где то 1:4.5, тогда для оборота на 180 надо вместо 180 ставить 810, это раз. Но! для хранения данных в EEPROM используется один байт. т.е 255 максимум. Да и хранить значения в попугаях не хорошо. Тогда тут оставляем градусы и ищемC++:enc_pos = min(enc_pos + 1, 180); } if (enc.isLeft()) { enc_pos = max(enc_pos - 1, 0);
1) вот эту строку
stepper1.Write(enc_pos); // устанавливаем текущую позицию
и в ней enc_pos умножаем на 4.5
2) чуть ниже еще одна такая же строка
stepper1.Write(enc_pos);
в ней делаем аналогично.
Это будет работать только калибровка!
далее надо найти аналогичные "stepper1.Write( " строки во всех файлах проекта и умножить их на передаточное число. Лучше его тогда в начало вписать в #define
stepper1.Write(enc_pos); // устанавливаем текущую позициювполне может быть, я не пробовал с драйвером. Может еще что то надо менять будет.
Внес изменения. Теперь при калибровке нажимаю концевик. Шаговик останавливается и начинает дальше крутить на 360 градусовТак должно получиться
stepper4,5.Write(enc_pos);
//delay(25);
old_enc_pos = enc_pos;
//Serial.println(enc_pos);
в начале eeprom_proc.inoв начале файла, что бы легче менять:
#define KP 4.5
каждый write на:
stepper1.Write(enc_pos * KP);
float AsyncStepper::GetCurrentAngle() const
{
return 360.0f * _currentStep / _motorSteps;
}
unsigned int AsyncStepper::GetCurrentAngleMath() const
{
unsigned int res=360.0f - 360.0f * _currentStep / _motorSteps;
return res%360;
}
Так это менятьЗначит так, позиции не трогаем, они как были в градусах так и пускай остаются в градусах БАШНИ. что бы получить из них градусы шаговика надо градусы башни умножить на 4.36. Тут все четко.
Дальше что надо проверить.
Тут возможен такой вариант, что надо править библиотеку,.. точно надо , смотри:
я считаю мат. угол, это мои изменения в библиотеки, поэтому точно мои. и у автора тоже как то так сделано. угол сервы только от 0 до 359. т.е. больше 1 оборота задать затруднительно. Тут надо подумать как сделать.
надо открыть вот этот файл в библиотеке AsyncStepperLib.cpp
и найти место
Это вычисление углов. простой и математический. они ограничены 360 градусами...Возможно в библиотеке надо 360 заменить на 1560 (4,36 по 360), тогда будет корректно работать на несколько оборотов.C++:float AsyncStepper::GetCurrentAngle() const { return 360.0f * _currentStep / _motorSteps; } unsigned int AsyncStepper::GetCurrentAngleMath() const { unsigned int res=360.0f - 360.0f * _currentStep / _motorSteps; return res%360; }
Надо посмотреть как степпер ведет себя, если ему дать больше одного полного оборота, я не пробовал.
#define KP 4.36
stepper1.Write(enc_pos * KP);
stepper1.GetCurrentAngleMath();
int16_t old_enc_pos = stepper1.GetCurrentAngleMath();
int16_t old_enc_pos = stepper1.GetCurrentAngleMath()/KP;
enc_pos = min(enc_pos + 1, 180);