Sommario:
- Passaggio 1: definizione degli indirizzi di registro
- Passaggio 2: array e variabili globali
- Passaggio 3: la funzione "serial.begin"
- Passaggio 4: la funzione "serial.available"
- Passaggio 5: la funzione "serial.read"
- Passaggio 6: la funzione "serial.write"
- Passaggio 7: la funzione di configurazione
- Passaggio 8: le funzioni Loop e ISR
- Passaggio 9: cablaggio
- Passaggio 10: mettere tutto insieme
Video: Generatore di suoni Arduino senza libreria o funzioni seriali (con interruzioni): 10 passaggi
2024 Autore: John Day | [email protected]. Ultima modifica: 2024-01-30 10:04
Questo non è qualcosa su cui normalmente farei un istruttore, preferisco il mio lavoro in metallo, ma dato che sono uno studente di ingegneria elettrica e devo seguire un corso sui microcontrollori (Embedded Systems Design), ho pensato di fare un istruibile su uno dei miei progetti Quando ho originariamente realizzato il progetto e altri per questa classe, ho scoperto che ci sono pochissimi tutorial che non utilizzano le funzioni della libreria arduino o le funzioni seriali, che è un'altra ragione per cui ho pensato che sarebbe stato un buon istruibile.
Questo codice è progettato per il microcontrollore Atmega 2560, quindi se desideri implementarlo su un'altra scheda dovrai modificare i registri degli indirizzi nel codice in base al manuale utente del tuo controller. L'idea alla base del codice è che ogni volta che si immette un tasto sulla tastiera nel monitor seriale, l'arduino mega emetterà una certa frequenza in base al tasto premuto, con "q" che lo reimposta. Ho fatto in modo che "a" emettesse la frequenza di LA bemolle e "LA" emettesse la frequenza di LA bemolle, "b" emettendo si bemolle, "do" per do bemolle, "do" per do diesis e così via. Il codice completo viene caricato alla fine, ma ogni passaggio suddividerà il codice in parti in modo che sia più facile da spiegare.
Passaggio 1: definizione degli indirizzi di registro
Questo passaggio è semplice, se stai usando l'atmega 2560, devi solo usare gli indirizzi che ho usato, anche se usi una scheda con un chip diverso, dovrai trovare gli indirizzi per ciascuno di questi registri sul tuo manuale utente dei chip. Le definizioni in alto sono solo costanti che verranno utilizzate per le nostre funzioni in seguito. Specifichiamo gli indirizzi come volatile unsigned perché non vogliamo che il compilatore li incasini.
Passaggio 2: array e variabili globali
Qui vogliamo definire l'array Frequency che conterrà tutte le frequenze che ogni tasto dovrebbe emettere. Questi valori sono calcolati dalle frequenze effettive delle note e onestamente ho dimenticato come li ho ottenuti, ma sono i valori giusti mentre li ho testati su un oscilloscopio per esserne sicuro. Stiamo anche definendo l'array delle note che contiene tutti i tasti da premere per ogni tono, così come le variabili di cui avremo bisogno per le nostre funzioni successive.
Passaggio 3: la funzione "serial.begin"
Chiameremo la nostra funzione personalizzata che replica la funzione "serial.begin" U0init(). Prende il baudrate desiderato come input e avvia la porta seriale a quel baudrate.
Passaggio 4: la funzione "serial.available"
Chiameremo la funzione che imita "serial.available" U0kbhit(). Non accetta input ma rileva invece se è stata apportata una modifica sulla tastiera utilizzando il bit di stato RDA e restituisce true quando viene rilevata una modifica.
Passaggio 5: la funzione "serial.read"
Chiameremo la funzione che imita la funzione "serial.read" U0getchar(), che non accetta input ed emette qualunque modifica venga apportata sulla tastiera, che è memorizzata nel registro UDR0.
Passaggio 6: la funzione "serial.write"
Chiameremo la funzione che imita "serial.write" U0putchar(), che prende i dati dal registro UDR0 mentre viene rilevata e memorizzata una modifica, e le uscite che tornano al monitor seriale.
Passaggio 7: la funzione di configurazione
Questa è la funzione di configurazione di base che utilizzerà la nostra imitazione "serial.begin" per inizializzare la porta seriale e inizializzerà le nostre impostazioni dei bit per i registri del timer e imposterà PB6 per l'uscita dei nostri toni.
Passaggio 8: le funzioni Loop e ISR
Il ciclo funziona in questo modo: se viene rilevata una modifica con la nostra funzione "serial.available", la nostra funzione "serial.read" memorizza tale modifica e la nostra funzione "serial.write" inserisce tale modifica nel monitor seriale. Finché una variabile i è inferiore alla dimensione dell'array di frequenza, imposterà l'output come posizione di i in quell'array, emettendo la frequenza in quella posizione. L'ISR funziona come reset, dove se la posizione dell'array di frequenza non è uguale a 0 (in altre parole se "q" non viene premuto), emetterà la frequenza, ma quando viene premuto "q" si azzererà. Nota: questo codice utilizza gli interrupt, ma può essere eseguito con gli interrupt disabilitati. Pubblicherò il codice senza interruzioni se ricevo richieste, penso solo che la versione di interruzione sia più divertente.
Passaggio 9: cablaggio
Il cablaggio per questo codice è estremamente semplice, basta mettere un cavo di uscita da PB6 a una breadboard, collegare un cicalino o un altoparlante in serie con quello e collegarlo di nuovo a terra. Nota: se si utilizza un altoparlante, inserire una piccola resistenza prima dell'altoparlante. Se vuoi solo vedere l'uscita ma non sentirla, collega PB6 al cavo rosso di un oscilloscopio e il cavo nero a massa.
Passaggio 10: mettere tutto insieme
Ho aggiunto il codice completo a questo passaggio, poiché ne ho spiegato tutte le parti nei passaggi precedenti. Richiede solo un input da tastiera per diverse frequenze e invia tale frequenza a PB6. Spero ti sia piaciuto leggere un modo diverso di codificare con l'IDE!
Inoltre, vota per questo nel concorso Microcontrollori:D
Consigliato:
Generatore di funzioni: 12 passaggi (con immagini)
Generatore di funzioni: questa istruzione descrive il design del generatore di funzioni basato sul circuito integrato analogico MAX038 di Maxims. Il generatore di funzioni è uno strumento molto utile per i fanatici dell'elettronica. È necessario per sintonizzare i circuiti di risonanza, testare l'audio
Generatore di funzioni fai-da-te con STC MCU facilmente: 7 passaggi (con immagini)
Generatore di funzioni fai-da-te con STC MCU facilmente: questo è un generatore di funzioni realizzato con STC MCU. Servono solo diversi componenti e il circuito è semplice. Specifiche Uscita: Frequenza della forma d'onda quadra a canale singolo: 1Hz ~ 2MHz Frequenza della forma d'onda sinusoidale: 1Hz ~ 10kHz Ampiezza: VCC, circa 5V Capacità di carico
Generatore di funzioni portatile su Arduino: 7 passaggi (con immagini)
Generatore di funzioni portatile su Arduino: Il generatore di funzioni è uno strumento molto utile, specialmente quando stiamo considerando di testare la risposta del nostro circuito a un determinato segnale. In questo tutorial descriverò la sequenza di costruzione di un generatore di funzioni portatile, piccolo e facile da usare. Caratteristiche di
Realizzare immagini senza interruzioni solo orizzontalmente o verticalmente (per "The GIMP") .: 11 passaggi (con immagini)
Rendere le immagini senza cuciture solo orizzontalmente o verticalmente (per "The GIMP").: Se provi il plug-in "Rendi senza cuciture" in GIMP, renderà l'immagine perfetta sia orizzontalmente che verticalmente allo stesso tempo. Non ti permetterà di renderlo senza soluzione di continuità in una sola dimensione. Questo istruibile ti aiuterà a fare ima
Dispositivo di raffreddamento/supporto per laptop a costo zero (senza colla, senza foratura, senza dadi e bulloni, senza viti): 3 passaggi
Dispositivo di raffreddamento/supporto per laptop a costo zero (senza colla, senza foratura, senza dadi e bulloni, senza viti): AGGIORNAMENTO: PER FAVORE, PER FAVORE, PER FAVORE, PER IL MIO ISTRUTTORE, GRAZIE ^_^ POTRESTI ANCHE VOTARE PER IL MIO ALTRO CONCORSO ISCRIZIONE A www.instructables.com/id/Zero-Cost-Aluminum-Furnace-No-Propane-No-Glue-/ O FORSE VOTA PER IL MIO MIGLIORE AMICO