Stap 14: meer programmering (hoeken en bochten)
drawLeft(2)
"drawUp(1)"
en lus die voor een tijdje, maar dat zal nooit zo glad.
Zou het niet veel koeler te lopen beide motoren op hetzelfde tijdstip, en run de verticale motor (in dit geval) de helft zo snel als de verticale motor?
De manier om dit te doen is met PWM. Voor degenen onder u die niet vertrouwd met deze prachtig ding, PWM staat voor "Pulse Width Modulation" en is een manier van de onderlinge aanpassing van een waarde tussen 0 en 1 in een digitale circuit.
Hier is een kort overzicht:
Laten we zeggen dat ik heb een chip die op 0 of 5 volt produceren kan. Deze chip een elektromotor rijdt, en ik zou echt willen draaien op halve snelheid, of 2,5 volt. Kan niet ik die spanning te produceren direct uit mijn digitale chip, maar misschien als ik 0 volt voor een tijdje en dan 5 volt uitgang voor de zelfde hoeveelheid tijd, de gemiddelde output zou 2,5 volt. Als ik doe dit echt langzaam, de motor zal ruk aan en uit, maar als ik switch tussen 0 en 5 volt echt snel, de motor soepel loopt. Dit is omdat de motor een demping effect heeft, en voor sommige hoge frequentie, zo snel als het signaal is aan het veranderen, effectief gemiddeld de spanning overheen kan niet reageren. Hooray! Nu kan ik de snelheid van een motor controle!
"Als ik produceren een verschillende spanning, zeggen, 3 volt willen, ik zou gewoon houden het signaal bij 5 volt voor 3/5 van de tijd. 2 volt, 2/5 van de tijd. Advertentie nauseum"
OK, dus praktisch, zou ik willen schrijven een PWM-routine die een pwm Golf om beide motoren tegelijk kunt uitvoeren.
VOID pwm (unsigned char horizontaal, unsigned char verticale, unsigned char horizontal_direction, unsigned char vertical_direction, int omvang)
{
unsigned char graaf, output;
uitvoer = 0;
int lengte;
voor (int lengte = 0; lengte < omvang, lengte ++)
voor (graaf = 0; graaf < 255; count ++)
{
if(count<Horizontal)
output|=_bv(horizontal_direction);
if(count<Vertical)
output|=_bv(vertical_direction);
PORTB = output;
}
}
De hoek die u tijdens het tekenen (uit het horizontale vlak) is vrij dicht bij atan(vertical/horizontal).
Nu heb je een functie waarin u kunt aangeven de omvang en de richting van een getekende vector. Dit is de fundamentele, fundamentele component van elke vector graphics renderer. Sweet!