Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Speel 'Happy Birthday' met 3-stemmige Polyfonie op Arduino Nano – Oneindige, Licht-gesynchroniseerde Melodie

Onderdelen en benodigdheden

Arduino Nano R3 × 1

Apps en online diensten

  • Arduino IDE

Over dit project

Speel polyfone "Happy Birthday"-melodie op Arduino Nano met drie buzzers op een enkele mini-breadboard.

Allereerst - Demonstratie

Stop dit ding in een willekeurige USB-voeding (niet alleen een computer) en het speelt de "Happy Birthday"-melodie oneindig... bijna... tot je er echt zat van raakt =]

Overigens knipperen de lampjes in tact met elke nootverandering in het bijbehorende kanaal/buzzer.

Schema's

Het idee was om een supercompact apparaat te maken met (bijna) geen solderen.

Uiteindelijk heb ik alles wat nodig was op een klein breadboard weten te krijgen:

(Afbeeldingen van de breadboard-layout en aansluitingen - zie origineel project)

Gaten zijn intern verbonden in het breadboard op deze manier:

(Afbeelding van breadboard-interne verbindingen)

De truc is dat de Arduino Nano-bord perfect in zo'n breadboard past, wat ons toestaat om extra componenten aan beide kanten van het breadboard te verbinden.

Sorry, heren... Ik ben te lui om diagrammen te tekenen, maar dit geval is ZO simpel dat ik zeker ben dat deze close-ups meer dan genoeg zullen zijn om alles uit te vogelen =]

(Meerdere detailfoto's van de opbouw)

Zoals je kunt zien, gebruik ik hier een Arduino Nano v3.0-bord van Gravitech, maar elk analoog bord zal doen. De buzzers en LEDs hier zijn HEEL gewone. Ze hoeven niet aan speciale parameters te voldoen.

De weerstanden hier zijn 100 Ohm... hoewel de gangbare "standaard" voor LED-bescherming 220 Ohm is... wie erkt... ¯\_(ツ)_/¯

Het enige wat waarschijnlijk niet zo duidelijk is op deze foto's, is dat de buzzer-pinnen zo in het breadboard zitten:

(Afbeelding van buzzer-plaatsing)

Let ook op dat de middelste groter is dan de anderen - dat is omdat deze gebruikt wordt voor het "bas"-muziek kanaal ☝🏻

... gewoon een grapje! ^__^ Ze piepen allemaal als een gekke muizenkoor zonder enig verschil in hun geluidsmogelijkheden =]

Dus je kunt drie identieke buzzers gebruiken zonder probleem, maar je moet ze dan op iets andere posities op het breadboard plaatsen en ook de uitgangspinnummers in de programmacode wijzigen volgens je nieuwe buzzer-plaatsing.

Let ook op nog een klein "hackje"... toch zijn we op Hackster of niet? =] Ik gebruik hier verschillende Arduino I/O-pinnen als ground-pinnen voor buzzers en LEDs 😱😱 . Ja... dat klopt. Als je een "LOW"-staat instelt voor een Arduino I/O-pin in je programma, kun je deze pinnen op precies dezelfde manier gebruiken als standaard GND-pinnen op Arduino-borden. Cool, toch? ;)

Over het programma...

De volledige listing van de Arduino IDE-sketch is hieronder gegeven. Je moet echter een extra "Tone"-bibliotheek installeren om de sketch te kunnen compileren, die je hier kunt downloaden:

Tone-bibliotheek downloaden

(als er een pop-up verschijnt met een registratie-"voorstel", sluit het dan met het "x"-knopje in de hoek)

De makkelijkste manier om deze bibliotheek te installeren is: in het Arduino IDE-hoofdmenu kies Sketch - Bibliotheek opnemen - .ZIP-bibliotheek toevoegen... en selecteer je gedownloade zip-bestand... makkelijk ¯\_(ツ)_/¯

Deze bibliotheek is nodig om gelijktijdige generatie van verschillende tonen op een enkele controller te realiseren (het gebruikt extra hardware-timers en hardware-interrupts "onder de motorkap" om dit te bereiken). Eenvoudig gezegd, het is een soort "redneck-multitasking" op een enkele processorkern zonder OS =]

Overigens, hier is de auteur van de bibliotheek (dank je bro! =]):

Bhagman profiel

