Spisu treści:

Servodriver-Board Z Python-GUI i Arduino: 5 kroków
Servodriver-Board Z Python-GUI i Arduino: 5 kroków

Wideo: Servodriver-Board Z Python-GUI i Arduino: 5 kroków

Wideo: Servodriver-Board Z Python-GUI i Arduino: 5 kroków
Wideo: Gesture-Controlled Servo with Python and Arduino #electronics #arduinotraining 2024, Listopad
Anonim
Servodriver-Board z Python-GUI i Arduino
Servodriver-Board z Python-GUI i Arduino

Prototypując lub budując modele samolotów często natrafia się na problem, że trzeba sprawdzić skok serwa lub ustawić serwa w pozycji środkowej.

Jeśli nie chcesz budować całego systemu RC lub testować, jak daleko możesz popchnąć serwo lub gdzie jest pozycja środkowa, ta płyta jest dla Ciebie! Pozwala przesunąć serwo w określone pozycje lub jeździć tam iz powrotem.

Działa zaskakująco dobrze, nawet z 6 serwomechanizmami, które ścigają się z jednej pozycji na drugą na pętli.

Jest to również fajny projekt do nauki komunikacji między Python-GUI i Arduino za pomocą Serial.

Krok 1: Czego potrzebujesz…

Do tego projektu będziesz potrzebować:

Sprzęt komputerowy

  • Arduino nano z kablem. Użyłem klona, a kod Pythona faktycznie oczekuje klonu CH340-chip
  • Płytka prototypowa. Wystarczy 7x5cm
  • Niektóre nagłówki i szpilki 2, 54 mm
  • 1-6 serw
  • Zasilanie serw (użyłem batterypack z 4 bateriami)

Oprogramowanie

  • Python 3:
  • Sterownik USB dla chipów CH340: po prostu wyszukaj w Google sterowniki dla sterowników CH340
  • Arduino IDE:

Krok 2: Lutowanie płytki

Lutowanie płytki
Lutowanie płytki

Lutowanie jest właściwie proste według Fritzinga na zdjęciu. Tylko upewnij się, że możesz łatwo podłączyć serwa do 3-pinowych rzędów.

  • Trzy rzędy pinów są podłączone do cyfrowych pinów 3, 5, 6, 9, 10 i 11 Arduino nano.
  • Czerwony przewód jest podłączony do pinu 5V Arduino
  • Czarny przewód jest podłączony do pinu GND Arduino
  • Para pinów pod 3-pinowymi rzędami służy do podłączenia typowego zasilacza odbiornika RC, możesz dodawać złącza, jak chcesz, takie jak zaciski śrubowe, złącza XT, JST lub… lub…

Osobiście lubię rzędy żeńskich nagłówków, aby umieścić Arduino, ale to zależy od Ciebie.

Należy pamiętać, że zwarte żeńskie złącza to zworka, która umożliwia zasilanie serwa przy użyciu źródła 5V Arduino do celów testowych. Jeśli za bardzo go obciążysz, Arduino zresetuje się i straci właściwe tempo. MUSZĄ one zostać usunięte przed podłączeniem kolejnego zasilacza.

Krok 3: Konfiguracja Arduino

Zainstaluj Arduino IDE i sflashuj Arduino nano z załączonym szkicem.

Krok 4: Konfiguracja Pythona

Konfigurowanie Pythona
Konfigurowanie Pythona

Zainstaluj Pythona 3 po pobraniu. Upewnij się, że zaznaczyłeś opcję tworzenia zmiennej „PATH”.

Musisz zainstalować jeszcze dwa pakiety za pomocą pip. W tym celu naciśnij klawisz "Windows", wpisz "cmd" i naciśnij "enter". W wierszu polecenia wpisz następujące polecenia:

  • pip zainstalować serial
  • piip zainstaluj pyserial
  • pip zainstaluj tkinter

Jak widać, potrzebuję modułów serial i pyserial, który prawdopodobnie nie jest najwydajniejszy, ponieważ pyserial powinien zastąpić serial. Niemniej jednak działa i dopiero zaczynam się uczyć;).

Otwórz skrypt Pythona w IDE i uruchom go lub uruchom bezpośrednio z terminala.

W rozwijanym menu możesz wybrać jeden z dwóch trybów: „Go Straight” i „Ping Pong”:

  • Idź prosto: Wprowadź pozycję serwa w mikrosekundach w pierwszej kolumnie i naciśnij „Start”, aby serwo przemieściło się do określonej pozycji.
  • Ping Pong: Wprowadź dolną i górną granicę w drugiej i trzeciej kolumnie. Są to dolna i górna pozycja, pomiędzy którymi serwo będzie się cofać i cofać. W kolumnie "Ping Pong Time" możesz określić czas w milisekundach, przez który serwo będzie czekał, gdy osiągnie górną lub dolną pozycję. Naciśnij "Start", a serwo zacznie się poruszać do tyłu i do przodu, naciśnij "Stop", a serwo zatrzyma się.

Krok 5: Gdzie dzieje się magia

Na koniec chciałbym wskazać niektóre szczegóły w kodzie dla tych, którzy chcą trochę zagłębić się w komunikację szeregową między Pythonem a Arduino.

Co się dzieje w programie Pythona?

Przede wszystkim program sprawdza, co jest dołączone do portów COM w tej linii i zapisuje to na liście:

self. COMPortsList = lista(serial.tools.list_ports.comports())

Następnie przegląda listę, aż znajdzie znany układ CH340, zapisuje go, a następnie nawiązuje połączenie szeregowe po pętli for. Zauważ, że pętla for przerywa się, gdy tylko zostanie znaleziony pierwszy CH340.

for p w self. COMPortsList: if "CH340" w p[1]: # Szukam klonu Arduino self. COMPort = p[0] break else: pass self. Ser = serial. Serial(self. COMPort, 57600)

Połączenie szeregowe jest nawiązywane z portem COM z szybkością transmisji 57600.

A co robi kod Arduino? Cóż, skoro Arduino ma tylko jeden port COM, połączenie szeregowe to tylko jedna linia:

Serial.początek (57600);

Teraz do komunikacji możemy wykorzystać oba porty. W tym przypadku tylko wiadomości z Pythona do Arduino. Wiadomości są wysyłane tutaj z Pythona. Połączenie szeregowe domyślnie przesyła bajty. Jest to również najszybszy sposób przesyłania danych i, o ile wiem, wciąż dość rozpowszechniony. Tak więc int dla numeru serwa (aby Arduino wiedział, które serwo ma przesunąć) oraz pozycja w mikrosekundach są zamieniane na bajt.

Command = struct.pack('>B', self. Place) # Zmienna int "self. Place" jest zamieniana na bajt

self. Ser.write(Command) # Zapisanie bajtu w porcie szeregowym Command = int(self. ServoPos.get())//10 # Odczytywanie danych wejściowych z pola i włączanie int Command = struct.pack(' >B', Command) # Zmiana int w bajt self. Ser.write(Command) # Zapisanie bajtu na porcie szeregowym

Ponadto parsowanie danych zajmuje trochę czasu (na przykład interpretacja czterech bajtów „1”, „2”, „3” i „0” jako int 1230, a nie jako cztery różne znaki) i lepiej zrobić to nie na Arduino.

Po stronie Arduino wysyłane informacje są pobierane w następujący sposób:

if(Serial.available()>1){ // Jeśli dane szeregowe są dostępne, wprowadzana jest pętla c = Serial.read(); // Pierwszy bajt (liczba serwomechanizmu) jest zapisywany w zmiennej Micros = Serial.read(); // Pozycja serwomechanizmu jest zapisywana tutaj Micros = Micros * 10; }

Zalecana: