наверное глупый вопрос новичка

Romashchandr

✩✩✩✩✩✩✩
19 Июл 2022
19
0
Заголовок темы должен отражать содержимое. Исправь или тема будет удалена
Тему про типичные ошибки читал.
пытаюсь состыковать энкодер с шаговым мотором использую билбиотеки Encbutton и GyverStepper2 ( включая Stepper Core)
программа ругается на строку кода взятую из документации библиотеки

C++:
C:\Users\r\Documents\Arduino\stepper\stepper.ino: In function 'void loop()':
stepper:35:34: error: expected primary-expression before 'ntar'
     stepper.setTargetDeg(int32_t ntar, GS_posType type = ABSOLUTE);    // поворот направо
                                  ^~~~
stepper:35:51: error: expected primary-expression before 'type'
     stepper.setTargetDeg(int32_t ntar, GS_posType type = ABSOLUTE);    // поворот направо
                                                   ^~~~
гугл что ошибка в синтаксисе, но откуда тут ошибка если я целиком строку из примера взял
 

Normalek

★✩✩✩✩✩✩
6 Авг 2021
140
39
stepper.setTargetDeg(int32_t ntar, GS_posType type = ABSOLUTE);

что за хрен, int32_t и GS_posType type

stepper.setTargetDeg(ntar, ABSOLUTE);

Смотри тут
 
Изменено:

viktor1703

★★★✩✩✩✩
9 Дек 2021
532
131
Естественно будет ругаться, там женужно числа или переменные, которым уже присвоено некоторые значения, писать, а не копипастить строки из документации. В комментарии, что написано?
// установить цель в градусах и опционально режим ABSOLUTE/RELATIVE
Для кого Gyver старался писать комментарии к каждой функции?
 

Вложения

Изменено:

Romashchandr

✩✩✩✩✩✩✩
19 Июл 2022
19
0
@viktor1703, @Normalek,
Спасибо большое. я ж знал что дурацкий вопрос... но новичку неподьемный..... строку взял из Readme.md вот здесь

а код у меня такой.
C++:
#include <FIFO.h>
#include <GStypes.h>
#include <GyverPlanner.h>
#include <GyverPlanner2.h>
#include <GyverStepper.h>
#include <GyverStepper2.h>
#include <StepperCore.h>
#include <EncButton2.h>

EncButton2<EB_ENCBTN> enc(INPUT, 2, 3, 4);  // энкодер с кнопкой
GStepper2<STEPPER2WIRE> stepper(2048, 2, 3);
void setup() {
  Serial.begin(9600);
  //stepper.enable();
  stepper.setMaxSpeed(100);     // скорость движения к цели
  stepper.setAcceleration(200); // ускорение

  enc.holdEncButton(true);      // виртуально зажать кнопку энкодера (для срабатывания нажатых поворотов)
  enc.setEncReverse(true);      // true - инвертировать направление энкодера (умолч. false)
  enc.setEncType(EB_HALFSTEP);  // тип энкодера: EB_FULLSTEP (0) по умолч., EB_HALFSTEP (1) если энкодер делает один поворот за два щелчка
 int32_t ntarL = -1;
 int32_t ntarR = 1;
 }
void loop() {
  enc.tick();                     // опрос происходит здесь
   if (enc.left()) {Serial.println("left");
  stepper.setTargetDeg(ntarL, ABSOLUTE);}
  if (enc.right()) {{Serial.println("right")
    stepper.setTargetDeg(ntarR, ABSOLUTE);    // поворот направо
 
  stepper.tick();  }// мотор асинхронно крутится тут
 

Romashchandr

✩✩✩✩✩✩✩
19 Июл 2022
19
0
еще один наивный вопрос пытаюсь заставить шаговый мотор повораичваться на опеределенный угол в градусах при каждом повороте энкодера.

C++:
GStepper<STEPPER4WIRE> stepper(2048,9, 8, 7, 6);
EncButton2<EB_ENCBTN> enc(INPUT, 2, 3, 4);  // энкодер с кнопкой
void setup() {
 stepper.setRunMode(FOLLOW_POS);   // режим следования к целевй позиции
 stepper.setMaxSpeed(400);         // установка макс. скорости в шагах/сек
 stepper.setAcceleration(500);     // установка ускорения в шагах/сек/сек

  // пусть драйвер выключается при достижении позиции
 // stepper.autoPower(true);
}
void loop() {
 enc.tick();                       // опрос происходит здесь

  // =============== ЭНКОДЕР ===============
  // обычный поворот
 if (enc.left()) {
  bool val;
val = 400;
stepper.tick();
stepper.setTargetDeg(val, RELATIVE);
}
else
if (enc.right()){
bool val2;
val2 = -400;
stepper.tick();
stepper.setTargetDeg(val2, RELATIVE); 
}
получается фигня. на поворот в акю либо сторону энкодера шаговик делает один шаг и только в одну сторону (по часовой стрелке).

шаговик и энкодер покупал по ссылкам Гайвера. проверял их по отдельности на базовых примерах --- работают
 

Romashchandr

✩✩✩✩✩✩✩
19 Июл 2022
19
0
приключения продолжаются. исправив ошибки, решил добавить еще режимы.
теперь при повороте энкодера, мотор должен шагать на 1 градус, а при нажатом повороте на 20 градусов.
C++:
void loop() {
 enc.tick();                       // опрос происходит здесь
stepper.tick();
  // =============== ЭНКОДЕР ===============
  // обычный поворот
if (enc.left()) {
  Serial.println("left");
int val;
val = 1;
stepper.setTargetDeg(val, RELATIVE);
}
//else
if (enc.right()){
  Serial.println("right");
int val2;
val2 = -1;
stepper.setTargetDeg(val2, RELATIVE); 
}
//else
 if (enc.leftH()) {
  Serial.println("leftH");
  int val;
 val = 1;
stepper.setTargetDeg(val*20, RELATIVE);  // нажатый поворот налево
 }
 //else
  if (enc.rightH()) {
   Serial.println("rightH");
  int val;
val = 1;
stepper.setTargetDeg(val*-20, RELATIVE); // нажатый поворот направо
  }
и вот что получается: крутим энкодер -- мотор шагает по 1 градусу, крутим нажатый энкодер -- и мотор опять шагает по 1 градусу, а вот после этого опять просто крутим энкодер -- и мотор шагает по 20 градусов, а по 1 градусу -- крутит нажатый энкодер.
в мониторе порта такая же ситуация. данные инвертированы.

самое смешное что мне так даже удобнее, но понять причину такого поведения очень хочется
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,799
579
44
@Romashchandr, Чтобы при нажатом энкодере увеличивать шаг нужно в момент шага энкодера проверять нажат ли он.
Псевдокод примерно такой:
Код:
if (шаг энкодера вправо) {
  if (энкодер нажат?) {
    сделать шаг вправо на 20 градусов;
  } else {
    сделать шаг вправо на 1 градус;
  }
}
 

Romashchandr

✩✩✩✩✩✩✩
19 Июл 2022
19
0
@Геннадий П,
что то я в примерах Гайвера такого не вижу
C++:
  if (enc.left()) Serial.println("left");     // поворот налево
  if (enc.right()) Serial.println("right");   // поворот направо
  if (enc.leftH()) Serial.println("leftH");   // нажатый поворот налево
  if (enc.rightH()) Serial.println("rightH"); // нажатый поворот направо
А ларчик просто открывался. поменял плюс минус на энкодере и все встало на свои места.
 
Изменено:

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

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Это что то не верное. + должен на + подаваться, а земля на землю.
Скорее всего неверная инициация энкодера, вернее его кнопки. Я последнюю версию не смотре, но в пред отдельных версиях можно было назначить состояние кнопки в ненажатом положении как 0 так 1, а так же было управление подтяжкой.
Если энкодер круглый, то , на сколько я помню, там есть аппаратная подтяжка к +5, соотв. начальное значение 1