Skocz do zawartości

Skrypt w pythonie, sterowanie silnikiem za pomocą DRV8835


Pomocna odpowiedź

Napisano

Witam, nie znam się za bardzo na pythonie a potrzebuję skryptu do sterowania silniczkiem za pomocą sterownika DRV8835 podłączonego do raspberry.

Wszystko zaczerpnąłem stąd: https://github.com/pololu/drv8835-motor-driver-rpi

from __future__ import print_function
import time
from pololu_drv8835_rpi import motors, MAX_SPEED

# Set up sequences of motor speeds.
test_forward_speeds = list(range(0, MAX_SPEED, 1)) + \
  [MAX_SPEED] * 200 + list(range(MAX_SPEED, 0, -1)) + [0]  

test_reverse_speeds = list(range(0, -MAX_SPEED, -1)) + \
  [-MAX_SPEED] * 200 + list(range(-MAX_SPEED, 0, 1)) + [0]  

try:
    motors.setSpeeds(0, 0)

    print("Motor 1 forward")
    for s in test_forward_speeds:
        motors.motor1.setSpeed(s)
        time.sleep(0.005)

    print("Motor 1 reverse")
    for s in test_reverse_speeds:
        motors.motor1.setSpeed(s)
        time.sleep(0.005)

    print("Motor 2 forward")
    for s in test_forward_speeds:
        motors.motor2.setSpeed(s)
        time.sleep(0.005)

    print("Motor 2 reverse")
    for s in test_reverse_speeds:
        motors.motor2.setSpeed(s)
        time.sleep(0.005)

finally:
  # Stop the motors, even if there is an exception
  # or the user presses Ctrl+C to kill the process.
  motors.setSpeeds(0, 0)

Powyższy skrypt działa dobrze.

Potrzebuję teraz zrobić taki skrypt w którym silniczek będzie obracał się ustaloną ilość obrotów lub czasu jeśli się nie da z obrotami po czym zatrzymywał. I drugi taki sam na wstecznym.

Skrypty te chciałbym wrzucić do automatycznego uruchamiania o danych porach co zapewne mogę zrobić w crontab (działam na ubuntu)

Ma to ogólnie posłużyć do przesuwania małych drzwiczek w lewo i w prawo o ustalonych porach.

Problem jest tylko taki, że przy zamykaniu drzwiczek opierają się one o ścianę i jeśli nie ustawię dokładnych obrotów to silniczek jak niemam może się spalić gdy ustawię ich za dużo. Więc zamykanie musi być dokładnie ustawione, chyba że mogę to jakoś inaczej zabezpieczyć? Przy otwieraniu już nie ma tego problemu, jest względny luz.

Jeśli to jest zwykły silnik DC to nie masz możliwości, aby programowo wymusić obracanie się wału o XX obrotów. Ustawianie czasu pracy silnika "na sztywno" nie przyniesie dobrych rezultatów. Wystarczy, że ktoś/coś zablokuje drzwiczki i wszystko się rozsynchronizuje. Masz dwa wyjścia - enkodery (czujniki zliczające obroty silnika) lub czujniki w drzwiach. Możesz założyć krańcówki po obu stronach przeszkody. Wtedy np. przy zamykaniu drzwi będziesz musiał kręcić silnikiem do momentu, aż dotkną one fizycznie czujnika znajdującego się w ramie drzwi. Sytuacja analogiczna do tego jak steruje się automatycznymi roletami antywłamaniowymi.

Ok rozumiem. Dam radę taki enkoder podłączyć pod obecny setup raspberry + sterownik drv8835?

A silnik to Pololu HP 1000:1, także zakładam że jest zwykły 😛

Mam też wyłączniki krańcowe, da się je podłączyć pod ten sterownik?

I ostatnie pytanie, czy taki silniczek (lub jakiś inny) nie posiadają żadnego zabezpieczenia w razie gdyby coś się zacięło? Czy momentalnie po dojściu drzwiczek do ściany i dalszemu kręceniu się silniczka odrazu silniczek padnie/połamią się trybiki itp. Tak jak Pan stwierdził, poza wyeliminowaniem problemu ściany pozostaje jeszcze kwestia że "coś lub ktoś" niechcąco zablokuje działanie silniczka i co wtedy?

Przed chwilą, Foxs napisał:

I ostatnie pytanie, czy taki silniczek (lub jakiś inny) nie posiadają żadnego zabezpieczenia w razie gdyby coś się zacięło? Czy momentalnie po dojściu drzwiczek do ściany i dalszemu kręceniu się silniczka odrazu silniczek padnie/połamią się trybiki itp. Tak jak Pan stwierdził, poza wyeliminowaniem problemu ściany pozostaje jeszcze kwestia że "coś lub ktoś" niechcąco zablokuje działanie silniczka i co wtedy?

To jest zwykły silnik - płynie prąd to on się kręci (lub chociaż próbuje). To konstruktor musi niestety zadbać o zabezpieczenie. Gdyby to był słabszy silnik to można byłoby jeszcze liczyć, że silnik się zatrzyma i może nic mu się nie stanie. Jednak w przypadku silnika Pololu HP 1000:1 sam producent ostrzega, że: "The recommended upper limit for instantaneous torque is 35 oz-in (2.5 kg-cm) for the 1000:1 gearboxes and 25 oz-in (2 kg*cm) for all the other gear ratios; we strongly advise keeping applied loads well under this limit. Stalls can also result in rapid (potentially on the order of seconds) thermal damage to the motor windings and brushes, especially for the versions that use high-power (HP and HPCB) motors; a general recommendation for brushed DC motor operation is 25% or less of the stall current". Streszczając: mocno obciążony silnik się uszkodzi.

Można podłączyć zarówno enkoder, jak i krańcówki. Jednak obsługa enkoderów nie jest prostym zadaniem i narobisz sobie wielu problemów. Znacznie prościej będzie wykorzystać krańcówki - to są zwykłe przełączniki, które można podpiąć pod GPIO i obsłużyć w Pythonie bardzo łatwo (pokazywaliśmy do w kursie RPi). Niestety nadal nie wyeliminuje to problemu, w którym coś zatrzyma drzwi "po środku". Ciężko tutaj doradzić konkretne rozwiązanie bez ogólnej wiedzy jak te drzwi są zbudowane i napędzane. Jakieś zdjęcia/rysunki techniczne byłyby pomocne.

Całość jest bardzo podobna do przesuwanych drzwi od szafy, drzwiczki tylko jeżdżą na rolkach w lewo i w prawo, w prawo mamy ścianę do której drzwiczki mają się domknąć a w lewo jest już sporo miejsca, bez ścianki zatrzymującej drzwiczki. Niemniej po mojemu jakby tego nie zabezpieczyć to i tak trzeba założyć, że do takowego zacięcia się może kiedyś dojść. Postaram się zminimalizować szansę na to i ewentualnie jakoś przeboleć kupno nowego silniczka raz na jakiś czas o ile nie będzie to zbyt często.

 

Po mojemu powinien być jakiś czujnik w silniku który przy zwiększonym natężeniu siły (czyli zatrzymaniu drzwiczek) powoduje odcięcie prądu. Nie znam się ogólnie na tym ale tak dywaguje. Takie coś byłoby dość pomocne bo inaczej nie widzę możliwości zabezpieczenia się przed ewentualną dość losową sytuacją zatrzymania drzwiczek. Innymi słowy nawet jakbym specjalnie zatrzymał kręcący się silnik to powinien on być w stanie to przetrwać, zatrzymać się lub zacząć kręcić w drugą stronę lub coś w tym stylu. Takie coś jest zdaje się w windach, nawet palca sobie nie można uciąć bo drzwi są automatycznie cofane, nie można czegoś podobnego zastosować tutaj?

