Bónusz feladat: zenélő motor

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.

Éneklő motor - hangosítsd fel!

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.

Ghost busters

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.

Star Wars - birodalmi induló

Mit tanultunk ebből?

Ami mozog, az hanggal jár - és ez nagyon kúúúl!