mirror of
				https://github.com/KevinMidboe/python-gpiozero.git
				synced 2025-10-29 17:50:37 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			96 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from RPi import GPIO
 | |
| from time import sleep
 | |
| 
 | |
| from .devices import GPIODeviceError, GPIODevice, GPIOThread
 | |
| 
 | |
| 
 | |
| class OutputDeviceError(GPIODeviceError):
 | |
|     pass
 | |
| 
 | |
| 
 | |
| class OutputDevice(GPIODevice):
 | |
|     def __init__(self, pin=None):
 | |
|         super(OutputDevice, self).__init__(pin)
 | |
|         GPIO.setup(pin, GPIO.OUT)
 | |
| 
 | |
|     def on(self):
 | |
|         GPIO.output(self.pin, True)
 | |
| 
 | |
|     def off(self):
 | |
|         GPIO.output(self.pin, False)
 | |
| 
 | |
| 
 | |
| class LED(OutputDevice):
 | |
|     def __init__(self, pin=None):
 | |
|         super(LED, self).__init__(pin)
 | |
|         self._blink_thread = None
 | |
| 
 | |
|     def blink(self, on_time=1, off_time=1):
 | |
|         self._stop_blink()
 | |
|         self._blink_thread = GPIOThread(
 | |
|             target=self._blink_led, args=(on_time, off_time)
 | |
|         )
 | |
|         self._blink_thread.start()
 | |
| 
 | |
|     def _stop_blink(self):
 | |
|         if self._blink_thread:
 | |
|             self._blink_thread.stop()
 | |
|             self._blink_thread = None
 | |
| 
 | |
|     def _blink_led(self, on_time, off_time):
 | |
|         while True:
 | |
|             super(LED, self).on()
 | |
|             if self._blink_thread.stopping.wait(on_time):
 | |
|                 break
 | |
|             super(LED, self).off()
 | |
|             if self._blink_thread.stopping.wait(off_time):
 | |
|                 break
 | |
| 
 | |
|     def on(self):
 | |
|         self._stop_blink()
 | |
|         super(LED, self).on()
 | |
| 
 | |
|     def off(self):
 | |
|         self._stop_blink()
 | |
|         super(LED, self).off()
 | |
| 
 | |
| 
 | |
| class Buzzer(OutputDevice):
 | |
|     pass
 | |
| 
 | |
| 
 | |
| class Motor(OutputDevice):
 | |
|     pass
 | |
| 
 | |
| 
 | |
| class Robot(object):
 | |
|     def __init__(self, left=None, right=None):
 | |
|         if not all([left, right]):
 | |
|             raise GPIODeviceError('left and right pins must be provided')
 | |
| 
 | |
|         self._left = Motor(left)
 | |
|         self._right = Motor(right)
 | |
| 
 | |
|     def left(self, seconds=None):
 | |
|         self._left.on()
 | |
|         if seconds is not None:
 | |
|             sleep(seconds)
 | |
|             self._left.off()
 | |
| 
 | |
|     def right(self, seconds=None):
 | |
|         self._right.on()
 | |
|         if seconds is not None:
 | |
|             sleep(seconds)
 | |
|             self._right.off()
 | |
| 
 | |
|     def forwards(self, seconds=None):
 | |
|         self.left()
 | |
|         self.right()
 | |
|         if seconds is not None:
 | |
|             sleep(seconds)
 | |
|             self.stop()
 | |
| 
 | |
|     def stop(self):
 | |
|         self._left.off()
 | |
|         self._right.off()
 |