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

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

  1. AlexU

    AlexU Гуру

    Согласно этой схемы (пост #8) Вы подключаете +12 V от блока питания к выводу '+5V' ардуинки. В этом случае при включении питания Вы должны были услышать характерный щелчёк, а в голове пронестись мысль -- "ну всё, сгорела, надо бежать в магазин за новой Arduino UNO". Или Вы предоставили некорректную схему, которая не отражает действительности? Или я её (эту схему) не правильно понял?

    Уверенны, что это вращало выдает "стабильные" 110 об/мин? А то может ларчик просто открывается.

    Логика в скетче, представленном в посте #10, очень не важная -- вносит погрешности в результаты подсчета, хотя вполне вероятно, что эти погрешности могут не оказать критичного влияния на результат:
    1. подсчёт начинается после перехода в высокий уровень, хотя датчик при срабатывании выдает низкий уровень. Т.е. датчик срабатывает (на 7 пине низкий уровень), это состояние запоминается и только после того как магнит пройдёт датчик и датчик опять переведёт выход в высокое состояние начинает работать функционал подсчета измерений. А в высокое состояние он перейдёт только после зарядки конденсатора, если верить схеме, представленной пользователем ZAZ-965 в посте #12.
    2. Замер времени (функция millis()) производится после выполнения некоторых действий и вывода отладочной информации в последовательный порт. Простой вывод -- Serial.println("Hop"); -- при скорости 9600 бит/сек займёт примерно 500 мксек. Время надо засекать сразу, как только датчик сработал, а потом уже делать всё остальное.
     
  2. ExSoulz

    ExSoulz Нуб

    Уже уехал с работы, но по идее там изменится только угловая скорость. Эз, поеду куплю еще набор себе, руки чешутся, меня заломает до понедельника xD
     
  3. Onkel

    Onkel Гуру

    да ну? tau=10^-7*10^4=10-3, или 1 мс. Как RC c постоянной 1 миллисекунда повлияет на сигнал частотой 2 Гц? Это для подтяжки, а разряд идет с типичными токами миллиамперы, давая таким образом время разряда емкости 10^-6.
    не надо его отпаивать. Пусть стоит.
     
    ExSoulz нравится это.
  4. ExSoulz

    ExSoulz Нуб

    В общем, кому интересно, все заработало. Барахлило вращало, на программируемой мешалке, задан 41 об\мин. Датчик и дуня стабильно выдают 41.17 об\мин (мешалка округляет свои данные).
    Не пойму откуда взялся новый косяк. При отправке данных
    Код (C++):
    void SendResult(float result)
    {
      if (client.connect(server, 4949)) {
        Serial.println("connected");
        isConnected = true;

      }
      else {
           Serial.println("connection failed");
      }
    if (isConnected)
    {
      Serial.println("Sending....");
      client.println(result);
      client.stop();
    }
    }
    на ПеКа приходит с отброшенной дробной частью.

    (фрагмент кода на С#, который принимает сообщения через TCP\IP сокет)

    Код (C++):
     while (true)
                    {
                        data = null;
                        client = serverSocket.Accept();
                 
                        timer.Start();
                        byte[] bytes = new byte[5120];
                        client.ReceiveTimeout = 1000;
                        int bytesRec = client.Receive(bytes);
                        data += Encoding.UTF8.GetString(bytes, 0, bytesRec);
                        client.Shutdown(SocketShutdown.Both);
                        client.Close();
                        Console.Write(data + "  Readed ");
                        messageRecieved(data);
                        //timer.Stop();
                    }
    Хотя в мониторе порта все отлично выводится.

    Иногда проскакивает десятая часть дроби.... такое ощущение, что дуня не успевает передать данные и закрывает подключение. попробую зпихнуть задержку в секунду.[​IMG]
     
    Последнее редактирование: 29 авг 2016
  5. fogary

    fogary Гик

    Не оно (целочисленная переменная)?
    Код (C++):
    int bytesRec = client.Receive(bytes);
     
  6. ExSoulz

    ExSoulz Нуб

    [​IMG]
    Самое смешное, что я этот код не трогал. В скетче ардуино тоже вроде бы ни чего не менял в передаче данных. Дичь какая то. Не знаю.
    Периодически проскакивает десятичная часть и точка. Такое ощущение, что дуня не успевает отправить сообщение, но задержка, даже, в 1 секунду не помогает.
    ----------------- добавил -----------------
    При отправке строки, аля "12.123123123 fgjjdfhgdfjbd" все улетает отлично.
    А если шлю float то всё ломается. Все что предлогает гугель на запрос "float to string Arduino" не работает. Либо я совсем конченый(
     
    Последнее редактирование: 29 авг 2016
  7. fogary

    fogary Гик

    Про переменную, я действительно не по-делу написал.

    Вы отсылаете данные командой "client.println(result);", по описанию это команды, данные могут быть char, byte, int, long или string, а у Вас float. Может попробовать сначала перевести в строку? Команда так же возвращает кол-во переданных байт, можно еще здесь проверить.
    -----
    Не увидел Ваше дополнение.
    Для преобразование float to string посмотрите функцию sprintf().
     
    Последнее редактирование: 29 авг 2016
    ExSoulz нравится это.
  8. ExSoulz

    ExSoulz Нуб

    Cпасибо! Справился через
    Код (C++):
      char msg[15];
      dtostrf(result, 4, 3, msg);

      client.println(msg);
    Вот такое имею на выходе
    [​IMG]

    Мне не даёт покоя мысль, что я не могу гарантировать точность своего агрегата.
    Вот как выглядит установка, которую я собсно шупаю [​IMG]
    Сверху установленные обороты. Можно ли грешить на то, что это мешалка гуляет в оборотах? :)
     
  9. Vad33

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

    А как мешалка считает свои обороты сама?
     
  10. ExSoulz

    ExSoulz Нуб

    Считает сама, а как она это делает, вообще хз.
     
  11. fogary

    fogary Гик

    В качестве вариантов: использовать магнит меньшего размера (сопоставимого с размером датчика Холла); повесить сенсор на прерывание и считать время между прерываниями, вместо произвольного опроса сенсора в цикле; попробовать прямо посчитать кол-во оборотов за минуту.
     
    ExSoulz нравится это.
  12. ExSoulz

    ExSoulz Нуб

    С прерываниями не знаком, но спасибо за наводку. Нужно раскуривать и смаковать. В чем разница между использованием прерывания и считыванием инфы с порта?
    А по поводу магнита меньшего размера. Итоговое место, где будет стоять датчик весьма неприятное для всяких нежных штук и если дистанция срабатывания будет меньше 1см, то велика вероятность датчик потерять, его просто снесет вращающимся валом (точнее всякой хренью на нем).
     
  13. fogary

    fogary Гик

    Прерывание происходит в момент срабатывания датчика, в момент изменения уровня. Выполнение основной программы прерывается и вызывается функция-обработчик прерывания. Условно говоря, прерывание будет четко происходить после оборота вала на 360°, в отличии от опроса порта из цикла, где
    этот момент может плавать.
    Реализацию подсчета оборотов по прерыванию, легко можно нагуглить, например, по запросу "arduino тахометр".

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