Étape 9: Ce qui en fait un peu mieux
Comme j’ai apporter des améliorations, je vais ajouter des étapes à la fin de cette instructable.
11/10/09
Le code previus suit le ballon assez bien mais les steppers sont conduits de façon très rocheuse.
Dans ce code de mise à jour, l’esquisse de traitement seulement envoie un signal à l’Arduino lorsqu’il y a un changement de direction. Donc il suffit de lancer les moteurs pas à pas dans quelle direction ils étaient dernière valeur, jusqu'à ce qu’il leur est demandé de changer. Cela permet les moteurs d’exécution beaucoup plus rapide et plus lisse.
Mais il y a encore quelque chose d’un peu éteint. L’Arduino semble manquer certains des signaux, donc le RepStrap se termine avec la scène de X-Y a poussé tout le chemin à un côté.
Je vais essayer de résoudre ce problème.
Le code de l’Arduino et le traitement est ci-dessous. J’ai ajouté plus de commentaires pour aider à garder les choses claires.
/////////////////////////////////////////////////
Code de l’Arduino :
Lire les données de la série
Utiliser les données pour déterminer la direction de X et Y Steps
#define XstepPin 10
#define XdirPin 7
#define YstepPin 2
#define YdirPin 3
int val ; Données reçues du port série
void setup() {}
pinMode (XstepPin, sortie) ;
pinMode (XdirPin, sortie) ;
pinMode (YstepPin, sortie) ;
pinMode (YdirPin, sortie) ;
Serial.Begin(9600) ; Commencer la communication série à 9600 bps
}
void loop() {}
int dirX ;
dirY int ;
Si (Serial.available()) {/ / si les données sont disponibles pour lire,
Val = Serial.read() ; puis lire et stocker la valeur dans le val
}
Si (val == « H ») {//set la direction de X et Y, basé sur les données envoyées du traitement
dirX = élevé ;
}
Si (val == « L ») {}
dirX = faible ;
}
Si (val == « h ») {}
dirY = élevé ;
}
Si (val == « l ») {}
dirY = faible ;
}
digitalWrite(XdirPin,dirX) ; direction de l’ensemble X
digitalWrite(YdirPin,dirY) ; Définissez la direction Y
digitalWrite(XstepPin,HIGH) ; prendre des mesures
digitalWrite(YstepPin,HIGH) ;
delayMicroseconds(2) ;
digitalWrite(XstepPin,LOW) ;
digitalWrite(YstepPin,LOW) ;
delayMicroseconds(2) ;
delayMicroseconds(1000) ; <<<<<< Permet de modifier la vitesse <<<<<<<<
}
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
Code de traitement :
Cela génère le mouvement de la balle en mouvement à l’axe RepRap X et Y
Import processing.serial.* ;
Serial myPort ; Créez l’objet de classe de la série
int val ;
float x = 50,0 ;
float y = 50,0 ;
flotteur speedX = 1.0 ;
flotteur rapide =. 4 ;
rayon de flotteur = 15,0 ;
int directionX = 1 ;
int directionY = 1 ;
int old_directionX = 1 ;
int old_directionY = 1 ;
void setup() {}
taille (100, 100) ;
Smooth() ;
noStroke() ;
ellipseMode(RADIUS) ;
String portName = Serial.list() [0] ;
myPort = nouvelle série (ce, portName, 9600) ;
}
{} void draw()
Fill(0,12) ;
Rect (0,0, largeur, hauteur) ;
Fill(255) ;
ellipse (x, y, rayon, rayon) ;
speedX x += * directionX ;
Si ((x > largeur-rayon) || (x < RADIUS)) {//change X direction si la balle frappe le côté de la boîte
directionX = - directionX ;
}
y += rapide * directionY ;
Si ((y > hauteur-rayon) || (y < RADIUS)) {//change Y direction si la balle frappe le côté de la boîte
directionY = - directionY ;
}
Si ((directionX! = old_directionX) & & (directionX == 1)) {//if X direction changé impression H
myPort.write('H') ;
Print('H') ;
Delay(100) ;
}
Si ((directionX! = old_directionX) & & (directionX == -1)) {//if X direction changé impression h
myPort.write('h') ;
Print('h') ;
Delay(100) ;
}
Si ((directionY! = old_directionY) & & (directionY == 1)) {//if Y sens changé L impression
myPort.write('L') ;
Print('L') ;
Delay(100) ;
}
Si ((directionY! = old_directionY) & & (directionY == -1)) {//if Y sens changé l impression
myPort.write('l') ;
Print('l') ;
Delay(100) ;
}
old_directionX = directionX ; stocke les indications que nous avons utilisé, sous la direction de la vieille
old_directionY = directionY ;
Delay(100) ; Décommentez pour ralentir le tout pour le dépannage
}