Czytelnicy są zaproszeni do
domowej roboty autor Instructables pod pseudonimem Gearboxmakers, który wyświetla odległość między obiektem a dalmierzem na wskaźniku skali, a jeśli jest zbyt mały, gra melodię.
Mistrz rozpoczyna pracę nad projektem od opracowania jego schematu:
Wnioski dotyczące dostarczenia mocy do dalmierza nie są pokazane na schemacie, ale na samym dalmierzu dostępne są wszystkie niezbędne oznaczenia.
Przesunięcie rejestrów 74HC595 (KR1564IR52) tutaj jest drugim najważniejszym elementem po
Arduino. Są one często używane, gdy trzeba zarządzać wieloma obciążeniami, wykorzystując tylko dwa wyjścia z mikrokontrolera. Bardzo uproszczone, ich zasadę działania można opisać następująco. Pisasz na klawiaturze - fizycznej lub ekranowej. Oczywiście w tym samym czasie sekwencyjnie naciskasz klawisze. Rezultatem jest linia, której wszystkie znaki widać na ekranie w tym samym czasie - równolegle. Liczbę kontrolowanych obciążeń można łatwo zwiększyć, dodając więcej rejestrów przesuwnych do łańcucha. Liczba wyjść zaangażowanego mikrokontrolera nie wzrośnie, ale przy stałej prędkości przesyłania danych maksymalna częstotliwość, z jaką można włączać i wyłączać każde z obciążeń, maleje.
Ponieważ zmienia się liczba jednocześnie włączanych diod LED, master nie radzi sobie z jednym wspólnym rezystorem - musisz dodać rezystor do każdej diody LED.
Kreator składa urządzenie
zrób to sam na płycie typu perfboard i łączy kilka przewodów z Arduino, które służą do równoległego łączenia linii energetycznych i wspólnego przewodu, a także do wymiany danych z mikrokontrolerem. Sygnały sterujące z rejestrów przesuwnych, nadajnika dźwięku i nadajnika dalmierza są przesyłane z Arduino do urządzenia, a sygnały generowane przez odbiornik dalmierza po odebraniu oscylacji odbitej są przesyłane do urządzenia. Następnie tablica jest częściowo zmontowana:
Kreator rozpoczyna pracę nad oprogramowaniem, otrzymuje następujący szkic:
/ *
** Utworzony przez: Charles Muchene
** @charlesmuchene
**
** Data: 3 października 2013 r
**
** Czas: 1412 godzin
**
** Kod licznika odległości
** System mierzy odległość
** przy użyciu czujnika ultradźwiękowego HC-SR04
** i przekłada to na serię
** świecących diod LED
**
** Baw się dobrze i popraw go!
* /
/ * Biblioteka dźwięków melodycznych
** Opisuje częstotliwości, które mają być wytwarzane * /
#include „pitchches.h”
const int triggerPin = 10; // pin spustowy (zielony)
const int echoPin = 9; // pin echo (pomarańczowy)
const int tonePin = 8; // tonu pin (whilte-niebieski)
const int serialDataPin = 7; // pin danych szeregowych (pomarańczowy)
const int registerClockPin = 6; // zarejestruj zegar pin (brązowy)
const int shiftRegisterClockPin = 5; // zegar rejestru przesuwnego
const int numOfRegisters = 16; // liczba rejestrów
const logiczne rejestry [numOfRegisters]; // zarejestruj tablicę
int litLEDs = 0; // ledowy licznik pinów
zakres int = 100; // wartość zakresu
int odległość; // odległość
const int count = range / numOfRegisters; // (metry na LED)
// melodia początkowa
int melody [] = {NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4, NOTE_DS8, NOTE_DS8};
// krytyczna melodia odległości
intrytiveMelody [] = {NOTE_DS8, NOTE_DS8, NOTE_DS8, NOTE_DS8};
// czas trwania nuty: 4 = ćwierćnuta, 8 = ósma nuta itp.
int noteDurations [] = {4, 8, 8, 4, 4, 4, 4, 4, 4, 2};
int krytyczneNoteDuracje [] = {4, 4, 4, 4};
void setup ()
{
/ * Konfiguracje styków * /
pinMode (triggerPin, OUTPUT);
pinMode (echoPin, INPUT);
pinMode (serialDataPin, OUTPUT);
pinMode (registerClockPin, OUTPUT);
pinMode (shiftRegisterClockPin, OUTPUT);
/ * Rozpal je * /
lightEmUp ();
/ * Rozpocznij melodię * /
playMelody ();
/ * Wyłącz wszystkie diody LED * /
clearRegisters ();
} // setup
/ * Uzyskaj odległość od HC-SR04 * /
int getDistance ()
{
digitalWrite (triggerPin, LOW);
delayMicroseconds (2);
/ * Wyślij sygnał wyzwalający * /
digitalWrite (triggerPin, HIGH);
delayMicroseconds (10);
digitalWrite (triggerPin, LOW);
/ * odległość powrotna w centymetrach * /
return (pulseIn (echoPin, HIGH) / 2) / 29,1;
} // uzyskać dystans
// zapal wszystkie diody LED
void lightEmUp ()
{
dla (int pin = 0; pin = 0; i--)
rejestry [i] = LOW;
writeRegisters ();
} // wyczyść rejestry
/ * Zapisz wartości rejestru i zapisz je * /
void writeRegisters ()
{
/ * Przy niskim ustawieniu pinów zegara rejestru
** zawartość rejestru pamięci
** nie są zmieniane przez zmianę wartości rejestru przesuwnego
** /
digitalWrite (registerClockPin, LOW);
/ * Pętla przez wszystkie rejestry * /
for (int i = numOfRegisters - 1; i> = 0; i--)
{
digitalWrite (shiftRegisterClockPin, LOW);
int val = rejestry [i];
digitalWrite (serialDataPin, val);
digitalWrite (shiftRegisterClockPin, HIGH);
} // zapętla wszystkie rejestry
/ * Ten sygnał przenosi zawartość
** rejestru przesuwnego do rejestrów pamięci
* /
digitalWrite (registerClockPin, HIGH);
} // zapisywanie rejestrów
// ustaw indywidualny pin WYSOKI lub NISKI
void setRegisterPin (indeks int, wartość int)
{
rejestry [indeks] = wartość;
} // ustaw wartość PIN rejestru
/ * Odtwórz start uMelody * /
void playMelody ()
{
for (int thisNote = 0; thisNote <10; thisNote ++)
{
/ * Aby obliczyć czas trwania nuty,
weź jedną sekundę podzieloną według typu nuty
/ * np. ćwierćnuta = 1000/4,
** ósma nuta = 1000/8 itp. * /
int noteDuration = 1000 / noteDurations [thisNote];
tone (tonePin, melodia [thisNote], noteDuration);
/ * Aby rozróżnić nuty, ustaw minimalny czas między nimi.
** czas trwania notatki + 30% wydaje się działać dobrze * /
int pauseBetweenNotes = noteDuration * 1.30;
delay (pauseBetweenNotes);
noTone (8);
} // wszystkie notatki
} // play melodia startowa
/ * Critical Melody * /
void playCriticalMelody ()
{
for (int thisNote = 0; thisNote <4; thisNote ++)
{
int noteDuration = 1000 / noteDurations [thisNote];
tone (tonePin, krytyczneMelody [thisNote], noteDuration);
/ * Aby rozróżnić nuty, ustaw minimalny czas między nimi.
** czas trwania notatki + 30% wydaje się działać dobrze * /
int pauseBetweenNotes = noteDuration * 1.30;
delay (pauseBetweenNotes);
noTone (8);
} // zapętlić wszystkie notatki
} // odtwórz melodię krytyczną
void loop ()
{
/ * Uzyskaj odległość * /
odległość = getDistance ();
/ * Oblicz diody LED do włączenia * /
if (zakres> = odległość)
litLEDs = (zakres - odległość) / liczba;
jeszcze
litLEDs = -1;
/ * Diody LED światła w zależności od obliczonej odległości * /
dla (int pin = 0; pin = 13)
playCriticalMelody ();
} // loop
/ ****************************************************
* Definicja „Pitches.h”
*
* Stałe publiczne
* Stałe reprezentują częstotliwości skoku
* odpowiednich nut na standardowym koncercie
* strojenie instrumentów, takie jak fortepian
**************************************************** /
# zdefiniować NOTE_B0 31
# zdefiniować NOTE_C1 33
# zdefiniować NOTE_CS1 35
# zdefiniować UWAGA_D1 37
# zdefiniować NOTE_DS1 39
# zdefiniować NOTE_E1 41
# zdefiniować NOTE_F1 44
# zdefiniować NOTE_FS1 46
# zdefiniować NOTE_G1 49
# zdefiniować NOTE_GS1 52
# zdefiniować UWAGA_A1 55
# zdefiniować NOTE_AS1 58
# zdefiniować NOTE_B1 62
# zdefiniować NOTE_C2 65
# zdefiniować NOTE_CS2 69
# zdefiniować NOTE_D2 73
# zdefiniować NOTE_DS2 78
# zdefiniować NOTE_E2 82
# zdefiniować NOTE_F2 87
# zdefiniować NOTE_FS2 93
# zdefiniować NOTE_G2 98
# zdefiniować NOTE_GS2 104
# zdefiniować NOTE_A2 110
# zdefiniować NOTE_AS2 117
# zdefiniować NOTE_B2 123
# zdefiniować NOTE_C3 131
# zdefiniować NOTE_CS3 139
# zdefiniować NOTE_D3 147
# zdefiniować NOTE_DS3 156
# zdefiniować NOTE_E3 165
# zdefiniować NOTE_F3 175
# zdefiniować NOTE_FS3 185
# zdefiniować NOTE_G3 196
# zdefiniować NOTE_GS3 208
# zdefiniować NOTE_A3 220
# zdefiniować NOTE_AS3 233
# zdefiniować NOTE_B3 247
# zdefiniować NOTE_C4 262
# zdefiniować NOTE_CS4 277
# zdefiniować NOTE_D4 294
# zdefiniować NOTE_DS4 311
# zdefiniować NOTE_E4 330
# zdefiniować NOTE_F4 349
# zdefiniować NOTE_FS4 370
# zdefiniować NOTE_G4 392
# zdefiniować NOTE_GS4 415
# zdefiniować NOTE_A4 440
# zdefiniować NOTE_AS4 466
# zdefiniować NOTE_B4 494
# zdefiniować NOTE_C5 523
# zdefiniować NOTE_CS5 554
# zdefiniować NOTE_D5 587
# zdefiniować NOTE_DS5 622
# zdefiniować NOTE_E5 659
# zdefiniować NOTE_F5 698
# zdefiniować NOTE_FS5 740
# zdefiniować NOTE_G5 784
# zdefiniować NOTE_GS5 831
# zdefiniować NOTE_A5 880
# zdefiniować NOTE_AS5 932
# zdefiniować NOTE_B5 988
# zdefiniować NOTE_C6 1047
# zdefiniować NOTE_CS6 1109
# zdefiniować NOTE_D6 1175
# zdefiniować NOTE_DS6 1245
# zdefiniować NOTE_E6 1319
# zdefiniować NOTE_F6 1397
# zdefiniować NOTE_FS6 1480
# zdefiniować NOTE_G6 1568
# zdefiniować NOTE_GS6 1661
# zdefiniować NOTE_A6 1760
# zdefiniować NOTE_AS6 1865
# zdefiniować NOTE_B6 1976
# zdefiniować NOTE_C7 2093
# zdefiniować NOTE_CS7 2217
# zdefiniować NOTE_D7 2349
# zdefiniować NOTE_DS7 2489
# zdefiniować NOTE_E7 2637
# zdefiniować NOTE_F7 2794
# zdefiniować NOTE_FS7 2960
# zdefiniować NOTE_G7 3136
# zdefiniować NOTE_GS7 3322
# zdefiniować NOTE_A7 3520
# zdefiniować NOTE_AS7 3729
# zdefiniować NOTE_B7 3951
# zdefiniować NOTE_C8 4186
# zdefiniować NOTE_CS8 4435
# zdefiniować NOTE_D8 4699
# zdefiniować NOTE_DS8 4978
Po zakończeniu montażu i wypełnieniu szkicu kreator pokazuje, że mu się udało:
Urządzenie może na przykład poinformować pracownika sklepu fotograficznego, centrum kopiowania, naprawy metalu itp. o wyglądzie klienta.