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);
}