Example #1
0
class ArduinoBoard(object):
    """ Represents an Arduino board. """

    def __init__(self, port):
        from PyMata.pymata import PyMata
        self._port = port
        self._board = PyMata(self._port, verbose=False)

    def set_mode(self, pin, direction, mode):
        """ Sets the mode and the direction of a given pin. """
        if mode == 'analog' and direction == 'in':
            self._board.set_pin_mode(pin,
                                     self._board.INPUT,
                                     self._board.ANALOG)
        elif mode == 'analog' and direction == 'out':
            self._board.set_pin_mode(pin,
                                     self._board.OUTPUT,
                                     self._board.ANALOG)
        elif mode == 'digital' and direction == 'in':
            self._board.set_pin_mode(pin,
                                     self._board.OUTPUT,
                                     self._board.DIGITAL)
        elif mode == 'digital' and direction == 'out':
            self._board.set_pin_mode(pin,
                                     self._board.OUTPUT,
                                     self._board.DIGITAL)
        elif mode == 'pwm':
            self._board.set_pin_mode(pin,
                                     self._board.OUTPUT,
                                     self._board.PWM)

    def get_analog_inputs(self):
        """ Get the values from the pins. """
        self._board.capability_query()
        return self._board.get_analog_response_table()

    def set_digital_out_high(self, pin):
        """ Sets a given digital pin to high. """
        self._board.digital_write(pin, 1)

    def set_digital_out_low(self, pin):
        """ Sets a given digital pin to low. """
        self._board.digital_write(pin, 0)

    def get_digital_in(self, pin):
        """ Gets the value from a given digital pin. """
        self._board.digital_read(pin)

    def get_analog_in(self, pin):
        """ Gets the value from a given analog pin. """
        self._board.analog_read(pin)

    def get_firmata(self):
        """ Return the version of the Firmata firmware. """
        return self._board.get_firmata_version()

    def disconnect(self):
        """ Disconnects the board and closes the serial connection. """
        self._board.reset()
        self._board.close()
Example #2
0
class InfraredNode():
    def __init__(self):
        rospy.init_node(INFRARED_NODE, anonymous=True)
        self.board = PyMata("/dev/ttyS0", verbose=True)
        self.__infrared_pub = rospy.Publisher(INFRARED_TOPIC,
                                              Infrared,
                                              queue_size=10)

    def __signal_handler(self, sig, frame):
        if self.board is not None:
            self.board.reset()
        sys.exit(0)

    def publish_infrared(self):
        signal.signal(signal.SIGINT, self.__signal_handler)

        self.board.set_pin_mode(RIGHT_INFRARED_ANALOG_PIN, self.board.INPUT,
                                self.board.ANALOG)
        self.board.set_pin_mode(CENTER_INFRARED_ANALOG_PIN, self.board.INPUT,
                                self.board.ANALOG)
        self.board.set_pin_mode(LEFT_INFRARED_ANALOG_PIN, self.board.INPUT,
                                self.board.ANALOG)

        r = rospy.Rate(2)

        while not rospy.is_shutdown():
            right_value = self.board.analog_read(RIGHT_INFRARED_ANALOG_PIN)
            center_value = self.board.analog_read(CENTER_INFRARED_ANALOG_PIN)
            left_value = self.board.analog_read(LEFT_INFRARED_ANALOG_PIN)
            infrared = Infrared()
            infrared.right_value = right_value
            infrared.center_value = center_value
            infrared.left_value = left_value
            self.__infrared_pub.publish(infrared)
            r.sleep()
Example #3
0
class ArduinoBoard(object):
    """ Represents an Arduino board. """

    def __init__(self, port):
        self._port = port
        self._board = PyMata(self._port, verbose=False)

    def set_mode(self, pin, direction, mode):
        """ Sets the mode and the direction of a given pin. """
        if mode == 'analog' and direction == 'in':
            self._board.set_pin_mode(pin,
                                     self._board.INPUT,
                                     self._board.ANALOG)
        elif mode == 'analog' and direction == 'out':
            self._board.set_pin_mode(pin,
                                     self._board.OUTPUT,
                                     self._board.ANALOG)
        elif mode == 'digital' and direction == 'in':
            self._board.set_pin_mode(pin,
                                     self._board.OUTPUT,
                                     self._board.DIGITAL)
        elif mode == 'digital' and direction == 'out':
            self._board.set_pin_mode(pin,
                                     self._board.OUTPUT,
                                     self._board.DIGITAL)
        elif mode == 'pwm':
            self._board.set_pin_mode(pin,
                                     self._board.OUTPUT,
                                     self._board.PWM)

    def get_analog_inputs(self):
        """ Get the values from the pins. """
        self._board.capability_query()
        return self._board.get_analog_response_table()

    def set_digital_out_high(self, pin):
        """ Sets a given digital pin to high. """
        self._board.digital_write(pin, 1)

    def set_digital_out_low(self, pin):
        """ Sets a given digital pin to low. """
        self._board.digital_write(pin, 0)

    def get_digital_in(self, pin):
        """ Gets the value from a given digital pin. """
        self._board.digital_read(pin)

    def get_analog_in(self, pin):
        """ Gets the value from a given analog pin. """
        self._board.analog_read(pin)

    def get_firmata(self):
        """ Return the version of the Firmata firmware. """
        return self._board.get_firmata_version()

    def disconnect(self):
        """ Disconnects the board and closes the serial connection. """
        self._board.reset()
        self._board.close()
Example #4
0
master = Tk()
master.title("RGB LED")
master.geometry('250x200')

r = Scale(master,
          from_=255,
          to=0,
          command=(rd),
          label="Red",
          troughcolor="red")
r.pack(side=LEFT)
g = Scale(master,
          from_=255,
          to=0,
          command=(gr),
          label="Green",
          troughcolor="green")
g.pack(side=RIGHT)
b = Scale(master,
          from_=255,
          to=0,
          command=(bl),
          label="Blue",
          troughcolor="blue")
b.pack(side=RIGHT)

mainloop()

board.close()
board.reset()
Example #5
0
# create a PyMata instance
firmata = PyMata("/dev/ttyACM0")


def signal_handler(sig, frm):
    print('You pressed Ctrl+C!!!!')
    if firmata is not None:
        firmata.reset()
    sys.exit(0)


signal.signal(signal.SIGINT, signal_handler)

# send the arduino a firmata reset
firmata.reset()

# configure the stepper to use pins 9.10,11,12 and specify 512 steps per revolution
firmata.stepper_config(512, [12, 11, 10, 9])

# allow time for config to complete
time.sleep(.5)

# ask Arduino to return the stepper library version number to PyMata
firmata.stepper_request_library_version()

# allow time for command and reply to go across the serial link
time.sleep(.5)

print(("Stepper Library Version", ))
print((firmata.get_stepper_version()))
Example #6
0
    class Motors(Thread):
        MOTOR_1_PWM = 2
        MOTOR_1_A = 3
        MOTOR_1_B = 4
        MOTOR_2_PWM = 5
        MOTOR_2_A = 6
        MOTOR_2_B = 7
        MOTOR_3_PWM = 8
        MOTOR_3_A = 9
        MOTOR_3_B = 10

        def __init__(self):
            Thread.__init__(self)
            self.daemon = True
            self.board = PyMata()

            def signal_handler(sig, frame):
                self.stop_motors()
                self.board.reset()
                sys.exit(0)

            signal.signal(signal.SIGINT, signal_handler)
            self.board.set_pin_mode(self.MOTOR_1_PWM, self.board.PWM,
                                    self.board.DIGITAL)
            self.board.set_pin_mode(self.MOTOR_1_A, self.board.OUTPUT,
                                    self.board.DIGITAL)
            self.board.set_pin_mode(self.MOTOR_1_B, self.board.OUTPUT,
                                    self.board.DIGITAL)
            self.board.set_pin_mode(self.MOTOR_2_PWM, self.board.PWM,
                                    self.board.DIGITAL)
            self.board.set_pin_mode(self.MOTOR_2_A, self.board.OUTPUT,
                                    self.board.DIGITAL)
            self.board.set_pin_mode(self.MOTOR_2_B, self.board.OUTPUT,
                                    self.board.DIGITAL)
            self.board.set_pin_mode(self.MOTOR_3_PWM, self.board.PWM,
                                    self.board.DIGITAL)
            self.board.set_pin_mode(self.MOTOR_3_A, self.board.OUTPUT,
                                    self.board.DIGITAL)
            self.board.set_pin_mode(self.MOTOR_3_B, self.board.OUTPUT,
                                    self.board.DIGITAL)
            self.dx, self.dy = 0, 0

        def stop_motors(self):
            self.board.digital_write(self.MOTOR_1_B, 0)
            self.board.digital_write(self.MOTOR_1_A, 0)
            self.board.digital_write(self.MOTOR_2_B, 0)
            self.board.digital_write(self.MOTOR_2_A, 0)
            self.board.digital_write(self.MOTOR_3_B, 0)
            self.board.digital_write(self.MOTOR_3_A, 0)

        def run(self):
            while True:
                # Reset all direction pins to avoid damaging H-bridges
                # TODO: USE dx,dy now in (-1,1)+(None,None) range
                self.stop_motors()

                dist = abs(self.dx)
                if dist > 0.2:  #was 2
                    if self.dx > 0:
                        print("Turning left")
                        self.board.digital_write(self.MOTOR_1_B, 1)
                        self.board.digital_write(self.MOTOR_2_B, 1)
                        self.board.digital_write(self.MOTOR_3_B, 1)
                    else:
                        print("Turning right")
                        self.board.digital_write(self.MOTOR_1_A, 1)
                        self.board.digital_write(self.MOTOR_2_A, 1)
                        self.board.digital_write(self.MOTOR_3_A, 1)
                    self.board.analog_write(self.MOTOR_1_PWM,
                                            int(dist**0.7 + 25))
                    self.board.analog_write(self.MOTOR_2_PWM,
                                            int(dist**0.7 + 25))
                    self.board.analog_write(self.MOTOR_3_PWM,
                                            int(dist**0.7 + 25))
                # elif self.dy > 30:
                else:
                    print("Going forward")
                    self.board.digital_write(self.MOTOR_1_B, 1)
                    self.board.digital_write(self.MOTOR_3_A, 1)
                    self.board.analog_write(self.MOTOR_1_PWM,
                                            int(self.dy**0.5) + 30)
                    self.board.analog_write(self.MOTOR_2_PWM, 0)
                    self.board.analog_write(self.MOTOR_3_PWM,
                                            int(self.dy**0.5) + 30)
                sleep(0.03)
Example #7
0
# create a PyMata instance
firmata = PyMata("/dev/ttyACM0")


def signal_handler(sig, frm):
    print('You pressed Ctrl+C!!!!')
    if firmata is not None:
        firmata.reset()
    sys.exit(0)


signal.signal(signal.SIGINT, signal_handler)

# send the arduino a firmata reset
firmata.reset()

# configure the stepper to use pins 9.10,11,12 and specify 512 steps per revolution
firmata.stepper_config(512, [12, 11, 10, 9])

# allow time for config to complete
time.sleep(.5)

# ask Arduino to return the stepper library version number to PyMata
firmata.stepper_request_library_version()

# allow time for command and reply to go across the serial link
time.sleep(.5)

print("Stepper Library Version",)
print(firmata.get_stepper_version())
 class Motors(Thread):
     MOTOR_1_PWM = 2
     MOTOR_1_A   = 3
     MOTOR_1_B   = 4
     MOTOR_2_PWM = 5
     MOTOR_2_A   = 6
     MOTOR_2_B   = 7
     MOTOR_3_PWM = 8
     MOTOR_3_A   = 9
     MOTOR_3_B   = 10
  
     def __init__(self):
         Thread.__init__(self)
         self.daemon = True
         self.board = PyMata()
         def signal_handler(sig, frame):
             self.stop_motors()
             self.board.reset()
             sys.exit(0)
         signal.signal(signal.SIGINT, signal_handler)
         self.board.set_pin_mode(self.MOTOR_1_PWM, self.board.PWM,    self.board.DIGITAL)
         self.board.set_pin_mode(self.MOTOR_1_A,   self.board.OUTPUT, self.board.DIGITAL)
         self.board.set_pin_mode(self.MOTOR_1_B,   self.board.OUTPUT, self.board.DIGITAL)
         self.board.set_pin_mode(self.MOTOR_2_PWM, self.board.PWM,    self.board.DIGITAL)
         self.board.set_pin_mode(self.MOTOR_2_A,   self.board.OUTPUT, self.board.DIGITAL)
         self.board.set_pin_mode(self.MOTOR_2_B,   self.board.OUTPUT, self.board.DIGITAL)
         self.board.set_pin_mode(self.MOTOR_3_PWM, self.board.PWM,    self.board.DIGITAL)
         self.board.set_pin_mode(self.MOTOR_3_A,   self.board.OUTPUT, self.board.DIGITAL)
         self.board.set_pin_mode(self.MOTOR_3_B,   self.board.OUTPUT, self.board.DIGITAL)
         self.dx, self.dy = 0, 0
  
     def stop_motors(self):
         self.board.digital_write(self.MOTOR_1_B, 0)
         self.board.digital_write(self.MOTOR_1_A, 0)
         self.board.digital_write(self.MOTOR_2_B, 0)
         self.board.digital_write(self.MOTOR_2_A, 0)
         self.board.digital_write(self.MOTOR_3_B, 0)
         self.board.digital_write(self.MOTOR_3_A, 0)
  
     def run(self):
         while True:
             # Reset all direction pins to avoid damaging H-bridges  
             # TODO: USE dx,dy now in (-1,1)+(None,None) range
             self.stop_motors()
  
             dist = abs(self.dx)
             if dist > 0.2: #was 2
                 if self.dx > 0:
                     print("Turning left")
                     self.board.digital_write(self.MOTOR_1_B, 1)
                     self.board.digital_write(self.MOTOR_2_B, 1)
                     self.board.digital_write(self.MOTOR_3_B, 1)
                 else:
                     print("Turning right")
                     self.board.digital_write(self.MOTOR_1_A, 1)
                     self.board.digital_write(self.MOTOR_2_A, 1)
                     self.board.digital_write(self.MOTOR_3_A, 1)
                 self.board.analog_write(self.MOTOR_1_PWM, int(dist ** 0.7 + 25))
                 self.board.analog_write(self.MOTOR_2_PWM, int(dist ** 0.7 + 25))
                 self.board.analog_write(self.MOTOR_3_PWM, int(dist ** 0.7 + 25))
             # elif self.dy > 30:
             else:
                 print("Going forward")
                 self.board.digital_write(self.MOTOR_1_B, 1)
                 self.board.digital_write(self.MOTOR_3_A, 1)
                 self.board.analog_write(self.MOTOR_1_PWM, int(self.dy ** 0.5 )+30)
                 self.board.analog_write(self.MOTOR_2_PWM, 0)
                 self.board.analog_write(self.MOTOR_3_PWM, int(self.dy ** 0.5 )+30)
             sleep(0.03)
