import serial
import time
import json
seq = 0
seq_old = 0
rpm = 1.0
r = 0.0
g = 0.0
b = 0.0
def make_request():
global seq
global seq_old
global r
global g
global b
if seq_old != seq:
seq_old = seq
r += 1
if r >= 12:
r = 0
g += 1
if g >= 12:
g = 0
b += 1
if b >= 12:
b = 0
pxarr = []
for px in range(0, 12):
if b == px:
pxarr.extend([0, 0, 50])
elif g == px:
pxarr.extend([20, 0, 0])
elif r == px:
pxarr.extend([0, 30, 0])
else:
pxarr.extend([0, 0, 0])
return json.dumps({
'id': seq,
'jsonrpc': "2.0",
'method': "set_pixels",
'params': pxarr,
})
if __name__ == "__main__":
ser = serial.Serial()
ser.port = '/dev/ttyACM1' ser.baudrate = 4000000 ser.bytesize = serial.EIGHTBITS ser.parity = serial.PARITY_NONE ser.stopbits = serial.STOPBITS_ONE ser.timeout = 0 ser.xonxoff = False ser.rtscts = False ser.dsrdtr = False ser.write_timeout = 0 ser.inter_byte_timeout = None ser.exclusive = False ser.open()
print(ser.name)
now_time = time.monotonic()
last_time = now_time
print_time = now_time
while True:
try:
request = make_request()
request = f"{request}\n"
request = bytes(request, encoding='utf-8')
sent = ser.write(request)
sent = format(f"OK[{sent}]")
except serial.serialutil.SerialTimeoutException:
continue
seq += 1
recv = ser.read_until(expected='\n')
now_time = time.monotonic()
elapsed_time = now_time - last_time
last_time = now_time
additional_delay = (1.0 / rpm / 12.0) - elapsed_time
if additional_delay > 0.0:
time.sleep(additional_delay)
if now_time >= print_time:
real_rpm = 1.0 / (elapsed_time * 12.0)
freq = 1.0 / elapsed_time
print(f"WANT RPM: {round(rpm)} REAL RPM: {round(real_rpm)} --> {round(freq)} Hz")
if (rpm - real_rpm) < 2.0:
rpm *= 1.1
print_time = now_time + 0.5