Шум на цифровом входе Arduino UNO

Тема в разделе "Arduino & Shields", создана пользователем ExSoulz, 25 авг 2016.

  1. ExSoulz

    ExSoulz Нуб

    Доброго времени суток, жители. Сразу скажу, что я могу тупить и кидание фекалиями в мой адрес приветствуется, коли это поможет ликвидировать дыры в знаниях. К делу!
    Такая проблема. Имеется Arduino UNO, сверху удобно устроился Ethernet shield.
    Так же с ними сотрудничает вот такой модуль Холла. Сия конструкция призвана считать обороты вала на прядильной машине, данные отправлять в мускул БД.
    Собрав эту не хитрую конструкцию, столкнулся с тем, что "на коленке" датчик отлично реагирует на магнит. (кольцевой (тот что с дыркой)). Но когда начал обкатывать на лабораторном стенде, получилось так, что он банально не успевал ловить магнитное поле (магнит попадал торцом к датчику ( нет, по другому не поставить ЭТОТ магнит (других нет))).
    Варианта решения проблемы у меня придумалось 2:

    1. Подать на датчик 12 вольт вместо 5.
    2. Заюзать другой магнит.

    Магнитов ждать до понедельника, а вот подать 12 вольт вполне получилось. Купил я, значит две 9V, кроны.
    Поставил делитель из резисторов (да, тут косяк, они люто греются, но купил новые) на 150 Ом и 300 Ом.

    Выход с датчика подключаю на 7ой цифровой пин ардуины. Получилась такая картина, что если датчик подключен к питанию от ардуины, то все окей, но если запитать его от батарей, то в ответ на digitalRead(7) я вижу 0101010101010011000101010 (ХАОС).

    Больше всего меня смутило, что такое происходит даже если не подключен сам датчик, то есть в 7ом гнезде торчит провод папа-мама. Вынимаешь его - все нормально.

    Помогите разобраться с проблемой. Стал подозревать, что с самой дуней что-то не так.
     
  2. MDV

    MDV Гик

    Поставь на вход подтягивающий резистор
     
  3. ExSoulz

    ExSoulz Нуб

    Если поставить резистор на землю, порт все время в ноле, если поставить на питание (ставлю на питание ардуины) Порт все время в единице
     
  4. Vad33

    Vad33 Капитан-оригинал

    Жесть.
    Схему бы неплохо было для начала нарисовать, как что подключено или фото. Иначе ничего не понятно.
     
  5. ExSoulz

    ExSoulz Нуб

    [​IMG]
    Мои художества на тачпаде оставляют желать лучшего. Купил блок питания 220V-12V 0.4A
    Запитал от него ДХ. Выход ДХ подключаю к 7му пину Ардуины, которая питается от USB.
     
  6. Vad33

    Vad33 Капитан-оригинал

    Крута.
    А почему не протянуть три провода к датчику и не питать от ардуино ?
    Общий провод на GND от датчика к Ардуино нужен ПАЛЮБОМУ, иначе ХАОС не исчезнет. :)
    И зачем питать от 12V ??? :eek:
     
  7. ExSoulz

    ExSoulz Нуб

    Вроде бы начинает получаться.

    Подкинул - на питание, стало тихо. Но ...... (*матерные слова*) .... дернул за провод, вся конструкция выпала...не могу собрать снова xD
     
    Последнее редактирование: 26 авг 2016
  8. ExSoulz

    ExSoulz Нуб

    Все! Работает!
    Вот общая схема того, что получилось. {Х [​IMG]

    ДХ то, держит порт в 1 и при срабатывании ток не течет и на выходе получаем 0. Ну, если кто-то расскажет мне, что я сделал, и почему так "работает", то я буду крайне рад и признателен. Даже шоколадку вышлю по почте :)
     
  9. Onkel

    Onkel Гуру

    датчик Холла рассчитан на питание 5 В, зачем на него 12 подавать? Может дело было не в ускорении, вообще-то эффект Холла достаточно быстрый, странно что не срабатывает. Возможно, выходной каскад модуля с датчиком холла сделан по схеме "открытый коллектор", так тогда его надо нагрузить и подтянуть. В вашей схеме не отображены резисторы 150 Ом и 300 Ом, так что о том, что реально происходит, остается только догадываться. Ну так, на всякий случай -я вместо датчиков Холла использую ACS712TELC-05B, там у них датчик Холла внутри, они точно быстрые .
     
  10. ExSoulz

    ExSoulz Нуб

    Код (C++):
    #include <SPI.h>
    #include <Ethernet.h>

    byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Physical ardress of arduino;
    IPAddress server(192,168,19,1);  // IP ADRESS OF SERVER< THAT YOU CONNECTS
    IPAddress ip(192,168,19,114);      // IP ADRESS OF ARDUINO
    IPAddress gateway(192,168,19, 1);  // Gateway for ip-network
    IPAddress subnet(255, 255, 255, 0);// Subnet for ip-network

    EthernetClient client;
    boolean isConnected;

    int cnt = 0;
    float s_time;
    float e_time;
    float delta;
    float rpm;
    boolean started = false;

    int PM = 1; //MACHINE NUMBER! VERY IMPORTANT FOR DATABASE,

    void setup()
    {
    Serial.begin(9600);
    digitalWrite(3, HIGH);
       Ethernet.begin(mac, ip,gateway,subnet);
      Serial.print("Lets get this bitch starte ");
      Serial.println();
    delay(1000);
    }

    void loop()
    {
    RotationCount(7,16);
    }



    void SendResult(float result)
    {
      if (client.connect(server, 4949)) {
        Serial.println("connected");
        isConnected = true;
       // client.println("32");
      }
      else {
        // kf you didn't get a connection to the server:
        Serial.println("connection failed");
      }
    if (isConnected)
    {
      Serial.println("Sending....");
      client.println(result);
      client.stop();
    }
    }

    void RotationCount(int sensor_pin, int rc)
    {
     
       static uint8_t prev_state = HIGH;
       uint8_t state = 0;
       boolean result = false;
       float s_time = 0;
       float e_time = 0;
       int itc = 0;
       float res = 0;
       Serial.println("Get started");
       Serial.println(state);
    while (!result)
    {
      state = digitalRead(sensor_pin);
      if (state != prev_state)
    {
        prev_state = state;
        if ((state!=0)&&(itc<rc))
        {
          Serial.println("Hop");
          itc++;
          if (itc == 1) s_time = millis();
          if (itc == rc)
          {
          e_time = millis();
          float delta = (e_time-s_time)/1000;
          res = (60*rc)/(delta);
          Serial.println(res);
          SendResult(res);
          result = true;
          }
        }
    }
    }

    }
    Спасибо за совет. Последняя схема - является реальной. 12 вольт беру из преобразователя (китайская вилка с магической начинкой). Суть моего задания - является создание устройства, которое собирает данные оборотов валов (железные хреновины вращающиеся вокруг свой оси) в агрессивной среде (пары химических реактивов) Валов всего 6. Сейчас я строю прототип, который обкатываю на лабораторной установке. (фото ниже) [​IMG]
    Это вращало выдает 110 об\мин. Датчик стабильно отрабатывает, но результат гуляет +-10 об\мин. Что неприемлемо для задачи(

    Я еще думал над использованием оптопары для подсчета оборотов, но боюсь, что сам датчик будет периодически забиваться мусором и пылью и данные опять же будут не корректны. Вот по этому я хочу использовать магнит и ДХ. Хотя, может я еще какие-то возможности упускаю. Подскажжите, если есть идеи

    (вот результаты работы ДХ)

    [​IMG]
     
    Последнее редактирование: 26 авг 2016
  11. Vad33

    Vad33 Капитан-оригинал

    Странно конечно. Датчики Холла уверенно держат до сотни герц. А тут всего то около 2 Гц.
    Видима большие задержки в программе и/или низкая скорость обмена com порта.
    В общем не должно так быть по железу. Нужно софт ковырять.
     
  12. ZAZ-965

    ZAZ-965 Гуру

    @ExSoulz, схема вашего модуля
    hall-sensor-schematic.gif
    По-моему, емкость С1 0,1мкф велика даже для такой низкой частоты. У компаратора LM393 выходной каскад "открытый коллектор" и конденсатор не успевает разряжаться (косвенно это подтверждает, что когда вы зашунтировали С1 парой резисторов в сумме 450 Ом стало лучше). Попробуйте его отпаять.
     

    Вложения:

    • LM393.gif
      LM393.gif
      Размер файла:
      22,3 КБ
      Просмотров:
      438
    ExSoulz нравится это.
  13. ExSoulz

    ExSoulz Нуб

    СОМ-порт ни при чем. Все расчеты проводятся внутри ардуины. Я считаю обороты. После того, как датчик сработает первый раз, засекаю millis();, дальше насчитываю 16 оборотов и по формуле Nоб = 960\T где T - время за которое прошли 16 оборотов. После того, как появился результат, он передается через ethernet на сервер, а сервер все пихает в мускул. В общем...пришел директор, и сказал, что моё седалище будет страдать, если через неделю, эта штука не будет работать точно :D
     
  14. ExSoulz

    ExSoulz Нуб

    Теоретически, это может влиять на точность работы агрегата?
     
  15. Vad33

    Vad33 Капитан-оригинал

    Значит где то проскакивает неуверенное отрабатывание 1-2 оборотов вот и гуляет частота.
    Можно поиграться с чувствительностью или параллельно поставить оптопару для контроля, чтобы убедиться что проскакивает неуверенное определение. Осцилограф бы...
     
  16. ZAZ-965

    ZAZ-965 Гуру

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

    ExSoulz Нуб

    Дали лабораторную мешалку. На ней задаются обороты (от 20 до 1500 об\мин) В понедельник буду пробовать пристроить все это туда. Еще подъедут магниты неодимовые. Помощнее чем этот. Если интересно кому, то черкану здесь. Был бы рад наставлениям. <3
     
  18. fogary

    fogary Гик

    Не может влиять то, что значение millis (unsigned long int) сохраняется в переменные типа float?
     
  19. ExSoulz

    ExSoulz Нуб

    Не думаю, эксперименты занимают порядка двух-трех минут, что бы удостовериться, что все плохо) Итого 180.000 миллисекунд. Ну, или есть еще какой-то подводный камень в использовании float?
     
  20. Vad33

    Vad33 Капитан-оригинал

    Можно попробовать переместить магнит на лопасти подальше от центра и посмотреть результат.