Наливатор с ОЛЕД дисплеем , MP3-плееером, LED подсветкой , шаговиком или сервой.

Anatolyj

★✩✩✩✩✩✩
30 Янв 2020
134
16
Где в скетче сделать инверсию шаговика. Мне надо, чтобы он крутился по часовой стрелке. Сейчас крутит против часовой

const int stepsPerRevolution = - 4096; Может здесь
 

Anatolyj

★✩✩✩✩✩✩
30 Янв 2020
134
16
на 180 перевернуть не проблема, но на драйвере колодка. Перепаивать надо.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,319
1,319
Москва
Тогда изменить порядок
const int motorPin1 = 6;
const int motorPin2 = 7;
const int motorPin3 = 8;
const int motorPin4 = 9;
на
const int motorPin1 = 7;
const int motorPin2 = 6;
const int motorPin3 = 9;
const int motorPin4 = 8;

Кажется так.
 
  • Аррр! -2
Реакции: DarkP1xel

Anatolyj

★✩✩✩✩✩✩
30 Янв 2020
134
16
Точно! я ж когда разворачивал направление в принтере просто переворачивал колодку полностью
собираю другу подарок из модели танка т 34. Напечатал две шестеренки большую на башню и маленькую на шаговик. Подключил к ардуино крутится плавно. Подключаю концевик, экран и энкодер больше 40 градусов не поворачивает. Полагаю надо менять шаги в скетче. Это здесь
const int stepsPerRevolution
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,319
1,319
Москва
Менять можно. Там такая ситуация, что я считаю нулевой концевик стоит где то и я не кручу более какого то кол-ва градусов. Есть софт. ограничение. Его надо поменять в зависимости от передаточного числа шестеренок.
вот тут: eeprom_proc.ino, строки в р-не 157
C++:
        enc_pos = min(enc_pos + 1, 180);
      }
      if (enc.isLeft())
      {
        enc_pos = max(enc_pos - 1, 0);
Если максимум 40 градусов, то отношение шестеренок где то 1:4.5, тогда для оборота на 180 надо вместо 180 ставить 810, это раз. Но! для хранения данных в EEPROM используется один байт. т.е 255 максимум. Да и хранить значения в попугаях не хорошо. Тогда тут оставляем градусы и ищем
1) вот эту строку
stepper1.Write(enc_pos); // устанавливаем текущую позицию
и в ней enc_pos умножаем на 4.5
2) чуть ниже еще одна такая же строка
stepper1.Write(enc_pos);
в ней делаем аналогично.
Это будет работать только калибровка!
далее надо найти аналогичные "stepper1.Write( " строки во всех файлах проекта и умножить их на передаточное число. Лучше его тогда в начало вписать в #define
 

Anatolyj

★✩✩✩✩✩✩
30 Янв 2020
134
16
Менять можно. Там такая ситуация, что я считаю нулевой концевик стоит где то и я не кручу более какого то кол-ва градусов. Есть софт. ограничение. Его надо поменять в зависимости от передаточного числа шестеренок.
вот тут: eeprom_proc.ino, строки в р-не 157
C++:
        enc_pos = min(enc_pos + 1, 180);
      }
      if (enc.isLeft())
      {
        enc_pos = max(enc_pos - 1, 0);
Если максимум 40 градусов, то отношение шестеренок где то 1:4.5, тогда для оборота на 180 надо вместо 180 ставить 810, это раз. Но! для хранения данных в EEPROM используется один байт. т.е 255 максимум. Да и хранить значения в попугаях не хорошо. Тогда тут оставляем градусы и ищем
1) вот эту строку
stepper1.Write(enc_pos); // устанавливаем текущую позицию
и в ней enc_pos умножаем на 4.5
2) чуть ниже еще одна такая же строка
stepper1.Write(enc_pos);
в ней делаем аналогично.
Это будет работать только калибровка!
далее надо найти аналогичные "stepper1.Write( " строки во всех файлах проекта и умножить их на передаточное число. Лучше его тогда в начало вписать в #define
Так должно получиться
stepper4,5.Write(enc_pos);
//delay(25);
old_enc_pos = enc_pos;
//Serial.println(enc_pos);

1 - режим "external driver" (A4988) значит может так
stepper1.Write(enc_pos 4,5)
 

Anatolyj

★✩✩✩✩✩✩
30 Янв 2020
134
16
вполне может быть, я не пробовал с драйвером. Может еще что то надо менять будет.
stepper1.Write(enc_pos); // устанавливаем текущую позицию
и в ней enc_pos умножаем на 4.5 не могу понять как правильно stepper1.Write(enc_pos * 4.5) так
#define stepper1.Write(enc_pos * 4.5) и так
 
