Inhoudsopgave:

Servodriver-board met Python-GUI en Arduino: 5 stappen
Servodriver-board met Python-GUI en Arduino: 5 stappen

Video: Servodriver-board met Python-GUI en Arduino: 5 stappen

Video: Servodriver-board met Python-GUI en Arduino: 5 stappen
Video: Control Arduino with Python using Firmata / PyFirmata 2024, November
Anonim
Servodriver-bord met Python-GUI en Arduino
Servodriver-bord met Python-GUI en Arduino

Bij het maken van prototyping of het bouwen van modelvliegtuigen kom je vaak het probleem tegen, dat je servobewegingen moet controleren of servo's in de middenpositie moet zetten.

Als je niet je hele RC-systeem wilt opbouwen of testen, hoe ver je de servo kunt duwen of waar de middenpositie is, dan is dit board iets voor jou! Hiermee kunt u de servo naar bepaalde posities verplaatsen of heen en weer reizen.

Het werkt verrassend goed, zelfs met 6 servo's die in de lus van de ene naar de andere positie racen.

Het is ook een leuk project om te leren over communicatie tussen Python-GUI en Arduino met behulp van serieel.

Stap 1: Wat u nodig heeft…

Voor dit project heb je het volgende nodig:

Hardware

  • Arduino nano met kabel. Ik heb een kloon gebruikt, en de Python-code verwacht eigenlijk een CH340-chip van een kloon
  • Een prototypebord. 7x5cm is genoeg
  • Enkele headers en pinnen van 2,54 mm
  • 1-6 servo's
  • Voeding voor de servo's (ik gebruikte een batterypack met 4 batterijen)

Software

  • Python 3:
  • Een USB-stuurprogramma voor de CH340-chips: Google maar eens voor drivers voor CH340-stuurprogramma's
  • Arduino IDE:

Stap 2: Het bord solderen

Het bord solderen
Het bord solderen

Het solderen is eigenlijk rechttoe rechtaan volgens Fritzing op de foto. Zorg er wel voor dat u de servo's eenvoudig kunt aansluiten op de 3-pins-rijen.

  • De 3-pin-rijen zijn bevestigd aan digitale pin 3, 5, 6, 9, 10 en 11 van de Arduino nano.
  • De rode draad zit vast aan de 5V-pin van de Arduino
  • De zwarte draad is verbonden met de GND-pin van de Arduino
  • Het paar pinnen onder de 3-pins rijen zijn bedoeld om een typische RC-ontvangervoeding aan te sluiten, je kunt connectoren toevoegen zoals je wilt, zoals schroefklemmen, XT-connectoren, JST of … of …

Persoonlijk hou ik van rijen vrouwelijke headers om de Arduino in te plaatsen, maar dat is aan jou.

Houd er rekening mee dat de kortgesloten vrouwelijke headers een jumper zijn, waarmee u de servo kunt voeden met behulp van de 5V-bron van de Arduino voor testdoeleinden. Als je het te veel belast, zal de Arduino resetten en het juiste tempo verliezen. Ze MOETEN worden verwijderd voordat u een andere voeding aansluit.

Stap 3: De Arduino instellen

Installeer de Arduino IDE en flash de Arduino nano met de bijgevoegde schets.

Stap 4: Python instellen

Python instellen
Python instellen

Installeer Python 3 na het downloaden. Zorg ervoor dat u de optie aanvinkt om een "PATH"-variabele aan te maken.

U moet nog twee pakketten installeren met pip. Druk daarvoor op de "Windows"-toets, typ "cmd" en druk op "enter". Typ de volgende opdrachten in de opdrachtprompt:

  • pip serieel installeren
  • piip installeer pyserial
  • pip installeer tkinter

Zoals je kunt zien, heb ik de modules zowel serieel als pyseriaal nodig, wat waarschijnlijk niet de meest efficiënte is, omdat pyserial serieel zou moeten vervangen. Toch werkt het en begin ik het net te leren;).

Open het Python-script in de IDE en voer het uit, of voer het rechtstreeks vanaf de terminal uit.

In het vervolgkeuzemenu kunt u kiezen tussen twee modi, "Go Straight" en "Ping Pong":

  • Ga rechtdoor: Voer een servopositie in microseconden in de eerste kolom in en druk op "Start" om de servo naar de opgegeven positie te laten bewegen.
  • Ping Pong: Vul in de tweede en derde kolom een ondergrens en een bovengrens in. Dat zijn de onderste en bovenste positie, waartussen de servo heen en weer zal gaan. In de kolom "Ping Pong Time" kunt u een tijd in milliseconden specificeren, dat de servo zal wachten wanneer deze de bovenste of de onderste positie heeft bereikt. Druk op "Start" en de servo begint heen en weer te bewegen, druk op "Stop" en de servo stopt.

Stap 5: Waar de magie gebeurt

Last but not least wil ik wijzen op enkele details in de code voor degenen die een beetje seriële communicatie tussen Python en Arduino willen krijgen.

Wat gebeurt er nu in het Python-programma?

Allereerst controleert het programma wat er aan de COM-poorten in deze regel is gekoppeld en slaat het op in een lijst:

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

Vervolgens doorloopt het de lijst totdat het een beruchte CH340-chip vindt, het opslaat en vervolgens een seriële verbinding tot stand brengt na de for-loop. Merk op dat de for-lus breekt zodra de eerste CH340 wordt gevonden.

for p in self. COMPortsList: if "CH340" in p[1]: # Op zoek naar een Arduino Clone self. COMPort = p[0] break else: pass self. Ser = serial. Serial(self. COMPort, 57600)

De seriële verbinding wordt tot stand gebracht met de COM-poort met een baudrate van 57600.

En wat doet de Arduino-code? Welnu, aangezien de Arduino maar één COM-poort heeft, is de seriële verbinding slechts één lijn:

Serieel.begin(57600);

Nu kunnen we beide poorten gebruiken om te communiceren. In dit geval alleen berichten van de Python naar de Arduino. De berichten worden hier vanuit Python verzonden. De seriële verbinding verzendt standaard bytes. Dat is ook de snelste manier om data te versturen en voor zover ik weet ook nog vrij wijdverbreid. Dus de ints voor het nummer van de servo (zodat de Arduino weet welke servo hij moet verplaatsen) en de positie in microseconden worden omgezet in een byte.

Command = struct.pack('>B', self. Place) # De int-variabele "self. Place" wordt omgezet in een byte

self. Ser.write(Command) # De byte op de seriële poort schrijven Command = int(self. ServoPos.get())//10 # De invoer uit het veld lezen en int Command = struct.pack(' >B', Command) # De int omzetten in een byte self. Ser.write(Command) # De byte op de seriële poort schrijven

Ook kost het ontleden van gegevens tijd (bijvoorbeeld het interpreteren van vier bytes "1", "2", "3" en "0" als de int 1230, niet als vier verschillende tekens) en het is beter om dat niet op de Arduino te doen.

Aan de Arduino-kant wordt de verzonden informatie als volgt opgehaald:

if(Serial.available()>1){ // Als seriële gegevens beschikbaar zijn, wordt de lus ingevoerd c = Serial.read(); // De eerste byte (aantal servo) wordt opgeslagen in een variabele Micros = Serial.read(); // De positie van de servo wordt hier opgeslagen Micros = Micros * 10; }

Aanbevolen: