Ta strona używa ciasteczek (plików cookies), dzięki którym może działać lepiej. Dowiedz się więcejRozumiem i akceptuję
Odbierz rabat na filament!

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

Autor Wiadomość
Orzeszek 



Posty: 2
Wysłany: 12-09-2017, 18:40   Serwomechanizm uniemożliwia sterowaniem sygnałem PWM na innych wyjściach.

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.

Kod programu: Zaznacz cały

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

Warto przeczytać » Wejdź w trzeci wymiar z nową aktualizacją EAGLE!


Ostatnio zmieniony przez Orzeszek 12-09-2017, 18:47, w całości zmieniany 1 raz  
Postaw piwo autorowi tego posta
 
 
deshipu 




Posty: 1937
Pomógł: 101 razy
Otrzymał 168 piw(a)
Programuję w:
Python, C, Lua
Należę do:
Nigmalabs
Moje roboty:
uKubik, pKubik, Katka, Tote

Wysłany: 12-09-2017, 18:58   

A dokumentację czytał?

Drugi akapit: https://www.arduino.cc/en/Reference/Servo

Postaw piwo autorowi tego posta
 
 
Orzeszek 



Posty: 2
Wysłany: 12-09-2017, 19:19   

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 <Servo.h> nie dezaktywuje PWM) i wszystko jest w porządku.
Jeszcze raz wielkie dzięki za pomoc, biorę się za rozbudowę programu :)

Postaw piwo autorowi tego posta
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Wersja do druku

Skocz do:  

Nie rozwiązałeś swojego problemu? Zobacz podobne tematy: Arduino i programowa... Przysyłanie/Odbieran... Arduino ATmega 328-k... Arduino, problem z o...
lub przeszukaj forum po wybranych tagach: innych, na, pwm, serwomechanizm, sterowaniem, sygnalem, uniemozliwia, wyjsciach.


Powered by phpBB modified by Przemo © 2003 phpBB Group
Popularne kursy: Arduinopodstawy elektroniki