Sommario:

Generatore di suoni Arduino senza libreria o funzioni seriali (con interruzioni): 10 passaggi
Generatore di suoni Arduino senza libreria o funzioni seriali (con interruzioni): 10 passaggi

Video: Generatore di suoni Arduino senza libreria o funzioni seriali (con interruzioni): 10 passaggi

Video: Generatore di suoni Arduino senza libreria o funzioni seriali (con interruzioni): 10 passaggi
Video: Programmare Arduino, Spiegato Facile per Tutti 2024, Dicembre
Anonim
Generatore di suoni Arduino senza libreria o funzioni seriali (con interruzioni)
Generatore di suoni Arduino senza libreria o funzioni seriali (con interruzioni)

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

Definizione degli indirizzi di registro
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

Array e variabili globali
Array e variabili globali
Array e variabili globali
Array e variabili globali
Array e variabili globali
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"

Il
Il

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"

Il
Il

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"

Il
Il

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"

Il
Il

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

La funzione di configurazione
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

Le funzioni Loop e ISR
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

Cablaggio
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: