Skocz do zawartości
espiridion

Programowanie pod sterownik serw i2c pod multi-tasking

Pomocna odpowiedź

Napisano (edytowany)

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?

 

Edytowano przez espiridion

Udostępnij ten post


Link to post

Wyjaśnij, dlaczego używając metody Servo.write() możesz nie używać delay, a używając w tym samym miejscu pwm.setPWM() nie możesz?

  • Lubię! 1

Udostępnij ten post


Link to post

@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);
  }
}

 

Udostępnij ten post


Link to post
13 minut temu, espiridion napisał:

Najbardziej nie rozumiem jak dodać w przypadku pwm0 i pwm1 swoje serwa. Co dodać w attach/detach w tym przypadku?

Co to ma wspólnego z używaniem/nieużywaniem delay?

A swoje serwa do pwm0/pwm1 dodajesz po prostu podłączając je do odpowiednich gniazdek kontrolera... co chyba już zdążyłeś zrobić. Nie ma tu żadnych attach/detach.

Co do kodu... co to w ogóle jest? Co to za klasa Sweeper i do czego ma służyć? Po co funkcja setServoPulse jeśli jej nie używasz... nie bardzo nadążam za Twoim tokiem myślenia ale wygląda na to, że po prostu kopiujesz jakieś kawałki różnych kodów nie rozumiejąc ich znaczenia.

Udostępnij ten post


Link to post

 

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

 

 

Udostępnij ten post


Link to post

O to mi chodzi z tym kopiowaniem, że bezmyślnie kopiujesz fragmenty kodu które nijak nie pasują do twojego sprzętu (vide klasa Sweeper).

Na początek wyjaśnij co znaczy:

18 minut temu, espiridion napisał:

Pulsy są wykorzystywane w PWM w przypadku pracy serwomechanizmów, chyba tego nie da się zapisać w postaci 'pos'.

Tylko po polsku proszę bez neologizmów. Co chcesz osiągnąć i czego Twoim zdaniem się nie da.

Udostępnij ten post


Link to post

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.

  • Nie zgadzam się! 1

Udostępnij ten post


Link to post

Nie przesłuchuje, stara się pomóc - a moim zdaniem pomoc polega nie na napisaniu za kogoś kodu, a na wytłumaczeniu jak to powinno działać i doprowadzeniu do tego, że osoba której się pomaga zrobi to samodzielnie. Czy w świecie artystów (bo takim się przecież mienisz) pomoc polega na stworzeniu za kogoś instalacji?

No cóż - jeśli uważasz że odpowiedź na zadane pytanie o znaczenie zdania (którego nota bene ni grzyba nie zrozumiałem) uwłacza Twojej godności, trwaj dalej w przekonaniu o swej wielkości. Ja Ci nie będę przeszkadzać. Szkoda tylko mego czasu... i naprawdę boli to, że za okazaną chęć pomocy człowiek dostaje kopa 😞

Udostępnij ten post


Link to post

@espiridion weź pod uwagę, że to co piszesz nie jest dla nas czasami zrozumiałe. Zajmujesz się innymi tematami, elektronika jest dla Ciebie czymś nowym, więc popełniasz błędy w swoich opisach. Czasami błędy są oczywiste, jak wtedy, gdy pisałeś w innym temacie o prądzie wynoszącym 4,25V... Nikt się do Ciebie nie "przyczepił", bo domyśliliśmy się, że chodzi o napięcie i mogliśmy coś konkretnego wywnioskować. Ciężko jednak domyślić się co dokładnie miałeś na myśli pisząc: "Pulsy są wykorzystywane w PWM w przypadku pracy serwomechanizmów, chyba tego nie da się zapisać w postaci pos". Dlatego @ethanak zwyczajnie poprosił, abyś opisał swoimi słowami co chcesz uzyskać... Gdzie widzisz tu złe intencje?

Udostępnij ten post


Link to post

Treker masz rację ale najtrudniej to wytłumaczyć właśnie artystom haha. Artysto wyluzuj, jeśli potrzebujesz z tym pomocy - pomożemy skoro kosztowało Cię to już tyle miesięcy rozważań filozoficznych ale potrzebny jest jakiś punkt wyjścia bo faktycznie ten twój kod wygląda jak instalacja artystyczna. Najlepiej po kolei:

-wypisz jaki sprzęt masz do dyspozycji (od zasilacza po sterowniki serw)

-określ dokładnie jakiego działania się po nim spodziewasz

Krok po kroku ustalimy jak je zrealizować i nie będziesz musiał nikomu za to płacić.

Udostępnij ten post


Link to post

Temat usunięty na prośbę autora.

Udostępnij ten post


Link to post
Gość
Ten temat został zamknięty.
×