I lettori sono invitati a
prodotto fatto in casa autore di Instructables con il soprannome Gearboxmakers, che visualizza la distanza tra l'oggetto e il telemetro su un indicatore di scala e, se è troppo piccolo, suona una melodia.
Il master inizia a lavorare sul design elaborando il suo schema:
Le conclusioni per fornire energia al telemetro non sono mostrate nel diagramma, ma sul telemetro stesso sono disponibili tutti i simboli necessari.
I registri a scorrimento 74HC595 (KR1564IR52) qui sono i secondi componenti più importanti dopo
Arduino. Vengono spesso utilizzati quando è necessario gestire molti carichi, utilizzando solo due uscite dal microcontrollore. Molto semplificato, il loro principio di azione può essere descritto come segue. Digiti sulla tastiera, fisica o su schermo. Naturalmente, allo stesso tempo si premono i tasti a turno, in sequenza. Il risultato è una linea, tutti i segni che vedi sullo schermo contemporaneamente - in parallelo. Il numero di carichi controllati è facile da aumentare aggiungendo più registri di scorrimento alla catena. Il numero di uscite del microcontrollore interessato non aumenterà, ma con una velocità di trasferimento dati costante, la frequenza massima con cui è possibile accendere e spegnere ciascuno dei carichi diminuirà.
Poiché il numero di LED accesi contemporaneamente cambia, il master non riesce a gestire con un resistore comune: è necessario aggiungere un resistore a ciascun LED.
La procedura guidata assembla il dispositivo
fallo da solo su una breadboard di tipo perfboard e collega diversi conduttori all'Arduino, che servono a parallelizzare le linee elettriche e il filo comune, nonché a scambiare dati con il microcontrollore. I segnali dall'Arduino al dispositivo vengono utilizzati per controllare i registri a scorrimento, l'emettitore del suono e l'emettitore del telemetro e, nella direzione opposta, i segnali generati dal ricevitore del telemetro alla ricezione di oscillazioni riflesse. Successivamente, la scheda viene mostrata parzialmente assemblata:
La procedura guidata inizia a lavorare sul software, ottiene il seguente schizzo:
/ *
** Creato da: Charles Muchene
** @charlesmuchene
**
** Data: 3 ottobre 2013
**
** Tempo: 1412 ore
**
** Codice del misuratore di distanza
** Il sistema misura la distanza
** utilizzando il sensore ad ultrasuoni HC-SR04
** e lo traduce in una serie
** di LED accesi
**
** Divertiti e modificalo!
* /
/ * Libreria per le tonalità melodiche
** Descrive le frequenze da produrre * /
#include "pitches.h"
const int triggerPin = 10; // grilletto (verde)
const int echoPin = 9; // perno eco (arancione)
const int tonePin = 8; // tono pin (blu intero)
const int serialDataPin = 7; // pin dati seriale (arancione)
const int registerClockPin = 6; // registra il perno dell'orologio (marrone)
const int shiftRegisterClockPin = 5; // orologio del registro a scorrimento
const int numOfRegisters = 16; // numero di registri
const registri booleani [numOfRegisters]; // registra array
int litLEDs = 0; // contatore pin led
int range = 100; // valore di intervallo
int distance; // distanza
const int count = range / numOfRegisters; // (metri per LED)
// avvia melodia
int melody [] = {NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4, NOTE_DS8, NOTE_DS8};
// melodia a distanza critica
int criticalMelody [] = {NOTE_DS8, NOTE_DS8, NOTE_DS8, NOTE_DS8};
// durata delle note: 4 = nota da un quarto, 8 = ottava nota, ecc.
int noteDurations [] = {4, 8, 8, 4, 4, 4, 4, 4, 4, 2};
int criticalNoteDurations [] = {4, 4, 4, 4};
void setup ()
{
/ * Configurazioni dei pin * /
pinMode (triggerPin, OUTPUT);
pinMode (echoPin, INPUT);
pinMode (serialDataPin, OUTPUT);
pinMode (registerClockPin, OUTPUT);
pinMode (shiftRegisterClockPin, OUTPUT);
/ * Accendili * /
lightEmUp ();
/ * Avvia melodia * /
playMelody ();
/ * Spegni tutti i LED * /
clearRegisters ();
} // setup
/ * Ottieni la distanza da HC-SR04 * /
int getDistance ()
{
digitalWrite (triggerPin, LOW);
delayMicroseconds (2);
/ * Invia segnale trigger * /
digitalWrite (triggerPin, HIGH);
delayMicroseconds (10);
digitalWrite (triggerPin, LOW);
/ * distanza di ritorno in centimetri * /
return (pulseIn (echoPin, HIGH) / 2) / 29.1;
} // ottieni la distanza
// illumina tutti i led
void lightEmUp ()
{
per (int pin = 0; pin = 0; i--)
registri [i] = BASSO;
writeRegisters ();
} // cancella i registri
/ * Scrivi i valori di registro e li memorizza * /
void writeRegisters ()
{
/ * Con pin del clock di registro impostato su basso
** il contenuto del registro di archiviazione
** non vengono modificati dai valori del registro a scorrimento cambianti
** /
digitalWrite (registerClockPin, LOW);
/ * Passa attraverso tutti i registri * /
per (int i = numOfRegisters - 1; i> = 0; i--)
{
digitalWrite (shiftRegisterClockPin, LOW);
int val = registers [i];
digitalWrite (serialDataPin, val);
digitalWrite (shiftRegisterClockPin, HIGH);
} // esegue il loop di tutti i registri
/ * Questo segnale trasferisce il contenuto di
** del registro a scorrimento nei registri di archiviazione
* /
digitalWrite (registerClockPin, HIGH);
} // scrivere registri
// imposta un singolo pin ALTO o BASSO
void setRegisterPin (indice int, valore int)
{
registri [indice] = valore;
} // imposta il valore del pin del registro
/ * Riproduci start uMelody * /
void playMelody ()
{
per (int thisNote = 0; thisNote <10; thisNote ++)
{
/ * Per calcolare la durata della nota,
prendi un secondo diviso per tipo di nota
/ * ad es. nota da un quarto = 1000/4,
** ottava nota = 1000/8, ecc * /
int noteDuration = 1000 / noteDurations [thisNote];
tone (tonePin, melody [thisNote], noteDuration);
/ * Per distinguere le note, impostare un tempo minimo tra di loro.
** la durata della nota + 30% sembra funzionare bene * /
int pauseBetweenNotes = noteDuration * 1.30;
ritardo (pausa tra le note);
noTone (8);
} // tutte le note
} // play avvia melodia
/ * Critical Melody * /
void playCriticalMelody ()
{
per (int thisNote = 0; thisNote <4; thisNote ++)
{
int noteDuration = 1000 / noteDurations [thisNote];
tone (tonePin, criticalMelody [thisNote], noteDuration);
/ * Per distinguere le note, impostare un tempo minimo tra di loro.
** la durata della nota + 30% sembra funzionare bene * /
int pauseBetweenNotes = noteDuration * 1.30;
ritardo (pausa tra le note);
noTone (8);
} // esegue il ciclo di tutte le note
} // suona melodia critica
void loop ()
{
/ * Ottieni distanza * /
distance = getDistance ();
/ * Calcola i LED da illuminare * /
if (range> = distance)
litLEDs = (range - distance) / count;
altro
litLEDs = -1;
/ * LED luminosi a seconda della distanza calcolata * /
per (int pin = 0; pin = 13)
playCriticalMelody ();
} // loop
/ ******************************************************
* Definizione "Pitches.h"
*
* Costanti pubbliche
* Le costanti rappresentano le frequenze di tono
* delle rispettive note su un concerto standard
* accordatura di strumenti come un piano
****************************************************** /
#define NOTE_B0 31
#define NOTE_C1 33
#define NOTE_CS1 35
#define NOTE_D1 37
#define NOTE_DS1 39
#define NOTE_E1 41
#define NOTE_F1 44
#define NOTE_FS1 46
#define NOTE_G1 49
#define NOTE_GS1 52
#define NOTE_A1 55
#define NOTE_AS1 58
#define NOTE_B1 62
#define NOTE_C2 65
#define NOTE_CS2 69
#define NOTE_D2 73
#define NOTE_DS2 78
#define NOTE_E2 82
#define NOTE_F2 87
#define NOTE_FS2 93
#define NOTE_G2 98
#define NOTE_GS2 104
#define NOTE_A2 110
#define NOTE_AS2 117
#define NOTE_B2 123
#define NOTE_C3 131
#define NOTE_CS3 139
#define NOTE_D3 147
#define NOTE_DS3 156
#define NOTE_E3 165
#define NOTE_F3 175
#define NOTE_FS3 185
#define NOTE_G3 196
#define NOTE_GS3 208
#define NOTE_A3 220
#define NOTE_AS3 233
#define NOTE_B3 247
#define NOTE_C4 262
#define NOTE_CS4 277
#define NOTE_D4 294
#define NOTE_DS4 311
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_FS4 370
#define NOTE_G4 392
#define NOTE_GS4 415
#define NOTE_A4 440
#define NOTE_AS4 466
#define NOTE_B4 494
#define NOTE_C5 523
#define NOTE_CS5 554
#define NOTE_D5 587
#define NOTE_DS5 622
#define NOTE_E5 659
#define NOTE_F5 698
#define NOTE_FS5 740
#define NOTE_G5 784
#define NOTE_GS5 831
#define NOTE_A5 880
#define NOTE_AS5 932
#define NOTE_B5 988
#define NOTE_C6 1047
#define NOTE_CS6 1109
#define NOTE_D6 1175
#define NOTE_DS6 1245
#define NOTE_E6 1319
#define NOTE_F6 1397
#define NOTE_FS6 1480
#define NOTE_G6 1568
#define NOTE_GS6 1661
#define NOTE_A6 1760
#define NOTE_AS6 1865
#define NOTE_B6 1976
#define NOTE_C7 2093
#define NOTE_CS7 2217
#define NOTE_D7 2349
#define NOTE_DS7 2489
#define NOTE_E7 2637
#define NOTE_F7 2794
#define NOTE_FS7 2960
#define NOTE_G7 3136
#define NOTE_GS7 3322
#define NOTE_A7 3520
#define NOTE_AS7 3729
#define NOTE_B7 3951
#define NOTE_C8 4186
#define NOTE_CS8 4435
#define NOTE_D8 4699
#define NOTE_DS8 4978
Dopo aver completato l'assemblaggio e riempito lo schizzo, la procedura guidata mostra che è riuscito:
Il dispositivo può, ad esempio, informare un dipendente di un negozio di foto, un centro di copia, una riparazione di metalli, ecc. sull'aspetto del cliente.