NXTMMX with ev3dev python
 NXT and EV3   Started by voraze   2020-04-02 15:45:21 -04:00   Comments: 2    Viewed: 244

  1. voraze
    voraze Member
    #!/usr/bin/env python3
     
    import evdev
    import ev3dev.auto as ev3
    import threading
    import os

    #Sets the font for the display
    os.system('setfont Lat15-TerminusBold14')

    ## Some helpers ##
    def scale(val, src, dst):
        """
        Scale the given value from the scale of src to the scale of dst.
     
        val: float or int
        src: tuple
        dst: tuple
     
        example: print(scale(99, (0.0, 99.0), (-1.0, +1.0)))
        """
        return (float(val - src[0]) / (src[1] - src[0])) * (dst[1] - dst[0]) + dst[0]
     
    def scale_stick(value):
        return scale(value,(0,255),(-100,100))
     
    def clamp(value, floor=-100, ceil=100):
        """
        Clamp the value within the floor and ceiling values.
        """
        return max(min(value, ceil), floor)
     
    ## Initializing ##
    print("Finding PS4 controller...")
    devices = [evdev.InputDevice(fn) for fn in evdev.list_devices()]
    ps4dev = devices[0].fn
     
    gamepad = evdev.InputDevice(ps4dev)
     
    # Initialize globals
    speed = 0
    turn = 0
    rise = 0
    stretch = 0
    running = True
     
    # Within this thread all the motor magic happens
    class MotorThread(threading.Thread):
        def __init__(self):
            # Add more sensors and motors here if you need them
            self.left_motor = ev3.LargeMotor(ev3.OUTPUT_B)
            self.right_motor = ev3.LargeMotor(ev3.OUTPUT_C)
            self.lift_motor = ev3.LargeMotor(ev3.OUTPUT_A)
            self.reach_motor = ev3.MediumMotor(ev3.OUTPUT_D)
            self.claw_motor = mmx.MediumMotor(in1:i2c3:M1)
            threading.Thread.__init__(self)
     
        def run(self):
            print("Engine running!")
            # Change this function to suit your robot. 
            # The code below is for driving a simple tank.
            while running:
                right_dc = clamp(-speed-turn)
                left_dc = clamp(-speed+turn)
                up_dc = clamp(rise)
                forward_dc = clamp(stretch)
                self.right_motor.run_direct(duty_cycle_sp=right_dc)
                self.left_motor.run_direct(duty_cycle_sp=left_dc)
                self.lift_motor.run_direct(duty_cycle_sp=up_dc)
                self.reach_motor.run_direct(duty_cycle_sp=forward_dc)
     
            self.motor.stop()
     
    # Multithreading magics
    motor_thread = MotorThread()
    motor_thread.setDaemon(True)
    motor_thread.start()
     
     
    for event in gamepad.read_loop():   #this loops infinitely
        if event.type == 3:             #One of the sticks is moved
            # Add if clauses here to catch more values for your robot.
            if event.code == 4:         #Y axis on right stick
                speed = scale_stick(event.value)
            if event.code == 3:         #X axis on right stick
                turn = scale_stick(event.value)
            if event.code == 1:         #Y axis on left stick
                rise = -scale_stick(event.value)
            if event.code == 0:         #X axis on left stick
                stretch = -scale_stick(event.value)

        if event.type == 1 and event.code == 306 and event.value == 1:
            claw_motor.setSpeed(1, 100) #1 for motor 1, 0 for motor speed
        
        if event.type == 1 and event.code == 307 and event.value == 1:
            print("X button is pressed. Stopping.")
            running = False
            break
    voraze, 2020-04-03 17:34:45 -04:00
  2. voraze
    voraze Member
    I am trying to get a medium motor to run from the NXTMMX connected to port 1.  The ev3 sees ports in1:i2c3:M1 & in1:i2c3:M2 with tacho motors on each.  How to I initialize the motors; self.claw_motor = mmx.MediumMotor(in1:i2c3:M1)

    voraze, 2020-04-03 17:37:28 -04:00
  3. (You must log in or sign up to post here)

Log in | Sign up
Tems & Conditions!
Help!