Kommunikation fra Arduino til Processing

Fra Kommunikation-IT Holstebro HTX
Skift til: navigering, søgning

Hvis man ønsker at kommunikere fra Arduino til Processing, så kan det typisk være nogle måledata eller noget andet lignende man vil have kommunikeret over.

I dette lille eksempel er det skåret helt ned til at værdien der kan læses på Analog ben A0 bliver skrevet ud på PC-skærmen som et tal.

Koden til Arduino

Den viste kode ligger som txArduino i følgende ZIP-fil og skal selvfølgelig programmeres ned i en Arduino UNO.

Koden ser ud som følger:

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}

void loop() {
  Serial.println(analogRead(A0));
  delay(100);
}

Indholdet er simpelt: I setup() initialiseres den serielle port til at fungere med 9600 Baud. I loop() læses den analoge indgang A0, og den værdi skrives ud til seriel-porten. For at PC'en kan følge med, så ventes der 100ms i hvert loop.

Koden til Processing (i PC'en)

Den viste kode ligger som rxFromArduino i følgende ZIP-fil og denne kode skal afvikles af processing i dens IDE på PC'en.

Koden ser ud som følger:

import processing.serial.*;
//Start seriel kommunikation
Serial port; // USB-portens navn
String USBPort = "COM4";

void setup() {
  // Koden til afvikles en gang, når programmet startes 
  size(480, 360);
  background(80);
  frameRate(60);
  textSize(24);
  // Starter den serielle port
  port = new Serial(this, USBPort, 9600);
}

String tekst = "";
int tal = 0;

void draw() {
  // Kode der kaldes med programmets framerate
  // Start på en frisk i hver frame
  background(40);
  if (port.available() > 0) {
    tekst = port.readStringUntil('\n');
    if (tekst != null) {  // Hvis der læses en tom tekst, så fejler trim
      tekst = trim(tekst);
      if (tekst != null) {  // Hvis der trimmes til en tom tekst, så fejler int-konverteringen
        tal = int(tekst);
      }
    }
  }
  // Skriv tallet
  text(tal, 50, 100);    
}

I starten af koden importeres det serielle bibliotek[1], der er installeret i Processing, men som lige skal have en henvisning for at fungere.

VIGTIGT - der er angivet hvilken COM-port (her COM4) der anvendes til kommunikationen - det er den port som Arduino-programmet bruger som seriel port, den skal selvfølgelig tilrettes, så det er det rigtige nummer. Man kan også få Processing-programmet til at kunne vælge porten, ved at lade sig inspirere af følgende kodeeksempel

I setup() bliver der sat de grafiske betingelser op for programmet, og den serielle port bliver gjort klar, så man kan kommunikere med den.

I loop() sletter man indholdet af skærmen, så tallene ikke kommer til at stå oven i hinanden når de skifter.

Hvis det er modtaget noget på den serielle port, så bliver det læst ind som en tekst, og det der står før og efter selve tallet trimmes af.

Hvis der stadig er en tekst, så konverteres det til et tal - dette retter tallets værdi.

Til slut skrives tallet ud for hvert skærmbillede, så det står der permanent, men det bliver kun opdateret hver gang der modtages et nyt godkendt tal.

Fælder i udviklingen

Når man arbejder med udviklingen af programmer hvor man anvender den serielle port, så er der specielt en fælde man skal passe på.

Det er når man har testet sit processing program, og så vil lave en rettelse i Arduinoen - så vil processing programmet blokere for at kunne uploade, hvis det oversatte processing program stadig er aktivt. Det skyldes at processing programmet har reserveret den serielle port, så længe programmet er aktivt. Man behøves ikke lukke hele IDE'et ned, men bare det oversatte program, for at man kan uploade til Arduinoen. Det skyldes at det er den samme serielle port man arbejder på til begge dele.

Man vil også kunne opleve at hvis man forsøger at starte sit processing program, uden at der er en Arduino på, så vil programmet låse, fordi den ikke kan finde porten.

Referencer

<refernces />
  1. Processing reference omkring den serielle port