Шаговый двигатель NEMA 17 и driver Robotdyn L298N

PVl_Soryn
Offline
Зарегистрирован: 31.05.2017

Недавно, благодаря этому сайту, у меня получилось заставить работать NEMA 17 без использования библиотек и всяких ухищрений:

int in1 = 8;
int in2 = 9;
int in3 = 10;
int in4 = 11;
int e1 = 7;
int e2 = 6;
int t = 10; // это время позволит изменить скорость вращения вала
void setup()
{
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
pinMode(e1, OUTPUT);
pinMode(e2, OUTPUT);
}
void loop()
{ // вращение в одном направлении с одинаковой скоростью = t
  digitalWrite(e1, HIGH);
  digitalWrite(e2, HIGH);
 
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  delay(t);
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  delay(t);
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
  delay(t);
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
  delay(t);
}

Никакими другими способами мой мотор не работает, полагаю это всё из-за драйвера. В общем, на данный момент я хочу добавить в этот скетч какой-нибудь таймер или ещё что-то, чтобы NEMA сделал пол оборота и остановился в ожидании условия "если".

PVl_Soryn
Offline
Зарегистрирован: 31.05.2017

Что за ошибка??

exit status 1
'var' was not declared in this scope

скетч:

int in1 = 8;
int in2 = 9;
int in3 = 10;
int in4 = 11;
int e1 = 7;
int e2 = 6;
int t = 10; // это время позволит изменить скорость вращения вала

void setup()
{
  var = 0;
  while(var<5)
  {
      pinMode(in1, OUTPUT);
      pinMode(in2, OUTPUT);
      pinMode(in3, OUTPUT);
      pinMode(in4, OUTPUT);
      pinMode(e1, OUTPUT);
      pinMode(e2, OUTPUT);
      var++;
  }
}

void loop()
{
  var = 0;
  while(var<5)
  {
      digitalWrite(e1, HIGH);
      digitalWrite(e2, HIGH);
      
      digitalWrite(in1, LOW);
      digitalWrite(in2, LOW);
      digitalWrite(in3, LOW);
      digitalWrite(in4, HIGH);
      delay(t);
      digitalWrite(in1, LOW);
      digitalWrite(in2, LOW);
      digitalWrite(in3, HIGH);
      digitalWrite(in4, LOW);
      delay(t);
      digitalWrite(in1, HIGH);
      digitalWrite(in2, LOW);
      digitalWrite(in3, LOW);
      digitalWrite(in4, LOW);
      delay(t);
      digitalWrite(in1, LOW);
      digitalWrite(in2, HIGH);
      digitalWrite(in3, LOW);
      digitalWrite(in4, LOW);
      delay(t);
      var++
  }
}

PVl_Soryn
Offline
Зарегистрирован: 31.05.2017

