Краще один день втратити а потім за п'ять хвилин долетіти
Одного прекрасного дня Шанін заразив мене ідеєю зробити електронний змащувач ланцюга
щоб не просто там лило коли заведений мотор а чітко дозувало трансмісійне масло від пробігу.
У кожного такого пристрою повинна бути ціль для застосування
Мій обіцяв:
використовувати трансмісійне масло замість дорого спеціалізованого 15$ банка
позбавити від процедури змазки ланцюга руками , без центральної ноги це гемор ще той
видовжити термін служби ланцюга та зірок на 20 % просто тим фактом що механізм постійно оптимально змащений.
було куплено декілька насосів від стояночного обігірівача типу Webasto на онлайн аукціні Aliexpress.
Це насос дозуючого типу на базі соленоїда тобто для його роботи потрібен контролер
Обороти вирішили зчитувати датчиком Холла магнітна мітка закріплена на одному з болтів відомої зірки
а сенсор був розташований на маятнику.
контролер насоса був спаяний на базі ардуїно
основний функціонал який вимагався
Переключення режиму інтенивності змащування ланцюга (мало/норма/багато)
Режим прокачки масла по магістралі (для заміни масла та провірки роботи)
Проста індикація стану (три світлодіоди) для відладки прототипу
Також було реалізовано дежурний режим (контролер слідкує за тим чи запалення на мотоциклі увімкнено і якщо ні записує накопичені данні у постійну память та сам вимикає собі живлення)
Сама схема
Макет
Програма
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
#include <EEPROMex.h> //editable by user int work_cycle1 = 150; //revolutions int work_cycle2 = 450; int work_cycle3 = 700; int work_cycle; int standby_timer = 5; //minutes byte oiled = 1; // if set to zero will add extra oil drop on system cold start //define vars volatile int revolutions; int system_shutdown_timer; byte led1Status = 0; byte vcc_ok; int flow_mode; int pump_mode; int address = 0; // define IO int internal_led = 13; int power_bypass = 5; int pump = 12; int yellow_led = 11; int green_led = 8; int main_vcc_sensor = A0; int force_pump = A4; int lo_mode = A5; int hi_mode = A7; void setup() { revolutions = EEPROM.read(address); pinMode(yellow_led, OUTPUT); pinMode(green_led, OUTPUT); pinMode(pump, OUTPUT); pinMode(power_bypass, OUTPUT); digitalWrite(power_bypass, HIGH); attachInterrupt(0, hall_sensor_0, FALLING); Serial.begin(9600); } void loop() { //check flow mode if ((analogRead(hi_mode)) == 0 ) { flow_mode = 2;}; if ((analogRead(lo_mode)) == 0 ) { flow_mode = 0;}; if ((analogRead(hi_mode)) && (analogRead(lo_mode)) != 0 ) { flow_mode = 1;}; check_pump_mode(); while (pump_mode == 1) {pump_it(); check_pump_mode();} //check system vlotage if ((analogRead(main_vcc_sensor)) > 200){vcc_ok = 1;} else {vcc_ok = 0;}; if (vcc_ok != 1) {system_shutdown_timer++;} else {system_shutdown_timer = 0;}; if (system_shutdown_timer > (standby_timer*60)){EEPROM.updateInt(address, revolutions); digitalWrite(power_bypass, LOW);}; switch (flow_mode) { case 0: work_cycle = work_cycle1; break; case 1: work_cycle = work_cycle2; break; case 2: work_cycle = work_cycle3; break; }; if (revolutions > work_cycle) {oiled = 0; revolutions = 0;}; if (oiled != 1) { pump_it(); oiled = 1; }; Serial.print("revolution "); Serial.print(revolutions); Serial.print(" timer "); Serial.print(system_shutdown_timer); Serial.print(" vcc "); Serial.print(vcc_ok); Serial.print(" flow_rate "); Serial.print(flow_mode); Serial.print("\n"); delay(1000); } void hall_sensor_0() { detachInterrupt(0); attachInterrupt(0, hall_sensor_1, LOW); } void hall_sensor_1() { detachInterrupt(0); int x = analogRead(A6); int y = analogRead(A6); if (x && y == 0) { attachInterrupt(0, hall_sensor_2, RISING); } else { attachInterrupt(0, hall_sensor_0, FALLING);}; } void hall_sensor_2() { detachInterrupt(0); // int x = analogRead(A6); revolutions++; led1Status^=1; digitalWrite(yellow_led, led1Status); // Serial.print(x); Serial.print("hall sensor trigered\n"); attachInterrupt(0, hall_sensor_0, FALLING); } void check_pump_mode() { if ((analogRead(force_pump)) == 0 ) { pump_mode = 1;} else {pump_mode = 0;}; } void pump_it() {digitalWrite(pump, HIGH); digitalWrite(green_led, HIGH); delay(150); digitalWrite(pump, LOW); digitalWrite(green_led, LOW); delay(800);} |
Ще декілька фото змащувача
Прототип на даний момент проходить бойові випробування і швидше усього в схему будуть вноситись зміни які спростять її