Шаговый двигатель NEMA 17 и driver Robotdyn L298N
- Войдите на сайт для отправки комментариев
Недавно, благодаря этому сайту, у меня получилось заставить работать 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 сделал пол оборота и остановился в ожидании условия "если".
Что за ошибка??
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++
}
}
Мотор работает и всё, не останавливается :(
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++;
}
}
Код не по правилам выкладываю?
Код не по правилам выкладываете.
http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
Никакими другими способами мой мотор не работает, полагаю это всё из-за драйвера.
ПОдозреваю, из-за того, что Вы неверно подключили мотор.
а что будет если вы возьмёте да и используете библиотеки Stepper или AccelStepper?
#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
vimple.co/f2fa0033d58849d085fce5a7332ef18b вот, эта рабочая.
vimple.co/f2fa0033d58849d085fce5a7332ef18b вот, эта рабочая.
На ENA Ии на ENB поставьте перемычки на 1. И все в скетче их не должно быть для шагового двигателя. Они используются для ШИМ двух коллекторных движков.
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 шага в другую, получается шаговик вибрирует :((
К этому скетчу такое же замечание.
Спасибо, за "ПОЗДРАВЛЕНИЯ", было приятно разделить свою "судьбу" со всеми участниками темы. Скетч написал, благо всё работает, без запинки, в общем можно этот пост закрывать "Вот только не знаю как?".