Skocz do zawartości

digitalread

Użytkownicy
  • Zawartość

    20
  • Rejestracja

  • Ostatnio

Reputacja

2 Neutralna

O digitalread

  • Ranga
    2/10

Ostatnio na profilu byli

Blok z ostatnio odwiedzającymi jest wyłączony i nie jest wyświetlany innym użytkownikom.

  1. Witam, podczas kursu rpi natknąłem na ten sam problem. Wyskakuje Ci ten błąd ponieważ nie jesteś w katalogu gdzie zapisane masz zdjęcia. Wejdź w folder gdzie kamerka zrobiła zdjęcia do time lapsa i tam wpisz: ffmpeg -i image%04d.jpg -r 10 -vcodec libx264 -vf scale=1280:720 timelapse.mp4
  2. Kurs zapowiada się ciekawie czekam z niecierpliwością na kontynuację.
  3. Witam zbudowałem sześcian z diod LED i chciałbym sterować świeceniem diod pilotem. Program napisałem wykorzystując bibliotekę Rc5 i jest kilka problemów. Nie potrafię napisać kodu, który po wciśnięciu przycisku np.1 na pilocie zapamięta wciśniecie przycisku jako logiczne 1 i wywoła funkcję, która będzie świeciła diodami(tryb 1) Po wciśnięciu innego przycisku np. 2 chciałbym aby diody przestały świecić w "trybie 1 i" zaczęły inaczej świecić (trybie 2). Mówiąc krótko wciskam przycisk 1 diody świecą w trybie 1 wciskam kolejny przycisk i diody zaczynają inaczej świecić(tryb 2). Dotychczas udało mi się zrobić tak, że wcisnę np. przycisk 1 i program zapamiętuje wciśniecie przycisku i diody ciągle świecą (wcześniej musiałem ciągle trzymać przycisk, żeby diody ciągle świeciły). Ale jest problem taki, że program zapamiętuje wciśniecie tego przycisku i dalej nic nie da się zrobić ani zmienić tryb świecenia ani wyłączyć diody(muszę zrobić reset aby diody się wyłączyły). Mógłby mi ktoś to na chłopski rozum wytłumaczyć jak to zrobić? Moje tryby napisałem jako funkcje, gdzie pierwsza funkcja to zwykłe miganie diodami, a druga to rozjaśnianie i gaszenie diod z pinu PWM. Tak wygląda mój kod: #define warstwa1 3 #define warstwa11 5 //podlaczenie diod do pinow PWM #define warstwa2 6 #define warstwa22 9 #define warstwa3 10 #define warstwa33 11 #define TSOP_PIN 7 //odbiornik podczerwieni #include <RC5.h> //biblioteka standard RC5 RC5 rc5(TSOP_PIN); //Informacja o podłączeniu odbiornika TSOP int wypelnienie=0; //zmienna dla PWM (dla funkcji dioda1) //Zmienne dla RC5 byte address; byte command; byte toggle; int button; void setup() { pinMode(TSOP_PIN ,INPUT); //odbiornik podczerwieni pinMode(warstwa1, OUTPUT); //diody jako wyjscie i wylacz wszystkie na starcie digitalWrite(warstwa1, 0); pinMode(warstwa11, OUTPUT); digitalWrite(warstwa11, 0); pinMode(warstwa2, OUTPUT); digitalWrite(warstwa2, 0); pinMode(warstwa22, OUTPUT); digitalWrite(warstwa22, 0); pinMode(warstwa3, OUTPUT); digitalWrite(warstwa3, 0); pinMode(warstwa33, OUTPUT); digitalWrite(warstwa33, 0); Serial.begin(9600); } void loop() { //Jeśli odebrano komendę if (rc5.read(&toggle, &address, &command)) { if(command == 2) { button=2; } // jesli odebrano zmienną command o wartosci 2 to zmienna button ma wartosc 2 else if (command == 1) { button=1;} } switch(button){ //wybierz zmienna button case 2: funkcja2(255,5,50); // Serial.println(button); break; case 1: funkcja1(250); //wlacz funkcje migania Serial.println(button); break; } } void funkcja1(int czas) { //funkcja1 digitalWrite(warstwa33, HIGH); delay(czas); digitalWrite(warstwa33, LOW); delay(czas); } void funkcja2( int ilewypelnienie, int zmiana, int czas){ //funkcja2 if(wypelnienie<ilewypelnienie){ analogWrite(warstwa1, wypelnienie); analogWrite(warstwa11, wypelnienie); analogWrite(warstwa2, wypelnienie); analogWrite(warstwa22, wypelnienie); analogWrite(warstwa3, wypelnienie); analogWrite(warstwa33, wypelnienie); wypelnienie+= zmiana; } if(wypelnienie==ilewypelnienie){ while(wypelnienie!=0){ analogWrite(warstwa1, wypelnienie); analogWrite(warstwa11, wypelnienie); analogWrite(warstwa2, wypelnienie); analogWrite(warstwa22, wypelnienie); analogWrite(warstwa3, wypelnienie); analogWrite(warstwa33, wypelnienie); wypelnienie=wypelnienie-zmiana; delay(czas); } } delay(czas); } I teraz po wciśnięciu przycisku 2 (tryb 2)do zmiennej button będzie ciągle przypisywał wartość 2 i nie mogę wtedy włączyć trybu 1. Tak to wygląda w monitorze portu szeregowego(screen w załączniku). I teraz jak zrobić, żeby dało się przełączać tryby lub wciśniecie tego samego przycisku powodowało by wyłączenie danego trybu? Napisałem prosty program, który po wciśnięciu switcha zapala diode i dioda gaśnie dopiero po ponownym wciśnięciu switcha. Tak wygląda ten kod: boolean buttonState1 = false; #define buttonPin1 7 //pin do odczytu stanu przycisku #define led1 11 void setup() { pinMode(led1, OUTPUT); //Dioda jako wyjście pinMode(buttonPin1, INPUT_PULLUP); //Przycisk jako wejście digitalWrite(led1, LOW); //Wyłączenie diody Serial.begin(9600); } void loop() { if (digitalRead(buttonPin1) == LOW) { delay(20); //20ms na obsługę drgań styków buttonState1 = !buttonState1; //zmiana na odwrotny stan if (buttonState1 == true){ digitalWrite(led1, HIGH); Serial.println(buttonState1); } else { digitalWrite(led1, LOW); Serial.println(buttonState1); } while (digitalRead(buttonPin1) == LOW); //czekamy tak długo, jak długo wciśnięty jest przycisk delay(20); //20ms na obsługę drgań styków } } Przerobiłem kod tak aby po wciśnieciu przycisku wywołał funkcje 2 lecz program nie działa tak jak chciałem tzn. rozjaśnienie i przygaszenie diody. boolean buttonState1 = false; // aktualny stan zaświecenia diody #define buttonPin1 7 //pin do odczytu stanu przycisku #define led1 11 //pin do obsługi diody int wypelnienie = 0; void setup() { pinMode(led1, OUTPUT); //Dioda jako wyjście pinMode(buttonPin1, INPUT_PULLUP); //Przycisk jako wejście digitalWrite(led1, LOW); //Wyłączenie diody Serial.begin(9600); } void loop() { if (digitalRead(buttonPin1) == LOW) { delay(20); //20ms na obsługę drgań styków buttonState1 = !buttonState1; //jest stan true i zamienia go na false if (buttonState1 == true){ funkcja2(255,5,50); Serial.println(buttonState1); Serial.println(wypelnienie); } else { digitalWrite(led1, LOW); // dioda sie Serial.println(buttonState1); Serial.println(wypelnienie); } while (digitalRead(buttonPin1) == LOW); //czekamy tak długo, jak długo wciśnięty jest przycisk delay(20); //20ms na obsługę drgań styków } } void funkcja2( int ilewypelnienie, int zmiana, int czas){ //ta sama funkcja co dioda tylko, ze na instrukcji warunkowej if if(wypelnienie<ilewypelnienie){ analogWrite(led1, wypelnienie); wypelnienie+= zmiana; } if(wypelnienie==ilewypelnienie){ while(wypelnienie!=0){ analogWrite(led1, wypelnienie); wypelnienie=wypelnienie-zmiana; delay(czas); } } delay(czas); } Wciśniecie przycisku powoduje ustawienie stanu logicznego 1 i zmianę wypełnienia o wartość 5. Wytłumaczy mi ktoś łopatologiczne jak napisać kod który: Po wciśnięciu przycisku na pilocie lub zwykłego switcha zapamięta wciśniecie przycisku jako logiczne 1 i będzie wykonywał wywołaną funkcje Ponowne wciśniecie tego samego przycisku spowoduje wyłączenie wywołanej funkcji lub wciśniecie innego przycisku zatrzyma aktualnie wywoływaną funkcję i wywoła inną Proszę o pomoc.
  4. Twój kod działa tak jak chciałem, czyli muszę zrobić tak, że jednym przyciskiem włączam funkcje a innym przyciskiem ją wyłączam? Bo jak teraz wcisnąłem 2 na pilocie to dioda się świeci i nie muszę trzymać przycisku a po wciśnięciu przycisku 3 dioda gaśnie. Więc w analogiczny sposób powinno zadziałać wywoływanie funkcji jednym przyciskiem a drugim jej wyłączanie.
  5. To ma być sześcian ozdobny z diod LED 4 warstwowy. Każdą warstwę chcę oddzielnie podłączyć do pinów atmegi. Korzystając z biblioteki rc5 na instrukcji warunkowej switch case chce aby po wciśnięciu odpowiedniego przycisku na pilocie diody w określony sposób się zapalały.Oczywiście jeszcze do atmegi zastanie podłączony odbiornik podczerwieni TSOP2236. Problem tkwi tylko w tym, żeby dany tryb świecenia diod działał gdy raz wcisnę odpowiedni przycisk na pilocie. Napisałem funkcje 'void dioda1' i działa ona tylko wtedy gdy trzymam wciśnięty przycisk na pilocie. Napisałem funkcje kolejną funkcje która robi dokładnie to samo tylko z użyciem pętli for. Funkcja 'void dioda' wykona sie załóżmy 20 razy. Po wybraniu odpowiedniego przycisku na pilocie dla tej funkcji diody będą świeciły według napisanej funkcji i nie będę musiał wtedy trzymać przycisku na pilocie aby diody świeciły. Problem tkwi w tym, że np. po 10 powtórzeniach chciałbym zmienić tryb świecenia, ale muszę poczekać aż diody zaświecą się te 20razy. Przy tej funkcji nie wiem w jaki sposób ją zatrzymać, bo ogółnie funkcja działa tak jak chciałem czyli nie musze trzymać przycisku na pilocie aby diody świeciły, ale nie wiem jak zatrzymać tą funkcję żeby przełączyć na kolejny tryb świecenia diod.. Myślałem żeby użyć przerwania, ale za bardzo nie wiem jak. Myślę, że najłatwiej jest zmodyfikować funkcję 'void dioda1' tak aby po wciśnięciu i puszczeniu przycisku na pilocie diody świeciły według napisanej funkcji. Myślałem, żeby do tej funkcji dodać może funkcje boolean i do tego zmienną 'stan' ale nie wiem jak to razem ze sobą połączyć.
  6. Witam chciałbym zbudować sześcian z diod LED, którymi będę sterował za pomocą pilota. Problem tkwi w tym, że jestem początkującym programistą i nie wiem jak napisać kod aby wciśniecie przycisku na pilocie oznaczało logiczne 1 i żeby program zapamiętywał ten stan. Chodzi o to żeby nie trzymać ciągle wciśniętego przycisku tylko żeby raz go wcisnąć. Również chce zrobić tak, żeby za pomocą guzików(przycisków) w pilocie przełączać różne tryby świecenia diod. Napisałem wstępnie 3 testowe funkcje które mają być jednymi z trybów świecenia diodami. Funkcja na pętli for działa teoretycznie prawidłowo, ale nie wiem jak ją zatrzymać tak aby przełączyć guzikiem z pilota na inny tryb. Funkcja dioda1 działa poprawnie tylko, że trzeba ciągle trzymać przycisk na pilocie. Wygląd kodu: #define TSOP_PIN 7 #define diodyLED 11 #include <RC5.h> RC5 rc5(TSOP_PIN); //Informacja o podłączeniu odbiornika TSOP int wypelnienie=0; //Zmienne dla RC5 byte address; byte command; byte toggle; void setup() { pinMode(TSOP_PIN ,INPUT); //odbiornik podczerwieni pinMode(diodyLED, OUTPUT); //diody LED digitalWrite(diodyLED, LOW); } void loop() { //Jeśli odebrano komendę if (rc5.read(&toggle, &address, &command)) { switch(command){ case 2: dioda(255,50,0,999); //wlacz funkcje dioda i potworz ją 999 razy break; case 3: dioda1(0,255,5,50); break; case 1: zamigajLED(250); break; } } } void zamigajLED(int czas) { analogWrite(diodyLED, HIGH); delay(czas); analogWrite(diodyLED, LOW); delay(czas); } void dioda(int ile, int czas,int ile2,int ile3){ //funkcja z pętlą nieskonczoną if(digitalRead(2)==LOW){ for (int j=0; j<=ile3; j++){ for (int i=0; i<=ile; i++){ analogWrite(diodyLED, i); delay(czas); } for (int i =ile; i>=ile2; i--){ analogWrite(diodyLED, i); delay(czas); } } } } void dioda1(int wyplelnienie, int ilewypelnienie, int zmiana, int czas){ if(wypelnienie<ilewypelnienie){ analogWrite(diodyLED, wypelnienie); wypelnienie+= zmiana; } if(wypelnienie==ilewypelnienie){ while(wypelnienie!=0){ analogWrite(diodyLED, wypelnienie); wypelnienie=wypelnienie-zmiana; delay(czas); } } delay(czas); } Próbowałem napisać kod, który będzie zapamiętywał stan przycisku, ale nie wiem jak go połączyć z funkcją dioda1. boolean stan = false; // aktualny stan zaświecenia diody int TSOP_PIN = 10; //pin do odczytu stanu przycisku int diodyLED = 11; //pin do obsługi diody void setup() { pinMode(diodyLED OUTPUT); //Dioda jako wyjście pinMode(TSOP_PIN, INPUT_PULLUP); //Przycisk jako wejście digitalWrite(diodyLED, HIGH); //Wyłączenie diody } void loop() { if (digitalRead(TSOP_PIN) == LOW) { //jak odwołać się do guzika na pilocie? delay(20); //20ms na obsługę drgań styków stan = !stan; //ustawienie przeciwnego stanu diody if (stan == true){ digitalWrite(diodyLED, stan); } else { digitalWrite(diodyLED, stan); } while (digitalRead(TSOP_PIN) == LOW); //czekamy tak długo, jak długo wciśnięty jest przycisk delay(20); //20ms na obsługę drgań styków } } Nie mam pojęcia jak mam odnieść się w instrukcji warunkowej do dowolnego przycisku(guzika) na pilocie lub czy ewentualnie da się zatrzymać funkcje dioda na pętli for która powtarza się 999razy czy trzeba czekać aż się ona 'skończy'. Mógłby ktoś pomoc z napisaniem kodu? Dodam jeszcze, że w kursie budowy robotów napisana funkcja wywołana w instrukcji warunkowej switch-case za pomocą przycisku w pilocie działa po jednym wciśnięciu i nie trzeba trzymać przycisku aby silnik się kręcił. Wygląd kodu: void leftMotor(int V) { if (V > 0) { //Jesli predkosc jest wieksza od 0 (dodatnia) V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(L_DIR, 0); //Kierunek: do przodu analogWrite(L_PWM, V); //Ustawienie predkosci } else { V = abs(V); //Funkcja abs() zwroci wartosc V bez znaku V = map(V, 0, 100, 0, PWM_MAX); digitalWrite(L_DIR, 1); //Kierunek: do tyłu analogWrite(L_PWM, V); //Ustawienie predkosci } } Proszę o pomoc.
  7. Witam panowie wgrałem prosty program przykładowy blik do mikrokontrolera Arduino Uno. Teraz chciałbym aby ten program działał bez płytki arduino na płytce prototypowej. Na stronie arduino znalazłem poradnik jak to zrobić zrobiłem wszystko według instrukcji i nie działa program. Na pinie jest zaledwie 0,5V gdzie napięcie powinno raz mieć 5V a po 1sec 0V(bo taki program jest wgrany). Nie wiem co jest nie tak wszystko powinno byc dobrze zmontowane wklejam zdjęcia układu i proszę o pomoc.
  8. Chce aby diody sie zapalały i gasły i żeby serwo się obracało. Chodzi o to że mam serwo 360stopni i potencjometrem ustawić mogę prędkość obrotu serwa. Chce zrobić taką ozdobę że diody beda powoli sie zapalać i przygasac, a serwo bedzie powoli obracać diodami. Dziękuję za kod sprawdzę go jak się uda to jeszcze dzisiaj.
  9. Dziwne wyniki wychodzą oczywiście potencjometr był w tej samej pozycji.
  10. Ok mam tak podłączone przez stabilizator a na wyjsciu dodatkowo plus na wyjsciu stabilizatora razem z serwo tak samo masa razem, ale to nic nie zmienia zasilacz podłączony i dalej nic.
  11. Wyjście środkowe pod A0 a zasilanie razem z serwo. Schemat: http://blog.mageek.com.pl/kurs-arduino/serwomechanizmy/
  12. No rozumiem, że steruje szerokością sygnału PWM przy diodach i serwie. A serwo wychyla się w lewo lub prawo w zależności od położenia potencjometru. Kod na sterowanie serwa wziąłem z przykładów, a kod z diodami sam napisałem...
  13. Oba programy są poprawnie napisane działają, ale tylko osobno. Nie wiem rozgryźć funkcje loop, bo prawdopodobnie tam są błędy.
  14. Zasilaczem impulsowym na wyjsciu 12v 2.1A lub przez USB ale to i tak nic nie zmienia. Problem raczej jest po stronie kodu...
  15. #include <Servo.h> //biblioteka serwa #define LED 9 // definicja diody led jako 9 wyjscie Servo moje_serwo; // stworz obiekt moje_serwo do kontroli serwa int wypelnienie = 0; // zmienne do sterowania wypełnieniem sygnału PWM diod LED int zmiana = 5; int potencjometr = A0; // pin analogowy do odczytu potencjometra int wartorsc; // zmienna przechowujaca odczyt z potencjometru void setup() { moje_serwo.attach(3); // serwo podlaczone jest do pinu 3 pinMode(LED,OUTPUT); //wyjscie diody LED } void loop() { analogWrite(LED,wypelnienie); if(wypelnienie<255) //jesli dioda nie swieci na 100% wypelnienia { wypelnienie+= zmiana; //zwieksz wypelnienie do 100% co 5 } if( wypelnienie==255) //jesli wypelnienie jest rowne 100% { while(wypelnienie!=0) { wypelnienie-=zmiana; //zmniejsz wypelnienie do zera i spowrotem analogWrite(LED,wypelnienie); delay(50); } } wartorsc = analogRead(potencjometr); // odczytaj wartosc z potencjometru (wartosc z przedzialu 0-1023) wartorsc = map(wartorsc, 0, 1023, 0, 180); // zeskaluj odczyt do miary katowej (od 0 do 180) lub czasu trwania stanu wysokiego (od 700 do 2300) moje_serwo.write(wartorsc); // ustaw pozycje serwa z zeskalowanego odczytu } Stworzyłem takie coś, ale serwo głupieje nie reaguje na obrót gałką potencjometru, a diody nawet się nie zapalają.... Pomoże ktoś poprawić kod?
×
×
  • Utwórz nowe...