Снова про стрелочный спидометр

( Пред.  1, 2, 3 )
Начать новую тему   Ответить на тему Подписчиков (3)
Форум » А давайте обсудим идею... » Снова про стрелочный спидометр
Онлайн-статус
Hammer
Завхоз
Посмотреть профиль Отправить личное сообщение
На форуме с 05.10.2005, cообщений 4100, возраст 40
Жуковский
Ответить с цитатой
Ссылка на это сообщение:
Добавлено: 18:37 / 14.05.18

Условие можно убрать. В вашем случае прерывание срабатывает четко, когда на входе 2 сигнал меняется с высокого на низкий. В моем случае приходилось делать эту проверку т.к. прерывание срабатывало просто при любой смене сигнала. Здесь, если провод не подключен, на входе 2 должен быть всегда высокий уровень сигнала т.к. мы командой pinMode(WIRE, INPUT_PULLUP); включаем пулап-резистор, который подтягивает вход к +5В. Фактически датчик Холла должен замыкать этот вход на минус, просто, как кнопка.

Можно не включать пулап, и поменять прерывание на attachInterrupt(digitalPinToInterrupt(WIRE), hall, RISING);

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

TIME_MAX нужно увеличивать. Это период переключения аж шести магнитов в электроколесе, раскрученных до 6000 об/мин.

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

У вас один магнит на колесе будет?
 
Lord_elf

Посмотреть профиль Отправить личное сообщение
На форуме с 14.05.2018, cообщений 11
Пермь
Ответить с цитатой
Ссылка на это сообщение:
Добавлено: 09:36 / 15.05.18

Hammer писал(а):
Условие можно убрать. В вашем случае прерывание срабатывает четко, когда на входе 2 сигнал меняется с высокого на низкий. В моем случае приходилось делать эту проверку т.к. прерывание срабатывало просто при любой смене сигнала. Здесь, если провод не подключен, на входе 2 должен быть всегда высокий уровень сигнала т.к. мы командой pinMode(WIRE, INPUT_PULLUP); включаем пулап-резистор, который подтягивает вход к +5В. Фактически датчик Холла должен замыкать этот вход на минус, просто, как кнопка.

Можно не включать пулап, и поменять прерывание на attachInterrupt(digitalPinToInterrupt(WIRE), hall, RISING);

Попробовал оба ванианта, условие убрал, стрелка ведет себя так же, немного сдвигается, а потом пошла гулять до максимума и вниз, может есть какое то условие?

Hammer писал(а):
TIME_MAX нужно увеличивать. Это период переключения аж шести магнитов в электроколесе, раскрученных до 6000 об/мин.

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

У вас один магнит на колесе будет?

Планировал один, но для точности считывания думаю можно несколько поставить)
TIME_MAX увеличивал и уменьшал - результат тот же. Мне пока сложно понять как проходит расчет, пытаюсь вникнуть)
 
Онлайн-статус
Hammer
Завхоз
Посмотреть профиль Отправить личное сообщение
На форуме с 05.10.2005, cообщений 4100, возраст 40
Жуковский
Ответить с цитатой
Ссылка на это сообщение:
Добавлено: 10:00 / 15.05.18

А есть еще одна ардуина? Собрать бы генератор, имитирующий работу ДХ, чтобы дрель не крутить, тогда было бы проще настраивать.
 
Lord_elf

Посмотреть профиль Отправить личное сообщение
На форуме с 14.05.2018, cообщений 11
Пермь
Ответить с цитатой
Ссылка на это сообщение:
Добавлено: 10:05 / 15.05.18

Hammer писал(а):
А есть еще одна ардуина? Собрать бы генератор, имитирующий работу ДХ, чтобы дрель не крутить, тогда было бы проще настраивать.

Есть) Поищу сейчас прошивку под генератор
 
Онлайн-статус
Hammer
Завхоз
Посмотреть профиль Отправить личное сообщение
На форуме с 05.10.2005, cообщений 4100, возраст 40
Жуковский
Ответить с цитатой
Ссылка на это сообщение:
Добавлено: 12:32 / 15.05.18

Давайте посчитаем немного. Пусть у нас шкала заканчивается на 60 км/ч. По моему калькулятору: http://www.magazinmopedov.ru/speed_calculator - получается, что на этой скорости колесо диаметром 26 дюймов делает примерно 8 оборотов в секунду. Значит нам нужен генератор 0-8 Герц, если мы используем один магнит.

Это значит, что TIME_MAX должен быть равен 125000.

Попробую фильтр перенастроить, если получится.
 
