EEZY Bot ARM – Aansturing via Raspberry Pi & USB Joystick
Bouwpakket project
EEZY Bot ARM
De aansturing van deze robot arm wordt voornamelijk gedaan met een Arduino, in het voorbeeld bijgeleverd op thingiverse is hij voorgeprogrammeerd om een balletje op een glijbaantje te zetten, eenmaal de bal onderaan, wordt het procres herhaald, maar wat is nu leuker om een robot arm aan te sturen met een USB joystick?, dat kan met behulp van een Raspberry Pi.
Wat heb je nodig?
– EEZY bot ARM
– Raspberry Pi 2 of 3
– Breadboard 830 gaats
– 40 Pin T-adapter + 40-pins bandkabel
– Micro USB interface module
– Set jumpwires
– USB Joystick
– Raspbian
– Python pygame module (voorgeinstalleerd op Raspbian)
– Python pigpio module
Voorbereiding breadboard
De servo’s kunnen eenvoudig worden aangesloten op de RPi GPIO pins doormiddel van terminals op een breadboard, het is verstandig om de servo’s met een aparte voeding te voeden, de GPIO pinnen van de Raspberry Pi kunnen het vermogen niet goed aan!, dit is het overzicht:
Op deze manier kan je eenvoudig de EEZY bot ARM aansluiten:
Zoals je ziet gebruiken we GPIO 4, 17, 22 en 27 om de 4 servo’s aan te sturen.
Om de servo’s aan te sturen met een joystick gebruiken we de PyGame module in Python, daarmee kan je elke AS uitlezen en zo een specifieke servo aansturen, om de servo’s met PWM aan te sturen gebruiken we de PIGPIO module, dit omdat we de servo’s hardwarematig aansturen!
Ps. Let er wel op dat de AS configuratie in python per joystick verschilt, dit moet men zelf uitzoeken!
De code is als volgt (commentaar regels zijn toegevoegd in de code):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
#!/usr/bin/env python # EERST LADEN: # sudo crontab -e # @reboot sudo pigpiodsudo # @reboot sudo python /home/pi/robotarm.py import pygame # Importeer PyGame bibliotheek. import time # Importeer de time biblotheek voor tijdfuncties. import sys import pigpio # Initialiseer de Joystick(s). pygame.init() pygame.joystick.init() # Kijk of er een joystick of controller aangesloten is. if pygame.joystick.get_count() == 0: # Er is geen joystick of controller gevonden. print "Er is geen joystick gevonden!" exit() # GPIO pinnen configureren. SERVO_ROTATIE_PIN = 4 SERVO_GRIJPER_PIN = 17 SERVO_VOORACHTER_PIN = 27 SERVO_HOOGLAAG_PIN = 22 # SERVO SG92R settings servopwm_graden_0 = 2450 # Hoger geeft stotter in de servo. servopwm_graden_180 = 500 # Lager geeft stotter in de servo. # SERVO SG90 settings # servopwm_graden_0 = 2400 # Hoger geeft stotter in de servo. # servopwm_graden_180 = 600 # Lager geeft stotter in de servo. # SERVO MG995 settings #servopwm_graden_0 = 1950 # Hoger geeft stotter in de servo. #servopwm_graden_180 = 1000 # Lager geeft stotter in de servo. # Opie: Limiteer SERVO PWM waarden: servopwm_rotatie_graden_0 = 1800 # Naar links, hoger = meer servopwm_rotatie_graden_180 = 1150 # Naar rechts, lager = meer servopwm_grijper_graden_0 = 2450 servopwm_grijper_graden_180 = 500 servopwm_voorachter_graden_0 = 2350 # Naar voren, hoger = verder servopwm_voorachter_graden_180 = 1200 # Naar achteren, lager = verder servopwm_hooglaag_graden_0 = 1900 servopwm_hooglaag_graden_180 = 1200 joystick = pygame.joystick.Joystick(0) joystick.init() pi = pigpio.pi() # Connect to pigpiod daemon pi.set_mode(SERVO_ROTATIE_PIN, pigpio.OUTPUT) # Zet de GPIO pin als uitgang. pi.set_mode(SERVO_GRIJPER_PIN, pigpio.OUTPUT) # Zet de GPIO pin als uitgang. pi.set_mode(SERVO_VOORACHTER_PIN, pigpio.OUTPUT) # Zet de GPIO pin als uitgang. pi.set_mode(SERVO_HOOGLAAG_PIN, pigpio.OUTPUT) # Zet de GPIO pin als uitgang. # Informatie over de Joystick of controller print "Joysticks gevonden:", pygame.joystick.get_count(), "(", joystick.get_name(), ")" print "Specs: assen:", joystick.get_numaxes(), ", knoppen:", joystick.get_numbuttons() print "Druk op de knoppen of draai aan de assen!, druk op CTRL+C om het script te eindigen." # Haal het aantal knoppen en assen op. knoppen = joystick.get_numbuttons() assen = joystick.get_numaxes() # Een MAP functie om eenvoudig verhoudingen tussen getallen te creeren. def arduino_map(x, in_min, in_max, out_min, out_max): return (x - in_min) * (out_max - out_min) // (in_max - in_min) + out_min knop_ingedrukt = 0 # Zet assen die statisch zijn (bijvoorbeeld met een wieltje) in de juiste stand. as_hooglaag = joystick.get_axis(3) as_hooglaag_waarde = arduino_map(as_hooglaag, -1, 1, servopwm_hooglaag_graden_0, servopwm_hooglaag_graden_180) pi.set_servo_pulsewidth(SERVO_HOOGLAAG_PIN, as_hooglaag_waarde) try: # Oneindige loop, druk op CTRL+C om het script te eindigen. while True: # Interrupt trigger voor PyGame. for event in pygame.event.get(): # Er wordt een knop ingedrukt. if event.type == pygame.JOYBUTTONDOWN: # Loop alle beschikbare knoppen langs. for i in range(knoppen): # Haal de waarde van de knop op. knop = joystick.get_button(i) # Kijk of deze knop is ingedrukt. if knop == 1: # Deze knop is ingedrukt. knop_ingedrukt = 1 as_grijper = 0.9 # Waarde voor grijper dicht as_grijper_waarde = arduino_map(as_grijper, -1, 1, servopwm_grijper_graden_0, servopwm_grijper_graden_180) pi.set_servo_pulsewidth(SERVO_GRIJPER_PIN, as_grijper_waarde) # Er wordt een knop losgelaten. elif event.type == pygame.JOYBUTTONUP: knop_ingedrukt = 0 as_grijper = -0.1 # Waarde voor grijper open as_grijper_waarde = arduino_map(as_grijper, -1, 1, servopwm_grijper_graden_0, servopwm_grijper_graden_180) pi.set_servo_pulsewidth(SERVO_GRIJPER_PIN, as_grijper_waarde) # Een as wordt bewogen. elif event.type == pygame.JOYAXISMOTION: # Haal de waarde van de assen op. as_rotatie = joystick.get_axis(2) # Jerk-as as_voorachter = joystick.get_axis(1) # Voorachter-as as_hooglaag = joystick.get_axis(3) # Hooglaag-as # Gebruik de MAP functie om eenvoudig verhoudingen tussen getallen te creeren. # 2.5 = 0 graden CCW / 11.5 = 180 graden CW # De waarden met 10 vermenigvuldigen voor betere precisie. as_rotatie_waarde = arduino_map(as_rotatie, -1, 1, servopwm_rotatie_graden_0, servopwm_rotatie_graden_180) as_voorachter_waarde = arduino_map(as_voorachter, -1, 1, servopwm_voorachter_graden_0, servopwm_voorachter_graden_180) as_hooglaag_waarde = arduino_map(as_hooglaag, -1, 1, servopwm_hooglaag_graden_0, servopwm_hooglaag_graden_180) # Print de gegevens naar de console. #print "X-Waarde:", as_voorachter, "| PWM DC waarde:", as_voorachter_waarde sys.stdout.write("Rotatie: %d, Voorachter: %d Hooglaag: %d Knop: %d \r" % (as_rotatie_waarde, as_voorachter_waarde, as_hooglaag_waarde, knop_ingedrukt)) sys.stdout.flush() # Pas de PWM op de GPIO aan. pi.set_servo_pulsewidth(SERVO_ROTATIE_PIN, as_rotatie_waarde) pi.set_servo_pulsewidth(SERVO_VOORACHTER_PIN, as_voorachter_waarde) pi.set_servo_pulsewidth(SERVO_HOOGLAAG_PIN, as_hooglaag_waarde) except KeyboardInterrupt: pygame.quit() |
Het resultaat: