From 2ff51480c83dff37be805e6a74c73867ecb46564 Mon Sep 17 00:00:00 2001 From: elstar-purdue Date: Wed, 22 Apr 2026 17:31:29 -0400 Subject: [PATCH] More updates --- .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 368 bytes .../group_sync_read.cpython-313.pyc | Bin 0 -> 6791 bytes .../group_sync_write.cpython-313.pyc | Bin 0 -> 3227 bytes scservo_sdk/__pycache__/hls.cpython-313.pyc | Bin 0 -> 6678 bytes .../__pycache__/port_handler.cpython-313.pyc | Bin 0 -> 6193 bytes .../protocol_packet_handler.cpython-313.pyc | Bin 0 -> 21927 bytes scservo_sdk/__pycache__/scscl.cpython-313.pyc | Bin 0 -> 6177 bytes .../__pycache__/scservo_def.cpython-313.pyc | Bin 0 -> 765 bytes .../__pycache__/sms_sts.cpython-313.pyc | Bin 0 -> 6426 bytes scservo_sdk/port_handler.py | 15 +++- sms_sts/ping.py | 16 ++++- sms_sts/read.py | 2 +- sms_sts/test_servo.py | 65 ++++++++++++++++++ 13 files changed, 94 insertions(+), 4 deletions(-) create mode 100644 scservo_sdk/__pycache__/__init__.cpython-313.pyc create mode 100644 scservo_sdk/__pycache__/group_sync_read.cpython-313.pyc create mode 100644 scservo_sdk/__pycache__/group_sync_write.cpython-313.pyc create mode 100644 scservo_sdk/__pycache__/hls.cpython-313.pyc create mode 100644 scservo_sdk/__pycache__/port_handler.cpython-313.pyc create mode 100644 scservo_sdk/__pycache__/protocol_packet_handler.cpython-313.pyc create mode 100644 scservo_sdk/__pycache__/scscl.cpython-313.pyc create mode 100644 scservo_sdk/__pycache__/scservo_def.cpython-313.pyc create mode 100644 scservo_sdk/__pycache__/sms_sts.cpython-313.pyc create mode 100644 sms_sts/test_servo.py diff --git a/scservo_sdk/__pycache__/__init__.cpython-313.pyc b/scservo_sdk/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a7c6d86695d9c8e40efcc075617b121138f71388 GIT binary patch literal 368 zcmYk%&r8EF6bJB^)@>r2iilo@dJ^Wrz%E{7;6V``B6jx>+OU?TO?k;2{X@jR!T-TO zL_$4z5N|^L15Eup^ZrC zImc+hQP8tVAn;bP>%zn;qb}#G)zOSHmSl-x>@Y9v@^Px7xfCN@b>a0oy6=v6pAhoV Y2GTEKzl7Zqc1qYPVe=U_u(^b literal 0 HcmV?d00001 diff --git a/scservo_sdk/__pycache__/group_sync_read.cpython-313.pyc b/scservo_sdk/__pycache__/group_sync_read.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..00e9f9cb0767a5f6ce363f7dd14417bdd66d59fc GIT binary patch literal 6791 zcmdTJT})fo`CR{T@eelG=Ffo`!k+l59>&mX2gs&o z*&ZgNRtmI<;!2U4JQbcwUzSX&v`m_`RGL)ZIjOCyJa}5ADQ}c)nzWbg`_A>X!698$ zbq_l--#!1|`ToCicxE!`36xu(|1EsRM#x{Wp%hKN@~jyuHwi~L<`n5uIY}*PCY-9C zaOxhFJV#)rG%oE^23jsgVmc@COX&xDu{;|CaFbjh0>cqO#W8{!cM&w48laZb0Mv0> zfMuKxAj_2jEazB&dafLxfztytat44V&IquAGYRIY3YS?joe*X(&v93x6P{2Y_*4tH zCKL(~JDyYxf6uM~xJmq$2z=$@cSe*m694{4o+bkH`bY%V&_Y{<9lHsPAre~lV@s#B ze8gi`>cwwQzUm}X#HAV?cCnIb?viAR#REc|4+MikC>E0p!9YB~M?%r5_$A2@3B=+& z^k0s|B}+KQ&jp0Q3_o!x5S}~V-qpjj0LB=r;y`(3|J0l3Bx5kVdWH|0xayY^9n0D*+@tf)WB0visG)Gg7}MlKBgzXr<060 z2{8~9_ZlkZY*C_14N;X~UkZwKmtZC!x7su~e}cU~y~@07~7* zjUP3p4ecmTkl*OiXtFnDY^Jn5W*cO}3g}@`fv}gM@gn{AAn7G#t5XuHVbCQDNzzhJ zvc^yijUg^sF$MH&Qtfs+ie6_QjK)wgfef%$kV=N#C9=C7vyIQ68l4gq$2{zRlZ+QA z`tJ6ooL{jzjydcH@qw2aFSz3t6eN1VlESG@lOPxyjM5;ueYoH)z(ipN+HFZua654v zHM^vE(2z?C%tY>#6zD~JEGf{t!?}J4F7;?+R4oJy^C{N7E`y|os6#DO(oBc0#H6a@ zXGTW&(KB9tU~J$grw3j=JtR=uMP3N?2#~9i9wPt-UGHKs&IqkAv_)?uHokZ^Ffkp9 zmqrGqzZ)0)62LX`#88olU%$F^HDhiT&CO|ZOWM%7TA4OQZiYwqdq>Cw@Fp*%9~%7HUnSX#)Kn?!Tdot8}VA+h<;dN9*FEcOmR)O@M`LjTBn zKIOlV@lT5W$&7zm^iQY#Gih%$ZJtfBv(Ia4861mh>c6O_(o_JtIfFDZ&16?9lt(BXposSYFaOUh1(24KdpQc`}1lPT%mWuSPjYRir)IZ{= z9R2-hX7Ic?cs@P&divNKX~($8*2)_$zIP<)%`|k04PC1Nv7tL{*q^O${Mdcly{yX~ z=(*?k%yHlUFrGQXi)Z-sfwx7Ads%aN|FTtN$}LjV;BL<~w) zFkxk!5M^Bpk%OdKK!p|#A?O1DQ4>v0zMle zhr1IxNOEpmNE@1fD~S>GY40w*``#~7N+8w1e5If^Qul<3z)eVPqna&YqL7kCwHy=G z`E;BLPw%5f>C+xQ4Aeg%u!>WkW1?mL&|wHsfuk^^jME@9;HyO=f-jSAYq0IF&bMgJ z2m5NeAT$65n2#fzjyf_hXJw~+54g3$Ub3?TS)EZZ0}UgHUB{JeJLe5J6}ZnvxQP~n z`yo|}at<}8#rag4;IND58Tt9vmVD|cTO9ZAkylb|EW&8HkL_ln8lPsTq{(0HpTJof zqPRULDLO+44uyL$I5o(ZqI&;|Plp_#{3$PD9)T1AuL!??gR5?cU1T_YPhVyQ}Kp4e)V?1v+X@|@L{ zV6*0$B(wCh4_O}v(^s!vz7Wu2X?2kx4d^~nP(rjka7=scJou+%08 zR!qxm*4CJOXJzD$H*IsR>+c`<%=EyP-aqv4aBA%Q7e`VTE~Zai%-QNT%*5(=T-CNw zMJnr(l`Hz>E9lHzY4b~2i+!VmSZp`=l({9vwrsQ$OD*Ok)9X!lXVT_FSq0Z$EVWsq z4Ng9iIGMHW5^ZgXp<;*Kv3lU6cSU>Gx>mIJz@5%kx7?Q)#Ej?E(y1i7dQ#kXELA)3 z$oT3Ldwudia{4QK=Q5MERNr}7tluYE_JRMEQGLLEqb1dQfp;|x%jc8vmA4YZIkWvv zhgi2aZQh%$aopxpHTzPQeOYVG?OiE37?`aJ39{ea>U*$GeUA;K@?Y;%jNiG_RT@1` z&@YsK)~QQ+QREhqpl=^;>8OSm*-)GY&pNF5k9Bv2Y)} zRUyVACJs{-Ws5Ce8JFxi(LNz*aH)o63q-qnF%ptWZk1bxuEOrIUjevAa)wIfR%vzQjMhwbhgjW_Hg;fiKPI}5 zJvfv(&WZ4IbE&a_=nkZU(`ol~*6N_I3rkm%lNoa>Gz-~zauTd8ZD?CHtPiZ2(uQ7n z?y?sz=XZuh``*<7(e6%}-6_`nyyhV3RC9gHqx1 z8bv3*r)+4Jv{g1m8BJ+jx={gbS~vpWDLN?uG8Z}ALR2kUI7V#Ai0^#(e77(w1mWQ~ z-wI+=I1MvOjJ#|r6d%O6YTq6T^WE>^iZL1svxe$qQ`+DFr+uq`rTkFBq=S2ARolAK*v5ym--e+pYHpXla#x%y{O84&& ztsSejPixj{GOi<{>&X4!@1nnrJ{%MKy(!;?%$u_!{Cu;ixpze0J7T|(bszjRx)!}Z zCb|b7oX?E#BK(H<)Y}1Z2)xooK-L*#a!swD)ZDGfH1&v0J?p`H(a)j}#>C#!56@?O zQzHCErc#%};z(HR{pokuu{p>*)2eMDAVO^ds3$f%by%)4S%~0W;2#eNFkzvuxb#v- zA3R1~7JT@Q24+I=@U7?hnc3jw2-b}}|IXz=BtK&2`N^;li$}uIP;{2(1&Dh2hZJ~b zCIUDTY!e<}U3On<-dCiH=Rk{G@$Zm1cC`MZuV Rj(=)AD#pGEv7V9l{tq*Z^t1o~ literal 0 HcmV?d00001 diff --git a/scservo_sdk/__pycache__/group_sync_write.cpython-313.pyc b/scservo_sdk/__pycache__/group_sync_write.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..72ae62106b72b1a7d2bcdf5771289983299631ea GIT binary patch literal 3227 zcmcImO>7fa5Ps{wti4Vg;y`{N!3}YYL&1m=T7G0TElK$ahGrcaAZ4|+H;xr&lfK;$ za*3)QszgN!NTh)i9Pz2W(L)bC(o=C0YInuKQY%&5P|~W`&b+lZj+>wgwIh4>{mgrB z-pn^MZ@sqGLx7gQ`#n8fL&&e#DU+krSnq(w5)p~WohNVG0;HLA5Yg63M0=0Tl%ZV8 z5q7@dpcm#0t~*g$%04)Xv>pYvL`DeZL_%#MNA0)^b%=K0PSF9}B|3rEh%Vr~SOeTG z^1wZ!n+hpUSTO27pp(;6;;fqZh^BSrg%dVSlvTxJP$fJ3*D0_iGF+d5uSvs!Oj#K+ zd^l55p1{S1NCww1iV)~oJ08X!9>Qpd4Az$08{eK%GeA-#Y>V}WYYf}em{F_gGSwwH znWT!Q8A4LlWhtYmDSgbSPixYYOyvnFF(#`iC22TW*KjkbWICZ6oJV4smf zL*uQQLR7<6b2LiMn$J`V0xWZs$G*`LNn%Mz@+Q-1ak3Rq6+~Qop+fXzeSKQUQtlm}U z`wRZ2<>;O0!>+tP{7e0=qPKqW+`_rMw=L&wyEnS(4Hh z*YGZ2V`0bg^*h&Bgnb2n^KU}ky#D3!+j_n!lxqsD2q73Oz7brkTd2EzBgeNF1D$3d z`TV8@E0Kw9X2AhyY->TV9<$&!F*U@w%`8|#GDa3;vUu2LLJkc;n}KZtmOzz>$r~kT zwN^o^Vy+t(?gPdy{-FJSJKhoS1#pQi#O@t?>g`~6e8#uEE=0-~{NEu$+t3#1OBw*S z83clv%}pFsTcl#{2(GlCP`1eHK*4et>}WyZ9q4SAJ_oH30-+LB7BIRK21|Z7oU8<8 zIR!4}0RJnYkUSX-%8i0YvA>RX#^ZcG1zvmg>ZaTP9Z7gRD!C%4X61is0 z{renTzCbxAh}?-`Ks;2ZYgnNebt3k$epZoa8z4!@e=y4)Lz}0qx&WyZBwktlVIJ*L zMT3}Is|X~~I#mRtja5U?h0!ha`cJH6-}=OZaOy#*bUmfK+DXEW*bCGwP7z~af$oJ5 zOAUr&T$$C3hW9UCxFE$Y#--lNy=Mn{-y7&-S(6nj+KSR>dc%hg4EA!1-@K@1W;fn4 z^i7zrfSAGSH!sPFaYg^f7RuC-#8w79(%A_LHb$s?kPgan^~C2`?_+zu7`R)bUYV2{_WBH z$@96B=byxXy!yk{=b`RLN576{qxl2T+=1xIfp=Fzz2ATMq%nW?N)CQ~S8}1N>vpbw zgnLOi_Xx*u9(I}e6CGG#4>Se4c`WS3N0us2DDcSgNYcb)ayo-;uOxjsEoVwIK1mu) zQ%%pLRYjeYB#M|a&Dw#jAToq13rva+GGnJC!DCQQCnQI|2 zFoq4S3)mNA&E|HtuI&<>$JSas&c?N7movCl&sv;w@1HK-S-Klr7z^7Bq5OC> tCvab^^`+8y%Dh&To`Nw9Zw+h7OFPGLf4B&@`!C07jvL|D2>Y;=e*-8yPH_ML literal 0 HcmV?d00001 diff --git a/scservo_sdk/__pycache__/hls.cpython-313.pyc b/scservo_sdk/__pycache__/hls.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e8447152b4d5a27f8bd3a74767ba9ed553533b0a GIT binary patch literal 6678 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 K8-aR`&c6YmMwy%d literal 0 HcmV?d00001 diff --git a/scservo_sdk/__pycache__/protocol_packet_handler.cpython-313.pyc b/scservo_sdk/__pycache__/protocol_packet_handler.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e83b458e9bea9f0a3105f29640128824c0baaf4a GIT binary patch literal 21927 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 HYL>qPO|wU3 literal 0 HcmV?d00001 diff --git a/scservo_sdk/__pycache__/scservo_def.cpython-313.pyc b/scservo_sdk/__pycache__/scservo_def.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4adce8322f3d2cdeee7f6bce536ab05baafd8aca GIT binary patch literal 765 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 literal 0 HcmV?d00001 diff --git a/scservo_sdk/port_handler.py b/scservo_sdk/port_handler.py index 2c59122..59e7fa5 100644 --- a/scservo_sdk/port_handler.py +++ b/scservo_sdk/port_handler.py @@ -28,7 +28,11 @@ def closePort(self): self.is_open = False def clearPort(self): + # Clear both input AND output buffers + self.ser.reset_output_buffer() + self.ser.reset_input_buffer() self.ser.flush() + time.sleep(0.001) def setPortName(self, port_name): self.port_name = port_name @@ -60,11 +64,15 @@ def readPort(self, length): return [ord(ch) for ch in self.ser.read(length)] def writePort(self, packet): - return self.ser.write(packet) + written_bytes = self.ser.write(packet) + self.ser.flush() # Wait for TX to finish + self.ser.reset_input_buffer() # Wipe the "echo" of your own message + return written_bytes +# return self.ser.write(packet) def setPacketTimeout(self, packet_length): self.packet_start_time = self.getCurrentTime() - self.packet_timeout = (self.tx_time_per_byte * packet_length) + (self.tx_time_per_byte * 3.0) + LATENCY_TIMER + self.packet_timeout = (self.tx_time_per_byte * (packet_length + 3.0)) + LATENCY_TIMER + 20.0 def setPacketTimeoutMillis(self, msec): self.packet_start_time = self.getCurrentTime() @@ -102,7 +110,10 @@ def setupPort(self, cflag_baud): self.is_open = True + # Wait for port to stabilize before use + time.sleep(0.1) self.ser.reset_input_buffer() + self.ser.reset_output_buffer() self.tx_time_per_byte = (1000.0 / self.baudrate) * 10.0 diff --git a/sms_sts/ping.py b/sms_sts/ping.py index a147ba9..adc257c 100644 --- a/sms_sts/ping.py +++ b/sms_sts/ping.py @@ -10,6 +10,20 @@ import sys import os + +import subprocess + +# ... after portHandler.openPort() ... + +# Use the setserial command to force low latency mode +try: + subprocess.run(['sudo', 'setserial', '/dev/serial0', 'low_latency'], check=True) + print("Low latency mode enabled") +except: + print("Could not set low latency (ensure 'setserial' is installed)") + + + sys.path.append("..") from scservo_sdk import * # Uses FTServo SDK library @@ -17,7 +31,7 @@ # Initialize PortHandler instance # Set the port path # Get methods and members of PortHandlerLinux or PortHandlerWindows -portHandler = PortHandler('/dev/ttyUSB0') #ex) Windows: "COM1" Linux: "/dev/ttyUSB0" Mac: "/dev/tty.usbserial-*" +portHandler = PortHandler('/dev/ttyAMA0') #ex) Windows: "COM1" Linux: "/dev/ttyUSB0" Mac: "/dev/tty.usbserial-*" # Initialize PacketHandler instance # Get methods and members of Protocol diff --git a/sms_sts/read.py b/sms_sts/read.py index 551f0f3..8b20266 100644 --- a/sms_sts/read.py +++ b/sms_sts/read.py @@ -18,7 +18,7 @@ # Initialize PortHandler instance # Set the port path # Get methods and members of PortHandlerLinux or PortHandlerWindows -portHandler = PortHandler('/dev/ttyUSB0')# ex) Windows: "COM1" Linux: "/dev/ttyUSB0" Mac: "/dev/tty.usbserial-*" +portHandler = PortHandler('/dev/ttyAMA0')# ex) Windows: "COM1" Linux: "/dev/ttyUSB0" Mac: "/dev/tty.usbserial-*" # Initialize PacketHandler instance # Get methods and members of Protocol diff --git a/sms_sts/test_servo.py b/sms_sts/test_servo.py new file mode 100644 index 0000000..c05fc8c --- /dev/null +++ b/sms_sts/test_servo.py @@ -0,0 +1,65 @@ +import serial +import time +import subprocess + +# 1. Force Low Latency at the OS level for the Pi 5's ttyAMA10 +try: + # On Pi 5, serial0 usually points to ttyAMA10 + subprocess.run(['sudo', 'setserial', '/dev/serial0', 'low_latency'], check=True) + print("SUCCESS: Low latency mode enabled") +except Exception as e: + print(f"WARNING: Could not set low latency (check if setserial is installed): {e}") + +# 2. Configure the Serial Port +try: + ser = serial.Serial( + port='/dev/serial0', + baudrate=1000000, + timeout=0.1, + write_timeout=0.5 + ) +except Exception as e: + print(f"ERROR: Could not open port: {e}") + exit() + +def send_ping(servo_id): + # STS/SCS Ping Packet: FF FF [ID] [Len] [Instr] [Checksum] + # Checksum = ~(ID + Length + Instruction) & 0xFF + checksum = (~(servo_id + 0x02 + 0x01)) & 0xFF + packet = bytearray([0xFF, 0xFF, servo_id, 0x02, 0x01, checksum]) + + print(f"\n--- Testing ID: {servo_id} ---") + print(f"Sending: {packet.hex().upper()}") + + ser.reset_input_buffer() # Clear anything sitting in the buffer + ser.write(packet) + ser.flush() # Ensure data physically leaves the TX pin + + # Tiny pause for the automatic directional circuit on your board + time.sleep(0.05) + + if ser.in_waiting > 0: + response = ser.read(ser.in_waiting) + print(f"RECEIVED: {response.hex().upper()}") + if len(response) >= 6: + # A valid response usually starts with FF FF + print("RESULT: Servo responded! Hardware communication is working.") + else: + print("RESULT: Received data, but it's too short (potentially an echo).") + else: + print("RESULT: Total silence. No response.") + +try: + if ser.is_open: + print("Serial port opened at 1,000,000 baud") + + # Test ID 1 (Standard default) + for servo_id in range(1, 6): + send_ping(servo_id) + + # Test ID 254 (Broadcast - every servo should answer) + send_ping(254) + +finally: + ser.close() + print("\nPort closed.") \ No newline at end of file