#include <Servo.h>
Servo servo;
const int motorPin = 8;
const int trigPin = 6;
const int echoPin = 7;
bool autoMode = false;
void setup() {
Serial.begin(9600);
pinMode(motorPin, OUTPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
servo.attach(9);
servo.write(90); // центр
}
long getDistance() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
long distance = duration * 0.034 / 2;
return distance;
}
void loop() {
if (Serial.available()) {
String cmd = Serial.readStringUntil('\n');
cmd.trim();
if (cmd == "FORWARD")
digitalWrite(motorPin, HIGH);
if (cmd == "STOP")
digitalWrite(motorPin, LOW);
if (cmd == "LEFT")
servo.write(45);
if (cmd == "RIGHT")
servo.write(135);
if (cmd == "CENTER")
servo.write(90);
if (cmd == "AUTO")
autoMode = true;
if (cmd == "MANUAL")
autoMode = false;
}
if (autoMode) {
long distance = getDistance();
Serial.print("DIST:");
Serial.println(distance);
if (distance < 15) {
digitalWrite(motorPin, LOW);
}
delay(300);
}
}
import tkinter as tk
import serial
arduino = serial.Serial("COM3", 9600)
root = tk.Tk()
root.title("Управление машиной")
root.geometry("350x300")
distance_label = tk.Label(
root,
text="Расстояние: --- см",
font=("Arial", 12)
)
distance_label.pack(pady=10)
mode_label = tk.Label(
root,
text="Режим: Ручной",
font=("Arial", 12)
)
mode_label.pack()
def send(cmd):
arduino.write((cmd + "\n").encode())
def auto_mode():
send("AUTO")
mode_label.config(text="Режим: Автоматический")
forward_btn.config(state="disabled")
stop_btn.config(state="disabled")
left_btn.config(state="disabled")
right_btn.config(state="disabled")
def manual_mode():
send("MANUAL")
mode_label.config(text="Режим: Ручной")
forward_btn.config(state="normal")
stop_btn.config(state="normal")
left_btn.config(state="normal")
right_btn.config(state="normal")
def read_distance():
if arduino.in_waiting:
data = arduino.readline().decode().strip()
if data.startswith("DIST:"):
distance = data.split(":")[1]
distance_label.config(
text=f"Расстояние: {distance} см"
)
root.after(100, read_distance)
forward_btn = tk.Button(
root,
text="ВПЕРЕД",
width=20,
command=lambda: send("FORWARD")
)
forward_btn.pack(pady=5)
stop_btn = tk.Button(
root,
text="СТОП",
width=20,
command=lambda: send("STOP")
)
stop_btn.pack(pady=5)
left_btn = tk.Button(
root,
text="ВЛЕВО",
width=20,
command=lambda: send("LEFT")
)
left_btn.pack(pady=5)
right_btn = tk.Button(
root,
text="ВПРАВО",
width=20,
command=lambda: send("RIGHT")
)
right_btn.pack(pady=5)
tk.Button(
root,
text="АВТО РЕЖИМ",
width=20,
command=auto_mode
).pack(pady=10)
tk.Button(
root,
text="РУЧНОЙ РЕЖИМ",
width=20,
command=manual_mode
).pack()
read_distance()
root.mainloop()