Skocz do zawartości

Kurs Arduino - #5 - PWM, serwomechanizmy, biblioteki


Pomocna odpowiedź

To może ja na szybko, żebyś z niecierpliwości nie popełnił błędu:

  • Napięcie na VIN w Arduino wręcz powinno być wyższe od 5V i to co najmniej o 1V, ale nie wyższe niż jakieś 12V. Zatem zakres 6-12V jest OK. Wszystko co poniżej spowoduje, że wewnętrzny stabilizator nie będzie w stanie zrobić dobrych 5V (na Vcc) potrzebnych do pracy procesora.
  • Nie, do zasilania potencjometru nie możesz użyć niczego większego niż 5V, bo w zasadzie układy scalone bardzo nie lubią doprowadzania do ich pinów sygnałów wyższych niż ich zasilanie. Jeśli zatem procesor na swoim Vcc ma 5V, to na żadnej jego nóżce nie powinno pojawić się więcej niż jakieś 5.2V i to jest absolutnie nieprzekraczalna granica. Gdybyś zasilał swój procesor np. z 3.3V (dużo płytek tak teraz ma, np. ESP32, moduły na STM32 czy choćby Arduino MINI w wersjach 3.3V), to wtedy granicą oporu byłoby ok. 3.5V. Czasem, naprawdę rzadko scalaki są do wysokich napięć przystosowane (np. jakieś wzmacniacze pomiarowe czy pewnego rodzaju specjalne przetworniki ADC), ale procesor na pewno nie. Podając napięcie wyższe niż 5V na jego wejście analogowe spowodujesz, że spali się nie tylko ten pin procesora, ale masz sporą szansę na zniszczenie wszystkich układów na płytce. Także.. ostrożnie.
  • Jeśli wyniki pomiarów ADC są takie jak opisałeś, a układ jest połączony poprawnie to faktycznie wskazuje to na uszkodzenie potencjometru. Ostateczną weryfikacją byłby pomiar napięcia "produkowanego" przez potencjometr zwykłym multimetrem. Zaczep się minusem woltomierza (zakres np. 20V) na masie GND a plusem na suwaku potencjometru i obracaj gałką. Jednoczesnie możesz puścić program mierzący i wypisujący wyniki z ADC - będziesz miał porównanie. Jeśli wskazania miernika potwierdzą to co widzi ADC, tj. jeśli na początku ruchu będzie wciąż mało a potem nagle skoczy do 4V i więcej, to będzie to ostateczny dowód. Jeśli natomiast nie, właśnie znalazłeś jakiś błąd w swoim układzie i sprawdź dokładnie połączenia.
  • Lubię! 2
Dnia 23.11.2020 o 08:04, Achtenbob napisał:

@Treker

Właśnie chodziło mi o to czy mogłoby być większe napięcie niż 5V.

 

Wartość ADC, zakres 0-1023.

Miałem to samo, sprawdź czy dobrze podłączyłeś potencjometr (zdjęcie masz przy zadaniu 4.1), u mnie też wyszło to że jeden z potencjometrów miałem uszkodzony.

  • 4 tygodnie później...
(edytowany)

Witam

Po podłączeniu serwa mam taki błąd:

 

C:\Program Files (x86)\Arduino\arduino-builder -dump-prefs -logger=machine -hardware C:\Program Files (x86)\Arduino\hardware -tools C:\Program Files (x86)\Arduino\tools-builder -tools C:\Program Files (x86)\Arduino\hardware\tools\avr -built-in-libraries C:\Program Files (x86)\Arduino\libraries -libraries C:\Users\PC\Documents\Arduino\libraries -fqbn=arduino:avr:uno -vid-pid=2341_0043 -ide-version=10813 -build-path C:\Users\PC\AppData\Local\Temp\arduino_build_122065 -warnings=all -build-cache C:\Users\PC\AppData\Local\Temp\arduino_cache_994445 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.arduinoOTA.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.arduinoOTA-1.3.0.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avrdude.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avrdude-6.3.0-arduino17.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avr-gcc.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avr-gcc-7.3.0-atmel3.6.1-arduino7.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -verbose C:\Program Files (x86)\Arduino\libraries\Servo\examples\Sweep\Sweep.ino
C:\Program Files (x86)\Arduino\arduino-builder -compile -logger=machine -hardware C:\Program Files (x86)\Arduino\hardware -tools C:\Program Files (x86)\Arduino\tools-builder -tools C:\Program Files (x86)\Arduino\hardware\tools\avr -built-in-libraries C:\Program Files (x86)\Arduino\libraries -libraries C:\Users\PC\Documents\Arduino\libraries -fqbn=arduino:avr:uno -vid-pid=2341_0043 -ide-version=10813 -build-path C:\Users\PC\AppData\Local\Temp\arduino_build_122065 -warnings=all -build-cache C:\Users\PC\AppData\Local\Temp\arduino_cache_994445 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.arduinoOTA.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.arduinoOTA-1.3.0.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avrdude.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avrdude-6.3.0-arduino17.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avr-gcc.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avr-gcc-7.3.0-atmel3.6.1-arduino7.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -verbose C:\Program Files (x86)\Arduino\libraries\Servo\examples\Sweep\Sweep.ino
Using board 'uno' from platform in folder: C:\Program Files (x86)\Arduino\hardware\arduino\avr
Using core 'arduino' from platform in folder: C:\Program Files (x86)\Arduino\hardware\arduino\avr
Detecting libraries used...
"C:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10813 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino" "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\variants\\standard" "C:\\Users\\PC\\AppData\\Local\\Temp\\arduino_build_122065\\sketch\\Sweep.ino.cpp" -o nul -DARDUINO_LIB_DISCOVERY_PHASE
Error while detecting libraries included by C:\Users\PC\AppData\Local\Temp\arduino_build_122065\sketch\Sweep.ino.cpp
Generating function prototypes...
"C:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10813 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino" "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\variants\\standard" "C:\\Users\\PC\\AppData\\Local\\Temp\\arduino_build_122065\\sketch\\Sweep.ino.cpp" -o "C:\\Users\\PC\\AppData\\Local\\Temp\\arduino_build_122065\\preproc\\ctags_target_for_gcc_minus_e.cpp" -DARDUINO_LIB_DISCOVERY_PHASE
avr-g++: error: device-specs/specs-atmega328p: No such file or directory
exit status 1
Błąd kompilacji dla płytki Arduino Uno.


 

Edytowano przez Gieneq

@Piotrrrek witam na forum 🙂 może odpowiedź nie będzie zbyt ambitna, ale spróbuj przeinstalować Arduino IDE, bo problem jest w samej kompilacji, czyli po stronie komputera. Z logu istotne jest to: 

Cytat

error: device-specs/specs-atmega328p: No such file or directory

Jeżeli tak to nie pomoże to pomyślimy co dalej. Poza tym podaj:

  • system,
  • wersję i rodzaj instalacji Arduino IDE.
29 minut temu, Gieneq napisał:

@Piotrrrek witam na forum 🙂 może odpowiedź nie będzie zbyt ambitna, ale spróbuj przeinstalować Arduino IDE, bo problem jest w samej kompilacji, czyli po stronie komputera. Z logu istotne jest to: 

Jeżeli tak to nie pomoże to pomyślimy co dalej. Poza tym podaj:

  • system,
  • wersję i rodzaj instalacji Arduino IDE.

Przeinstalowałem i znowu jest błąd 

mam windows 10 home / 64bit

arduino-1.8.13-windows 

 

@Piotrrrek wklej proszę dla formalności dokładny kod, który próbujesz skompilować. Czy mamy rozumieć, że inne programy kompilują się bez żadnego problemu?

19 godzin temu, Treker napisał:

@Piotrrrek wklej proszę dla formalności dokładny kod, który próbujesz skompilować. Czy mamy rozumieć, że inne programy kompilują się bez żadnego problemu?

To jest gotowy przykład sweep. Żadnego programu nie moge kompilować. Próbowałem z wyłączonym antywirusem i dalej jest problem. Coś jest z komputerem bo na innym kompie wszystko działa. 

#include <Servo.h>

Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards

int pos = 0;    // variable to store the servo position

void setup() {
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}

void loop() {
  for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
    // in steps of 1 degree
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
  for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
}


 

(edytowany)

Cześć,

Zadanie domowe 5.4
Program działa poprawnie do momentu przesunięcia ramienia serwa w zadaną pozycję. Po tym działaniu następuje nieoczekiwany powrót do pozycji 0 (pomimo, że nie ma takiej instrukcji).

Czy podzieli się ktoś wiedzą, dlaczego, tak się dzieje?
(Z mojego przeprowadzonego śledztwa wyszło mi, że przez zmienną int ale nie rozumiem dlaczego po wykonaniu instrukcji program w pętli nadpisuje: pozycja = 0.)
 

#include <Servo.h> //Biblioteka odpowiedzialna za serwa
 
Servo serwomechanizm;  //Tworzymy obiekt, dzięki któremu możemy odwołać się do serwa 
int pozycja = 0; //zmienna, przechowujaca pozycje serwa
 
void setup() 
{ 
  serwomechanizm.attach(9);  //Serwomechanizm podłączony do pinu 9
  Serial.begin(9600);
  Serial.println("Podaj pozycje w ktora mam przesunac serwo [0-180]: "); // polecenie dla uzytkownika
  delay(50);
} 

 
void loop() 
{  
  if(Serial.available()>0) // Czy dane zostaly odebrane?
  {
    pozycja = Serial.parseInt(); // Zapisz dane pod zmienna
    delay(50);
    Serial.println("Pozycja serwa podana przez uzytkownika: " + pozycja); // info dla usera
    Serial.println(pozycja);
      if (pozycja<=180 && pozycja>=0) //sprawdzenie, czy wpisana wartosc znajduje sie w zakresie ruchu
      {
      serwomechanizm.write(pozycja); // wykonanie ruchu w zadana pozycje
      }
      else
      {
      Serial.println("Podales wartosc, ktora jest poza zakresem ruchu serwomechznizmu"); //info dla uzytkownika o zlej wartosci oczekiwanej pozycji
      Serial.println("Podaj pozycje w ktora mam przesunac serwo [0-180]: ");
      delay(50);
      }
  }
}                     

    

ScreenHunter 904.png

Edytowano przez KonTui

@KonTui witam na forum 🙂 Błąd ten prawdopodobnie pochodzi z ustawień monitora portu szeregowego. Prawdopodobnie masz tam ustawione (w rozwijanym okienku), że ma być dodawany znak końca linii. Zmień to ustawienie, aby program nie dodawał żadnych informacji na końcu linii i sprawdź wtedy 🙂

  • Pomogłeś! 2
18 minut temu, Treker napisał:

@KonTui witam na forum 🙂 Błąd ten prawdopodobnie pochodzi z ustawień monitora portu szeregowego. Prawdopodobnie masz tam ustawione (w rozwijanym okienku), że ma być dodawany znak końca linii. Zmień to ustawienie, aby program nie dodawał żadnych informacji na końcu linii i sprawdź wtedy 🙂

Dzięki ! Teraz działa prawidłowo.

  • Lubię! 1

@Adder witam na forum i dziękuję za miłe słowa, cieszę się, że kurs jest pomocny! Dobry pomysł na projekt, eksperymentuj dalej - powodzenia 🙂

  • Lubię! 1

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...