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
#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