Как стать автором
Обновить
2699.34
RUVDS.com
VDS/VPS-хостинг. Скидка 15% по коду HABR15

Секретная китайская плата: электронный шагомер

Уровень сложностиПростой
Время на прочтение7 мин
Количество просмотров6.7K


Привет, Хабр! У вас ещё не было DIY-проектов с акселерометрами? — Тогда почему бы не начать прямо сегодня?

В этом проекте есть и операционные усилители, и семисегментные индикаторы с дешифраторами и счётчиками. Так что, несмотря на простоту схемы, она не оставит равнодушными интересующихся аналоговой и цифровой электроникой.

▍ Шагомеры, осциллографы и многое другое


Понять, что такое акселерометр, нам поможет «секретный» китайский радиоконструктор. Такие наборы деталей предназначаются для конкурсов и экзаменов и традиционно содержат пару ошибок, которые надо найти и устранить.

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

Сегодняшняя «секретная» плата предназначалась для конкурса профессионального мастерства «Сборка и применение электронных схем», проведённого среди обучающихся средних профессиональных училищ округа Дунгуань в октябре 2018 года.



Конструкторы производятся в избыточном количестве, и после завершения мероприятия предприимчивые изготовители выставляют излишки на Алиэкспресс. Я постоянно охочусь за ними, и на сегодняшний день виртуальный «зал трофеев» насчитывает девятнадцать экспонатов.

  1. ШИМ-регулятор на операционных усилителях
  2. Кодовый замок
  3. Световой эффект на регистре сдвига
  4. Электронный экзаменатор
  5. Простой цифровой частотомер без микроконтроллера
  6. Регулятор яркости светодиода
  7. Два секундомера на логических микросхемах
  8. Простой контроллер светофора
  9. Таймер обратного отсчёта
  10. Исключающее ИЛИ и двоичный полусумматор
  11. Резистивный цифро-аналоговый преобразователь
  12. Контроллер стиральной машины
  13. Многоканальная охранная сигнализация
  14. Как работает шариковая мышка?
  15. Усовершенствованный частотомер без микроконтроллера
  16. Продвинутый контроллер светофора
  17. Очень простой тахометр на интересных микросхемах
  18. Стабилизатор напряжения с цифровым управлением, но без микроконтроллера
  19. Инфракрасный датчик периметра

На всё про всё конкурсантам отводилось 240 минут (4 часа), но за это время требовалось собрать, наладить и испытать не только модель электронного шагомера, но и простой цифровой осциллограф, а также нарисовать в Altium Designer схему бегущих огней на десятичном счётчике-дешифраторе CD4017 (K561ИЕ8) и прецизионном таймере NE555 (КР1006ВИ1).



Судя по прилагаемым иллюстрациям, это не MiNi-DSO от 56DZ.COM и не DSO138 от JYE Tech, а разработка 2013 года на базе Ардуино, от которой мне удалось найти только код.

/*
    Цифровой осциллограф на Arduino
    Автор: ntwhq@tom.com
    2013 08
 */
#include <U8glib.h> //Библиотека для ЖК-экрана
U8GLIB_PCD8544 u8g(7, 5, 6);
int Input = A0;  //Аналоговый вход для измеряемого сигнала
int Key_add = 8;  //Коды кнопок
int Key_sub = 9;
int Key_hold = 10;
int x, y; //Координаты
int i, i1, i2, V_min, V_max, V_mid, t, t0, t1, sta, Key = 1, hold = 0;
long Freq;
float Vpp;
int Y[96]; //Массив хранения мгновенных значений входного напряжения
int Buffer[192];

void setup( )
{
  pinMode(Key_add, INPUT);
  digitalWrite(Key_add, HIGH);
  pinMode(Key_sub, INPUT);
  digitalWrite(Key_sub, HIGH);
  pinMode(Key_hold, INPUT);
  digitalWrite(Key_hold, HIGH);
  ADMUX = 0x60;
  ADCSRA = 0xe2;
  u8g.setFont(u8g_font_micro);
  u8g.setRot180();
}

void loop( )
{
  sample( );
  Measure( );
  Transform( );
  Key_scan( );
  if (hold == 0)
  {
    u8g.firstPage( );
    do
    {
      draw( );
    }
    while ( u8g.nextPage( ));
  }
}

