Шкальный индикатор расстояния со звуковым сигналом - Своими руками
Своими руками

Шкальный индикатор расстояния со звуковым сигналом


Вниманию читателей предлагается самоделка автора Instructables под ником Gearboxmakers, отображающая на шкальном индикаторе расстояние между объектом и дальномером, а если оно слишком мало, играющее мелодию.
Работу над конструкцией мастер начинает с составления её схемы:

Шкальный индикатор расстояния со звуковым сигналом
Выводы для подачи на дальномер питания на схеме не показаны, но на самом дальномере все необходимые обозначения имеются.

Сдвиговые регистры 74HC595 (КР1564ИР52) здесь – вторые по важности компоненты после Arduino. Они часто применяются, когда нужно управлять множеством нагрузок, задействовав у микроконтроллера всего два вывода. Очень упрощённо их принцип действия можно описать так. Вы набираете текст на клавиатуре – физической или экранной. Естественно, при этом вы нажимаете клавиши по очереди, последовательно. Результатом же становится строка, все знаки которой вы видите на экране одновременно – параллельно. Количество управляемых нагрузок легко наращивать, добавляя в цепочку ещё сдвиговые регистры. Количество задействованных при этом выводов микроконтроллера не увеличится, но при неизменной скорости передачи данных уменьшится максимальная частота, с которой можно включать и выключать каждую из нагрузок.
Поскольку количество одновременно включённых светодиодов меняется, обойтись одним общим резистором мастеру не удаётся – приходится добавлять по резистору к каждому светодиоду.
Мастер собирает устройство своими руками на макетной плате типа perfboard и соединяет с Arduino несколькими проводниками, служащими для запараллеливания линий питания и общего провода, а также обмена данными с микроконтроллером. От Arduino к устройству передаются сигналы управления сдвиговыми регистрами, звукоизлучателем и излучателем дальномера, а в обратную сторону – сигналы, вырабатываемые приёмником дальномера при поступлении отражённых колебаний. Далее плата показана собранной частично:

Шкальный индикатор расстояния со звуковым сигналом
Мастер приступает к работе над ПО, у него получается такой скетч:

Шкальный индикатор расстояния со звуковым сигналом Скетч здесь/*
** Created by: Charles Muchene
** @charlesmuchene
**
** Date: 3rd October 2013
**
** Time: 1412hrs
**
** Distance meter code
** The system measures the distance
** using HC-SR04 ultrasonic sensor
** and translates it into a series
** of lit LEDs
**
** Have fun and tweak it!
*/
/* Library for the melodic pitches
** It describes the frequencies to be produced*/
#include "pitches.h"

const int triggerPin = 10; //trigger pin (green)
const int echoPin = 9; //echo pin (orange)
const int tonePin = 8; //tone pin (whilte-blue)
const int serialDataPin = 7; //serial data pin (orange)
const int registerClockPin = 6; //register clock pin (brown)
const int shiftRegisterClockPin = 5; //shift register clock
const int numOfRegisters = 16; //number of registers

const boolean registers[numOfRegisters]; //register array
int litLEDs = 0; //led pin counter
int range = 100; //range value
int distance; //distance

const int count = range / numOfRegisters; // (meters per LED)

// start up melody
int melody[] = {NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4, NOTE_DS8, NOTE_DS8};

// critical distance melody
int criticalMelody[] = {NOTE_DS8, NOTE_DS8, NOTE_DS8, NOTE_DS8};

// note durations: 4 = quarter note, 8 = eighth note, etc.
int noteDurations[] = {4, 8, 8, 4, 4, 4, 4, 4, 4, 2};
int criticalNoteDurations[] = {4, 4, 4, 4};

