Arduino и дисковый телефонный номеронабиратель

Доброго времени суток! Это статья — дополнение к видео, точнее, к двум видео о подключении дискового телефонного номеронабирателя к микроконтроллерной платформе Arduino.

Стоит отметить, что я – далеко не первый и отнюдь не единственный автор подобной идеи. Многие люди сделали такое до меня, я же лишь демонстрирую свои мысли и разработки.

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


Тов. micky madfree предложил подключить это все дело к сотовому телефону в качестве клавиатуры. Это легко можно сделать с помощью Arduino Leonardo. У меня этой платы нет, но специально для счастливых обладателей я оттуда же скопировал код для этого:

#include <Bounce.h>; //для снижения эффекта дребезга
Bounce bouncer = Bounce(2, 40);
int pulses = 0;

void setup() {
pinMode(2, INPUT);
pinMode(3, INPUT);
pinMode(13, OUTPUT);
Keyboard.begin();
}

void loop() {
while(digitalRead(3) == HIGH) { //пока идет набор
if (bouncer.update()) { //если произошло событие
if (bouncer.read()==0) { //если пришел сигнал с контактной группы
pulses++; //добавить 1 в переменную
bouncer.rebounce(500);
}
}
}
if(pulses > 0 && pulses < 10) { //чтобы в com порт шли только реальные цифры и ничего больше
Keyboard.print(pulses); //шлем в порт
pulses = 0; // обнуляем переменную
}
else if(pulses == 10) { //если с номеронабирателя пришло 10
pulses = 0; //то реальная цифра - ноль (особенности набирателя), заодно обнуляем переменную
Keyboard.print(pulses); //шлем в порт
}
}

Вот он и оригинальный скетч специально для тех, кто не смог найти его. Если кто-нибудь поможет мне переписать скетч с вечно ждущих while на прерывания – я буду ему безмерно благодарен и добавлю скетч в описание под видео и в эту статью.

#include <Bounce.h>;     //так проще устранять дребезг контактов ( http://www.arduino.cc/playground/uploads/Code/Bounce.zip )   
Bounce bouncer = Bounce(2, 40);

int pulses = 0; 
               
