Micsoda? Igen, zenélő motor. Csinálj egy olyan programot, hogy zenélje a motor a Boci-Boci Tarka kezdetű dalt.
De hogyan? Emlékszel, hogy pici PWM értékeknél nem volt elég sokáig bekapcsolva a villany ahhoz, hogy a motor rendesen el tudjon indulni. De minden villany a motorban mágneses teret csinál, az meg elmozdulást, az meg rezegteti a levegőt, az meg hang. Ezért nyikorgott a motor pici PWM esetén.
Na most, ha PWM helyett meg tudnánk csinálni, hogy szándékosan küldünk a motorra például egy 440Hz-es be-kikapcsolást, akkor ugye a motor - hm, arra éppen forog. Merthogy az - bármekkora is a frekvencia - az idő felében be van kapcsolva, a másik felében ki van kapcsolva, szóval az 50%-os PWM.
Nekünk az kellene, hogy mondjuk egy 20%-os PWM-et csináljunk - ettől a motor még nem mozdul meg - és váltva más-más PWM frekvenciát használjunk.
Mivel a PWM csak 20%-os, az nem elég ahhoz, hogy a motor forogjon. Viszont, a PWM frekvenciájával változik benne a mágneses tér, és emiatt ilyen frekvenciájú az elmozdulás, és emiatt... na ezt már leírtam, nem? :) szóval egy 440Hz-es, 20%-os kitöltésű jelre ez a motor 440Hz-en fog sivítani.
Elő a régi DM-es hangcsináló kóddal!
void beep(byte port,int freq,long duration) {
int x;
long delayAmount=(long)(1000000/freq);
long time=(long)((duration*1000)/(delayAmount*2));
for (x=0;x<=time;x++) {
digitalWrite(port, HIGH);
delayMicroseconds(delayAmount);
digitalWrite(port, LOW);
delayMicroseconds(delayAmount);
}
}
Kukkantsd meg a ciklus belsejét:
digitalWrite(port, HIGH);
delayMicroseconds(delayAmount);
digitalWrite(port, LOW);
delayMicroseconds(delayAmount);
azaz bekapcs - vár, kikapcs - vár, de a várás hossza azonos, tehát ez egy 50%-os jel lesz, 50% ideig van bekapcsolva. Ez túl sok, a motor ennyitől már forog!
Osszuk be ezt az időt másképp! 20%-nyi ideig kapcsoljuk csak be a kimenetet, és 80%-nyi ideig ki. Ehhez kiszámoltam a két időt pontosan:
long delayAmountH=delayAmount*0.2;
long delayAmountL=delayAmount*0.8;
és ezt tettem bele a for ciklus belsejébe:
void beep(byte port,int freq,long duration) {
int x;
long delayAmount=(long)(1000000/freq);
long time=(long)((duration*1000)/(delayAmount*2));
long delayAmountH=delayAmount*0.2;
long delayAmountL=delayAmount*0.8;
for (x=0;x<=time;x++) {
digitalWrite(port, HIGH);
delayMicroseconds(delayAmountH);
digitalWrite(port, LOW);
delayMicroseconds(delayAmountL);
}
}
A többi meg már egyszerű:
#define MOTOR 9
void setup() {
pinMode(MOTOR, OUTPUT);
}
void beep(byte port,int freq,long duration) {
int x;
long delayAmount=(long)(1000000/freq);
long time=(long)((duration*1000)/(delayAmount*2));
long delayAmountH=delayAmount*0.2;
long delayAmountL=delayAmount*0.8;
for (x=0;x<=time;x++) {
digitalWrite(port, HIGH);
delayMicroseconds(delayAmountH);
digitalWrite(port, LOW);
delayMicroseconds(delayAmountL);
}
}
void loop() {
beep(MOTOR,525,500);
delay(100);
beep(MOTOR,659,500);
delay(100);
beep(MOTOR,525,500);
delay(100);
beep(MOTOR,659,500);
delay(100);
beep(MOTOR,783,1000);
delay(100);
beep(MOTOR,783,1000);
delay(500);
}
Egy további akusztikai (azaz hangtani) trükk, hogy a motort rátettem egy gyufásdobozra. A gyufásdoboz belseje üres, és ez egy egyszerű hangerősítő. Az akusztikus gitárnak is azért van teste, mert hangerősítő, és az elektromos gitár meg tök lapos, mert ott a hangot úgyis elektronikusan erősítik.
Természetesen, ez azt jelenti, hogy bármi ami villany hatására elmozdulást kelt, képes hangot produkálni. Nyers fizika, semmi varázslat. Hogy a dolog látványosabb legyen, itt hagyják a motorokat egy kicsit mozogni is.
Az előző tíz évben már az összes winchesterben olyan "motor" mozgatja a mágneses olvasófejeit, ami felépítésében is sokkal jobban hasonlít a hangszóróra, mint motorra. Ezeket tulajdonképpen simán be lehet kötni hangszórónak. Az alábbi videóban ilyenből van fenn kettő, és ezek nyomják a vezérszólamot.