Treker (Damian Szymański) Sierpień 28, 2019 Udostępnij Sierpień 28, 2019 @Emerid witam na forum 4 godziny temu, Emerid napisał: Dlaczego zwieramy masy 4 i 5 z 12 i 13 na L293D? Nie sterują one dwoma różnymi silnikami? Masa to masa, wszystkie punkty GND w całym układzie powinny być połączone. Nie ma to nic wspólnego ze sterowaniem dwóch różnych silników Zasilanie dla silników doprowadzane jest za pomocą jednego pinu (+ masa). Odpowiednie sterowanie silnikami jest realizowane wewnątrz mostka.
Dami12250 Październik 22, 2019 Udostępnij Październik 22, 2019 Zadanie 8.1 void setup() { pinMode(6, OUTPUT); digitalWrite(6, HIGH); pinMode(9, OUTPUT); digitalWrite(9, HIGH); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(10, OUTPUT); pinMode(11, OUTPUT); } void loop() { digitalWrite(8, LOW); digitalWrite(7, HIGH); digitalWrite(11, HIGH); digitalWrite(10, LOW); delay(3000); digitalWrite(8, HIGH); digitalWrite(7, LOW); digitalWrite(10, HIGH); digitalWrite(11, LOW); delay(3000); } Bardzo fajny kurs
Treker (Damian Szymański) Październik 22, 2019 Udostępnij Październik 22, 2019 @Dami12250 dzięki, miło słyszeć! PS pamiętaj o komentarzach w programie, bo to ważny element życia programisty. Z czasem sam zapomnisz co miał ten program robić
Dami12250 Październik 23, 2019 Udostępnij Październik 23, 2019 Mam pytanie do zadania 8.4 Dokładniej problem w tym że dioda zapala się gwałtownie i powoli przygasa i tak w kółko Wydaje mi się że w kodzie coś jest nie tak ale nie wiem co bool par = true; int i = 0; void setup() { pinMode(6, OUTPUT); //Sygnał PWM silnika nr 1 pinMode(7, OUTPUT); //Sygnały sterujące kierunkiem obrotów silnika nr 1 pinMode(8, OUTPUT); digitalWrite(7, LOW); //Silnik nr 1 - obroty w lewo digitalWrite(8, HIGH); analogWrite(6, 0); } void loop() { for (i; par = false; i++) { analogWrite(6, i); //Spokojne rozpędzanie silnika delay(25); } for (i; par = true; i--) { analogWrite(6, i); //Spokojne chamowanie silnika delay(25); } if(i = 1) { //jeżeli i to 0 rozjaśnij par = false; } if(i = 254) { //jeżeli i to 254 przygaśnij par = true; } }
ethanak Październik 23, 2019 Udostępnij Październik 23, 2019 Coś dokładnie pokręciłeś. for (i; par = false; i++) { analogWrite(6, i); //Spokojne rozpędzanie silnika delay(25); } Ta pętla nigdy nie zostanie wykonana, bo w warunku masz par = false (czyli kończ pętlę) for (i; par = true; i--) { analogWrite(6, i); //Spokojne chamowanie silnika delay(25); } Ta pętla nigdy się nie skończy, bo w warunku masz par = true (co oznacza "kręć się w kółko"). W efekcie na pinie 6 masz bardzo ładny przebieg piłokształtny i taki właśnie widzisz na diodzie. Kompilator Ci tego nie wykryje, bo sprawdza tylko poprawność składni, a nie sens. Podobnie zdanie "ciotkę parowozu przetaczaj na sznyclach" jest z punktu widzenia gramatyki całkowicie poprawne - i całkowicie pozbawione sensu Wyobraź sobie że jesteś mikrokontrolerem - spróbuj ręcznie "wykonać" ten program, a sam zobaczysz o co chodzi. 2
Dami12250 Listopad 3, 2019 Udostępnij Listopad 3, 2019 Cześć, mam taki problem: Chciałem napisać prosty program. Miał on działać w ten sposób: Są 4 Diody każda w innym kolorze (zdjęcie 1) po wciśnięciu przycisku zapala się pierwsza dioda (zielona) po wciśnięciu go drugi raz zapala się dioda druga dioda (żółta) i tak dalej. (WSZYSTKO W TEJ CZĘŚCI DZIAŁA) Następnie chciałem aby liczba kliknięć przycisku wyświetlała się na wyświetlaczu LCD więc dopisałem kilka linijek kodu ale zamiast liczby kliknięć wyświetlały mi się takie znaki . Potem szukałem błędu w kodzie parę rzeczy pozmieniałem, wgrałem program i na LCD wyświetlił się ten kwadracik (zdjęcie 2, zaznaczony niebieską strzałką ). Cofnąłem wszystko co pozmieniałem, w grałem program i zamiast zniknąć pojawił się kolejny taki sam kwadracik. Odłączyłem zasilanie od Arduino ( kabel łączący Arduino z komputerem) i podłączyłem jeszcze raz. Nie pomogło. Teraz nie wyświetla się nic oprócz prostokątów (zdjęcie 3). Próbowałem wgrać program jeszcze raz ale to też nie pomogło. KOD : #include<LiquidCrystal.h> #define zielona 2 #define czerwona 4 #define zolta 3 #define niebieska 5 #define przycisk 6 int klik = 0; String klik2 = ""; void setup() { pinMode(zielona, OUTPUT); //KONFIGURACJA WEJŚĆ I WYJŚĆ pinMode(czerwona, OUTPUT); pinMode(niebieska, OUTPUT); pinMode(zolta, OUTPUT); pinMode(przycisk, INPUT_PULLUP); digitalWrite(zielona, LOW); //USTAWIENIE WSZYSTKICH LEDÓW NA STAN NISKI digitalWrite(czerwona, LOW); digitalWrite(niebieska, LOW); digitalWrite(zolta, LOW); LiquidCrystal lcd(12,11,10,9,8,7); //USTAWIENIE LCD lcd.begin(16, 2); lcd.println("Liczba :"); // WYŚWIETLENIE NA LCD LICZBA : lcd.println(klik2); //WYŚWIETLENIE NA LCD ILOŚCI KLIKNIĘĆ PRZYCISKU } void loop() { klik2 = String(klik); //ZAMIANA Z INT NA STRING if(digitalRead(przycisk) == LOW) { //JEŻELI PRZYCISK WCIŚNIĘTY KLIK +1 klik++; } while(digitalRead(przycisk) == LOW) {} // PUSTA PĘTLA DLA ZATRZYMANIA switch (klik) { //JEŻELI PRZYCISK WCIŚNIĘTY 0 RAZY ZGAŚ WSZYSTKIE DIODY case 0 : digitalWrite(zielona, LOW); digitalWrite(czerwona, LOW); digitalWrite(niebieska, LOW); digitalWrite(zolta, LOW); break; delay(50); case 1 : //JEŻELI PRZYCISK WCIŚNIĘTY 1 RAZ ZAPAL TYLKO ZIELONĄ DIODE digitalWrite(zielona, HIGH); digitalWrite(czerwona, LOW); digitalWrite(niebieska, LOW); digitalWrite(zolta, LOW); break; delay(50); case 2 : //JEŻELI PRZYCISK WCIŚNIĘTY 2 RAZ ZAPAL TYLKO ZOLTĄ DIODE digitalWrite(zielona, LOW); digitalWrite(czerwona, LOW); digitalWrite(niebieska, LOW); digitalWrite(zolta, HIGH); break; delay(50); case 3 : //JEŻELI PRZYCISK WCIŚNIĘTY 3 RAZ ZAPAL TYLKO CZERWONĄ DIODE digitalWrite(zielona, LOW); digitalWrite(czerwona, HIGH); digitalWrite(niebieska, LOW); digitalWrite(zolta, LOW); break; delay(50); case 4 : //JEŻELI PRZYCISK WCIŚNIĘTY 4 RAZ ZAPAL TYLKO NIEBIESKĄ DIODE digitalWrite(zielona, LOW); digitalWrite(czerwona, LOW); digitalWrite(niebieska, HIGH); digitalWrite(zolta, LOW); break; delay(50); case 5 : // JEŻELI PRZYCISK WCIŚNIĘTY 5 RAZ USTAW KLIK NA 0 klik = 0; break; delay(50); } delay(50); } Zdjęcia:
Treker (Damian Szymański) Listopad 3, 2019 Udostępnij Listopad 3, 2019 @Dami12250 wyświetlanie samych prostokątów to najczęściej efekt błędnego podłączenia. Sprawdź czy przypadkiem nic Ci się nie poluzowało podczas tych wszystkich eksperymentów Wgraj też dla testu jakiś prosty program z kursu, który tylko wyświetla tekst, będziesz miał mniej miejsc, które mogę generować błąd.
Lukasz1979 Listopad 6, 2019 Udostępnij Listopad 6, 2019 Witam, Można prosić o wyjaśnienie, w jakim celu w kodzie znajdują się linijki zaznaczone na czerwono? Wydaje mi się, że jeśli nie zmieniamy stanu wyjść cyfrowych to można je usunąć.... Ale już kilka razy coś mi się wydawało a niekoniecznie miałem rację - stąd prośba o wyjaśnienie. Pozdrawiam, Łukasz.
Treker (Damian Szymański) Listopad 6, 2019 Udostępnij Listopad 6, 2019 @Lukasz1979 tak, masz rację - w tym konkretnym przypadku nie są potrzebne, ale też nie szkodzą To tak na wypadek, jakby jednak ktoś chciał zmieniać też kierunek obrotów.
Krzysiek_Zam Grudzień 2, 2019 Udostępnij Grudzień 2, 2019 Hej Chciałbym sterować kierunkiem obrotu silnika. Silnik ma się zakręcić 5 razy w prawo i w lewo na zmianę i się zatrzymać. Złożyłem układ na mostku L293DNE tak jak w kursie. Pytanie: Jak można przenieść tą funkcję do pętli loop żeby tak samo działała jak jest w void setup. Jak przeniosę fragmenty kodu do void loop pętla się nie zatrzymuje tylko cały czas kręci silnikiem w lewo i prawo. Wgrałem kod: int i; // deklaracji zmiennej chyba nie trzeba opisywać :P void setup() { pinMode(6, OUTPUT); //sterowanie prędkością silnika pinMode(7, OUTPUT); //piny 7 i 8 sterują kierunkiem obrotu silnika pinMode(8, OUTPUT); digitalWrite(6, HIGH); // ustawienie maksymalnej prędkości obrotowej silnika for(i=1;i<=5;i++){ //zainicjowanie pętli for - ma przebiec 5 razy digitalWrite(7, HIGH); // odpalamy silnik digitalWrite(8, LOW); delay(1000); digitalWrite(7, LOW); // odpalamy silnik digitalWrite(8, HIGH); delay(1000); digitalWrite(8, LOW); // stopujemy silnik delay(1000); } } void loop() { }
Treker (Damian Szymański) Grudzień 2, 2019 Udostępnij Grudzień 2, 2019 @Krzysiek_Zam witam na forum 34 minuty temu, Krzysiek_Zam napisał: Pytanie: Jak można przenieść tą funkcję do pętli loop żeby tak samo działała jak jest w void setup. Jak przeniosę fragmenty kodu do void loop pętla się nie zatrzymuje tylko cały czas kręci silnikiem w lewo i prawo. Tak właśnie działa pętla loop Po co w takim razie chcesz tam przenieść ten kod, jeśli nie chcesz, aby działał on cały czas? Jakiego efektu oczekujesz?
tarkus Grudzień 8, 2019 Udostępnij Grudzień 8, 2019 Czy ja nie mogę znaleźć, czy nie ma podanych wartości elementów?
Treker (Damian Szymański) Grudzień 9, 2019 Udostępnij Grudzień 9, 2019 @tarkus o który przykład i o jakie konkretnie elementy pytasz?
bakardi92 Styczeń 1, 2020 Udostępnij Styczeń 1, 2020 (edytowany) zadanie domowe 8.3 String dane=""; int ile=0; void setup() { pinMode(13, OUTPUT); Serial.begin(9600); } void loop() { if(Serial.available()<=0) { dane=Serial.readStringUntil('\n'); ile=dane.toInt(); if(ile>9){ Serial.println("wpisz cyfre z zakresu 0-9"); }else{ for(int i=0; i<ile; i++){ Serial.print("*"); } Serial.print('\n'); } } } Zadanie 8.4 void setup(){ pinMode(10,OUTPUT);//regulacja PWM pinMode(9,OUTPUT); // sterowanie lewo prawo pinMode(8,OUTPUT); // sterowanie lewo prawo Serial.begin(9600); } void loop(){ Serial.println("petla"); for (int i=0; i<255; i++){ analogWrite(10,i); digitalWrite(9,HIGH); delay(25); Serial.println(i); } for (int i=254; i>-1; i--){ analogWrite(10,i); delay(25); Serial.println(i); } } Edytowano Styczeń 2, 2020 przez bakardi92 1
BHBmacieg Luty 8, 2020 Udostępnij Luty 8, 2020 (edytowany) Bardzo przydatna część kursu, szczególnie, że w niedalekiej przyszłości szykuje mi się budowa prostego robota omijającego przeszkody jako gadżet firmowy. zadania domowe: 8.1 #define PWM1 6 #define PWM2 9 #define input1Silnika1 7 #define input2Silnika1 8 #define input1Silnika2 10 #define input2Silnika2 11 void setup() { pinMode(PWM1, OUTPUT); //Sygnał PWM silnika nr 1 pinMode(PWM2, OUTPUT); //Sygnał PWM silnika nr 2 digitalWrite(PWM1, HIGH); //UStawienie na stałe stanów wysokich na PWM silników digitalWrite(PWM2, HIGH); pinMode(input1Silnika1, OUTPUT); //Sygnały sterujące kierunkiem obrotów silników pinMode(input2Silnika1, OUTPUT); pinMode(input1Silnika2, OUTPUT); pinMode(input2Silnika2, OUTPUT); } void loop() { digitalWrite(input1Silnika1, HIGH); //obrot silnika 1 w lewo digitalWrite(input2Silnika1, LOW); digitalWrite(input1Silnika2, HIGH); //obrot silnika 2 w lewo - razem z pierwszy daje jazde do przodu digitalWrite(input2Silnika2, LOW); delay(3000); digitalWrite(input1Silnika1, HIGH); //obrot silnika 1 w lewo digitalWrite(input2Silnika1, LOW); digitalWrite(input1Silnika2, LOW); //obrot silnika 2 w prawo - silniki kręcą się przewinie digitalWrite(input2Silnika2, HIGH); delay(3000); digitalWrite(input1Silnika1, LOW); //obrot silnika 1 w prawo digitalWrite(input2Silnika1, HIGH); digitalWrite(input1Silnika2, LOW); //obrot silnika 2 w prawo - razem z pierwszym daje jazdę do tyłu digitalWrite(input2Silnika2, HIGH); delay(3000); } 8.4 połączone z 8.2. Wykorzystałem ledy, które symulują silnik. Mamy tutaj stopniowe i asynchroniczne rozpędzanie, stopniowe i synchroniczne hamowanie. Powtarzanie całej sekwencji zadaną ilość razy i przycisk do restartowania całego programu, aby wykonywał się od nowa. #define PWM1 6 #define PWM2 9 #define input1Silnika1 7 #define input2Silnika1 8 #define input1Silnika2 10 #define input2Silnika2 11 #define przycisk 2 void setup() { pinMode(PWM1, OUTPUT); //Sygnał PWM silnika nr 1 pinMode(PWM2, OUTPUT); //Sygnał PWM silnika nr 2 pinMode(przycisk, INPUT_PULLUP); //ustawienie pinu na przycisku pinMode(input1Silnika1, OUTPUT); //Sygnały sterujące kierunkiem obrotów silników pinMode(input2Silnika1, OUTPUT); pinMode(input1Silnika2, OUTPUT); pinMode(input2Silnika2, OUTPUT); } void loop() { for (int i = 0; i < 2; i++) { // okreslenie ilosci powtórzeń sekwnecji do wykonania for (int a = 0; a < 255; a++) { double b = a * 1.4; b = constrain(b, 0, 255); analogWrite(PWM1, a); //stopniowe rozpedzanie silnika analogWrite(PWM2, b); //asynchroniczne rozpędanie drugiego silnika digitalWrite(input1Silnika1, HIGH); //silnik 1 w lewo digitalWrite(input2Silnika1, LOW); digitalWrite(input1Silnika2, HIGH); //silnk 2 w lewo digitalWrite(input2Silnika2, LOW); delay(25); } for (int a = 255; a >= 0; a--) { analogWrite(PWM1, a); //stopniowe wyhamowywanie silników analogWrite(PWM2, a); digitalWrite(input1Silnika1, HIGH); //zachowanie kierunków oborotu w stosunku do poprzedniej pętli digitalWrite(input2Silnika1, LOW); digitalWrite(input1Silnika2, HIGH); digitalWrite(input2Silnika2, LOW); delay(25); } } while (digitalRead(przycisk) == HIGH) { //oczekiwanie na wcsinięcie przycisku w celu restartu sekwencji delay(50); } } 8.3. Cały program zintegrowałem z wyświetlaczem, który pokazuje jaką liczbę wpisaliśmy do portu oraz wypisuje w drugiej linijce odpowiednią ilość gwiazdek. Pokazuje też odpowiednią informację jeśli podana przez nas liczba jest za duża w stosunku do ilości pól wyświetlacza. #include <LiquidCrystal.h> //dolaczenie biblioteki wyswietlacza String pobraneDane = ""; //zmienna do odczytu danych podanych przez użytkownika LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //informacja o pinach wyswietlacza int pobranaCyfraINT = 0; //zmienna mowiaca o ilosci gwiazdek do wydruku int pozycja = 0; //zmienna dla pozycji kursora wyswietlacza void setup() { Serial.begin(9600); lcd.begin(16, 2); // deklaracja typu wyswietlacza Serial.println("Podaj liczbę z zakresu 0-16."); //info dla uzytkownika } void loop() { lcd.setCursor(0, 0); //ustawienie kursora lcd.print("Wpisales: "); //wyswietlenie tekstu while (Serial.available() == 0) { //oczewikawnie na wpisanie danych delay(50); } if (Serial.available() > 0) { //jesli uzytkownik podal dane pobraneDane = Serial.readString(); //pobranie info od uzytkownika pobranaCyfraINT = pobraneDane.toInt(); //zamiana string na int pozycja = 0; if (pobranaCyfraINT >= 0 && pobranaCyfraINT <= 16) { //jesli miescimy sie w polach wyswietlacza lcd.print(pobranaCyfraINT); // wypisanie na wywietlaczu info wpisanego przez uzytkownika for (int i = 0; i < pobranaCyfraINT; i++) {//petla do wypisywania gwiazdek lcd.setCursor(pozycja, 1); //ustawienie kursora w odpowiedniej pozycji lcd.print("*"); //wydruk gwiazdki na lcd pozycja++; //zmiana pozycji Serial.print("*"); //wydruk gwiazdki do portu } Serial.println(""); //przejscie do nowej linijki } else { //jeśli jesteśmy poza zakresem lcd.print(pobranaCyfraINT); // wypisanie na wywietlaczu info wpisanego przez uzytkownika lcd.setCursor(0, 1); lcd.print("Poza zakresem!"); Serial.println("Podałeś liczbę z poza zakresu!"); } } Serial.println("Podaj liczbę z zakresu 0-16."); //info dla uzytkownika while (Serial.available() == 0) { //ponowne oczekiwanie na podanie danych delay(50); } lcd.clear(); //wyczyszczenie lcd } I krótki film z działania całego zestawu. Edytowano Luty 8, 2020 przez BHBmacieg 1
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ę »