Уважаемые ГУРУ. Помогите пожалуйста с кодом новичку

manergeim
Offline
Зарегистрирован: 07.07.2019

Добрый вечер, Уважаемые ГУРУ.

Я новичок, зеленый. В программировании 0.  Помогите пожалуйста убрать ошибки. И подправить нижнюю часть кода. Верхняя и середина вроде в порядке. Кажется…. Скетч не компилируется и выдает ошибку.  

Я хочу сделать двух координатный столик из Китая (https://ru.aliexpress.com/item/32725814262.html?spm=a2g0v.search0604.3.1.25734c0fTykmgH&ws_ab_test=searchweb0_0%2Csearchweb201602_1_10065_10068_319_317_10696_453_10084_454_10083_10618_10307_10301_537_536_10059_10884_10887_321_322_10915_10103_10914_10911_10910%2Csearchweb201603_52%2CppcSwitch_0&algo_expid=7aa2c5fa-ed2f-470f-8a80-1754942a6c14-0&algo_pvid=7aa2c5fa-ed2f-470f-8a80-1754942a6c14) на шаговых двигателях. Драйверы думаю использовать DRV8825. Также заказал, посидев на форумах TMC2208 И TMC2100. Так же заказал плату расширения (2шт) (https://ru.aliexpress.com/item/32824769997.html?spm=a2g0s.9042311.0.0.681a33edt3F34B) Будет стоят два двигателя (NEMA 17, серии 17HS4401). Плата Ардуино будет такой (https://ru.aliexpress.com/item/32339945138.html?spm=a2g0s.9042311.0.0.681a33edt3F34B) Каждый будет с регулировкой вращения оборотов потенциометром и 3-х позиционной кнопкой для выбора направления вращения. Кнопки можно будет купить в ЧИП и ДИП Что-то вроде (https://www.chipdip.ru/product/mts-113-a-2). Потенциометр движковый ((https://ru.aliexpress.com/item/32828467805.html?spm=a2g0s.9042311.0.0.681a33edt3F34B)

Блок питания для э

Сдаюсь сразу - код не мой!! Он был взят за основу. Он изначально был сделан под управления драйвером на прямую, без плат расширения. Я его начал переделывать. И сопли висящее мне не нравится. По началу все было понятно. Когда пошел void loop() , поплыл. Про нижнюю часть, «в которой проверяется текущее состояние кнопки  и потенциометра», я вообще молчу.


/*Управление двумя шаговыми двигателями с Arduino. Управление вращения каждого двигателя с помощью 2  3-х позиционных переключателей и 2 движковых потенциометров*/

/*Программа для вращения двумя шаговыми моторами NEMA 17, серии 17HS4401 + драйвер DRV8825.  Возможна установка TMC2100 или TMC2208. 
В схему включены 2 кнопки с 3-мя положениями (I, II, среднее - выключено) и два потенциометра. Кнопка регулирует направление вращения мотора, а данные 
с потенциометра показывают с какой скоростью крутится мотор*/
//Включение библиотек
#include <AccelStepper.h>
#include <GyverButton.h>
#include <Bounce2.h>

//определение постоянных Arduino pin
const int ledEnable = 13; //светодиод на борту покажет нам состояние активации двигателей 
const int pinEnable = 8; // контакты, которые управляют состоянием ENABLE драйверов DRV8825, соединены последовательно, поэтому достаточно одного контакта для управления обоими 
const int pinDirX = 7;  //цифровой вывод, который дает направление вращения двигателя X
const int pinStepX = 6;  //цифровой вывод, который дает сигнал на вращение двигателя X
const int pinDirY = 5;  //цифровой вывод, который дает направление вращения двигателя Y
const int pinStepY = 4;  //цифровой вывод, который дает сигнал на вращение двигателя Y

/*Контакты от двух положений кнопки X - цифровые*/ 
const int ButtonOnX1 = 11;
const int ButtonOnX2 = 12;

/*Контакты от двух положений кнопки Y - цифровые*/ 
const int ButtonOnY1 = 9;
const int ButtonOnY2 = 10;

/*Контакт регистрирующий значение потенциометра X - аналоговый*/ 
const int PotenciomDataX = 1;
/*Контакт регистрирующий значение потенциометра Y - аналоговый*/ 
const int PotenciomDataY = 2;

//временная задержка между шагами мотора X в мс 
const int move_delayX = 3;
//временная задержка между шагами мотора Y в мс 
const int move_delayY = 3;

/*целочисленная константа, показывающая временную задержку между считыванием состояния кнопки X и потенциометра X*/ 
const int CheckButtonDelayX = 15;
/*целочисленная константа, показывающая временную задержку между считыванием состояния кнопки Y и потенциометраY*/ 
const int CheckButtonDelayY = 15;

/*Целочисленная переменная показывающая, сколько прошло времени и не пора ли считывать состояние кнопки X*/ 
int CurrentButtonDelayX = 0;
/*Целочисленная переменная показывающая, сколько прошло времени и не пора ли считывать состояние кнопки*/ 
int CurrentButtonDelayY = 0;

//состояние кнопки X включено-выключено 
int ButtonStateX = 0;
//состояние кнопки Y включено-выключено 
int ButtonStateY = 0;

//направление вращения согласно кнопке X I - 1, II - 0 
int ButtonDirectionX = 0;
//направление вращения согласно кнопке Y I - 1, II - 0 
int ButtonDirectionY = 0;
void setup() {
/*задаём контактам StepX и DirX режим вывода, то есть они выдают напряжение*/ 
pinMode(pinStepX, OUTPUT); 
pinMode(pinDirX, OUTPUT); 
/*задаём контактам StepY и DirY режим вывода, то есть они выдают напряжение*/
pinMode(pinStepY, OUTPUT); 
pinMode(pinDirY, OUTPUT); 

/*контакты от кнопки X и потенциометра X устанавливаем в режим входных*/ 
pinMode(ButtonOnX1, INPUT); 
pinMode(ButtonOnX2, INPUT); 
pinMode(PotenciomDataX, INPUT);

/*контакты от кнопки Y и потенциометра Y устанавливаем в режим входных*/ 
pinMode(ButtonOnY1, INPUT); 
pinMode(ButtonOnY2, INPUT); 
pinMode(PotenciomDataY, INPUT);

//устанавливаем начальный режим для драйвера X
digitalWrite(pinStepX, LOW); 
digitalWrite(pinDirX, LOW); 

//устанавливаем начальный режим для драйвера Y
digitalWrite(pinStepY, LOW); 
digitalWrite(pinDirX, LOW); 
}

void loop() 
{
  if(CurrentButtonDelayX >= CheckButtonDelayX)
  {
    CheckButtonStateX();
    CurrentButtonDelayX = 0;
  }

  if(ButtonStateX == 1)
  {
    MakeMotorStep();
  }

  delay(move_delayX);
  CurrentButtonDelayX += move_delayX;
}
{
  if(CurrentButtonDelayY >= CheckButtonDelayY)
  {
    CheckButtonStateY();
    CurrentButtonDelayY = 0;
  }

  if(ButtonStateY == 1)
  {
    MakeMotorStep();
  }

  delay(move_delayY);
  CurrentButtonDelayY += move_delayY;
}

//функция, в которой совершается один шаг мотора X
void MakeMotorStepX() 
{ 
digitalWrite(pinStepX, HIGH); 
digitalWrite(pinStepX, LOW); 
}

//функция, в которой совершается один шаг мотора Y
void MakeMotorStepY() 
{ 
digitalWrite(pinStepY, HIGH); 
digitalWrite(pinStepY, LOW); 
} 

/*функция, в которой проверяется текущее состояние кнопки X и потенциометра X*/ 
void CheckButtonState()
{
  int CurrentButtonState = 0, CurrentButtonDirection = 0;

  bool readbuttonparam = digitalRead(ButtonOnX1);

  if(readbuttonparam)
  {
    CurrentButtonState = 1;
    CurrentButtonDirection = 1;
  }

  readbuttonparam = digitalRead(ButtonOnX2);

  if(readbuttonparam)
  {
    CurrentButtonState = 1;
    CurrentButtonDirection = 0;
  }

  if(ButtonStateX != CurrentButtonState)
  {
    ButtonStateX = CurrentButtonState;
  }

  if(ButtonDirectionX != CurrentButtonDirection)
  {
    ButtonDirectionX = CurrentButtonDirection;
    digitalWrite(pinDirX, ButtonDirectionX);
  }

  CurrentStepModeIndex = map(analogRead(PotenciomDataX), 0, 1023, 0, 255);
    }
  }
}

/*функция, в которой проверяется текущее состояние кнопки Y и потенциометраY*/ 
void CheckButtonState()
{
  int CurrentButtonState = 0, CurrentButtonDirection = 0;

  bool readbuttonparam = digitalRead(ButtonOnY1);

  if(readbuttonparam)
  {
    CurrentButtonState = 1;
    CurrentButtonDirection = 1;
  }

  readbuttonparam = digitalRead(ButtonOnY2);

  if(readbuttonparam)
  {
    CurrentButtonState = 1;
    CurrentButtonDirection = 0;
  }

  if(ButtonStateY != CurrentButtonState)
  {
    ButtonStateY = CurrentButtonState;
  }

  if(ButtonDirectionY != CurrentButtonDirection)
  {
    ButtonDirectionY = CurrentButtonDirection;
    digitalWrite(pinDirY, ButtonDirectionY);
  }

  CurrentStepMode = map(analogRead(PotenciomDataY), 0, 1023, 0, 255);
    }
  }
}
b707
Онлайн
Зарегистрирован: 26.05.2017

сверьте имена процедур, обьявленных в конце программы и имена процедур, к которым вы обращаетесь в loop(). У вас четыре процедуры названы неправильно - кое-где X или Y не хватает, кое-где, наоборот лишние.

И еще во всех процедурах сверьте число открывающих и закрывающих скобок - похоже оно не сходится. причем не в одном месте, а в нескольких

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Вот на что надеюцца люди, нихрена не смыслящие в программировании, берясь сразу за сложный проект?   Что с тобой на форумах няньчица будут, сопли подтирать? 

manergeim
Offline
Зарегистрирован: 07.07.2019

Добрый вечер.  Я тут немного посидел и подумал. Проверьте пожалуйста. И укажите на ошибки!!!

/*Управление двумя шаговыми двигателями с Arduino. Управление вращения каждого двигателя с помощью 2  3-х позиционных переключателей и 2 движковых потенциометров*/

/*Программа для вращения двумя шаговыми моторами NEMA 17, серии 17HS4401 + драйвер DRV8825.  Возможна установка TMC2100 или TMC2208. 
В схему включены 2 кнопки с 3-мя положениями (I, II, среднее - выключено) и два потенциометра. Кнопка регулирует направление вращения мотора, а данные 
с потенциометра показывают с какой скоростью крутится мотор*/
//Включение библиотек
#include <AccelStepper.h>
#include <GyverButton.h>
#include <Bounce2.h>

//определение постоянных Arduino pin
const int ledEnable = 13; //светодиод на борту покажет нам состояние активации двигателей 
const int pinEnable = 8; // контакты, которые управляют состоянием ENABLE драйверов DRV8825, соединены последовательно, поэтому достаточно одного контакта для управления обоими 
const int pinDirX = 7;  //цифровой вывод, который дает направление вращения двигателя X
const int pinStepX = 6;  //цифровой вывод, который дает сигнал на вращение двигателя X
const int pinDirY = 5;  //цифровой вывод, который дает направление вращения двигателя Y
const int pinStepY = 4;  //цифровой вывод, который дает сигнал на вращение двигателя Y

/*Контакты от двух положений кнопки X - цифровые*/ 
const int ButtonOnX1 = 11;
const int ButtonOnX2 = 12;

/*Контакты от двух положений кнопки Y - цифровые*/ 
const int ButtonOnY1 = 9;
const int ButtonOnY2 = 10;

/*Контакт регистрирующий значение потенциометра X - аналоговый*/ 
const int PotenciomDataX = 1;
/*Контакт регистрирующий значение потенциометра Y - аналоговый*/ 
const int PotenciomDataY = 2;

//временная задержка между шагами мотора X в мс 
const int move_delayX = 3;
//временная задержка между шагами мотора Y в мс 
const int move_delayY = 3;

/*целочисленная константа, показывающая временную задержку между считыванием состояния кнопки X и потенциометра X*/ 
const int CheckButtonDelayX = 15;
/*целочисленная константа, показывающая временную задержку между считыванием состояния кнопки Y и потенциометраY*/ 
const int CheckButtonDelayY = 15;

//переменная для хранения значения с потенциометра X
int val_PotenciomDataX;

//переменная для хранения значения с потенциометра Y
int val_PotenciomDataY;

/*Целочисленная переменная показывающая, сколько прошло времени и не пора ли считывать состояние кнопки X*/ 
int CurrentButtonDelayX = 0;
/*Целочисленная переменная показывающая, сколько прошло времени и не пора ли считывать состояние кнопкиY*/ 
int CurrentButtonDelayY = 0;

//состояние кнопки X включено-выключено 
int ButtonStateX = 0;
//состояние кнопки Y включено-выключено 
int ButtonStateY = 0;

//направление вращения согласно кнопке X I - 1, II - 0 
int ButtonDirectionX = 0;
//направление вращения согласно кнопке Y I - 1, II - 0 
int ButtonDirectionY = 0;

void setup() {
/*задаём контактам StepX и DirX режим вывода, то есть они выдают напряжение*/ 

pinMode(pinStepX, OUTPUT); 
pinMode(pinDirX, OUTPUT); 
/*задаём контактам StepY и DirY режим вывода, то есть они выдают напряжение*/
pinMode(pinStepY, OUTPUT); 
pinMode(pinDirY, OUTPUT); 

/*контакты от кнопки X и потенциометра X устанавливаем в режим входных*/ 
pinMode(ButtonOnX1, INPUT); 
pinMode(ButtonOnX2, INPUT); 
pinMode(PotenciomDataX, INPUT);

/*контакты от кнопки Y и потенциометра Y устанавливаем в режим входных*/ 
pinMode(ButtonOnY1, INPUT); 
pinMode(ButtonOnY2, INPUT); 
pinMode(PotenciomDataY, INPUT);

//устанавливаем начальный режим для драйвера X
digitalWrite(pinStepX, LOW); 
digitalWrite(pinDirX, LOW); 

//устанавливаем начальный режим для драйвера Y
digitalWrite(pinStepY, LOW); 
digitalWrite(pinDirY, LOW); 
}

void loop() 
{
 if(CurrentButtonDelayX >= CheckButtonDelayX)
 {
  CheckButtonStateX();
  CurrentButtonDelayX = 0;
 }

 if(ButtonStateX == 1)
 {
  MakeMotorStepX();
 }

  delay(move_delayX);
  CurrentButtonDelayX += move_delayX;

  if(CurrentButtonDelayY >= CheckButtonDelayY)
  {
    CheckButtonStateY();
    CurrentButtonDelayY = 0;
  }

  if(ButtonStateY == 1)
  {
    MakeMotorStepY();
  }

  delay(move_delayY);
  CurrentButtonDelayY += move_delayY;
}

//функция, в которой совершается один шаг мотора X
void MakeMotorStepX() 
{ 
digitalWrite(pinStepX, HIGH); 
digitalWrite(pinStepX, LOW); 
}

//функция, в которой совершается один шаг мотора Y
void MakeMotorStepY() 
{ 
digitalWrite(pinStepY, HIGH); 
digitalWrite(pinStepY, LOW); 
} 

/*функция, в которой проверяется текущее состояние кнопки X и потенциометра X*/ 
void CheckButtonStateX()
{
  val_PotenciomDataX = analogRead(PotenciomDataX);
  val_PotenciomDataX = map(val_PotenciomDataX, 0, 1023, 0, 255);

  int CurrentButtonStateX = 0, CurrentButtonDirectionX = 0;

  bool readbuttonparam = digitalRead(ButtonOnX1);

  if(readbuttonparam)
  {
    CurrentButtonStateX = 1;
    CurrentButtonDirectionX = 1;
  }

  readbuttonparam = digitalRead(ButtonOnX2);

  if(readbuttonparam)
  {
    CurrentButtonStateX = 1;
    CurrentButtonDirectionX = 0;
  }

  if(ButtonStateX != CurrentButtonStateX)
  {
    ButtonStateX = CurrentButtonStateX;
  }

  if(ButtonDirectionX != CurrentButtonDirectionX)
  {
    ButtonDirectionX = CurrentButtonDirectionX;
    digitalWrite(pinDirX, ButtonDirectionX);
  }
}

/*функция, в которой проверяется текущее состояние кнопки Y и потенциометраY*/ 
void CheckButtonStateY()
{
  val_PotenciomDataY = analogRead(PotenciomDataY);
  val_PotenciomDataY = map(val_PotenciomDataY, 0, 1023, 0, 255);
  
  int CurrentButtonStateY = 0, CurrentButtonDirectionY = 0;

  bool readbuttonparam = digitalRead(ButtonOnY1);

  if(readbuttonparam)
  {
    CurrentButtonStateY = 1;
    CurrentButtonDirectionY = 1;
  }

  readbuttonparam = digitalRead(ButtonOnY2);

  if(readbuttonparam)
  {
    CurrentButtonStateY = 1;
    CurrentButtonDirectionY = 0;
  }

  if(ButtonStateY != CurrentButtonStateY)
  {
    ButtonStateY = CurrentButtonStateY;
  }

  if(ButtonDirectionY != CurrentButtonDirectionY)
  {
    ButtonDirectionY = CurrentButtonDirectionY;
    digitalWrite(pinDirY, ButtonDirectionY);
  }
}

 

manergeim
Offline
Зарегистрирован: 07.07.2019

И кстати, я заказал БП (https://ru.aliexpress.com/item/33015883484.html?spm=a2g0s.9042311.0.0.780033edA4fobX

DC12V 10A 120W + 110/220V±15%

Его хватит? Или я ошибся с мощностью?

b707
Онлайн
Зарегистрирован: 26.05.2017

manergeim пишет:

Добрый вечер.  Я тут немного посидел и подумал. Проверьте пожалуйста. И укажите на ошибки!!!

компилируется?

manergeim
Offline
Зарегистрирован: 07.07.2019

Да. Но меня интересует как он будет работать?? Ошибок при работе не будет??

manergeim
Offline
Зарегистрирован: 07.07.2019

Заодно посмотрите код, пожалуйста.

piharev1
Offline
Зарегистрирован: 10.07.2019

manergeim пишет:

Да. Но меня интересует как он будет работать?? Ошибок при работе не будет??

попробуй, пусть даже будут, зато будет видно эти ошибки, там исправишь 

П С Я в программировании ноль, пользуюсь чужими скетчами, но у меня и запросы очень простые, вопыт примерно 1,5 недели, только сейчас начинаю различать не сложные части кода, думаю у тебя все будет окей

manergeim
Offline
Зарегистрирован: 07.07.2019

И Вас не ругают за это? Меня DetSimen  так отругал, что сразу умные мысли  появились!!!!

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

http://arduino.ru/forum/obshchii/pesochnitsa-dlya-vsekh-novichkov#comment-406075

читать всё, но особенно пункт 5. 

manergeim
Offline
Зарегистрирован: 07.07.2019

Спасибо.  Я прочитал.  Все правильно. Иначе на шею сядут. 

 

 

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

DetSimen пишет:

Вот на что надеюцца люди, нихрена не смыслящие в программировании, берясь сразу за сложный проект?   Что с тобой на форумах няньчица будут, сопли подтирать? 

я тоже посматриваю на станок, только чтобы уже готовенький )))

manergeim
Offline
Зарегистрирован: 07.07.2019

Я тоже икал.  Пришлось делать самому. 

Вот готовый скетч, но он под джойтик. 

https://www.youtube.com/watch?v=fA7FV6XqT2g&list=PLc7gWGm6X25C7LwvXsEO3T_pEkix3y9NL&index=134&t=148s

Мне он не подошел. Я хотел более плавной регулировки. 

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

так выбросьте этот недоджойстик и поставьте нормальные от аппаратуры радиоуправления

manergeim
Offline
Зарегистрирован: 07.07.2019

У меня есть два таких 

Остались от аппаратуры FlySky FS TH9X FS-TH9X 2,4G 9CH,  я ее спалил. Неправильно подключил питание.

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

тем более если есть, вперёд и с песней
PS посмотрел скетч, на этом стике всё должно быть великолепно

manergeim
Offline
Зарегистрирован: 07.07.2019

Может быть я не прав, сказывается неопытность. Но мне кажется на лиейном потенциометре будет удобней. Нет пружин, рукоятка стоит на месте. Не падает. В данный момент джойстики у меня без пружин. Переставил на другой пульт. И стики падают при отклонинии.

Или я не прав?

Вот такой переключатель подойдет на управление напрвлением вращения?

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

то-есть ты их разломал, непонятно куда и зачем, регуляторы зажима есть на всех джойстиках, а пружина нужна для установки его в центральное положение, тебе же нужен 0

manergeim
Offline
Зарегистрирован: 07.07.2019

ua6em пишет:

то-есть ты их разломал, непонятно куда и зачем, регуляторы зажима есть на всех джойстиках, а пружина нужна для установки его в центральное положение, тебе же нужен 0

Я же говорю, пульт спалил. Запчасти оставил. Коромысло которое цемлется к пружине, сделать не проблема. Уже делал их из люминия и пластика. Опыт есть.

Они, джойстики еще с проводами, подключены к своим платам. Целые.

У меня есть танк 1:16. Я для него все стики под пружинил.

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

ясно! два стика с выкинутыми пружинами и закрученными должным образом фиксаторами решат твою проблему как мне кажется

manergeim
Offline
Зарегистрирован: 07.07.2019

manergeim
Offline
Зарегистрирован: 07.07.2019

И что тут крутить?? И что фиксировать? У меня только два стика!! Боюсь сломать и остаться с одним. Который.....никуда в общем!!

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

смотрим здесь - https://youtu.be/MFvvDg5BntY - озвучивает - открутить трещётку, это оно и есть. винтом регулируется усилие зажатия стика, на втором стике её и не было, надо сделать точно такую

Похоже у тебя неправильные пчёлы и неправильный мёд ))) сочувствую...