Kommunikation fra Processing til Arduino

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

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

I dette lille eksempel er det skåret helt ned til at man indtaster en tekst på PC'en og får den udskrevet på en LCD-skærm der er koblet til Arduinoen.

Koden til Arduino

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

Koden ser ud som følger:

// include the library code:
#include <LiquidCrystal.h>

// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
const int rs = 13, en = 12, d4 = 7, d5 = 6, d6 = 5, d7 = 4;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("Hello, World!");
  delay(1000);
}

String in = "Started";

void loop() {
  if (Serial.available()) {
    in = Serial.readString();
  }
  lcd.clear();
  lcd.print(in);
  delay(100);
}

I starten angives biblioteket til LCD-displayet[1], og der sættes op med de benforbindelser der er på Programmerings-Shieldet.

I setup() initialiseres den serielle port til at fungere med 9600 Baud, LCD-displayet initialiseres og der printes en besked i displayet.

I loop() kigges der på seriel-porten for at se om der er modtaget noget, og hvis der er kommet noget, så læses der en hel streng ind. I hvert loop slettes indholdet i displayet, og der udskrives den sidst modtagne tekst (eller default-teksten Started). Det at displayet hele tiden slettes giver en lidt blinkende opførsel, men det accepteres til et test-program.

Koden til Processing (i PC'en)

Den viste kode ligger som sendToArduino 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 = "";

void draw() {
  // Kode der kaldes med programmets framerate
  background(40);
  text("Skriv teksten der skal sendes:", 20, 50);
  text(tekst, 20, 100);
}

// Keyboard service routines
void keyReleased() {
  // Fang Enter-tasten
  if (key == 10) {
    tekst = trim(tekst);
    // Send teksten til Arduino
    port.write(tekst);
    tekst = "";
  }
}

void keyTyped() {
  // Fang alle indtastninger
  tekst += key;
  // Håndter backspace (sletter)
  if (key == 8) {
    tekst = tekst.substring(0, tekst.length() - 2);
  }
}

I starten af koden importeres det serielle bibliotek[2], 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.

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å det er den aktuelle tekst når den skifter.

Nederst i keyTyped() funktionen opsamles alle taster i variablen tekst, der skrives på skærmen. Funktionen keyTyped sorterer alle funktionstaster og piletaster fra, men der kan stadig indtastes underligheder som TAP, delete og andre kontroltaster. Den eneste tast der tages højde for et Backspace, der er indrettet så den sletter sig selv og den sidst indtastede tast i tekst-variablen. Til dette udnyttes substring[3].

I funktionen keyReleased() fanges Enter-tasten, og hvis det er den tast, så trimmes indholdet i tekst-variablen (for at fjerne newline-karakteren) og indholdet sendes til den serielle port, hvorefter tekst-variablen tømmes, så der kan samles en ny tekst op.

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. Arduinos referenceside til LCD-displayet
  2. Processing reference omkring den serielle port
  3. Processings reference omkring substring