from machine import Pin, PWM
import time
# ---------------- AUTHENTICATION ----------------
authorized = False
def authenticate_user():
global authorized
print("Enter username:")
try:
username = input().strip()
except:
username = ""
if username == "admin":
authorized = True
print("[ACCESS GRANTED]")
else:
authorized = False
print("[ACCESS DENIED]")
# ---------------- PINS ----------------
servo = PWM(Pin(15))
servo.freq(50)
button = Pin(16, Pin.IN, Pin.PULL_UP) # Attack
dir_btn = Pin(18, Pin.IN, Pin.PULL_UP) # Direction
speed_btn = Pin(19, Pin.IN, Pin.PULL_UP) # Speed
led = Pin(17, Pin.OUT)
# ---------------- STATES ----------------
attack_mode = False
fault_detected = False
prev_button_state = 1
prev_dir = 1
prev_speed = 1
direction = 1
speed_delay = 0.05
# ---------------- SERVO ----------------
def set_angle(angle):
duty = int(1638 + (angle / 180) * 8192)
servo.duty_u16(duty)
# ---------------- ATTACK ----------------
def trigger_attack():
global attack_mode
if not attack_mode:
attack_mode = True
print("[ATTACK] Triggered!")
# ---------------- FAULT ----------------
def detect_fault(angle):
global fault_detected
if (angle < 20 or angle > 160) and attack_mode:
fault_detected = True
print("[FAULT] Abnormal servo behavior detected!")
# ---------------- RECOVERY ----------------
def recover():
global attack_mode, fault_detected
print("[RECOVERY] Resetting system...")
led.value(0)
set_angle(90)
time.sleep(1)
attack_mode = False
fault_detected = False
print("[RECOVERY] System restored!")
# ---------------- START AUTH ----------------
authenticate_user()
# ---------------- MAIN LOOP ----------------
while True:
# -------- BUTTON EDGE DETECTION --------
current_state = button.value()
curr_dir = dir_btn.value()
curr_speed = speed_btn.value()
# Attack button
if prev_button_state == 1 and current_state == 0:
trigger_attack()
# 🔐 Direction control (protected)
if prev_dir == 1 and curr_dir == 0:
if authorized:
direction *= -1
print("[CONTROL] Direction:", "Reverse" if direction == -1 else "Forward")
else:
print("[SECURITY] Unauthorized user!")
# 🔐 Speed control (protected)
if prev_speed == 1 and curr_speed == 0:
if authorized:
if speed_delay == 0.05:
speed_delay = 0.01
else:
speed_delay = 0.05
print("[CONTROL] Speed:", "Fast" if speed_delay == 0.01 else "Normal")
else:
print("[SECURITY] Unauthorized user!")
prev_button_state = current_state
prev_dir = curr_dir
prev_speed = curr_speed
# -------- SYSTEM BEHAVIOR --------
if attack_mode:
# LED blinking
led.value(not led.value())
time.sleep(0.1)
# ORIGINAL ATTACK LOGIC
for angle in [3, 23, 67, 19, 56, 170, 116,82]:
set_angle(angle)
print("[ATTACK MODE] Angle:", angle)
detect_fault(angle)
time.sleep(0.2)
else:
led.value(0)
# Normal motion with direction + speed
if direction == 1:
up_range = range(60, 120, 5)
down_range = range(120, 60, -5)
else:
up_range = range(60, 0, -5)
down_range = range(0, 60, 5)
for angle in up_range:
set_angle(angle)
print("[NORMAL] Angle:", angle)
time.sleep(speed_delay)
for angle in down_range:
set_angle(angle)
print("[NORMAL] Angle:", angle)
time.sleep(speed_delay)
# -------- FAULT HANDLING --------
if fault_detected:
recover()
time.sleep(0.05)