Arduino Seriel

Fra Holstebro HTX Wiki
(Omdirigeret fra Kategori:Arduino Seriel)
Skift til: navigering, søgning

Den serielle port på arduinoen er lidt speciel, da den faktisk fungerer via USB-porten, og er den der etablerer kommunikationen mellem Arduinoen og PC'en.

Porten er lavet ved at der er en IC på Arduino-boardet, der bl.a. konverterer fra USB til serielle signaler[1].

Standard seriel porten er specielt anvendelig sammen med den Serielle Monitor, der kan vise hvad der bliver skrevet på serielporten og man kan sende tekst til serielporten.

Forbehold ved den serielle port

Når man anvender den serielle port til at kommunikere med PC'en (via USB-porten), så skal man være opmærksom på at det foregår på to digitale ben, der også er ført ud som digitale I/O.

Det betyder at man ikke kan anvende digital ben 0 eller 1 til andet, og man skal ikke tilsplutte noget til de to ben[2].

Alternativ seriel port

Hvis man arbejder med Arduinoen som en stand-alone løsning, og altså ikke har den tilsluttet USB-porten på PC'en, så kan man stadig kommunikere med den serielle port, ved at man tilslutter en Seriel adapter til de digitale ben 0 og 1. Det kunne f.x. være til at kommunikere serielt via Blue Tooth.

Software seriel port

Hvis man ønsker det, så kan man koble to ekstra ben til at fungere som en seriel port, ved at man bruger en software seriel port[3].

Denne port har dog begrænsninger med hvor hurtigt den kan kommunikere, og den vil også kunne blive forstyrret, hvis der er for meget interrupt i resten af koden.

Kommunikation med Processing

Hvis man ønsker at udnytte nogen af de muligheder som PC'en kan give sammen med en Arduino, så kan en mulighed være at bruge den serielle port (via USB-forbindelsen), så man kan kommunikere mellem et PC-program og en Arduino.

Man kan selvfølgelig kommunikere begge veje, men for at begrænse det lidt, så er der lavet eksempler på Kommunikation fra Processing til Arduino og på Kommunikation fra Arduino til Processing.

Hvis man ønsker at lave kommunikation begge veje, så kan man kombinere de to metoder, men det vil være bedre, hvis man opbygger en protokol, og laver en form for handshaking, så man har styr på om tingene forstås korrekt i begge ender.

Seriel-modulet i Arduino

Når man vil anvende den serielle port[2], så er der en række metoder der kan anvendes på den serielle port:

  • if (Serial)
  • available()
  • begin()
  • end()
  • find()
  • findUntil()
  • flush()
  • parseFloat()
  • parseInt()
  • peek()
  • print()
  • println()
  • read()
  • readBytes()
  • readBytesUntil()
  • setTimeout()
  • write()
  • serialEvent()

Anvendelsen af en seriel metode gøres ved at man skriver Serial.metode() som f.x.

Serial.print("Hello World");

Test af Seriel buffer

Når man sender karakterer på den serielle port, så anvender Arduino-softwaren et buffersysten, så man ikke kommer til at vente unødigt.

Det er ikke umiddelbart dokumenteret hvor mange karakterer der er i denne buffer, men ved at hælde nok i bufferen, så den løber fuld, så kan man testet hvor det sker. Den første test laves blot i den serielle monitor med følgende program:

void setup() {
  Serial.begin(9600);
  delay(100);
  Serial.println("Test af seriel buffer");
  delay(200);
}

void loop() {
  // Print tidspunktet i millisekunder 25 gange
  for (int n = 0; n < 25; n++) {
    Serial.println(millis());  // Antallet af karakterer er cifrene + 2 til linjeskift
  }
  Serial.println("---------------");  // Marker slut
  delay(5000);  //Pause så buffer tømmes
}

Bufferen løber fuld, når der begynder at gå længere mellem linjerne der udskrives. Testen giver følgende resultat:

Test af seriel buffer
300
300
300
300
300
301
301
301
301
301
301
302
302
302
305
310
315
320
325

Som det ses løber bufferen fuld efter 14 linjers udskrift, hvilket svarer til 14 * (3 + 2) = 70 karakterer, altså ca. en bufferstørrelse på ca. 64 karakterer.

En mere præcis måling forsøges foretaget med følgende kode:

void setup() {
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  Serial.begin(9600);
  delay(100);
  Serial.println("Test af seriel buffer");
  delay(200);
}

bool level = false;
void loop() {
  digitalWrite(2, HIGH);
  // Print enkelte karakterer
  for (char n = ' '; n < '|'; n++) {
    level = ! level;
    digitalWrite(3, level);
    if (n % 16 == 0) {
      digitalWrite(4, ! digitalRead(4));
    }
    Serial.print(n);  // Karakter-nummeret fra 32 til 124
  }
  digitalWrite(2, LOW);
  Serial.println("---------------");  // Marker slut
  delay(5000);  //Pause så buffer tømmes
}

Som det kan ses, så bliver karaktererne modtaget på den violette RX, den brune kanal 1 angiver hvornår programmet sender noget (lægger i bufferen). Den røde kanal skifter for hver gang der sendes en karakter mens den orange skifter for hver 16. karakter der sendes.

Først en måling der viser at der afsendes omkring 100 karakterer, og at Arduinoen er i stand til at sende dem helt uden pauser. På den brune kurve ses at hele sendingen tager et stykke tid, fordi bufferen løber fuld efter noget tid:
Serial test maal 1.png
Måling af alle de karakterer der sendes i et forløb

Ved at zoome noget ind på målingen kan man læse hvilke karakterer der sendes fra Arduinoen, startende med 20Hex.På den røde kruve ses der at efter bufferen er løbet fuld, så kan der kun sendes en ny karakter hver gang der er sendt en karakter, så i den sidste del af afsendingen er bufferen konstant fyldt.
Serial test maal 2.png
Måling mens der fyldes i bufferen

Ved så at zoome ind på det stykke hvor bufferen endnu ikke er blevet fyldt kan det ses at der hurtigt lægges nye karakterer i bufferen, og i den tid det ca. tager at afsende en karakter, der er der sendt 66 karakterer - umiddelbart efter at den første karakter er afsendt, der sendes karakter nummer 67.
Serial test maal 3.png
Måling af de karakterer ser lægges i bufferen inden den går fuld

Resultatet af dette bekræfter at der er en buffer på 64 karakterer, samt at Arduinoen internt i sit afsendings-register kan rumme 2 karakterer, så det på den måde giver en total bufferstørrelse på 66 karakterer.

Referencer