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

Kurs Arduino - #6 - kontynuacja UART, serwomechanizmy

Autor Wiadomość
Treker 




Posty: 8506
Pomógł: 126 razy
Otrzymał 526 piw(a)
Skąd: Gdynia
Programuję w:
C, Arduino
Moje roboty:
Spectrum, Fuzzy

Wysłany: 05-03-2017, 12:25   

thequeash, ponieważ prawdopodobnie przesyłasz do Arduino więcej znaków np. dodatkowe znaki końca linii. Dla każdego z nich wykonywana jest osobna instrukcja z pętli switch. Spróbuj ustawić w monitorze portu szeregowego (na dolę) opcję "Brak zakończenia linii".


Na udzielam odpowiedzi na pytania techniczne zadawane kanałami prywatnymi (maile, komunikatory, PW).
Sprawdź » Kurs ARDUINOKurs podstaw elektronikiZbuduj swojego robota - kurs!
Postaw piwo autorowi tego posta
 
 
SOYER 



Posty: 346
Pomógł: 1 raz
Otrzymał 15 piw(a)
Skąd: Kryry
Wysłany: 21-11-2017, 12:16   

Zadanie 6.1
Kod programu: Zaznacz cały

int fotoP = 0;
int fotoL = 0;
int potencjometr = 0;
boolean wyslano = false;
int liczbawcis = 0;


void setup() {
  Serial.begin(9600); //Inicjalizacja UART
  pinMode(7, INPUT_PULLUP);
 Serial.println("Uklad dokonuje pomiaru W CZASIE kiedy przycisk jest wcisniety");
 Serial.println("Aby dokonac pomiaru ciaglego trzymaj wcisniety przycisk");
}
 
void loop() {
 
  if(digitalRead(7) == LOW){
    wyslano = true;
    liczbawcis = liczbawcis+1;
    fotoP = analogRead(A3);
    fotoL = analogRead(A4);
    potencjometr = analogRead(A5);
   
  }
  if(wyslano == true){
    Serial.print("Pomiar: ");
    Serial.print(liczbawcis);
    Serial.print("\t\tFoto Prawy: ");
    Serial.print(fotoP);
    Serial.print("\t\tFoto Lewy: ");
    Serial.print(fotoL);
    Serial.print("\t\tPotencjometr: ");
    Serial.println(potencjometr);
   
    wyslano = LOW;
    delay(1000);
  }
 
}
 


Wiem, wiem, komentarze ;-)

Zadanie 6.2
Kod programu: Zaznacz cały

#define zielona 8
#define czerwona 10
#define zolta 9
int odebraneDane = "";
boolean czer = false;
boolean ziel = false;
boolean zol = false;
boolean poczatek = false;

void setup() {
  Serial.begin(9600); //Uruchomienie komunikacji
  pinMode(czerwona, OUTPUT);
  pinMode(zielona, OUTPUT);
  pinMode(zolta, OUTPUT);
  pinMode(7, INPUT_PULLUP);
 

  digitalWrite(czerwona, LOW);
  digitalWrite(zielona, LOW);
  digitalWrite(zolta, LOW);

}
 
void loop() {
  if(poczatek ==false){
  Serial.println("Wpisz prosze pierwsza litere koloru diody: z-zielona, c-czerwona lub o-zolta");
  Serial.println("Ponowny wpis litery koloru spowoduje wygaszenie diody");
 
  poczatek = !poczatek;
  while(Serial.available() == false){}
  }
 
  if(Serial.available() > 0){
    odebraneDane = Serial.read();
  }
  switch (odebraneDane) {
        case 'z':
        ziel = !ziel;
         digitalWrite(zielona, ziel);
         if(ziel == true){
         Serial.println("wlaczenie diody zielonej");
         }
         else{
          Serial.println("wylaczenie diody zielonej");
         }
         break;
        case 'c':
         czer = !czer;
         digitalWrite(czerwona, czer);
         if(czer == true){
         Serial.println("wlaczenie diody czerwonej");
         }
         else{
          Serial.println("wylaczenie diody czerwonej");
         }
         break;
       case 'o':
        zol = !zol;
        digitalWrite(zolta, zol);
        if(zol == true){
         Serial.println("wlaczenie diody zoltej");
         }
         else{
          Serial.println("wylaczenie diody zoltej");
         }
         break;
    }
  }   
   

Dlaczego po zamianie if na switch teraz diody po wpisaniu komendy na okragło migają? Tak jakbym ciągle wpisywał literę (z, c, lub o). Przecież wpisałem ją raz a program kręci się w kółko na danym case...

Aktualizacja: znalazłem problem, zamknięcie jednego zawiasa w złym miejscu. Teraz jest tak i działa:
Kod programu: Zaznacz cały

#define zielona 8
#define czerwona 10
#define zolta 9
int odebraneDane = "";
boolean czer = false;
boolean ziel = false;
boolean zol = false;
boolean poczatek = false;

void setup() {
  Serial.begin(9600); //Uruchomienie komunikacji
  pinMode(czerwona, OUTPUT);
  pinMode(zielona, OUTPUT);
  pinMode(zolta, OUTPUT);
  pinMode(7, INPUT_PULLUP);
 

  digitalWrite(czerwona, LOW);
  digitalWrite(zielona, LOW);
  digitalWrite(zolta, LOW);

}
 
void loop() {
  if(poczatek ==false){
  Serial.println("Wpisz prosze pierwsza litere koloru diody: z-zielona, c-czerwona lub o-zolta");
  Serial.println("Ponowny wpis litery koloru spowoduje wygaszenie diody");
 
  poczatek = !poczatek;
  while(Serial.available() == false){}
  }
 
  if(Serial.available() > 0){
    odebraneDane = Serial.read();
 
  switch (odebraneDane) {
        case 'z':
        ziel = !ziel;
         digitalWrite(zielona, ziel);
         if(ziel == true){
         Serial.println("wlaczenie diody zielonej");
         }
         else{
          Serial.println("wylaczenie diody zielonej");
         }
         break;
        case 'c':
         czer = !czer;
         digitalWrite(czerwona, czer);
         if(czer == true){
         Serial.println("wlaczenie diody czerwonej");
         }
         else{
          Serial.println("wylaczenie diody czerwonej");
         }
         break;
       case 'o':
        zol = !zol;
        digitalWrite(zolta, zol);
        if(zol == true){
         Serial.println("wlaczenie diody zoltej");
         }
         else{
          Serial.println("wylaczenie diody zoltej");
         }
         break;
  }
  }
}   
   
   



Co do zadania 6.3 to jeszcze nie wymyśliłem jak zrobić kalibrację programową, może mała podpowiedź ;-) , ale taki układ z dwoma fotorezystorami i serwem, świetnie nadawał by się do sterowania położeniem paneli fotowoltanicznych lub paneli słonecznych podgrzewających CWU.

Ostatnio zmieniony przez SOYER 21-11-2017, 20:23, w całości zmieniany 5 razy  
Postaw piwo autorowi tego posta
 
 
Treker 




Posty: 8506
Pomógł: 126 razy
Otrzymał 526 piw(a)
Skąd: Gdynia
Programuję w:
C, Arduino
Moje roboty:
Spectrum, Fuzzy

Wysłany: 22-11-2017, 10:24   

SOYER napisał/a:
Wiem, wiem, komentarze

Skoro wiesz, to już połowa sukcesu - teraz warto je stosować ;)

SOYER napisał/a:
Co do zadania 6.3 to jeszcze nie wymyśliłem jak zrobić kalibrację programową, może mała podpowiedź

Możesz przykładowo podawać skrajne pozycje sera przez UART lub ustawiać je za pomocą potencjometru - próbuj różnych metod. Nawet jeśli całość będzie mało praktyczna, to zawsze będzie to dobrym ćwiczeniem programistycznym ;)


Na udzielam odpowiedzi na pytania techniczne zadawane kanałami prywatnymi (maile, komunikatory, PW).
Sprawdź » Kurs ARDUINOKurs podstaw elektronikiZbuduj swojego robota - kurs!
Postaw piwo autorowi tego posta
 
 
SOYER 



Posty: 346
Pomógł: 1 raz
Otrzymał 15 piw(a)
Skąd: Kryry
Wysłany: 24-11-2017, 01:03   

Dzięki Treker. Myślałem raczej, że to jakiś mój program sam skalibruje... tak "z ręki" to raczej łatwo... :->
Mam pytanie :mrgreen:
Czy dla switcha jest jakiś else, bo nic takiego nie znalazłem....
np
Kod programu: Zaznacz cały
switch(costam){
   case 'a':
   digitalWrite(led, HIGH);
   else
   digitalWrite(led, LOW);
   case 'b':
   digitalWrite(led2, HIGH);
   else
   digitalWrite(led2, LOW);
}


Wiem, że to nie działa, ale chodzi mi o to, by jeśli "warunek" 'b' przestał się spełniać to wyłączało led2 itd... Czy takie cóś to tylko na if-ach?
Dzięki

Ostatnio zmieniony przez SOYER 24-11-2017, 01:07, w całości zmieniany 2 razy  
Postaw piwo autorowi tego posta
 
 
marek1707 



Posty: 4924
Pomógł: 513 razy
Otrzymał 672 piw(a)
Skąd: WAW
Programuję w:
C, asm
Wysłany: 24-11-2017, 01:20   

No ale przecież każdy case jest wyjątkowy. Wszystkie inne są z definicji dla niego "elsami", nieprawdaż? Zawsze wykona się tylko jeden case. Instrukcja switch ma coś takiego jak przypadek "default:" gdzie wpisujesz kod wykonywany gdy żaden case nie pasował.
A Twój kod możesz napisać tak:
Kod programu: Zaznacz cały
switch(costam){
   case 'a':
      digitalWrite(led, HIGH);
      digitalWrite(led2, LOW);
      break;                        // to jest ważne, bez break procesor pojedzie dalej w dół i "wjedzie" do case 'b'!
   case 'b':
      digitalWrite(led, LOW);
      digitalWrite(led2, HIGH);
      break;
   default:
      digitalWrite(led, LOW);
      digitalWrite(led2, LOW);
      break;
}

Ostatnio zmieniony przez marek1707 24-11-2017, 01:21, w całości zmieniany 1 raz  
Postaw piwo autorowi tego posta
 
 
SOYER 



Posty: 346
Pomógł: 1 raz
Otrzymał 15 piw(a)
Skąd: Kryry
Wysłany: 24-11-2017, 09:13   

No do tego to doszedłem sam:
Kod programu: Zaznacz cały
#include <SimpleDHT.h>
#include <LiquidCrystal.h> //Dołączenie bilbioteki
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Informacja o podłączeniu nowego wyświetlacza
 
int maphum;
int pinDHT11 = 13;
SimpleDHT11 dht11;
#define led1 10
#define led2 12
#define led3 9
#define led4 11
#define led5 8
void setup() {
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(led5, OUTPUT);
  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  digitalWrite(led3, LOW);
  digitalWrite(led4, LOW);
  digitalWrite(led5, LOW);
  Serial.begin(9600);
}
 
void loop() {
  byte temperature = 0;
  byte humidity = 0;
  dht11.read(pinDHT11, &temperature, &humidity, NULL);
  maphum = map(((int)humidity), 10, 95, 1, 5);
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("Wilg.: ");
  lcd.print((int)humidity);
  lcd.print("%RH");
  lcd.setCursor(0, 1);
  lcd.print("Temp.: ");
  lcd.print((int)temperature);
  lcd.print("*C");
  switch(maphum){
    case 1:
  digitalWrite(led1, HIGH);
  digitalWrite(led2, LOW);
  digitalWrite(led3, LOW);
  digitalWrite(led4, LOW);
  digitalWrite(led5, LOW);
    break;
    case 2:
  digitalWrite(led1, LOW);
  digitalWrite(led2, HIGH);
  digitalWrite(led3, LOW);
  digitalWrite(led4, LOW);
  digitalWrite(led5, LOW);
    break;
    case 3:
  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  digitalWrite(led3, HIGH);
  digitalWrite(led4, LOW);
  digitalWrite(led5, LOW);
    break;
    case 4:
  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  digitalWrite(led3, LOW);
  digitalWrite(led4, HIGH);
  digitalWrite(led5, LOW);
    break;
    case 5:
  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  digitalWrite(led3, LOW);
  digitalWrite(led4, LOW);
  digitalWrite(led5, HIGH);;
    break;
  }
  Serial.println(maphum);
 
 
  delay(1500);
}

Tylko ile to pisania, chodziło mi o jakąś skrótową wersję... Bo przecież switch to miał być do skrócenia if-ów.
Coś w stylu:
Kod programu: Zaznacz cały
case 1:
digitalWrite(led1, HIGH);
break;
case !1:
digitalWrite(led1, LOW):
break;

To też nie działa, ale oddaje o co mi chodzi....

Ostatnio zmieniony przez SOYER 24-11-2017, 09:17, w całości zmieniany 1 raz  
Postaw piwo autorowi tego posta
 
 
marek1707 



Posty: 4924
Pomógł: 513 razy
Otrzymał 672 piw(a)
Skąd: WAW
Programuję w:
C, asm
Wysłany: 24-11-2017, 10:18   

switch nie jest "do skracania if'ów". To inna konstrukcja. Język C zawiera ich kilka i w ramach nich się poruszasz. If jest prostym rozgałęzieniem dwudrogowym, switch wielodrogowym a to wyczerpuje zasób "..drogowości" - nie potrzebujesz już niczego innego. Nie walcz z tym językiem. Zamiast tego spróbuj w nim myśleć. Przeczytaj o wszystkich instrukcjach sterowania przebiegiem (if, switch, do-while, for) i tak układaj działania swojego programu by naturalnie do nich pasowały. Teoretycy mówią, że C jest językiem pełnym, więc można w nim wyrazić każdy algorytm. To czy łatwo czy trudno to już kwestia oceny. W porównaniu do innych języków funkcyjnych C jest moim zdaniem proste. To zaleta, ale i wada. Na "braki" C (lub dowolnego innego języka) spójrz z innej strony: tu nie ma niczego przypadkowego, wymyślili to bardzo mądrzy ludzie a wielu innych przez lata to szlifowało. Jeżeli coś Ci nie pasuje to znaczy, że czegoś nie wiesz bo przecież nie masz kompetencji by kontestować taki dorobek. Na obecnym etapie nauki możesz nie dostrzegać wielu aspektów, które tłumaczą taką a nie inną semantykę języka.

A wracając do meritum: jak sobie wyobrażasz działanie tego "else" w przypadku instrukcji switch. Jak chciałbyś wyrażać to "else" w stosunku do każdego case'a? Zastanów się chwilę i zaproponuj swoje rozsądne rozwiązanie, chętnie je usłyszę. Skoro jest to rozgałęzienie wielodrogowe, to wchodzimy tylko w jedną drogę wybraną z wielu a za chwilę (po nawiasie zamykającym ciało switch'a) wszystkie te drogi znów schodzą się w jedną. Napotykając instrukcję switch procesor oblicza wartość wyrażenia w nawiasie a następnie porównuje ją po kolei ze wszystkimi stałymi wpisanymi przy słowach case. Tylko jedna przypasuje i ten fragment kodu wykonujemy. Jeśli akurat ta nie pasuje, następuje sprawdzenie następnego case'a a gdy żaden nie "zaskoczy", wykonuje się kod umieszczony za nieobowiązkowym "default". Zwykle w każdym case umieszczasz tylko ten kod, który obsługuje tylko ten przypadek. Niestety, jeśli w kilku z nich musisz zrobić to samo, musisz to napisać explicite. W takich wypadkach używaj funkcji, np:
Kod programu: Zaznacz cały

void zgas_diody()
{
  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  digitalWrite(led3, LOW);
  digitalWrite(led4, LOW);
  digitalWrite(led5, LOW);
}

  zgaś_diody();
  switch(maphum){
    case 1:
  digitalWrite(led1, HIGH);
    break;
    case 2:
  digitalWrite(led2, HIGH);
    break;
    case 3:
  digitalWrite(led3, HIGH);
    break;
    case 4:
  digitalWrite(led4, HIGH);
    break;
    case 5:
  digitalWrite(led5, HIGH);
    break;
  }
Wygląda lepiej? To co powiesz na coś takiego:
Kod programu: Zaznacz cały
const uint8_t LICZBA_DIODEK = 5;
uint8_t tablica diodek[LICZBA_DIODEK] = {led1, led2, led3, led4, led5};

zgas_diody();
if (maphum > 0)
  digitalWrite(tablica_diodek[maphum > LICZBA_DIODEK ? LICZBA_DIODEK-1 : maphum-1], HIGH);
Hm? Narzekanie że w switch nie ma else to jak marudzenie, że w samochodzie z automatem nie ma wajchy od biegów.. Po prostu więcej jeździj aż się przyzwyczaisz :)

Postaw piwo autorowi tego posta
 
 
SOYER 



Posty: 346
Pomógł: 1 raz
Otrzymał 15 piw(a)
Skąd: Kryry
Wysłany: 24-11-2017, 10:54   

Ok, rozumiem. Dzięki.
Jak działa twoje funkcja zgas diody(). Bo na kursie poznaliśmy funkcję setup uruchamianą raz przy starcie i loop kręcącą się w kółko.
Ta funkcja wyłącza wszystkie diody i włącza poszczególne tylko w przypadku case(ktoryśtam).
Ale to też powinno działać w pętli żeby sprawdzać czy coś się zmieniło na czujniku...
Edit. Już doczytałem o nowych funkcjach, rozumiem dzięki jeszcze raz ;-)

Ostatnio zmieniony przez SOYER 24-11-2017, 11:08, w całości zmieniany 2 razy  
Postaw piwo autorowi tego posta
 
 
Elvis 



Posty: 1729
Pomógł: 105 razy
Otrzymał 300 piw(a)
Skąd: wawa
Programuję w:
C, asm
Wysłany: 24-11-2017, 11:04   

SOYER, możesz jeszcze spróbować inaczej podejść do problemu. Zamiast zastanawiać się - co zrobię jeśli wartość maphum wynosi 3, pomyśl kiedy zapalam diodę led3.
Wtedy mógłbyś otrzymać program typu:
Kod programu: Zaznacz cały

if (maphum == 3)
  digitalWrite(led3, HIGH);
else
  digitalWrite(led3, LOW);

Nie byłoby powtarzania kodu, ani migania diodami jak w propozycji Marka.
Mogłbyś nawet zrobić z tego fragmentu kodu funkcję, ale to pewnie kolejny etap.
Jeśli lubisz krótkie programy to zawsze można zapisać to tak:
Kod programu: Zaznacz cały
digitalWrite(led3, (maphum == 3) ? HIGH : LOW);

Ale nie jestem przekonany czy to czytelna postać...
Inna sprawa, że jak wcześniej dyskutowaliśmy HIGH ma wartość 1, LOW = 0, więc można zrobić nawet tak:
Kod programu: Zaznacz cały
digitalWrite(led, maphum == 3);

To już strasznie C-style, ale za to jakie krótkie. Jak dla mnie lepiej zostać przy if-else i ew. pomyśleć o funkcjach lub tablicach, ale podaję inne opcje na wypadek długiej dyskusji że można inaczej :)

Postaw piwo autorowi tego posta
 
 
SOYER 



