Перейти к содержимому


Самый Популярный Контент


#72 УЛЬТРАЗВУКОВОЙ ДАТЧИК 2.0

Написано Serg-moderator 20 Октябрь 2015 - 13:01

Датчик не выводит показания температуры. Он лишь вносит поправку в измеренную скорость звука (измеренное расстояние) в зависимости от температуры воздуха.


  • rexmoney это нравится


#43 Самоходная платформа. От простого к сложному.

Написано Smham 06 Июль 2015 - 09:55

Промежуточный алгоритм движения платформы.

 

 

Продолжение следует...


  • admin это нравится


#111 28BYJ-48 не собирается вращаться против часовой стрелки и прочие вопросы

Написано vintproykt 28 Апрель 2017 - 16:12

Ура! Вопросы решены благодаря товарищу MarkT с forum.arduino.cc.

 

Оказалось, что на драйвере неправильно расположены выводы IN2 и IN3. Достаточно было поменять местами эти два соединения и всё заработало как часы (в двух направлениях)!

 

Обновил скетч для работы в полушаговом режиме: ссылка.

 

P.S.: Ох уж доставил головной боли китайский производитель HEX!!! Наверное, им так с рук это не сошло, раз у них нет общедоступного сайта в Интернете - поделом.


  • admin это нравится


#110 28BYJ-48 не собирается вращаться против часовой стрелки и прочие вопросы

Написано vintproykt 28 Апрель 2017 - 13:41

Код из скетча:

/*
Unknown Nonblocking CNC
Автор: VINTproYKT
*/

#include <AccelStepper.h>
#include <MultiStepper.h>

// Наиболее предпочтительная максимальная скорость для купленных двигателей, экспериментально вычисленная путём проверки на дребезжание вала
#define MOTORS_MAXSPEED 360
// Ускорение должно быть настолько минимальным, чтобы двигатель избегал дребезжания
#define MOTORS_ACCELERATION 100
#define MOTORS_STEPS_PER_REVOLUTION 2048

/* Предмет: двигатель 28BYJ-48 - 5V
Соедините его к плате-драйверу на базе ULN2003A
Соедините левые выводы платы-драйвера:
+ VCC к Vin Arduino
+ GND к GND
+ IN1 к D2 (цифровой вывод 2 у Arduino)
+ IN2 к D3
+ IN3 к D4
+ IN4 к D5
Затем используйте внешнее питание на 5 В, подключив его к плате Arduino.
*/
AccelStepper motorX(AccelStepper::FULL4WIRE, 2, 3, 4, 5);
// Не удаётся запустить в полушаговом режиме, поэтому делаем лучшее в полношаговом

short motorX_dir = 1;// [ ПЧС : -1 ] <=> [ 1 : ЧС ]
int motorX_avgSpeed = MOTORS_MAXSPEED;// Средняя скорость

String input = "";

void doCommand(String command, String param) {// Проводник команд по последовательному порту
if (command == "go") {
long steps = param.toInt();
if (steps == 0) steps = MOTORS_STEPS_PER_REVOLUTION;// Делать полный оборот по умолчанию
_go(steps);
}
else if (command == "stop") _stop();
else if (command == "dir") _dir();
else if (command == "speed") {
float speed = param.toInt();
if (speed == 0) speed = MOTORS_MAXSPEED;// Средняя скорость равняется максимальной по умолчанию
_speed(speed);
}
}

void setup() {
Serial.begin(115200);// Максимальное число бит в секунду для работы с Arduino UNO
Serial.println("setup");

input.reserve(128);

motorX.setMaxSpeed(MOTORS_MAXSPEED);
motorX.setAcceleration(MOTORS_ACCELERATION);
}

void loop() {
while (Serial.available()) {
input = Serial.readStringUntil('\n');
input.trim();
int input_sp = input.indexOf(' ');// Проверка на присутствие знака пробела во входной строке
String input_command = input;
String input_param;
if (input_sp > 0) {
input_command = input.substring(0, input_sp);
input_param = input.substring(input_sp + 1);
input_param.trim();
}
doCommand(input_command, input_param);
input = "";
}

measureSteps();

motorX.run();
}

void _go(long increment) {
if (motorX.speed() == 0) {
motorX.setSpeed(motorX_avgSpeed);
motorX.moveTo(motorX.currentPosition() + motorX_dir * increment);
Serial.print("Move to ");
Serial.print(motorX.targetPosition());
Serial.print(" (rotate by ");
Serial.print((float)increment / (float)MOTORS_STEPS_PER_REVOLUTION * 360);
Serial.print("° ");
if (motorX_dir > 0) Serial.print("clockwise");
else Serial.print("counterclockwise");
Serial.println(")");
}
}

void _stop() {
motorX.stop();
motorX.setSpeed(0);
Serial.println("Stop");
}

void _dir() {
motorX_dir = -motorX_dir;
if (motorX_dir > 0) Serial.println("CW");
else Serial.println("CCW");
}

void _speed(float speed) {
motorX_avgSpeed = speed;
Serial.print("Average speed changed to ");
Serial.println(speed);
}

void measureSteps() {
if (motorX.speed() != 0) {
Serial.print("Position: ");
Serial.print(motorX.currentPosition());
Serial.print(" | Speed: ");
Serial.println(motorX.speed());
}
}

 
Также перечисленные вопросы были заданы на форуме Arduino, если кому интересно: ссылка.


  • admin это нравится


#109 28BYJ-48 не собирается вращаться против часовой стрелки и прочие вопросы

Написано vintproykt 28 Апрель 2017 - 13:26

Недавно купил здесь шаговые двигатели 28BYJ-48 на 5 В и платы-драйверы на базе ULN2003A для моего графопостроителя с ЧПУ.

Не знаю, что хуже: либо то, что я купил это всё, не зная производителей; либо то, что у меня на руках поддельная плата Arduino UNO R3, которой хотелось бы найти применение.

 

Мой скетч на Arduino

 

Использую связь через последовательный порт, чтобы "менять вещи".

 

Когда ввожу go, двигатель делает полный оборот по часовой стрелке.

 

После всего, dir изменяет будущее направление на вращение против часовой стрелки.

 

Теперь после go двигатель вращает вал по часовой стрелке, а также дребезжит против часовой стрелке на случайное число шагов, и вновь перемещая по часовой, и так много-много раз.  :mellow: Показывая некое сопротивление, так выглядит, будто он может призвать демона.  :wacko:

 

В итоге двигатель не перемещается в правильное положение, когда методы библиотеки AccelStepper выводят импульсы в обратном порядке (для вращения против часовой стрелки).

 

Вопросы:

  1. Что препятствует вращению вала двигателя против часовой стрелки и как это исправить?
  2. Почему полушаговый режим просто заставляет двигатель вибрировать и ничего не делать? (Наверное, стоит адресовать вопрос к купленному железу, ведь даже не указали производителя этих двигателей на странице с описанием товара.)

Решение найдено!


  • admin это нравится