Plotter projekt

Berätta om dina pågående projekt.
Bola
Inlägg: 133
Blev medlem: 16 november 2009, 10:28:41
Ort: Göteborg

Plotter projekt

Inlägg av Bola »

Hej,
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;
       

}

Jag hoppas ni förstår lite iallfall fråga gärna om ni inte förstå. Det jag söker nu är lite tips på hur de som gjort detta innan gjort sina cirklar? Vad har ni använt för metod för att göra cirklar?

Just det jag kanske ska nämna att jag styr motorerna med en PIC16F690
Användarvisningsbild
JimmyAndersson
Inlägg: 26568
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Re: Plotter projekt

Inlägg av JimmyAndersson »

Kul projekt! :tumupp:

Riktigt smidigt och smart byggt! Enklare än så går knappt att göra. :bravo:
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Plotter projekt

Inlägg av Icecap »

Då du iaf. använder float kan du väl lika väl köra med cosinus och sinus. Då kan du använda vilken vinkelupplösning du vill.
Skriv svar