Kommunikation fra Processing til Arduino

Fra HTX Arduino
Spring til navigation Spring til 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. 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å 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

  1. Arduinos referenceside til LCD-displayet
  2. Processing reference omkring den serielle port
  3. Processings reference omkring substring
Kom i gang med Arduino
Grundlæggende forståelse for Arduino Arduino Hardware - Arduino Prototype Print - Blink Eksempel - Overblik - Serial Monitor - Simple Komponenter - Software og Udviklingsmiljø
Programmering af Arduino Anvendelse af Eksempler - Klasser og Objekter - Programafvikling i Arduino - Test af Programmer
Dokumentationsformer Dokumentation med Kode og Flowchart - Dokumentation med State-machines - Flowchart - Pseudokode - Program-kommentarer - Systemdokumentation - Syntaksfarvning - Blokdiagram - Pulsplaner - UML
Opkoblinger til Arduino Moduler og Biblioteker - Driver - Opkobling af Hardware - Simple Komponenter - Tips til anvendelse af ben på Arduino UNO
Kompliceret Programmering Arduino kombineret med Processing - Kommunikation fra Arduino til Processing - Kommunikation fra Processing til Arduino - CopyThread Multitasking - Dokumentation med State-machines - Tid og Samtidighed i Software - Arduino Memory
Kompliceret Hardware I2C - Andre Processorboards - Internet of Things (IoT)
Oprindelige Dokumenter PDF-Version - Forfattere
Software Udviklingsteknikker Agile metoder - Brugertest - SCRUM

Fasemodellen - Kravspecifikation - Databasedesign - Struktur eller Arkitektur - Softwaretest

Projekter Afstand programforslag - Lysmåling - Projektforslag - Prototyper
Undervisningsforløb 4t Valgfag til Folkeskolen - Læsevejledning 4t Valgfag - Materialer til 4t Valgfag - Undervisningsnoter 4t Valgfag - Undervisningsplan 4t Valgfag - Slides til Undervisning

Kort Valgfag til Folkeskolen - Læsevejledning Kort Valgfag - Materialer til Kort Valgfag - Undervisningsnoter Kort Valgfag - Undervisningsplan Kort Valgfag


Programmering
Programmeringsbegreber Initialisering - Sekvens - Algoritme - Hexadecimal - Det Binære Talsystem - HEX-fil - ASCII - Interrupt - Events - Styresystem - Autocomplete - Selvstudie Programmering - Hour Of Code - Stepwise Improvement - Syntaks - Prog-links - Microcontroller - ChatGPT
Grundlæggende C C float - C double - C-løkker - Datatyper - Konstanter - Regnearter - Funktioner - Return - Returværdi - Rekursion - Semikolon
Variabel Typer boolean - byte - int - unsigned int - word - long - unsigned long - short - float - double - char - unsigned char - string - char array - String - object - Array - 2-dimensionelt Array - void
Program-klassikere Polling - State-machine - Trykknap - Forkant - Bagkant - Prel
Arduino Arduino til Programmering - C til Arduino - Programmering Shield - Arduino PC-software - Arduino Udviklingsmiljø - Arduino Pin Library - Funktion - Arduino Seriel - Arduino String - Arduino String Split - Arduino StateChangeDetection - setup() - loop() - Compilerdirektiver - Asynkron kommunikation - millis() - micros() - Scratch for Arduino - Send fra Arduino til Excel - [[]] - [[]]
Processing Grafik i Processing‎ - Keyboard i Processing - Mus i Processing‎ - Tid i Processing‎ - Draw() - Setup() - Tal Input til Processing - Syntaksfarvning - Kommunikation fra Arduino til Processing - Kommunikation fra Processing til Arduino
javaScript Javascript input‎ - Javascript output‎ - Javascript strukturer‎ - Javascript syntaks‎ - Tid i javaScript - Objekt‎ - AJAX
Serverprogrammering PHP - MySQL - Task Scheduler - WeMOS
PIC JAL - [[]]
Scratch for Arduino S4A Installation - S4A programmering - S4A undervisningsforløb - S4A begrænsninger
Program Dokumentation Algoritme - Flowchart - Pseudokode - Datastruktur - Dataabstraktion - Pulsplaner - Program-kommentar - Teori - Test - UML