Драйвер ШД dm542, arduino leonardo, LCD i2C
- Войдите на сайт для отправки комментариев
Приветствую! подскажите пожалуйста!
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 об/мин.
и 3) как на одном МК управлять и драйвером и LCD (i2C) экраном? каждый раз когда передаются данный на экран, шаговик приостанавливается. когда давно проблема решилась подключением экрана к одной уне, а драйвера к другой уне. и между собой уны общались по юарт. искру нео с китайской уно подружить почему то не получилось...
например на 3д принтере МЕГА управляется 4-5ю моторами и выводит показания на экран и всё ок. ни один из моторов не притормаживается при обновлении экрана. как так то :(
и не получается найти голый код для вывода значений на экран. т.е. как управлять экраном без библиотеки. а в библиотеке код мудрено написан, не пойму...
данные вывожу так:
#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); }Но скорость вращения мотора меняется не равномерно. необходимо было менять значения от 5 об/мин до 75 об/мин. При вращении резистора на 95% скорость мотора увеличивается примерно до половины, и в оставшиеся 5% хода крутилки происходит увеличение скорости до 75 об/мин. почему так?
Вангую, взять потенциометр с линейной характеристикой, а не с магнитолы.
потенциометр как раз с линейной... через монитор порта наблюдал значение
Вы меняете период , а хотите менять частоту .
не совсем понял куда и как это вставить... управление ведь осуществляется задержкой отсылки сигналов?
ии.... почему +1?)
+1 это что бы на ноль не делить.Ошибка при делении. задержка отсылки сигнала дает период между тактами. Обороты это функция обратная от этих периодов. Вот вам и отсутсвие линейности.
и 3) как на одном МК управлять и драйвером и LCD (i2C) экраном? каждый раз когда передаются данный на экран, шаговик приостанавливается...
например на 3д принтере МЕГА управляется 4-5ю моторами и выводит показания на экран и всё ок. ни один из моторов не притормаживается при обновлении экрана. как так то :(
То, что при передаче денных на экран все остальные процессы (не только шаговик) приостанавливаются - это вполне нормальная ситуация и иначе быть не может.
Другое дело, что I2C LCD - медленное устройство, а потому в Вашем случае шаговик не просто приостанавливается, а приостанавливается надолго. Т.е. полностью от "приостановки" избавиться не удастся, остается лишь добиться, чтобы уменьшить время приотсановки до приемлемых величин.
Здесь существует, минимум, 3 варианта:
1. Переписать библиотеку с целью уменьшить время вывода.
2. Переписать алгоритм отображения на экране, чтобы за раз выводить не все содержимое экрана, а по одному символу.
3. Заменить I2C LCD на что-то более быстрое.
Привет я с вами, собирали для меня.
Драйвер dm542 будет работать от 3.3 в? Ардуино Due.
Я надеюсь вы имеете в виду управляться от 3.3 в ? На входе оптопары, есть вероятность, что будет, но по даташиту минимум 5в.
Я надеюсь вы имеете в виду управляться от 3.3 в ? На входе оптопары, есть вероятность, что будет, но по даташиту минимум 5в.
Да, управляющие напряжение. Нашел блок питания, подключил, работает.