sobota, 7 października 2017

Motoryzacyjny zegar na bazie samochodowych liczników.

Rozpoczął się rok akademicki więc trzeba zająć się czymś żeby tylko się nie uczyć. Z tej okazji postaram się opisać projekt który popełniłem na początku tego roku a planowany był już dawno.

Czy samochodowy prędkościomierz wyskalowany do 240 km/h i obrotomierz do 6000 obr/min przypomina Wam coś ?

Jeśli tak to możecie być z siebie dumni! Nie przypadkowo wybrałem taką konfigurację liczników, 240 km/h symbolizować ma 24 godziny a 6000 obr/min 60 minut.





Wszystko pięknie wygląda, ale jak znaleźć takie zegary? W internecie nie ma(chyba) wyszukiwarki liczników po ich skali :D

Szukałem więc po różnych markach i modelach samochodów, znalazłem kilka interesujących mnie modeli lecz cena na portalach aukcyjnych skutecznie zniechęcała. Projekt więc został odłożony na "lepsze czasy".

Po około roku znalazłem na internecie wpis --->LINK<---.
Autor wykonał to, o czym kiedyś rozmyślałem. No cóż nie będę pierwszy.
Na olx znalazłem identyczny model licznika jaki użył autor przywołanego wyżej artykułu.
Cena 40zł z wysyłką mnie przekonała i już za kilka dni licznik do Toyoty Avensis T25 był u mnie.

Próby znalezienia wyprowadzeń sterujących licznikiem w wszelkiego rodzaju przewodników/poradników/książek serwisowych nic nie dały. Nie dziwne bo producent nie udostępnia takich informacji.

W ruch poszedł śrubokręt i po odkręceniu kilku śrubek zobaczyłem płytkę drukowaną wraz ze wszystkimi 4 silnikami krokowymi.

Ich wyprowadzenia nazywają się sin+, sin-, cos+, cos-. Metodą prób i błędów udało się ruszyć wskaźnikami przez eksperymentalne podłączenie silnika do znanego podwójnego Mostka H, L293D.

Rys.Podwójny Mostek-H L293D


Tak jak podejrzewałem wyprowadzenia silnika nie znalazły się na kostkach pinów wyprowadzonych na obudowę licznika. Pozostało mi dolutować przewody i wyprowadzić je za obudowę.

Podobnie sprawa miała się z podświetleniem. Gdybym robił to kolejny raz to prędzej dałbym sobie w mordę niż szukałbym styków zasilania oświetlenia za pomocą zasilacza :D Niestety kilka małych zwarć i zostało mi 1/3 sprawnych diod. Poszedłem po rozum do głowy, zamówiłem nowe diody, przelutowałem i zabrałem się do rozpisywania schematu podłączeń za pomocą multimetru.

Fot.Widok z tyłu


Nie będę udostępniał zdjęcia narysowanego przeze mnie schematu podświetlenia gdyż gdzieś mi się zapodział a zegar nie jest u mnie. Lecz wierzę, że każdy rozgarnięty elektronik-amator z multimetrem w ręce jest w stanie samemu rozrysować schemat. Będzie to na pewno bardziej satysfakcjonujące niż dostanie gotowca :)
Kod został w 100% napisany przeze mnie i urządzenie działa poprawnie. Co zauważyłem to liczniki samochodowe w różnych przedziałach prędkości i obrotów mają różną wrażliwość na te same wartości kroków. Zatem wskazówki ustawiłem na 0 i po notowałem jak zmieniają się wartości na liczniku co jeden krok silnika. Kod został wyskalowany do tego konkretnego modelu i zalecam Wam samodzielną "kalibrację".

Działanie kodu jest banalnie proste, na początek liczniki są zerowane przez podanie ujemnej liczby kroków odpowiadającym maksymalnemu wychyleniu wskazówki. Potem odczytywana jest godzina z zegara czasu rzeczywistego i liczba kroków przypisanych danej godzinie jest zadawana na sterownik. Jeśli godzina zmieni się np z 13 na 14 to obliczana jest różnica między pozycją godziny 14 i 13 i zadawana na sterownik jest właśnie ta różnica. Niestałość liczby kroków między godzinami wynika z nieliniowości wskaźnika.

Rys.Jak należy podłączać fotorezystor do wejścia analogowego.

Dodatkowo odczytywany jest sygnał z dzielnika napięcia (fotorezystor i rezystor) i na podstawie tego ustawiane jest podświetlenie zegarów przez tranzystor mos-fet. Im jaśniej w pomieszczeniu tym mocniejsze podświetlenie zegarów.

Energii dostarcza zasilacz 12V 2A. Tym napięciem sterowane jest podświetlenie, lecz silniki i pozostała elektronika zasilana jest poprzez przetwornicę obniżająca napięcie do 5V.

Fot.Użyta przetwornica step-down LM2596


Niestety nie mam zbyt wiele zdjęć z budowy, z tyłu obudowy została zamontowana płytka sterująca całością a przewody zostały przycięte do wymiarów. Zegar został sprezentowany Wujkowi na 50-tkę :)

Lista części :
-Atmega328p
-kondensatory 100n i 470u
-rezonator kwarcowy 16MHz
-rezystory 10kOhm
-fotorezystor 4,7kOhm
-przetwornica LM2596
-złącze śrubowe
-włącznik do 2A
-2 scalaki L293D
-tranzystor IRFZ44
-moduł zegara czasu rzeczywistego DS3231


Kod programu :

#include <DS3231.h>
#include <Stepper.h>

DS3231 clock;
RTCDateTime dt;
int godzina=0; 
int minuta=0;
int tabgodz[24]={0,16,28,42,56,68,82,94,108,120,134,146,160,174,186,200,212,226,238,252,264,278,290,304};
int tabmin[60]={0,5,12,17,22,27,32,38,44,49,54,59,64,70,76,81,86,91,96,101,106,112,118,123,128,133,138,143,148,154,160,165,170,175,180,185,190,195,200,206,212,217,222,227,232,237,242,247,254,257,262,267,272,277,282,288,294,299,304,310};
int tabjasnosc[4]={50,100,150,250};
int jasnosc=0;

int pozgodz=0;
int krok=0;
int wlgodz=10;

int pozmin=0;
int krokmin=0;
int wlmin=11;


Stepper godz(160, 5,6,7,8); //(kroki, sin-,sin+,cos-,cos+)
Stepper minu(160, 1,2,3,4); //(kroki, sin-,sin+,cos-,cos+)

void setup() {
  pinMode(wlgodz, OUTPUT);
  digitalWrite(wlgodz, HIGH);
  pinMode(wlmin, OUTPUT);
  digitalWrite(wlmin, HIGH);
  pinMode(9, OUTPUT);
   
  jasnosc=map(analogRead(A0),0,1024,0,4);
  analogWrite(9, tabjasnosc[jasnosc]);
  //Zerowanie godziny
  godz.setSpeed(20);
  for(int i=0;i<=360;i++){
  godz.step(-1);  
  delay(2);
  }
  pozgodz=tabgodz[0];
  //Zerowanie minuty
  minu.setSpeed(20);
  for(int i=0;i<=380;i++){
  minu.step(-1);  
  delay(2);
  }
  pozmin=tabmin[0];
  
  clock.begin();
  delay(1000);
//clock.setDateTime(__DATE__, __TIME__);
}

void loop() {
  dt = clock.getDateTime();
  godzina=dt.hour;
  minuta=dt.minute;
  ustawgodz();
  ustawmin();
  ustawjasnosc();

}

void ustawgodz(){
  
  if(tabgodz[godzina]>pozgodz){
    digitalWrite(wlgodz, HIGH);
    krok=tabgodz[godzina]-pozgodz;
      delay(1000);
      godz.setSpeed(60);
      for(int i=0;i<=(krok-1);i++){
        godz.step(1); 
        delay(2);
      }
      delay(500);
      pozgodz=tabgodz[godzina];
      digitalWrite(wlgodz, LOW);
  }
  
  if(tabgodz[godzina]<pozgodz){
    digitalWrite(wlgodz, HIGH);
      krok=tabgodz[godzina]-pozgodz;
      godz.setSpeed(20);
      for(int i=0;i>=krok;i--){
        godz.step(-1);
        delay(2); 
      }
      delay(500);
      pozgodz=tabgodz[godzina];
      digitalWrite(wlgodz, LOW);
      }
}
void ustawmin(){
  if(tabmin[minuta]>pozmin){
    digitalWrite(wlmin, HIGH);
    krokmin=tabmin[minuta]-pozmin;
      delay(1000);
      minu.setSpeed(60);
      for(int i=0;i<=(krokmin-1);i++){
        minu.step(1); 
        delay(2);
      }
      delay(500);
      pozmin=tabmin[minuta];
      digitalWrite(wlmin, LOW);
  }
  
  if(tabmin[minuta]<pozmin){
    digitalWrite(wlmin, HIGH);
      krokmin=tabmin[minuta]-pozmin;
      minu.setSpeed(20);
      for(int i=0;i>=krokmin;i--){
        minu.step(-1);
        delay(2); 
      }
      delay(500);
      pozmin=tabmin[minuta];
      digitalWrite(wlmin, LOW);
      }
}
void ustawjasnosc(){
  jasnosc=map(analogRead(A0),0,1024,0,4);
  analogWrite(9, tabjasnosc[jasnosc]);
}


Brak komentarzy:

Prześlij komentarz