Skocz do zawartości

espiridion

Użytkownicy
  • Zawartość

    26
  • Rejestracja

  • Ostatnio

Reputacja

1 Neutralna

O espiridion

  • Ranga
    3/10
  • Urodziny 09.05.1999

Informacje

  • Płeć
    Brak informacji
  • Języki programowania
    Javascript, C

Ostatnio na profilu byli

170 wyświetleń profilu
  1. @marek1707 Na zdjęciu przesyłam zdjęcie do wglądu. Nic nie powiem o modelu, bo takich informacji nigdzie niestety nie mam.
  2. Cześć, Mam analogowe panelowe woltomierze na zakres do 10V, 15V i 25V. Z racji tego, że trudno dostać na rynku woltomierze poniżej 5V to miałbym do Was pytanie. Jaki rezystor powinienem wstawić by woltomierz odczytywał zakres od 0 do 0.5V lub 0 do 1V? Pozdrawiam:)
  3. @atMegaTona Zamiast if (switch_nr[cnt].state_flag == true) continue; dałem if (switch_nr[cnt].state_flag == true && switch_nr[cnt].ld + RENEW_TIME > milis()) continue; i mam ciągły ruch serwa w tą i tamtą stronę tak jak chciałem. Ale mam jeszcze do Ciebie pytanie, mam nadzieje ostatnie bo nie chcę Cie męczyć bo zastanawiam się co robi klasa msDelay tutaj, chyba, że "del" źle zadeklarowałem? public: msDelay(){delay_cnt = 0;} msDelay(uint16_t del):delay_cnt(del+millis){} uint16_t del;
  4. @daniel89 Jeśli potrzebujesz artystycznego punktu widzenia to: Analogicznie każde elementy, które są podłączone na stałe dają wrażenie nieodłączności i czegoś trwałego. Jeśli to jest jakiś projekt. który ma też się skupiać na estetyce wizualnej połączeń to właśnie tak zrób. Okiem laika jeśli jakiś element jest wyjmowalny to raczej jest to "niestabilne".
  5. W drugim przykładzie klasy msDelay kompilator mi pokazuje, że "del" nie jest zadeklarowane.
  6. @daniel89 Jak tobie najwygodniej, ale moim zdaniem najlepiej to wlutować to na stałe, chyba, że masz zamiar potem wymieniać? Dharma?
  7. @atMegaTona Tutaj wkradł się błąd: if(digitalRead(switch_nr[cnt].sw == LOW)){ A powinno być tak: if(digitalRead(switch_nr[cnt].sw) == LOW){ i wnet wszystko ożyło
  8. @aerograf7 Przecież na schemacie są diody podłączone przez rezystory.
  9. Szanowny @atMegaTona , wielkie dzięki za podesłanie kodu. Wygląda bardzo interesująco i jestem pod ogromnym wrażeniem twojej pomocy. Narazie kombinuję z nim, ale zapowiada się bardzo dobrze.
  10. Cześć FORBOT, Proszę na wstępie o wyrozumiałość. Nie jestem osobą techniczną. Zrobiłem na ile jestem w stanie, póki co instalacja działa (jako tako do testów) i mogę nią testować swoje obiekty. Jest to studencka instalacja artystyczna. Oczekuję tylko pomocy w napisaniu tego kodu właśnie pod millis() by móc się pozbyć delays. Dla wyjaśnienia czym jest instalacja artystyczna, można znaleźć prace na festiwalu BIENNALE WRO 2019: http://wro2019.wrocenter.pl Chciałbym napisać coś takiego, ale nie wiem jak ominąć "czas". Funkcja milis() czy moze cos innego? Czyli np tak: (to mój skrót myślowy w postaci kodu myślowego....ale chciałbym bardzo takie działanie) if (Switcher[1] == LOW) { led[1] == HIGH, counterLED[1] ==HIGH, servo[1]pwm1 ( servomin_1 = 150, servomax_1 = 450, speed = 100), //np. jakas predkosc np. jak w varspeedservo servo[1]pwm0 (countermin_1 = 200, servomax_1 = 450, speed = 20) //np. szybsza predkosc } else if (Switcher[1] == HIGH) { led[1] == LOW, counterLED[1] == LOW, servo[1]pwm1 == LOW, //serwa wylaczone servo[1]pwm0 == LOW //serwa wylaczone } Obecny przykładowy kod działania jednego przełącznika, którego teraz używam: #include <Wire.h> #include <Adafruit_PWMServoDriver.h> int i = 0; const int LED[] {26, 24, 22, 10, 8, 6, 4, 2}; const int CounterLED[] {36, 38, 40, 42, 28, 30, 32, 34}; const int Switch[] {27, 25, 23, 11, 9, 7, 5, 3}; const uint8_t servo[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; Adafruit_PWMServoDriver pwm0 = Adafruit_PWMServoDriver(0x40); Adafruit_PWMServoDriver pwm1 = Adafruit_PWMServoDriver(0x41); #define SERVOMIN_1 150 #define SERVOMAX_1 600 #define SERVOMIN_2 350 #define SERVOMAX_2 500 #define COUNTER1_MIN 200 #define COUNTER1_MAX 450 #define COUNTER2_MIN 300 #define COUNTER2_MAX 440 //... i tak dalej, wiem, że to kilometry definów (mozna w ramkach) void setup() { Serial.begin(9600); pinMode(Switch[i], INPUT_PULLUP); pinMode(LED[i], OUTPUT); pinMode(CounterLED[i], OUTPUT); pwm0.begin(); pwm0.setPWMFreq(60); // Analog servos run at ~60 Hz updates pwm1.begin(); pwm1.setPWMFreq(60); // Analog servos run at ~60 Hz updates delay(10); } void setServoPulse(uint8_t n, double pulse) { double pulselength; pulselength = 1000000; // 1,000,000 us per second pulselength /= 60; // 60 Hz Serial.print(pulselength); Serial.println(" us per period"); pulselength /= 4096; // 12 bits of resolution Serial.print(pulselength); Serial.println(" us per bit"); pulse *= 1000000; // convert to us pulse /= pulselength; Serial.println(pulse); pwm0.setPWM(n, 0, pulse); pwm1.setPWM(n, 0, pulse); delay(10); } void loop() { { if(digitalRead(Switch[1]) == LOW) // PRZEŁĄCZNIK NR. 1 { digitalWrite(LED[1], HIGH); digitalWrite(CounterLED[1], HIGH); //ruch wskazowek i robota w jedna strone for (uint16_t pulselen = SERVOMIN_1; pulselen < SERVOMAX_1; pulselen++) { pwm1.setPWM(servo[0], 0, pulselen); } for (uint16_t pulselen = COUNTER1_MIN; pulselen < COUNTER1_MAX; pulselen++) { pwm0.setPWM(servo[0], 0, pulselen); } delay(500); //ruch wskazowki od poczatku i ruch orczyka robota od poczatku for (uint16_t pulselen = SERVOMAX_1; pulselen > SERVOMIN_1; pulselen--) { pwm1.setPWM(servo[0], 0, pulselen); } for (uint16_t pulselen = COUNTER1_MAX; pulselen > COUNTER1_MIN; pulselen--) { pwm0.setPWM(servo[0], 0, pulselen); } delay(500); //ruch wskazowki i robota zakoncozny //Tutaj nie chodzi o to zeby wskazowki mialyby sie zatrzymywac na pol sekundy //bardziej chodzi o to ze wskazowki i orczyk robota po prostu caly czas sie rusza od kata //powiedzmy np. od 45 stopni do 130 stopni a ten delay to czas pokonania wlasnie tej odleglosci miedzy katami //np. wskazowki maja byc ruchome, cos w stylu awarii elektrownii w Czarnobylu :) //a ruch serwa robota to poprostu zwykle obroty serwa jak w najprostszysch tutoriala dla zielonych //jesli istnialaby mozliwosc to fajnie by bylo zrobic dla duzego serwa z pwm1 np. oś czasu, czyli //pierwsza sekwencja od 300 do 600 z delayem (200) potem druga sekwencja z delayem(100) potem trzecia sekwencja z delayem (1000) itd. } else if (digitalRead(Switch[1]) == HIGH) { digitalWrite(LED[1], LOW); digitalWrite(CounterLED[1], LOW); } } } Obecne działanie: Kiedy przełączam przełącznik dźwigniowy nr 1 na ON - uruchamia on 2 ledy (led1, counterled1) oraz servo1 z pierwszego sterownika i2c (pwm0) i drugiego sterownika i2c (pwm1). Kiedy przełączam przełącznik dźwigniowy nr 1 na OFF - wyłącza on 2 ledy (led1, counterled1) oraz servo1 z pierwszego sterownika i2c (pwm0) i drugiego sterownika i2c (pwm1). Analogicznie tak działa aż do 8 przełączników. Każdy przełącznik => to komplet 2 ledów i 2 serwomechanizmów. Czasami w niektórych wypadkach może być więcej serw dołączonych do kompletu. Problem: Mam 8 przełączników. Delay powoduje opóźnienia. Kiedy włączam przełącznik 1 uruchamia się wszystko zgodnie, potem np. decyduję włączyć przełącznik 4 to zgodnie z zasadą delay trzeba odczekać sekundę po przełączeniu na ON aż włączą się 2 ledy i 2 serwomechanizmy. Gorzej się robi, jeśli chcemy manipulować kilkoma przełącznikami naraz. Czego chcę?: Pozbycia się delay() i wprowadzenie funkcji milis(). Każdy przełącznik ma działać niezależnie od innych. Kiedy go włączę na ON ma działać natychmiast, kiedy włączę go na OFF ma wyłączać natychmiast. Parametry do wszystkich serwomechanizmów : wychylenia od min: 150 do 600 max. Na przykład dla servo1 z pwm0 to będzie 200 do 300. A dla servo1 z pwm1 to będzie 150 do 450. Plus jeśli to możliwe "prędkość serw jaką ma pokonać dystans między tym a tym kątem". Aż do servo16 (pwm0 jak i pwm1) możliwość późniejszej edycji parametrów wychylenia kątów i prędkości. Zakomentowanie niektórych linijek kodu tak abym mógł edytować do woli różne parametry. Biblioteka to: https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library Lista urządzeń to: Mikrokontroler Arduino Mega 8 szt. micro servo TowerPro SG-90 12-16 szt. standard servo Tower 5010 2 szt. 16-kanałowy sterownik serwomechanizmów PCA9685 8 szt. Przełączniki dźwigniowe ON/OFF 8 szt. Diody LED zielone 5mm + rezystory 8 szt. Diody LED biały 3mm + rezystory Zasilacz 5V do Arduino Mega Zasilacz 5V do sterowników serwomechanizmów 5V z 30A lub 40A Płyta stykowa (potem będzie zamieniona na uniwersalną płytkę do lutowania przewodów). ! Schemat elektroniczny zrobiony na szybko, ale tak wygląda moje podłączenie z moim panelem sterowania i serwomechanizmami (one będą poza panelem sterowania, jeśli to ważne). W schemacie nie uwzględniłem wszystkich LEDów i przełączników bo schemat przysłaniałoby za dużo połączeń więc nie było nic praktycznie widać na zdjęciu. Dlatego dałem 4 (ale ma być 16 podlaczonych LEDów i 8 przełączników). Analogicznie wszystkie ledy są podłączone w ten sam sposób czyli: katoda do masy wspólnej GND, anoda do pinów mikrokontrolera. (lista pinów w kodzie). Pozdrawiam
  11. Ok, najwyraźniej nie miało sensu zakładanie tego tematu, jeśli nie mogę liczyć na żadną pomoc tutaj zwłaszcza od użytkownika @ethanak ,który mnie ciągle przesłuchuje. Naprawdę jest mi bardzo przykro i to naprawdę boli.
  12. Cześć, Chciałbym zlecić zaprogramowanie a właściwie przeprogramowanie mojego kodu wykorzystującego funkcję delay(); na millis(); oraz dwóch 16-kanałowych sterowników serw PWM przez i2C. Próbowałem sam zrobić i opanować przez kilka miesięcy lecz niestety nie jestem w stanie tego zrobić, bo nie rozumiem działania millis, bo to dla mnie totalna abstrakcja. Zainteresowanym wyślę mój kod, który jest rozpisany w delay() i opiszę działanie mojej instalacji artystycznej. Z poważaniem
  13. @ethanak Kod do użycia serw przy mills I LEDach zawsze biorę stąd: https://learn.adafruit.com/multi-tasking-the-arduino-part-1/all-together-now a kody z PWM są z biblioteki Adafruit, więc nie wiem o co Ci chodzi z tym kopiowaniem. Jestem artystą a nie inżynierem, ale próbuję to samemu rozwiązać, bo zajmuję się już tym 6 miesięcy, więc bardzo prosiłbym o wyrozumiałość, jeśli nie będę w stanie rozwiązać (kwestia czasu) to mogę zlecić zaprogramowanie... a nawet opłacić za pomoc. 1. Delay nie mogę użyć ponieważ mam panel sterowania w którym są przełączniki a zależy mi na tym, że kiedy zmieniam ze stanu LOW na HIGH byłoby to realizowane "natychmiast" a nie po upływie czasu pracy silnika i ledów. 2. - 3. Pulsy są wykorzystywane w PWM w przypadku pracy serwomechanizmów, chyba tego nie da się zapisać w postaci 'pos'. Tak przynajmniej zrozumiałem ucząc się z tutoriali a zwłaszcza z dokumentacji Adafruit.
  14. @ethanak Najbardziej nie rozumiem jak dodać w przypadku pwm0 i pwm1 swoje serwa. Co dodać w attach/detach w tym przypadku? Jak zdefiniować servo jak mam pod pwm? Ten kod poniżej nie jest skompilowany, ale tak narazie wygląda mój tok myślenia... #include <Wire.h> #include <Adafruit_PWMServoDriver.h> #define LED1 26 #define CounterLED1 36 #define Switch1 27 Adafruit_PWMServoDriver pwm0 = Adafruit_PWMServoDriver(0x40); Adafruit_PWMServoDriver pwm1 = Adafruit_PWMServoDriver(0x41); void setServoPulse(uint8_t n, double pulse) { double pulselength; pulselength = 1000000; // 1,000,000 us per second pulselength /= 60; // 60 Hz Serial.print(pulselength); Serial.println(" us per period"); pulselength /= 4096; // 12 bits of resolution Serial.print(pulselength); Serial.println(" us per bit"); pulse *= 1000000; // convert to us pulse /= pulselength; Serial.println(pulse); pwm0.setPWM(n, 0, pulse); pwm1.setPWM(n, 0, pulse); } class Sweeper { uint8_t servo1 = 0; int updateInterval; // interval between updates unsigned long lastUpdate; // last update of position public: Sweeper(int interval) { updateInterval = interval; increment = 1; } void Attach(int pin) { pwm0.attach(pin) pwm1.attach(pin) } void Detach() { pwm0.detach(); pwm1.detach(); } void Update() { if((millis() - lastUpdate) > updateInterval) // time to update { lastUpdate = millis(); pos += increment; pwm1.setPWM(servo1, 0, pulselen); if ((pulselen >= 600) || (pulselen <= 200)) // end of sweep { // reverse direction increment = -increment; } } } Sweeper sweeper1(10); void setup() { pwm0.begin(); pwm0.setPWMFreq(60); // Analog servos run at ~60 Hz updates pwm1.begin(); pwm1.setPWMFreq(60); // Analog servos run at ~60 Hz updates delay(10); } void loop() { if(digitalRead(Switch1) == LOW) // PRZEŁĄCZNIK NR. 1 { digitalWrite(LED1, HIGH); digitalWrite(CounterLED1, HIGH); sweeper1.Update(); } else if (digitalRead(Switch1) == HIGH) { digitalWrite(LED1, LOW); digitalWrite(CounterLED1, LOW); } }
  15. Dzień dobry, Na wstępie powiem, że przerabiałem już funkcję millis(); dla diod i serw w innych projektach, ale podłączanych w tradycyjny sposób czyli przez piny w mikrokontrolerze itd. Tutaj mam trochę większe i bardziej skomplikowane zadanie do wykonania, ponieważ używam dwóch 16-kanałowych sterowników serw przez i2C . Czy ktoś byłby w stanie mi pomóc pozbyć się delay() ale miałbym możliwość modyfikować prędkość, kierunki obrotów itd?
×
×
  • Utwórz nowe...