Ausnutzung der Standardbefehle und Standardlibraries von Processing für mechatronische Anwendungen
(EN google-translate)
(PL google-translate)
x-y-Plot erstellen
int x = 0; //quasi globale Variablen
int y = 0;
int y_alt = 0;
int ROT = 255;
int BLAU = 0;
void setup()
{
size(600,400); //Fensterbreite und -höhe
background(0,0,200); //Fensterhintergrund RGB
stroke(200,0,0);
smooth(); //Pixelglättung
frameRate(50); //draw wird fünfmal pro Sekunde aufgerufen
}
void draw()
{
stroke(ROT,0,BLAU);
line(x,0,x,399);
if(x>0)
{
stroke(0,255,0);
line(x-1,y_alt,x,y);
}
y_alt =y;
x++;
if(x==600)
{
x=0;
ROT = 255 - ROT;
BLAU = 255 - BLAU;
}
y++;
y%=100;
}
Code 0-1: Testweise Zackenlinie plotten.
Bild 0-1: Testweise Zackenlinie plotten.
Serielle Verbindung
Hereinkommende serielle Daten werden als ein Plot dargestellt.
Es ist möglich ziemlich rasch herauszufinden, wie bestimmte Funktionen und Bibliotheken arbeiten: Die Bibliotheken zu Processing werden typischerweise mit Beispielen ausgeliefert. Diese sind über File -> Examples abrufbar.
In dieser Weise wurde recherchiert, wie die serial-Bibliothek zu benutzen ist.
int x = 0; //quasi globale Variablen
int y = 0;
int y_alt = 0;
int ROT = 255;
int BLAU = 0;
Serial myPort; // Objekt für serielle Kommunikation
void setup()
{
// String portName = Serial.list()[0];
String portName = "/dev/ttyUSB0";
myPort = new Serial(this, portName, 115200);
size(600,400); //Fensterbreite und -höhe
background(0,0,200); //Fensterhintergrund RGB
stroke(200,0,0);
smooth(); //Pixelglättung
// frameRate(50); //draw wird fünfmal pro Sekunde aufgerufen
}
import processing.serial.*;
void draw()
{
if ( myPort.available() > 0) //wenn Daten vorhanden sind.
{
y = myPort.read(); //Daten lesen
}
stroke(ROT,0,BLAU);
line(x,0,x,399);
if(x>0)
{
stroke(0,255,0);
line(x-1,y_alt,x,y);
}
y_alt =y;
x++;
if(x==600)
{
x=0;
ROT = 255 - ROT;
BLAU = 255 - BLAU;
}
y++;
y%=100;
}
Code 0-2: Hereinkommende binäre serielle Daten als Plot darstellen.
#include<avr/io.h>
//Definition von Taktfrequenz und Bausrate als Konstanten
#define TAKTFREQUENZ 9216000
#define BAUDRATE 115200
int main()
{
unsigned char akku=0;
unsigned long pause;
DDRA = 0b00000000;
DDRB = 0b00000000;
DDRD = 0b00000000;
DDRC = 0b11111111; //über RS232 gesendete Zahlen sollen auch an
//zweiten Mikrocontroller geschickt
//und angezeigt werden.
//Aktivieren der RS232-Schnittstelle des Mikrocontrollers:
//Merken des in UBRR zu speichernden Wertes.
unsigned int baudregister = TAKTFREQUENZ/8/BAUDRATE-1;
//setzen der Baudrate
UBRRH = (unsigned char) (baudregister>>8); //Setzen des HIGH-Bytes des Baudraten-Registers
UBRRL = (unsigned char) baudregister; //Setzen des LOW -Bytes des Baudraten-Registers
//Einschalten des Senders und des Empfängers
UCSRB = (1<<TXEN) | (1<<RXEN);
//Setzen des Nachrichtenformats: 8 Datenbits, 1 Stopbits
UCSRC = (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);
UCSRA = (1<<U2X);
//Es soll wiederholt von 0 bis 255 durchgezählt werden und
//der aktuelle Wert im Hyperterminal zu sehen sein.
while(1)
{
while( !(UCSRA & (1<<UDRE)) ); //Warten bis der Uebertragungspuffer leer ist
UDR = akku; //Daten in den Puffer schreiben und übertragen
//Zahl außerdem wie gewohnt nach Port C schicken:
PORTC = akku;
for(pause=0;pause<20000;pause++) DDRB|=0;
//Weiterzählen:
akku++;
}
}
Code 0-3: Mikrocontroller-Testprogramm.
Bild 0-2: Ergebnis.
USB-Kamera
Bei Verwendung der Standard-Library "processing.video" konnte bisher keine USB-Kamera angesprochen werden, jedoch existiert die Processing-Zusatzlibrary "GSVideo", die Processing hinzugefügt werden kann.
import codeanticode.gsvideo.*;
GSCapture cam;
void setup()
{
size(640, 480);
cam = new GSCapture(this, 640, 480);
cam.start();
}
void draw()
{
if (cam.available() == true)
{
cam.read();
image(cam, 0, 0);
// The following does the same, and is faster when just drawing the image
// without any additional resizing, transformations, or tint.
//set(0, 0, cam);
}
}
Code 0-4: GettingStartedCaptureLinux aus der Zusatz-Library "GSVideo".
3D-Animation
void setup() {
size(600, 600, P3D); // 600 x 600 im 3D (P3D) Modus
frameRate(24); // Bildwiederholrate 24
}
void draw() {
lights();
background(0);
pushMatrix();
translate(width/2, height/2, 0);
rotateY(radians(frameCount));
fill(0,255,0);
box(100);
popMatrix();
}
Code 0-5: Einfaches Beispiel zu 3D-Animation.