Jag tänkte bygga en plotter liknande maskin som ska kunna rita figurer.
Såhär ser plottern ut: http://www.gbgknappen.se/IMGP0113.JPG
Det är alltså två kjell motrorer en som driver plattan sm pappret ligget på och en som driver pennan.
Jag har kommit så långt att jag kan göra fyrkanter och trianglar. Nu har jag börjar göra cirklar men de blir rätt kantiga. Jag har funderat på om detta beror på att steglängden är 7,8 grader (eller nått nära det). Jag använder pythagorassats för att hitta hur man ska gå med stegmotorerna för att hela tiden hålla sig så nära cirkel linjen som möjligt. I början av varje cirkel ser det bra ut men efter ett tag så blir det snarare raka streck. Jag har gjort ett program i Dev-C++ som skriver ut steg så att det blir som om man hade kört plottern på riktigt. Det programmer ser ut såhär, detta program är gör alltså bara 1/8 del av en cirkel:
Kod: Markera allt
#include <stdio.h>
// *MatteFunktioner
//upphöjt
double pow0(double x, double y);
//rotnur
double sqrte(double z);
// *matte variabler
double powres; //resultat av upphöjt
double sqrtres; //resultat av rotenur
// *X och Y värden
double valueX;
double valueY; //Yvärdet vid en viss Xbas
double valueX05;
double valueY05; //Yvädet vid Xbas-0,5
double stepYend; // De kvarvarande stegen efter att Y motron gått "stepYbegin" och Xmotron gått ett steg
double stepYbegin; //Det antal steg Y motron ska göra innan ett X steg
double valueYold;
// *Radie variabel
int r;
// *Räkningsvariabler
int countX; //antal steg X motron gått
int countY; //antal steg Y motron gått
int count; //räkninge variabel för while looparna
// *koll på hur lång basen i trianglen är
int Xbas;
int Ybas;
//*TEST VARIABLER
int countTEST;
int w;
double valueTEST;
int main (void){
//sätter radie och räknar ut Xbasen första gången
r=10;
Xbas=r-1;
// sätter test variabler
countTEST=1;
w=3;
//sätter räknings varibaler till 0
countX=0;
countY=0;
//**********************************************************
//*********************Cirkel 1/8***************************
//**********************************************************
//detta upprepar sig tills Xbas och countY är lika dvs. när det blir en 45 graders vinkel
while(Xbas>=countY){
//räknar ut valueY dvs det värde på Y när Xbas=Xbas-countX (eller första gången Xbas=r-1)
valueY=sqrte(pow0(r, 2)-pow0(Xbas, 2));
//+0,5 för att få ett Yvärde på "ett halvt steg"
valueY05=sqrte(pow0(r, 2)-pow0((Xbas+0.5), 2));
// Skillnaden mellan Ydet "stora" Yvärdet och det "lilla" Yvärdet
stepYend=valueY-valueY05;
//Antal steg den ska gå innan ett Xsteg
stepYbegin=valueY05-valueYold;
//Y motor Yvalue+0,5 för att den ska avrunda rätt
count=1;
while((stepYbegin+0.5)>=count){
if(Xbas>countY){
printf("Y");
count=count+1;
countY=countY+1;
}
else{}
}
//ny rad
printf("\n");
//mellanslag (lika mycket som Y motor gått)
count=2;
while(countY>=count){
printf(" ");
count=count+1;
}
// X motor
count=1;
while(1>=count){
if(Xbas>countY){
printf("X");
count=count+1;
}
else{}
}
//Y motor Yvalue+0,5 för att den ska avrunda rätt
count=1;
while((stepYend+0.5)>=count){
if(Xbas>countY){
printf("Y");
count=count+1;
countY=countY+1;
}
else{}
}
countTEST=countTEST+1;
//minska Xbas med 1 för att kolla nästa punkt
Xbas=Xbas-1;
//sparar det gamla Yvärdet
valueYold=valueY;
}
while(1==1){}
}
//**************************************************************
//*************** FUNKTIONER ********************************
//**************************************************************
//upphöjt till
double pow0(double x, double y){
count=1;
powres=1;
while(y>=count){
powres=powres*x;
count=count+1;
}
return powres;
}
// FUNKTION ROTENUR
double sqrte(double z){
sqrtres=1;
while(z>(sqrtres*sqrtres)){
sqrtres=sqrtres+0.01;
}
return sqrtres-0.01;
}
Just det jag kanske ska nämna att jag styr motorerna med en PIC16F690