Skocz do zawartości

Gregorio

Użytkownicy
  • Zawartość

    5
  • Rejestracja

  • Ostatnio

Informacje

  • Płeć
    Mężczyzna

Osiągnięcia użytkownika Gregorio

Młodszy odkrywca

Młodszy odkrywca (3/19)

  • Za 5 postów
  • To już rok!

Odznaki

1

Reputacja

  1. Pewnie masz wyświetlacz z dołączonym konwerterem magistrali I2C. Takie cuś? https://botland.com.pl/wyswietlacze-alfanumeryczne/2351-wyswietlacz-lcd-2x16-znakow-niebieski-konwerter-i2c-lcm1602.html
  2. Przedstawiam mój projekt z wykorzystaniem serwomechanizmu. Wiem, że nie działa idealnie ale być może oda mi się to niedługo zmienić, jak tylko poznam tajniki regulatora PID od strony programowej. Chociaż w tym programie można dopatrzyć się członu proporcjonalnego i różniczkującego. Zadaniem poniższego projektu jest przywracanie kulki łożyska toczącej się po torze do pozycji okołośrodkowej. Do konstrukcji projektu wykorzystano zamiennik Arduino R3 Uno oraz serwomechanizm MG995. Zasada działania: Kulka łożyska toczy się po torze wykonanym z profilu aluminiowego i ścieżki rezystancyjnej pozyskanej ze złomu przetwornika rezystancyjnego 10kΩ. Do końcówek ścieżki rezystancyjnej przyłożono napięcie zasialania Arduino zaś przewód zamocowany do profilu wyprowadzono na wyjscie ADC mikrokontrolera . Koniecznym było zastosowanie filtra RC ponieważ ze względu na niewielką powierzchnię styku kulki i toru oraz chropowatość powierzchni kulka często traciła kontakt z podłożem co skutkowało pojawieniem się zakłóceń. Dodatkowo filtr programowy wygładza zakłócenia spowodowane drganiami pochodzącymi od działającego serwomechanizmu. Zmiany dzielnika napięcia określają położenie kulki na torze. Odpowiednie wychylenie ramienia serwomechanizmu uzależnione jest od akutalnego położenia kulki. Wartości oraz przedziały wartości dla zmiennych: pozycja; // Wychylenie ramienia serwomechanizmu w stopniach w momencie zatrzymania się kulki. int i; // Zmienna służąca do przełączania trybów pracy stabilizatora: //0= tryb pracy //1= poziomowanie ręczne //ZMIENNE DOTYCZĄCE POMIARU NAPIĘCIA-------------------------------------------------------------------------------- int wartosc_dzielnika_bez_filtru; // Wartość dzielnika napięcia zmieniająca się wraz z ruchem kulki po torze. int poziomowanie_reczne; // Zmienna służąca do ręcznego ustawienia zmiennej pozycja; // Różnica napięć w momencie wyhamowania kulki. int tlumienie; // Parametr dodawany do zmiennej pozycja_hamowania. Pozwala na sprawniejsze wyhamowanie kulki w czasie powrotu do pozycji okołosrodkowej. int delta_przedzial_wartosc_srodkowa; // Przyrost zmiennej przedzial_wartosci_srodkowej. Pozwala na sprawniejsze wyhamowanie kulki w czasie powrotu do pozycji okołosrodkowej. void setup() { Serial.begin(9600); // Zezwolenie na transmisję danych przez UART. serwo.attach(9); // Przypisanie pinu 9 do serwomechanizmu. serwo.write(pozycja=pozycja=0; delta_przedzial_wartosc_srodkowa=0; } if((roznica_napiec>przedzial_wartosci_srodkowej)&& przyrost>0) //Kulka przemieszcza się po prawej połowie równi, od środka do prawej. { pozycja= map(roznica_napiec,0,max_roznica_napiec,pozycja=roznica_napiec; // Miejsce, w którym kulka zatrzymuje się. tlumienie=map(roznica_napiec,przedzial_wartosci_srodkowej,max_roznica_napiec,0,16); // Tłumienie zwiększa wychylenie ramienia przy hamowaniu kulki. Im dalej od środka zatrzyma się kulka, tym większe tłumienie. delta_przedzial_wartosc_srodkowa=map(abs(roznica_napiec_kulka_stop),przedzial_wartosci_srodkowej,max_roznica_napiec,10,50); // Określenie wartości chwilowego poszerzenia przedziału środkowego pozycja_stop=pozycja; // Położenie ramienia serwomechanizmu w momencie zatrzymania kulki. serwo.write(pozycja); // Ustawienie nowej pozycji. } if((roznica_napiec>przedzial_wartosci_srodkowej)&&przyrost<0) //Kulka przemieszcza się po prawej połowie równi, od prawej do środka. { pozycja= map(roznica_napiec,przedzial_wartosci_srodkowej+delta_przedzial_wartosc_srodkowa,roznica_napiec_kulka_stop,pozycja_hamowania-tlumienie,pozycja_stop); serwo.write(pozycja); // Ustawienie nowej pozycji. if(roznica_napiec<(przedzial_wartosci_srodkowej+delta_przedzial_wartosc_srodkowa)){serwo.write(pozycja=roznica_napiec; // Miejsce, w którym kulka zatrzymuje się. tlumienie=map(roznica_napiec,-przedzial_wartosci_srodkowej,-max_roznica_napiec,0,14 ); // Tłumienie zwiększa wychylenie ramienia przy hamowaniu kulki. Im dalej od środka zatrzyma się kulka, tym większe tłumienie. delta_przedzial_wartosc_srodkowa=map(abs(roznica_napiec_kulka_stop),przedzial_wartosci_srodkowej,max_roznica_napiec,10,50); // Określenie wartości chwilowego poszerzenia przedziału środkowego pozycja_stop=pozycja; // Położenie ramienia serwomechanizmu w momencie zatrzymania kulki. serwo.write(pozycja); // Ustawienie nowej pozycji. } if((roznica_napiec<-przedzial_wartosci_srodkowej)&&przyrost>0) //Kulka przemieszcza się po lewej połowie równi, od lewej do środka. { pozycja= map(roznica_napiec,-przedzial_wartosci_srodkowej-delta_przedzial_wartosc_srodkowa,roznica_napiec_kulka_stop,pozycja_hamowania+tlumienie,pozycja_stop); serwo.write(pozycja); // Ustawienie nowej pozycji. if(roznica_napiec>(-przedzial_wartosci_srodkowej-delta_przedzial_wartosc_srodkowa)){serwo.write(pozycja_startowa_serwomechanizmu);}; } roznica_napiec_poprzednia=roznica_napiec; // Ustawienie aktualnej wartości zmiennej roznica_napiec jako wartości poprzedniej w celu porównania jej z nową wartością w następnym przebiegu programu. } void przycisk_wcisniety (void) { if (digitalRead(przycisk)==LOW) // Zmiana wartości zmiennej i w wyniku reakcji na naciśnięcie przycisku menu. { delay (80); // Filtrowanie "drgania styków" przycisku. if (digitalRead(przycisk)==LOW) {i++; digitalWrite(13,HIGH); // Sygnalizacja wciśniętego przycisku zapaleniem wbudowanego w arduino led } if(i==2){i=0;digitalWrite(13,LOW);} } }
  3. Połączenie lekcji o czujniku odległości oraz buzzerach. Powietrzna struna 🙂 Trekker wykorzystałem Twoją funkcję zmierzOdleglosc() zmieniając zapis na bardziej czytelny dla mnie, mam nadzieję, że nie masz mi tego za złe :-> Kod programu: // Zmieniając odległość reki od czujnika odległości zmieniamy dżiwięk wydawany przez buzzer. #define trig 12 #define echo 11 #define struna A5 // Dwuoktawowy zakres struny #define NOTE_C4 262 #define NOTE_CS4 277 #define NOTE_D4 294 #define NOTE_DS4 311 #define NOTE_E4 330 #define NOTE_F4 349 #define NOTE_FS4 370 #define NOTE_G4 392 #define NOTE_GS4 415 #define NOTE_A4 440 #define NOTE_AS4 466 #define NOTE_B4 494 #define NOTE_C5 523 #define NOTE_CS5 554 #define NOTE_D5 587 #define NOTE_DS5 622 #define NOTE_E5 659 #define NOTE_F5 698 #define NOTE_FS5 740 #define NOTE_G5 784 #define NOTE_GS5 831 #define NOTE_A5 880 #define NOTE_AS5 932 #define NOTE_B5 988 int dzwieki[24]; // Tabela z wartosciami czestotliwosci dzwieków int prog; // Aktualne polozenie palca na naszej powietrznej strunie int odleglosc; int poltony=1; // Zmiana dźwieku co pół tonu. int glissando=0; // Płynna zmiana dźwięku. // Możliwe zastosowanie przycisuku dla zmiany trybu. void setup() { Serial.begin (9600); pinMode(trig, OUTPUT); pinMode(echo, INPUT); pinMode(struna, OUTPUT); } void loop() { if (poltony==1) // Praca w trybie półtonowym { int a; a=zmierz_odleglosc(); if(a>50)a=50; // Ograniczenie działania czujnika odległosci do 50 cm. Mozna zwiększyć tę wartośc aby moc łatwiej trafiac w dzwieki prog=map(a,0,50,0,23); // Skalowanie odleglosci z czujnika na polozenie palca na odpowiednim progu/dzwieku int dzwieki[]={NOTE_C4, NOTE_CS4, NOTE_D4, NOTE_DS4, NOTE_E4, NOTE_F4, NOTE_FS4, NOTE_G4, NOTE_GS4, NOTE_A4, NOTE_AS4, NOTE_B4,NOTE_C5, NOTE_CS5, NOTE_D5, NOTE_DS5, NOTE_E5, NOTE_F5, NOTE_FS5, NOTE_G5, NOTE_GS5, NOTE_A5,NOTE_AS5, NOTE_B5}; tone(struna,dzwieki[prog]); delay(200); } if (glissando==1) //// Praca w trybie glissando { int a; a=zmierz_odleglosc(); if(a>50)a=50; prog=map(a,0,50,262,988); tone(struna,prog); delay(100); } } int zmierz_odleglosc() { long czas, odleglosc; digitalWrite(trig, LOW); delayMicroseconds(2); digitalWrite(trig, HIGH); delayMicroseconds(10); digitalWrite(trig, LOW); czas = pulseIn(echo, HIGH); odleglosc = czas / 58; return odleglosc; }
  4. Stoper, filmik oraz kod w linku do Githuba #include <LiquidCrystal.h> //Załączenie biblioteki LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Informacja o podłączeniu wyświelacza do danych pinów #define start 13 // Zdefiniowanie nazw przycisków #define stop 12 int dziesiata_sekundy; // Licznik int sekunda; int minuta; int tryb=2; // Tryb pracy // 0 = Pomiar czasu // 1 = Wynik // 2 = Gotowy do pracy int kursor_minuta; // Położenie kursora dla sekund, minut int kursor_sekunda; int przycisk_wcisniety(int przycisk); // Funkcja obsługująca naciskanie przycisków void pomiar_wyswietlanie(int minuty, int sekundy, int dziesiate_sekundy); // Funkcja obsługująca wyświetlanie drugiego wersa wyświetlacza unsigned long aktualny_czas = 0; unsigned long poprzedni_czas = 0; unsigned long roznica_czasu = 0; int wynik_minuta; int wynik_sekunda; int wynik_dziesiata_sekundy; void setup() { pinMode(start,INPUT_PULLUP); // Przyciski jako wejścia pinMode(stop,INPUT_PULLUP); lcd.begin(16, 2); // Deklaracja typu wyświetlacza lcd.clear(); // Czyszczenie zawartości wyświetlacza lcd.setCursor(0,0); // Ustawianie kursora lcd.print("STOPER"); // Napis powitalny delay (3000); } void loop() { if (przycisk_wcisniety(start))tryb=0; if (przycisk_wcisniety(stop)) tryb++; if (tryb>2) tryb =1; aktualny_czas = millis(); roznica_czasu = aktualny_czas - poprzedni_czas; if (roznica_czasu>=100UL) // Jeśli różnica czasu wynosi 1/10 sekundy wykonaj wszystkie instrukcje poniżej, dzięki temu wyświetlacz nie miga! { dziesiata_sekundy ++; if (dziesiata_sekundy>9){sekunda++;dziesiata_sekundy=0;} if (sekunda>59){minuta++;sekunda=0;} poprzedni_czas=aktualny_czas; if (tryb==0) // Pomiar czasu { lcd.clear(); lcd.setCursor(0,0); lcd.print("Pomiar w trakcie"); pomiar_wyswietlanie(minuta, sekunda, dziesiata_sekundy); wynik_minuta=minuta; wynik_sekunda=sekunda; wynik_dziesiata_sekundy=dziesiata_sekundy; } if (tryb==1) // Wynik { lcd.clear(); lcd.setCursor(0,0); lcd.print("Wynik"); pomiar_wyswietlanie(wynik_minuta, wynik_sekunda, wynik_dziesiata_sekundy); poprzedni_czas=millis(); minuta=wynik_minuta; sekunda=wynik_sekunda; dziesiata_sekundy=wynik_dziesiata_sekundy; } if (tryb==2) //Gotowy do pracy { minuta=sekunda=dziesiata_sekundy=0; lcd.clear(); lcd.setCursor(0,0); lcd.print("Gotowy do pracy"); pomiar_wyswietlanie(minuta, sekunda, dziesiata_sekundy); } } } int przycisk_wcisniety(int przycisk) { if (digitalRead(przycisk)==0) { delay(100); if(digitalRead(przycisk)==0)return 1; } return 0; } void pomiar_wyswietlanie(int minuty, int sekundy, int dziesiate_sekundy) { if (minuty>9) kursor_minuta=5; // Zmiana położenia kursora dla minut w momencie gdy wartosc staje się dwucyfrowa else {kursor_minuta=6; // Zapewnienie wyświetlania cyfr jednosci w formacie 01, 02, 03, etc. lcd.setCursor(5,1); lcd.print(0);} if (sekundy>9) kursor_sekunda=8; // Zmiana położenia kursora dla sekund w momencie gdy wartosc staje się dwucyfrowa else {kursor_sekunda=9; // Zapewnienie wyświetlania cyfr jednosci w formacie 01, 02, 03, etc. lcd.setCursor(8,1); lcd.print(0);} lcd.setCursor(0,1); // Czas lcd.print("Czas:"); lcd.setCursor(kursor_minuta,1); // Minuty lcd.print(minuty); lcd.setCursor(7,1); // Dwukropek lcd.print(":"); lcd.setCursor(kursor_sekunda,1); // Sekundy lcd.print(sekundy); lcd.setCursor(10,1); // Dwukropek lcd.print(":"); lcd.setCursor(11,1); // Dziesiętne części sekundy lcd.print(dziesiate_sekundy); }
  5. Cześć Wszystkim! Dzięki wielkie za kursy Forbota! Mam za sobą Elektronikę I i II. Teraz jadę z Arduino. Poniżej propozycja zadania domowego 4.5. Jakie błędy robię, czego unikać, co zmienić? Będę wdzięczny za pomocną krytykę 🙂 //Gra polega na odgadnięciu napięcia dzielnika. Gracz ma dwie próby symbolizowane przez 2 żółte LED. Kolor czerwony lub zielony LED oznacza odpowiednio przegraną lub wygraną. #define BUTTON 7 #define LED_YELLOW_1 8 #define LED_YELLOW_2 9 #define LED_RED 10 #define LED_GREEN 11 #define POTENTIOMETER A5 String INTRO ="If you want to start a new game, please, press the button."; String INSTRUCTION = "Change the potentiometer position and confirm the change by pushing the button."; String ATTEMPT ="The number of atempts left: "; String GIVE_NUMBER = "Please type a number from 0 to 1023. You win when you estimate the number set on the potentiometer with +/- 50 points of accuracy"; String CONGRATS ="Congratulations, you won!"; String FAILURE ="Sorry, you lost! Maybe you will be more lucky next time!"; String THE_RIGHT_VALUE = "The number from the potentiometer is "; String WRONG_NUMBER ="Sorry, you typed the wrong number."; String TYPED_NUMBER; int TYPED_NUMBER_INT; int WINNING_NUMBER=0; int COUNTER=0; int ATTEMPT_NUMBER=2; void setup() // Start settings. { Serial.begin(9600); pinMode(BUTTON,INPUT_PULLUP); pinMode(LED_YELLOW_1,OUTPUT); pinMode(LED_YELLOW_2,OUTPUT); pinMode(LED_GREEN,OUTPUT); pinMode(LED_RED,OUTPUT); } void loop() { while(COUNTER==0) //Starting the game, waiting for the confirmation. { Serial.println(INTRO); digitalWrite(LED_YELLOW_1,HIGH); digitalWrite(LED_YELLOW_2,HIGH); digitalWrite(LED_GREEN,LOW); digitalWrite(LED_RED,LOW); while (digitalRead(BUTTON)==1){}; if (digitalRead(BUTTON)==0){COUNTER++;delay(1000);} } while (COUNTER==1)// Giving info on the game rules. { Serial.println(INSTRUCTION); while (digitalRead(BUTTON)==1){}; if (digitalRead(BUTTON)==0){COUNTER++;delay(1000);} } while (COUNTER==2) // First attempt. { int ATTEMPT_NUMBER=2; WINNING_NUMBER=analogRead(POTENTIOMETER); Serial.println(GIVE_NUMBER); delay(1000); Serial.println(ATTEMPT + ATTEMPT_NUMBER); while (Serial.available()==0){}; if(Serial.available()>0) {TYPED_NUMBER=Serial.readStringUntil("\n");} TYPED_NUMBER_INT=TYPED_NUMBER.toInt(); if((TYPED_NUMBER_INT<(WINNING_NUMBER+50))&&(TYPED_NUMBER_INT>(WINNING_NUMBER-50))) // Win at first try. { digitalWrite(LED_YELLOW_1,HIGH); digitalWrite(LED_YELLOW_2,HIGH); digitalWrite(LED_GREEN,HIGH); Serial.println(CONGRATS); delay(1000); Serial.println(THE_RIGHT_VALUE + WINNING_NUMBER); delay (3000); COUNTER=0; } else { ATTEMPT_NUMBER--; //First mistake. digitalWrite(LED_YELLOW_1,HIGH); digitalWrite(LED_YELLOW_2,LOW); digitalWrite(LED_GREEN,LOW); digitalWrite(LED_RED,HIGH); Serial.println(WRONG_NUMBER); delay(1000); Serial.println(GIVE_NUMBER); delay(1000); Serial.println(ATTEMPT + ATTEMPT_NUMBER); delay(1000); digitalWrite(LED_RED,LOW); while (Serial.available()==0){}; if(Serial.available()>0) {TYPED_NUMBER=Serial.readStringUntil("\n");} //Second try. TYPED_NUMBER_INT=TYPED_NUMBER.toInt(); if((TYPED_NUMBER_INT<(WINNING_NUMBER+50))&&(TYPED_NUMBER_INT>(WINNING_NUMBER-50)))// Win at second try. { digitalWrite(LED_YELLOW_1,HIGH); digitalWrite(LED_YELLOW_2,LOW); digitalWrite(LED_GREEN,HIGH); Serial.println(CONGRATS); delay(1000); Serial.println(THE_RIGHT_VALUE + WINNING_NUMBER); delay (3000); COUNTER=0; } else //Second mistake. End of the game. { ATTEMPT_NUMBER--; digitalWrite(LED_YELLOW_1,LOW); digitalWrite(LED_YELLOW_2,LOW); digitalWrite(LED_GREEN,LOW); digitalWrite(LED_RED,HIGH); Serial.println(WRONG_NUMBER); delay(1000); Serial.println(ATTEMPT + ATTEMPT_NUMBER); delay(3000); Serial.println (FAILURE); delay(1000); Serial.println(THE_RIGHT_VALUE + WINNING_NUMBER); COUNTER=0; } } } }
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.