Niestety, nadal bez resetu kontrolera nie można przesłąć nowego zestawu danych.
Przy ustawieniach
setSpeed biblioteka Multistepper nie działa. Ustawienia
setMaxSpeed jest OK. Praktycznie nie zauważyłem jakiegokolwiek przyspieszenia.
Ale pojawiło się nowe kuriozum, które zwaliło mnie z nóg. Aby zmienić kierunek obrotu silnika w Multistepper należy
gotoposition[0] podać ze znkiem "-". Zmienną Lkp mam ustawiną jako long. Gdy przesyłam taką komendę "
cmd=64000,4800,6400,480\n" wszystko pięknie pracuje. Ustawienie pierwszej pozycji na "-64000" powoduje, że wartość zmiennej przypisanej do tej pozycji wynosi Lkp=1536. Tak się nie dzieje gdy pozycja druga jest ujemna. Wartość drugiej zmiennej Lko jest zawsze poprawnie pokazywana ze znakiem "-".
Próbowałem jeszcze tak:
int Lkp;
Lkp=dane[0]*100; a wprowadzona wielkość to 640. Kaszana taka sama tylko inną wartość zmiennej pokazuje.
Kod:
//#include <String.h>
#include <AccelStepper.h>
#include <MultiStepper.h>
#define buffsize 64
char input[buffsize];
uint16_t dane [4]; // jakie i ile zmiennych odbieramy z UART
byte index = 0;
boolean stringComplete = false; // gdy cale polecenie/napis odebrany
long Lkp;
int Lko ;
int Prp;
int Pro;
AccelStepper stepper1 (1, 2, 5); //shield V3
AccelStepper stepper2 (1, 3, 6);
const int enablePin1 = 8; // Steruje wyłączaniem sterowników
const int enablePin2 = 8;
MultiStepper steppersControl;
long gotoposition[3];
void parsujpolecenia()
{
/*polecenie ma wygladac tak: cmd=zmienna1,zmienna2,zmienna3,zmienna4 z zalozenia sa to 4 liczby calkowite
do 5 cyfr, dlatego buffsize32 ma zapas, dla innych trzeba zmodyfikowac bufor, tablice zmiennych, funkcje
do konwersji napisu na liczby
cmd=234,342,553,3432*/
uint8_t index=0;
char * polecenie=input;
Serial.print("Otrzymane polecenie: ");
Serial.println(polecenie);
char* command1 = strtok(polecenie, "=");
if (strcmp(command1 , "cmd")==0)
{
while ((command1 = strtok(NULL, ",")) != NULL)
{
// Znajdź następne polecenie w ciągu wejściowym
dane[index++]=atoi(command1); //konwersja napisu na INT i zapisanie do kolejnej pozycji w tablicy
if (index == (sizeof(dane)/sizeof(dane[0])))
break;
}
Lkp = dane[0];
Lko = dane[1];
Prp = dane[2];
Pro = dane[3];
}
else
Serial.println("Polecenie nieprawidlowe");
Serial.println("Aktualne parametry:");
Serial.print(" Lkp = ");
Serial.println(Lkp);
Serial.print(" Lko = ");
Serial.println(Lko);
Serial.print(" Prp = ");
Serial.println(Prp);
Serial.print(" Pro = ");
Serial.println(Pro);
stringComplete = false;
}
// Arduino initialization function.
void setup()
{
Serial.begin(9600);
pinMode(enablePin1,OUTPUT);
pinMode(enablePin2,OUTPUT);
steppersControl.addStepper(stepper1);
steppersControl.addStepper(stepper2);
/* stepper1.setMaxSpeed(2000);
stepper2.setMaxSpeed(1000);
steppersControl.addStepper(stepper1);
steppersControl.addStepper(stepper2);
*/
}
void loop()
{
while (stringComplete == 0)
serialEvent();
parsujpolecenia();
// Teraz mozna cos zrobic ze zmiennymi
pan();
}
void serialEvent() {
while (Serial.available()>0) {
char aChar = Serial.read();
if(aChar == '\n')
{
// wykryto znak konca linii \n, koniec odbioru
input[index] = 0;
index = 0;
stringComplete = true;
}
else
{
input[index] = aChar;
if(index<buffsize) index++;
input[index] = '\0'; // Na koncu napisu wstawiamy 0
}
}
}
void pan()
{
stepper1.setMaxSpeed(Prp);
stepper2.setMaxSpeed(Pro);
gotoposition[0] = Lkp; // 800 steps - full rotation with quater-step resolution
gotoposition[1] = Lko;
steppersControl.moveTo(gotoposition); // Calculates the required speed for all motors
steppersControl.runSpeedToPosition(); // Blocks until all steppers are in position
}