roboforum.ru

Технический форум по робототехнике.


Arduino pro mini для управления шаговым двигателем

Как собрать и запрограммировать робота на Arduino(Freeduino, Roboduino, Seeduino ...). Используем Wiring и Processing.

Re: Arduino pro mini для управления шаговым двигателем

Сообщение Revenger » 18 ноя 2015, 14:40

Может кто подсказать, что не так в этой гремучей смеси скетча Андрея (на счет дисплея) и стандартного скетча по регулировке моего ШД?
Код: Выделить всёРазвернуть
// Переименовал переменную Stepper_28BYJ в Stepper

#include <Stepper_28BYJ.h>
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
#define lcd_RS_pin 7
#define lcd_RW_pin 8
#define lcd_E_pin 9
#define lcd_DB4_pin 10
#define lcd_DB5_pin 11
#define lcd_DB6_pin 12
#define lcd_DB7_pin 13
LiquidCrystal lcd(lcd_RS_pin, lcd_RW_pin, lcd_E_pin, lcd_DB4_pin, lcd_DB5_pin, lcd_DB6_pin, lcd_DB7_pin);


// изменить количество шагов для вашего мотора
const int stepsPerRevolution = 4076;
// #define steps 4076
Stepper_28BYJ myStepper_28BYJ(stepsPerRevolution, 5,4,3,2);

int stepCount = 0;  // number of steps the motor has taken
//Specify your input pin here
// int sensor = 0;
int sensorPin = 0;
int ledPin = 6; // пин для светодиода

// Также зададим 3 глобальные переменные - lightLevel, high и low
int lightLevel, high = 0, low = 1023;

void setup()
{

}

void loop(){
  // read the sensor value:
  // читаем значение датчика на аналоговом входе 0
  int sensorReading = analogRead(A0);
    // map it to a range from 0 to 100:
  // масштабируем значение с аналогового входа
  // из диапазона 0..1023 в диапазон 0..100
  int motorSpeed = map(sensorReading, 0, 1023, 0, 100);
    // установить  скорость вращения
  if (motorSpeed > 0) {
    myStepper_28BYJ.setSpeed(motorSpeed);
      // прошагать 1/100 оборота
    myStepper_28BYJ.step(stepsPerRevolution/100);
   
   //включение ноги светодиода
  pinMode(ledPin, OUTPUT);
  lcd.begin(16,2); //Инициализируем экран
    //Выводим на экран скорость мотора
  lcd.setCursor(0, 0);
  lcd.print("   "); //чистим вывод
  lcd.setCursor(0, 1);
  lcd.print("   "); //чистим вывод
  lcd.setCursor(0, 0);
  lcd.print("  Motor Speed");
  lcd.setCursor(0, 1);
  lcd.print("      S=    ");
  lcd.setCursor(8, 1);
  lcd.print(motorSpeed);
    }
   lightLevel = analogRead(sensorPin);
  //включаем светодиод
    analogWrite(ledPin,40);//светодиод горит на 10 ))
   
  }

 

 

Во время вращения ШД дёргается, трясётся и дисплей и светодиод на дуине (УНО) мерчает в такт всем этим дёрганиям. Обороты поднять на ШД до нужных не могу почему-то, а на чистом скетче из набора, даже с моим фоторезистором (вписал) обороты нормальные и работает мотор чисто :sorry:
Код: Выделить всёРазвернуть
/* 
Stepper_28BYJ Motor Control - speed control

This program drives a unipolar or bipolar stepper motor.
The motor is attached to digital pins 8 - 11 of the Arduino.
A potentiometer is connected to analog input 0.
Эта программ управляет униполярным или биполярным шаговым двигателем.
Шаговый двигатель присоединён к цифровым выходам 8-11 платы Arduino.
Потенциометр присоединён к аналоговому входу 0.

The motor will rotate in a clockwise direction. The higher the potentiometer value,
the faster the motor speed. Because setSpeed() sets the delay between steps,
you may notice the motor is less responsive to changes in the sensor value at
low speeds.
Двигатель будет вращаться по часовой стрелке. Чем выше напряжение снимаемое с потенциометра,
тем выше будет скорость вращения. Потому что функция setSpeed() определяет задержки между шагами,
вы можете заметить, что двигатель становится менее чувствительным к показаниям датчика на
низких скоростях.

Created 30 Nov. 2009
Modified 28 Oct 2010
by Tom Igoe

*/

#include <Stepper_28BYJ.h>

// количество шагов на один оборот
const int stepsPerRevolution = 4076;  // change this to fit the number of steps per revolution
// for your motor


// initialize the stepper library on pins 8 through 11:
// инициализируем библиотеку Stepper_28BYJ на выходы 8-11
Stepper_28BYJ myStepper_28BYJ(stepsPerRevolution, 5,4,3,2);           

