Главная » Бытовая электроника » Делаем простой переключатель хлопка на PIC12F683. Схема и описание

Делаем простой переключатель хлопка на PIC12F683. Схема и описание

Переключатель хлопков — забавный электронный проект для начинающих радиолюбителей. Это устройство включает и выключает электроприборы от звука хлопка в ладоши.

Сегодня мы обсудим создание простого переключателя хлопка, который срабатывает при обнаружении двух хлопков подряд. Здесь в качестве звукового датчика выступает электретный микрофон, преобразующий звук в электрический сигнал.

Поскольку сигнал с микрофона очень слабый, мы его усиливаем транзистором, а уже затем отправляем на вход микроконтроллера PIC12F683, который выполняет обработку данного сигнала.

простой переключатель хлопка на PIC12F683

Немного теории

Переключатель хлопков требует наличия на входе какого-либо преобразователя, который бы вырабатывал электрический сигнал под действием звука. Как правило, для этого используют электретный микрофон или просто микрофон (OBO-04FN-0B).

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

Когда нет звука, напряжение на коллекторе (Vout) транзистора (2N3904), который находится в состоянии насыщения, составляет примерно 0,2 В. Когда микрофон улавливает звук хлопка, напряжение на нем резко падает.

Поскольку выход микрофона связан с базой транзистора через конденсатор C1, то напряжение база-эмиттер также снижается, и поэтому переход база-эмиттер менее смещен в прямом направлении или отсечен (в случае сильного хлопка). Следовательно, каждый раз, когда обнаруживается хлопок, возникает резкий пик напряжения на коллекторе.

На следующем рисунке показаны пики напряжения коллектора после нескольких хлопков. Вы можете видеть, что пиковое напряжение может доходить до 4,0 В в зависимости от громкости хлопка.

Теперь мы знаем, как преобразовать звук хлопка в электрический сигнал. Следующим этапом является подача этого сигнала на микроконтроллер PIC12F683 для каких-либо действий.

Микроконтроллер PIC12F683 имеет встроенный модуль компаратора, который можно использовать для сравнения двух аналоговых напряжений и получения цифровой индикации их относительных величин.

Модуль компаратора может работать в восьми различных режимах в зависимости от настроек битов CM2…CM 0 в регистре CMCON0. Для наших целей мы настроим его так:

CM<2:0> = 100

Контакт CIN- настроен как аналоговый вывод, контакты CIN+ и COUT настроены как I/O, выход компаратора доступен внутри, CVREF — неинвертирующий вход (см. рисунок ниже).

 

Мы сравниваем выходное напряжение коллектора (Vout) с внутренним опорным напряжением. Опорное напряжение внутренне соединено с положительным входом CIN+ модуля компаратора, в то время как выходное напряжение от усилителя поступает на отрицательный вход (CIN-) компаратора.

Вывод CIN мультиплексирован с I/O выводом GP1 микроконтроллера PIC12F683. Величина опорного напряжения программируется и управляется с помощью VRCON регистра. Мы установим опорное напряжение на уровне 0,625 В (предполагается, что напряжение питания 5,0 В).

Таким образом, в нормальных условиях опорное напряжение (0,625 В) больше, чем Vout (0,2 В), а выход компаратора (COUT) находиться в высоком состоянии. COUT доступен как изнутри, так и снаружи на I/O выводе GP2.

Когда раздается хлопок, COUT переходит в низкое состояние. Логику выхода компаратора можно инвертировать, установив бит инверсии выхода компаратора (CIN) в регистре CMCON0.

Микроконтроллер PIC12F683 может быть запрограммирован на выполнение коммутационных действий в зависимости от выхода компаратора.

Принципиальная электрическая схема

Полная принципиальная схема этого простого проекта переключение по хлопку показана ниже. Положительный и отрицательный входы внутреннего модуля компаратора доступны извне через выводы GP0 (CIN+) и GP1 (CIN-) соответственно.

Поскольку положительный вход подключен к внутреннему источнику опорного напряжения, вывод GP1 можно использовать в качестве I/O вывода. Выход от усилителя микрофона поступает на GP0.

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

Программное обеспечение

Программа написана на языке Си и скомпилирована с помощью MikroC Pro for PIC compiler. Программа непрерывно ищет два подряд хлопка с интервалом в 1,5 секунды.

Если это произойдет, то вывод GP5 переключается. При обнаружении первого хлопка включается Timer1 для отсчета времени. Он генерирует сигнал тайм-аута через 1,5 секунды. Если в течении этого времени нет второго хлопка, то микроконтроллер игнорирует первый хлопок и возвращается к основной программе.

/*
 MCU: PIC12F683
 Oscillator: Internal 4.0000 MHz, MCLR Disabled, PWRT ON enabled
*/
 
sbit Output_LED at GP5_bit;
unsigned short i, TIME_UP;
 
void interrupt(void){
  if(PIR1.TMR1IF) {
    i ++;
    if(i == 3) TIME_UP = 1;  // Время до 1,5 сек.
    PIR1.TMR1IF = 0;
 }
}
 
void main() {
  TRISIO = 0b00000011 ;
  ANSEL = 0x00;
  INTCON = 0b11000000 ; // Включить GIE и PEE для прерывания переполнения Timer1
  PIE1 = 0b00000001 ;   // Включить TMR1IE
 
   // Настройка модуля компаратора
   // Вывод CIN настроен как аналоговый,
   // Вывод CIN + настроен как ввод / вывод,
   // Вывод COUT настроен как ввод / вывод,
   // Выход компаратора доступен внутри,
   // CVREF не инвертирующий ввод
   // CINV установлен на 1
  CMCON0 = 0b00010100;
  VRCON  = 0b10100011;  // Vref установлен на VDD/8
  Output_LED = 0;
  do{
     TMR1H = 0x00;
     TMR1L = 0x00;
     TIME_UP = 0;
     i = 0;
     T1CON = 0b00110000;   // Настройка Timer 1
     if(CMCON0.COUT){      // Обнаружен первый хлопок
       Delay_ms(100);
       T1CON.TMR1ON = 1;   // Старт Timer1
       while(!CMCON0.COUT && !TIME_UP); // Ждем второй хлопок
       T1CON.TMR1ON = 0;                      // Обнаружен или Timer1 переполнился
       if(CMCON0.COUT && !TIME_UP) Output_LED = ~Output_LED;
       Delay_ms(100);
     }
  }  while(1);
}

 

Оставить комментарий

Ваш email нигде не будет показан. Обязательные для заполнения поля помечены *

*