Datoriserade Etch en skiss (14 / 16 steg)
Steg 14: mer programmering (vinklar och kurvor)
drawLeft(2)
"drawUp(1)"
och slinga som ett tag, men det blir aldrig så smidig.
Skulle det inte vara mycket svalare köra båda motorer på samma gång och kör den vertikala motorn (i detta fall) hälften så snabbt som den vertikala motorn?
Sättet att göra detta är med PWM. För er som inte känner till denna underbara sak, PWM står för "Pulse bredd Modulation" och är ett sätt att närma sig ett värde mellan 0 och 1 i en digital krets.
Här är en kort genomgång:
Låt säga jag har ett chip som kan producera antingen 0 eller 5 volt. Detta chip driver en elmotor, och jag skulle verkligen vilja köra det på halva hastigheten, eller 2,5 volt. Jag kan inte producera den spänningen direkt från mitt digitala chip, men kanske om jag utgång 0 volt ett tag och sedan 5 volt för samma tid, den genomsnittliga produktionen skulle vara 2,5 volt. Om jag gör det verkligen långsamt motorn kommer att jerk på och av, men om jag växlar mellan 0 och 5 volt verkligen snabbt, motorn kommer att löpa smidigt. Detta beror på att motorn har en hårdhet effekt, och för vissa hög frekvens, kan inte svara lika snabbt som signalen förändras, effektivt genomsnitt spänningen över den. Hurra! Nu kan jag styra en motor hastighet!
"Om jag vill producera en annan spänning, säga, 3 volt, skulle jag bara hålla signalen vid 5 volt för 3/5 av tiden. 2 volt, 2/5 av tiden. AD nauseum"
OK, så praktiskt, vill jag skriva en PWM rutin som kan mata en pwm våg att båda motorerna samtidigt.
void pwm (unsigned char horisontella, unsigned char vertikalt, unsigned char horizontal_direction, unsigned char vertical_direction, int magnitud)
{
unsigned char räkna, utgång;
output = 0;
int längd;
för (int längd = 0; längd < magnitud; längd ++)
för (count = 0; räkna < 255, greve ++)
{
IF(Count<horizontal)
output|=_bv(horizontal_direction);
IF(Count<Vertical)
output|=_bv(vertical_direction);
PORTB = produktion;
}
}
Den vinkel du ritar på (från horisontellt) kommer att vara ganska nära atan(vertical/horizontal).
Nu har du en funktion som låter dig ange storleken och riktningen av en ritade vektor. Detta är den grundläggande, grundläggande komponenten i varje vektor grafik renderer. Söt!