24-10-2024, 16:03
Mój poprzedni wątek dot.sterowania sliderem prze bluetooth został szybko zamknięty przez moderatora. Ale moje problemy się nie skończyły.
Otóż nie mogę uruchomić funkcji pan() po poprawnym wprowadzeniu danych przez bluetooth. Wszystkie niezbędne parametry do poprawnego działania tej funkcji (Lkp,Lko,Prp,Pro)są poprawne. Dla testu dałączyłem dwie proste funkcje led1() i led2() i te działają.
Oto kod:
Gdzie tkwi błąd?
Do obsługi slidera stworzyłem taką apkę:
https://ai2.appinventor.mit.edu/b/1pj7q
Otóż nie mogę uruchomić funkcji pan() po poprawnym wprowadzeniu danych przez bluetooth. Wszystkie niezbędne parametry do poprawnego działania tej funkcji (Lkp,Lko,Prp,Pro)są poprawne. Dla testu dałączyłem dwie proste funkcje led1() i led2() i te działają.
Oto kod:
Kod:
//#include <String.h>
#include <AccelStepper.h>
#include <MultiStepper.h>
#define buffsize 32
char input[buffsize];
uint16_t dane [10]; // jakie i ile zmiennych odbieramy z UART
byte index = 0;
boolean stringComplete = false; // gdy cale polecenie/napis odebrany
long ng = 0 ; // Czas nagrywania (godziny)
long nm = 0 ; // Czas nagrywania (minuty)
long ns = 0 ; // Czas nagrywania (sekundy)
long Dp = 0;
long so = 0;
long Kog = 0;
long Kp = 0;
long Ko = 0;
long Cp = 0;
long A;
int x = 0;
long Lkp;
long Lko ;
long Prp;
long 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){ //sprawdzenie czy czesc przed znakiem = jest rowna cmd
while (command1 != 0)
{
//Serial.println(command1);
command1 = strtok(NULL, ","); //dzielimy reszte napisu w miejscach gdzie jest ","
// Znajdź następne polecenie w ciągu wejściowym
if(index<10) dane[index]=atoi(command1); //konwersja napisu na INT i zapisanie do kolejnej pozycji w tablicy
index++;
A = dane[0];
Dp = dane[1];
Kog = dane[2];
ng = dane[7];
nm = dane[8];
ns = dane[9];
Kp = dane[3];
Ko = dane[4];
so = dane[6];
Cp = dane[5];
}
}
else
Lkp = Dp*80*10;
const long Lkp = dane[1]*80*10;
const long Lko = Kog*3*8.8889; //8.8889 dla 16 kroków
const long Prp = Lkp/Cp ; // Prędkość w poziomie( kroki/sek)
const long Pro = Lko/Cp ; //Prędkość głowicy( kroki/sek)
Serial.println("Polecenie nieprawidlowe");
Serial.println("Aktualne parametry:");
Serial.print(" A = ");
Serial.println(A);
Serial.print(" Dp = ");
Serial.println(Dp);
Serial.print(" Cp = ");
Serial.println(Cp);
Serial.print(" Kog = ");
Serial.println(Kog);
Serial.print(" Kp = ");
Serial.println(Kp);
Serial.print(" Ko = ");
Serial.println(Ko);
Serial.print(" ng = ");
Serial.println(ng);
Serial.print(" nm = ");
Serial.println(nm);
Serial.print(" ns = ");
Serial.println(ns);
Serial.print(" so = ");
Serial.println(so);
Serial.print(" Lko = ");
Serial.println(Lko);
Serial.print(" Pro = ");
Serial.println(Pro);
Serial.print(" Lkp = ");
Serial.println(Lkp);
Serial.print(" Prp = ");
Serial.println(Prp);
stringComplete = false;
}
// Arduino initialization function.
void setup()
{
Serial.begin(9600);
pinMode(LED_BUILTIN, OUTPUT);
pinMode(enablePin1,OUTPUT);
pinMode(enablePin2,OUTPUT);
stepper1.setMaxSpeed(Prp);
stepper2.setMaxSpeed(Pro);
steppersControl.addStepper(stepper1);
steppersControl.addStepper(stepper2);
}
void loop()
{
if (stringComplete) parsujpolecenia();
// Teraz mozna cos zrobic ze zmiennymi
delay(1000);
switch (A)
{
case 0:
pan();
led1();
break;
case 1:
pan();
led2();
break;
//default:
// instrukcje domyślne (jeżeli var różne od 1 i 2)
}
}
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()
{
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
}
void led1()
{ digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000);
}
void led2()
{ digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(100); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(100);
}Do obsługi slidera stworzyłem taką apkę:
https://ai2.appinventor.mit.edu/b/1pj7q

