Skocz do zawartości

Serwomechanizm uniemożliwia sterowaniem sygnałem PWM na innych wyjściach.


Pomocna odpowiedź

Napisano

Witam wszystkich

Jestem początkujący z arduino i napotkałem pewien problem. Programuję coś na kształt "testera" serwomechanizmu SG90. Program na tę chwilę jest niewielki, ponieważ utknąłem w miejscu...

Mianowicie, po rozpoczęciu programu, w funkcji "loop" znajduje się przełączanie między funkcjami wybierania ustawiania jasności wyświetlacza 16x2, a funkcją manualnego poruszania serwem przy pomocy wejścia analogowego.

Program działa idealnie dopóki nie przypiszę serwa do danego pinu...

Po funkcji "serwo.attach(PinSerwa)" ustawienie jasności wyświetlacza nie działa. Po przypisaniu serwa do pinu, pin, do którego podpięta jest dioda wyświetlacza "przechodzi" w tryb 0-1, i gdy wypełnienie jasności nie jest maksymalne, to dioda doświetlająca w ogóle nie świeci.

Można dalej przełączać się między funkcjami, można sterować serwem, lecz dioda wyświetlacza świeci się tylko gdy wartość wypełnienie ustawiona jest na 255.

Dodam, że po usunięciu z programu funkcji "serwo.attach" cały program działa dobrze, ustawiona jasność wyświetlacza pozostaje ciągle taka sama aż do kolejnej zmiany. Wyświetlacz wyświetla odpowiednie wychulenie serwa, wszystko jest w porządku, rzecz jasna serwo nie reaguje.

/*    ARDUINO LEONARDO
* Wyswietlacz podlaczony do pinow 2,3,4,5,6,7, podswietlenie wyswietlacza do pinu 9.
* Analog x do pinu A0, analog Y do pinu A1
* przycisk do pinu 12
* Dioda LED do pinu 13.
* Serwo do pinu 11
*/


#include <LiquidCrystal.h>
#include <Servo.h>

#define lcdLed 9
#define LED 13
#define przycisk 12
#define analogX A0
#define analogY A1

LiquidCrystal lcd(2,3,4,5,6,7);
Servo serwo;

int wartoscX = 0;
int wartoscY = 0;
byte jasnosc = 130;
byte pozycja = 90;
bool dioda = false;

void setup(){
 lcd.begin(16,2);
 lcd.clear();
 lcd.setCursor(0,0);
 lcd.print("Witaj");
 analogWrite(lcdLed, jasnosc);
 delay(1000);
 pinMode(przycisk, INPUT_PULLUP);
 pinMode(lcdLed, OUTPUT);
 pinMode(LED, OUTPUT);
 delay(1500);
 lcd.clear();
}

void loop(){
 //Ustawienie jasnosci wyswietlacza
 while(digitalRead(przycisk) == HIGH){
   ustjasnosc();
 }
 while(digitalRead(przycisk) == LOW){lcd.clear();delay(20);}


//Sterowanie manualne serwem
 while(digitalRead(przycisk) == HIGH){
   serwo.attach(11);
   sterujserwo();
 }
 while(digitalRead(przycisk) == LOW){lcd.clear();delay(20);serwo.detach();}
}



void ustjasnosc(){
 lcd.setCursor(0,0);
 lcd.print("Jasnosc");
 if(analogRead(analogX) >=800){
   if(jasnosc < 255){
   jasnosc+=5;
   }
 }
 if(analogRead(analogX) <=200){
   if(jasnosc > 0){
   jasnosc-=5;
   }
 }
 if(jasnosc == 0){
   lcd.setCursor(8,0);
   lcd.print("MIN");
 }
 if(jasnosc > 0 && jasnosc < 10){
   lcd.setCursor(8,0);
   lcd.print("00");
   lcd.print(jasnosc);
 }
 if(jasnosc>=10 && jasnosc<100){
   lcd.setCursor(8,0);
   lcd.print("0");
   lcd.print(jasnosc);
 }
 if(jasnosc>=100 && jasnosc<255){
   lcd.setCursor(8,0);
   lcd.print(jasnosc);
 }
 if(jasnosc==255){
   lcd.setCursor(8,0);
   lcd.print("MAX");
 }
 analogWrite(lcdLed, jasnosc);
 delay(50);
}




void sterujserwo(){
 pozycja = map(analogRead(analogX), 0, 1023, 0, 180);
 lcd.setCursor(0,0);
 lcd.print("Serwo");
 lcd.setCursor(0,1);
 if(pozycja <100){
   lcd.print("0");
 }
 lcd.print(pozycja);
 serwo.write(pozycja);
 delay(20);
}

O Kurczaczki... Wielkie dzięki za pomoc 🙂

Problem rozwiązany, przepiąłem diodę wyświetlacza na pin 11 (taki, na którym używanie biblioteki nie dezaktywuje PWM) i wszystko jest w porządku.

Jeszcze raz wielkie dzięki za pomoc, biorę się za rozbudowę programu 🙂

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ę »
×
×
  • Utwórz nowe...