# LM: Touch-sensor keyer V2 - References # https://learn.adafruit.com/processing-on-the-raspberry-pi-and-pitft/hardware-io # http://raspi.tv/2014/rpi-gpio-update-and-detecting-both-rising-and-falling-edges import os # to adjust this script's priority import sys # for command-line parameters and exit from time import sleep # for Morse timing import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) RIGHT = 23 # right touch sensor --> (Connector pin 16) LEFT = 24 # left touch sensor <-- (Connector pin 18) KEY = 25 # key down (output) (Connector pin 22) # inter-character and inter-word spaces are user timed timeConstant = .85 # empirically determined - adjust as indicated speed = 10. # can be revalued from sys.argv (words per minute) dotTime = .085 # recomputed in init() dashTime = .255 # ditto paddleOnRight = False # True during press to right paddleOnLeft = False # True during press to left # GPIO pin roles GPIO.setup(RIGHT, GPIO.IN, pull_up_down = GPIO.PUD_DOWN) GPIO.setup(LEFT, GPIO.IN, pull_up_down = GPIO.PUD_DOWN) GPIO.setup(KEY, GPIO.OUT) # Interrupt handlers def dotEvent(channel): global paddleOnRight global paddleOnLeft if GPIO.input(RIGHT): # Rising edge (start dots) paddleOnRight = True paddleOnLeft = False # Disallow both paddles at the same time else: # Falling edge (stop dots) paddleOnRight = False def dashEvent(channel): global paddleOnRight global paddleOnLeft if GPIO.input(LEFT): # Rising edge (start dashes) paddleOnLeft = True paddleOnRight = False # Disallow both paddles at the same time else: # Falling edge (stop dashes) paddleOnLeft = False # Associate handlers to pins GPIO.add_event_detect(RIGHT, GPIO.BOTH, callback=dotEvent) GPIO.add_event_detect(LEFT, GPIO.BOTH, callback=dashEvent) # Nuts and bolts def init(): # Initialize times, etc. global dotTime global dashTime dotTime = timeConstant / speed dashTime = dotTime + dotTime + dotTime GPIO.output(KEY, GPIO.LOW) # Key up def makeDot(): dot() while paddleOnRight: dot() def makeDash(): dash() while paddleOnLeft: dash() def dot(): # Generate one dot + dot-length space GPIO.output(KEY, GPIO.HIGH) sleep(dotTime) GPIO.output(KEY, GPIO.LOW) sleep(dotTime) def dash(): # Generate one dash + dot-length space GPIO.output(KEY, GPIO.HIGH) sleep(dashTime) GPIO.output(KEY, GPIO.LOW) sleep(dotTime) def waitForInterrupt(): print("Type ctrl-c to exit.") while (True): if paddleOnRight: makeDot() if paddleOnLeft: makeDash() sleep(.0001) # Release CPU # Main if (len(sys.argv) > 1): # get speed from command-line, else default to 10 WPM speed = float(sys.argv[1]) init() if os.getuid() == 0: os.nice(-20) # Requires root permissions try: waitForInterrupt() except KeyboardInterrupt: # GPIO.cleanup() # Leaves KEY pin high print("\n") except: sys.exit(0)