void setup()
{
/*Pin configurations*/
pinMode(triggerPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(serialDataPin, OUTPUT);
pinMode(registerClockPin, OUTPUT);
pinMode(shiftRegisterClockPin, OUTPUT);

/*Light 'em up*/
lightEmUp();

/*Start melody*/
playMelody();

/*Turn off all LEDs*/
clearRegisters();

} // setup

/*Get distance from HC-SR04*/
int getDistance()
{
digitalWrite(triggerPin, LOW);
delayMicroseconds(2);
/*Send trigger signal*/
digitalWrite(triggerPin, HIGH);
delayMicroseconds(10);
digitalWrite(triggerPin, LOW);

/*return distance in centimeters*/
return (pulseIn(echoPin, HIGH) / 2) / 29.1;
} //get distance

//light all leds
void lightEmUp()
{
for (int pin = 0; pin < numOfRegisters; pin++)
registers[pin] = HIGH;

writeRegisters();
} //light 'em up

//set all register pins to LOW
void clearRegisters()
{
for(int i = numOfRegisters – 1; i >= 0; i–)
registers[i] = LOW;
writeRegisters();
} //clear registers
/*Write register values and store them*/
void writeRegisters()
{
/*With register clock pin set low
**the contents of the storage register
**are not changed by the changing shift register values
**/
digitalWrite(registerClockPin, LOW);

/*Loop through all the registers*/
for(int i = numOfRegisters – 1; i >= 0; i–)
{
digitalWrite(shiftRegisterClockPin, LOW);
int val = registers[i];
digitalWrite(serialDataPin, val);
digitalWrite(shiftRegisterClockPin, HIGH);
} // loops all registers

/*This signal tranfers the contents of
**of the shift register to the storage registers
*/
digitalWrite(registerClockPin, HIGH);
} //write registers

//set an individual pin HIGH or LOW
void setRegisterPin(int index, int value)
{
registers[index] = value;
} //set register pin value

/*Play start uMelody*/
void playMelody()
{
for (int thisNote = 0; thisNote < 10; thisNote++)
{
/* To calculate the note duration,
take one second divided by note type
/* e.g. quarter note = 1000 / 4,
** eighth note = 1000/8, etc */
int noteDuration = 1000/noteDurations[thisNote];
tone(tonePin, melody[thisNote], noteDuration);

/* To distinguish the notes, set a minimum time between them.
** the note's duration + 30% seems to work well */
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
noTone(8);
} // all notes
} //play start up melody

/*Critical Melody*/
void playCriticalMelody()
{
for (int thisNote = 0; thisNote < 4; thisNote++)
{
int noteDuration = 1000/noteDurations[thisNote];

tone(tonePin, criticalMelody[thisNote], noteDuration);

/* To distinguish the notes, set a minimum time between them.
** the note's duration + 30% seems to work well*/
int pauseBetweenNotes = noteDuration * 1.30;

delay(pauseBetweenNotes);

noTone(8);

} // loop all notes

} //play critical melody

void loop()
{
/*Get distance*/
distance = getDistance();

/*Calculate the LEDs to light*/
if (range >= distance)
litLEDs = (range – distance) / count;
else
litLEDs = -1;

/*Light LEDs depending on the distance calculated*/
for (int pin = 0; pin < numOfRegisters; pin++)
{
if (pin <= litLEDs)
setRegisterPin(pin, HIGH);
else
setRegisterPin(pin, LOW);
} //for loop

writeRegisters(); // effect changes

/*Play critical proximity melody*/
if (litLEDs >= 13)
playCriticalMelody();

} //loop
/*************************************************
* “pitches.h” definition
*
* Public Constants
* The constants represent the pitch frequencies
* of the respective notes on a standard concert
* instrument tuning such as a 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

Завершив сборку и залив скетч, мастер показывает, что у него получилось:

Шкальный индикатор расстояния со звуковым сигналом
Устройство может, например, сообщать сотруднику фотоателье, копировального центра, металлоремонта, и т.п. о появлении клиента.

SitesReady

Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного. - Альберт Эйнштейн

Follow us

Don't be shy, get in touch. We love meeting interesting people and making new friends.