• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Pomoc z działaniem projektu
#1
Witam jestem nowym użytkownikiem arduino uno i potrzebuję pomocy w działaniu kodu. Mam dwie funkcję jedna odnosi się do działania silnika krokowego i jego obrotów natomiast, druga do odczytywania wagi z belki tensometrycznej. Osobno wszystko fajnie chodzi, jednak kiedy próbuje połączyć to w całość (ciągłe działanie silnika i jednoczesne odczytywanie wagi w krótkim czasie). Nie wiem czy w arduino da radę zrównoleglić program ale na czymś takim by mi zależało. Na ten moment waga na lcd szybko się aktualizacji co jest w porządki jednak z taką samą prędkością silnik ma krótkie przerwy.
Poniżej kod:
https://paste.ofcode.org/naKX5Ti43pY8HNsujgB3jL
 
Odpowiedź
#2
Program nie ma sensu, to i nie działa prawidłowo. Naucz się używać millis(), zastanów się czy jest sens wyświetlać coś częściej niż co ... - tu sobie wstaw wartość i rób to nie częściej niż jest to absolutnie niezbędne. W kolejnym kroku przestań czyścić ekran, po prostu nadpisuj go nowymi wartościami.
W sumie to bardzo dobry program do nauki, tyle rzeczy tu można zrobić inaczej.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#3
(18-12-2021, 21:52)kaczakat napisał(a): Program nie ma sensu, to i nie działa prawidłowo. Naucz się używać millis(), zastanów się czy jest sens wyświetlać coś częściej niż co ... - tu sobie wstaw wartość i rób to nie częściej niż jest to absolutnie niezbędne. W kolejnym kroku przestań czyścić ekran, po prostu nadpisuj go nowymi wartościami.
W sumie to bardzo dobry program do nauki, tyle rzeczy tu można zrobić inaczej.
Dziękuje za odpowiedź, nie za bardzo po drodze mi z arduino, potrzebuje jedynie zoptymalizować ten projekt. Co do wyświetlania potrzebuję na LCD otrzymywać wyniki jak najczęściej by zbadać siłę oderwania. Co znaczy, że nie działa? Po odpaleniu lcd pokazuje wyniki z belki w oczekiwany sposób, jedynie silnik ma krótkie przerwy w działaniu, którym chciałbym zapobiec, niestety nie wiem jak.
 
Odpowiedź
#4
No to jak działa, to po co ten temat?
Jak jesteś cyborgiem i potrafisz analizować dane wyświetlane co 5ms (tyle masz tam delaya) to może ma to sens. Jak jesteś człowiekiem to wartości wyświetlane częściej niż 200-1000ms nie mają sensu. Można je wysłać na serial częściej, zapisać do pliku, ale nie LCD 16x2 I2C. Odczyt danych z czujników i kręcenie silnikiem by sterować jakimś procesem można nawet częściej, ale dla oczu operatora to nic nie daje. Zauważysz różnicę, że coś jest wyświetlane w 1FPS, 10FPS, czy 20FPS, ale nie przeanalizujesz oczami takiej ilości danych.
Ekran na I2C zajmuje z 20ms na wysłanie danych, pewnie w tym czasie silnik jest bez sterowania. Zmień ekran na zwykły z interfejsem równoległym, a silnikiem kręć w przerwaniach od timera. Jest jeszcze tak funkcja bliźniacza do millis - micros(), można złapać licznik us przed i drugi po jakiś czynnościach, potem odejmowanie i wyrzucenie na serial pokazuje ile dany blok programu zajmuje czasu. Sprawdź sobie ile trwa odczyt_z_belki(); i czy to Ci generuje tą czkawkę. Są też gotowe biblioteki do silnika krokowego.
Jak nie po drodze z Arduino to nawet dobrze, w czystym C operowanie stanami portu bezpośrednio przez rejestry pamięci uC jest 10x szybsze niż w Arduino - profit.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#5
Panowanie nad czasem jest jednym z kluczowych elementów optymalizacji programu w Arduino. Delay powinien zniknąć, a porównanie: b%100 == 0 jest potencjalnym zabójcą niezawodności programu.

Wysłane z mojego POCOPHONE F1 przy użyciu Tapatalka
 
Odpowiedź
#6
Rzeczywiście zauważyłem różnice w uzyskiwanych danych na wyświetlaczu lcd oraz tych w monitorze portu szeregowego, inną siłe pokazuję mi LCD a inną dostaje w monitorze portu. Kody działają ale osobne mianowicie powyżej wysłany kod powstał z bardzo amatorskiego połączenia przeze mnie tych dwóch kodów, które jak mi się wydaje dzialają poprawnie.
Kod do silnika: https://paste.ofcode.org/8ZcgiR6vBVQFL4rQKVfhUt
Kod do ważenia przez belke: https://paste.ofcode.org/eqfWmxZkJCB5R4sRLHrug8
Delay wynosił 5 bo jak wydawało mi się,że sterowałem nim prędkością obrotową silnika, i chciałem ją zwiększyć.
 
Odpowiedź
#7
Delay wystarcza do zrobienia dema prostego programu, jeśli ma to ogarniać kilka funkcji to trzeba dodać umiejętność korzystania z millis(), jak czas jest krytyczny to przerwania timera.
Serial możesz ustawić na prędkość nawet 1Mbps, zależy od konkretnego konwertera, LCD na I2C nie wiem czy efektywnie przekracza 1kbps.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#8
FORBOT ma lekcję dedykowaną tylko i wyłącznie tematowi delay i millis. Obejrzeć, zrozumieć, wprowadzić w życie.
 
Odpowiedź
#9
Niestety nie wime jak zastąpić funkcję deleay, z tego co wyczytałem na FORBOT funkcja mills jedynie odmierza czas, usuwając funkcję delay program przestaje działać. Należy zastosować dodatkową bibliotekę stepper w celu konfiguracji działania silnika?
 
Odpowiedź
#10
Linki do kodu nie działają.

Wysłane z mojego POCOPHONE F1 przy użyciu Tapatalka
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości