Управление Шаговым мотором

hiteker75

✩✩✩✩✩✩✩
18 Авг 2019
26
1
Меня зовут Вася Пупкин ))
Мое что-то там создано для : Линейного перемещения каретки
Оно имеет функционал : Вводим нужную длину в мм и скорость в мм/мин оно едет/крутит в нужную сторону
Написал код,работает но не знаю как добавить вторую переменную
C++:
#include <AccelStepper.h>
#include <MultiStepper.h>
#include "AccelStepper.h"
#include <Arduino.h>
#include <LiquidCrystal_I2C_Cyrillic.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <Keypad.h>
#include "Keypad.h"
#include "SetupVars.h"
#include "LC_Cyrillic_Font_Compact.h"
LiquidCrystal_I2C_Cyrillic lcd(0x27,20,4); // set the LCD address to 0x20 for a 16 chars and 4 line display
AccelStepper stepperX(1, 12, 13);                     
void setup()
{

pinMode(stp, OUTPUT);
pinMode(dir, OUTPUT);
lcd.init();
lcd.backlight();
   cho = 0;
   char key = kpd.getKey();
   lcd.printCyrillic("LEIGH MM" "   =  B" ,3,2);
   while(cho == 0)
   {
key = kpd.getKey();
switch (key)
{
case NO_KEY:
break;

case 'B':
Degrees=getdivisions();
cho=2;
break;

} // end case
} // end while cho=0
} // end setup

void loop() // MAIN LOOP
{

lcd.clear();
char key = kpd.getKey();
bob = 0;
lcd.setCursor(7,0);lcd.print("Total: ");lcd.print(Multiplier,2); // total steps
lcd.setCursor(1,3);lcd.print("FORW=A  REV=B  X=C");

while(key != 'C') // C will return to start menu
{
lcd.setCursor(0,0);lcd.print(abs(Degrees),2);lcd.print((char)223);
key = kpd.getKey();
if(key == 'A') // FORWARD
{
bob = bob + Degrees;
ToMove = (Degrees*Multiplier);
digitalWrite(dir, LOW);
printadvance();
}
if(key=='B') // REVERSE
{
bob = bob - Degrees;
ToMove = ((Degrees*Multiplier)-(Degrees*Multiplier*2));
digitalWrite(dir, HIGH); // pin 13
printadvance();
}
}
setup();
} // end main VOID

//Кейс ввода миллиметров
float getdivisions()
{
float Degrees = 0;
float num = 0;
char key = kpd.getKey();
lcd.clear();
lcd.setCursor(0,1);lcd.print("Enter mm:");lcd.setCursor(0,3);lcd.print("OK = # ");lcd.print((char)60);lcd.print((char)45);lcd.print(" D");
lcd.setCursor(16,1);

while(key != '#')
{
switch (key)
{
case NO_KEY:
break;

case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
num = num * 10 + (key - '0');
lcd.print(key);
break;

case 'D':
num = 0;
lcd.setCursor(16,1);lcd.print("     ");
lcd.setCursor(16,1);
break;
}
Degrees = num;
key = kpd.getKey();
}
return Degrees;
}

void printadvance() // print function
{

lcd.setCursor(6,1);lcd.print("Moving");
lcd.setCursor(4,2);lcd.print("Steps ");;lcd.print(ToMove,0);
lcd.setCursor(13,0);lcd.print(bob,2);
rotation(ToMove,0);
}

void rotation(float tm, int d)
{
/////////////////////////////////////////////////////////////////////////////
//digitalWrite(sol,HIGH);
stepperX.setCurrentPosition(0);
int move_finished = 1 ;
  stepperX.setMaxSpeed(maXSpeed);
  stepperX.setAcceleration(acCell);
/////////////////////////////////////////////////////////////////////////////
  for(int i = 0; i < move_finished;)
{
  stepperX.moveTo(tm);
  stepperX.run();

if(stepperX.distanceToGo()==0)
{
move_finished = 0;
digitalWrite(2,LOW);
}
else
{
  digitalWrite(2,HIGH);
}
}
///////////////////////////////////////////////////////////////////////////// 
  }


