rhandycan1

pi_pico_w micropython(thonny)_4servoRobot

Aug 3rd, 2025 (edited)
225
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.73 KB | Source Code | 0 0
  1. #PROGRAM BY: RANDY N. CAÑADA
  2. #SUBSCRIBE: FB PAGES:
  3. #Playlist.ph:
  4. #https://www.facebook.com/profile.php?id=61573177858722
  5.  
  6. #Arduino:
  7. #https://www.facebook.com/rhacan2?__tn__=R
  8.  
  9. #YOUTUBE:
  10. #PlaylistPH
  11. #https://www.youtube.com/@PlaylistPh-h2v
  12.  
  13. #ElectroCrafters:
  14. #https://www.youtube.com/channel/UCu1aqzUdTqSnTN5BHNlbVgA
  15.  
  16.  
  17.  
  18. import network
  19. import socket
  20. import time
  21. from machine import Pin, PWM
  22.  
  23. #ENTER YOUR WIFI CREDENTIALS
  24. SSID = "YOUR WIFI"
  25. PASSWORD = "YOUR PASSWORD"
  26.  
  27. PORT = 1234
  28.  
  29. PIN_JAW    = 16
  30. PIN_ARM_L  = 17 #fwd_rev
  31. PIN_ARM_R  = 18 #up_dwn
  32. PIN_BASE   = 19 #bottom
  33.  
  34. def attach_servo(pin_num):
  35.     pwm = PWM(Pin(pin_num))
  36.     pwm.freq(50)
  37.     return pwm
  38.  
  39. def angle_to_duty(angle):
  40.     pulse_us = 500 + (angle / 180) * 1900
  41.     return int((pulse_us / 20000) * 65535)
  42.  
  43. def smooth_move(servo, current_angle, target_angle, step=1, delay_ms=10):
  44.     if servo is None:
  45.         return target_angle
  46.     direction = 1 if target_angle > current_angle else -1
  47.     for angle in range(current_angle, target_angle + direction, direction * step):
  48.         servo.duty_u16(angle_to_duty(angle))
  49.         time.sleep_ms(delay_ms)
  50.     return target_angle
  51.  
  52. servoJaw = attach_servo(PIN_JAW)
  53. servoBase = attach_servo(PIN_BASE)
  54. servoArmL = None
  55. servoArmR = None
  56. activeArmServo = None
  57.  
  58. angleJaw  = 80
  59. angleArmL = 45
  60. angleArmR = 90
  61. angleBase = 90
  62.  
  63. servoJaw.duty_u16(angle_to_duty(angleJaw))
  64. servoBase.duty_u16(angle_to_duty(angleBase))
  65.  
  66. last_update = {
  67.     "Jaw": time.ticks_ms(),
  68.     "ArmL": time.ticks_ms(),
  69.     "ArmR": time.ticks_ms(),
  70.     "Base": time.ticks_ms()
  71. }
  72. TIMEOUT_MS = 5000
  73.  
  74. def connect_wifi():
  75.     wlan = network.WLAN(network.STA_IF)
  76.     wlan.active(True)
  77.     wlan.connect(SSID, PASSWORD)
  78.     print("📡 Connecting to Wi-Fi...")
  79.     while not wlan.isconnected():
  80.         time.sleep(1)
  81.         print(".", end="")
  82.     ip = wlan.ifconfig()[0]
  83.     print(f"\n✅ Connected! IP: {ip}")
  84.     return ip
  85.  
  86. ip_address = connect_wifi()
  87.  
  88. server = socket.socket()
  89. server.bind(('', PORT))
  90. server.listen(1)
  91. print(f"🧠 Listening on {ip_address}:{PORT}")
  92.  
  93. while True:
  94.     client, addr = server.accept()
  95.     ip_address = network.WLAN(network.STA_IF).ifconfig()[0]  # Refresh IP
  96.     print(f"🎮 Controller connected from {addr}")
  97.     print(f"🌐 Current IP: {ip_address}")
  98.  
  99.     try:
  100.         while True:
  101.             data = client.recv(1024)
  102.             if not data:
  103.                 break
  104.  
  105.             input_str = data.decode().strip()
  106.             messages = input_str.split('\n')
  107.  
  108.             for msg in messages:
  109.                 if msg.startswith("AXIS:"):
  110.                     parts = msg.split(":")
  111.                     if len(parts) != 3:
  112.                         print(f"⚠️ Malformed input: {msg}")
  113.                         continue
  114.  
  115.                     axis = parts[1]
  116.                     try:
  117.                         val = int(parts[2])
  118.                     except ValueError:
  119.                         print(f"⚠️ Invalid value: {parts[2]}")
  120.                         continue
  121.  
  122.                     val = max(min(val, 32767), -32767)
  123.  
  124.                     if axis == "ABS_RX":
  125.                         newJaw = int(((val + 32767) / 65534) * 20 + 70)
  126.                         if newJaw != angleJaw:
  127.                             if servoJaw is None:
  128.                                 servoJaw = attach_servo(PIN_JAW)
  129.                                 print("🔌 Jaw reattached")
  130.                             angleJaw = smooth_move(servoJaw, angleJaw, newJaw)
  131.                             last_update["Jaw"] = time.ticks_ms()
  132.                             print(f"🦷 Jaw → {angleJaw}°")
  133.  
  134.                     elif axis == "ABS_X":
  135.                         newArmL = int(((val + 32767) / 65534) * 90)
  136.                         if newArmL != angleArmL:
  137.                             if activeArmServo == "R" and servoArmR:
  138.                                 servoArmR.duty_u16(0)
  139.                                 servoArmR.deinit()
  140.                                 pin = Pin(PIN_ARM_R, Pin.OUT)
  141.                                 pin.value(0)
  142.                                 servoArmR = None
  143.                                 print("🛑 Left Arm deinitialized")
  144.  
  145.                             if servoArmL is None:
  146.                                 servoArmL = attach_servo(PIN_ARM_L)
  147.                                 print("🔌 Right Arm reattached")
  148.  
  149.                             angleArmL = smooth_move(servoArmL, angleArmL, newArmL)
  150.                             activeArmServo = "L"
  151.                             last_update["ArmL"] = time.ticks_ms()
  152.                             print(f"🦿 Right Arm → {angleArmL}°")
  153.  
  154.                     elif axis == "ABS_Y":
  155.                         newArmR = int(180 - ((val + 32767) / 65534) * 180)
  156.                         if newArmR != angleArmR:
  157.                             if activeArmServo == "L" and servoArmL:
  158.                                 servoArmL.duty_u16(0)
  159.                                 servoArmL.deinit()
  160.                                 pin = Pin(PIN_ARM_L, Pin.OUT)
  161.                                 pin.value(0)
  162.                                 servoArmL = None
  163.                                 print("🛑 Right Arm deinitialized")
  164.  
  165.                             if servoArmR is None:
  166.                                 servoArmR = attach_servo(PIN_ARM_R)
  167.                                 print("🔌 Left Arm reattached")
  168.  
  169.                             angleArmR = smooth_move(servoArmR, angleArmR, newArmR)
  170.                             activeArmServo = "R"
  171.                             last_update["ArmR"] = time.ticks_ms()
  172.                             print(f"🦾 Left Arm → {angleArmR}°")
  173.  
  174.                     elif axis == "ABS_RY":
  175.                         newBase = int(((val + 32767) / 65534) * 180)
  176.                         if newBase != angleBase:
  177.                             if servoBase is None:
  178.                                 servoBase = attach_servo(PIN_BASE)
  179.                                 print("🔌 Base reattached")
  180.                             angleBase = smooth_move(servoBase, angleBase, newBase)
  181.                             last_update["Base"] = time.ticks_ms()
  182.                             print(f"🔄 Base → {angleBase}°")
  183.  
  184.             now = time.ticks_ms()
  185.  
  186.             if time.ticks_diff(now, last_update["Jaw"]) > TIMEOUT_MS and servoJaw:
  187.                 servoJaw.duty_u16(0)
  188.                 servoJaw.deinit()
  189.                 pin = Pin(PIN_JAW, Pin.OUT)
  190.                 pin.value(0)
  191.                 servoJaw = None
  192.                 print("🛑 Jaw servo deinitialized due to inactivity")
  193.  
  194.             if time.ticks_diff(now, last_update["ArmL"]) > TIMEOUT_MS and servoArmL:
  195.                 servoArmL.duty_u16(0)
  196.                 servoArmL.deinit()
  197.                 pin = Pin(PIN_ARM_L, Pin.OUT)
  198.                 pin.value(0)
  199.                 servoArmL = None
  200.                 print("🛑 Right Arm servo deinitialized due to inactivity")
  201.  
  202.             if time.ticks_diff(now, last_update["ArmR"]) > TIMEOUT_MS and servoArmR:
  203.                 servoArmR.duty_u16(0)
  204.                 servoArmR.deinit()
  205.                 pin = Pin(PIN_ARM_R, Pin.OUT)
  206.                 pin.value(0)
  207.                 servoArmR = None
  208.                 print("🛑 Left Arm servo deinitialized due to inactivity")
  209.  
  210.             if time.ticks_diff(now, last_update["Base"]) > TIMEOUT_MS and servoBase:
  211.                 servoBase.duty_u16(0)
  212.                 servoBase.deinit()
  213.                 pin = Pin(PIN_BASE, Pin.OUT)
  214.                 pin.value(0)
  215.                 servoBase = None
  216.                 print("🛑 Base servo deinitialized due to inactivity")
  217.  
  218.     except Exception as e:
  219.         print(f"⚠️ Error: {e}")
  220.     finally:
  221.         client.close()
  222.         print("⚡ Controller disconnected")
  223.  
  224.  
  225.  
Advertisement
Add Comment
Please, Sign In to add comment