Hangmagasság követő a tone() függvény segítségével

Egy hangmagasság lejátszása a piezo hangszórón az analóg bemenettől függően.


Utolsó felülvizsgálat: 2022.02.04 16:50


Ez a példa bemutatja, hogyan figyelheti a kapcsoló állapotát az Arduino és a számítógép közötti soros kommunikáció létrehozásával USB-n keresztül.

Hardver szükséglet

  • Arduino kártya

  • 8 ohmos hangszóró

  • fotoellenállás

  • 4,7 kohm-os ellenállás

  • 100 ohm-os ellenállás

  • összekötő vezetékek

  • dugdosós próbapanel (breadboard)

Az áramkör

Csatlakoztassa a hangszóró egyik csatlakozóját a 9-es digitális kivezetéshez egy 100 ohmos ellenálláson keresztül, a másik csatlakozóját pedig a testhez. Táplálja a fotoellenállást 5 V-tal, és csatlakoztassa az analóg 0-hoz egy 4,7K-os ellenálláson keresztül a földhöz.

Vázlat

A kód

A példa kódja nagyon egyszerű. Csak vegyünk egy analóg bemenetet, és képezzük le az értékeit a hallható hangmagasságok tartományára. Az emberek 20 és 20 000 Hz között hallanak, de a 120 és 1500 közötti frekvencia általában elég jól működik ennél a vázlatnál.

A leképezéshez meg kell szereznie az analóg bemenet tényleges tartományát. A bemutatott áramkörben az analóg bemenet értéke körülbelül 400 és körülbelül 1000 között volt. Módosítsa a map() parancs értékeit, hogy azok megfeleljenek az érzékelő tartományának.

A vázlat a következő:

/*
  Pitch follower

  Olyan hangmagasságot játszik le, amely a változó analóg bemenet alapján változik

  Az áramkör:
  - 8 ohmos hangszóró a digitális 9 kivezetésen
  - fotoellenállás az analóg 0-tól az 5V-ra
  - 4.7 kilohmos ellenállás az analóg 0-tól a földre

  created 21 Jan 2010
  modified 31 May 2012
  by Tom Igoe, with suggestion from Michael Flynn

  Ez a kód nyilvános.

  https://docs.arduino.cc/built-in-examples/digital/tonePitchFollower
*/

void setup() {
  // soros kommunikáció inicializálása (csak hibakereséshez):
  Serial.begin(9600);
}

void loop() {
  // olvassa le az érzékelőt:
  int sensorReading = analogRead(A0);

  // nyomtassa ki az érzékelő leolvasását, hogy megismerje a határait
  Serial.println(sensorReading);

  // leképezheti az analóg bemeneti tartományt (ebben az esetben 400–1000
  // a fotoellenállástól) a kimeneti hangmagasság-tartományhoz (120–1500 Hz),
  // módosítsa az alábbi minimális és maximális bemeneti számokat az érzékelő
  // által adott tartománytól függően:
  int thisPitch = map(sensorReading, 400, 1000, 120, 1500);

  // játszd le a hangmagasságot
  tone(9, thisPitch, 10);

  delay(1);        // késleltetés a leolvasások között a stabilitás érdekében
}

Tudj meg többet

További alapvető oktatóanyagokat a beépített példák részben talál.

Felfedezheti a nyelvi referenciát is, az Arduino programozási nyelv részletes gyűjteményét.