Styra en RepStrap bearbetning (21 / 25 steg)
Steg 21: 3D - Följ den studsande bollen (inklusive Firmata)
Här är 3D studsande boll bearbetning och Adruino kod.
Detta kör X, Y, Z stegmotorer.
Arduino koden följer, detta är koden från steg 13 med Z-axeln lagt till.
///////////////////////////////PROCESSING /////////////////////////////
*** BEARBETNING med FIRMATA ***
/**
* Bounce_3D_0
*
* När formen träffar en Boundary vänder det dess riktning.
Det finns X, Y, Z gränser
Riktningen är outputed-
Matindustrin -> Firmata -> Arduino -> drivrutiner -> Steppers
*
* Ändrade för 3D
Obs: 0,0,0 - övre vänstra hörnet (mot datorskärmen)
Z-axeln minuspoäng "till" datorskärmen
positiv Y-axeln pekar ner
positiva X-axeln pekar till höger
*/
import processing.serial.*;
import cc.arduino.*;
Arduino arduino;
Seriella myPort; Skapa objekt från seriella klass
Uppgifterna från den seriella porten
int ledPin = 13.
int XstepPin = 10;
int XdirPin = 7.
int YstepPin = 2;
int YdirPin = 3;
int ZstepPin = 19.
int ZdirPin = 18;
int storlek = 40; Formens bredd
float xpos, ypos, zpos; Startpositionen för formen
float djup;
flyta xspeed = 2.5. Hastigheten på formen
flyta yspeed = 2; Hastigheten på formen
flyta zspeed = 3;
int xdirection = 1; Vänster eller höger
int ydirection = 1; Uppifrån och ned
int zdirection = 1; främre eller bakre
void setup()
{
storlek (200, 200, P3D);
noStroke();
frameRate(30);
Smooth();
Ange startpositionen för formen
Xpos = bredd/2;
ypos = höjd/2;
zpos = - höjd/2; notera att Zaxis går "till" skärmen
djup = - höjd;
installationsprogrammet för kommunikation med Arduino
Arduino = nya Arduino (denna, Arduino.list() [0], 57600); v1
arduino.pinMode (ledPin, Arduino.OUTPUT);
arduino.pinMode (XstepPin, Arduino.OUTPUT);
arduino.pinMode (XdirPin, Arduino.OUTPUT);
arduino.pinMode (YstepPin, Arduino.OUTPUT);
arduino.pinMode (YdirPin, Arduino.OUTPUT);
arduino.pinMode (ZstepPin, Arduino.OUTPUT);
arduino.pinMode (ZdirPin, Arduino.OUTPUT);
}
void draw()
{
Background(102);
Lights();
glas låda / / Obs: line (x1, y1, z1, x 2, y2, z2)
stroke(255);
tillbaka
linje (0,0, djup, bredd, 0, djup);
linje (0, höjd, djup, bredd, höjd, djup);
linje (0,0, djup, 0, höjd, djup);
linje (bredd, 0, djup, bredd, höjd, djup);
hörnen
linje (0,0,0, 0,0, djup);
linje (0, höjd, 0, 0, höjd, djup);
linje (bredd, 0, 0, bredd, 0, djup);
linje (bredd, höjd, 0, bredd, höjd, djup);
Uppdatera placeringen av formen
Xpos = xpos + (xspeed * xdirection);
ypos = ypos + (yspeed * ydirection);
zpos = zpos + (zspeed * zdirection);
Testa för att se om formen överskrider gränserna för skärmen
Om den gör det, återföra dess riktning genom att multiplicera med -1
om (xpos > bredden-storleken || xpos < 0) {
xdirection * = -1;
}
om (ypos > höjd-storlek || ypos < 0) {
ydirection * = -1;
}
om (zpos <-höjd-storlek || zpos > 0) {//note som Zaxis går "till" skärmen
zdirection * = -1;
}
Dra formen
Lights();
översätta (xpos, ypos, zpos);
Sphere(size);
CONTROLL STEPPER MOTORS
X
om (xdirection > = 0) {
arduino.digitalWrite (ledPin, Arduino.HIGH);
arduino.digitalWrite (XdirPin, Arduino.HIGH);
arduino.digitalWrite (ZdirPin, Arduino.HIGH);
}
annat {
arduino.digitalWrite (ledPin, Arduino.LOW);
arduino.digitalWrite (XdirPin, Arduino.LOW);
arduino.digitalWrite (ZdirPin, Arduino.LOW);
}
Y
om (ydirection > = 0) {
arduino.digitalWrite (YdirPin, Arduino.HIGH);
}
annat {
arduino.digitalWrite (YdirPin, Arduino.LOW);
}
Z
om (zdirection > = 0) {
arduino.digitalWrite (ZdirPin, Arduino.HIGH);
}
annat {
arduino.digitalWrite (ZdirPin, Arduino.LOW);
}
}
/////////////////////////////ARDUINO////////////////////////////////////////
Ledningar/Arduino kod: / / simmple digital firmata
Stödjer så många digitala ingångar och utgångar som möjligt.
Denna exempelkod är offentlig.
#include
#define XstepPin 10
#define XdirPin 7
#define YstepPin 2
#define YdirPin 3
#define ZstepPin 19
#define ZdirPin 18
byte previousPIN [2]. PIN: PORT för input
byte previousPORT [2].
void outputPort (byte portNumber, byte portValue)
{
endast skicka data när den ändras, annars får du för många meddelanden!
om (previousPIN [portnummer]! = portValue) {
Firmata.sendDigitalPort (portnummer, portValue);
previousPIN [portnummer] = portValue;
Firmata.sendDigitalPort (portnummer, portValue);
}
}
void setPinModeCallback (byte pin, int läge) {
IF(PIN > 1) {/ / inte touch RxTx stift (0,1)
pinMode (pin, läge);
}
}
void digitalWriteCallback (byte port, int värde)
{
byte i.
byte currentPinValue, previousPinValue;
om (värde! = previousPORT[port]) {
för (jag = 0; jag < 8; i ++) {
currentPinValue = (byte) värde & (1 << jag);
previousPinValue = previousPORT [port] & (1 << jag);
om (currentPinValue! = previousPinValue) {
digitalWrite (i + (port * 8), currentPinValue);
}
}
previousPORT [port] = värde;
}
}
void setup()
{
Firmata.setFirmwareVersion (0, 1);
Firmata.attach (DIGITAL_MESSAGE, digitalWriteCallback);
Firmata.attach (SET_PIN_MODE, setPinModeCallback);
Firmata.BEGIN(57600);
}
void loop()
{
outputPort (0, PIND & ~ B00000011); stift 0-7, ignorera Rx/Tx stift (0/1)
outputPort (1, PINB); stift 8-13
While(Firmata.available()) {
Firmata.processInput();
}
extra stepper sekvens till firmata kod
digitalWrite(XstepPin,HIGH); vidta åtgärder
digitalWrite(YstepPin,HIGH);
digitalWrite(ZstepPin,HIGH);
delayMicroseconds(2);
digitalWrite(XstepPin,LOW);
digitalWrite(YstepPin,LOW);
digitalWrite(ZstepPin,LOW);
delayMicroseconds(2);
delayMicroseconds(1000); <<<<<< Används för att ändra STEPPER hastighet??? <<<<<<<<
}