{"id":835,"date":"2026-06-12T15:48:46","date_gmt":"2026-06-12T07:48:46","guid":{"rendered":"https:\/\/projectleon.net\/make\/blog\/raspberry-pi-ground-control-station-ugv-map-gcs-farsi\/"},"modified":"2026-06-12T20:37:33","modified_gmt":"2026-06-12T12:37:33","slug":"raspberry-pi-ground-control-station-ugv-map-gcs-farsi","status":"publish","type":"post","link":"https:\/\/projectleon.net\/make\/blog\/raspberry-pi-ground-control-station-ugv-map-gcs-farsi\/","title":{"rendered":"\u0633\u0627\u062e\u062a Ground Control Station \u0628\u0627 Raspberry Pi \u0648 \u0646\u0642\u0634\u0647 \u2014 GCS \u0634\u062e\u0635\u06cc UGV (\u0641\u0627\u0631\u0633\u06cc)"},"content":{"rendered":"<div class='hero-image-container' style='margin-bottom:28px;border-radius:14px;overflow:hidden;box-shadow:0 4px 18px rgba(0,0,0,0.08)'>\n<img src='' alt='Ground Control Station Raspberry Pi \u0646\u0642\u0634\u0647 UGV' style='width:100%;height:auto;display:block' loading='eager'\/>\n<\/div>\n<div class='beginner-intro' style='background:#f0f7ff;border-right:4px solid #2e5fb6;padding:16px 20px;border-radius:10px;margin-bottom:22px'>\n<h2 style='margin-top:0'>GCS \u0686\u06cc\u0633\u062a \u0648 \u0686\u0631\u0627 \u0628\u0647 \u0622\u0646 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u0645\u061f<\/h2>\n<p><strong>GCS (Ground Control Station)<\/strong> \u0645\u0631\u06a9\u0632 \u06a9\u0646\u062a\u0631\u0644 \u0632\u0645\u06cc\u0646\u06cc \u0627\u0633\u062a \u2014 \u0645\u062b\u0644 \u06a9\u0646\u062a\u0631\u0644 \u067e\u0631\u0648\u0627\u0632 \u06cc\u06a9 \u0641\u0631\u0648\u062f\u06af\u0627\u0647 \u0627\u0645\u0627 \u0628\u0631\u0627\u06cc UGV \u0634\u0645\u0627. \u06cc\u06a9 GCS \u062e\u0648\u0628 \u0646\u0642\u0634\u0647 \u0646\u0634\u0627\u0646 \u0645\u06cc\u200c\u062f\u0647\u062f\u060c \u0645\u0648\u0642\u0639\u06cc\u062a UGV \u0631\u0627 \u0622\u067e\u062f\u06cc\u062a \u0645\u06cc\u200c\u06a9\u0646\u062f\u060c Waypoint \u0645\u06cc\u200c\u06af\u0630\u0627\u0631\u06cc\u060c \u062a\u0644\u0647\u200c\u0645\u062a\u0631\u06cc \u0631\u0627 \u062b\u0628\u062a \u0645\u06cc\u200c\u06a9\u0646\u062f \u0648 \u0647\u0634\u062f\u0627\u0631 \u0645\u06cc\u200c\u062f\u0647\u062f. \u0645\u0627 \u0627\u06cc\u0646 \u0633\u06cc\u0633\u062a\u0645 \u0631\u0627 \u0628\u0627 Raspberry Pi 4 \u0648 \u06cc\u06a9 \u0635\u0641\u062d\u0647 \u06f7 \u0627\u06cc\u0646\u0686 \u0645\u06cc\u200c\u0633\u0627\u0632\u06cc\u0645 \u2014 \u0642\u0627\u0628\u0644 \u062d\u0645\u0644 \u062f\u0631 \u0635\u062d\u0631\u0627\u060c \u0628\u062f\u0648\u0646 \u0646\u06cc\u0627\u0632 \u0628\u0647 \u0644\u067e\u200c\u062a\u0627\u067e.<\/p>\n<\/div>\n<div style='background:#fff8e1;border:1px solid #ffd54f;border-radius:10px;padding:16px;margin-bottom:22px'>\n<h3 style='margin-top:0'>&#x1f6e0;&#xfe0f; \u06a9\u0627\u0631\u062a \u067e\u0631\u0648\u0698\u0647<\/h3>\n<table style='width:100%;border-collapse:collapse'>\n<tr>\n<td style='padding:6px;font-weight:bold;width:40%'>BOM<\/td>\n<td style='padding:6px'>Raspberry Pi 4 2GB + \u0646\u0645\u0627\u06cc\u0634\u06af\u0631 \u06f7&#8221; + Ra-02 LoRa + \u0628\u0627\u062a\u0631\u06cc 20000mAh<\/td>\n<\/tr>\n<tr style='background:#fffde7'>\n<td style='padding:6px;font-weight:bold'>\u0628\u0648\u062f\u062c\u0647<\/td>\n<td style='padding:6px'>~\u06f3\u2013\u06f4M \u062a\u0648\u0645\u0627\u0646<\/td>\n<\/tr>\n<tr>\n<td style='padding:6px;font-weight:bold'>\u0646\u0631\u0645\u200c\u0627\u0641\u0632\u0627\u0631<\/td>\n<td style='padding:6px'>Python + Tkinter + folium \u0628\u0631\u0627\u06cc \u0646\u0642\u0634\u0647<\/td>\n<\/tr>\n<\/table>\n<\/div>\n<h2>\u06a9\u062f Python \u2014 GCS \u0628\u0627 \u0646\u0642\u0634\u0647 \u0632\u0646\u062f\u0647<\/h2>\n<pre style='background:#1e1e1e;color:#d4d4d4;padding:14px;border-radius:8px;font-size:12px;margin-bottom:18px'><code>import serial, threading, time\nimport tkinter as tk\nfrom tkintermapview import TkinterMapView\n\n# LoRa \u0627\u0632 \u0637\u0631\u06cc\u0642 USB-Serial (Arduino \u06af\u06cc\u0631\u0646\u062f\u0647)\nser = serial.Serial('\/dev\/ttyUSB0', 9600)\n\nclass GCS:\n    def __init__(self):\n        self.root = tk.Tk()\n        self.root.title(\"UGV Ground Control Station\")\n        self.root.geometry(\"800x480\")\n\n        # \u0646\u0642\u0634\u0647\n        self.map = TkinterMapView(self.root, width=600, height=480)\n        self.map.pack(side='left')\n        self.map.set_position(35.7120, 51.4050)\n        self.map.set_zoom(15)\n        self.ugv_marker = self.map.set_marker(35.7120, 51.4050, text=\"UGV\")\n\n        # \u067e\u0627\u0646\u0644 \u0627\u0637\u0644\u0627\u0639\u0627\u062a\n        self.info = tk.Frame(self.root, width=200, bg='#1e1e2e')\n        self.info.pack(side='right', fill='y')\n        self.lbl_pos = tk.Label(self.info, text=\"\u0645\u0648\u0642\u0639\u06cc\u062a:\", bg='#1e1e2e', fg='white', font=('Arial',10))\n        self.lbl_pos.pack(pady=5)\n        self.lbl_bat = tk.Label(self.info, text=\"\u0628\u0627\u062a\u0631\u06cc: --V\", bg='#1e1e2e', fg='#a5d6a7', font=('Arial',12))\n        self.lbl_bat.pack(pady=5)\n\n        # Thread \u0628\u0631\u0627\u06cc \u062f\u0631\u06cc\u0627\u0641\u062a \u062f\u0627\u062f\u0647\n        threading.Thread(target=self.recv_loop, daemon=True).start()\n        self.root.mainloop()\n\n    def recv_loop(self):\n        while True:\n            try:\n                line = ser.readline().decode().strip()\n                # \u0641\u0631\u0645\u062a: T:50,V:11.8,L:35.712500,N:51.405200\n                parts = dict(x.split(':') for x in line.split(','))\n                lat = float(parts.get('L',35.712))\n                lng = float(parts.get('N',51.405))\n                bat = float(parts.get('V',0))\n                self.root.after(0, self.update_ui, lat, lng, bat)\n            except: time.sleep(0.5)\n\n    def update_ui(self, lat, lng, bat):\n        self.ugv_marker.set_position(lat, lng)\n        self.lbl_pos.config(text=f\"lat:{lat:.5f}\\nlng:{lng:.5f}\")\n        self.lbl_bat.config(text=f\"\u0628\u0627\u062a\u0631\u06cc: {bat:.1f}V\")\n\nGCS()<\/code><\/pre>\n<h2>\u0646\u0635\u0628 \u067e\u06cc\u0634\u200c\u0646\u06cc\u0627\u0632\u0647\u0627 \u0631\u0648\u06cc Raspberry Pi<\/h2>\n<pre style='background:#1e1e1e;color:#d4d4d4;padding:12px;border-radius:8px;font-size:12px;margin-bottom:18px'><code>pip3 install tkintermapview pyserial\n# \u0646\u0642\u0634\u0647 \u0622\u0641\u0644\u0627\u06cc\u0646:\npython3 -c \"from tkintermapview import TkinterMapView; m=TkinterMapView(); m.use_offline_database('offline_tiles.db')\"<\/code><\/pre>\n<div style='display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:18px;margin:20px 0'>\n<iframe width='100%' height='280' src='https:\/\/www.youtube.com\/embed\/wYA1yECJxcE' title='Raspberry Pi GCS Map Python tkinter' frameborder='0' allowfullscreen><\/iframe><br \/>\n<iframe width='100%' height='280' src='https:\/\/www.youtube.com\/embed\/oHg5SJYRHA0' title='Python Map Application GPS Tracking' frameborder='0' allowfullscreen><\/iframe>\n<\/div>\n<ul>\n<li><a href='https:\/\/github.com\/TomSchimansky\/TkinterMapView' target='_blank'>TkinterMapView \u2014 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0646\u0642\u0634\u0647 Python<\/a><\/li>\n<li><a href='https:\/\/www.aparat.com\/result\/%D8%B1%D8%B3%D9%BE%D8%A8%D8%B1%DB%8C+%D9%BE%D8%A7%DB%8C+GPS+%D9%86%D9%82%D8%B4%D9%87' target='_blank'>\u0622\u067e\u0627\u0631\u0627\u062a: Raspberry Pi \u0646\u0642\u0634\u0647 GPS<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>\u0622\u0645\u0648\u0632\u0634 \u0633\u0627\u062e\u062a GCS (Ground Control Station) \u0628\u0627 Raspberry Pi 4\u060c \u0635\u0641\u062d\u0647 \u0644\u0645\u0633\u06cc \u06f7 \u0627\u06cc\u0646\u0686\u060c \u0646\u0642\u0634\u0647 OpenStreetMap \u0622\u0641\u0644\u0627\u06cc\u0646\u060c \u062f\u0631\u06cc\u0627\u0641\u062a \u062a\u0644\u0647\u200c\u0645\u062a\u0631\u06cc \u0627\u0632 LoRa \u0648 \u0646\u0645\u0627\u06cc\u0634 \u0645\u0633\u06cc\u0631 UGV \u0631\u0648\u06cc \u0646\u0642\u0634\u0647.<\/p>\n","protected":false},"author":1,"featured_media":895,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"pagelayer_contact_templates":[],"_pagelayer_content":"","footnotes":""},"categories":[19,16],"tags":[303,623,44,624,190,23,48,293,363],"class_list":["post-835","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorials-2","category-ugv","tag-gcs","tag-ground-control-station","tag-lora","tag-openstreetmap","tag-python","tag-raspberry-pi","tag-ugv","tag-293","tag-363"],"_links":{"self":[{"href":"https:\/\/projectleon.net\/make\/wp-json\/wp\/v2\/posts\/835","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/projectleon.net\/make\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/projectleon.net\/make\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/projectleon.net\/make\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/projectleon.net\/make\/wp-json\/wp\/v2\/comments?post=835"}],"version-history":[{"count":1,"href":"https:\/\/projectleon.net\/make\/wp-json\/wp\/v2\/posts\/835\/revisions"}],"predecessor-version":[{"id":896,"href":"https:\/\/projectleon.net\/make\/wp-json\/wp\/v2\/posts\/835\/revisions\/896"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/projectleon.net\/make\/wp-json\/wp\/v2\/media\/895"}],"wp:attachment":[{"href":"https:\/\/projectleon.net\/make\/wp-json\/wp\/v2\/media?parent=835"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/projectleon.net\/make\/wp-json\/wp\/v2\/categories?post=835"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/projectleon.net\/make\/wp-json\/wp\/v2\/tags?post=835"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}