Popularny post Hauler Napisano Grudzień 8, 2022 Popularny post Udostępnij Napisano Grudzień 8, 2022 Witam Jako, że moim hobby jest modelarstwo zdalnie sterowane w skali 1/14 czyli wszelkiego rodzaju samochody ciężarowe i nie tylko, zawsze problematyczne było oświetlenie modelu. Największym problemem z którym nagminnie się borykam to połączenie oświetlenia w ciągniku z oświetleniem w naczepie. Ciężko przeciągnąć wiele przewodów aby wyglądało to estetycznie, a jeszcze gorzej jest ze złączem które nie wyglądało by topornie, więc postanowiłem stworzyć własny moduł dopasowany do moich potrzeb. System składa się z dwóch modułów komunikujących się po RS 232. Główny ma za zadanie odczytywanie sześciu sygnałów PWM z odbiornika, sterowanie oświetleniem samochodu, wysyłanie informacji o oświetleniu oraz dwóch sygnałów PWM. Wykonawczego który odbiera informacje z modułu głównego i steruje oświetleniem w przyczepie oraz ma dwa wyjścia PWM do sterowania dodatkowym osprzętem. Do projektu wykorzystałem Raspberry pi pico, ale nic nie stoi na przeszkodzie aby wykorzystać arduino. Do tego aby nie uszkodzić mikrokontrolera użyłem ULN 2803A który posiada 8 kanałów co w zupełności wystarcza oraz przetwornice regulowaną. No dobra to jak to zrobić? Na początek musimy odczytać jakoś sygnał PWM z odbiornika, na szczęście większość odbiorników pracuje w standardzie 3,3V więc nie musimy się martwić ze uszkodzimy procesor. Więc odczytujemy sobie wartość PWM i wysyłamy przez serial port do monitora, teraz patrzymy jak zmieniają się wartości w zależności od poruszania drążkiem. #define PWM 2; //Definiujemy na którym pinie podłaczamy odbiornik int int Odczyt; // Ustawiamy zmienną w której bedzie odczytana informacja void setup() { pinMode(PWM, INPUT); // Ustawiamy nasz pin jako wejśćie Serial.begin(9600); // Ustawiamy serial port } void loop() { Odczyt = pulseIn(PWM, HIGH, 25000); // Odczytujemy sygnał z odbiornika Serial.println(Odczyt); // Wysyłamy to co odczytaliśmy delay(200); } Jak już wgraliśmy kod w monitorze szeregowym można zobaczyć jak wartości się zmieniają i już wiemy że dla pozycji środkowej jest to ok 1500 impulsów a dla skrajnych wychyleń odpowiednio 1000 i 2000 impulsów, gdy już wiem jakie dane dostajemy, czas coś z tym zrobić. #define PWM 2 // Definiujemy na którym pinie podłaczamy odbiornik #define LED 11 // Definiujemy pin gdzie podłaczymy diode led int Odczyt; // Ustawiamy zmienną w której bedzie odczytana informacja int stanled = 0; // zmienne diody led void setup() { pinMode(PWM, INPUT); // Ustawiamy nasz pin jako wejśćie pinMode(LED, OUTPUT); // Ustawiamy pin LED jako wyjśćie } void loop() { Odczyt = pulseIn(PWM, HIGH, 25000); // Odczytujemy sygnał z odbiornika if (Odczyt >= 1700){ // Sprawdzamy czy odczytany sygnał jest większy bądz równy stanled = 255; } if (Odczyt <= 1200){ // Sprawdzamy czy odczytany sygnał jest mniejszy bądz równy stanled = 0; } analogWrite(LED, stanled); } Teraz już wiemy jak odczytać i jak to wykorzystać więc możemy rozbudować wedle naszych potrzeb. Tworzymy instalację modułu głównego: No ok ale ale? Na początku była mowa o dwóch modułach i komunikacji co znią? Spokojnie teraz zajmiemy się tym. Aby móc sterować oświetleniem i wysyłać inne interesujące nas dane musimy strwoży rodzaj ramki w której będą zawarte informacje. Nasza ramka będzie wyglądać tak &:dane:dane*. Ale co to? Spokojnie już tłumaczę znak & rozpoczyna naszą ramkę i jest po to aby wykryć czy przesłane informacje to te które nas interesują, następnie po dwukropkach wysyłamy to co potrzebujemy i kończymy to gwiazdką aby wiedzieć że to koniec naszej ramki. Kod modułu głównego #define PWM 2 // Definiujemy na którym pinie podłaczamy odbiornik #define LED 11 // Definiujemy pin gdzie podłaczymy diode led int Odczyt; // Ustawiamy zmienną w której bedzie odczytana informacja int stanled = 0; // zmienne diody led void setup() { pinMode(PWM, INPUT); // Ustawiamy nasz pin jako wejśćie pinMode(LED, OUTPUT); // Ustawiamy pin LED jako wyjśćie Serial1.begin(9600); // Ustawiamy serial port } void loop() { Odczyt = pulseIn(PWM, HIGH, 25000); // Odczytujemy sygnał z odbiornika if (Odczyt >= 1700){ // Sprawdzamy czy odczytany sygnał jest większy bądz równy stanled = 255; } if (Odczyt <= 1200){ // Sprawdzamy czy odczytany sygnał jest mniejszy bądz równy stanled = 0; } analogWrite(LED, stanled); Serial1.print("&"); // wysyłamy nasz znak początku ramki Serial1.print(":"); Serial1.print(stanled); // to co chcemy wysłac Serial1.print("*"); Serial1.print("/n"); // znak konca lini czemu tak? pnieważ przy prinln nie działało to prawidłowo } Kod odbiornika #define LED 7 // Światła postojowe, obrysowe // Ustawienia dla odbierania danych // bool readSerialOk = false; char inChar; String inData = ""; // Twożymy tablice aby zmiejszyć ilość zmiennych String rozkaz[3]; int rozkazint[3]; int licznik[3]; // Konfiguracja prędkosci przesyłu danych // #define BAUD 9600 void setup() { // uruchomienie Uart // Serial1.begin(BAUD); // Ustawienia wyjść // pinMode(LED, OUTPUT) } void loop() { ////////// Odczyt danych ////////// if (Serial1.available() > 0) { // Sprawdzamy czy cośodebralismy inChar = (char)Serial1.read(); // Zbieramy dane if (inChar == '\n') { // Sprawdzamy czy został wykryty znak końca lini readSerialOk = true; // Ustawiamy flage prawdy } else { inData += inChar; // Zapisujemy zebrane dane return; } } ////////// sprawdzanie poprawności i rozkodowanie danych ////////// if (readSerialOk == true) { // sprawdzamy czy flafa jest ustawiona na prawdę int datainlenght = inData.length(); if (datainlenght < 4) { // Sprawdzenie ilosci odebranych znaków jeśli krótsze niż 4 powrót do odczytu// readSerialOk = false; inData = ""; return; } if (inData.substring(0, 1) != "&") { // Sprawdzenie czy na początku odebranych danych znajduje się znak & jeśli nie powrót do odczytu// inData = ""; readSerialOk = false; return; } // Następnie przetważamy odebrane dane licznik[0] = inData.indexOf(':'); // odczytujemy dane do wystąpienia dwukropka rozkaz[0] = inData.substring(0, licznik[0]); // przechodzimy od kolejnej komórki rozkazint[0] = rozkaz[0].toInt(); // przekształcamy przetwozone dane na typ zmienenj int licznik[1] = inData.indexOf(':', licznik[0] + 1); rozkaz[1] = inData.substring(licznik[0] + 1, licznik[1]); rozkazint[1] = rozkaz[1].toInt(); licznik[2] = inData.indexOf('*'); // odczytujemy dane do zaszego znaku końca rozkaz[2] = inData.substring(licznik[1] + 1, licznik[2]); rozkazint[2] = rozkaz[2].toInt(); inData = ""; // Po przetwożeniu naszych danych zerujemy zmieną readSerialOk == false; // ustawiamy flage na fałsz } // Teraz można wykożystać odebrane dane do sterowania analogWrite(LED, rozkazint[1]); // sterujemy naszą diodą led naszymi odebranymi danymi } Kod odbiornika może wydawać się bardziej złożony ale wcale taki nie jest. Teraz wiedząc co i jak można dostosowywać kod do własnych potrzeb. Działanie mojego systemu: I zdjęcia modelu z już złożonym i działającym modułem i wykorzystanym złączem do komunikacji i zasilania Filmik prezentujący działanie: Mam nadzieje ze opisałem wszystko w miarę zrozumiale i przepraszam za ewentualnie niedosięgnięcia, ale pierwszy raz opisuje jakikolwiek projekt. Pozdrawiam 8 Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Grudzień 9, 2022 Udostępnij Grudzień 9, 2022 Dziękuję za opis i gratuluję ciekawego DIY! Właśnie zatwierdziłem ten temat, więc projekt jest już widoczny publicznie. Zachęcam do opisywania kolejnych projektów 🙂 Cytuj Link do komentarza Share on other sites More sharing options...
matsobdev Marzec 20, 2023 Udostępnij Marzec 20, 2023 (edytowany) Nie kusiło, żeby zrobić własny, cienki przewód do połączenia naczepy z ciągnikiem? Coś w stylu przewód od słuchawki. Przewód typu drut, nawet sam drut nawojowy w cienkiej koszulce termokurczliwej małej średnicy. I potem zakręcić i wtedy bez chowania, tylko jak w ciągniku na tylnej ścianie kabiny gniazdo. Zawsze przy łamaniu więcej detali do oglądania. Dla realizmu możnaby też dać trzy oddzielne zakręcone, tam jest więcej zawsze, nie tylko elektryka, ale i powietrze, hydraulika - jeden cieńszy, jeden grubszy itd. Pojedyncze gniazda na goldpiny wtedy by bardziej okrągło wyglądały, niż płaskie wtyczki wielopinowe. Może gotowego duponta da się trwale zakręcić - te droższe mają AWGmy napisane, zawsze też bardziej realistyczne. Edytowano Marzec 20, 2023 przez matsobdev 1 Cytuj Link do komentarza Share on other sites More sharing options...
Hauler Marzec 24, 2023 Autor tematu Udostępnij Marzec 24, 2023 Dnia 20.03.2023 o 18:15, matsobdev napisał: Nie kusiło, żeby zrobić własny, cienki przewód do połączenia naczepy z ciągnikiem? Coś w stylu przewód od słuchawki. Przewód typu drut, nawet sam drut nawojowy w cienkiej koszulce termokurczliwej małej średnicy. I potem zakręcić i wtedy bez chowania, tylko jak w ciągniku na tylnej ścianie kabiny gniazdo. Zawsze przy łamaniu więcej detali do oglądania. Dla realizmu możnaby też dać trzy oddzielne zakręcone, tam jest więcej zawsze, nie tylko elektryka, ale i powietrze, hydraulika - jeden cieńszy, jeden grubszy itd. Pojedyncze gniazda na goldpiny wtedy by bardziej okrągło wyglądały, niż płaskie wtyczki wielopinowe. Może gotowego duponta da się trwale zakręcić - te droższe mają AWGmy napisane, zawsze też bardziej realistyczne. Ciągle szukam odpowiedniego rozwiązania do połączenia miedzy naczepą a ciągnikiem, tu zostało wykorzystane połączenie które już było ze starego projektu. 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
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!