Popularny post Szabrownick Napisano Luty 5, 2024 Popularny post Udostępnij Napisano Luty 5, 2024 Miesiąc po skończeniu wstępnego kursu na Forbocie o arduino (w grudniu 2023), zacząłem myśleć jakim projektem się zająć. Na początku próbowałem robić różne proste rzeczy, ale gdy stwierdziłem, że kupię drukarkę 3D to pójdę o krok dalej i wrzucę się na głęboką wodę. I tak zaczęła się przygoda z tworzeniem kierownicy do simracingu na bazie kirownicy F1 z 2023 roku z bolidu mercedesa. W tym też momencie zacząłem się uczyć programów projektowych (fusion 360 itp) i szukać potrzebnych części. Na początku miała to byc prosta kierownica z 12 przyciskami. Ale gdy odkryłem bibliotekę joystick.h to stwierdziłem że idę na całość. Całość zajęła jakieś 1,5 mc. Lącznie z ogarnięciem drukarki która nie chciała współpracować. Znając podstawy dowiedziałem się że da się to zrobić na dowolnych arduino z ATmega32U4. Poniżej znajdziecie też trochę kodu. Na początku (co było złym pomysłem) próbowałem nauczyć się tworzenia płytek PCB nie wiedząc jeszcze jak połącze wszystko. (VCC pomyliłem z GND :D) Stwierdizłem, że zaprojektuje całość, ale nie wiedziałem dokładnie ile miejsca potrzebuje. Wersja miała zawierac tylko przyciski, joystick i 2-3 enkodery. testowo podpięte pod arduino. użyłem większych buttonów podświetlanych. Zostałem przy niebieskich i białych, bo pobierały najmniej pradu. Po przymiarkach stwierdziłem że robie full kierę z F1. Projekt to H005. całość robiona według instrukcji, ale z dużymi zmianami. Większe buttony, enkodery które miałem nie mieściły się. Inne pokrętła, no i całość na jednym arduino. Dodatkowo dokupiłem ekran Vocore 4,3 cala. Projekt był pod 4,0 więc przerobiłem obudowę pod niego. Na początku wpięte wszystkie buttony i enkodery, tak by skręcić całość bez tylnej pokrywy. wszystko sprawdzane 10 razy by nie musieć rozkręcać wszystkiego po złożeniu. Całość obklejona "carbonem" i opaskami do tenisa + tasma izolacyjna. Jeśli chodzi o okablowanie, użyłem płytek by moc na nich ogarnąć buttony i GND. Po podpięciu wszystkiego kabli było na tyle dużo że całość nie zamknęła się w obudowie. Musiałem ją pogrubić. Dodatkowo dodałem 7 way joystick, ale używam tylko 4 kierunkowy + przycisk. Nie starczyło wejść w arduino na więcej. - 12 wejść pod rotary enkodery, - 1 wejście pod 11 buttonów + joystick + manetki, - 2 wejścia pod 2x 12 pos switch, łącznie 52 buttony + ekran Manetki według projektu. Całość po skręceniu. Jedno pokrętło środkowe to potencjometr podpiety do VCC i rezystorem 330ohm by regulować podświetlenie. dodatkowo ekran podpięty na osobnym kablu usb. Same kable usb w środku wpięte do 7 din avaitor kabla, wszystko na jednym kablu z koncowka na 2x usb wpięte do PC. Sam ekran sterowany za pomocą SimHuba. i po naklejeniu naklejek. Po złożeniu całości wyszły problemy z bouncingiem enkoderów. Po dwóch dniach udało mi się rozwiązać problem bez użycia interrupt pinów. pierwsza zmiana to sposób sprawdzania 6 enkoderów. void read_encoder_1() { // Encoder interrupt routine for both pins. // if they are valid and have rotated a full indent Old_AB_1 <<=2; // Remember previous state if (digitalRead(PIN_A_1)) Old_AB_1 |= 0x02; // Add current state of pin A if (digitalRead(PIN_B_1)) Old_AB_1 |= 0x01; // Add current state of pin B encval_1 += enc_states[( Old_AB_1 & 0x0f )]; // Update counter_1 if encoder has rotated a full indent, that is at least 4 steps if( encval_1 > 3 ) { // Four steps forward Joystick.pressButton(12); set_rotary = 12; encval_1 = 0; } else if( encval_1 < -3 ) { // Four steps backward Joystick.pressButton(13); set_rotary = 13; // Update counter_1 encval_1 = 0; } } // Encoder value static const int8_t enc_states[] = {0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,-1,0}; // Lookup table Same buttony działają według tego schematu, podpiete pod jednym pinem sprawdzam wartość ograniczając każdy następny 1k rezystorem. Nie bawiłem sie w wyliczenia by było idealnie podzielone na 1023/ ilość buttonów. Po prostu sprawdzałem odczyt i wpisywałem zakresy z marginesem kilku %. Niby jest ograniczenie że nie możemy kliknąć więcej niz jednego przycisku, ale w moim przypadku jeśli klikniemy "wyzszy wartością" przycisk i pozniej kolejny, to dostajemy wieloklik, więc częściowo działa. Dodatkowo kod starałem się tak napisać by buttony do mommentu puszczenia były na stałe wciśnięte i by nie "migotały". //BUTTONS value_buttons = analogRead(A3); rotary12pos2 = analogRead(A1); rotary12pos = analogRead(A2); //Serial.println(value_buttons); if (value_buttons > 815 && value_buttons < 820) { // Joystick.pressButton(0); // delay(button_delay); setbutton = 0; //Serial.println("Button1"); //Serial.println(value_buttons); } else if (value_buttons > 764 && value_buttons < 770) { // Joystick.pressButton(1); // delay(button_delay); setbutton = 1; //Serial.println("Button2"); //Serial.println(value_buttons); } else if (value_buttons > 677 && value_buttons < 683) { // Joystick.pressButton(2); // delay(button_delay); setbutton = 2; //Serial.println("Button3"); //Serial.println(value_buttons); } else if (value_buttons > 507 && value_buttons < 515) { // Joystick.pressButton(3); // delay(button_delay); setbutton = 3; //Serial.println("Button4"); //Serial.println(value_buttons); } else if (value_buttons < 2) { //Joystick.pressButton(4); // delay(button_delay); setbutton = 4; //Serial.println("Button5"); //Serial.println(value_buttons); } else if (value_buttons > 849 && value_buttons < 855) { //Joystick.pressButton(5); // delay(button_delay); setbutton = 5; //Serial.println("Button4"); //Serial.println(value_buttons); } else if (value_buttons > 873 && value_buttons < 880) { // Joystick.pressButton(6); // delay(button_delay); setbutton = 6; //Serial.println("Button4"); //Serial.println(value_buttons); } else if (value_buttons > 891 && value_buttons < 898) { // Joystick.pressButton(7); // delay(button_delay); setbutton = 7; //Serial.println("Button4"); //Serial.println(value_buttons); } else if (value_buttons > 904 && value_buttons < 912) { // Joystick.pressButton(8); // delay(button_delay); setbutton = 8; //Serial.println("Button4"); //Serial.println(value_buttons); } else if (value_buttons > 956 && value_buttons < 960) { // Joystick.pressButton(9); // delay(button_delay); setbutton = 9; //Serial.println("Button4"); //Serial.println(value_buttons); } else if (value_buttons > 918 && value_buttons < 923) { //Joystick.pressButton(10); // delay(button_delay); setbutton = 10; //Serial.println("Button4"); //Serial.println(value_buttons); } else if (value_buttons > 951 && value_buttons < 958) { //Joystick.pressButton(11); // delay(button_delay); setbutton = 11; //Serial.println("Button4"); } else if (value_buttons > 968 && value_buttons < 971) { //Joystick.pressButton(50); // delay(button_delay); setbutton = 50; } else if (value_buttons > 964 && value_buttons < 968) { //Joystick.pressButton(51); // delay(button_delay); setbutton = 51; } else if (value_buttons > 933 && value_buttons < 942) { setbutton = -1; Joystick.setHatSwitch(0, 0); delay(button_delay); setbutton = -1; } else if (value_buttons > 927 && value_buttons < 932) { setbutton = -1; Joystick.setHatSwitch(0, 90); delay(button_delay); } else if (value_buttons > 945 && value_buttons < 952) { setbutton = -1; Joystick.setHatSwitch(0, 180); delay(button_delay); } else if (value_buttons > 940 && value_buttons < 949) { setbutton = -1; Joystick.setHatSwitch(0, 270); delay(button_delay); } //Serial.println(value_buttons); if(value_buttons == 1023){ Joystick.setHatSwitch(0, -1); Joystick.setHatSwitch(0, -1); Joystick.setHatSwitch(0, -1); Joystick.setHatSwitch(0, -1); Joystick.setButton(setbutton,0); for(int i =0; i<12; i++){ Joystick.releaseButton(i); } Joystick.releaseButton(50); Joystick.releaseButton(51); setbutton = -1; } Joystick.setButton(setbutton,1); Niestety przy stałym sprawdzaniu enkoderów i buttonów było to za wolne by enkodery wyłapywały każdy obrót. Stwierdziłem że przez 90% czasu działania kodu bede sprawdzał enkodery, a przez reszte buttony które nie potrzebują aż takiej precyzji. unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { previousMillis = currentMillis; static int counter = 0; static bool flag = false; if (counter < firstPartDuration / 1) { // rotary encoders read_encoder_1(); read_encoder_2(); read_encoder_3(); read_encoder_4(); read_encoder_5(); read_encoder_6(); // If count has changed print the new value to serial if(set_rotary != -1){ delay(70); Joystick.setButton(set_rotary, 0); set_rotary = -1; } } else if (counter < (firstPartDuration + secondPartDuration) / 1) { // CHECK BUTTONS // CHECK ROT SWITCH POS } Dzięki temu w dowolnym momencie poruszając enkoderami, działają idealnie, bez debouncingu, i za każdym razem gdy je przekręce. Co bym zmienił w kolejnej wersji? Na pewno zrobił płytkę PCB z wszystkimi komponentami by podpiąć tylko kable. Projekt który wykonałem jest poniżej. Sama płytka jest dość uniwersalna. I w zalezności co podepniemy to zadziała. Dodatkowo dodałbym rev light za jeden pin do którego jest podpięty 12 rot pos Porównujac z kupną DIY którą miałem do tej pory, jest to spoooory przeskok Sama kierownica jest bardzo wygodna. Wytrzymała już 10h jeżdzenia na 6Nm kierownicy TS-PC. Nic sie nie rozpada. Jest lekki flex bardziej przez problemy z projektem który w ogóle nie polecam składać bo jest to mordęga. Nowa Stara, kupiona na OLX 9
Treker (Damian Szymański) Luty 6, 2024 Udostępnij Luty 6, 2024 @Szabrownick witam na forum i dziękuję za opisanie ciekawego DIY! Miło słyszeć, że Twoja przygoda z Arduino zaczęła się od mojego kursu Jakie kolejne projekty w planach?
Szabrownick Luty 6, 2024 Autor tematu Udostępnij Luty 6, 2024 4 godziny temu, Treker napisał: @Szabrownick witam na forum i dziękuję za opisanie ciekawego DIY! Miło słyszeć, że Twoja przygoda z Arduino zaczęła się od mojego kursu Jakie kolejne projekty w planach? Sprawdzam możliwości ESP32 i co można zrobić z wifi i BLE. Ale na razie będę pewnie poprawiał tą wersję by była łatwiejsza w montażu i zaprojektuje swoją od nowa. Podstawy już mam. Możliwe że pobawie się z multiplexerem i ogarnę akumulatorki i ich ładowanie, tak by całość zrobić bezprzewodową z podpinaniem kabla do ładowania. Zostało mi też sporo części z kursu. Coś związanego ze sterowaniem rzeczami w domu jest też w planach, ale ciężko pogodzić pracę z tyloma hobby 1
ethanak Luty 6, 2024 Udostępnij Luty 6, 2024 Co do ESP32 - bardzo ładnie się zachowuje. Jedna z moich konstrukcji to joystick do VICE. Teraz kombinuję nad czymś w rodzaju keyrah tylko nie wiem, czy uda mi się odkupić od znajomka klawiaturę od C64.
Popularny post amisztal0 Luty 21, 2024 Popularny post Udostępnij Luty 21, 2024 Bardzo fajny projekt! Gratulacje oraz powodzenia w następnych 3
anonimowy Kwiecień 12, 2024 Udostępnij Kwiecień 12, 2024 Wygląda na skomplikowane szczególnie pierwszo czas na projektowanie PCB wyszło na nic a do tego druk 3D tyle przewodów i wyświetlacz nie wiem jak ty dla mnie to by było niewykonalne a najgorsze to kody (programuję w C++, ale to nie są bardzo skomplikowane kody). Czyli dobra robota może się uda wydrukować i PCB
anonimowy Kwiecień 12, 2024 Udostępnij Kwiecień 12, 2024 (edytowany) Oraz bardziej zachęcająco wygląda twoja (nowa). Dodam jeszcze pytanie: Jakich programów użyłeś do PCB i druku 3D? Edytowano Kwiecień 12, 2024 przez anonimowy 2
Gość Kwiecień 28, 2024 Udostępnij Kwiecień 28, 2024 Witam. Podłączanie klasycznych przycisków pod drabinkę rezystancyjną do wejścia ADC nie jest najlepszym rozwiązaniem, zwłaszcza w tak wąskich zakresach ppm. Z czasem może się okazać, że utlenione styki przycisków będą wpływać na wartość rezystancji dekodowanej funkcji. Osobiście przy detekcji ADC na drabince rezystancyjnej używam jedynie rurek kontaktronowych, hermetycznych przekaźników subminiaturowych, przekaźników interfejsowych itp. Nigdy nie wpinam w taki sposób zwykłych przycisków/ switch. To aż się prosi o problemy. Zalecany jest tutaj jakiś rejestr zewnętrzny do obsługi standardowych przycisków, albo mikrokontroler z większą ilością portów 0/1.
Szabrownick Maj 24, 2024 Autor tematu Udostępnij Maj 24, 2024 Dnia 12.04.2024 o 23:09, anonimowy napisał: Oraz bardziej zachęcająco wygląda twoja (nowa). Dodam jeszcze pytanie: Jakich programów użyłeś do PCB i druku 3D? używam EasyEDA do projektowania płytek. Wyeksportowane pliki mozna pozniej latwo wrzucic do zamówienia np w JLCPCB.
Szabrownick Maj 24, 2024 Autor tematu Udostępnij Maj 24, 2024 Dnia 28.04.2024 o 14:07, rafal220 napisał: Witam. Podłączanie klasycznych przycisków pod drabinkę rezystancyjną do wejścia ADC nie jest najlepszym rozwiązaniem, zwłaszcza w tak wąskich zakresach ppm. Z czasem może się okazać, że utlenione styki przycisków będą wpływać na wartość rezystancji dekodowanej funkcji. Osobiście przy detekcji ADC na drabince rezystancyjnej używam jedynie rurek kontaktronowych, hermetycznych przekaźników subminiaturowych, przekaźników interfejsowych itp. Nigdy nie wpinam w taki sposób zwykłych przycisków/ switch. To aż się prosi o problemy. Zalecany jest tutaj jakiś rejestr zewnętrzny do obsługi standardowych przycisków, albo mikrokontroler z większą ilością portów 0/1. Teraz wiem że to był zły pomysł. Nowy projekt pójdzie normalnie na muxach + ledy adresowalne. Drabinka ogranicza wcisniecie wielu przycisków. Pomimo problemów na początku, po kilku dniach kalibracji przyciski działają bez problemu, ale są bardzo podatne na zmianę napiecia z portu USB wiec tanie porty odpadają. Na kierownicy przejechałem już jakies 200h. Sam sie dziwie że to jeszcze działa teraz juz wiem że niskim kosztem można dołaczyć kolejne wejscia wiec nie popełnię drugi raz tego błedu. Czy znasz może lepszy sposób obsługi rotary enkoderów na zwykłych pinach na arduino albo esp32?
Gość Maj 24, 2024 Udostępnij Maj 24, 2024 19 minut temu, Szabrownick napisał: Teraz wiem że to był zły pomysł. Wąchania napięcia zasilania portu, czy też spadki napięcia na dziadowskim kablu USB to jeszcze jest nic, bo mogłeś zrobić drabinkę zasilaną ze źródła prądowego względnie napięciowego... Poczekaj jeszcze trochę jak przyciski nieco się utlenią. Bo zakładam, że styki w tych przyciskach ze złota zrobione nie są. Ale nie przejmuj się. To są typowe błędy popełniane przez początkujących konstruktorów. Powiem Ci jeszcze taką ciekawostkę. Nawet jeżeli zrobisz przyciski na rejestrach czy muxach, to pamiętaj aby nie ładować tam przycisków deklarowanych na napięcie sieciowe. Styki w czymś takim często bywają nieco gorszej jakości oraz ulegają utlenianiu. O ile przy 230V nie ma problemu, ponieważ wartość napięcia przebije się poprzez tlenki, tak przy napięciu 3,3V 5V, 12V a nawet 24V może pojawić się problem. Stosuj dobrej jakości przyciski dedykowane do pracy z niskimi napięciami zasilania.
Pomocna odpowiedź
Bądź aktywny - zaloguj się lub utwórz konto!
Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony
Utwórz konto w ~20 sekund!
Zarejestruj nowe konto, to proste!
Zarejestruj się »Zaloguj się
Posiadasz własne konto? Użyj go!
Zaloguj się »