Изменено:

Anatolyj

★✩✩✩✩✩✩
30 Янв 2020
134
16
Так должно получиться
stepper4,5.Write(enc_pos);
//delay(25);
old_enc_pos = enc_pos;
//Serial.println(enc_pos);
Внес изменения. Теперь при калибровке нажимаю концевик. Шаговик останавливается и начинает дальше крутить на 360 градусов
 

Вложения

Anatolyj

★✩✩✩✩✩✩
30 Янв 2020
134
16
в начале файла, что бы легче менять:
#define KP 4.5

каждый write на:
stepper1.Write(enc_pos * KP);
в начале eeprom_proc.ino
#define KP 4.5

На шаговике стоит 22 зуба (ведущая) на башне 96 зубьев (ведомая). Итого получается 96/22=4,36 (ты почти угадал с 4,5)

в curservonaliv ino вот эта строка Cur_servo_pos = 180;
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,319
1,319
Москва
Значит так, позиции не трогаем, они как были в градусах так и пускай остаются в градусах БАШНИ. что бы получить из них градусы шаговика надо градусы башни умножить на 4.36. Тут все четко.
Дальше что надо проверить.
Тут возможен такой вариант, что надо править библиотеку,.. точно надо , смотри:
я считаю мат. угол, это мои изменения в библиотеки, поэтому точно мои. и у автора тоже как то так сделано. угол сервы только от 0 до 359. т.е. больше 1 оборота задать затруднительно. Тут надо подумать как сделать.
надо открыть вот этот файл в библиотеке AsyncStepperLib.cpp
и найти место
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;
}
Это вычисление углов. простой и математический. они ограничены 360 градусами...Возможно в библиотеке надо 360 заменить на 1560 (4,36 по 360), тогда будет корректно работать на несколько оборотов.

Надо посмотреть как степпер ведет себя, если ему дать больше одного полного оборота, я не пробовал.
 

Anatolyj

★✩✩✩✩✩✩
30 Янв 2020
134
16
Значит так, позиции не трогаем, они как были в градусах так и пускай остаются в градусах БАШНИ. что бы получить из них градусы шаговика надо градусы башни умножить на 4.36. Тут все четко.
Дальше что надо проверить.
Тут возможен такой вариант, что надо править библиотеку,.. точно надо , смотри:
я считаю мат. угол, это мои изменения в библиотеки, поэтому точно мои. и у автора тоже как то так сделано. угол сервы только от 0 до 359. т.е. больше 1 оборота задать затруднительно. Тут надо подумать как сделать.
надо открыть вот этот файл в библиотеке AsyncStepperLib.cpp
и найти место
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;
}
Это вычисление углов. простой и математический. они ограничены 360 градусами...Возможно в библиотеке надо 360 заменить на 1560 (4,36 по 360), тогда будет корректно работать на несколько оборотов.

Надо посмотреть как степпер ведет себя, если ему дать больше одного полного оборота, я не пробовал.
Так это менять
#define KP 4.5
каждый write на:
stepper1.Write(enc_pos * KP);
enc_pos = min(enc_pos + 1, 810)

или только в библиотеке менять
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,319
1,319
Москва
Надо и так и так. библиотека работает с углами от 0 до 359, а надо что бы работала с углами от 0 до 1560. ну или что бы проще было до 1800, 5 обороторв.
Ну и соотв. угол нудно давать на вход, а это то, что надо в программе изменить: то, что выше.

Сейчас внесу кой какие правки в библиотеку на скорую руку, что бы углы можно было задавать не только 0-360, а с большим диапазоном. выложу сюда
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,319
1,319
Москва
@Anatolyj, В прикреплении видоизмененная библиотека, рассчитана на 5 оборотов шаговика, вроде бы корректно работает по углам.
С этими изменениями :
#define KP 4.36
каждый write на:
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);
ограничивает вращение башни от 0 до 180 градусов. Ее не трогать. Если надо увеличить угол расстаноки стаканов, то надо 180 заменить на требуемое.


Может быть стоит библиотеку кинуть локально, прям в каталог проекта.
 

Вложения

  • Лойс +1
Реакции: MaxPadonak

Старик Похабыч

★★★★★★★
14 Авг 2019
4,319
1,319
Москва
Главное надо помнить, что прошивка работает с углами башни, физические углы, которые не могут быть больше 360, а вот шаговик работает еще и с оборотами теперь. Т.е. когда говорим ему угол или спрашиваем угол у него, надо приводить к физическим углам, умножив или поделив на передаточное число шестеренок.
 

Anatolyj

★✩✩✩✩✩✩
30 Янв 2020
134
16
ну вот же и все! Надо мне учить больше матчасть