Приборная панель мотоцикла

SHVED
Offline
Зарегистрирован: 29.07.2020

Делаю на мот приборку, получилась вот такая схема. Так как в электротехнике не силен решил уточнить рабочая ли история. В частности волнует провод отвечающий за землю, можно ли использовать один вход для всего? Бортовая сеть 11-12в. Ряд делителей это 12в лампочки, делитель справа ШИМ на оборотах, резистор на 200ом идет на термистор. Может быть можно как то упростить?

rkit
Offline
Зарегистрирован: 23.11.2016

Одному богу известно, что это такое. Про защиту от бортовой сети познаний у тебя явно нет, так что дохлый номер.

nik182
Offline
Зарегистрирован: 04.05.2015

Не взлетит. Точнее быстро сядет. Поищите схему подключения ардуино к машине или мотоциклу. У Вас не хватает как минимум много конденсаторов по питанию и по сигналам. Да и номиналы резисторов сильно занижены.

-NMi-
Offline
Зарегистрирован: 20.08.2018

Делай резюки на вход 15кОм и на землю 10кОм. Какрас в три раза (15/3=5) + кондюки на 10нФ на вход дуни.

ГПС это круто... но нахера?

Дисплей не выдержит вибраций и сломаецца пабырику.

За идею - 5 , но не взлетит, думаю. Моцга нихватит...

SHVED
Offline
Зарегистрирован: 29.07.2020

-NMi- пишет:

ГПС это круто... но нахера?

Дисплей не выдержит вибраций и сломаецца пабырику.

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

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

Резисторы на делителях можно увеличить раз в 10, но если увеличить резистор на термисторе (200 ом) то делитель получится очень большой ибо диапазон термистора от 0 до 1300 ом, а рабочий скорее 50-200. Температура будет показываться не адекватно, ибо напряжение на входе будет крайне маленьким и малейшие колебания будут менять ее кардинально. На данный момент приходится искать среднее между 50 значений чтобы было более менее плавно, можно конечно написать костыль чтобы на приборке значений изменялось плавно, но это больше похоже на бутафорию.

Про конденсаторы приму к сведению, спасибо.

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

rkit пишет:

Одному богу известно, что это такое. Про защиту от бортовой сети познаний у тебя явно нет, так что дохлый номер.

Конструктивно)) Если бы я все знал то не задавал бы вопросов.

-NMi-
Offline
Зарегистрирован: 20.08.2018

А софт кто пейсал? Он ваще есть?

SHVED
Offline
Зарегистрирован: 29.07.2020

Я пишу скетч, пока правда не закончено. С ним проблем особо нет. Еще не подобрал библиотеку под дисплей и не занимался оптимизацией.

#include <NMEAGPS.h>
#include <EEPROMex.h>

#define VOLTAGE_PIN A0
#define SIDESTAND_PIN A1
#define HIGHBEAM_PIN A2
#define NEUTRAL_PIN A3
#define OIL_PIN A4
#define TURNSIGNALS_PIN A5
#define COOLANT_PIN A6
#define TACHOMETER_PIN 21

#define GPS_BAUD 9600
#define TACHOMETER_TIME_INTERVAL 200
#define TRIPMETER_RESET_INTERVAL 10000000
#define MEMORY_OFFSET_INTERVAL 0.0000001

using namespace NeoGPS;

//Indicators
bool i_oil;
bool i_neutral;
bool i_turnsignals;
bool i_sidestand;
bool i_highbeam;

//Coolant
unsigned int c_temperatureValues[141];
unsigned int c_ADCValue;
byte c_ADCSamples;

//Tachometer
volatile unsigned long t_interruptionTime;
volatile byte t_interruptionCounter;
unsigned long t_previousTime;

//Speedometer
NMEAGPS s_gps;
Location_t s_previousLocation;
unsigned long s_tripmeter;
unsigned long s_odometer;
bool s_locationFound;

void setup() {

  Serial1.begin(GPS_BAUD);
  attachInterrupt(digitalPinToInterrupt(TACHOMETER_PIN), t_interruption, RISING);
  initializeTemperatureValues();
  loadSpeedometerData();

  delay(1000);

  //display

}

void loop() {

  indicators();
  coolant();
  tachometer();
  speedometer();

}

//Indicators
void indicators() {

  unsigned int i_ADCValue;

  i_ADCValue = analogRead(OIL_PIN);
  if (i_ADCValue >= 250 && !i_oil) {
    i_oil = true;
    //display
  } else if (i_ADCValue < 250 && i_oil) {
    i_oil = false;
    //display
  }

  i_ADCValue = analogRead(NEUTRAL_PIN);
  if (i_ADCValue >= 250 && !i_neutral) {
    i_neutral = true;
    //display
  } else if (i_ADCValue < 250 && i_neutral) {
    i_neutral = false;
    //display
  }

  i_ADCValue = analogRead(TURNSIGNALS_PIN);
  if (i_ADCValue >= 250 && !i_turnsignals) {
    i_turnsignals = true;
    //display
  } else if (i_ADCValue < 250 && i_turnsignals) {
    i_turnsignals = false;
    //display
  }

  i_ADCValue = analogRead(SIDESTAND_PIN);
  if (i_ADCValue >= 250 && !i_sidestand) {
    i_sidestand = true;
    //display
  } else if (i_ADCValue < 250 && i_sidestand) {
    i_sidestand = false;
    //display
  }

  i_ADCValue = analogRead(HIGHBEAM_PIN);
  if (i_ADCValue >= 250 && !i_highbeam) {
    i_highbeam = true;
    //display
  } else if (i_ADCValue < 250 && i_highbeam) {
    i_highbeam = false;
    //display
  }

}

//Coolant
void coolant() {

  c_ADCValue += analogRead(COOLANT_PIN);
  c_ADCSamples++;

  if (c_ADCSamples == 50) {

    unsigned int c_resistance;
    byte c_temperature;

    c_resistance = 2000 / (51200.0 / c_ADCValue - 1.0);

    for (c_temperature = 0; c_temperature < 141; c_temperature++) {
      if (c_resistance >= c_temperatureValues[c_temperature]) {

        //display

        break;
      }
    }

    c_ADCValue = 0;
    c_ADCSamples = 0;

  }

}

void initializeTemperatureValues() {

  byte i;
  for (i = 0; i < 141; i++) {
    c_temperatureValues[i] = 13000 * pow(0.963, i);
  }

}

//Tachometer
void tachometer() {

  if (millis() - t_previousTime >= TACHOMETER_TIME_INTERVAL) {

    unsigned long t_currentTime;
    unsigned int t_RPM;
    byte t_counter;

    noInterrupts();
    t_counter = t_interruptionCounter;
    t_currentTime = t_interruptionTime;
    t_interruptionCounter = 0;
    interrupts();

    t_RPM = 600000 / ((t_currentTime - t_previousTime) * 20 / t_counter);
    t_previousTime = t_currentTime;

    //display

  }
}

void t_interruption() {

  t_interruptionTime = millis();
  t_interruptionCounter++;

}

//Speedometer
void speedometer() {

  while (s_gps.available(Serial1)) {

    gps_fix s_fix;
    byte s_kph;
    byte s_satellites;
    byte s_hours;
    byte s_minutes;

    s_fix = s_gps.read();
    s_satellites = s_fix.satellites;

    //display

    if (s_fix.valid.time) {
      s_hours = s_fix.dateTime.hours;
      s_minutes = s_fix.dateTime.minutes;
    } else {
      s_hours = 0;
      s_minutes = 0;
    }

    //display

    if (s_fix.valid.speed) {
      s_kph = s_fix.speed_kph();
    } else {
      s_kph = 0;
    }

    //display

    if (s_fix.valid.location) {

      unsigned int s_distance;

      if (s_locationFound && s_kph > 1) {

        s_distance == s_fix.location.DistanceKm(s_previousLocation) * 1000;
        s_odometer += s_distance;
        s_tripmeter += s_distance;
        s_previousLocation = s_fix.location;

      }

      if (!s_locationFound) {
        s_previousLocation = s_fix.location;
        s_locationFound = true;
      }
    }

    saveSpeedometerData();

  }
}

unsigned int getMemoryOffset() {

  unsigned int s_memoryOffset;

  s_memoryOffset = s_odometer * MEMORY_OFFSET_INTERVAL;
  s_memoryOffset *= 4;

  return s_memoryOffset;

}

void loadSpeedometerData() {

  unsigned int s_memoryOffset;

  s_memoryOffset = getMemoryOffset();
  s_odometer = EEPROM.readLong(s_memoryOffset);
  s_tripmeter = EEPROM.readLong(s_memoryOffset + 2048);

  //display

}

void saveSpeedometerData() {

  unsigned int s_memoryOffset;
  unsigned long s_savedOdometer;

  if (s_tripmeter >= TRIPMETER_RESET_INTERVAL) {
    s_tripmeter = 0;
  }

  s_memoryOffset = getMemoryOffset();
  s_savedOdometer = EEPROM.readLong(s_memoryOffset);

  if (s_tripmeter == 0 || s_odometer - s_savedOdometer >= 100) {

    EEPROM.updateLong(s_memoryOffset, s_odometer);
    EEPROM.updateLong(s_memoryOffset + 2048, s_tripmeter);

    //display

  }
}

 

-NMi-
Offline
Зарегистрирован: 20.08.2018

Ничо так накодил. Мошт и взлетит...

sadman41
Offline
Зарегистрирован: 19.10.2016

Сдается мне, что EEPROM-у тут недолго жить. Да и GPS на маленькой скорости работает - реакция на разгон/торможение может быть неадекватной.

SHVED
Offline
Зарегистрирован: 29.07.2020

sadman41 пишет:
Сдается мне, что EEPROM-у тут недолго жить.

В EEPROM хранится 2 значения, пробег суточный и пробег общий, сохранение идет каждые 100 метров, сдвиг адреса происходит каждые 10 000км (10 000 * 10 = 100 000 циклов перезаписи на 1 адрес, как и заявлено в даташите, хоть и как показывают опыты память выдерживает гораздо больше). Теперь считаем - два лонга на 4096кб памяти, по 2048кб на каждое значение, 2048 / 4 * 10000км = 5 120 000км. Очень быстро безусловно.

sadman41 пишет:
Да и GPS на маленькой скорости работает - реакция на разгон/торможение может быть неадекватной.

Я честно говоря не понял про что вы, никакой неадекватности я у GPS не заметил, единственное что стоя на месте пробег растет на 10-20м переодически, поэтому я вставил в код условие чтобы пробег рос если скорость > 1кмч, хотя наверное увеличу до 5.

Уважаемые форумчане, пожалуйста пишите ближе к сабжу.

 

rkit
Offline
Зарегистрирован: 23.11.2016

SHVED пишет:

Конструктивно)) Если бы я все знал то не задавал бы вопросов.

Ты ждешь, что за тебя кто-то прочитает всю литературу и разработает схему?

SHVED
Offline
Зарегистрирован: 29.07.2020

rkit пишет:

Ты ждешь, что за тебя кто-то прочитает всю литературу и разработает схему?

Я задал конкретные вопросы. Будет ли это работать, можно ли так юзать провод земли и как это можно улучшить. Форумы на сколько мне известно и существуют для обмена информацией. 

Подзаголовок форума пишет:

Вопросы и темы по железу.

Вы же просто умничаете, не внося ни капли конструктива. Либо пишите по сабжу либо не пишите вовсе.

rkit
Offline
Зарегистрирован: 23.11.2016

SHVED пишет:

Я задал конкретные вопросы. Будет ли это работать

И тебе был дан конкретный ответ - хрен знает, что ты тут нарисовал; работать не будет.

MaksVV
Offline
Зарегистрирован: 06.08.2015

Бортовую сеть на Vin подавать нельзя - проработает так не долго. Тем более и экран и жпс собрался с 5в ардуины питать. Можно сделать 5в при помощи стаба 7805 и нескольких конденсаторов и питать ардуино по пину Vcc .

rkit
Offline
Зарегистрирован: 23.11.2016

7805 не переживет сброс нагрузки

SHVED
Offline
Зарегистрирован: 29.07.2020

MaksVV пишет:
Бортовую сеть на Vin подавать нельзя - проработает так не долго. Тем более и экран и жпс собрался с 5в ардуины питать. Можно сделать 5в при помощи стаба 7805 и нескольких конденсаторов и питать ардуино по пину Vcc .

Не понял для чего юзать 5в пин, когда на ардуине (mega pro к слову) есть встроенный стабик на Vin, правда достоверно выяснить в каком диапазоне он работает у меня не получилось, где то написано что диапазон 7-12в, где то 6-15в, где то вообще 6-20в, я думал что его будет достаточно. На проводе от которого питается стоковая приборка мне не удалось зафиксировать каких то невероятных скачков, при повороте ключа на нем 11.5-12в стабильно. Но в любом случае дополнительный стабилизатор с конденсаторами не помешают, тем более много места внутри корпуса они не займут.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

SHVED пишет:

На проводе от которого питается стоковая приборка мне не удалось зафиксировать каких то невероятных скачков, при повороте ключа на нем 11.5-12в стабильно.

Чем фиксировали, осцилографом? Или мультиметром? Если последним, то он ничего и не покажет, ибо обновляет показания несколько раз в секунду

SHVED
Offline
Зарегистрирован: 29.07.2020

v258 пишет:

SHVED пишет:

На проводе от которого питается стоковая приборка мне не удалось зафиксировать каких то невероятных скачков, при повороте ключа на нем 11.5-12в стабильно.

Чем фиксировали, осцилографом? Или мультиметром? Если последним, то он ничего и не покажет, ибо обновляет показания несколько раз в секунду

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

b707
Offline
Зарегистрирован: 26.05.2017

SHVED пишет:

Проще действительно добавить еще один стабилизатор с более высоким диапазоном сразу после фишки.

дело не только в диапазоне, стаб на ардуине слабенький, ардуину, плюс дисплей плюс все остальное он не потянет.

Лучше поставить отдельный с запасом, еще лучше на радиаторе...

SHVED
Offline
Зарегистрирован: 29.07.2020

b707 пишет:

дело не только в диапазоне, стаб на ардуине слабенький, ардуину, плюс дисплей плюс все остальное он не потянет.

Лучше поставить отдельный с запасом, еще лучше на радиаторе...

А на делители у которых VCC не от бортовой сети тоже лучше поставить стабилизаторы? Или увеличить номиналы резисторов будет достаточно?