// количество шагов, которые мотор уже сделал
int stepCount = 0;  // number of steps the motor has taken
int ledPin = 6; // пин для светодиода
int sensorPin = 0;
// Также зададим 3 глобальные переменные - lightLevel, high и low
int lightLevel, high = 0, low = 1023;

void setup() {
  // nothing to do inside the setup
  // ничего не делаем внутри процедуры setup
}

void loop() {
  // read the sensor value:
  // читаем значение датчика на аналоговом входе 0
  int sensorReading = analogRead(A0);
  // map it to a range from 0 to 100:
  // масштабируем значение с аналогового входа
  // из диапазона 0..1023 в диапазон 0..100
  int motorSpeed = map(sensorReading, 0, 1023, 0, 100);
  // set the motor speed:
  // установить  скорость вращения
  if (motorSpeed > 0) {
    myStepper_28BYJ.setSpeed(motorSpeed);
    // step 1/100 of a revolution:
   // прощагать 1/100 оборота
    myStepper_28BYJ.step(stepsPerRevolution/100);
  }
  //включение ноги светодиода
  pinMode(ledPin, OUTPUT);
  //включаем светодиод
  lightLevel = analogRead(sensorPin);
    analogWrite(ledPin,60);//светодиод горит на 60 ))
}

Аватара пользователя
Revenger
 
Сообщения: 1728
Зарегистрирован: 01 ноя 2014, 00:50
Откуда: Ставрополье
ФИО: Александр

Re: Arduino pro mini для управления шаговым двигателем

Сообщение RootAdmin » 25 ноя 2015, 15:53

Могу дать правильную процедуру для управления униполярным двигателем.
Код: Выделить всёРазвернуть
void stepMotor(int Motor, int Step) //Motor - от 0 до 2 номер мотора Step 0 или +1
{
//Serial.println(curstep[Motor]);
int i; //Сдвиг для номеров пинов мотора
  if (Step)
   {
//      Serial.println("StepMotor Step=1");
     if (curstep[Motor]==7)
     {curstep[Motor]=0;}
    else
     {curstep[Motor]++;}
   }
  else
  {
//    Serial.println("StepMotor Step=0");
    if (curstep[Motor]==0)
     {curstep[Motor]=7;}
    else
      {curstep[Motor]--;}
   }
   
  i=Motor*4; //Сдвиг пинов в массиве MotorPins[]
 
//Serial.println(curstep[Motor]);
    switch (curstep[Motor]) {
      case 0:    // 1000
   //   digitalWrite(MotorPins[1], HIGH);
      digitalWrite(MotorPins[i+1], LOW);
   //   digitalWrite(MotorPins[i+2], LOW);
      digitalWrite(MotorPins[i+3], LOW);
      break;
     case 1:    // 1100
      digitalWrite(MotorPins[i], HIGH);
      digitalWrite(MotorPins[i+1], HIGH);
     // digitalWrite(MotorPins[i+2], LOW);
     // digitalWrite(MotorPins[i+3], LOW);
      break;
     case 2:    // 0100
      digitalWrite(MotorPins[i], LOW);
     // digitalWrite(MotorPins[i+1], HIGH);
      digitalWrite(MotorPins[i+2], LOW);
    //  digitalWrite(MotorPins[i+3], LOW);
      break;
     case 3:    // 0110
     // digitalWrite(MotorPins[i], LOW);
      digitalWrite(MotorPins[i+1], HIGH);
      digitalWrite(MotorPins[i+2], HIGH);
     // digitalWrite(MotorPins[i+3], LOW);
      break;
     case 4:    // 0010
     // digitalWrite(MotorPins[i], LOW);
      digitalWrite(MotorPins[i+1], LOW);
    //  digitalWrite(MotorPins[i+2], HIGH);
      digitalWrite(MotorPins[i+3], LOW);
      break;
     case 5:    // 0011
  //    digitalWrite(MotorPins[i], LOW);
  //    digitalWrite(MotorPins[i+1], LOW);
      digitalWrite(MotorPins[i+2], HIGH);
      digitalWrite(MotorPins[i+3], HIGH);
      break;
     case 6:    // 0001
      digitalWrite(MotorPins[i], LOW);
    //  digitalWrite(MotorPins[i+1], LOW);
      digitalWrite(MotorPins[i+2], LOW);
     // digitalWrite(MotorPins[i+3], HIGH);
      break;
     case 7:    // 1001
      digitalWrite(MotorPins[i], HIGH);
    //  digitalWrite(MotorPins[i+1], LOW);
    //  digitalWrite(MotorPins[i+2], LOW);
      digitalWrite(MotorPins[i+3], HIGH);
      break;
  }
}