Example #9
0
class Firmata(Adaptor):

    def __init__(self, options):
        super(Firmata, self).__init__(options)

        if 'port' not in options:
            raise self.ParameterRequired(
                'A port must be specified for Firmata connection.'
            )

        self.port = options.get('port')
        self.board = PyMata('/dev/ttyACM0', verbose=True)

        signal.signal(signal.SIGINT, self.signal_handler)

        self.pins = {
            'digital': [],
            'analog': [],
            'pwm': [],
            'servo': [],
            'i2c': [],
        }

    def analog_write(self, pin_number, value):
        if pin_number not in self.pins['analog']:
            self.pins['analog'].append(pin_number)
            self.board.set_pin_mode(
                pin_number,
                self.board.OUTPUT,
                self.board.ANALOG
            )

        self.board.analog_write(pin_number, value)

    def analog_read(self, pin_number):
        if pin_number not in self.pins['analog']:
            self.pins['analog'].append(pin_number)
            self.board.set_pin_mode(
                pin_number,
                self.board.INPUT,
                self.board.ANALOG
            )

        return self.board.analog_read(pin_number)

    def digital_write(self, pin_number, value):
        if pin_number not in self.pins['digital']:
            self.pins['digital'].append(pin_number)
            self.board.set_pin_mode(
                pin_number,
                self.board.OUTPUT,
                self.board.DIGITAL
            )

        self.board.digital_write(pin_number, value)

    def digital_read(self, pin_number):
        if pin_number not in self.pins['digital']:
            self.pins['digital'].append(pin_number)
            self.board.set_pin_mode(
                pin_number,
                self.board.INPUT,
                self.board.DIGITAL
            )

        return self.board.analog_write(pin_number)

    def pwm_write(self, pin_number, value):
        if pin_number not in self.pins['pwm']:
            self.pins['pwm'].append(pin_number)
            self.board.set_pin_mode(
                pin_number,
                self.board.PWM,
                self.board.DIGITAL
            )

        return self.board.analog_write(pin_number, value)

    def pwm_read(self, pin_number):
        if pin_number not in self.pins['pwm']:
            self.pins['pwm'].append(pin_number)
            self.board.set_pin_mode(
                pin_number,
                self.board.PWM,
                self.board.DIGITAL
            )

        return self.board.analog_read(pin_number)

    def servo_write(self, pin_number, value):
        if pin_number not in self.pins['servo']:
            self.pins['servo'].append(pin_number)
            self.board.servo_config(pin_number)

        self.board.analog_write(pin_number, value)

    def disconnect(self):
        # Close the firmata interface down cleanly
        self.board.close()

    def signal_handler(self, sig, frame):
        print('Ctrl+C pressed')
        if self.board is not None:
            self.board.reset()
        sys.exit(0)

    class ParameterRequired(Exception):
        def __init__(self, message='A required parameter was not provided.'):
            super(Firmata.ParameterRequired, self).__init__(message)

        def __str__(self):
            return self.message