шаговик + моторшилд + джойстик

аланг
Offline
Зарегистрирован: 08.04.2015

Помогите с кодом товарищи!
Есть код управления шаговиком биполярным с помощью джойстика+ардуино уно + моторшилд l293d.Но при. подключении сервамотора и доп джойстика ухудшается .качество работы шаговика (дребезг). Может кто подскажет решение, код прилагаю
#include
#include
#include
AF_Stepper motor1(400, 2);
int sensorPin = A2;
int sensorReading = 0;
int prevMapped = 0;
int sensorMax = 0;
int sensorMin = 0;
int mode = MICROSTEP;
// you can change these to DOUBLE or INTERLEAVE or MICROSTEP!
Servo myservo;
float spos=90;
int sspd=200;
void forwardstep() {
motor1.onestep(FORWARD, SINGLE);
}
void backwardstep() {
motor1.onestep(BACKWARD, SINGLE);
}

void setup()
{
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.println("Stepper test!");
motor1.setSpeed(10);

myservo.attach(9);
Serial.begin(9600);
}
void loop()
{
sensorReading = analogRead(sensorPin);
if (sensorReading > sensorMax)
{sensorMax = sensorReading;
}
sensorReading = map(sensorReading,0,1023,-4,5);
Serial.println(sensorReading);
//if (prevMapped != sensorReading)
if (prevMapped > 0)
{motor1.step(1, FORWARD, mode);
delay(5-prevMapped);
}
else if (prevMapped < 0)
{motor1.step(1, BACKWARD, mode);
delay(5+prevMapped);
}
prevMapped = sensorReading;
//stepper.runSpeed();

int sensorValue = analogRead(A0);
if (sensorValue<=480) {spos=spos-(500-sensorValue)/sspd;}
else if (sensorValue>=520) {spos=spos+(sensorValue-500)/sspd;}
if (spos>170) {spos=170;}
else if (spos<10) {spos=10;}
myservo.write(spos+15);
Serial.print("spos ");
Serial.println(spos);
Serial.print("sensorValue ");
Serial.println(sensorValue);
delay(30);
}

аланг
Offline
Зарегистрирован: 08.04.2015

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

#include <AFMotor.h>

AF_Stepper motor(400, 2);
int sspd=80;
float steps=0;
int pos=0;

void setup()
{
Serial.begin(9600);
motor.setSpeed(10); // 10 об/мин
}

void loop()
{
int pos = analogRead(A1);
Serial.println(pos);
if (pos<=480)
{
steps=steps-(500-pos)/sspd;
motor.step(steps, FORWARD, MICROSTEP);
motor.setSpeed(steps);
}
else if (pos>=520)
{
steps=steps+(pos-500)/sspd;
motor.step(steps, BACKWARD, MICROSTEP);
motor.setSpeed(steps);
}
Serial.print(" ");
Serial.print(steps);
}

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012
аланг
Offline
Зарегистрирован: 08.04.2015

Так вот главный вопрос - как сделать чтоб шаговик и сервомотор вместе работали на одном ардуино так же плавно, как и по отдельности? Или проще купить отдельный ардуино для серво?

аланг
Offline
Зарегистрирован: 08.04.2015

У меня на смартфоне не открывается такое окно

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

Код необходимо "оформлять" и прятать под спойлер.

аланг
Offline
Зарегистрирован: 08.04.2015

На смартфоне не реализуемо, уважаемый. Только  на БК.

#include <AccelStepper.h>
#include <AFMotor.h>
#include <Servo.h> 
AF_Stepper motor1(400, 2);
int sensorPin = A2;
int sensorReading = 0;
int prevMapped = 0;
int sensorMax = 0;
int sensorMin = 0;
int mode = MICROSTEP;
// you can change these to DOUBLE or INTERLEAVE or MICROSTEP!
Servo myservo;
float spos=90;
int sspd=200;
void forwardstep() {
motor1.onestep(FORWARD, SINGLE);
}
void backwardstep() {
motor1.onestep(BACKWARD, SINGLE);
}

void setup()
{
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.println("Stepper test!");
motor1.setSpeed(10);

myservo.attach(9);
Serial.begin(9600);
}
void loop()
{
sensorReading = analogRead(sensorPin);
if (sensorReading > sensorMax)
{sensorMax = sensorReading;
}
sensorReading = map(sensorReading,0,1023,-4,5);
Serial.println(sensorReading);
//if (prevMapped != sensorReading)
if (prevMapped > 0)
{motor1.step(1, FORWARD, mode);
delay(5-prevMapped);
}
else if (prevMapped < 0)
{motor1.step(1, BACKWARD, mode);
delay(5+prevMapped);
}
prevMapped = sensorReading;
//stepper.runSpeed();

int sensorValue = analogRead(A0);
if (sensorValue<=480) {spos=spos-(500-sensorValue)/sspd;}
else if (sensorValue>=520) {spos=spos+(sensorValue-500)/sspd;}
if (spos>170) {spos=170;}
else if (spos<10) {spos=10;}
myservo.write(spos+15);
Serial.print("spos ");
Serial.println(spos);
Serial.print("sensorValue ");
Serial.println(sensorValue);
delay(30);
}