Драйвер ШД dm542, arduino leonardo, LCD i2C

rapidshe
Offline
Зарегистрирован: 31.12.2015

Приветствую! подскажите пожалуйста!

1) подключал драйвер dm542 к леонардо(по факту искра нео) и к китайской уне. почему то при одном и том же скетче на леонардо мотор крутится быстрее.  леонардо шустрее работает?

2)Вчера перепробовал кучу библиотек, но половина не работала, половина работала не так как надо. нужо просто регулировать скорость вращения. В итоге использовал код:


int pulPin = 10;
int dirPin = 11;
int enblPin = 12;
int ledPin = 13;

long motorSpeed;

void setup() {

  Serial.begin(9600);
  pinMode(pulPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
  pinMode(enblPin, OUTPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(6, OUTPUT);
  digitalWrite(pulPin, LOW);
  digitalWrite(ledPin, LOW);
  digitalWrite(enblPin, LOW);
  digitalWrite(dirPin, LOW);


  Serial.println("init");
  
  digitalWrite(enblPin, HIGH);
  delay(100);
  digitalWrite(enblPin, LOW);
}

void loop() {
 
   int sensorReading = analogRead(A0);
   Serial.println(sensorReading);
   motorSpeed = map(sensorReading, 0, 1023, 600, 14000); //менять тут 600 и 1400
   Serial.println(motorSpeed);

    digitalWrite(pulPin, HIGH);
    digitalWrite(ledPin, HIGH);
    digitalWrite(pulPin, LOW);
    digitalWrite(ledPin, LOW);
    delayMicroseconds(motorSpeed);
}

Но скорость вращения мотора меняется не равномерно. необходимо было менять значения от 5 об/мин до 75 об/мин. При вращении резистора на 95% скорость мотора увеличивается примерно до половины, и в оставшиеся 5% хода крутилки происходит увеличение скорости до 75 об/мин. почему так? как правильно сделать? 600 и 14000 - значения задержки. при 600 75 об/мин, при 14000 5 об/мин.

rapidshe
Offline
Зарегистрирован: 31.12.2015

и 3) как на одном МК управлять и драйвером и LCD (i2C) экраном? каждый раз когда передаются данный на экран, шаговик приостанавливается. когда давно проблема решилась подключением экрана к одной уне, а драйвера к другой уне. и между собой уны общались по юарт. искру нео с китайской уно подружить почему то не получилось...

например на 3д принтере МЕГА управляется 4-5ю моторами и выводит показания на экран и всё ок. ни один из моторов не притормаживается при обновлении экрана. как так то :(

rapidshe
Offline
Зарегистрирован: 31.12.2015

и не получается найти голый код для вывода значений на экран. т.е. как управлять экраном без библиотеки. а в библиотеке код мудрено написан, не пойму...

 

данные вывожу так:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3f, 16, 2);



int pulPin = 10;
int dirPin = 11;
int enblPin = 12;
int ledPin = 13;
long motorSpeedLast;
long motorSpeed;


void setup() {
  // put your setup code here, to run once:
  lcd.init();                      // initialize the lcd
  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print(F("     Hello     "));
  delay(3000);

  

  motorSpeedLast=0;
  Serial.begin(9600);
  pinMode(pulPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
  pinMode(enblPin, OUTPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(6, OUTPUT);
  digitalWrite(pulPin, LOW);
  digitalWrite(ledPin, LOW);
  digitalWrite(enblPin, LOW);
  digitalWrite(dirPin, LOW);


  Serial.println("init");
  
  digitalWrite(enblPin, HIGH);
  delay(100);
  digitalWrite(enblPin, LOW);
}

void loop() {

  int sensorReading = analogRead(A0);
  Serial.println(sensorReading);
  motorSpeed = map(sensorReading, 0, 1023, 600, 14000); //подбиралось 600 и 1400
  Serial.println(motorSpeed);

    digitalWrite(pulPin, HIGH);
    digitalWrite(ledPin, HIGH);
    digitalWrite(pulPin, LOW);
    digitalWrite(ledPin, LOW);
    delayMicroseconds(motorSpeed);

  if (motorSpeed>(motorSpeedLast+136) || motorSpeed<(motorSpeedLast-136)) //что б слишком часто не обновлялся экран 
     {
     setLCDdata (); 
     motorSpeedLast=motorSpeed;
     }
}


void setLCDdata () {
  lcd.setCursor(0,0);
  long motorSpeed1 = map(motorSpeed, 14000, 600, 1, 100); //преобразовал в показания от 1 до 100
  String data = "";
  data=F("Speed:      ");
  if (motorSpeed1>=100 && motorSpeed1<1000) data+=" "; 
  if (motorSpeed1>=10 && motorSpeed1<100) data+="  "; 
  if (motorSpeed1>=1 && motorSpeed1<10) data+="   ";
  data+=motorSpeed1;
  lcd.print(data);
 }

 

bwn
Offline
Зарегистрирован: 25.08.2014

rapidshe пишет:

Но скорость вращения мотора меняется не равномерно. необходимо было менять значения от 5 об/мин до 75 об/мин. При вращении резистора на 95% скорость мотора увеличивается примерно до половины, и в оставшиеся 5% хода крутилки происходит увеличение скорости до 75 об/мин. почему так? 

Вангую, взять потенциометр с линейной характеристикой, а не с магнитолы.

rapidshe
Offline
Зарегистрирован: 31.12.2015

потенциометр как раз с линейной... через монитор порта наблюдал значение

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

rapidshe пишет:
Но скорость вращения мотора меняется не равномерно. необходимо было менять значения от 5 об/мин до 75 об/мин. При вращении резистора на 95% скорость мотора увеличивается примерно до половины, и в оставшиеся 5% хода крутилки происходит увеличение скорости до 75 об/мин. почему так? как правильно сделать? 600 и 14000 - значения задержки. при 600 75 об/мин, при 14000 5 об/мин.

Вы меняете период , а хотите менять частоту . 

motorSpeed =1000/ (sensorReading +1);

 

rapidshe
Offline
Зарегистрирован: 31.12.2015

не совсем понял куда и как это вставить... управление ведь осуществляется задержкой отсылки сигналов?

ии.... почему +1?)

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

+1 это что бы на ноль не делить.Ошибка при делении. задержка отсылки сигнала дает период между тактами. Обороты это функция обратная от этих периодов. Вот вам и отсутсвие линейности.

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

rapidshe пишет:

и 3) как на одном МК управлять и драйвером и LCD (i2C) экраном? каждый раз когда передаются данный на экран, шаговик приостанавливается...

например на 3д принтере МЕГА управляется 4-5ю моторами и выводит показания на экран и всё ок. ни один из моторов не притормаживается при обновлении экрана. как так то :(

То, что при передаче денных на экран все остальные процессы (не только шаговик) приостанавливаются - это вполне нормальная ситуация и иначе быть не может.

Другое дело, что I2C LCD - медленное устройство, а потому в Вашем случае шаговик не просто приостанавливается, а приостанавливается надолго. Т.е. полностью от "приостановки" избавиться не удастся, остается лишь добиться, чтобы уменьшить время приотсановки до приемлемых величин.

Здесь существует, минимум, 3 варианта:

1. Переписать библиотеку с целью уменьшить время вывода.

2. Переписать алгоритм отображения на экране, чтобы за раз выводить не все содержимое экрана, а по одному символу.

3. Заменить I2C LCD на что-то более быстрое.

Vsaharov
Offline
Зарегистрирован: 28.10.2017

Привет я с вами, собирали для меня.

Duet
Offline
Зарегистрирован: 17.01.2015

Драйвер dm542 будет работать от 3.3 в? Ардуино Due.

Morroc
Offline
Зарегистрирован: 24.10.2016

Я надеюсь вы имеете в виду управляться от 3.3 в ? На входе оптопары, есть вероятность, что будет, но по даташиту минимум 5в.

Duet
Offline
Зарегистрирован: 17.01.2015

Morroc пишет:

Я надеюсь вы имеете в виду управляться от 3.3 в ? На входе оптопары, есть вероятность, что будет, но по даташиту минимум 5в.

Да, управляющие напряжение. Нашел блок питания, подключил, работает.