Skocz do zawartości

Kurs Arduino - #6 - kontynuacja UART, serwomechanizmy


Komentator

Pomocna odpowiedź

W ten sposób:

Kod programu:

#include <Servo.h>

Servo engine;
int pos = 0;

void setup() {
 engine.attach(9);
}

void loop() {

 if (pos < 180) {
   engine.write(pos);
 } else { 
   pos = 0;
 }  

 pos = pos + 10;
 delay(200);
}
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

Aylard, 9V bateria nie da z siebie więcej jak 20mA w rozsądnym czasie. Da nawet pewnie i kilkaset mA ale taki prąd utrzyma się przez kilka sekund na świeżej baterii a potem bateria będzie się nadawała do pojemnika na zużyte baterie 🙂. Takie baterie mają pojemność rzędu 600mAh przy poborze prądu na poziomie 25mA, przy poborze 100mA pojemność spada do niecałych 500mAh. Jeśli to byłaby markowa bateria do tego alkaliczna to to serwo mogłoby podziałać trochę, Twoja bateria nie jest alkaliczna i zgodnie z datasheetem raczej do obciążenia niskim prądem.

Link do komentarza
Share on other sites

Jeśli to byłaby markowa bateria do tego alkaliczna to to serwo mogłoby podziałać trochę, Twoja bateria nie jest alkaliczna i zgodnie z datasheetem raczej do obciążenia niskim prądem.

Bez przesady, robiłem testy na bateriach kilku firm i nie było tak źle 😉 Do nauki obsługi serwomechanizmu takie źródło zasilania jest wystarczające.

Link do komentarza
Share on other sites

Treker przerabiając 5-tą część kursu spotkałem się z tym samym problemem co Aylard. Podłączałem wszystko tak jak na schemacie, który tam był umieszczony, Aylard tu też tak miał. Dopiero teraz wiem, że schemat był po prostu zły, gdyż nie ma na nim kondensatorów 🙂. Polecam to poprawić, gdyż sam się nieźle przez to nadenerwowałem 😋

Link do komentarza
Share on other sites

Zadanie domowe 6.1

#define BUTTON 7
#define FOT1 A0
#define FOT2 A1
#define POT A2

int fotorez1=0 ,fotorez2=0, potentat=0;
byte licznik=1;

void setup() 
{
Serial.begin(9600); 
pinMode(BUTTON,INPUT_PULLUP); //pin pod guzik
}

void loop() 
{
fotorez1= analogRead(A0);     //odczyt wartosci przez ADC
fotorez2= analogRead(A1);
potentat= analogRead(A2);


 if(digitalRead(BUTTON)==LOW)//jesli guzik wcisniety, wypisz dane
 {
 Serial.print("Fotorezystor 1: ");
 Serial.print(fotorez1);
 Serial.print("\t, fotorezystor 2: ");
 Serial.print(fotorez2);
 Serial.print("\t, potencjometr: ");
 Serial.print(potentat);
 Serial.print(",\t przycisk wcisnieto ");
 Serial.print(licznik);
 Serial.print("\t razy \n");
 ++licznik;
 while(digitalRead(BUTTON)==LOW) ; //petla wstrzymujaca program na czas wcisniecia
 }
 delay(50);//male opoznienie dla wygody
}

Może formatowanie nie jest idealne, ale to szczegół

[ Dodano: 20-07-2015, 23:16 ]

Zadanie domowe 6.2

Pod podanym linkiem nie ma zadania o numerze 2.3, więc nie bardzo wiem o co chodzi 😋

Link do komentarza
Share on other sites

Dodaję swoje wersje zadań domowych, program jak i komentarze są w po angielsku, choć zdaję sobie sprawę, że na pewno są błędy 😋 w razie czego, proszę o uwagi odnośnie samych kodów, jak i również językowych błędów 🙂

6.1

/*
Program reads informations from two photoresistors and potentiometer,
then it sends them once (after pressing button) with values and number
of button's pressings.
*/
#define photo1 A3 //1st photoresistor
#define photo2 A4 //2nd photoresistor
#define pot A5 //potentiometer
#define button 7 //button
int ph1=0; //value on 1st photoresistor
int ph2=0; //value on 2nd photoresistor
int potVal=0; //value on potentiometer
int pressCounter=0; //button's pressings counter 
boolean buttonState,tempState; //boolean variables to help counting button's pressings
void setup() { 
 // put your setup code here, to run once:
Serial.begin(9600);
pinMode(button, INPUT_PULLUP); 
}

void loop() {
 // put your main code here, to run repeatedly:
 ph1=analogRead(photo1);
 ph2=analogRead(photo2);
 potVal=analogRead(pot);
 buttonState=digitalRead(button);

 if(buttonState!=lastState) // if current button state differs from last button state
                            // it means, that button was pressed or was released
 {
   if(buttonState==LOW)// if button was pressed
   {
     pressCounter++; //increase the counter and write values
     Serial.print("Number of pressings: ");
     Serial.print(pressCounter);
     Serial.print("\t");

     Serial.print("Value on ");

     Serial.print("photoresistor 1: ");
     Serial.print(ph1);
     Serial.print("\t");

     Serial.print("photoresistor 2: \t");
     Serial.print(ph2);
     Serial.print("\t");

     Serial.print("potentiometer: \t");
     Serial.print(potVal);
     Serial.print("\n");
     delay(50); // delay to avoid interferences
   } 
 }
  lastState=buttonState; //save button state
}

Jeśli chodzi o zadanie 6.2 to domyślam się, że chodzi o to:

(jest to nieco inna wersja, ponieważ po przekręceniu potencjometru w odpowiednie miejsce dioda mruga, a nie świeci 😋 )

/*
Program makes LED blinking,
which is indicated by position of the potentiometer.
Value on potentiometer in bytes is diveded into 5 ranges.
*/
#define green1 2
#define green2 3
#define yellow 4
#define red1 5
#define red2 6
int readValue=0; //value on potentiometer
int convertValue=0; //value after converting readValue

void setup() {
 // put your setup code here, to run once:
 for(i=2;i<=6;i++) //set pins as outputs and set low state
 {
     pinMode(i,OUTPUT);
     digitalWrite(i,LOW);
       }

void loop() {
 // put your main code here, to run repeatedly:
readValue=analogRead(A5); //read value from potentiometer
convertValue=map(readValue,0,1023,1,5); // convert it into 5 ranges
switch(convertValue) //choose between LEDs, which one should blinks
 {
   case 1:
     {
         digitalWrite(green2,LOW);
         digitalWrite(yellow,LOW);
         digitalWrite(red1,LOW);
         digitalWrite(red2,LOW);
         digitalWrite(green1,HIGH);
         delay(100);
         digitalWrite(green1,LOW);
         delay(100);
         break;
       }
    case 2:
    {
         digitalWrite(green1,LOW);
         digitalWrite(yellow,LOW);
         digitalWrite(red1,LOW);
         digitalWrite(red2,LOW);
         digitalWrite(green2,HIGH);
         delay(100);
         digitalWrite(green2,LOW);
         delay(100);
         break;
      }

    case 3:
    {
         digitalWrite(green1,LOW);
         digitalWrite(green2,LOW);
         digitalWrite(red1,LOW);
         digitalWrite(red2,LOW);
         digitalWrite(yellow,HIGH);
         delay(100);
         digitalWrite(yellow,LOW);
         delay(100);
         break;
    }
    case 4:
    {
         digitalWrite(green1,LOW);
         digitalWrite(green2,LOW);
         digitalWrite(yellow,LOW);
         digitalWrite(red2,LOW);
         digitalWrite(red1,HIGH);
         delay(100);
         digitalWrite(red1,LOW);
         delay(100);
         break;
    }
    case 5:
    {
         digitalWrite(green1,LOW);
         digitalWrite(green2,LOW);
         digitalWrite(yellow,LOW);
         digitalWrite(red1,LOW);
         digitalWrite(red2,HIGH);
         delay(100);
         digitalWrite(red2,LOW);
         break;
       }
     default:
     {
         digitalWrite(green1,LOW);
         digitalWrite(green2,LOW);
         digitalWrite(yellow,LOW);
         digitalWrite(red1,LOW);
         digitalWrite(red2,LOW);
         break;
     }
   }
  delay(50);
}

zadanie 6.3

Jeśli chodzi o mechanizm kalibracji, to nie wiem, czy dobrze zrozumiałem, ale chodziło o to, żeby znaleźć wartość minimalną i maksymalną światłości? Jeśli tak, to taki kawałek kodu napisałem:

int maxVal=0,minVal=0,temp=0,pos=0;
void setup() {
 // put your setup code here, to run once:
Serial.begin(9600);
maxVal=analogRead(A5);
minVal=analogRead(A5);
}
void maxSearching()
{
 temp=analogRead(A5);
 /*
 Serial.print("temp value: ");
 Serial.print(temp);
 Serial.print("\t max value: ");
 Serial.print(maxVal);
 Serial.print("\n");
 */
 if(temp>maxVal)
   {
       maxVal=temp;
         }
}
void minSearching()
{
  temp=analogRead(A5);
 /*
 Serial.print("temp value: ");
 Serial.print(temp);
 Serial.print("\t min value: ");
 Serial.print(minVal);
 Serial.print("\n");
 */
 if(temp<minVal)
   {
       minVal=temp;
         }
}
void loop() {
 // put your main code here, to run repeatedly:
 maxSearching();
 minSearching();
  pos=map(temp,minVal,maxVal,0,179);

  /*
  The rest of photometer program is separete
  */
         delay(3000);
}

Nie wiem, czy napisane funkcje są poprawnie napisane, natomiast szukanie minimum i maksimum światłości w takiej postaci działa, a czy tak miało być to nie wiem 😋

6.4

Proszę filmik (wybaczcie, że jest tak dziwnie położony 😋)

Wszyscy czekamy na jak najszybsze opublikowanie kolejnej lekcji, szczególnie mnie osobiście interesują silniki DC! 😃

Link do komentarza
Share on other sites

Synergia, gratulacje rozwiązania zadań. Nareszcie jakiś filmik z pracy wskaźnika! Teraz mogę zacząć myśleć o publikacji kolejnej części 🙂

damian11, racja było małe zamieszanie w numeracji zadań. Teraz powinno być dobrze 🙂

Link do komentarza
Share on other sites

Fajeczny, ciężko mi zadowolić się tylko jednym rozwiązaniem zadania domowego, ale chyba nie mam co dłużej czekać, w najbliższy wtorek będzie kolejna część 🙂

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.