Онлайн-статус
Hammer
Завхоз
Посмотреть профиль Отправить личное сообщение
На форуме с 05.10.2005, cообщений 4100, возраст 40
Жуковский
Ответить с цитатой
Ссылка на это сообщение:
Добавлено: 14:53 / 15.05.18

Переписал код в этом посте.

Проверял аналоговым генератором, он при выключении питания дико глючит, а это хорошо, ввёл дополнительные условия для правильной работы. Перевел всё на миллисекунды. Так же дописал вывод на serial monitor. Стрелку не подключал, но на мониторе видно, что шаги меняются плавно, фильтр Калмана отрабатывает.

Пробуйте, интересно, как оно в реале заработает.
 
Онлайн-статус
Hammer
Завхоз
Посмотреть профиль Отправить личное сообщение
На форуме с 05.10.2005, cообщений 4100, возраст 40
Жуковский
Ответить с цитатой
Ссылка на это сообщение:
Добавлено: 15:53 / 15.05.18 | Последний раз редактировалось: Hammer (18:31 / 15.05.18), всего редактировалось 2 раз(а)

Переписал для тиньки, залил в свой спидометр, проверил с генератором, работает. Конечно не аналоговые движения стрелки, но и не дерганные цифровые. Вобщем норм.

Код:

// Стрелочный спидометр Хаммера: http://www.dyr4ik.ru/forum/viewtopic.php?p=609078#609078
// Digispark ~ ATTiny edition

// Перехватываем аппаратное прерывание для датчика Холла
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

#include <SwitecX25.h>

// X25.168 поворачивается на 315 градусов, по три шага на градус
#define STEPS       (315 * 3)

//Длина окружности колеса
#define WHEEL       660.0
     
//Максимальная скорость
#define MAX         60.0
     
// Датчик Холла на 3 ногу ATTiny
#define WIRE        4

// Порты, к которым подключается шаговый двигатель
SwitecX25 Gauge(STEPS, 0, 3, 1, 2);

volatile uint32_t timer, interval;
uint32_t sleep;

// Начальные значения для фильтра Калмана, который двигает стрелку плавно
float P = 1.0;
float varP = pow(0.01, 2);
float varM = pow(0.5, 2);
float K = 1.0;
float Kalman = 1.0;

double speed;
int steps;

void setup(void)
{
  Gauge.zero();
  pinMode(WIRE, INPUT);
 
  // Прерывание на 3 ногу процессора
  sbi(GIMSK,PCIE);
  sbi(PCMSK,PCINT4);

  timer = millis();
  interval = 1000000;
}

void loop(void)
{
  // Убираем дребезг датчика
  if (interval > 0)
  {
    // (окружность колеса в километрах) / (период в часах) = скорость в км/ч
    speed = (WHEEL / 1000000.0) / (interval / 1000.0 / 3600.0);
    if (speed > MAX) speed = MAX;
  }

  //Если остановились, кладем стрелку
  if (millis() - timer > 5000) speed = 0;

  P = P + varP;
  K = P / (P + varM);   
  Kalman = K * speed + (1 - K) * Kalman;
  P = (1 - K) * P;
     
  steps = Kalman * STEPS / MAX;

  Gauge.setPosition(steps);
  Gauge.update();

  // Задержка, чтобы погасить инерцию стрелки
  delay(5);
}

ISR(PCINT0_vect) {
  if (!digitalRead(WIRE))
  {
    interval = millis() - timer;
    timer = millis();
  }
}
 
Lord_elf

Посмотреть профиль Отправить личное сообщение
На форуме с 14.05.2018, cообщений 11
Пермь
Ответить с цитатой
Ссылка на это сообщение:
Добавлено: 17:36 / 15.05.18

Hammer писал(а):
Переписал код в этом посте.

Проверял аналоговым генератором, он при выключении питания дико глючит, а это хорошо, ввёл дополнительные условия для правильной работы. Перевел всё на миллисекунды. Так же дописал вывод на serial monitor. Стрелку не подключал, но на мониторе видно, что шаги меняются плавно, фильтр Калмана отрабатывает.

Пробуйте, интересно, как оно в реале заработает.

Дмитрий!!!! Он заработал!!!! Удивительно!!!)
Извиняюсь что так редко отвечаю, но он рабоооооотает!!!!!)
Проверил даже дрелью! С компортом на много удобнее стало)
Большое спасибо, оно ожило)))
Единственное что не хватает подвижности стрелки, она слишком медленно реагирует на изменения, это можно как то изменить?
 
Онлайн-статус
Hammer
Завхоз
Посмотреть профиль Отправить личное сообщение
На форуме с 05.10.2005, cообщений 4100, возраст 40
Жуковский
Ответить с цитатой
Ссылка на это сообщение:
Добавлено: 17:48 / 15.05.18

Можно delay(5); укоротить или совсем убрать. В самой библиотеке тоже есть настройки скорости, я их менял как-то под свой шаговый двигатель. Если не поможет, то крутить коэффициенты фильтра, но это прям целый челлендж обычно.

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

Кардинально сделать стрелку более живой можно только путем добавления магнитов на колесо.
 
Lord_elf

Посмотреть профиль Отправить личное сообщение
На форуме с 14.05.2018, cообщений 11
Пермь
Ответить с цитатой
Ссылка на это сообщение:
Добавлено: 18:03 / 15.05.18

Hammer писал(а):
Можно delay(5); укоротить или совсем убрать. В самой библиотеке тоже есть настройки скорости, я их менял как-то под свой шаговый двигатель. Если не поможет, то крутить коэффициенты фильтра, но это прям целый челлендж обычно.

delay прбовал убрать - не очень помогло, точнее разницы на глаз совсем не заметил)
Hammer писал(а):
Но не советую увлекаться, шаговый двигатель начнет пропускать шаги. Надо на ходу смотреть, вполне может оказаться, что сам велосипед медленнее стрелки.

Кардинально сделать стрелку более живой можно только путем добавления магнитов на колесо.

Это понял) Огромнейшее спасибо) Буду пробовать установить на колесо, а там уж видно будет)
 
Онлайн-статус
Hammer
Завхоз
Посмотреть профиль Отправить личное сообщение
На форуме с 05.10.2005, cообщений 4100, возраст 40
Жуковский
Ответить с цитатой
Ссылка на это сообщение:
Добавлено: 18:10 / 15.05.18

Можно в самом файле библиотеки SwitecX25.cpp в строках 16 и 23 поменять значения на более низкие, я так делал. Но там как раз просчитаны значения задержек с учетом инерции стрелки. Но мне кажется, что это всё же фильтр тормозит.

Можно выводить данные не на serial monitor, а на serial plotter, он рисует графики. Менять коэффициенты фильтра так, чтобы график быстро разгонялся, но медленно тормозил, иначе стрелка будет сильно дергаться.

Отлично, ждем ходовых испытаний!
 
Lord_elf

Посмотреть профиль Отправить личное сообщение
На форуме с 14.05.2018, cообщений 11
Пермь
Ответить с цитатой
Ссылка на это сообщение:
Добавлено: 18:17 / 15.05.18

Hammer писал(а):
Можно в самом файле библиотеки SwitecX25.cpp в строках 16 и 23 поменять значения на более низкие, я так делал. Но там как раз просчитаны значения задержек с учетом инерции стрелки. Но мне кажется, что это всё же фильтр тормозит.

Можно выводить данные не на serial monitor, а на serial plotter, он рисует графики. Менять коэффициенты фильтра так, чтобы график быстро разгонялся, но медленно тормозил, иначе стрелка будет сильно дергаться.

Отлично, ждем ходовых испытаний!


Непременно)
Сейчас попробовал добавить указание количества магнитов на колесе, правильно?
Код:
//Количество магнитов на колесе
#define MAGNIT       1

Это создал значение постоянно магнитов и в формуле расчета скорости делил на эту константу
Код:
// (окружность колеса в километрах) / (период в часах) = скорость в км/ч
    speed = (WHEEL / 1000000.0 / MAGNIT) / (interval / 1000.0 / 3600.0);
 
Онлайн-статус
Hammer
Завхоз
Посмотреть профиль Отправить личное сообщение
На форуме с 05.10.2005, cообщений 4100, возраст 40
Жуковский
Ответить с цитатой
Ссылка на это сообщение:
Добавлено: 18:19 / 15.05.18

Ну или просто второй строкой:

speed = speed / MAGNIT;
 
Lord_elf

Посмотреть профиль Отправить личное сообщение
На форуме с 14.05.2018, cообщений 11
Пермь
Ответить с цитатой
Ссылка на это сообщение:
Добавлено: 18:21 / 15.05.18

Hammer писал(а):
Ну или просто второй строкой:

speed = speed / MAGNIT;

Понял, огромное спасибо) Буду экспериментировать)
 

Начать новую тему    Ответить на тему Подписчиков (3) ( Пред.  1, 2, 3 )
 

Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах

« Бесщеточный электромотор минус контроллер | 3 в 1 - Trift Trike / Трайк / Снегокат с двигателем »



 
© ДЫРЧИК.РУ 2018
info@dyr4ik.ru
www.magazinmopedov.ru Раскрутка и продвижение сайта
OLDIES Studio