diff --git a/Adafruit_DRV2605.py b/Adafruit_DRV2605.py new file mode 100644 index 0000000..21b8aaf --- /dev/null +++ b/Adafruit_DRV2605.py @@ -0,0 +1,119 @@ +################################################## +# This is a library for the Adafruit DRV2605L Haptic Driver +# +# ----> http://www.adafruit.com/products/2305 +# +# Check out the links above for our tutorials and wiring diagrams +# This motor/haptic driver uses I2C to communicate +# +# Adafruit invests time and resources providing this open source code, +# please support Adafruit and open-source hardware by purchasing +# products from Adafruit! +# +# Original Arduino library Written by Limor Fried/Ladyada for Adafruit Industries. +# Python module written by Sean Mealin +# MIT license, all text above must be included in any redistribution +################################################## + +import Adafruit_GPIO.I2C as I2C + +DRV2605_ADDR = 0x5A + +DRV2605_REG_STATUS = 0x00 +DRV2605_REG_MODE = 0x01 +DRV2605_MODE_INTTRIG = 0x00 +DRV2605_MODE_EXTTRIGEDGE = 0x01 +DRV2605_MODE_EXTTRIGLVL = 0x02 +DRV2605_MODE_PWMANALOG = 0x03 +DRV2605_MODE_AUDIOVIBE = 0x04 +DRV2605_MODE_REALTIME = 0x05 +DRV2605_MODE_DIAGNOS = 0x06 +DRV2605_MODE_AUTOCAL = 0x07 + +DRV2605_REG_RTPIN = 0x02 +DRV2605_REG_LIBRARY = 0x03 +DRV2605_REG_WAVESEQ1 = 0x04 +DRV2605_REG_WAVESEQ2 = 0x05 +DRV2605_REG_WAVESEQ3 = 0x06 +DRV2605_REG_WAVESEQ4 = 0x07 +DRV2605_REG_WAVESEQ5 = 0x08 +DRV2605_REG_WAVESEQ6 = 0x09 +DRV2605_REG_WAVESEQ7 = 0x0A +DRV2605_REG_WAVESEQ8 = 0x0B + +DRV2605_REG_GO = 0x0C +DRV2605_REG_OVERDRIVE = 0x0D +DRV2605_REG_SUSTAINPOS = 0x0E +DRV2605_REG_SUSTAINNEG = 0x0F +DRV2605_REG_BREAK = 0x10 +DRV2605_REG_AUDIOCTRL = 0x11 +DRV2605_REG_AUDIOLVL = 0x12 +DRV2605_REG_AUDIOMAX = 0x13 +DRV2605_REG_RATEDV = 0x16 +DRV2605_REG_CLAMPV = 0x17 +DRV2605_REG_AUTOCALCOMP = 0x18 +DRV2605_REG_AUTOCALEMP = 0x19 +DRV2605_REG_FEEDBACK = 0x1A +DRV2605_REG_CONTROL1 = 0x1B +DRV2605_REG_CONTROL2 = 0x1C +DRV2605_REG_CONTROL3 = 0x1D +DRV2605_REG_CONTROL4 = 0x1E +DRV2605_REG_VBAT = 0x21 +DRV2605_REG_LRARESON = 0x22 + +class Adafruit_DRV2605(object): + def __init__(self, busnum=1): + self.i2c = I2C.Device(DRV2605_ADDR, busnum=busnum) + # end def + + def begin(self): + id = self.readRegister8(DRV2605_REG_STATUS) + + self.writeRegister8(DRV2605_REG_MODE, 0x00) # out of standby + + self.writeRegister8(DRV2605_REG_RTPIN, 0x00) # no real-time-playback + + self.writeRegister8(DRV2605_REG_WAVESEQ1, 1) # strong click + self.writeRegister8(DRV2605_REG_WAVESEQ2, 0) + + self.writeRegister8(DRV2605_REG_OVERDRIVE, 0) # no overdrive + + self.writeRegister8(DRV2605_REG_SUSTAINPOS, 0) + self.writeRegister8(DRV2605_REG_SUSTAINNEG, 0) + self.writeRegister8(DRV2605_REG_BREAK, 0) + self.writeRegister8(DRV2605_REG_AUDIOMAX, 0x64) + + # ERM open loop + + # turn off N_ERM_LRA + self.writeRegister8(DRV2605_REG_FEEDBACK, self.readRegister8(DRV2605_REG_FEEDBACK) & 0x7F) + # turn on ERM_OPEN_LOOP + self.writeRegister8(DRV2605_REG_CONTROL3, self.readRegister8(DRV2605_REG_CONTROL3) | 0x20) + + return True + # end def + + def setWaveform(self, slot, w): + self.writeRegister8(DRV2605_REG_WAVESEQ1+slot, w) + # end def + + def selectLibrary(self, lib): + self.writeRegister8(DRV2605_REG_LIBRARY, lib) + # end def + + def go(self): + self.writeRegister8(DRV2605_REG_GO, 1) + # end def + + def setMode(self, mode): + self.writeRegister8(DRV2605_REG_MODE, mode) + # end def + + def readRegister8(self, reg): + return self.i2c.readU8(reg) + # end def + + def writeRegister8(self, reg, val): + self.i2c.write8(reg, val) + # end def +# end class diff --git a/morse_trainer.py b/morse_trainer.py new file mode 100644 index 0000000..632ab2f --- /dev/null +++ b/morse_trainer.py @@ -0,0 +1,209 @@ +################################################## +# This is part of PiPHL the RaspberryPi Passive +# Haptic Learning tool +# +# Copyright 2017 Paul Warren +# +# Released under the GNU Public License Version 3.0 or later. +################################################## + +import time +from Adafruit_DRV2605 import * + +drv = Adafruit_DRV2605(busnum=0) + +### setup ### +drv.begin() + +# I2C trigger by sending 'go' command +drv.setMode(DRV2605_MODE_INTTRIG) # default, internal trigger when sending GO command +drv.selectLibrary(1) + +def dah(): + drv.setWaveform(0, 14) + drv.setWaveform(1, 0) + drv.go() + time.sleep(0.32) + +def dit(): + drv.setWaveform(0, 1) + drv.setWaveform(1, 0) + drv.go() + time.sleep(0.18) + +def wait_letter(): + time.sleep(0.33) + +def wait_word(): + time.sleep(0.33) + + +def a(): + dit(); dah(); + wait_letter() + +def b(): + dah(); dit(); dit(); dit(); + wait_letter() + +def c(): + dah(); dit(); dah(); dit() + wait_letter() + +def d(): + dah(); dit(); dit(); + wait_letter() + +def e(): + dit(); + wait_letter() + +def f(): + dit(); dit(); dah(); dit(); + wait_letter() + +def g(): + dah(); dah(); dit(); + wait_letter() + +def h(): + dit(); dit(); dit(); dit(); + wait_letter() + +def i(): + dit(); dit(); + wait_letter() + +def j(): + dit(); dah(); dah(); dah(); + wait_letter() + +def k(): + dah(); dit(); dah(); + wait_letter() + +def l(): + dit(); dah(); dit(); dit(); + wait_letter() + +def m(): + dah(); dah(); + wait_letter() + +def n(): + dah(); dit(); + wait_letter() + +def O(): + dah(); dah(); dah(); + wait_letter() + +def p(): + dit(); dah(); dah(); dit(); + wait_letter() + +def q(): + dah(); dah(); dit(); dah(); + wait_letter() + +def r(): + dit(); dah(); dit(); + wait_letter() + +def s(): + dit(); dit(); dit(); + wait_letter() + +def t(): + dah(); + wait_letter() + +def u(): + dit(); dit(); dah(); + wait_letter() + +def v(): + dit(); dit(); dit(); dah(); + wait_letter() + +def w(): + dit(); dah(); dah(); + wait_letter() + +def x(): + dah(); dit(); dit(); dah(); + wait_letter() + +def y(): + dah(); dit(); dah(); dah(); + wait_letter() + +def z(): + dah(); dah(); dit(); dit(); + wait_letter() + +def m1(): + dit(); dah(); dah(); dah(); dah(); + wait_letter() + +def m2(): + dit(); dit(); dah(); dah(); dah(); + wait_letter() + +def m3(): + dit(); dit(); dit(); dah(); dah(); + wait_letter() + +def m4(): + dit(); dit(); dit(); dit(); dah(); + wait_letter() + +def m5(): + dit(); dit(); dit(); dit(); dit(); + wait_letter() + +def m6(): + dah(); dit(); dit(); dit(); dit(); + wait_letter() + +def m7(): + dah(); dah(); dit(); dit(); dit(); + wait_letter() + +def m8(): + dah(); dah(); dah(); dit(); dit(); + wait_letter() + +def m9(): + dah(); dah(); dah(); dah(); dit(); + wait_letter() + +def m0(): + dah(); dah(); dah(); dah(); dah(); + wait_letter() + + +print "A" +a() +print "B" +b() + + +print "C" +c() +print "Q" +q() + + +print "V" +v() +print "K" +k() +print "1" +m1() +print "A" +a() +print "T" +t() +print "P" +p()