• 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
Przysyłanie tablicy do arduino
#1
Witam,
Mam kłopot ponieważ chcę przesłać tablicę powiedzmy 512 elementów typu double albo int do arduino za pomocą serial.

Robiłem to za pomocą jednego długiego stringa i rozdzielałem po jakimś symbolu, ale przesyłało się tylko kilka wartości, prawdopodobnie ograniczenie. Tak więc pytanie jak z pc (c#,java czy coś innego) przesłać do arduino tablicę która składa się powiedzmy z 500+ elementów? 

Pozdrawiam,
Rout
 
Odpowiedź
#2
Przesłać się pewnie przesłało ale zapewne źle się odebrało(Ty źle napisałeś program).
Co robiłeś z przesłanymi danymi , do którego arduino przysyłałeś. Pokaż program.
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#3
Nie wstawiałem kodu bo myślałem że to tylko pogorszy sprawę. Chodzi o to że do arduino muszę przesłać 500 cyfr(int albo double), następnie jak arduino otzyma te 500 wartości to musi przejść dalej czyli zająć się obsługą silnika krokowego. Te 500 wartości to będą odpowiednio delay`e do sterowania prędkością pacy silnika.

Kod Arduino:

Kod:
//511 to wtedy mam 360 stopni
//krok to +/- 0.7045 stopnia 14 kroków to skok co 9,86 stopni


const int s1 = 0;
const int s2 = 1;
const int s3 = 2;
const int s4 = 3;

int del = 1000;
int teller = 0;
int chose = 0;
int stepp = 0;
String data[5] = "";
int dell[500];
void setup() {                
 pinMode(s1, OUTPUT);    
 pinMode(s2, OUTPUT);    
 pinMode(s3, OUTPUT);    
 pinMode(s4, OUTPUT);
 
}

void loop() {
 
// del = 900; // delay im mniejszy tym szybciej sie wykona obrot
 //900 max szybko
 
 
 chose = 1;
 //chose = (getValue(data, '-', 0)).toInt();
 //stepp = (getValue(data, '-', 1)).toInt();
 //Serial.flush();
//menu();




 

 for (int i=0; i<=500; i++){
   
   //del = (getValue(data, ';', i)).toInt();
   del = dell[i]
 
 Serial.print(del);
 Serial.print("\n");

   
      if(chose == 1) forwards();
      else if(chose == 2) backwards();
      motorOff();
 //   forwardsFull();
 //   backwardsFull();
 }
 
 motorOff();
 delay(10);  
}
 


void menu(){
 int a = 0;
 
 while(!Serial.available());
 data[0] = Serial.readString();
 Serial.flush();
 for (int i=0; i<=500; i++){
   
   //del = (getValue(data, ';', i)).toInt();
   
 dell[a] = (getValue(data[0], ';', i)).toInt();
 a = a+1;
 }
 
 
   
   
 
 
 
 /*chose = Serial.parseInt();
 Serial.flush();
 Serial.print("Ilosc krokow");
 while(!Serial.available()) ;
 stepp = Serial.parseInt();
 Serial.flush();
 Serial.print("Szybosc max 900");
 while(!Serial.available()) ;
 del = Serial.parseInt();*/
}

String getValue(String data, char separator, int index)
{
   int found = 0;
   int strIndex[] = { 0, -1 };
   int maxIndex = data.length() - 1;

   for (int i = 0; i <= maxIndex && found <= index; i++) {
       if (data.charAt(i) == separator || i == maxIndex) {
           found++;
           strIndex[0] = strIndex[1] + 1;
           strIndex[1] = (i == maxIndex) ? i+1 : i;
       }
   }
   return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
}
void information()
{
 Serial.print("\n\nWybrales opcje nr ");
 Serial.print(chose);
 Serial.print(" silnik obroci sie o ");
 double radius = stepp * 0.7045;
 Serial.print(radius);
 Serial.print(" stopni");
}

void motorOff(){
 digitalWrite(s1, LOW);
 digitalWrite(s2, LOW);
 digitalWrite(s3, LOW);
 digitalWrite(s4, LOW);
}

void backwards(){

 digitalWrite(s1, HIGH);
 digitalWrite(s2, LOW);
 digitalWrite(s3, LOW);
 digitalWrite(s4, LOW);
 delayMicroseconds(del);              

 digitalWrite(s1, HIGH);
 digitalWrite(s2, HIGH);
 digitalWrite(s3, LOW);
 digitalWrite(s4, LOW);
 delayMicroseconds(del);              

 digitalWrite(s1, LOW);
 digitalWrite(s2, HIGH);
 digitalWrite(s3, LOW);
 digitalWrite(s4, LOW);
 delayMicroseconds(del);              

 digitalWrite(s1, LOW);
 digitalWrite(s2, HIGH);
 digitalWrite(s3, HIGH);
 digitalWrite(s4, LOW);
 delayMicroseconds(del);              

 digitalWrite(s1, LOW);
 digitalWrite(s2, LOW);
 digitalWrite(s3, HIGH);
 digitalWrite(s4, LOW);
 delayMicroseconds(del);              

 digitalWrite(s1, LOW);
 digitalWrite(s2, LOW);
 digitalWrite(s3, HIGH);
 digitalWrite(s4, HIGH);
 delayMicroseconds(del);              

 digitalWrite(s1, LOW);
 digitalWrite(s2, LOW);
 digitalWrite(s3, LOW);
 digitalWrite(s4, HIGH);
 delayMicroseconds(del);              

 digitalWrite(s1, HIGH);
 digitalWrite(s2, LOW);
 digitalWrite(s3, LOW);
 digitalWrite(s4, HIGH);
 delayMicroseconds(del);              


}


void forwards(){

 digitalWrite(s1, HIGH);
 digitalWrite(s2, LOW);
 digitalWrite(s3, LOW);
 digitalWrite(s4, HIGH);
 delayMicroseconds(del);              

 digitalWrite(s1, LOW);
 digitalWrite(s2, LOW);
 digitalWrite(s3, LOW);
 digitalWrite(s4, HIGH);
 delayMicroseconds(del);              

 digitalWrite(s1, LOW);
 digitalWrite(s2, LOW);
 digitalWrite(s3, HIGH);
 digitalWrite(s4, HIGH);
 delayMicroseconds(del);              

 digitalWrite(s1, LOW);
 digitalWrite(s2, LOW);
 digitalWrite(s3, HIGH);
 digitalWrite(s4, LOW);
 delayMicroseconds(del);              

 digitalWrite(s1, LOW);
 digitalWrite(s2, HIGH);
 digitalWrite(s3, HIGH);
 digitalWrite(s4, LOW);
 delayMicroseconds(del);              

 digitalWrite(s1, LOW);
 digitalWrite(s2, HIGH);
 digitalWrite(s3, LOW);
 digitalWrite(s4, LOW);
 delayMicroseconds(del);              

 digitalWrite(s1, HIGH);
 digitalWrite(s2, HIGH);
 digitalWrite(s3, LOW);
 digitalWrite(s4, LOW);
 delayMicroseconds(del);              

 digitalWrite(s1, HIGH);
 digitalWrite(s2, LOW);
 digitalWrite(s3, LOW);
 digitalWrite(s4, LOW);
 delayMicroseconds(del);              
 
}

void backwardsFull(){

 digitalWrite(s1, HIGH);
 digitalWrite(s2, HIGH);
 digitalWrite(s3, LOW);
 digitalWrite(s4, LOW);
 delayMicroseconds(del*2);              

 digitalWrite(s1, LOW);
 digitalWrite(s2, HIGH);
 digitalWrite(s3, HIGH);
 digitalWrite(s4, LOW);
 delayMicroseconds(del*2);              

 digitalWrite(s1, LOW);
 digitalWrite(s2, LOW);
 digitalWrite(s3, HIGH);
 digitalWrite(s4, HIGH);
 delayMicroseconds(del*2);              

 digitalWrite(s1, HIGH);
 digitalWrite(s2, LOW);
 digitalWrite(s3, LOW);
 digitalWrite(s4, HIGH);
 delayMicroseconds(del*2);              

}

void forwardsFull(){

 digitalWrite(s1, LOW);
 digitalWrite(s2, LOW);
 digitalWrite(s3, LOW);
 digitalWrite(s4, HIGH);
 delayMicroseconds(del*2);              

 digitalWrite(s1, LOW);
 digitalWrite(s2, LOW);
 digitalWrite(s3, HIGH);
 digitalWrite(s4, LOW);
 delayMicroseconds(del*2);              

 digitalWrite(s1, LOW);
 digitalWrite(s2, HIGH);
 digitalWrite(s3, LOW);
 digitalWrite(s4, LOW);
 delayMicroseconds(del*2);              

 digitalWrite(s1, HIGH);
 digitalWrite(s2, LOW);
 digitalWrite(s3, LOW);
 digitalWrite(s4, LOW);
 delayMicroseconds(del*2);              

}


Kod C# (fragment od wysyłania):

akcja na przycisk i wywolanie metody z klasy connection sendData:


Kod:
private void button2_Click(object sender, EventArgs e)
       {
               con.SendData(delay);              
       }
Klasa connection:


Kod:
class Connection
   {
       SerialPort myPort;
       public Connection()
       {
           try
           {
               myPort = new SerialPort();
               myPort.BaudRate = 9600; //szybkosc transmisji
               myPort.PortName = "COM5"; //pod jakim com jest podlaczone trzeba sprawdzic        

               myPort.Parity = Parity.None;
               myPort.DataBits = 8;
               myPort.StopBits = StopBits.One;

               myPort.DtrEnable = true;
               myPort.Open();
           }
           catch (Exception ex)
           {
               MessageBox.Show("Connection problem");
           }

       }

       // metoda do przesyłania stringów poprzez USB
       public void SendData(string message)
       {
           myPort.Write(message);

       }
Tak wygląda strnig który jest przesyłany do arduino 1111,1;2222,2;3333,3;.... itd.Separator to ; i są to wartości double ale mogę zrobić na int bo w arduino konwertuje to na inta
[Obrazek: 2hxucuc.png]

Dziękuje za poświęcony czas !
 
Odpowiedź
#4
Napisz prosty program który tylko odbiera dane z portu szeregowego i zwrotnie wysyła to co odebrał lub zsumowaną ilość bajtów.
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#5
Aktualnie mam problem z pamięcią. Chcę przesłać do arduino sporą ilość liczb, i zachować je w tablicy. Niestety maksymalna ilość liczb którą mogę przechować w tablicy jest nie wystarczająca. I teraz moje pytanie jak rozwiązać ten problem. Czy jest możliwość aby komunikacja pc-arduino była bliska czasu rzeczywistemu. Po prostu wysyłał bym jedną liczbę program by się wykonał z tą jedną liczbą następnie wysłał następną i program by się wykonał znowu i tak aż do momentu kiedy wyślę jakiś znak kończący to zapętlenie. Sprawa jest prosta mam silnik krokowy gdzie w każdym kroku zmieniam delay. Wartości delay są generowane za pomocą programu napisanego w C#. Chodzi o to że za pomocą tych delayów chciałby uzyskać płynne przejście (szybko-średnio-wolno) obracania się silnika


Może macie jakieś pomysły jak to wykonać. Każda pomoc jest mile widziana

Pozdrawiam,
Rout
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości