Skocz do zawartości

Bemol

Użytkownicy
  • Zawartość

    12
  • Rejestracja

  • Ostatnio

Reputacja

1 Neutralna

O Bemol

  • Ranga
    2/10

Ostatnio na profilu byli

Blok z ostatnio odwiedzającymi jest wyłączony i nie jest wyświetlany innym użytkownikom.

  1. W takim razie cały kurs arduino na forbocie jest do usunięcia skoro uczy źle. Gdybyście byli instruktorami powiedźmy, że nauki jazdy, a kursant rozwaliłby auto na drodze, powiedzielibyście "źle jeździsz"...? Byliście w tym temacie dla mnie pomocni w stopniu znikomym. Cofnę się by opanować podstawy. Mimo wszystko dzięki Wam za odpowiedzi.
  2. Uczę się na tyle ile mam na to czasu i źródeł. Nie zamierzam pracować nigdy jako programista, a tylko hobbystycznie poznać temat. Poporosiłem o korektę, nie o negowanie mnie za brak wiedzy czy umiejętności bo tę staram się zdobywać również przez popełnianie błedów. O dziwo przykład który umieściłem skompilował się bez problemu, a serwa ruszyły tak, jak tego oczekiwałem. Temat powstał ponieważ nie wiedziałem jak sprawić by dwa serwa poruszały sie w przeciwnym kierunku w tym samym czasie.
  3. Witam i wracam do tematu. Panowie @ethanak i @dambo Zweryfikujcie proszę mój pomysł. Zasugerowałem się wskazówkami i w ramach testów i dla bezpieczeństwa na osobnym arduino i PCA9685 podłączyłem 3 srewa. Poproszę o korektę lub wskazówki. P.S. Jak zrobić teraz żeby te serwa poruszały się wolniej? Kombinuje z "delay", probówałem też zmnieijszyć "pozycja+..." #include <Wire.h> #include <Adafruit_PWMServoDriver.h> #define serwo1 1 #define serwo2 4 #define serwo3 8 Adafruit_PWMServoDriver pwm=Adafruit_PWMServoDriver(); #define MIN 200 #define MAX 600 #define MED 400 int pozycja; void setup() { pwm.begin(); pwm.setPWMFreq(60); } void loop() { if(pozycja=200; pozycja<600) { pozycja=pozycja+10; } pwm.setPWM(serwo1,0, pozycja); pwm.setPWM(serwo2,0, pozycja); if(pozycja=600; pozycja>200) { pwm.setPWM(serwo3,0, pozycja); } delay(1000); if(pozycja=600; pozycja>200) { pozycja=pozycja-10; } pwm.setPWM(serwo1,0, pozycja); pwm.setPWM(serwo2,0, pozycja); if(pozycja=200; pozycja<600) { pwm.setPWM(serwo3,0, pozycja); } delay(1000); }
  4. Dzięki Panowie za odpowiedzi.
  5. Nie określiłbym siebie leniem. Zauważyłem tylko, że przenoszenie części kodu do innych zakładek ułatwia mi orientacje w programie i odszukiwanie szybciej miejsca w którym coś chce poprawić. Być może jako laik nabieram niepoprawnych nawyków, ale moje pytanie brzmiało czy mogę takie praktyki stosować i czy sa ku temu ograniczenia. Odpowiedź otrzymałem więc jest ok.
  6. oczywiście @ethanak pomogłeś i wielkie dzięki biorę się za poprawianie wszystkiego. Troszkę czasu na pewno minie zanim w pełni pokaże projekt i jeszcze pewnie kilka pytań będzie więc prosiłbym @Treker nie zamykać wątku jeszcze przez jakiś czas.
  7. W drugim wariacie myślowym przewidywałem właśnie coś podobnego. Konstrukcja, którą przedstawiłeś jest bardzo podobna do tej z kursu arduino o sterowaniu serwami. Teraz skłonie się ku tej metodzie. Z tym nazewnictwem masz rację, z początku chciałem to w ten sposób rozwiązać, jednakże wiedziałem ile lini kodu będę miał do pisania więc korzystając ze ściąg nie gubię się w nazewnictwach. Czy taki sposób pisania zadziała wg. Ciebie? void loop() { mojaFunkcja(); } void mojafunkcja(); { if (trzeba_coś_zmienić()) { ustaw_docelowe_pozycje(); } porusz_serwami(); delay(20); } I mam jeszcze jedno ważne dla mnie pytanie. Jeśli mam bardzo dużo lini kodu, czy mogę jego części typu "void stac()" przenosić do "nowych zakładek" i stamtąd je wywoływać typu "stac()" ?. Przyznam się, że testowałem takie rozwiąznie w celu zwiększenia przejrzystości i odnajdowania się i nie za każdym razem chciało mi to zadziałać. Czy wiadomo coś o jakichś ograniczeniach z tym związanych.?
  8. Kod który przedstawiam nie zawiera w tym momencie tylko działajacego HCSR04 który jak pisałem wcześniej wywołuje poszczególne pozycje kota pomiędzy "stac", "kucaj", "siad", i "leżec". Staram się zachować przejrzystość w kodzie dlatego nie usu- #include <Wire.h> #include <Adafruit_PWMServoDriver.h> Adafruit_PWMServoDriver pwm=Adafruit_PWMServoDriver(); int i=0; int poz = 350; #define MIN 150 #define MAX 500 #define MED 350 const int SERVO0 = 0; // Szyja const int SERVO1 = 1; //Kolano P const int SERVO2 = 2; //Udo P const int SERVO3 = 3; const int SERVO4 = 4; const int SERVO5 = 5; const int SERVO6 = 6; //Bark P const int SERVO7 = 7; //Lokiec P const int SERVO8 = 8; //Bark L const int SERVO9 = 9; //Lokiec L const int SERVO10 = 10; //Udo L const int SERVO11 = 11; //Kolano L const int SERVO12 = 12; const int SERVO13 = 13; const int SERVO14 = 14; //Szyja const int SERVO15 = 15; //Ogon int pos; #define Trig 6 // do HCSR04 #define Echo 5 // void setup() { pwm.begin(); //inicjalizowanie sygnału PWM pwm.setPWMFreq(60); //częstotliwość pracy PCA9685 Serial.begin(9600); //do testowania HCSR04 pinMode(Trig, OUTPUT); pinMode(Echo, INPUT); pinMode(7, INPUT_PULLUP); //Przycisk na plecach nr 1 pinMode(8, INPUT_PULLUP); //Przycisk nr 2 } void loop() { lezec(); // delay(10); } void stac() { pwm.setPWM(SERVO0, 0, MED); // Szyja pwm.setPWM(SERVO1, 0, MIN); // P kolano pwm.setPWM(SERVO2, 0, MED); // P Udo pwm.setPWM(SERVO3, 0, MED); // pwm.setPWM(SERVO4, 0, MED); // pwm.setPWM(SERVO5, 0, MED); // pwm.setPWM(SERVO6, 0, MED); // P Bark pwm.setPWM(SERVO7, 0, MAX); // P Lokiec pwm.setPWM(SERVO8, 0, MED); // L BArk pwm.setPWM(SERVO9, 0, MIN); // L Lokiec pwm.setPWM(SERVO10, 0, MED); // L Udo pwm.setPWM(SERVO11, 0, MAX); // L Kolano pwm.setPWM(SERVO12, 0, MED); // pwm.setPWM(SERVO13, 0, MED); // pwm.setPWM(SERVO14, 0, MED); // Szyja pwm.setPWM(SERVO15, 0, MED); // Ogon } void kucaj() { pwm.setPWM(SERVO0, 0, MED); // Szyja pwm.setPWM(SERVO1, 0, MED); // P kolano G 200 pwm.setPWM(SERVO2, 0, 250); // P Udo D 100 pwm.setPWM(SERVO3, 0, MED); // pwm.setPWM(SERVO4, 0, MED); // pwm.setPWM(SERVO5, 0, MED); // pwm.setPWM(SERVO6, 0, 250); // P Bark pwm.setPWM(SERVO7, 0, 250+20); // P Lokiec pwm.setPWM(SERVO8, 0, 450); // L BArk pwm.setPWM(SERVO9, 0, 400); // L Lokiec pwm.setPWM(SERVO10, 0, 250+10); // L Udo pwm.setPWM(SERVO11, 0, 250); // L Kolano pwm.setPWM(SERVO12, 0, MED); // pwm.setPWM(SERVO13, 0, MED); // pwm.setPWM(SERVO14, 0, MED); // Szyja pwm.setPWM(SERVO15, 0, MED); // Ogon } void siad() { pwm.setPWM(SERVO0, 0, 200); // Glowa pwm.setPWM(SERVO1, 0, 450); // P kolano pwm.setPWM(SERVO2, 0, MED); // P Udo pwm.setPWM(SERVO3, 0, MED); // pwm.setPWM(SERVO4, 0, MED); // pwm.setPWM(SERVO5, 0, MED); // pwm.setPWM(SERVO6, 0, 250); // P Bark pwm.setPWM(SERVO7, 0, MED); // P Lokiec pwm.setPWM(SERVO8, 0, 450); // L BArk pwm.setPWM(SERVO9, 0, 300); // L Lokiec pwm.setPWM(SERVO10, 0, MED); // L Udo pwm.setPWM(SERVO11, 0, 150); // L Kolano pwm.setPWM(SERVO12, 0, MED); // pwm.setPWM(SERVO13, 0, MED); // pwm.setPWM(SERVO14, 0, MED); // pwm.setPWM(SERVO15, 0, 200); // Ogon for(i=250; i<=500; i=i+2) //pętla do poruszania szyją od lewej do prawej { pwm.setPWM(SERVO14, 0, i); //Szyja MIN to P delay(50); } for(i=500; i>=250; i=i-2) { pwm.setPWM(SERVO14, 0, i); // Szyja MAX to L delay(50); } } void lezec() { pwm.setPWM(SERVO0, 0, MED); // Szyja pwm.setPWM(SERVO1, 0, 450); // P kolano --- pwm.setPWM(SERVO2, 0, 250); // P Udo pwm.setPWM(SERVO3, 0, MED); // pwm.setPWM(SERVO4, 0, MED); // pwm.setPWM(SERVO5, 0, MED); // pwm.setPWM(SERVO6, 0, MED); // P Bark pwm.setPWM(SERVO7, 0, 200); // P Lokiec --- pwm.setPWM(SERVO8, 0, MED); // L BArk pwm.setPWM(SERVO9, 0, 450); // L Lokiec --- pwm.setPWM(SERVO10, 0, 250); // L Udo pwm.setPWM(SERVO11, 0, 150); // L Kolano --- pwm.setPWM(SERVO12, 0, MED); // pwm.setPWM(SERVO13, 0, MED); // pwm.setPWM(SERVO14, 0, MED); // Szyja pwm.setPWM(SERVO15, 0, 190); // Ogon } void chod() { for(i=300; i<=400; i=i+1) { pwm.setPWM(SERVO8, 0, i); // L BArk pwm.setPWM(SERVO6, 0, i); // P Bark pwm.setPWM(SERVO9, 0, 200); // L Lokiec pwm.setPWM(SERVO7, 0, 200); // P Lokiec --- delay(20); } for(i=400; i>=300; i=i-1) { pwm.setPWM(SERVO8, 0, i); // L BArk pwm.setPWM(SERVO6, 0, i); // P Bark pwm.setPWM(SERVO9, 0, 400); // L Lokiec pwm.setPWM(SERVO7, 0, 400); // P Lokiec --- delay(20); } } wałem jeszcze w wersji roboczej obiektów serw nr. 3,4,5,12 i 13. na sam koniec jesli beda niepotrzebne wylecą.
  9. Witam Serdecznie. Postanowiłem wydrukować sobie robota-kota. Podłączyłem czujnik odległości i działa. Poprzez Sterownik 16 Serw 12bitowy podłączyłem również moje 11 serw które są w tym projekcie. Całość udało mi sie zsynchronizować do momentu w którym w zależności od odległości przeszkody kot przyjmuje odpowiednią pozycje i z tym problemu nie mam. Aleeeeee.... Utknąłem na etapie poruszania się. Otóż nie przychodzi mi do głowy konstrukcja pętli "for" która pozwoli mi jednocześnie poruszać dwiema kończynami w przeciwnym kierunku jednocześnie. Piszę o dwóch kończynach bo jeśli uda mi się zrozumieć gdzie się zatrzymałem to ruszę i z czterema kończynami. Chciałbym w przyszłości opublikować projekt na Forbocie z całościa kodu, ale muszę być pewny, że dla kogoś będzie on przydatny i przede wszystkim działający. Moje serwa w kończynach nazwałem: -lewyBark, -lewyLokiec, -prawyBark, -prawyLokiec. Gdy tworze pętle dla lewej łapy poruszającej się w przód, pętla od prawej stoi nieruchoma czekając na swoją kolej i tak na zmianę. Jestem prawie pewien, że rozwiązanie mojego problemu jest bardziej prozaiczne niż mi się wydaje, a szukam zbyt głęboko. I tak od kilku dni Pomożecie? Jakieś pomysły?
  10. Cześć Treker. Żechciałbyś może wyjaśnić na swój przystępny sposób od podstaw jak ogarnąć sterownik pca9685? Znalazłem kilka źródeł odnośnie tego zagadnienia ale jakoś Twoje objaśnienia zagadnień jest najbardziej przystępne. Z góry dzięki i pozdrawiam.
  11. Cześć. Niedawno zacząłem swoją drogę z Arduino i w ramach sprawdzenia swojej wiedzy z kursu pierwszego wymyśliłem, że zbuduje robotę jeżdżącego gdzie pomiar odległości będzie pobierany z dwóch czujników ultradźwiękowych. 1. Może ktoś rozwiąże mój problem który polegaa na pojawiających się błędach w chwili gdy uruchamiam dwa czujniki jednocześnie. Tzn. Fragment kodu z dwóch czujników w osobnym programie działa niezawodnie jednocześnie i pokazuje w monitorze portu szeregowego informacje właściwie. I to jest ok. Mój problem pojawia się gdy dopisuje fragment kodu sterujący dwoma silnikami DC napedzajacymi koła wówczas na jednym z czujników jest błąd i zamiast wskazywać odległość w cm pojawiają się prawie same zera. Nie rozumiem skąd ten problem skoro kod dla hc-sr04 jest dobry. Macie jakies pomysły jak to rozwiązać? Zrzuty ekranu i zdjęcie błędu w monitorze dla bezpieczeństwa zostało zrobione w momencie gdy cały kod był pisany ciągiem w "void loop()" bez kombinowania z zakładkami. 2. Pytanie z innej beczki. Pisząc funkcje dla poszczególnych reakcji w arduino wpadłem na pomysł aby dla większego porządku w kodzie pewne funkcje przenoszę do osobnej zakładki (zdjęcie 4) , a w kodzie głównym tylko wywołuje ta konkretną funkcje. Dlaczego czasami to rozwiązanie się sprawdza, a czasami program nie może wywołać funkcji i wyrzuca błąd.?? Czy takie sposób porządkowania kodu jest powszechnie używany?
×
×
  • Utwórz nowe...