void sample( )
{ for (i = 0; i < 192; i++)
  {
    Buffer[i] = ADCH;
    switch (Key)
    {
      case 1:
        break;
      case 2:
        delayMicroseconds(4);
        break;
      case 3:
        delayMicroseconds(10);
        break;
      case 4:
        delayMicroseconds(23);
        break;
      case 5:
        delayMicroseconds(60);
        break;
      case 6:
        delayMicroseconds(123);
        break;
      case 7:
        delayMicroseconds(248);
        break;
      case 8:
        delayMicroseconds(623);
        break;
      case 9:
        delayMicroseconds(1247);
        break;
      default: break;
    }
  }
}

void Measure()
{
  V_max = Buffer[0];
  V_min = Buffer[0];
  for (i = 0; i < 192; i++)
  {
    if (Buffer[i] > V_max)
      V_max = Buffer[i];
    if (Buffer[i] < V_min)
      V_min = Buffer[i];
  }
  V_mid = (V_max + V_min) / 2;
  Vpp = (V_max - V_min) * 50.0 / 255;
  for (i = 0; i < 97; i++)
  {
    if (Buffer[i] < V_mid && Buffer[i + 1] >= V_mid)
    {
      i1 = i;
      break;
    }
  }
  for (i = i1 + 1; i < 98 + i1; i++)
  {
    if (Buffer[i] < V_mid && Buffer[i + 1] >= V_mid)
    {
      i2 = i;
      break;
    }
  }
  t = i2 - i1;
  if (t > 0)
    Freq = 8000 / t;
  else
    Freq = 0;
}

void Transform( )
{
  for (sta = 0; sta < 96; sta++)
  {
    if (Buffer[sta] < 128 && Buffer[sta + 2] > 128)
      break;
  }
  for (i = 0; i < 96; i++)
    Y[i] =  63 - (Buffer[i + sta] >> 2);
}

void draw( )
{
  for (x = 0; x < 60; x++)
    u8g.drawLine(x, Y[x], x, Y[x + 1]); //Рисуем линию

  //Рисуем рамку
  u8g.drawFrame(0, 0, 60, 48);
  // Рисуем линейку
  u8g.drawLine(30, 0, 30, 48);
  u8g.drawLine(0, 24, 60, 24);
  for (x = 0; x < 60; x += 6)
    u8g.drawLine(x, 23, x, 25);
  for (y = 0; y < 48; y += 6)
    u8g.drawLine(29, y, 31, y);
  //Рисуем сетку
  for (x = 6; x < 60; x += 6)
  {
    for (y = 6; y < 48; y += 6)
      u8g.drawPixel(x, y);
  }
  //Параметры отображения
  u8g.drawStr(62, 6, "MS");
  u8g.drawStr(62, 18, "V");
  u8g.drawStr(62, 24, "0.324");
  u8g.drawStr(62, 30, "Vpp");
  u8g.setPrintPos( 62, 36);
  u8g.print(Vpp);
  u8g.drawStr(78, 36, "V");
  u8g.drawStr(62, 42, "F(HZ)");
  switch (Key)
  {
    case  1:
      u8g.drawStr(62, 12, "0.02");
      u8g.setPrintPos( 62, 48);
      u8g.print(Freq * 50);
      break;
    case  2:
      u8g.drawStr(62, 12, "0.05");
      u8g.setPrintPos( 62, 48);
      u8g.print(Freq * 20);
      break;
    case  3:
      u8g.drawStr(62, 12, " 0.1");
      u8g.setPrintPos( 62, 48);
      u8g.print(Freq * 10);
      break;
    case  4:
      u8g.drawStr(62, 12, " 0.2");
      u8g.setPrintPos( 62, 48);
      u8g.print(Freq * 5);
      break;
    case  5:
      u8g.drawStr(62, 12, " 0.5");
      u8g.setPrintPos( 62, 48);
      u8g.print(Freq * 2);
      break;
    case  6:
      u8g.drawStr(62, 12, "  1");
      u8g.setPrintPos( 62, 48);
      u8g.print(Freq);
      break;
    case  7:
      u8g.drawStr(62, 12, "  2");
      u8g.setPrintPos( 62, 48);
      u8g.print(Freq / 2);
      break;
    case  8:
      u8g.drawStr(62, 12, "  5");
      u8g.setPrintPos( 62, 48);
      u8g.print(Freq / 5);
      break;
    case  9:
      u8g.drawStr(62, 12, " 10");
      u8g.setPrintPos( 62, 48);
      u8g.print(Freq / 10);
      break;
    default: break;
  }
}

//Сканируем клавиатуру
void Key_scan()
{
  if (digitalRead(Key_add) == LOW)
  {
    while (digitalRead(Key_add) == LOW);
    Key++;
    if (Key == 10)
      Key = 9;
    delay(10);
  }
  if (digitalRead(Key_sub) == LOW)
  {
    while (digitalRead(Key_sub) == LOW);
    Key--;
    if (Key == 0)
      Key = 1;
    delay(10);
  }
  if (digitalRead(Key_hold) == LOW)
  {
    while (digitalRead(Key_hold) == LOW);
    hold = ~hold;
    delay(10);
  }
}

Но имея код от микроконтроллерного устройства, можно восстановить и схему! Надо будет заказать дождаться, пока дойдёт дисплей от Nokia 3310, и собрать этот осциллограф.

▍ Схема шагомера с цифровой индикацией


Модель электронного шагомера отображает число шагов от 00 до 99, после чего снова сбрасывается на 00. Для реального устройства этого было бы слишком мало, но учебная плата создана затем, чтобы понять принцип.

Цифровая часть построена на двух половинках двоично-десятичного счётчика CD4518 и двух дешифраторах для семисегментного индикатора CD4511.



Это классика. Точно такой же схемотехнический узел использован в кухонном таймере на 30 и 60 секунд, программируемом таймере обратного отсчёта до 99 секунд и олдскульных электронных часах.


Применив комбинированные счётчики-дешифраторы CD40110B, можно было бы обойтись двумя микросхемами на два десятичных разряда.



А если использовать двоично-десятичный счётчик CD4553 (К561ИЕ22), поддерживающий динамическую индикацию, то нам хватит пары микросхем на целых три цифры от 000 до 999!



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

▍ Ищем замаскированные ошибки


Первая ошибка на плате секундомера обозначена красным крестиком слева от IC5_A. Счётчик CD4518 тактируется нисходящим фронтом, и при самосбросе IC5_B в результате переполнения с 9=1001b на 0=0000b переход старшего разряда IC5_B в логический ноль должен вызывать инкремент IC5_A.



Однако разработчики платы «забыли» проложить дорожку, передающую этот сигнал. И для того, чтобы модель шагомера заработала, необходимо припаять перемычку, показанную на фото слева.



Правая перемычка исправляет вторую ошибку, находящуюся уже в аналоговой части схемы. Резистивный делитель R7R6 в цепи отрицательной обратной связи (ООС) операционного усилителя (ОУ) IC3_B задаёт коэффициент передачи неинвертирующего усилителя, равный (R7+R6)/R6 = 4.9.

Если исключить из схемы резистор R6, IC3_B перейдёт в режим единичного усиления и будет работать как повторитель напряжения. Это снизит не только усиление сигнала акселерометра, но и постоянное смещение выхода IC3_B.

Сигнальная цепь, проходящая через операционные усилители IC3_B, IC4_B и IC4_A, является трёхступенчатым усилителем постоянного тока с активным фильтром нижних частот посередине. Тактирующий сигнал CLKIN поступает напрямую на счётчик IC5_B.

Неправильная величина постоянного напряжения смещения приведёт к тому, что при срабатывании акселерометра сигнал CLKIN будет колебаться в пределах диапазона логического нуля. Соответственно, инкремента счётчика происходить не будет.

▍ Что же такое акселерометр?


Трёхосевой акселерометр выглядит как обычная микросхема, но содержит, кроме усилителей постоянного тока, крошечную массу, закреплённую в упругом подвесе, представляющем собой пружины из поликристаллического кремния.

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

Использование в качестве сенсора механического перемещения не переменного резистора с трением и неизбежным износом токопроводящего слоя, а конденсатора с подвижной обкладкой, является давно известным техническим решением.

Например, в 1938 году Лоуренс Хаммонд запатентовал электромузыкальный инструмент с эффектом тремоло на основе переменного конденсатора.



Итак, на выходах акселерометра получаются три напряжения, пропорциональные проекциям вектора ускорения на три координатных оси.

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

▍ Смотрим результаты


Готовое устройство работает чётко, реагирует на движения платы и сбрасывает счётчик шагов при нажатии на кнопку.

Напишите в комментариях, какие устройства с использованием акселерометра вы собирали или хотели бы собрать.

Telegram-канал со скидками, розыгрышами призов и новостями IT 💻
Теги:
Хабы:
Всего голосов 30: ↑30 и ↓0+40
Комментарии7

Публикации

Информация

Сайт
ruvds.com
Дата регистрации
Дата основания
Численность
11–30 человек
Местоположение
Россия
Представитель
ruvds