Skocz do zawartości

Arduino Uno problem z programem


digitalread

Pomocna odpowiedź

Mówiłeś, że zasilasz serwo z zasilacza, a ja widzę na schemacie, że je podłączyłeś do pinu 5V arduino i zasilasz je z niego.

Poczytaj sobie to:

https://forbot.pl/blog/kurs-arduino-silniki-pwm-serwomechanizm-zewnetrzne-biblioteki-id3913

ze szczególnym uwzględnieniem zasilania.

Edytowano przez deshipu
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

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

2 godziny temu, digitalread napisał:

#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?

Ten Twój kod najpierw bardzo szybko zapala LED, czyta potencjometr i wysyła coś na serwo, a potem przez 2550 ms nie robi nic oprócz powolnego gaszenia diody LED... Tak miało być? Co właściwie chcesz osiągnąć? Jak dioda się zapala, to chcesz sterować serwem, a jak gaśnie to nie chcesz sterować serwem? Jeśli tak, to wystarczy dodać jakiś delay na końcu funkcji loop'a. Jeśli chcesz sterować serwem i równocześnie gasić/zapalać LED, to spróbuj może takiej koncepcji:

bool flaga = false;

void loop(void) {
	if (!flaga) {
		//zapalaj LED
		if (wypelnienie < 255) {
			analogWrite(LED, wypelnienie);
			wypelnienie += zmiana;
		} else {
			wypelnienie = 255; // na wypadek gdybys przeskoczyl 255
			flaga = true;
		}
	} else {
		//gas LED
		if (wypelnienie > 0) {
			analogWrite(LED, wypelnienie);
			wypelnienie -= zmiana;
		} else {
			wypelnienie = 0; // na wypadek gdybys przeskoczyl 0
			flaga = false;
		}
	}
	
	// tutaj rob costam z serwem i potencjometrem

	delay(50);
}

 

Link do komentarza
Share on other sites

18 minut temu, Nawyk napisał:

Ten Twój kod najpierw bardzo szybko zapala LED, czyta potencjometr i wysyła coś na serwo, a potem przez 2550 ms nie robi nic oprócz powolnego gaszenia diody LED... Tak miało być? Co właściwie chcesz osiągnąć? Jak dioda się zapala, to chcesz sterować serwem, a jak gaśnie to nie chcesz sterować serwem? Jeśli tak, to wystarczy dodać jakiś delay na końcu funkcji loop'a. Jeśli chcesz sterować serwem i równocześnie gasić/zapalać LED, to spróbuj może takiej koncepcji:


bool flaga = false;

void loop(void) {
	if (!flaga) {
		//zapalaj LED
		if (wypelnienie < 255) {
			analogWrite(LED, wypelnienie);
			wypelnienie += zmiana;
		} else {
			wypelnienie = 255; // na wypadek gdybys przeskoczyl 255
			flaga = true;
		}
	} else {
		//gas LED
		if (wypelnienie > 0) {
			analogWrite(LED, wypelnienie);
			wypelnienie -= zmiana;
		} else {
			wypelnienie = 0; // na wypadek gdybys przeskoczyl 0
			flaga = false;
		}
	}
	
	// tutaj rob costam z serwem i potencjometrem

	delay(50);
}

 

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.

Link do komentarza
Share on other sites

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!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.