Управление нагрузкой через LPD радиостанции

Werewolf
Offline
Зарегистрирован: 06.01.2016

Представляю небольшой проект по управлению нагрузкой через LPD радиостанции.

Аппаратная часть состоит из:

1.       Arduino UNO;

2.       DTMF декодер на чипе MT8870;

3.       3 реле с управлением 5В.

4.       2 рации Baofeng UV-5R. Настроены на одну частоту, включен режим DTS.

 

Соединение компонентов (без цепей питания):

Вывод Arduino UNO

Вывод декодера MT8870

Принимающая рация

Реле1

Реле2

Реле3

2

Q1

 

 

 

 

3

Q2

 

 

 

 

4

Q3

 

 

 

 

5

Q4

 

 

 

 

6

 

SPK

 

 

 

7

 

PPT

 

 

 

8

 

 

IN

 

 

9

 

 

 

IN

 

10

 

 

 

 

IN

A0

EST

 

 

 

 

A1

STQ

 

 

 

 

 

Реле, декодер собраны на шилде, который надевается на UNO. Питание – 9В через разъем UNO. Дополнительно на шилде смонтирован 5В стабилизатор, чтобы не нагружать стаб на UNO.

 

Принцип работы:

Код настроен на включение/выключение 1-го реле кнопками «стрелка вверх»/ «стрелка вниз», 2-е реле – «2»/«3», 3-е реле – «5»/«6» на передающей рации. Кнопка «EXIT» отключает все реле одновременно.

При нажатии како-либо из упомянутых кнопок на передающей рации с нажатой кнопкой PPT, принимающая рация получает согнал, декодирует DTMF код и производит включение/выключение нужного реле. После окончания передачи сигнала, принимающая рация входит в режим передачи и передает короткий тональный код (настраивается в самой рации). Передающая рация принимает сигнал, который является подтверждением выполнения команды.

Таким образом реализована обратная связь – вы всегда будете знать – прошел сигнал или нет. Это особо актуально для LPD раций, дистанций работы которых в условиях городской застройки может быть разной.

Небольшое видео по работе первого прототипа здесь https://youtu.be/QcEQt00XMGs

Werewolf
Offline
Зарегистрирован: 06.01.2016

Код:

void setup() {
  // put your setup code here, to run once:
pinMode (2,INPUT); //Q1
pinMode (3,INPUT); //Q2
pinMode (4,INPUT); //Q3
pinMode (5,INPUT); //Q4
pinMode (6,INPUT); //MONI
pinMode (7,OUTPUT); //TRANSMIT
pinMode (A1,INPUT); //STQ
pinMode (A0,INPUT); //EST
pinMode (8,OUTPUT); //RElAY 1
pinMode (9,OUTPUT); //RELAY 2
pinMode (10,OUTPUT);//RELAY 3
pinMode (13,OUTPUT);
digitalWrite (2, LOW);
digitalWrite (3, LOW);
digitalWrite (4, LOW);
digitalWrite (5, LOW);
digitalWrite (6, LOW);
digitalWrite (7, LOW);
digitalWrite (8, HIGH);
digitalWrite (9, HIGH);
digitalWrite (10, HIGH);
digitalWrite (13, LOW);
Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
CHECK:
byte MONI=digitalRead(6);
//int TONE=analogRead(A1);
byte EST=digitalRead(A0);
//Serial.println(MONI);
//Serial.println(EST);
//Serial.println('X');
//delay(50);
if(MONI==HIGH && EST==LOW)
{
delay(20);
//byte DTMF1=digitalRead(2);
//byte DTMF2=digitalRead(3);
//byte DTMF3=digitalRead(4);
//byte DTMF4=digitalRead(5);
byte DTMFbyte;
bitWrite (DTMFbyte,0,digitalRead(2)); //
bitWrite (DTMFbyte,1,digitalRead(3)); //
bitWrite (DTMFbyte,2,digitalRead(4)); //
bitWrite (DTMFbyte,3,digitalRead(5)); //Запись числа в переменную DTMFbyte
bitWrite (DTMFbyte,4,0);              //
bitWrite (DTMFbyte,5,0);              //
bitWrite (DTMFbyte,6,0);              //
//word DTMFdec=1000*DTMF4+100*DTMF3+10*DTMF2+DTMF1;
//Serial.println(DTMFdec,DEC);
Serial.println(DTMFbyte);
Serial.println(EST);
  switch (DTMFbyte) {
      case 14:
      digitalWrite (8, LOW);
      goto TRANSMIT;
      break;
      case 15:
      digitalWrite (8, HIGH);
      goto TRANSMIT;
      break;
      case 2:
      digitalWrite (9, LOW);
      goto TRANSMIT;
      break;
      case 3:
      digitalWrite (9, HIGH);
      goto TRANSMIT;
      break;
      case 5:
      digitalWrite (10, LOW);
      goto TRANSMIT;
      break;
      case 6:
      digitalWrite (10, HIGH);
      goto TRANSMIT;
      break;
      case 0:
      digitalWrite (8, HIGH);
      digitalWrite (9, HIGH);
      digitalWrite (10, HIGH);
      goto TRANSMIT;
      break;
      default: 
      goto CHECK;
      break;
     }
}
else
{
goto CHECK;
}
TRANSMIT:
byte MONI_1=digitalRead(6);
byte EST_1=digitalRead(A0);
Serial.println(MONI_1);
if(MONI_1==LOW && EST_1==HIGH)
{
delay(50);
digitalWrite (7, HIGH);
delay(600);
digitalWrite (7, LOW);
goto CHECK;
}
else
{
goto TRANSMIT;
}
}

 

Barny
Offline
Зарегистрирован: 23.01.2015

Делаю что-то подобное. Как реализовали нажатие кнопки ?

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Предположу, что через разъем тангенты (pin 7 arduino).

Barny
Offline
Зарегистрирован: 23.01.2015

Очень смешно. Что бы включить передачу, нужно замкнуть два пина разьема гарнитуры на 1 кОм, в разомкнутом состоянии должно быть почти 2 кОм. Иначе передача не активиуется. Резисторов тут не видно.

ЗЫ. Разобрался, тут совсем другой каленкор. Используется DTMF совместимая рация.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Но все равно пином 7 он что-то блинкает.

Barny
Offline
Зарегистрирован: 23.01.2015

Да там же рация грубо говоря цыфровая. Можно управлять напрямую с контроллера. На станции без DTMF такое не прокатит.