Мотор работает и всё, не останавливается :(

int in1 = 8;
int in2 = 9;
int in3 = 10;
int in4 = 11;
int e1 = 7;
int e2 = 6;
int t = 10; // это время позволит изменить скорость вращения вала

void setup()
{
  byte i = 0;
  while(i<5)
  {
      pinMode(in1, OUTPUT);
      pinMode(in2, OUTPUT);
      pinMode(in3, OUTPUT);
      pinMode(in4, OUTPUT);
      pinMode(e1, OUTPUT);
      pinMode(e2, OUTPUT);
      i++;
  }
}

void loop()
{
  byte i = 0;
  while(i<5)
  {
      digitalWrite(e1, HIGH);
      digitalWrite(e2, HIGH);
      
      digitalWrite(in1, LOW);
      digitalWrite(in2, LOW);
      digitalWrite(in3, LOW);
      digitalWrite(in4, HIGH);
      delay(t);
      digitalWrite(in1, LOW);
      digitalWrite(in2, LOW);
      digitalWrite(in3, HIGH);
      digitalWrite(in4, LOW);
      delay(t);
      digitalWrite(in1, HIGH);
      digitalWrite(in2, LOW);
      digitalWrite(in3, LOW);
      digitalWrite(in4, LOW);
      delay(t);
      digitalWrite(in1, LOW);
      digitalWrite(in2, HIGH);
      digitalWrite(in3, LOW);
      digitalWrite(in4, LOW);
      delay(t);
      i++;
  }
}

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

PVl_Soryn пишет:
Мотор работает и всё, не останавливается :(
Ну и что вы хотели. Мало того что код не по правилам выкладываете, так и еще пишите примитивный код.

PVl_Soryn
Offline
Зарегистрирован: 31.05.2017

Код не по правилам выкладываю?

 

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Код не по правилам выкладываете.

Araris
Offline
Зарегистрирован: 09.11.2012
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

PVl_Soryn пишет:

Никакими другими способами мой мотор не работает, полагаю это всё из-за драйвера.

ПОдозреваю, из-за того, что Вы неверно подключили мотор.

vvadim
Offline
Зарегистрирован: 23.05.2012

а что будет если вы возьмёте да и используете библиотеки Stepper или AccelStepper?

PVl_Soryn
Offline
Зарегистрирован: 31.05.2017
#include <Stepper.h>
int e1 = 7;
int e2 = 6;

const int stepsPerRevolution = 200;  // change this to fit the number of steps per revolution
// for your motor

// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);

void setup() {
  pinMode(e1, OUTPUT);
  pinMode(e2, OUTPUT);
  // set the speed at 60 rpm:
  myStepper.setSpeed(10);
  // initialize the serial port:
  Serial.begin(9600);
}

void loop() {
  digitalWrite(e1, HIGH);
  digitalWrite(e2, HIGH);
  // step one revolution  in one direction:
  Serial.println("clockwise");
  myStepper.step(stepsPerRevolution);
  delay(5000);

  // step one revolution in the other direction:
  Serial.println("counterclockwise");
  myStepper.step(-stepsPerRevolution);
  delay(5000);
}

Воспользовался данный библиотекой, но только с небольшой доработкой: добавил ENABLE1 & ENABLE2.

Вот что получилось: https://yadi.sk/i/5wXpKeZa3K9GUJ

PVl_Soryn
Offline
Зарегистрирован: 31.05.2017

vimple.co/f2fa0033d58849d085fce5a7332ef18b вот, эта рабочая.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

PVl_Soryn пишет:

vimple.co/f2fa0033d58849d085fce5a7332ef18b вот, эта рабочая.

На ENA Ии на ENB поставьте перемычки на 1. И все в скетче их не должно быть для шагового двигателя. Они используются для ШИМ двух коллекторных движков.

PVl_Soryn
Offline
Зарегистрирован: 31.05.2017
int capSensePin = 12; // это пин для сканирования кнопки
int touchedCutoff = 400; //это чувствительность кнопки
int t = 500; // это время позволит изменить скорость вращения вала
int in1 = 8;
int in2 = 9;
int in3 = 10;
int in4 = 11;
int e1 = 7;
int e2 = 6;

void setup() {
  Serial.begin(9600);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  pinMode(e1, OUTPUT);
  pinMode(e2, OUTPUT);
 
  pinMode(in1, LOW);
  pinMode(in2, LOW);
  pinMode(in3, LOW);
  pinMode(in4, LOW);
  pinMode(e1, LOW);
  pinMode(e2, LOW);
 
}

void loop() {
 
  if (readCapacitivePin(capSensePin) > touchedCutoff) {
    digitalWrite(e1, HIGH);
    digitalWrite(e2, HIGH);

    digitalWrite(in1, LOW);
    digitalWrite(in2, LOW);
    digitalWrite(in3, LOW);
    digitalWrite(in4, HIGH);
    delay(t);
    digitalWrite(in1, LOW);
    digitalWrite(in2, LOW);
    digitalWrite(in3, HIGH);
    digitalWrite(in4, LOW);
    delay(t);
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
    digitalWrite(in3, LOW);
    digitalWrite(in4, LOW);
    delay(t);
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
    digitalWrite(in3, LOW);
    digitalWrite(in4, LOW);
    delay(t);           
  }
  else {
    digitalWrite(e1, LOW);
    digitalWrite(e2, LOW);      
  }

  if ( (millis() % 500) == 0) //каждые 500 мс пеленгуем значение кнопки
  {
    Serial.print("Capacitive Sensor on Pin 2 reads: ");
    Serial.println(readCapacitivePin(capSensePin));
  }
}

uint8_t readCapacitivePin(int pinToMeasure)//Вот как вы объявляете переменную, которая будет хранить регистры PORT, PIN и DDR на AVR.
{
  volatile uint8_t* port;
  volatile uint8_t* ddr;
  volatile uint8_t* pin;
  //Здесь мы переводим номер входного штыря с номера разъема Arduino в AVR PORT, PIN, DDR и какой бит этих регистров нас заботит.
  byte bitmask;
  if ((pinToMeasure >= 0) && (pinToMeasure <= 7))
  {
    port = &PORTD;
    ddr = &DDRD;
    bitmask = 1 << pinToMeasure;
    pin = &PIND;
  }
  if ((pinToMeasure > 7) && (pinToMeasure <= 13))
  {
    port = &PORTB;
    ddr = &DDRB;
    bitmask = 1 << (pinToMeasure - 8);
    pin = &PINB;
  }
  if ((pinToMeasure > 13) && (pinToMeasure <= 19))
  {
    port = &PORTC;
    ddr = &DDRC;
    bitmask = 1 << (pinToMeasure - 13);
    pin = &PINC;
  }
  // Сначала выпустите булавку, установив ее на низком уровне и выведите ее.
  *port &= ~(bitmask);
  *ddr  |= bitmask;
  delay(1);
  // Сделайте вывод булавки без внутреннего подтягивания.
  *ddr &= ~(bitmask);
  // Теперь посмотрим, как долго вытаскивать булавку.
  int cycles = 16000;
  for(int i = 0; i < cycles; i++)
  {
    if (*pin & bitmask)
    {
      cycles = i;
      break;
    }
  }
  // Выключите булавку снова, установив ее на низком уровне и выходу.
  //Важно оставить штифты низкими, если вы хотите иметь возможность касаться более одного датчика за один раз - если датчик остается вытянутым высоко, когда вы касаетесь двух датчиков, ваше тело будет Передайте заряд между датчиками.
  *port &= ~(bitmask);
  *ddr  |= bitmask;
 
  return cycles;
}


Скетч, "УРА!", есть, но вот одна ужасная загвоздка: при digitalWrite ( in3, HIGH) "in3" не срабатывает, т. е. в шаговом двигателе из 4 сторон работают 3! Проверял на другом скетче, все пины работают, шаговый мотор крутится, а вот в этом скетче "ПАРАДОКС". Помогите опытные люди разлядеть ошибку, это точно связано со скетчем, нужно чтобы "in3" на который подается сигнал "HIGH" тоже срабатывал, а то получается 1 шаг в одну сторону 2 шага в другую, получается шаговик вибрирует :((

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

andriano пишет:
ПОдозреваю, из-за того, что Вы неверно подключили мотор.

К этому скетчу такое же замечание.

PVl_Soryn
Offline
Зарегистрирован: 31.05.2017

Спасибо, за "ПОЗДРАВЛЕНИЯ", было приятно разделить свою "судьбу" со всеми участниками темы. Скетч написал, благо всё работает, без запинки, в общем можно этот пост закрывать "Вот только не знаю как?".