• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Wprowadzanie danych przez Bluetooth
#1
Skonstrułowałem slider do kamerki, który sterowany jest przez Arduino. (Kod w załączeniu).
Chciałbym móc wprowadzać niezbędne dane (Dp, s, Kog) za pomocą Bluetooth'a. Niestety, nie mam najmniejszego pojęcia jak to zrobić. Udało mi się tylko wprowadzić jedną zmienną stosując to:
Kod:
void setup() {
  Serial.begin(9600);
}
void loop() {
  if (Serial.available()) {
    int s = Serial.parseInt();  
  }
}
Czy mógłby mi ktoś pomóc w rozwiązaniu tej kwestii? Będę wdzięczny
 
#2
Załączam kod do slidera
Kod:
#include <AccelStepper.h>
#include <MultiStepper.h>

const int Ik =  80  ; // Ilość kroków na 1mm
float Dp =  85  ; // Długość przejazdu (cm)
const float Kog = 180  ; // Kąt obrotu głowicy w st.
const long s = 60  ; // Czas przejazdu (sek)
const long Lkp = Dp*Ik*10;
const long Lko = Kog*3*8.8889;
const long Prp = Lkp/s  ; // Prędkość w poziomie( kroki/sek)
const long Pro = Lko/s  ; //Prędkość głowicy( kroki/sek)



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 setup() {
  pinMode(enablePin1,OUTPUT);
  pinMode(enablePin2,OUTPUT);

  stepper1.setMaxSpeed(Prp);
  stepper2.setMaxSpeed(Pro);
  steppersControl.addStepper(stepper1);
  steppersControl.addStepper(stepper2);

}

void loop() {

gotoposition[0] = Lkp; 
  gotoposition[1] = Lko;


  steppersControl.moveTo(gotoposition);
  steppersControl.runSpeedToPosition();

}
 
#3
Trzeba sobie ogarnąć parsowanie danych,  Ustawiasz sobie jakąś linię tekstu zaczynającą się np. od @, ciągu znaków jak cmd, kończącą się na NL/Return, dane oddzielasz przecinkiem i możesz wysłać taki zestaw danych na raz. Tak poprawnie można też użyć formatu json.
Kod:
//#include <String.h>
#define buffsize 32
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


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 ","

// Find the next command in input string
if(index<4) dane[index]=atoi(command1); //konwersja napisu na INT i zapisanie do kolejnej pozycji w tablicy
index++;
}
}
  else Serial.println("Polecenie nieprawidlowe");
  Serial.println("Aktualne parametry:");
  Serial.print("Zmienna 1 = ");
  Serial.println(dane[0]);
  Serial.print("Zmienna 2 = ");
  Serial.println(dane[1]);
  Serial.print("Zmienna 3 = ");
  Serial.println(dane[2]);
  Serial.print("Zmienna 4 = ");
  Serial.println(dane[3]);
    stringComplete = false;
  }


// Arduino initialization function.
void setup()
{
  Serial.begin(115200);
}


void loop()
{

if (stringComplete) parsujpolecenia();
// Teraz mozna cos zrobic ze zmiennymi
}
 


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   
     }
  }
}
Tu masz zestaw potrzebnych funkcji, jak czegoś brakuje to po hasłach parsowanie znajdziesz w Google resztę.
Miło być decenianym https://buycoffee.to/kaczakat
 
#4
(14-10-2024, 19:33)andrzejn napisał(a): Załączam kod do slidera
Kod:
void loop() {

gotoposition[0] = Lkp; 
  gotoposition[1] = Lko;


  steppersControl.moveTo(gotoposition);
  steppersControl.runSpeedToPosition();

}


Tylko pmiętaj, że runSpeedToPosition() jest blokująca, więc nic nie odbierzesz w jej trakcie. Jeśli polecenie zmieści się w buforze Seriala (64 bajty) to jeszcze dasz radę to sparsować, ale kolejne już pewnie się nie zmieści. Nieblokująca metoda to run() - trzeba ją tylko często wywoływać.
 
#5
Kaczakat,
Serdecznie dziękuję za poświęcony czas i przesłanie kodu ze szczegółowym opisem. Niestety moja nikła wiedza programistyczna nie pozwoliła mi na poprawne uruchomienie tego programu. Czy mógłbyś mi zatem pokazać jak uzupełnić ten kod, tak bym mógł skutecznie wprowadzić 4 dane: a,b,c,d.
Będę zobowiązany.
 
#6
Ale masz tam przykład, w tym przypadku wysyłasz linię "cmd=234,342,553,3432", po prostu go wgraj jak jest i przetestuj, jak zrozumiesz działanie to przeniesiesz do innego programu. Te liczby zostaną przypisane do elementów tablicy od pozycji 0 do 3, masz je w zmiennych, w loop jest tylko 1 linia kodu, więc nie sposób jej nie zauważyć.
Jeśli tego kodu używasz na ESP to nie ma ukrytego w loop serial event jak w UNO/NANO. Trzeba dodać tę funkcję do loop, wtedy całość wygląda tak:
Kod:
void loop()
{
serialEvent();
if (stringComplete) parsujpolecenia();
// Teraz mozna cos zrobic ze zmiennymi
}
Może tu leżał problem  - warto mieć różne płytki do testów.
Poza tym linia musi być zakończona NL by funkcja widziała, że przyleciała cała linia komendy, przetestuj to na terminalu Arduino, tu możesz to ustawić, potem przejdź do aplikacji BT i powiel. Jeśli aplikacja nie będzie wysyłać takiego znaku, nie umiesz tego ustawić to możesz zamienić na coś, czego nie będziesz normalnie wysyłał do sterowania - wybierz coś z dziwnych znaków: #$%@ na koniec wysyłanej linii i podmień w funkcji if(aChar == '\n').
Miło być decenianym https://buycoffee.to/kaczakat
 
#7
Wreszcie zrozumiałem w czym rzecz. Wszystko pięknie chodzi z modułem bluetooth. Teraz czeka mnie połączenie z moją aplikacją do obsługi slidera.
Jeszcze raz bardzo dziękuję. Druga kawka już czeka
 
#8
Dzięki za kawę, powodzenia w dalszym rozwoju programu.
Miło być decenianym https://buycoffee.to/kaczakat
 
  


Skocz do:


Przeglądający: 1 gości