void software_Reset() // Restarts program from beginning but does not reset the peripherals and registers
{
asm volatile (" jmp 0");
}
используется такое исполнение в железе
Ардуино Уно + LCD 2004 + matrix keyboard + tb6600 + шаговый мотор.
Суть.
1.Ввод двух значений (длина мм и скорость мм/мин.)
2.Движение шаговика по заданным параметрам,с включением реле.
3.Обнуление координат в произвольной точке,с последующим (пункт 1)
4. Ручное (по удержанию кнопки)ускоренное перемещение как в "+" так и в "-".
PS.Сам написал скетч,работает ,но! могу задать только длину,как сделать ввод 2 разных переменных никак не вкурю.
2Модер - вроде по правилам,впервые пишу посты на подобных сайтах.
 
Изменено:

i3epg

✩✩✩✩✩✩✩
9 Окт 2021
34
5
Красноярск
В чем выражается проблема с вводом второй переменной? И как увязываются вводимые мм и обороты?
 

hiteker75

✩✩✩✩✩✩✩
18 Авг 2019
26
1
В чем выражается проблема с вводом второй переменной? И как увязываются вводимые мм и обороты?
Не знаю как сделать 2 пункта (меню)
После ввода мм переходит в основной луп.
А скорость ввести уже никак.
 

i3epg

✩✩✩✩✩✩✩
9 Окт 2021
34
5
Красноярск
Вам же не обязательно именно два пункта меню. Достаточно одного, где вводится сначала скорость, а потом длина.
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,706
474
@hiteker75, вы бы выложили свой код, если хотите какой-то помощи.. Иначе это будет гаданием на кофейной гуще.
 

hiteker75

✩✩✩✩✩✩✩
18 Авг 2019
26
1
Огромное спасибо уважаемому
Lumenjer
Помог таки с правильным направлением куда копать !
Тема исчерпана(частично) , всё работает )
Доволен)
 

hiteker75

✩✩✩✩✩✩✩
18 Авг 2019
26
1
UPну тему...
Выше писал что тема исчерпана,но частично.
Подскажите пожалуйста,возможно ли при помощи матричной клавиатуры реализовать принцип работы как в библе у Алекса? По удержанию кнопки (на клаве) перемещать (вращать) ШД?
 

Lumenjer

★★★✩✩✩✩
10 Дек 2020
220
112
@hiteker75, Можно, только вам придется попотеть над логикой в вашем скетче и прописать все нужные условия.
У вас есть цикл, в котором опрашивается клавиатура, и если была нажата какая-то конкретная кнопка, то код сразу выполняет условие по свичу.
Что вам нужно сделать - добавить в внутрь кейс свича условие и оформить работу bool hold;
C++:
case "A";
    if (hold)
        doSome();
    else
        doElse();
Мы в крутимся в цикле, при нажатии кнопки (например "А") - запустить таймер и сохранить значение нажатой кнопки ("А"), по этому таймеру будем определять, готовы мы переходить в свитч или нет. Сидим в цикле и проверяем в течении 1 секунды (или 500мс, уже как настроите), не была ли отпущена кнопка "А", если да - прописываем hold = false и выполняем условие для кнопки "А" по свичу . Если кнопка нажата и прошло уже больше секунды - hold = true и выполняем свитч "А" (только в этот раз выполнится условие doSome(); )

Вот примерный механизм работы для холда, также возможно надо ли обрабатывать дребезг на этой клавиатуре, тут я хз, нет у меня такой)
Но т.к. у вас есть дублирующие кнопки, то скорее всего да, надо еще будет реализовать механизм антидребезга.
 
  • Лойс +1
Реакции: hiteker75