diff --git a/gex/__init__.py b/gex/__init__.py index ea39353..71c7c89 100644 --- a/gex/__init__.py +++ b/gex/__init__.py @@ -20,6 +20,7 @@ from gex.units.ADC import ADC from gex.units.SIPO import SIPO from gex.units.FCAP import FCAP from gex.units.TOUCH import TOUCH +from gex.units.PWMDim import PWMDim # General, low level diff --git a/gex/units/PWMDim.py b/gex/units/PWMDim.py new file mode 100644 index 0000000..728c705 --- /dev/null +++ b/gex/units/PWMDim.py @@ -0,0 +1,43 @@ +import gex + +CMD_SET_FREQUENCY = 0 +CMD_SET_DUTY = 1 +CMD_STOP = 2 +CMD_START = 3 + +class PWMDim(gex.Unit): + """ + Simple 4-channel PWM output with a common frequency + """ + + def _type(self): + return 'PWMDIM' + + def set_frequency(self, hertz:int, confirm=True): + """ Set freq """ + pb = gex.PayloadBuilder() + pb.u32(hertz) + self._send(CMD_SET_FREQUENCY, pb.close(), confirm=confirm) + + def set_duty(self, duty_dict, confirm=True): + """ Set duty (dict - number1234 -> duty 0-1000) """ + pb = gex.PayloadBuilder() + + for (k,v) in enumerate(duty_dict): + pb.u8(k-1) + pb.u16(v) + + self._send(CMD_SET_DUTY, pb.close(), confirm=confirm) + + def set_duty_single(self, ch1234, duty1000, confirm=True): + """ Set duty of a single channel """ + pb = gex.PayloadBuilder() + pb.u8(ch1234-1) + pb.u16(duty1000) + self._send(CMD_SET_DUTY, pb.close(), confirm=confirm) + + def stop(self, confirm=True): + self._send(CMD_STOP, confirm=confirm) + + def start(self, confirm=True): + self._send(CMD_START, confirm=confirm) diff --git a/owtest.py b/owtest.py new file mode 100644 index 0000000..9bd503c --- /dev/null +++ b/owtest.py @@ -0,0 +1,66 @@ +#!/bin/env python3 +import time + +import gex + +with gex.Client(gex.TrxRawUSB()) as client: + ow = gex.OneWire(client, 'ow') + # print("Presence: ", ow.test_presence()) + print("Devices:", ow.search()) + + def meas(addr): + ow.write([0x44], addr=addr) + ow.wait_ready() + data = ow.query([0xBE], 9, addr=addr) + pp = gex.PayloadParser(data) + return pp.i16() * 0.0625 + + while True: + a = meas(6558392391241695016) + b = meas(1802309978572980008) + print("in: %.2f °C, out: %f °C" % (a, b)) + + + + # # search the bus for alarm + # if False: + # ow = gex.OneWire(client, 'ow') + # print("Presence: ", ow.test_presence()) + # print("Devices w alarm:", ow.search(alarm=True)) + # + # # simple 1w check + # if False: + # ow = gex.OneWire(client, 'ow') + # print("Presence: ", ow.test_presence()) + # print("ROM: 0x%016x" % ow.read_address()) + # print("Scratch:", ow.query([0xBE], rcount=9, addr=0x7100080104c77610, as_array=True)) + # + # # testing ds1820 temp meas without polling + # if False: + # ow = gex.OneWire(client, 'ow') + # print("Presence: ", ow.test_presence()) + # print("Starting measure...") + # ow.write([0x44]) + # time.sleep(1) + # print("Scratch:", ow.query([0xBE], 9)) + # + # # testing ds1820 temp meas with polling + # if False: + # ow = gex.OneWire(client, 'ow') + # print("Presence: ", ow.test_presence()) + # print("Starting measure...") + # ow.write([0x44]) + # ow.wait_ready() + # data = ow.query([0xBE], 9) + # + # pp = gex.PayloadParser(data) + # + # temp = pp.i16()/2.0 + # th = pp.i8() + # tl = pp.i8() + # reserved = pp.i16() + # remain = float(pp.u8()) + # perc = float(pp.u8()) + # + # realtemp = temp - 0.25+(perc-remain)/perc + # print("Temperature = %f °C (th %d, tl %d)" % (realtemp, th, tl)) diff --git a/pwmbeep.py b/pwmbeep.py new file mode 100644 index 0000000..1206a6b --- /dev/null +++ b/pwmbeep.py @@ -0,0 +1,45 @@ +import time + +import gex + +C3 = 130.81; Cx3 = 138.59; D3 = 146.83; Dx3 = 155.56; E3 = 164.81; F3 = 174.61 +Fx3 = 185.00; G3 = 196.00; Gx3 = 207.65; A3 = 220.00; Ax3 = 233.08; B3 = 246.94 +C4 = 261.63; Cx4 = 277.18; D4 = 293.66; Dx4 = 311.13; E4 = 329.63; F4 = 349.23 +Fx4 = 369.99; G4 = 392.00; Gx4 = 415.30; A4 = 440.00; Ax4 = 466.16; B4 = 493.88 +C5 = 523.25; Cx5 = 554.37; D5 = 587.33; Dx5 = 622.25; E5 = 659.25; F5 = 698.46 +Fx5 = 739.99; G5 = 783.99; Gx5 = 830.61; A5 = 880.00; Ax5 = 932.33; B5 = 987.77 + +with gex.Client(gex.TrxRawUSB()) as client: + pwm = gex.PWMDim(client, 'dim') + + # O O/ #/ #~ #= + # 16, 8, 4, 2, 1 + notes = [ + (G3, 2), + (G4, 2), (E4, 6), (G4, 2), (E4, 2), (A4, 6), (0, 2), (B4, 2), + (G4, 2), (E4, 6), (A4, 2), (G4, 2), (D4, 6), (0, 2), (G3, 2), + + (G4, 2), (E4, 6), (D4, 2), (C4, 2), (C5, 6), (0, 2), (A4, 2), + (G4, 2), (E4, 4), (0, 2), (D4, 2), (A3, 2), (C4, 6), (0, 2), (G3, 2), + + #rep + (G4, 2), (E4, 6), (G4, 2), (E4, 2), (A4, 6), (0, 2), (B4, 2), + (G4, 2), (E4, 6), (A4, 2), (G4, 2), (D4, 6), (0, 2), (G3, 2), + + (G4, 2), (E4, 6), (D4, 2), (C4, 2), (C5, 6), (0, 2), (A4, 2), + + (G4, 2), (E4, 6), (D4, 2), (A3, 2), (C4, 6), (0, 2), #(C4, 2), + ] + + for p in notes: + pwm.stop() + time.sleep(0.01) + f = round(p[0]) + print(f) + if f > 0: + pwm.set_frequency(f) + pwm.start() + time.sleep(0.1*p[1]) + + pwm.stop() + diff --git a/pwmbeep2.py b/pwmbeep2.py new file mode 100644 index 0000000..fbb387a --- /dev/null +++ b/pwmbeep2.py @@ -0,0 +1,15 @@ +import time + +import gex + +with gex.Client(gex.TrxRawUSB()) as client: + pwm = gex.PWMDim(client, 'dim') + + pwm.start() + pwm.set_duty_single(1, 500) + for i in range(2000, 200, -15): + pwm.set_frequency(i) + time.sleep(0.05) + + pwm.stop() +