Posty: 346
Pomógł: 1 raz
Otrzymał 15 piw(a)
Skąd: Kryry
Wysłany: 24-11-2017, 11:14   

Dzięki Elvis. W if-ach wiedziałem jak to zrobić ale, że akurat przerabiałem switch-a to chciałem potrenować, no i podpytywałem, bo na stronie Arduino właśnie było napisane, że własnie tylko case i default. Trochę nie pasowało do mojej koncepcji :mrgreen: i chciałem się dowiedzieć czy są jakieś myki do switcha. Marek1707 trochę podpowiedział:-).

Postaw piwo autorowi tego posta
 
 
wachu 



Posty: 3
Wysłany: 24-12-2017, 22:41   

Hej,
właśnie ukończyłem wskaźnik światła:
https://www.youtube.com/watch?v=CDkC7J2-he4

Kod programu: Zaznacz cały
#include <Servo.h>
Servo motorek;

void setup() {
  Serial.begin(9600);
  motorek.attach(3);
  motorek.write(180);
}

void loop() {
  int fotorezystor= analogRead(A5);
  int pozycja=map(fotorezystor,300,1000, 90, 170);
  motorek.write(pozycja);
  delay(30);

}


Po dłuższej kalibracji i zabawy z servem pare pytań:

1) Zauważyłem, że jeśli do serwomechanizmu puścimy pozycje mniejszą niż 20 zaczyna wariować (kręci się w kółko). Zakres jest niby 0-180. Czy to poprostu wina tego konkretnego egzemplarza?

2) Jeśli arduino zasilę baterią 9V (no, 8.25V) serwo ledwo działa (tylko buczy niechętnie). Jeśli podłącze arduino do zasilacza i ustawię na nim 12v - układ działa, ale zdażają mi się (serwomechanizmowi) dziwne odchyły i zwiechy. Gdy ustawię napięcie na 16v wszystko działa elegancko (niby arduino uciąga do 20v). Czy to też zależy od konretnego serwa?

[ Dodano: 25-12-2017, 10:10 ]
Wersja ulepszona z kalibracja strzalki (0%-100%) potencjometrem oraz kalibracja światla



Kod programu: Zaznacz cały
#include <Servo.h>
Servo motorek;
int procent0=0;
int procent100=0;
int ciemno=0;
int jasno=0;
int sukces=0;

void kalibracja()
{
  Serial.println("Trwa kalibracja strzalki, ustaw strzalke na 0% i wcisnij guzik");
  int potencjometr=0;
  sukces=0;
  while (sukces==0)
  {
    potencjometr=analogRead(A4);
    potencjometr=map(potencjometr,0,1023,30,180);
    motorek.write(potencjometr);
    delay(200);
    procent0=potencjometr;
    if (digitalRead(7)==LOW){sukces=1;}
  }
  Serial.print("Ustalono 0% na poziomie: "); Serial.println(procent0);
  delay(2000);
  Serial.println("Trwa kalibracja, ustaw strzalke na 100% i wcisnij guzik");
  while (sukces==1)
  {
    potencjometr=analogRead(A4);
    potencjometr=map(potencjometr,0,1023,30,180);
    motorek.write(potencjometr);
    delay(200);
    procent100=potencjometr;
    if (digitalRead(7)==LOW){sukces=2;}
  }
  Serial.print("Ustalono 100% na poziomie: "); Serial.println(procent100);
  }

void kalibracja_swiatla()
{
  delay(1000);
  Serial.println("Trwa kalibracja swiatla, wylacz zupelnie swiatlo wcisnij guzik");
  while (digitalRead(7)==HIGH){}
  ciemno=analogRead(A5);
  delay(1000);
  Serial.print("Bez swiatla:");Serial.println(ciemno);
  Serial.println("Trwa kalibracja swiatla, wlacz  swiatlo wcisnij guzik");
  while (digitalRead(7)==HIGH){}
  jasno=analogRead(A5);
  delay(1000);
  Serial.print("Ze swiatlem:");Serial.println(jasno);
  sukces=3;
}

void setup() {
  Serial.begin(9600);
  motorek.attach(3);
  motorek.write(180);
  pinMode(7, INPUT_PULLUP);
  kalibracja();
  kalibracja_swiatla();
}

void loop() {
 
  while (sukces!=3){}
  int fotorezystor= analogRead(A5);
  int pozycja=map(fotorezystor,jasno,ciemno, procent100, procent0);
  motorek.write(pozycja);
  delay(300);

}


Pytania jednak z poprzedniego postu zostają, ktoś jest w stanie pomóc?

Postaw piwo autorowi tego posta
 
 
Treker 




Posty: 8506
Pomógł: 126 razy
Otrzymał 526 piw(a)
Skąd: Gdynia
Programuję w:
C, Arduino
Moje roboty:
Spectrum, Fuzzy

Wysłany: 28-12-2017, 14:44   

wachu, powiedz na wstępie czy elementy, które używasz są z zestawów Forbota. To wiele ułatwi ;) Już tłumaczę dlaczego:

1) Serwomechanizmy - niedawno na rynku pojawiła się (bez ostrzeżenia ze strony producenta) inna wersja serwomechanizmów, które wyglądają identycznie jak poprzednie. Nie posiadają jednak mechanicznej blokady. Z jednej strony działa to na plus, bo ciężej uszkodzić przekładnię. Z drugiej strony mają spory minus, który sam zauważyłeś. Podanie sygnału o małym wypełnieniu (praktycznie losowym dla każdego egzemplarza) sprawia, że silnik zaczyna się obracać w koło i nie ma się nad tym żadnej kontroli... Jest to bardzo dziwne zachowanie dlatego testujemy wszystkie serwa i do zestawów trafiają tylko te z blokadami, aby nie było takich niespodzianek. Jeśli masz nasz zestaw i trafiłeś taki egzemplarz, to daj znać - wymienimy :)

2) Bateria - zasilanie silników z baterii 9V, to nie jest najlepszy pomysł, ale metoda ta spokojnie wystarcza na wykonanie kilku eksperymentów opisanych w kursie. Wszystko zależy też od konkretnej baterii (mają różne pojemności, różne rezystancje wewnętrzne). W zestawach umieszczamy takie baterie, które sprawdzają się w tym zastosowaniu dobrze. Więc po podłączeniu nowej baterii serwo musi ruszyć, nie ma innej opcji. Jeśli bateria jest inna lub została wcześniej rozładowana. To faktycznie mogą pojawić się takie problemy.

3) Zasilacz zewnętrzny - bardzo dziwna sprawa. Jeśli ma on wystarczającą wydajność, to nie powinno być prawie żadnej różnicy, czy zasilasz układ z 7V, czy z 12V. Powiem nawet więcej - im wyższe napięcie tym gorzej, bo masz bardzo duże straty na stabilizatorze. Twoje 16V to podejrzanie dużo... Więcej o mocy znajdziesz w tym artykule: Czym jest moc? Jak dobrać odpowiednie elementy?


Na udzielam odpowiedzi na pytania techniczne zadawane kanałami prywatnymi (maile, komunikatory, PW).
Sprawdź » Kurs ARDUINOKurs podstaw elektronikiZbuduj swojego robota - kurs!
Postaw piwo autorowi tego posta
 
 
Stanio 




Posty: 1
Wysłany: 12-01-2018, 21:23   


KOD PROGRAMU :lol: :
Kod programu: Zaznacz cały

#include <Servo.h> //Biblioteka odpowiedzialna za serwa
#define guzik 8
int swiatlo = 0;
int pozycja = 0;
int najciem = 0;
int najjas = 900;
int najciemp = 0;
int najjasp = 900;
 
Servo serwomechanizm;  //Tworzymy obiekt, dzięki któremu możemy odwołać się do serwa

 
void setup()
{
  serwomechanizm.attach(11);  //Serwomechanizm podłączony do pinu 9
  Serial.begin (9600);
  Serial.println ("Aby skalibrować wcisnij guzik");
  pinMode (guzik, INPUT_PULLUP);
   
}
 
