Inhoudsopgave:

Nummers maken met een Arduino en een DC-motor - Ajarnpa
Nummers maken met een Arduino en een DC-motor - Ajarnpa

Video: Nummers maken met een Arduino en een DC-motor - Ajarnpa

Video: Nummers maken met een Arduino en een DC-motor - Ajarnpa
Video: Lesson 52: Controlling DC Motor using two relays | Arduino Step By Step Course 2024, Juli-
Anonim
Liedjes maken met een Arduino en een DC-motor
Liedjes maken met een Arduino en een DC-motor

Onlangs, terwijl ik door enkele artikelen over Arduino bladerde, zag ik een interessant project dat Arduino-gestuurde stappenmotoren gebruikte om korte melodieën te creëren. De Arduino gebruikte een PWM-pin (Pulse Width Modulation) om de stappenmotor op specifieke frequenties te laten werken, overeenkomend met muzieknoten. Door te timen welke frequenties wanneer speelden, was er een duidelijke melodie te horen uit de stappenmotor.

Toen ik het echter zelf uitprobeerde, ontdekte ik dat de stappenmotor die ik heb niet snel genoeg kan draaien om een toon te creëren. In plaats daarvan heb ik een DC-motor gebruikt, die relatief eenvoudig te programmeren en aan te sluiten is op een Arduino. Een gewone L293D IC kan worden gebruikt om de motor eenvoudig vanaf een Arduino PWM-pin aan te sturen, en de native tone()-functie in Arduino kan de benodigde frequentie genereren. Tot mijn verbazing vond ik online geen voorbeelden of projecten met een DC-motor, en daarom is deze Instructables mijn antwoord om dat te verhelpen. Laten we beginnen!

PS Ik neem aan dat je al enige ervaring hebt met de Arduino en bekend bent met de programmeertaal en hardware. U moet weten wat arrays zijn, wat PWM is en hoe u het moet gebruiken, en hoe spanning en stroom werken, om maar een paar dingen te noemen. Als je er nog niet bent of net met Arduino bent begonnen, maak je geen zorgen: probeer deze aan de slag-pagina van de officiële Arduino-website en kom terug wanneer je er klaar voor bent.:)

Benodigdheden

  • Arduino (ik heb een UNO gebruikt, maar je kunt een andere Arduino gebruiken als je wilt)
  • Standaard 5V DC-motor, bij voorkeur een waarop een ventilator kan worden aangesloten (zie afbeelding in "Het circuit in elkaar zetten"
  • L293D IC
  • Zoveel drukknoppen als noten in het nummer dat je wilt spelen
  • Breadboard
  • Doorverbindingsdraden

Stap 1: Overzicht

Hier is hoe het project werkt: de Arduino genereert een blokgolf op een bepaalde frequentie, die hij uitvoert naar de L293D. De L293D is aangesloten op een externe voeding die hij gebruikt om de motor van stroom te voorzien met de frequentie die door de Arduino wordt gegeven. Door te voorkomen dat de as van de gelijkstroommotor draait, kunt u de motor horen in- en uitschakelen op de frequentie die een toon of noot produceert. We kunnen de Arduino programmeren om noten te spelen wanneer er op knoppen wordt gedrukt, of om ze automatisch af te spelen.

Stap 2: Het circuit monteren

Het circuit samenstellen
Het circuit samenstellen
Het circuit samenstellen
Het circuit samenstellen

Om het circuit samen te stellen, volgt u eenvoudig het bovenstaande Fritzing-diagram.

Tip: Het geluid van de motor is het best te horen als de as niet draait. Ik plaatste een ventilator op de as van mijn motor en gebruikte wat ducttape om de ventilator stil te houden terwijl de motor liep (zie afbeelding). Dit verhinderde dat de as draaide en produceerde een duidelijke, hoorbare toon. Het kan zijn dat u wat aanpassingen moet doen om een zuivere toon uit uw motor te krijgen.

Stap 3: Hoe het circuit werkt

Hoe het circuit werkt
Hoe het circuit werkt

De L293D is een IC die wordt gebruikt voor het aansturen van apparaten met relatief hoge spanning en hoge stroomsterkte, zoals relais en motoren. De Arduino kan de meeste motoren niet rechtstreeks vanaf de uitgang aansturen (en de achterste EMF van de motor kan de gevoelige digitale circuits van de Arduino beschadigen), dus een IC zoals de L293D kan worden gebruikt met een externe voeding om de gelijkstroommotor gemakkelijk aan te drijven. Als u een signaal invoert in de L293D, wordt hetzelfde signaal naar de gelijkstroommotor gestuurd zonder schade aan de Arduino te riskeren.

Hierboven is een pinout / functioneel schema van de L293D uit de datasheet. Omdat we maar 1 motor aandrijven (de L293D kan er 2), hebben we maar één kant van het IC nodig. Pin 8 is voeding, pin 4 en 5 zijn GND, pin 1 is de PWM-uitgang van de Arduino en pin 2 en 7 regelen de richting van de motor. Als pin 2 HOOG is en pin 7 LAAG, draait de motor de ene kant op, en als pin 2 LAAG is en pin 7 HOOG, draait de motor de andere kant op. Aangezien het ons niet uitmaakt op welke manier de motor draait, maakt het niet uit of pinnen 2 en 7 LAAG of HOOG zijn, zolang ze maar van elkaar verschillen. De pennen 3 en 6 worden op de motor aangesloten. Je kunt alles aansluiten op de andere kant (pinnen 9-16) als je wilt, maar houd er rekening mee dat de stroom- en PWM-pinnen van plaats wisselen.

Opmerking: als u een Arduino gebruikt die niet genoeg pinnen heeft voor elke knop, kunt u een netwerk van weerstanden gebruiken om alle schakelaars op één analoge pin aan te sluiten, zoals in deze instructables. Hoe dit werkt valt buiten het bestek van dit project, maar als je ooit een R-2R DAC hebt gebruikt, zou je hem bekend moeten vinden. Merk op dat voor het gebruik van een analoge pin grote delen van de code moeten worden herschreven, omdat de Button-bibliotheek niet kan worden gebruikt met analoge pinnen.

Stap 4: Hoe de code werkt

Om het gemakkelijker te maken om met alle knoppen om te gaan, heb ik een bibliotheek gebruikt met de naam "Button" van madleech. Ik heb de bibliotheek als eerste toegevoegd. Vervolgens definieerde ik in regel 8-22 de frequenties voor de noten die nodig zijn om Twinkle, Twinkle, Little Star (het voorbeeldnummer) te spelen, de pin die ik zal gebruiken om de L293D aan te sturen, en de knoppen.

In de setup-functie heb ik de serie, de knoppen geïnitialiseerd en de driverpin voor de L293D in de uitvoermodus gezet.

Ten slotte heb ik in de hoofdlus gecontroleerd of er op een knop is gedrukt. Als dit het geval is, speelt de Arduino de bijbehorende noot af en drukt de nootnaam af naar de seriële monitor (handig om te weten welke noten welke op uw breadboard staan). Als een noot wordt losgelaten, stopt de Arduino elk geluid met noTone().

Helaas kon ik vanwege de manier waarop de bibliotheek is gestructureerd geen manier vinden om te controleren of een knop op een minder uitgebreide manier is ingedrukt of losgelaten dan het gebruik van 2 conditionals per noot. Een ander minpunt van deze code is dat als je twee knoppen tegelijk zou indrukken en dan één ervan loslaat, beide noten zouden worden gestopt, omdat noTone() stopt met het genereren van noten, ongeacht welke noot deze heeft geactiveerd.

Stap 5: Een nummer programmeren

In plaats van knoppen te gebruiken om noten te spelen, kun je de Arduino ook programmeren om automatisch een melodie voor je te spelen. Hier is een aangepaste versie van de eerste schets die Twinkle, Twinkle, Little Star op de motor speelt. Het eerste deel van de schets is hetzelfde - het definiëren van nootfrequenties en de tonePin. We komen bij het nieuwe gedeelte bij bpm="100". Ik stel de beats per minuut (bpm) in en gebruik vervolgens wat wiskunde om het aantal milliseconden per beat te berekenen waarmee de bpm overeenkomt. Om dit te doen, heb ik een techniek gebruikt die dimensionale analyse wordt genoemd (maak je geen zorgen - het is niet zo moeilijk als het klinkt). Als je ooit een scheikundecursus op de middelbare school hebt gevolgd, heb je zeker dimensionale analyse gebruikt om tussen eenheden om te rekenen. De drijvers () zijn er om ervoor te zorgen dat niets in de vergelijking tot het einde wordt afgerond voor nauwkeurigheid.

Nadat we het aantal ms/tel hebben, heb ik het op de juiste manier gedeeld of vermenigvuldigd om de millisecondenwaarden te vinden van de verschillende nootduur in muziek. Ik maak dan een reeks van elke noot in chronologische volgorde, en een andere met de duur van elke noot. Het is van cruciaal belang dat de index van elke noot overeenkomt met de index van zijn duur, anders klinkt uw melodie niet. Ik heb hier de noten voor Twinkle, Twinkle, Little Star als voorbeeld geplaatst, maar je kunt elk nummer of elke reeks noten proberen die je wilt.

De echte magie gebeurt in de loop-functie. Voor elk van de noten speel ik de toon gedurende een tijd die ik heb opgegeven in de beat_values-array. In plaats van hier vertraging te gebruiken, waardoor de toon niet zou worden afgespeeld, nam ik de tijd op sinds het programma begon met de millis()-functie, en trok deze af van de huidige tijd. Wanneer de tijd de tijd overschrijdt die ik heb opgegeven voor de noot die moet duren in de beat_values-array, stop ik de noot. De vertraging na de for-lus is er om een opening tussen noten toe te voegen, zodat volgende noten met dezelfde frequentie niet in elkaar overlopen.

Stap 6: Feedback

Dat was het voor dit project. Als er iets is dat je niet begrijpt, of als je suggesties hebt, aarzel dan niet om contact met mij op te nemen. Aangezien dit mijn eerste Instructables is, zou ik opmerkingen en suggesties over het verbeteren van deze inhoud zeer op prijs stellen. Tot de volgende keer!

Aanbevolen: