Projekt sterowania paskami LED pod drukarkę

Projekty Arduino i pochodne
Garreth
Posty: 860
Rejestracja: 20 kwie 2016, 6:59
Lokalizacja: Katowice
Kontaktowanie:

Projekt sterowania paskami LED pod drukarkę

Postautor: Garreth » 27 maja 2017, 14:14

Jako, że wywołałem lekkie zainteresowanie pomysłem na oświetlenie drukarki, zakładam temat aby nazbierać pomysłów i może ogarnąć kogoś do współpracy. Jak posprzątam i porządnie okomentuję kod, to wrzucę na githuba, bo póki co mam sporo funkcji testowych wpakowanych i właściwie niewiele działa:D

Póki co działa komunikacja arduino due<->arduino mega, po i2c przez level shifter. Dane są wysyłane mniej więcej prawidłowo, aczkolwiek temperatury się przesyłają w stopniach farrenheita (choć jeszcze nie wiem czy to nie dobrze, bo mamy wtedy wyższą rozdzielczość:) ).

Kod po stronie marlina:

Kod: Zaznacz cały

void send_status_i2c(){
    ms_status = millis();
  if (ELAPSED(ms_status, next_status_update_ms)) {
     
    next_status_update_ms = ms_status + 5000;
   
    byte buffer[9];
    buffer[0]='c';
    buffer[1]=card.percentDone();
    buffer[2]=highByte((int)(thermalManager.degHotend(0)));
    buffer[3]=lowByte((int)(thermalManager.degHotend(0)));
    buffer[4]=highByte((int)(thermalManager.degTargetHotend(0)));
    buffer[5]=lowByte((int)(thermalManager.degTargetHotend(0)));
    buffer[6]=highByte((int)(thermalManager.degBed));
    buffer[7]=lowByte((int)(thermalManager.degBed));
    buffer[8]=highByte((int)(thermalManager.degTargetBed));
    buffer[9]=lowByte((int)(thermalManager.degTargetBed));
    Wire.begin();
  Wire.beginTransmission(8); // transmit to device #8
  Wire.write(buffer,10);        // sends ten bytes
  Wire.endTransmission();
  }
}

W powyższym jest błąd, bo funkcja ELAPSED jest źle zaimplementowana. To znaczy dane są wysyłane, ale zdecydowanie częściej niż co 5 sekund:) Nie ma sensu nadwyrężać procka, a później można się pobawić tą funkcją i w trakcie rozgrzewania wysyłać ramki częściej, aby animacje były płynniejsze.
Jak widać przesyłam do slave'a dane o temperaturze głowicy i stołu (zadana + aktualna) oraz zmienną card.percentDone(), która pokazuje ile % druku skończone. Jeszcze chciałbym, aby przy starcie i końcu druku poszła wiadomość o tym fakcie do arduino, ale można to też będzie zrobić z GCODE startowego i końcowego (lepsze rozwiązanie).

Po stronie slave jest niewiele. Odbiór danych i rozdzielenie ich na osobne int'y działa:

Kod: Zaznacz cały

// function that executes whenever data is received from master
// this function is registered as an event, see setup()
void receiveEvent(int howMany)
{
  byte buffer[20];
  int i=0;
  bool status=false;
  char c;
  Serial.println("Reading...");
  while(Wire.available()) // loop through all but the last
  {
    Wire.readBytes(buffer,howMany);   
  }
  if (buffer[0]='c'){
    Serial.println("Status received...");
    progress=buffer[1];
    temperatureHotend=buffer[2]*256+buffer[3];
    targetHotend=buffer[4]*256+buffer[5];
    temperatureBed=buffer[6]*256+buffer[7];
    targetBed=buffer[8]*256+buffer[9];
    new_data=true;
  }
 
  int x = Wire.read();    // receive byte as an integer
//  Serial.println(x);         // print the integer
}

Piękne to to nie jest, ale odbiera co trzeba. Brakuje mi weny na animacje paska LED, coś tam już zacząłem, ale jeszcze wstyd pokazywać:)

Czekam na jakieś pomysły, może ktoś miałby ochotę popisać parę animacji wykorzystując zmienne widoczne powyżej oraz bibliotekę adafruit neopixel (lub inną do ws2812b jak ktos ma sprawdzoną lub z lepszymi funkcjami).

Awatar użytkownika
chemik72
Posty: 340
Rejestracja: 19 kwie 2016, 19:37
Kontaktowanie:

Re: Projekt sterowania paskami LED pod drukarkę

Postautor: chemik72 » 27 maja 2017, 16:18

:o :OK: :OK: :OK: nie pomogę ale chętnie skorzystam i trzymam kciuki ;) Krzysztof może coś doda od siebie bo coś tam działa w świecie led i w Zlepku miał temp. zrobioną z LED RGB WS2812b :OK:
Drukarki:PRUSA i3 ACRYLIC-MGN/SAIZEX 3D MINI
W budowie:DRUKARKA SAIZEX3D30%/FREZARKA PROXXON MF70-TDI95%
ObrazekObrazek ObrazekObrazek

Awatar użytkownika
Krzysztof
Administrator
Posty: 2495
Rejestracja: 19 kwie 2016, 14:03
Lokalizacja: Darłowo
Kontaktowanie:

Re: Projekt sterowania paskami LED pod drukarkę

Postautor: Krzysztof » 29 maja 2017, 4:53

Dokładnie - WS2812b/WS2811/ WS2813b - tego warto użyć. Wysyłasz tylko sygnał sterujący do paska i nie potrzebujesz dodatkowego kontrolera.
tutaj stary temat - może przyda się. Imrahil dłubnął w kodzie i śmigało.
viewtopic.php?f=67&t=49&hilit=ws2812b

Garreth
Posty: 860
Rejestracja: 20 kwie 2016, 6:59
Lokalizacja: Katowice
Kontaktowanie:

Re: Projekt sterowania paskami LED pod drukarkę

Postautor: Garreth » 29 maja 2017, 7:12

Musze zobaczyc w takim razie jak to bylo w repetierze zaimplementowane. Marlin niestety wywala watchdoga jak tylko sie wrzuci te ledy w kod.

Poza tym te ledy sa dosc obciazajace dla procka i wymagaja sporo pamieci, dodatkowo metode show() jesli sie zapauzuje przerwaniem to moga byc problemy z wysterowaniem diody, bo uklad ws2812b wymaga dosc scislego timingu.

Rozwiazanie na osobnym arduino poki co mi sie podoba koncepcyjnie, moze i jest to dodatkowy uklad, ale o wiele latwiej zrobic fajna implementacje, a i o jakies dodatkowe funkcje mozna sie pokusic:)

Sent from my ONEPLUS A3003 using Tapatalk


Awatar użytkownika
Krzysztof
Administrator
Posty: 2495
Rejestracja: 19 kwie 2016, 14:03
Lokalizacja: Darłowo
Kontaktowanie:

Re: Projekt sterowania paskami LED pod drukarkę

Postautor: Krzysztof » 31 maja 2017, 18:43

Domyślnie było właśnie zrobione dla Marlina. Imrahil wrzucił to do Repetiera.
Temat na Adafruit + kod dla Marlina
https://forums.adafruit.com/viewtopic.php?f=25&t=63974

Z APA102C też pracuję - fajne diody i pozwalają na większe instalacje.


Wróć do „Arduino”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 1 gość