void loop()

    swiatlo = analogRead(A5);
    pozycja = map (swiatlo, najciem, najjas, 180, 0);
    serwomechanizm.write(pozycja); //Wykonaj ruch
    if (digitalRead (guzik) == LOW) {
       Serial.println ("Rozpoczales kalibracje.");
       delay (300);
       Serial.println ("Ustaw najmniejsze oswietlenie i wcisnij guzik.");
       while (digitalRead (guzik) == HIGH) {delay (25);}
       najciemp = analogRead(A5);
       Serial.println ("Zapisano :)");
       delay (300);
       Serial.println ("Teraz ustaw najjasniejsze oswietlenie i wcisnij guzik.");
       while (digitalRead (guzik) == HIGH) {delay (25);}
       najjasp = analogRead(A5);
       Serial.println ("Zapisano :)");
       delay (300);
       if (najciemp > najjasp) {
        Serial.println ("Co ty robisz losiu!?");
        Serial.println ("Najciemniejsze oswietlenie jest jasniejsze od najjasniejszego!");
        delay (300);
        Serial.println ("Kalibracja zakonczona niepowodzeniem :(");
       }
       else {
       Serial.println ("Kalibracja zakonczona powodzeniem!");
       najciem = najciemp;
       najjas = najjasp;
       }
       Serial.println ("Aby skalibrowac jeszcze raz wcisnij guzik");
    }
    delay(100);                   
}

Postaw piwo autorowi tego posta
 
 
Treker 




Posty: 8506
Pomógł: 126 razy
Otrzymał 526 piw(a)
Skąd: Gdynia
Programuję w:
C, Arduino
Moje roboty:
Spectrum, Fuzzy

Wysłany: 13-01-2018, 20:37   

Stanio, witam na forum! Bardzo ładny wskaźnik, do tej pory chyba nikomu nie chciało się go pokolorować. Powodzenia w dalszych eksperymentach ;)


Na udzielam odpowiedzi na pytania techniczne zadawane kanałami prywatnymi (maile, komunikatory, PW).
Sprawdź » Kurs ARDUINOKurs podstaw elektronikiZbuduj swojego robota - kurs!
Postaw piwo autorowi tego posta
 
 
mistus 



Posty: 23
Otrzymał 3 piw(a)
Skąd: OPOLE
Wysłany: 14-01-2018, 19:26   

zadanie 6.1
Kod programu: Zaznacz cały

int potencjometr = 0;
int fotorezystor = 0;
int fotorezystorek = 0;
int zliczanie = 0;
int czas = 800;
#define przycisk 8
void setup() {
  Serial.begin(9600);
  pinMode(przycisk, INPUT_PULLUP);// ustawienie przycisku jako wejście
}

void loop() {
  potencjometr = analogRead(A5);// odczytanie wartości z pinów
  fotorezystor = analogRead(A4);
  fotorezystorek = analogRead(A3);
  if (digitalRead(przycisk) == LOW){//sprawdzenie czy przycisk jest wciśnięty
    delay(czas);
    Serial.print("fotorezystor:");//wypisanie danych
    Serial.print(fotorezystor);
    Serial.print("\t fotorezystorek:");
    Serial.print(fotorezystorek);
    Serial.print("\t potencjometr:");
    Serial.print(potencjometr);
    zliczanie = zliczanie + 1;//dodaje kliknięcia przycisku
    Serial.print("\t przycisk wciśnięto:");
    Serial.println(zliczanie);
  }
}

Ostatnio zmieniony przez mistus 14-01-2018, 19:27, w całości zmieniany 1 raz  
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: Kurs Arduino - #9 - ... Kurs STM32 - #3 - Pł... Kurs STM32 - #5 - Ko... Kurs STM32 - #4 - St...
lub przeszukaj forum po wybranych tagach: artykul, automatyka, elektronika, poradnik, robotyka


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