Do podłączenia krańcówek nie trzeba żadnych pinów tylko dwie diody.

Co do "czujnika w silniku" - po prostu mierzysz prąd pobierany przez silnik i jego wzrost oznacza, że silnik został zatrzymany. Mam coś takiego w domu (napęd zasłon) na L298N, działa bezbłędnie, co więcej w przypadku jakiegokolwiek zacięcia wyłącza silnik.

4 minuty temu, ethanak napisał:

Do podłączenia krańcówek nie trzeba żadnych pinów tylko dwie diody.

Co do "czujnika w silniku" - po prostu mierzysz prąd pobierany przez silnik i jego wzrost oznacza, że silnik został zatrzymany. Mam coś takiego w domu (napęd zasłon) na L298N, działa bezbłędnie, co więcej w przypadku jakiegokolwiek zacięcia wyłącza silnik.

o świetne, powiesz mi względnie łopatologicznie jak to zrobić, najlepiej na tym sterowniku co ja mam DRV8835 jeśli się da?

W takim wypadku chyba nawet nie trzeba robić krańcówek, po prostu silnik doszedłby do ściany, byłby wzrost napięcia i momentalnie powinien silnik zostać odcięty czyż tak?

Nie wiem czy się da na tym sterowniku - L298N ma wyjście pomiaru prądu. Prawdopodobnie da się to zrobić, ale niech się wypowiedzą mądrzejsi ode mnie.

I owszem, w takim wypadku nie potrzeba krańcówek.

Jeśli obawiasz się zablokowania drzwi w położeniu, w którym nie zareagują krańcówki, to wstaw sprzęgło, które rozsprzęgli/zerwie się w przypadku blokady. Wtedy nawet zawieszenie się elektroniki nie spali silnika.

19 godzin temu, Jamik napisał:

Jeśli obawiasz się zablokowania drzwi w położeniu, w którym nie zareagują krańcówki, to wstaw sprzęgło, które rozsprzęgli/zerwie się w przypadku blokady. Wtedy nawet zawieszenie się elektroniki nie spali silnika.

Czyli takie coś: https://botland.com.pl/chwytaki-uchwyty-gimbale/2574-magnetyczne-sprzeglo-micro-serwo.html

To by chyba byłoby łatwiejsze do ogarnięcia niż nowy sterownik i sprawdzanie natężenia prądu, tego nie umiałbym zrobić.

Nie znam sił działających w takim układzie, ale chyba takie sprzęgło będzie dla Ciebie za słabe.

19 godzin temu, Foxs napisał:

To by chyba byłoby łatwiejsze do ogarnięcia niż nowy sterownik i sprawdzanie natężenia prądu, tego nie umiałbym zrobić.

Niby tak, ale z drugiej strony nie będziesz znał faktycznego położenia drzwi. Będziesz mógł kręcić ciągle silnikiem, a nie będziesz wiedział czy przesuwasz drzwi, czy są one zablokowane, a Ty tylko kręcisz sprzęgłem.

(edytowany)

No to nie wiem już co będzie lepsze... generalnie najlepiej by było zrobić to bez żadnych zabezpieczeń w sposób który nic i nikt nie zablokuje tych drzwi, tyle że to jest awykonalne :<

Ktoś mi może pokazać taki przykładowy sterownik który mierzy natężenie prądu i który mógłbym podłączyć pod raspberry? Taki o którym pisał kolega @ethanak

Edytowano przez Foxs

Ja akurat żadnego takiego nie używałem, więc nie będą w ciemno doradzał. Akurat do takiego zastosowania zacznie szybciej dobrałbyś podzespoły pod Arduino (które ma ADC). Jednak jeśli dobrze pamiętam chcesz móc zdalnie sterować tym wszystkim przez SSH i stąd głównie wybór RPi?

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...