Processing to Arduino to I/O to RAPID
This is the workflow for using a processing sketch to arduino to a RAPID program (Thanks to Mike for this!), to create live control with the IRB140.
Here is an example processing script which sends byte commands to anĀ Arduino Duemilanove 328. The Arduino is located inside our controller and is connected to pins di5 through di16 on the I/O Board. Pins 2 – 13 map to di5 to di16.
// Processing code for Connecting to I/O Board // This example allows you to turn on di5 and di6 using the 'a' and 'd' keys import processing.serial.*; Serial port; void setup() { size(256, 150); println("Available serial ports:"); println(Serial.list()); // Uses the first port in this list (number 0). Change this to // select the port corresponding to your Arduino board. The last // parameter (e.g. 9600) is the speed of the communication. It // has to correspond to the value passed to Serial.begin() in your // Arduino sketch. //port = new Serial(this, Serial.list()[0], 9600); port = new Serial(this, "COM17", 9600); // If you know the name of the port used by the Arduino board, you // can specify it directly like this. //port = new Serial(this, "COM1", 9600); } void draw() { //Nothing needs to happer here } // write the current X-position of the mouse to the serial port as // a single byte } void keyPressed(){ if (key == 'a'){ port.write(1); } if (key == 'd'){ port.write(2); } } void keyReleased(){ port.write(0); } |
The following is an example arduino sketch which will translate the byte information sent from arduino to trigger I/O pins di5 and di6.
/* This example receives a byte from processing and turns the digital ins on and off */ byte x = 0; const int xPosPin = 2; // maps to di5 const int xNegPin = 3; // maps to di6 void setup() { // initialize the serial communication: Serial.begin(9600); // initialize the ledPin as an output: pinMode(xPosPin, OUTPUT); pinMode(xNegPin, OUTPUT); digitalWrite(xNegPin, HIGH); digitalWrite(xPosPin, HIGH); } void loop() { // check if data has been sent from the computer: if (int(x) == 1) { digitalWrite(xPosPin, LOW); digitalWrite(xNegPin, HIGH); } else if (int(x) == 2) { digitalWrite(xPosPin, HIGH); digitalWrite(xNegPin, LOW); } else { digitalWrite(xPosPin, HIGH); digitalWrite(xNegPin, HIGH); } } void serialEvent() { while (Serial.available()) { x = Serial.read(); } } |
The following is a RAPID program which takes the pin inputs and moves the robot in the x-direction (Thanks Mike!)
MODULE Module1 PERS tooldata MyTool:=[TRUE,[[0.0000000000,0.0000000000,127.0000000000],[1.0000000000,0.0000000000,0.0000000000,0.0000000000]],[1,[0,0,1],[1,0,0,0],0,0,0]]; CONST robtarget Target_Home:=[[616.276853239657,1.29490244455989E-12,615.999957933775],[0.499999890452526,0,0.866025467031693,0],[0,0,0,0],[9E9,9E9,9E9,9E9,9E9,9E9]]; VAR robtarget Target_X; VAR pos Loc :=[616.276853239657,1.29490244455989E-12,615.999957933775]; PROC MoveX() IF Loc.x < 655 THEN Loc.x := Loc.x + 1; Target_X := [[Loc.x, Loc.y, Loc.z], [0.499999890452526,0,0.866025467031693,0], [0,0,0,0], [9E9,9E9,9E9,9E9,9E9,9E9]]; MoveJ Target_X,v1000,z100,MyTool\WObj:=wobj0; ENDIF ENDPROC PROC MoveXneg() IF Loc.x > 500 THEN Loc.x := Loc.x - 1; Target_X := [[Loc.x, Loc.y, Loc.z], [0.499999890452526,0,0.866025467031693,0], [0,0,0,0], [9E9,9E9,9E9,9E9,9E9,9E9]]; MoveJ Target_X,v1000,z100,MyTool\WObj:=wobj0; ENDIF ENDPROC PROC main() MoveJ Target_Home,v1000,z100,MyTool\WObj:=wobj0; ! Endless loop WHILE TRUE DO ! Check the state of digital input 1 IF di5 = 1 THEN MoveX; ! Else check digital input 2 ELSEIF di6 = 1 THEN MoveXneg; ENDIF ENDWHILE ENDPROC ENDMODULE |