Stap 21: 3D - Volg de Bouncing Ball (inclusief Firmata)
Hier is de 3D stuiterende bal verwerking en Adruino code.
Dit zal het draaien van X, Y, Z stappenmotoren.
De Arduino code volgt, dit is de code uit stap 13 met de Z-as toegevoegd.
///////////////////////////////PROCESSING /////////////////////////////
*** VERWERKING met FIRMATA ***
/**
* Bounce_3D_0
*
* Wanneer de vorm een grens raakt, keert het haar richting.
Er zijn X, Y, Z grenzen
Richting is uitgedraaide-
Processsing -> Firmata -> Arduino -> Drivers -> Stepper
*
* Aangepast voor 3D
Opmerking: 0,0,0 - bovenste linkerhoek (zuideljike monitor van de computer)
negatieve Z-as punten 'in' de computermonitor
positieve Y-as punten omlaag
positieve X as punten naar rechts
*/
importeren van processing.serial.*;
importeren van cc.arduino.*;
Arduino arduino;
Seriële myPort; Object maakt van seriële klasse
Gegevens ontvangen van de seriële poort
int ledPin = 13;
int XstepPin = 10;
int XdirPin = 7;
int YstepPin = 2;
int YdirPin = 3;
int ZstepPin = 19;
int ZdirPin = 18;
int size = 40; Breedte van de vorm
float xpos ypos, zpos; Beginopstelling van vorm
float diepte;
zweven xspeed = 2.5; Snelheid van de vorm
zweven yspeed = 2; Snelheid van de vorm
zweven zspeed = 3;
int xdirection = 1; Links of rechts
int ydirection = 1; Van boven naar beneden
int zdirection = 1; voor- of achterkant
VOID Setup
{
grootte (200, 200, P3D);
noStroke();
frameRate(30);
Smooth();
De beginpositie van de vorm instellen
xpos = breedte/2;
yPos = hoogte/2;
zpos = - hoogte/2; Merk op dat Zaxis 'in' het scherm gaat
diepte = - hoogte;
Setup communicatie met Arduino
Arduino = nieuwe Arduino (dit, 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();
glazen doos / / Let op: lijn (x1, y1, z1, x 2, y2, z2)
Stroke(255);
Terug
lijn (0,0, diepte, breedte, diepte van 0,);
lijn (0, hoogte, diepte, breedte, hoogte, diepte);
lijn (0,0, diepte, 0, hoogte, diepte);
lijn (breedte, 0, diepte, breedte, hoogte, diepte);
hoeken
lijn (0,0,0, 0,0, diepte);
lijn (0, hoogte, 0, 0, hoogte, diepte);
lijn (breedte, 0, 0, breedte, diepte van 0,);
lijn (breedte, hoogte, 0, breedte, hoogte, diepte);
Update de positie van de vorm
xpos = xpos + (xspeed * xdirection);
yPos = ypos + (yspeed * ydirection);
zpos = zpos + (zspeed * zdirection);
Testen om te zien of de shape groter is dan de grenzen van het scherm
Zo ja, zijn richting omkeren door te vermenigvuldigen met -1
Als (xpos > breedte-grootte || xpos < 0) {}
xdirection * = -1;
}
Als (ypos > hoogte-grootte || ypos < 0) {}
ydirection * = -1;
}
Als (zpos <-hoogte-grootte || zpos > 0) {//note dat Zaxis 'in' het scherm gaat
zdirection * = -1;
}
Teken de vorm
Lights();
vertalen (xpos, ypos, zpos);
Sphere(size);
CONTROLE DE STEPPER MOTORS
// X
Als (xdirection > = 0) {}
arduino.digitalWrite (ledPin, Arduino.HIGH);
arduino.digitalWrite (XdirPin, Arduino.HIGH);
arduino.digitalWrite (ZdirPin, Arduino.HIGH);
}
else {}
arduino.digitalWrite (ledPin, Arduino.LOW);
arduino.digitalWrite (XdirPin, Arduino.LOW);
arduino.digitalWrite (ZdirPin, Arduino.LOW);
}
// Y
Als (ydirection > = 0) {}
arduino.digitalWrite (YdirPin, Arduino.HIGH);
}
else {}
arduino.digitalWrite (YdirPin, Arduino.LOW);
}
// Z
Als (zdirection > = 0) {}
arduino.digitalWrite (ZdirPin, Arduino.HIGH);
}
else {}
arduino.digitalWrite (ZdirPin, Arduino.LOW);
}
}
/////////////////////////////ARDUINO////////////////////////////////////////
Bedrading/Arduino code: / / simmple digitale firmata
Ondersteunt zo veel digitale ingangen en uitgangen mogelijk.
Deze voorbeeldcode is in het publieke domein.
#include
#define XstepPin 10
#define XdirPin 7
#define YstepPin 2
#define YdirPin 3
#define ZstepPin 19
#define ZdirPin 18
byte previousPIN [2]; PIN betekent poort voor invoer
byte previousPORT [2];
VOID outputPort (byte portNumber, byte portValue)
{
alleen gegevens verzenden als deze verandert, anders krijg je te veel berichten!
Als (previousPIN [portNumber]! = portValue) {}
Firmata.sendDigitalPort (portNumber, portValue);
previousPIN [portNumber] = portValue;
Firmata.sendDigitalPort (portNumber, portValue);
}
}
VOID setPinModeCallback (byte pin, int modus) {}
if(PIN > 1) {/ / don't touch RxTx pinnen (0,1)
pinMode (pin, modus);
}
}
VOID digitalWriteCallback (byte poort, int value)
{
byte i;
byte currentPinValue, previousPinValue;
Als (waarde! = previousPORT[port]) {}
voor (ik = 0; ik < 8; i ++) {}
currentPinValue = (byte) waarde & (1 << ik);
previousPinValue = previousPORT [poort] & (1 << ik);
Als (currentPinValue! = previousPinValue) {}
digitalWrite (i + (poort * 8), currentPinValue);
}
}
previousPORT [poort] = waarde;
}
}
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); pinnen 0-7, het negeren van de Rx/Tx pinnen (0/1)
outputPort (1, PINB); pinnen 8-13
while(firmata.available()) {}
Firmata.processInput();
}
toegevoegde stepper reeks firmata code
digitalWrite(XstepPin,HIGH); stappen ondernemen
digitalWrite(YstepPin,HIGH);
digitalWrite(ZstepPin,HIGH);
delayMicroseconds(2);
digitalWrite(XstepPin,LOW);
digitalWrite(YstepPin,LOW);
digitalWrite(ZstepPin,LOW);
delayMicroseconds(2);
delayMicroseconds(1000); <<<<<< Gebruik CHANGE STEPPER SPEED??? <<<<<<<<
}