Popularny post Techkubas Napisano Listopad 13, 2020 Popularny post Udostępnij Napisano Listopad 13, 2020 (edytowany) Witam. Przychodzę do was z kolejnym projektem. Wersja powiedzmy już 1.0, nie udało mi się osiągnąc wszystkiego co chciałem, lecz przynajmniej całość działa w swoim postawowym założeniu. Projektem tym jest wagoworkownica która będzie mi służyła do odważania ziemniaków podczas ich przebierania z skrzynio-palet. Główne założenia: Ustawiamy wybraną przez nas wagę za pomocą potencjometru Włączamy za pierwszym razem taśmę włącznikiem Taśma do 90% wagi idzie na 100% prędkości, przy ostatnich 10% zwalnia do połowy, a po osiągnięciu zadanej wagi się zatrzymuje (niespełnione, nie działa zwalnianie przy ostatnich 10%, taśma rusza jedynie przy pustym zbiorniku i zatrzymuję się przy pełnym) Gdy taśma się zatrzyma, naciskamy rączkę i siłownik na powietrze otwiera klapkę od spodu zsypując ziemniaki do worka (dodane jest 5 sekund czekania po zamknięciu klapki, ponieważ czasem trzeba klapkę zamknąć i otworzyć aby ziemniaki zleciały dalej gdy się zablokują o siebie.) Gdy opróźnimy zbiornik i zamkniemy klapkę, taśma ponownie rusza Elementy wykorzystane przy projekcie: Arduino UNO Wyświetlacz TM1638 Moduł przekaźnika Stabilizator 5V L7805 Potencjoemtr liniowy 10kOhm HX711 - wzmacniacz do belki tensometrycznej 2 szt Belek tensometrycznych po 20kg każda Wyłącznik krańcowy LS-11s Przycisk Silnik trójfazowy z przekładnią Falownik Schemat: (Podłączenie do samego arduino możę wskazywać inne piny niż w kodzie! Reszta połączeń prawidłowa) (Na schemacie między przekaźnikiem a falownikiem jest jeszcze dodatkowy włącznik dzięki czemu możemy wyłączyć ręcznie taśmę, jest on dodany między P24 a NC) (Arduino jest zasilane z portu USB wyciągniętego na bok obudowy i podłączonego do ładowarki sieciowej (patrz zdjęcia na dole strony)) Kod: Cały kod dla arduino. WYMAGANE biblioteki HX711 i TM1638plus float calibration_factor = 53270; Każdy kalibruje tą linijkę dla swoich belek tensometrycznych. Przykładowy kod kalibracyjny if(buttons == 1) { ust = map(analogRead(ustPin), 0, 1000, 1400, 1600); if((analogRead(ustPin) >= 0) && ((analogRead(ustPin) < 50))) { tm.reset(); tm.displayText(" 14.00"); delay(100); } else if((analogRead(ustPin) >= 50) && ((analogRead(ustPin) < 100))) { tm.reset(); tm.displayText(" 14.10"); delay(100); ... Za pomocą tych linijek mapujemy wartość z potencjometru do wartości 1400- 1600 (14- 16kg), a następnie wyświetlamy na wyświetlaczu. Niestety miałem tutaj problem i albo ciałkowicie nie wyświetlała mi się ta zmapowana wartość na wyświetlaczu lub wyskakiwały jakieś chińskie znaczki, dlatego musiałem rozwiązać to w taki sposób jak w kodzie (dokładność w ustawianiu potencjometrem dałej mamy co do 10g, jednak na wyświetlaczu USTAWIONA waga zmienia się co 100g). Nie można było zmapować wartości do liczb po przecinku więc wybieramy liczbę w zakresie od 1400 do 1600 a następnie jest ona przemnażana. if(ciezar <= ust*0.01) { digitalWrite(prze, HIGH); } else if(ciezar > ust*0.01) { digitalWrite(prze, LOW); delay(1000); } Jeśli w lejku jest mniej niż ustawiona waga, to przekaźnik załącza taśmę, jeśli mamy już pełno to przekaźnik rozłącza taśmę. else if(digitalRead(otwPin)==LOW) { tm.reset(); tm.displayText("OTwArTE"); Serial.println("otwarte"); digitalWrite(prze, LOW); delay(5000); } Jeśli otworzymy klapkę za pomocą siłownika, taśma zosatje dalej zatrzymana, wyświetla się napis "otwarte" i dodatkowo po zamknięciu klapki ten stan utrzymuje się przez 5 sekund (na przykłąd gdy musiamy zamknąć klapkę i ponownie otworzyć, żeby reszta zmieniaków zleciała, a żeby taśma nie ruszyła znowu i nie dorzuciła więcej ziemniaków). Kod nie jest może najlepszy, jednak całość spełnia swoje zadanie. Standardowo miało być również sterowanie prędkością taśmy w zależności od wagi za pomocą sygnału PWM i konwerter PWM > 0-10V na układzie LM358. Jednak wtedy arduino musi być połączone z masą falownikiem przez co gdy silnik zwalniał lub przyspieszał to na wyświetlaczu pojawiały się wartości z wagi z kosomosu i całość głupiała. Próbowałem zastosować optoizolator, zmieniałem silnik i prawie każdy element jednak nic to nie dawało i jak narazie z tego zrezygnowałem, ponieważ straciłem na to kilka tygodni. Oczywiście na ma z boku drugiej, wąskiej taśmy która by dosypywała na koniec po jednym ziemniaku, więc czasem się zdaży ze będzie 99% ustawionej wagi a spadną 4 ziemniaki które były akurat na taśmie i będzie powiedzmy 105% (waga normalnie podawana jest w kilogramach, dla przykładu podaje jednak wartości w procentach poniważ zależy to od ustawionej wagi za pomocą potencjometru) , więc potrzebna jest ręczna ingerencja żeby odłożyć te 3 dodatkowe, lecz nie taka jak przy sypaniu na oko i ręcznym ważeniu kiedy często nasypie się kilkogram czy dwa w jedną lub drugą stronę. (Chciałęm wstawić jeszcze skonwertowane mp4 do gifa, niestety wyczerpałem limit na załączniki 😞 ) To już wszystko na temat tego projektu, dziękuję wszystkiem za dotrwanie do tego momenu i życzę powodzenia w składaniu być może takiej samej, a nawet lepszej konstrukcji. Edytowano Listopad 13, 2020 przez kubaskubas4 8 Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Listopad 15, 2020 Udostępnij Listopad 15, 2020 @kubaskubas4 oryginalny projekt, czegoś takiego jeszcze u nas chyba nie było 😉 1 Cytuj Link do komentarza Share on other sites More sharing options...
Ogyb Listopad 15, 2020 Udostępnij Listopad 15, 2020 Na zwalnianie dołożyć drugi przekaźnik zwierajacy jakiś rezystor i ustawić tam 50% prędkości na falownik. Przez wejście 0-10V np. Jak ktoś ręcznie sypał ziemniaki do worków... wie co to znaczy;) Cytuj Link do komentarza Share on other sites More sharing options...
Techkubas Listopad 15, 2020 Autor tematu Udostępnij Listopad 15, 2020 @Ogyb Czyli pod COM podłączam 10V z falownika, i powiedzmy pod NC daje prosto do złącza OI (odczyt 0-10V) na falowniku, a na NC dodaje rezystor i tak samo pod OI. A gdzie w takim razie podłączyć masę? Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Produkcja i montaż PCB - wybierz sprawdzone PCBWay! • Darmowe płytki dla studentów i projektów non-profit • Tylko 5$ za 10 prototypów PCB w 24 godziny • Usługa projektowania PCB na zlecenie • Montaż PCB od 30$ + bezpłatna dostawa i szablony • Darmowe narzędzie do podglądu plików Gerber Zobacz również » Film z fabryki PCBWay
Ogyb Listopad 15, 2020 Udostępnij Listopad 15, 2020 (edytowany) Jeżeli weźmiesz 2 rezystory. Pierwszy rezystor do +10V falownika a drugi jego koniec do wejścia napięcia sterującego w falowniku. Potem bierzesz rezystor nr 2 i łączysz jego jeden koniec z wejściem napięcia sterującego w falowniku, a drugi koniec z przekaźnikiem. Potem wolny koniec styku przekaźnika do masy falownika. Czyli na zwartym tworzy się dzielnik napięcia i podaje napięcie zgodne z stosunkiem rezystorków na wejście napięcia sterującego. Jeżeli przekaźnik jest rozwarty to na wejściu sterującym będzie 10V gdyż nie będzie podawana masa na dolny rezystor. Edytowano Listopad 16, 2020 przez Ogyb 1 Cytuj Link do komentarza Share on other sites More sharing options...
Techkubas Listopad 23, 2020 Autor tematu Udostępnij Listopad 23, 2020 @Ogyb Przetestowałem już wage przy przebieraniu dwóch skrzyń, wszystko działa jak należy. To zwalnianie raczej nic nie da poniważ, odważa dobrze jedynie dosypuje czasem zbyt dużo ziemnaików (poprostu są 4 na taśmie i zlecą 4, a potrzeba jednego). Lepszym rozwiązaniem była by druga wąska taśma z boku, tak aby dosypywało pod koniec po jednym ziemniaku, jednak nie mam już tego jak przerobić raczej, a taki efekt jaki jest mi wystarczy. Cytuj Link do komentarza Share on other sites More sharing options...
Admon Styczeń 13, 2021 Udostępnij Styczeń 13, 2021 Bardzo dobry przykład jak ułatwić ciężką pracę fizyczną wykorzystując technologię. Super pomysł jako pierwszy krok. W tej sytuacji nasuwa się pytanie - jakie jest finalne idealne rozwiązanie ? (IFR - Ideal Final Result), które jest integralnym elementem procesu TRIZ (skrót z rosyjskiego : техника решения инновационных задач) w/g Altszullera. W/g mnie to jest maszyna pakująca Ishida (Japonia) - składająca się z 16 indywidualnych sekcji ważących ziemniaki umieszczonych na okręgu. W trakcie pakowania realizowana jest funkcja optymalizacji, polegająca na realizacji otwarcia 4-6 sekcji jednocześnie sterowanego przez przez komputer, tak aby uzyskać wagę jednostkowego opakowania zbliżoną do zadanej. Widziałem takie maszyny 20lat temu, pracujące z wydajnością 1 worek na 3-5 sekund. Zadana waga była 2.2 funty UK (1 kg), a dokładność wynosiła 50g. Maszyna pracowała w zakresie do 20kg opakowania jednostkowego. Identyczne maszyny służą do pakowania produktów sypkich przemysłu spożywczego (np. czipsów). Szczegóły można obejrzeć: https://youtu.be/m6wOonjT9KE?t=103 1 Cytuj Link do komentarza Share on other sites More sharing options...
Krisu880 Luty 9, 2021 Udostępnij Luty 9, 2021 Tak wygląda mój kod. oczywiście skopiowany z innej wagi ale jako jeden z nielicznych działa /* ------------------------------------------------------------------------------------- HX711_ADC Arduino library for HX711 24-Bit Analog-to-Digital Converter for Weight Scales Olav Kallhovd sept2017 ------------------------------------------------------------------------------------- */ /* This example file shows how to calibrate the load cell and optionally store the calibration value in EEPROM, and also how to change the value manually. The result value can then later be included in your project sketch or fetched from EEPROM. To implement calibration in your project sketch the simplified procedure is as follow: LoadCell.tare(); //place known mass LoadCell.refreshDataSet(); float newCalibrationValue = LoadCell.getNewCalibration(known_mass); */ #include <HX711_ADC.h> #include <EEPROM.h> //pins: const int HX711_dout = 4; //mcu > HX711 dout pin const int HX711_sck = 5; //mcu > HX711 sck pin int ledPin = 2; float odczytWagi = Serial.read(); // Twój odczyt masy z wagi (wyrażony w gramach!!!!!!!) float minMasaPojemnika = 325; // 1g float minMasaDoZamkniecia = 1325; // 100g //HX711 constructor: HX711_ADC LoadCell(HX711_dout, HX711_sck); const int calVal_eepromAdress = 0; unsigned long t = 0; void setup() { Serial.begin(57600); delay(1000); Serial.println(); Serial.println("Starting..."); pinMode(ledPin, OUTPUT); LoadCell.begin(); unsigned long stabilizingtime = 2000; // preciscion right after power-up can be improved by adding a few seconds of stabilizing time boolean _tare = false; //set this to false if you don't want tare to be performed in the next step LoadCell.start(stabilizingtime, _tare); if (LoadCell.getTareTimeoutFlag() || LoadCell.getSignalTimeoutFlag()) { Serial.println("Timeout, check MCU>HX711 wiring and pin designations"); while (1); } else { LoadCell.setCalFactor(1.0); // user set calibration value (float), initial value 1.0 may be used for this sketch Serial.println("Startup is complete"); } while (!LoadCell.update()); calibrate(); //start calibration procedure float odczytWagi = Serial.read(); // Twój odczyt masy z wagi (wyrażony w gramach!!!!!!!) float minMasaPojemnika = 325; // 1g float minMasaDoZamkniecia = 1325; // 100g } void loop() { static boolean newDataReady = 0; const int serialPrintInterval = 0; //increase value to slow down serial print activity // check for new data/start next conversion: if (LoadCell.update()) newDataReady = true; // get smoothed value from the dataset: if (newDataReady) { if (millis() > t + serialPrintInterval) { float i = LoadCell.getData(); Serial.print("Load_cell output val: "); Serial.println(i); newDataReady = 0; t = millis(); } } // receive command from serial terminal if (Serial.available() > 0) { char inByte = Serial.read(); if (inByte == 't') LoadCell.tareNoDelay(); //tare else if (inByte == 'r') calibrate(); //calibrate else if (inByte == 'c') changeSavedCalFactor(); //edit calibration value manually } // check if last tare operation is complete if (LoadCell.getTareStatus() == true) { Serial.println("Tare complete"); if(odczytWagi >= minMasaDoZamkniecia) { digitalWrite(ledPin, LOW); // Zamknij zawór } else if(odczytWagi >= minMasaPojemnika) { digitalWrite(ledPin, HIGH); // Otwórz zawór } else if (odczytWagi = 0) { digitalWrite(ledPin, LOW); // (Stan krytyczny - brak pojemnika na wadze, natychmiast zamknij zawór) // Zamknij zawór } } } void calibrate() { Serial.println("***"); Serial.println("Start calibration:"); Serial.println("Place the load cell an a level stable surface."); Serial.println("Remove any load applied to the load cell."); Serial.println("Send 't' from serial monitor to set the tare offset."); boolean _resume = false; while (_resume == false) { LoadCell.update(); if (Serial.available() > 0) { if (Serial.available() > 0) { char inByte = Serial.read(); if (inByte == 't') LoadCell.tareNoDelay(); } } if (LoadCell.getTareStatus() == true) { Serial.println("Tare complete"); _resume = true; } } Serial.println("Now, place your known mass on the loadcell."); Serial.println("Then send the weight of this mass (i.e. 100.0) from serial monitor."); float known_mass = 0; _resume = false; while (_resume == false) { LoadCell.update(); if (Serial.available() > 0) { known_mass = Serial.parseFloat(); if (known_mass != 0) { Serial.print("Known mass is: "); Serial.println(known_mass); _resume = true; } } } LoadCell.refreshDataSet(); //refresh the dataset to be sure that the known mass is measured correct float newCalibrationValue = LoadCell.getNewCalibration(known_mass); //get the new calibration value Serial.print("New calibration value has been set to: "); Serial.print(newCalibrationValue); Serial.println(", use this as calibration value (calFactor) in your project sketch."); Serial.print("Save this value to EEPROM adress "); Serial.print(calVal_eepromAdress); Serial.println("? y/n"); _resume = false; while (_resume == false) { if (Serial.available() > 0) { char inByte = Serial.read(); if (inByte == 'y') { #if defined(ESP8266)|| defined(ESP32) EEPROM.begin(512); #endif EEPROM.put(calVal_eepromAdress, newCalibrationValue); #if defined(ESP8266)|| defined(ESP32) EEPROM.commit(); #endif EEPROM.get(calVal_eepromAdress, newCalibrationValue); Serial.print("Value "); Serial.print(newCalibrationValue); Serial.print(" saved to EEPROM address: "); Serial.println(calVal_eepromAdress); _resume = true; } else if (inByte == 'n') { Serial.println("Value not saved to EEPROM"); _resume = true; } } } Serial.println("End calibration"); Serial.println("***"); Serial.println("To re-calibrate, send 'r' from serial monitor."); Serial.println("For manual edit of the calibration value, send 'c' from serial monitor."); Serial.println("***"); } void changeSavedCalFactor() { float oldCalibrationValue = LoadCell.getCalFactor(); boolean _resume = false; Serial.println("***"); Serial.print("Current value is: "); Serial.println(oldCalibrationValue); Serial.println("Now, send the new value from serial monitor, i.e. 696.0"); float newCalibrationValue; while (_resume == false) { if (Serial.available() > 0) { newCalibrationValue = Serial.parseFloat(); if (newCalibrationValue != 0) { Serial.print("New calibration value is: "); Serial.println(newCalibrationValue); LoadCell.setCalFactor(newCalibrationValue); _resume = true; } } } _resume = false; Serial.print("Save this value to EEPROM adress "); Serial.print(calVal_eepromAdress); Serial.println("? y/n"); while (_resume == false) { if (Serial.available() > 0) { char inByte = Serial.read(); if (inByte == 'y') { #if defined(ESP8266)|| defined(ESP32) EEPROM.begin(512); #endif EEPROM.put(calVal_eepromAdress, newCalibrationValue); #if defined(ESP8266)|| defined(ESP32) EEPROM.commit(); #endif EEPROM.get(calVal_eepromAdress, newCalibrationValue); Serial.print("Value "); Serial.print(newCalibrationValue); Serial.print(" saved to EEPROM address: "); Serial.println(calVal_eepromAdress); _resume = true; } else if (inByte == 'n') { Serial.println("Value not saved to EEPROM"); _resume = true; } } } Serial.println("End change calibration value"); Serial.println("***"); } 1 Cytuj Link do komentarza Share on other sites More sharing options...
BlackJack Luty 10, 2021 Udostępnij Luty 10, 2021 (edytowany) Możesz podać model falownika, ciekawi mnie czy dałoby się to zrobić na nim samym, bo pewnie ma w środku PID. Na pewno ciekawy byłby tutaj falownik TECO, bo ma w sobie proste PLC. Edytowano Luty 10, 2021 przez BlackJack Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Dołącz do dyskusji, napisz odpowiedź!
Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!