From 5f43598c117d34bc515f8ddfcb5300fb868664fa Mon Sep 17 00:00:00 2001 From: Jan Michel Date: Mon, 19 Oct 2026 09:31:10 +0200 Subject: [PATCH] add automatic save on reset --- atmega32u4/stepmotorcontroller/Keyboard.odt | Bin 570217 -> 575013 bytes atmega32u4/stepmotorcontroller/gui.py | 197 ++++++++++++++++---- atmega32u4/stepmotorcontroller/main.c | 148 +++++++++++---- 3 files changed, 274 insertions(+), 71 deletions(-) diff --git a/atmega32u4/stepmotorcontroller/Keyboard.odt b/atmega32u4/stepmotorcontroller/Keyboard.odt index f9c6d5c33d2b3a43c0326edf88053a296954d565..1fe07878f1f8b54a594d79cda04a2e6a64a8e87e 100644 GIT binary patch delta 44447 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 tcX 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%0AG-}!4Gh({*Ex6 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 D9aD72 diff --git a/atmega32u4/stepmotorcontroller/gui.py b/atmega32u4/stepmotorcontroller/gui.py index b13a802..6f130cb 100755 --- a/atmega32u4/stepmotorcontroller/gui.py +++ b/atmega32u4/stepmotorcontroller/gui.py @@ -26,17 +26,29 @@ def twos_complement(hexstr, bits): value -= 1 << bits return value +def is_integer(n): + try: + float(n) + except ValueError: + return False + else: + return float(n).is_integer() + +def select_all(event): + event.widget.select_range(0, tk.END) + event.widget.icursor(tk.END) + return "break" class SerialGUI: def __init__(self, root): self.root = root self.root.title("Step Motor Controller") - self.root.columnconfigure(1, weight=1) - self.root.columnconfigure(2, weight=1) - + # self.root.columnconfigure(1, weight=1) + # self.root.columnconfigure(2, weight=1) + self.root.columnconfigure(3, weight=1) labels = [ - "Position [steps]", "Position [um]", "Goto [steps]", "Goto [um]", - "Move by [steps]", "Move by [um]", "Stepsize", "Speed"] + "Position [steps]", "Position [µm]", "Goto [steps]", "Goto [µm]", + "Move by [steps]", "Move by [µm]", "Stepsize", "Speed"] names = ["PS","PU","GS","GU","MS","MU","SS","SP"] self.entries = {} @@ -44,11 +56,17 @@ class SerialGUI: label = ttk.Label(root, text=label_text) label.grid(row=row, column=0, padx=8, pady=5, sticky="w") - entry1 = ttk.Entry(root) + entry1 = ttk.Entry(root, width=20) + for b in ["",""]: entry1.bind(b, lambda event, sn=names[row]+"X": self.valuechanged(sn)) + for b in ["",""]: entry1.bind(b, lambda event, sn=names[row]+"X": self.valuechanged(sn,1)) + for b in ["",""]: entry1.bind(b,select_all) entry1.grid(row=row, column=1, padx=5, pady=5, sticky="ew") if row < 6: - entry2 = ttk.Entry(root) + entry2 = ttk.Entry(root, width=20) + for b in ["",""]: entry2.bind(b, lambda event, sn=names[row]+"Y": self.valuechanged(sn)) + for b in ["",""]: entry2.bind(b, lambda event, sn=names[row]+"Y": self.valuechanged(sn,1)) + for b in ["",""]: entry2.bind(b,select_all) entry2.grid(row=row, column=2, padx=5, pady=5, sticky="ew") if row < 6: @@ -61,7 +79,7 @@ class SerialGUI: colname = ["Active","X+","X-","Y+","Y-"]; color_frame = tk.Frame(root) color_frame.grid( - row=8, column=0, columnspan=3, + row=8, column=0, columnspan=4, padx=8, pady=12, sticky="ew" ) @@ -79,39 +97,55 @@ class SerialGUI: fill="black", # Text color font=("Arial", 10, "bold"), ) + if col==0: + rectangle.bind("", lambda event: self.activate()) rectangle.grid(row=0, column=col, padx=5) self.entries[colname[col]] = rectangle + ttk.Button( + color_frame, + text="Clear", + style="Tiny.TButton", + command=lambda: self.clearcoordinates() + ).grid(row=0, column=5) + ttk.Button( root, text="Store", style="Tiny.TButton", command=lambda: self.storeposition() ).grid(row=9, column=0) + ttk.Button( + root, + text="Goto", + style="Tiny.TButton", + command=lambda: self.gotoline() + ).grid(row=10, column=0) ttk.Button( root, text="Save", style="Tiny.TButton", command=lambda: self.savelog() - - ).grid(row=10, column=0) + ).grid(row=11, column=0) text_box = tk.Text( root, height=10, - width=50, + width=80, wrap="word", # Wrap long lines - font=("Courier", 11) + font=("Courier", 11), ) - text_box.grid(row=9, column=1, columnspan=2, rowspan=2) + text_box.bind("", lambda event: self.gotoline()) + text_box.grid(row=9, column=1, columnspan=3, rowspan=3) self.entries["store"] = text_box + self.entries["store"].insert("end","X (step) Y (step) X (µm) Y (µm) Notes\n") - label = ttk.Label(root, text="Raw Input") - label.grid(row=11, column=0, padx=8, pady=5, sticky="w") - entry1 = ttk.Entry(root) - entry1.grid(row=11, column=1, columnspan=2, padx=5, pady=5, sticky="ew") + # label = ttk.Label(root, text="Raw Input") + # label.grid(row=11, column=0, padx=8, pady=5, sticky="w") + # entry1 = ttk.Entry(root) + # entry1.grid(row=11, column=1, columnspan=2, padx=5, pady=5, sticky="ew") - self.entries["raw"] = entry1 + # self.entries["raw"] = entry1 # --- Serial Setup --- try: self.ser = serial.Serial(PORT, BAUD_RATE, timeout=1) @@ -119,16 +153,103 @@ class SerialGUI: self.display_var.set(f"Error: Could not open {PORT}\n{e}") return - # Start a background thread to read serial data without freezing the GUI self.thread = threading.Thread(target=self.read_serial, daemon=True) self.thread.start() - def storeposition(self): - xs = self.entries["PSX"].get() - xu = self.entries["PUX"].get() - ys = self.entries["PSY"].get() - yu = self.entries["PUY"].get() - self.entries["store"].insert("end",f"{xs} {ys}\t{xu} {yu}\n") + def valuechanged(self, field, invert=0): + if field == "SSX": + value = self.entries["SS"].get() + if is_integer(value): + value = int(value) & 0x7fffffff + self.send_data("W03%08x\n" % value) + if field == "SPX": + value = self.entries["SP"].get() + if is_integer(value): + value = int(value) & 0x7 + self.send_data("W04%08x\n" % value) + if field == "GSX": + value = self.entries["GSX"].get() + if is_integer(value): + value = int(value) & 0xffffffff + self.send_data("W05%08x\n" % value) + if field == "GSY": + value = self.entries["GSY"].get() + if is_integer(value): + value = int(value) & 0xffffffff + self.send_data("W06%08x\n" % value) + if field == "GUX": + value = self.entries["GUX"].get() + if is_integer(value): + value = round((float(value))/STEP_SIZE/CORRECTION_X) & 0xffffffff + self.send_data("W05%08x\n" % value) + if field == "GUY": + value = self.entries["GUY"].get() + if is_integer(value): + value = round((float(value))/STEP_SIZE/CORRECTION_Y) & 0xffffffff + self.send_data("W06%08x\n" % value) + if field == "MSX": + value = self.entries["MSX"].get() + if is_integer(value): + value = int(value) + if invert: value = -value + value = value & 0xffffffff + self.send_data("W07%08x\n" % value) + if field == "MSY": + value = self.entries["MSY"].get() + if is_integer(value): + value = int(value) + if invert: value = -value + value = value & 0xffffffff + self.send_data("W08%08x\n" % value) + if field == "MUX": + value = self.entries["MUX"].get() + if is_integer(value): + value = float(value) + if invert: value = -value + value = round(value/STEP_SIZE/CORRECTION_X) & 0xffffffff + self.send_data("W07%08x\n" % value) + if field == "MUY": + value = self.entries["MUY"].get() + if is_integer(value): + value = float(value) + if invert: value = -value + value = round(value/STEP_SIZE/CORRECTION_Y) & 0xffffffff + self.send_data("W08%08x\n" % value) + + def clearcoordinates(self): + xs = int(self.entries["PSX"].get()) + ys = int(self.entries["PSY"].get()) + + self.send_data("W0A00000000\n") + self.entries["store"].see(tk.END) + + + def activate(self): + if self.entries["Active"].cget("bg") == "green": + self.send_data("W0900000000\n") + else: + self.send_data("W0900000001\n") + + def gotoline(self): + line = self.entries["store"].get("insert linestart", "insert lineend") + m = re.search(r"^\s*([\-0-9]+)\s*([\-0-9]+)",line) + if m: + value = int(m.group(1)) & 0xffffffff + self.send_data("W05%08x\n" % value) + value = int(m.group(2)) & 0xffffffff + self.send_data("W06%08x\n" % value) + + def storeposition(self, text=""): + xs = int(self.entries["PSX"].get()) + xu = float(self.entries["PUX"].get()) + ys = int(self.entries["PSY"].get()) + yu = float(self.entries["PUY"].get()) + s = "" + if text != "": + s = " # " + text + # self.entries["store"].insert("end",f"{xs} {ys}\t{xu} {yu}\n") + self.entries["store"].insert("end","%8i %8i %11.2f %11.2f %s\n" %(xs,ys,xu,yu,s)) + self.entries["store"].see(tk.END) def savelog(self): filename = filedialog.asksaveasfilename( @@ -161,8 +282,8 @@ class SerialGUI: break if inputline is not None: # print(inputline) - self.setbox("raw",inputline) - m = re.search(r"P([0-9a-fA-F]+),([0-9a-fA-F]+)",inputline) + # self.setbox("raw",inputline) + m = re.search(r"P([0-9a-fA-F]+),([0-9a-fA-F]+)([SR]?)",inputline) if m: xs = twos_complement(m.group(1),32) ys = twos_complement(m.group(2),32) @@ -170,6 +291,10 @@ class SerialGUI: self.setbox("PSY",ys) self.setbox("PUX",xs * STEP_SIZE * CORRECTION_X, 2) self.setbox("PUY",ys * STEP_SIZE * CORRECTION_Y, 2) + if m.group(3) == 'S': + self.storeposition() + if m.group(3) == 'R': + self.storeposition("# reset") m = re.search(r"S([01])([01])([01])([01])([01])",inputline) if m: if m.group(1) == '1': @@ -210,15 +335,15 @@ class SerialGUI: except Exception: pass - # def send_data(self): - # data = self.entry.get() - # if data: - # try: - # # Add newline character and send as bytes - # self.ser.write((data + '\n').encode('utf-8')) - # self.entry.delete(0, tk.END) # Clear input field - # except Exception as e: - # print(f"Send Error: {e}") + def send_data(self, data): + if data: + try: + # Add newline character and send as bytes + self.ser.write((data + '\n').encode('utf-8')) + except Exception as e: + print(f"Send Error: {e}") + + def close_window(): stop_event.set() root.destroy() diff --git a/atmega32u4/stepmotorcontroller/main.c b/atmega32u4/stepmotorcontroller/main.c index 78543cd..cfd6272 100644 --- a/atmega32u4/stepmotorcontroller/main.c +++ b/atmega32u4/stepmotorcontroller/main.c @@ -75,7 +75,7 @@ uint16_t time; uint8_t rxcnt = 0, txpoint = 0; uint8_t rxbuf[15]; uint8_t txbuf[15]; -uint8_t buffer[24]; +uint8_t buffer[26]; color_t colors[16]; color_t topback; volatile uint8_t keypad[16] = { 0 }; @@ -358,6 +358,85 @@ void MoveAbsoluteY(int32_t pos) { } sei(); } + +void MoveRelativeX(int32_t pos) { + cli(); + if (motor_active) { + if (pos > 0) { + DIRECTION_FORWARD_M1(); + M1_DIR = 1; + M1_STEPS = pos; + } + else{ + DIRECTION_BACKWARD_M1(); + M1_DIR = 0; + M1_STEPS = -pos; + } + } + sei(); +} + +void MoveRelativeY(int32_t pos) { + cli(); + if (motor_active) { + if (pos > 0) { + DIRECTION_FORWARD_M2(); + M2_DIR = 1; + M2_STEPS = pos; + } + else{ + DIRECTION_BACKWARD_M2(); + M2_DIR = 0; + M2_STEPS = -pos; + } + } + sei(); +} + +void activate(uint8_t state) { + if (state == 0) { + motor_active = 0; + DISABLE_M1(); + DISABLE_M2(); + DISABLE_POWER(); + M1_STEPS = 0; + M2_STEPS = 0; + lcd_use_foreground(colors[5]); + lcd_putstr_xy_P(PSTR("off"), 16, 280); + lcd_use_foreground(colors[0]); + } else { + motor_active = 1; + ENABLE_M1(); + ENABLE_M2(); + ENABLE_POWER(); + lcd_use_foreground(colors[3]); + lcd_putstr_xy_P(PSTR("ON "), 16, 280); + lcd_use_foreground(colors[0]); + } +} + +void sendPosition(uint8_t c) { + strncpy((char*)buffer, " ", 24); + buffer[0]='P'; + ltoa(M1_position, (char*)buffer+1, 16); + buffer[11]=','; + ltoa(M2_position, (char*)buffer+12, 16); + buffer[22]=c; + buffer[23]='\n'; + buffer[24] = 0; + send_string(buffer,25); +} + + +void clearcoordinates(void) { + cli(); + M1_position = 0; + M2_position = 0; + sendPosition('R'); + sei(); +} + + /***************************************************************** * Communication *****************************************************************/ @@ -418,7 +497,25 @@ void getdata(uint8_t buf) MoveAbsoluteY(pos); send_answer_hex(&rxbuf[0], pos); } - + if (regnumber == 7) { // Register 7: Move Relative X W0700000064 + int32_t pos = hex_to_int32(&rxbuf[3]); + MoveRelativeX(pos); + send_answer_hex(&rxbuf[0], pos); + } + if (regnumber == 8) { // Register 8: Move Relative Y W08FFFFFF95 + int32_t pos = hex_to_int32(&rxbuf[3]); + MoveRelativeY(pos); + send_answer_hex(&rxbuf[0], pos); + } + if (regnumber == 9) { // Register 9: Activate W0900000001 W0900000000 + uint8_t t = hex_to_int(rxbuf[10]) & 1; + activate(t); + send_answer_hex(&rxbuf[0], t); + } + if (regnumber == 0xa) { // Register 10: Clear W0A00000000 + clearcoordinates(); + send_answer_hex(&rxbuf[0], 1); + } } } } @@ -573,25 +670,10 @@ __attribute__((naked)) void main(void) lcd_set_font(FONT_PROP_16, SPACING); if (keypad[12] && keypad[12] != 255) { // A - if (motor_active) { - motor_active = 0; - DISABLE_M1(); - DISABLE_M2(); - DISABLE_POWER(); - M1_STEPS = 0; - M2_STEPS = 0; - lcd_use_foreground(colors[5]); - lcd_putstr_xy_P(PSTR("off"), 16, 280); - lcd_use_foreground(colors[0]); - } else { - motor_active = 1; - ENABLE_M1(); - ENABLE_M2(); - ENABLE_POWER(); - lcd_use_foreground(colors[3]); - lcd_putstr_xy_P(PSTR("ON "), 16, 280); - lcd_use_foreground(colors[0]); - } + if (motor_active) + activate(0); + else + activate(1); keypad[12] = 255; } if (keypad[13] && keypad[13] != 255) { // B @@ -611,10 +693,7 @@ __attribute__((naked)) void main(void) // Cursor Keys if (!numlock) { if (keypad[14] && keypad[14] != 255) { // C - cli(); - M1_position = 0; - M2_position = 0; - sei(); + clearcoordinates(); keypad[14] = 255; } if (keypad[15] && keypad[15] != 255) { // D @@ -622,7 +701,7 @@ __attribute__((naked)) void main(void) M1_STEPS = 0; M2_STEPS = 0; sei(); - keypad[14] = 255; + keypad[15] = 255; } if (keypad[4]) { // 2 @@ -640,7 +719,7 @@ __attribute__((naked)) void main(void) if (!(keystate & (1 << 4))) keypad[4] = 255; } - if (keypad[5]) { // 5, toggle single step mode + if (keypad[5] && keypad[5] != 255) { // 5, toggle single step mode cli(); if (stepsize != 1) { stored_stepsize = stepsize; @@ -653,6 +732,12 @@ __attribute__((naked)) void main(void) keypad[5] = 255; } + if (keypad[7] && keypad[7] != 255) { // 0, send position + cli(); + sendPosition('S'); + sei(); + keypad[7] = 255; + } if (keypad[6]) { // 8 if (keypad[6] < 20 || keypad[6] > 40) { cli(); @@ -830,14 +915,7 @@ __attribute__((naked)) void main(void) // } //output position to USB // if ((time & 0x7) == 0) { - strncpy((char*)buffer, " ", 24); - buffer[0]='P'; - ltoa(M1_position, (char*)buffer+1, 16); - buffer[11]=','; - ltoa(M2_position, (char*)buffer+12, 16); - buffer[22]='\n'; - buffer[23] = 0; - send_string(buffer,24); + sendPosition(' '); strncpy((char*)buffer, " ", 24); buffer[0]='S'; -- 2.51.0