void setup() {
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  pinMode(13, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  while(digitalRead(3) == HIGH) {  //пока идет набор
  if (bouncer.update()) {     //если произошло событие
    if (bouncer.read()==0) {    //если пришел сигнал с контактной группы
      pulses++;                 //добавить 1 в переменную
      bouncer.rebounce(500); 
    }
  }
  }
  if(pulses > 0 && pulses < 10) {   //чтобы в com порт шли только реальные цифры и ничего больше
    Serial.println(pulses);        //шлем в порт
    pulses = 0;                     // обнуляем переменную
  }
  else if(pulses == 10) {          //если с номеронабирателя пришло 10
    pulses = 0;                    //то реальная цифра - ноль (особенности набирателя), заодно обнуляем переменную
    Serial.println(pulses);        //шлем в порт
  }
}

Далее, Кирилл из все того же ВК попросил меня разработать программу для запуска аудиофайлов с компьютера, при управлении с платы Arduino. Программа писалась в последнюю ночь на коленке и основана на программе-терминале от некого Андрея.

В общем, программа получает название аудиофайла по COM-порту и запускает его воспроизведение.

Скачать программу: https://yadi.sk/d/KWr9e8CxwVXyh


Также ко мне обратилась девушка Марина с просьбой помочь сделать СССР ретро телефон из вот такого набора.

Что ж, я могу посоветовать Вам несколько путей. Первый был описан выше, с Arduino Leonardo или Digispark, подключаемыми к современному смартфону. Второй – припаять по транзистору к каждой кнопке телефона и дергать их скетчем для товарища Daz123 (см. видео). Третий (самый простой и интересный, на мой взгляд) – взять этот белый телефон, выкинуть содержимое из трубки и вставить туда обыкновенные динамик и электретный микрофон, а в корпус – Arduino с подключенным номеронабирателем и каким-нибудь GSMshield’ом. Микрофон и динамик подключаются к соответствующим выводам, а номер набирать с помощью номеронабирателя. Если мне кто-нибудь отдаст для опытов GSM модуль и у меня будет достаточно времени – я обязательно попробую сделать что-нибудь типа этого.


А еще, Павел мне скинул скетч с кодовым замком и со словами «бывает, все зависает».

#include  //так проще устранять дребезг контактов 
Bounce bouncer = Bounce(2, 40); 
//#include  
//#include  
//Adafruit_PCD8544 display = Adafruit_PCD8544(18, 17, 16, 15, 14); 


int pulses = 0; 
int shet=0; 
int p[6]; //array for storing the password 
int c[6]; // array for storing the input code 
int n; 
int a=0; 
int i=0; 



void setup() { 
pinMode(2, INPUT); 
pinMode(3, INPUT); 
pinMode(13, OUTPUT); 
pinMode(4, OUTPUT); 
Serial.begin(9600); 
//display.begin(); // дисплей 
//display.clearDisplay(); 
//display.display(); 
//display.setContrast(50); // установка контраста 
//display.setTextSize(2); // установка размера шрифта 
//display.setTextColor(BLACK); // установка цвета текста 
//display.clearDisplay(); 
delay(1000); 
p[0]=1; //sets 1st digit of the password 
p[1]=2; // sets 2nd digit of the password 
p[2]=3; // sets 3rd digit of the password 
p[3]=1; // sets 4th digit of the password 
p[4]=2; // sets 5th digit of the password 
p[5]=3; // sets 6th digit of the password 

} 

void loop() { 
while(digitalRead(3) == HIGH) { //пока идет набор 
if (bouncer.update()) { //если произошло событие 
if (bouncer.read()==0) { //если пришел сигнал с контактной группы 
pulses++; //добавить 1 в переменную 
bouncer.rebounce(500); 
} 
} 
} 
if(pulses > 0 && pulses < 10) { //чтобы в com порт шли только реальные цифры и ничего больше 
n=pulses; 
Serial.println(pulses); //шлем в порт 
//display.print(pulses); 
//display.display(); 
pulses = 0; // обнуляем переменную 
shet++; 
a=1; 

} 
else if(pulses == 10) { //если с номеронабирателя пришло 10 
pulses = 0; //то реальная цифра - ноль (особенности набирателя), заодно обнуляем переменную 

Serial.println(pulses); //шлем в порт 
//display.print(pulses); 
//display.display(); 
shet++; 
a=1; 
} 
delay(200); 

if(shet == 7) { 

Serial.println("LONG"); 
//display.clearDisplay(); 
//display.println("LONG"); 
//display.display(); 
delay(3000); 
//display.clearDisplay(); 
//display.display(); 
pulses = 0; 
shet = 0; 
} 
delay(200); 
{ 
if(c[0]==p[0]&&c[1]==p[1]&&c[2]==p[2]&&c[3]==p[3]&&c[4]==p[4]&&c[5]==p[5]) 
{ 
digitalWrite(4, HIGH); //unlocks 
Serial.println("UNLOCKED"); 
//display.clearDisplay(); 
//display.println("UNLOCKED"); 
//display.display(); 
delay(3000); 
//display.clearDisplay(); 
//display.display(); 
digitalWrite(4, LOW); 

c[0] = 11; 
pulses = 0; 
shet = 0; 
} 

delay(200); 

if(a==1) // test whether a digit key is pressed 
{ 
c[i]=n; // saves the current digit pressed to array c 
i=i+1; 
a=0;} 
} 
}

Поскольку у меня нет дисплея 16х2 или подобного, я закомментировал все строки работы с дисплеем и мне не удалось воспроизвести проблему, работая с нормальным терминалом. А если Вы, Павел, пользуетесь SerialProjector’ом, то удаляйте его он некорректно работает с этим, да и с некоторыми другими скетчами.

Но я бы реализовал это несколько другим образом:

#include ;     //так проще устранять дребезг контактов ( http://www.arduino.cc/playground/uploads/Code/Bounce.zip )   
Bounce bouncer = Bounce(2, 40);

int pulses = 0; 
String pin = "123456";
String code = "";
bool locked = true;
               
void setup() {
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  pinMode(13, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  while(digitalRead(3) == HIGH) {  //пока идет набор
  if (bouncer.update()) {     //если произошло событие
    if (bouncer.read()==0) {    //если пришел сигнал с контактной группы
      pulses++;                 //добавить 1 в переменную
      bouncer.rebounce(500); 
    }
  }
  }
  if(pulses > 0 && pulses < 10) { //чтобы в com порт шли только реальные цифры и ничего больше code = code+String(pulses, DEC); Serial.println(code); pulses = 0; // обнуляем переменную } else if(pulses == 10) { //если с номеронабирателя пришло 10 pulses = 0; //то реальная цифра - ноль (особенности набирателя), заодно обнуляем переменную code = code+String(pulses, DEC); Serial.println(code); } if(code==pin && locked==true) { Serial.println("Unlocked"); digitalWrite(13, HIGH); locked = !locked; code=""; } if(code==pin && locked==false) { Serial.println("Locked"); digitalWrite(13, LOW); locked = !locked; code=""; } if(code.length() > pin.length()) {
    Serial.println("LONG");
    code="";
  }
}

Если возникнут какие-нибудь просьбы, идеи и пожелания – пишите в личные сообщения, комментарии, на стенах, асфальте или где угодно еще. Возможно, будет еще и третья часть о номеронабирателе. Видео о Arduino, видимо, пользуются популярностью.


Ссылки:

Андрей и его терминал: http://andreiprojects.blogspot.ru и http://andreiprojects.blogspot.ru/2011/09/c-serial-port-terminal.html

Программа для Кирилла: https://yadi.sk/d/KWr9e8CxwVXyh

Архив со всеми кодами и программами: ссылка будет позже

Добавить комментарий