Etape 21: 3D - suivez la Bouncing Ball (y compris Firmata)
Voici la 3D bouncing ball traitement et Adruino le code.
Cela se déroulera à X, Y, Z moteurs.
Le code de l’Arduino suit, c’est le code de l’étape 13 avec l’axe Z ajouté.
///////////////////////////////PROCESSING /////////////////////////////
*** Le traitement avec FIRMATA ***
/**
* Bounce_3D_0
*
* Lorsque la forme atteint une limite, il renverse sa direction.
Il y a X, Y, limites de Z
Direction est affiché-
Traitement -> Firmata -> Arduino -> Pilotes -> Steppers
*
* Modification pour la 3D
NOTE : 0,0,0 - haut gauche coin (en face de l’écran d’ordinateur)
points négatifs d’axe Z « dans » l’écran d’ordinateur
points positifs du axe Y vers le bas
positive de X points d’axe vers la droite
*/
Import processing.serial.* ;
Import cc.arduino.* ;
Arduino arduino ;
Serial myPort ; Créez l’objet de classe de la série
Données reçues du port série
int ledPin = 13 ;
int XstepPin = 10 ;
int XdirPin = 7 ;
int YstepPin = 2 ;
int YdirPin = 3 ;
int ZstepPin = 19 ;
int ZdirPin = 18 ;
int taille = 40 ; Largeur de la forme
flotteur xpos, ypos, zpos ; Position de départ de la forme
profondeur du flotteur ;
flotteur xspeed = 2,5 ; Vitesse de la forme
float yspeed = 2 ; Vitesse de la forme
float zspeed = 3 ;
int xdirection = 1 ; Gauche ou droite
int ydirection = 1 ; Haut en bas
int zdirection = 1 ; avant ou arrière
void setup()
{
taille (200, 200, P3D) ;
noStroke() ;
frameRate(30) ;
Smooth() ;
Définir la position de départ de la forme
PosX = largeur/2 ;
YPos = hauteur/2 ;
ZPOS = - hauteur/2 ; Notez que Zaxis va « dans » l’écran
profondeur = - hauteur ;
communication d’installation avec Arduino
Arduino = nouvelle Arduino (ce, 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() ;
boîte en verre / / note : ligne (x1, y1, z1, x 2, y2, z2)
Stroke(255) ;
Précédent
ligne (0,0, profondeur, largeur, profondeur 0,) ;
ligne (0, hauteur, profondeur, largeur, hauteur, profondeur) ;
ligne (0,0, profondeur, 0, hauteur, profondeur) ;
ligne (largeur, 0, profondeur, hauteur, largeur et profondeur) ;
coins
ligne (0,0,0, 0,0, profondeur) ;
ligne (hauteur, 0, 0, 0, hauteur, profondeur) ;
ligne (largeur, 0, 0, largeur, profondeur 0,) ;
ligne (largeur, hauteur, 0, largeur, hauteur, profondeur) ;
Mise à jour la position de la forme
PosX = xpos + (xspeed * xdirection) ;
YPos = ypos + (yspeed * ydirection) ;
ZPOS = zpos + (zspeed * zdirection) ;
Un test pour voir si la forme dépasse les limites de l’écran
Si c’est le cas, inverser sa direction en multipliant par -1
Si (xpos > largeur taille || xpos < 0) {}
xdirection * = -1 ;
}
Si (ypos > taille hauteur || ypos < 0) {}
ydirection * = -1 ;
}
Si (zpos <-hauteur-taille || zpos > 0) {//note qui va de Zaxis « dans » l’écran
zdirection * = -1 ;
}
Dessinez la forme
Lights() ;
traduire (PosX, Posy, zpos) ;
Sphere(Size) ;
CONTROLL LE STEPPER MOTORS
// X
Si (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
Si (ydirection > = 0) {}
arduino.digitalWrite (YdirPin, Arduino.HIGH) ;
}
else {}
arduino.digitalWrite (YdirPin, Arduino.LOW) ;
}
// Z
Si (zdirection > = 0) {}
arduino.digitalWrite (ZdirPin, Arduino.HIGH) ;
}
else {}
arduino.digitalWrite (ZdirPin, Arduino.LOW) ;
}
}
/////////////////////////////ARDUINO////////////////////////////////////////
Câblage/Arduino code: / / simmple firmata numérique
Prend en charge le plus grand nombre d’entrées digitales et sorties que possible.
Cet exemple de code est dans le domaine public.
#include
#define XstepPin 10
#define XdirPin 7
#define YstepPin 2
#define YdirPin 3
#define ZstepPin 19
#define ZdirPin 18
previousPIN Byte [2] ; PIN signifie PORT pour l’entrée
previousPORT Byte [2] ;
void outputPort (numéro_port octets, portValue octets)
{
Envoyer uniquement les données lorsqu’il modifie, dans le cas contraire, vous obtenez trop de messages !
Si (previousPIN [numéro_port]! = portValue) {}
Firmata.sendDigitalPort (numéro de port, portValue) ;
previousPIN [numéro_port] = portValue ;
Firmata.sendDigitalPort (numéro de port, portValue) ;
}
}
void setPinModeCallback (byte pin, int mode) {}
if(pin > 1) {/ / Don't touch RxTx épingles (0,1)
pinMode (goupille, mode) ;
}
}
void digitalWriteCallback (byte port, int valeur)
{
octet i ;
currentPinValue octets, previousPinValue ;
Si (valeur! = {previousPORT[port])}
pour (i = 0; i < 8; i ++) {}
currentPinValue = valeur (octets) & (1 << j’ai) ;
previousPinValue = previousPORT [port] & (1 << j’ai) ;
Si (currentPinValue! = previousPinValue) {}
digitalWrite (i + (port * 8), currentPinValue) ;
}
}
previousPORT [port] = value ;
}
}
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) ; broches 0-7, ignorant les broches Rx/Tx (0/1)
outputPort (1, PINB) ; broches 8-13
{while(Firmata.available())}
Firmata.processInput() ;
}
séquence de pas à pas ajouté firmata code
digitalWrite(XstepPin,HIGH) ; prendre des mesures
digitalWrite(YstepPin,HIGH) ;
digitalWrite(ZstepPin,HIGH) ;
delayMicroseconds(2) ;
digitalWrite(XstepPin,LOW) ;
digitalWrite(YstepPin,LOW) ;
digitalWrite(ZstepPin,LOW) ;
delayMicroseconds(2) ;
delayMicroseconds(1000) ; <<<<<< Permet de modifier la vitesse STEPPER??? <<<<<<<<
}