I’ve been playing with my RPi fairly frequently as of late. I ordered some tactile switches, motors, and motor controllers from AdaFruit and since they came in I’ve been learning to control motor speed, direction, and LED brightness using soft-PWM.

I quickly learned that I would want a class to wrap up all the GPIO sets/gets. I’ve been writing a package in Python which I’m calling RPiComponents containing the basic interfaces necessary for controlling the GPIO pins in an object-oriented fashion. I’ll be posting it to GitHub as soon as I finish the documentation for it. As a preview though, you can currently do things like:

	import RPiComponents as parts
	red_led_pin = 21  # using the BCM pin numbering
	initial_brightness = 0  # initially off
	red_led = parts.LED.FadableLED(red_led_pin, initial_brightness)
	red_led.set_brightness(50)  # set the brightness to 50%
	red_led.set_brightness(100) # '   '   '          '  100%
	red_led.off()

	motor_enable_pin = 21
	motor_fwd_pin = 20
	motor_rev_pin = 16


	motor = parts.L293DMotor.VariableSpeedL293DMotor(motor_enable_pin, motor_fwd_pin, motor_rev_pin)
	motor.enable()  # sets the motor controller enable bit to HIGH
	motor.set_speed(50)  # sets the motor speed to 50% of it's max

	motor.fwd()

	motor.stop()

	motor.rev(90)  # starts the motor in reverse at 90% of the max speed

	motor.disable() # all speed and direction setting are kept but the motor will stop

	
	def some_callback(some_arg0):
		print "Called some_callback with argument %s" % (some_arg0)

			
	switch_pin_number = 6

	switch = parts.Switch.SwitchWithThreadedCallback(switch_pin_number, callback=some_callback, callback_args=[1,2,3])
	
	switch.start()

	#  calling switch.start() starts a monitor thread that waits for a rising or falling edge
	#  due to the switch changing state, it will then fire off callback with the arguments given
	#  or if callback_args is None, it will simply call the callback

	switch.stop()

	#  switch.stop() properly terminates the monitor thread

	parts.finalize()  # clean up after ourselves and reset the GPIO pins for some other use

There’s also a few super simple abstractions like BasicToggleOutput with methods high() and low() in a module called BasicLogic. I hope to add some more neat functionality later on as well. I’ll post again when the source is on GitHub and attach a few examples for starters!

Thanks for reading!!