Popularny post H1M4W4R1 Napisano Sierpień 8, 2021 Popularny post Udostępnij Napisano Sierpień 8, 2021 Dlaczego? Otóż mój znajomy jest rolnikiem i co sianokosy owija bardzo dużo belek (co najmniej trzy cyfry), więc praca zwykle trwa do nocy. Oryginalny licznik (zdjęcie niżej) niestety nie ma podświetlenia, więc od wieczora zaczyna się problem, bo trzeba świecić latarką na licznik, by sprawdzić ilość owinięć. Oryginalny licznik belek (klon) Zamysł By rozwiązać ten problem należało sprawdzić jak są zliczane bele - i tutaj "zdziwko" - jest to najzwyczajniejszy kontaktron (nawet nie czujnik indukcyjny). Więc należy wziąć pod uwagę drgania styków. Przy najwyższej prędkości kołowej jeden obrót trwa około sekundy, więc 500ms jako limit programowy na drgania styków powinien być OK. Dalej należy wybrać odpowiednią płytkę / mikrokontroler. O ile ATmega by tutaj wystarczyła, tak taniej i łatwiej było zaprojektować to pod moje ulubione Raspberry Pi Pico. Kolejnym problemem jest zasilanie - 9-12V. No to AMS1117-5.0... Bardziej opłacalna byłaby przetwornica impulsowa, ale byłem na to zbyt leniwy -,- No i wybór wyświetlacza - tutaj padło na stary klasyczny czerwony z wspólną anodą 🙂 Wyświetlacz No to czas zabrać się za schemat... Schemat urządzenia Wyświetlacz jest sterowany przy użyciu wzmacniaczy w formie pojedynczego tranzystora. Rezystory ograniczające prąd mają 100R, więc teoretycznie powinny one ograniczyć go do ok. 20mA, czyli wyświetlacz powinien być dobrze widoczny nawet w jasny słoneczny dzień (w kabinie ciągnika). LDO jest klasycznym 2x10uF + AMS w celu konwersji 9V na 5V do zasilania Raspberry Pi Pico. Czujnik pomiarowy kontaktronu to tranzystor NPN z rezystorem podciągającym pin pomiarowy do 3.3V. Tranzystor w momencie zwarcia kontaktronu zwiera pin pomiarowy do masy. W związku z tym możemy użyć wykrywania opadającego zbocza w formie przerwania, by uzyskać informację o zwarciu kondensatora, aczkolwiek należy uważać na drgania styków. Pozostały element to przycisk do resetowania urządzenia. W celu uproszczenia wykorzystywany jest całkowity reset sprzętowy (pin RUN jest zwierany do masy). Pliki projektu EasyEDA dostępne są tutaj: Projekt.zip Oprogramowanie... Tutaj nie będę się rozwodził 😉 #include <stdio.h> #include <pico/multicore.h> #include "pico/stdlib.h" // Letters #define L_A 6 #define L_B 8 #define L_C 14 #define L_D 16 #define L_E 17 #define L_F 7 #define L_G 13 #define L_DP 15 // Transistors #define L_0 11 #define L_1 9 #define L_2 10 #define L_3 12 // Contactron input #define STATUS 26 // Internal display storage int display0; int display1; int display2; int display3; int counter = 0; // Last tick uint64_t lastTick = 0x0; void gpio_callback(uint gpio, uint32_t events){ uint64_t time = time_us_64() / 1000; // Get time (ms) if(time - lastTick > 500) // If time elapsed { counter++; // Execute lastTick = time; // Reset counter } } void init_led() { // Initialize GPIO gpio_init(L_A); gpio_init(L_B); gpio_init(L_C); gpio_init(L_D); gpio_init(L_E); gpio_init(L_F); gpio_init(L_G); gpio_init(L_DP); gpio_pull_up(L_A); gpio_pull_up(L_B); gpio_pull_up(L_C); gpio_pull_up(L_D); gpio_pull_up(L_E); gpio_pull_up(L_F); gpio_pull_up(L_G); gpio_pull_up(L_DP); // Disable Dot Point gpio_put(L_DP, true); gpio_init(L_0); gpio_init(L_1); gpio_init(L_2); gpio_init(L_3); // Set directions gpio_set_dir(L_A, GPIO_OUT); gpio_set_dir(L_B, GPIO_OUT); gpio_set_dir(L_C, GPIO_OUT); gpio_set_dir(L_D, GPIO_OUT); gpio_set_dir(L_E, GPIO_OUT); gpio_set_dir(L_F, GPIO_OUT); gpio_set_dir(L_G, GPIO_OUT); gpio_set_dir(L_DP, GPIO_OUT); gpio_set_dir(L_0, GPIO_OUT); gpio_set_dir(L_1, GPIO_OUT); gpio_set_dir(L_2, GPIO_OUT); gpio_set_dir(L_3, GPIO_OUT); // Status Pin gpio_init(STATUS); gpio_set_dir(STATUS, GPIO_IN); // Setup IRQ on main core gpio_set_irq_enabled_with_callback(STATUS, GPIO_IRQ_EDGE_FALL, true, gpio_callback); } void display(int pos, char value) { switch(value){ case 0: // a,b,c,d,e,f gpio_put(L_A, false); gpio_put(L_B, false); gpio_put(L_C, false); gpio_put(L_D, false); gpio_put(L_E, false); gpio_put(L_F, false); gpio_put(L_G, true); break; case 1: // b, c gpio_put(L_A, true); gpio_put(L_B, false); gpio_put(L_C, false); gpio_put(L_D, true); gpio_put(L_E, true); gpio_put(L_F, true); gpio_put(L_G, true); break; case 2: // a, b, d, e, g gpio_put(L_A, false); gpio_put(L_B, false); gpio_put(L_C, true); gpio_put(L_D, false); gpio_put(L_E, false); gpio_put(L_F, true); gpio_put(L_G, false); break; case 3: // a, b, c, d, g gpio_put(L_A, false); gpio_put(L_B, false); gpio_put(L_C, false); gpio_put(L_D, false); gpio_put(L_E, true); gpio_put(L_F, true); gpio_put(L_G, false); break; case 4: // b, c, f, g gpio_put(L_A, true); gpio_put(L_B, false); gpio_put(L_C, false); gpio_put(L_D, true); gpio_put(L_E, true); gpio_put(L_F, false); gpio_put(L_G, false); break; case 5: // a, c, d, f, g gpio_put(L_A, false); gpio_put(L_B, true); gpio_put(L_C, false); gpio_put(L_D, false); gpio_put(L_E, true); gpio_put(L_F, false); gpio_put(L_G, false); break; case 6: // a, c, d, e, f, g gpio_put(L_A, false); gpio_put(L_B, true); gpio_put(L_C, false); gpio_put(L_D, false); gpio_put(L_E, false); gpio_put(L_F, false); gpio_put(L_G, false); break; case 7: // a, b, c gpio_put(L_A, false); gpio_put(L_B, false); gpio_put(L_C, false); gpio_put(L_D, true); gpio_put(L_E, true); gpio_put(L_F, true); gpio_put(L_G, true); break; case 8: // * gpio_put(L_A, false); gpio_put(L_B, false); gpio_put(L_C, false); gpio_put(L_D, false); gpio_put(L_E, false); gpio_put(L_F, false); gpio_put(L_G, false); break; case 9: // * ~d gpio_put(L_A, false); gpio_put(L_B, false); gpio_put(L_C, false); gpio_put(L_D, false); gpio_put(L_E, true); gpio_put(L_F, false); gpio_put(L_G, false); break; } // Switch transistors gpio_put(L_0, pos == 0); gpio_put(L_1, pos == 1); gpio_put(L_2, pos == 2); gpio_put(L_3, pos == 3); } // Secondary core - display numbers on LCD in infinite loop void core1_func(){ while(true){ display(0, display0); sleep_us(100); display(1, display1); sleep_us(100); display(2, display2); sleep_us(100); display(3, display3); sleep_us(100); } } // Display number - send number to secondary core void display_number(int number){ display0 = number / 1000; number -= display0 * 1000; display1 = number / 100; number -= display1 * 100; display2 = number / 10; number -= display2 * 10; display3 = number; } int main() { stdio_init_all(); // Initialize GPIO init_led(); // Display displayer ;) multicore_launch_core1(core1_func); // Infinite loop display for current counter value while(true) { display_number(counter); } return 0; } Efekt? Działający licznik 😉 Co pozostało? Zaprojektować obudowę i go tam wsadzić, ale to już nie moje zadanie. 11 Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Sierpień 23, 2021 Udostępnij Sierpień 23, 2021 @H1M4W4R1 dziękuję za opis kolejnego DIY - miło widzieć Pico w jakimś konkretnym zastosowaniu. Przepraszam za późną akceptację opisu i już podbijam, aby inne osoby zobaczyły projekt 🚀 Cytuj Link do komentarza Share on other sites More sharing options...
_LM_ Sierpień 23, 2021 Udostępnij Sierpień 23, 2021 Takie pytanie: czy da się jakoś ustawić bity gpio za pomocą jednej instrukcji? Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Sierpień 23, 2021 Udostępnij Sierpień 23, 2021 @_LM_ oczywiście - gpio_put_masked(), gpio_set_dir_masked(), ogólnie cały rozdział 4.1.10.4 z dokumentacji. @H1M4W4R1 fajny przykład do pokazania, do czego mogą służyć dwa rdzenie. 1 Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Produkcja i montaż PCB - wybierz sprawdzone PCBWay! • Darmowe płytki dla studentów i projektów non-profit • Tylko 5$ za 10 prototypów PCB w 24 godziny • Usługa projektowania PCB na zlecenie • Montaż PCB od 30$ + bezpłatna dostawa i szablony • Darmowe narzędzie do podglądu plików Gerber Zobacz również » Film z fabryki PCBWay
H1M4W4R1 Sierpień 23, 2021 Autor tematu Udostępnij Sierpień 23, 2021 18 minut temu, ethanak napisał: @H1M4W4R1 fajny przykład do pokazania, do czego mogą służyć dwa rdzenie. Teoretycznie wystarczyłby jeden 😉 I tak mocy obliczeniowej jest aż za dużo względem tego pojedynczego przerwania ale nie miałem kondensatora kompensującego drgania styków na kontaktronie, więc łatwiej było zmienić software niż hardware... (zwłaszcza mając drugi wolny rdzeń w gratisie) Cytuj Link do komentarza Share on other sites More sharing options...
SOYER Sierpień 24, 2021 Udostępnij Sierpień 24, 2021 @H1M4W4R1 dobra robota, małe sprostowanie;), wprawdzie nie wiem jak mówią w Twojej okolicy, ale raczej nie zwijają belek tylko bele, ew. bale, choć to ostatnie to też niekoniecznie. Zdrobnienia od "jedna bela", "dwie bele", "wiele beli", to nie znam...😂 1 Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Sierpień 24, 2021 Udostępnij Sierpień 24, 2021 8 minut temu, SOYER napisał: Zdrobnienia od "jedna bela", "dwie bele", "wiele beli", to nie znam.. Beleczka... belcia... belunia... 😉 1 Cytuj Link do komentarza Share on other sites More sharing options...
SOYER Sierpień 24, 2021 Udostępnij Sierpień 24, 2021 No właśnie beleczka to chyba od belki a nie beli, ale ja się nie znam, belunia to może i owszem🤣 Cytuj Link do komentarza Share on other sites More sharing options...
_LM_ Sierpień 24, 2021 Udostępnij Sierpień 24, 2021 Taka historia: w zeszłym roku w moich okolicach był taki przypadek że ta duża "belunia" uciekła gaździe łąki na stoku i rozwaliła przyczepę campingową, szczęście w nieszczęściu że w przyczepie nikogo nie było. Także nigdy nie wiesz kiedy natura nieożywiona zapragnie cię zabić 😄 1 Cytuj Link do komentarza Share on other sites More sharing options...
H1M4W4R1 Sierpień 24, 2021 Autor tematu Udostępnij Sierpień 24, 2021 6 godzin temu, SOYER napisał: dobra robota, małe sprostowanie;), wprawdzie nie wiem jak mówią w Twojej okolicy, ale raczej nie zwijają belek tylko bele, ew. bale baloty; zwał jak zwał, ważne, że (chyba) każdy wie o co chodzi 😛 Cytuj Link do komentarza Share on other sites More sharing options...
Tom277 Październik 5, 2021 Udostępnij Październik 5, 2021 Dnia 23.08.2021 o 12:40, ethanak napisał: @_LM_ oczywiście - gpio_put_masked(), gpio_set_dir_masked(), ogólnie cały rozdział 4.1.10.4 z dokumentacji. @H1M4W4R1 O jaka dokumentację chodzi? Zawsze chciałem zapoznać się z maliną, ale jakoś tak nigdy mi po drodze nie było. Wszystkie te opisy, tutoriale, jakieś takie dziwne a może to ja jestem dziwny skoro nic mi nie pasuje 🤪 Fajny projekt choć faktycznie byle Atmega ogarnęłaby sytuacje w 10% swojej mocy 🙂 Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Październik 5, 2021 Udostępnij Październik 5, 2021 18 minut temu, Tom277 napisał: O jaka dokumentację chodzi? https://datasheets.raspberrypi.org/pico/raspberry-pi-pico-c-sdk.pdf 18 minut temu, Tom277 napisał: Zawsze chciałem zapoznać się z maliną Ale chodzi Ci o "zwykłą" malinkę (mikrokomputer) czy Pico (mikrokontroler)? Cytuj Link do komentarza Share on other sites More sharing options...
H1M4W4R1 Październik 5, 2021 Autor tematu Udostępnij Październik 5, 2021 31 minut temu, Tom277 napisał: Fajny projekt choć faktycznie byle Atmega ogarnęłaby sytuacje w 10% swojej mocy 🙂 Z tym, że ATMegi nie miałem w szufladzie, a Pico szufladę 😛 Brałem co było pod ręką, poza tym patrząc na obecne ceny 328P to nawet bez zastanowienia brałbym i tak Pico... Cytuj Link do komentarza Share on other sites More sharing options...
Tom277 Październik 5, 2021 Udostępnij Październik 5, 2021 Cytat Ale chodzi Ci o "zwykłą" malinkę (mikrokomputer) czy Pico (mikrokontroler)? Zawsze myśląc o malinie mam na myśli tradycyjne RaspberryPi, ale Pico tę jest mocno interesujące. Obecnie dla mnie to całkowicie obcy temat, prócz podstawowych informacji, które zna każdy kto kreci się w koło mikrokontrolerów nie wiem nic. Cytuj Link do komentarza Share on other sites More sharing options...
mwwojcik Grudzień 6, 2021 Udostępnij Grudzień 6, 2021 Witam, Fajny projekt, bo pokazuje że stare (ale jare) wyświetlacze LED mają wciąż sporo zastosowań i tutaj akurat super się sprawdzą. A teraz uwagi: 1. Piszesz "Wyświetlacz jest sterowany przy użyciu wzmacniaczy w formie pojedynczego tranzystora." - trochę niedokładnie bo tranzystory tutaj akurat niczego nie wzmacniają tylko przełączają segmenty 🙂 2. Z czego układ jest zasilany? Jeżeli z baterii 9V to fajnie byłoby jednak pokusić się o przetwornicę impulsową, z 9V na 3,3 byłby niezły zysk a tak mimo wszystko sporo mocy idzie niepotrzebnie "w powietrze". 3. Jak z obudową, czy użyjesz tej oryginalnej ze zdjęcia w opisie czy jakiejś innej? Fajnie, że nie musisz sie tym przejmować ale myslę że każdy z nas zawsze stoi przed problemem jak urządzenie dobrze obudować i wszelkie pomysły podpowiedzi czy sprawdzone rozwiązanie tutaj byłoby super pokazać. 4. Co jeśli bateryjka "padnie" podczas pracy i trzeba ją wymienić, czy zastanawiałeś się nad zapisem w EEPROMie i wznowieniem pracy od poprzedniej wartości? Tyle przyszło mi do głowy.... pomijam już pomysł dorobienia diody podświetlającej oryginalny wyświetlacz w liczniku 😝 Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Dołącz do dyskusji, napisz odpowiedź!
Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!