Она только и умеет что делать шаг. Вперед или назад. :)
Вызываем ее с нужной частотой - и все.

Добавлено спустя 51 секунду:
Вообще - если будет ТЗ - напишу скетч. Или в существующий добавлю - чего ардуины плодить? Там ресурсов еще море.
Дым, идущий из всех устройств в помещении предвещает появление электрика.
RootAdmin
 
Сообщения: 1725
Зарегистрирован: 07 авг 2010, 21:29
Откуда: КМВ
прог. языки: C
ФИО: Андрей

Re: Arduino pro mini для управления шаговым двигателем

Сообщение Revenger » 25 ноя 2015, 18:38

Дык какое еще ТЗ? )) У нас одна цель - выдавить пластик нужного диаметра и намотать на катушку. :)
Я это затеял именно для подмотки, прилепил туда фоторезистор, чтобы провис контролировать и ускорять намотку или замедлять. Программировать то не умею, не смогу готовый скетч доделать) Желание выводить на дисплей было лишь для того, чтобы показать, что фоторезистор меняет сокрость (просто на видео не заметно) а так, в общем то это не обязательно, т.к. не несёт никакой полезности.

Добавлено спустя 1 час 41 минуту 24 секунды:
Кстати, на счет ресурсов.. ресурсов то хватает наверное, а вот ног маловато )) У драйвера ШД (того, что на намотку) 4 пина. Разве что с торца у прошки еще подпаяться. Может тогда хватит.
Аватара пользователя
Revenger
 
Сообщения: 1728
Зарегистрирован: 01 ноя 2014, 00:50
Откуда: Ставрополье
ФИО: Александр

Re: Arduino pro mini для управления шаговым двигателем

Сообщение Revenger » 29 дек 2015, 20:29

Привет всем, с наступающим!
Снова я... со своими "шашками" ))
Вопрос, что нужно изменить в прошивке, чтобы использовать дисплей 1602 с интерфейсом I2C? Я прикупил парочку, хотел ноги ардуино освободить. Разве что кнопки в "основной" версии дисплея, но может можно что-то придумать и кнопки отдельно прилепить по тому же принципу? Вообще я еще клавиатуру плёночную на всякий случай купил, точнее цифровую, квадрат 8*8см. Может её как-то задействовать...
Вложения
IMG_2147.JPG
Аватара пользователя
Revenger
 
Сообщения: 1728
Зарегистрирован: 01 ноя 2014, 00:50
Откуда: Ставрополье
ФИО: Александр

Re: Arduino pro mini для управления шаговым двигателем

Сообщение RootAdmin » 30 дек 2015, 13:59

Другую библиотеку дисплея.
Написать?
А кнопки - обычные тактовые через такие ж сопротивления отлично работают.
Дым, идущий из всех устройств в помещении предвещает появление электрика.
RootAdmin
 
Сообщения: 1725
Зарегистрирован: 07 авг 2010, 21:29
Откуда: КМВ
прог. языки: C
ФИО: Андрей

Re: Arduino pro mini для управления шаговым двигателем

Сообщение Revenger » 30 дек 2015, 14:05

Если не будет трудно и будет время то... не отказался бы. Я так почитал посмотрел кое-где, там стандартная ликвидкристал вроде походит?
Не принципиально, но ноги же освободятся "на потом".
Да и кнопки как-нить придумаю. Пока со сгоревшего дисплея понажимаю (еще не перепаивал на рабочий), а когда в кучу всё собирать, так и панельку можно будет отпечатать и кнопки облагородить.
Аватара пользователя
Revenger
 
Сообщения: 1728
Зарегистрирован: 01 ноя 2014, 00:50
Откуда: Ставрополье
ФИО: Александр

Re: Arduino pro mini для управления шаговым двигателем

Сообщение RootAdmin » 30 дек 2015, 18:14

Блин, тут среды нет и железа.
В общем надо кусок
Код: Выделить всёРазвернуть
#include <LiquidCrystal.h> // Подключаем стандартную библиотеку LiquidCrystal
// Инициализируем объект-экран, передаём использованные
// для подключения контакты на Arduino в порядке:
#define lcd_RS_pin 7
#define lcd_RW_pin 8
#define lcd_E_pin 9
#define lcd_DB4_pin 10
#define lcd_DB5_pin 11
#define lcd_DB6_pin 12
#define lcd_DB7_pin 13
//                    RS,         RW,        E,         DB4,           DB5,       DB6,          DB7
LiquidCrystal lcd(lcd_RS_pin, lcd_RW_pin, lcd_E_pin, lcd_DB4_pin, lcd_DB5_pin, lcd_DB6_pin, lcd_DB7_pin);


Заменить на
Код: Выделить всёРазвернуть
// Инициализируем объект-экран, передаём использованные 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей

источник http://lesson.iarduino.ru/page/urok-4-p ... k-arduino/
Если библиотеки LiquidCrystal.h нету - скачать!
И положить к остальным.
Если не инклюдится - указать полный путь к библиотеке.
Дым, идущий из всех устройств в помещении предвещает появление электрика.
RootAdmin
 
Сообщения: 1725
Зарегистрирован: 07 авг 2010, 21:29
Откуда: КМВ
прог. языки: C
ФИО: Андрей

Re: Arduino pro mini для управления шаговым двигателем

Сообщение Revenger » 30 дек 2015, 20:42

Спасибо.. думал всё сложнее ))
Чичас попробую принести всё на стол и запустить в таком виде. Хотя стоп.. еще подпаять надо конвертор к дисплею. Ну всё равно )) Еще раз спасибо. Теперь можно будет и управления намотки в одну дуину внедрить как-то ))
Аватара пользователя
Revenger
 
Сообщения: 1728
Зарегистрирован: 01 ноя 2014, 00:50
Откуда: Ставрополье
ФИО: Александр

Re: Arduino pro mini для управления шаговым двигателем

Сообщение Revenger » 31 дек 2015, 14:07

А можно вместо кнопок джойстик использовать? Я тут прикупил парочку под ардуино.. Посмотрел вчера, там правда по осям не кнопки, но и кнопка одна есть, нажатие на джойстик. Всего 3 провода + 2 питание.
Аватара пользователя
Revenger
 
Сообщения: 1728
Зарегистрирован: 01 ноя 2014, 00:50
Откуда: Ставрополье
ФИО: Александр

Re: Arduino pro mini для управления шаговым двигателем

Сообщение RootAdmin » 05 янв 2016, 18:13

Можно... Что за джойстик? его схема?
Дым, идущий из всех устройств в помещении предвещает появление электрика.
RootAdmin
 
Сообщения: 1725
Зарегистрирован: 07 авг 2010, 21:29
Откуда: КМВ
прог. языки: C
ФИО: Андрей

Re: Arduino pro mini для управления шаговым двигателем

Сообщение Revenger » 06 янв 2016, 02:23

Вот такой: http://ru.aliexpress.com/item/A25-New-H ... 18400_6151
Схемы нет (пока и не искал, просто купил на всякий случай), просто выводы по двум осям (судя по всему энкодеры) и кнопка обычная.
Аватара пользователя
Revenger
 
Сообщения: 1728
Зарегистрирован: 01 ноя 2014, 00:50
Откуда: Ставрополье
ФИО: Александр

Re: Arduino pro mini для управления шаговым двигателем

Сообщение RootAdmin » 06 янв 2016, 12:21

Он (джойстик) аналоговый. На выводах VRx и VRy напряжение меняется от GND до VCC при отклонении в крайние положения.
Использовать конечно можно, причем привязав скорость изменения регулироемого параметра к величине отклонения.
Дым, идущий из всех устройств в помещении предвещает появление электрика.
RootAdmin
 
Сообщения: 1725
Зарегистрирован: 07 авг 2010, 21:29
Откуда: КМВ
прог. языки: C
ФИО: Андрей

Re: Arduino pro mini для управления шаговым двигателем

Сообщение Revenger » 06 янв 2016, 14:01

Ясно. В общем то хорошая новость, что возможно. Вопрос: как сделать реально и стОит ли заморачиваться (может всё же кнопки сотворить и не изобретать новый скетч)?

п.с. я так понимаю, что для тех же функций, что сейчас, плавная регулировка (функция джойстика) в общем то и не нужна вроде, можно и кнопками "тыкать" пока не установится нужная скорость, а вот для чего-то дополнительного (типа намотчика) такая регулировка была бы наверное удобней. Хотя тоже кнопки решат вопрос. Я то про джойстик подумал больше чтобы освободить контакты ардуино для функции намотчика (хотя пока скетч под экструдер только).
Аватара пользователя
Revenger
 
Сообщения: 1728
Зарегистрирован: 01 ноя 2014, 00:50
Откуда: Ставрополье
ФИО: Александр

Re: Arduino pro mini для управления шаговым двигателем

Сообщение RootAdmin » 11 янв 2016, 15:22

Несложно. Но джойстик займет три вывода (две оси и кнопка). А кнопки на резисторном делителе - один вывод.
В процедуру обработки кнопок - надо менять алгоритм и все, в общем.
Дым, идущий из всех устройств в помещении предвещает появление электрика.
RootAdmin
 
Сообщения: 1725
Зарегистрирован: 07 авг 2010, 21:29
Откуда: КМВ
прог. языки: C
ФИО: Андрей

Пред.След.

Вернуться в Arduino и другие Xduino

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12

Mail.ru counter