... en de GitHub-pagina van de bibliotheek:

Tone op GitHub

DISCLAIMER 🙂 :
Eerlijk gezegd, is mijn programmacode hier redelijk omvangrijk en moeilijk leesbaar. Dat komt voornamelijk door de noodzaak om met drie "onafhankelijke" melodie-draden tegelijkertijd te "jongleren" vanuit slechts één lineaire commando-stroom. Ik dacht er wel over na om de code later te refactoren om de melodieën van elkaar te scheiden en in de toekomst te gebruiken voor het spelen van verschillende nummers... maar dat zal waarschijnlijk niet gebeuren =]

Veel succes. Eventuele feedback wordt gewaardeerd.

Bedankt voor het lezen tot het einde =]

Code

Happy_birthday

Vergeet niet de Tone-bibliotheek te installeren!!

#include <Tone.h>
Tone solo;
Tone bass;
Tone rythm;

const int t = 600; // kwartnootduur
const int tt = t*2;
const int t14 = round(t*1/4);
const int t24 = round(t*2/4);
const int t34 = round(t*3/4);

const int bassLedPin = 15; // bas led signaalpin (aka A1)
const int rythmLedPin = 17; // rythm led signaalpin (aka A3)
const int soloLedPin = 19; // solo led signaalpin (aka A5)

void wait(Tone t) {
  while (t.isPlaying()) { }
}

int bassLedState = LOW;
void switchBassLed() {
  if (bassLedState == LOW) bassLedState = HIGH;
  else bassLedState = LOW;
  digitalWrite(bassLedPin, bassLedState);
}

int rythmLedState = LOW;
void switchRythmLed() {
  if (rythmLedState == LOW) rythmLedState = HIGH;
  else rythmLedState = LOW;
  digitalWrite(rythmLedPin, rythmLedState);
}

int soloLedState = LOW;
void switchSoloLed() {
  if (soloLedState == LOW) soloLedState = HIGH;
  else soloLedState = LOW;
  digitalWrite(soloLedPin, soloLedState);
}

void setup(void) {
  pinMode(14, OUTPUT); // led ground pin (aka A0)
  pinMode(16, OUTPUT); // led ground pin (aka A2)
  pinMode(18, OUTPUT); // led ground pin (aka A4)
  pinMode(bassLedPin, OUTPUT);
  pinMode(rythmLedPin, OUTPUT);
  pinMode(soloLedPin, OUTPUT);
  pinMode(2, OUTPUT); // solo buzzer ground pin
  pinMode(9, OUTPUT); // rythm buzzer ground pin
  solo.begin(6); // solo buzzer signaalpin
  bass.begin(12); // bas buzzer signaalpin
  rythm.begin(0); // rythm buzzer signaalpin
  solo.play(NOTE_D4, t34);
  switchSoloLed();
  wait(solo);
  solo.play(NOTE_D4, t14);
  switchSoloLed();
  wait(solo);
}

void loop(void) {
  // De volledige melodie-code is te lang om hier volledig weer te geven.
  // Zie het originele project voor de complete code.
  // Het patroon herhaalt zich: bas, rythm en solo spelen elk hun noten
  // met bijbehorende LED-knippering, gesynchroniseerd via wait()-functies.
}

Productieproces

  1. K30 CO2-sensor: Real-time binnenluchtkwaliteitmonitoring met Arduino
  2. Communicatie voor doofblinden vergemakkelijken met 1Sheeld en Arduino
  3. Slimme spaarpot bouwen: Muntenacceptor besturen met Arduino Nano
  4. Arduino Nano Bundle: CrazyCircuits, DFRobot Sensoren & Tools – Bouw Projecten met Vertrouwen
  5. Een LED bedienen via Bluetooth met Arduino – Eenvoudige DIY Handleiding
  6. Een DFRobot Capacitieve Vingerafdruksensor integreren met Arduino of ESP8266
  7. Interactief Nextion HMI-weerstation met Arduino Mega en sensoren
  8. Arduino-gebaseerde 6-DoF Robotarm Gestoeerd met Wii Nunchuk
  9. Twee Stappenmotors Sturen met Arduino Nano & Joystick – Simpele Tutorial
  10. Bouw een handgehoude Geiger-teller met Arduino Nano
  11. Accurate zonnestralingsmeting met Arduino UNO en Ethernet Shield