# র‌্যাস্পবেরি পাই দিয়ে জিপিএস ডেটা পড়া এই পাঠের এই অংশে, আপনি আপনার র‌্যাস্পবেরি পাই-তে একটি জিপিএস সেন্সর যোগ করবেন এবং এর থেকে ডেটা পড়বেন। ## হার্ডওয়্যার র‌্যাস্পবেরি পাই-এর জন্য একটি জিপিএস সেন্সর প্রয়োজন। আপনি যে সেন্সরটি ব্যবহার করবেন তা হলো [Grove GPS Air530 সেন্সর](https://www.seeedstudio.com/Grove-GPS-Air530-p-4584.html)। এই সেন্সরটি একাধিক জিপিএস সিস্টেমের সাথে সংযোগ স্থাপন করতে পারে দ্রুত এবং সঠিক ডেটা পাওয়ার জন্য। সেন্সরটি দুটি অংশে বিভক্ত - সেন্সরের মূল ইলেকট্রনিক্স এবং একটি বাহ্যিক অ্যান্টেনা যা স্যাটেলাইট থেকে রেডিও তরঙ্গ গ্রহণ করতে একটি পাতলা তারের মাধ্যমে সংযুক্ত। এটি একটি UART সেন্সর, তাই এটি UART এর মাধ্যমে জিপিএস ডেটা পাঠায়। ## জিপিএস সেন্সর সংযুক্ত করা Grove GPS সেন্সরটি র‌্যাস্পবেরি পাই-এর সাথে সংযুক্ত করা যেতে পারে। ### কাজ - জিপিএস সেন্সর সংযুক্ত করা জিপিএস সেন্সরটি সংযুক্ত করুন। ![একটি Grove GPS সেন্সর](../../../../../translated_images/grove-gps-sensor.247943bf69b03f0d1820ef6ed10c587f9b650e8db55b936851c92412180bd3e2.bn.png) 1. Grove কেবলের এক প্রান্ত জিপিএস সেন্সরের সকেটে প্রবেশ করান। এটি শুধুমাত্র একটি নির্দিষ্ট দিকেই প্রবেশ করবে। 1. র‌্যাস্পবেরি পাই বন্ধ অবস্থায়, Grove কেবলের অন্য প্রান্তটি Grove Base হ্যাটের **UART** চিহ্নিত সকেটে সংযুক্ত করুন। এই সকেটটি মাঝের সারিতে, SD কার্ড স্লটের কাছাকাছি পাশে অবস্থিত, USB পোর্ট এবং ইথারনেট সকেটের বিপরীত দিকে। ![UART সকেটে সংযুক্ত Grove GPS সেন্সর](../../../../../translated_images/pi-gps-sensor.1f99ee2b2f6528915047ec78967bd362e0e4ee0ed594368a3837b9cf9cdaca64.bn.png) 1. জিপিএস সেন্সরটি এমনভাবে স্থাপন করুন যাতে সংযুক্ত অ্যান্টেনাটি আকাশের দিকে দৃশ্যমান থাকে - আদর্শভাবে একটি খোলা জানালার পাশে বা বাইরে। অ্যান্টেনার সামনে কিছু না থাকলে পরিষ্কার সংকেত পাওয়া সহজ হয়। ## জিপিএস সেন্সর প্রোগ্রাম করা এখন র‌্যাস্পবেরি পাই-কে সংযুক্ত জিপিএস সেন্সরটি ব্যবহার করার জন্য প্রোগ্রাম করা যাবে। ### কাজ - জিপিএস সেন্সর প্রোগ্রাম করা ডিভাইসটি প্রোগ্রাম করুন। 1. পাই চালু করুন এবং এটি বুট হওয়া পর্যন্ত অপেক্ষা করুন। 1. জিপিএস সেন্সরের দুটি LED আছে - একটি নীল LED যা ডেটা প্রেরণের সময় ঝলকায় এবং একটি সবুজ LED যা স্যাটেলাইট থেকে ডেটা গ্রহণ করার সময় প্রতি সেকেন্ডে একবার ঝলকায়। পাই চালু করার সময় নিশ্চিত করুন যে নীল LED ঝলকাচ্ছে। কয়েক মিনিট পর সবুজ LED ঝলকাবে - যদি না ঝলকায়, তাহলে অ্যান্টেনার অবস্থান পরিবর্তন করতে হতে পারে। 1. VS Code চালু করুন, হয় সরাসরি পাই-তে অথবা Remote SSH এক্সটেনশনের মাধ্যমে সংযোগ করে। > ⚠️ [পাঠ ১-এ VS Code সেটআপ এবং চালু করার নির্দেশনা প্রয়োজন হলে এখানে দেখুন](../../../1-getting-started/lessons/1-introduction-to-iot/pi.md)। 1. নতুন র‌্যাস্পবেরি পাই মডেলগুলোর ক্ষেত্রে, যেগুলো ব্লুটুথ সমর্থন করে, ব্লুটুথের জন্য ব্যবহৃত সিরিয়াল পোর্ট এবং Grove UART পোর্টের জন্য ব্যবহৃত সিরিয়াল পোর্টের মধ্যে একটি দ্বন্দ্ব রয়েছে। এটি ঠিক করতে নিম্নলিখিত কাজগুলো করুন: 1. VS Code টার্মিনাল থেকে, `nano` ব্যবহার করে `/boot/config.txt` ফাইলটি সম্পাদনা করুন। এটি একটি বিল্ট-ইন টার্মিনাল টেক্সট এডিটর। কমান্ডটি হলো: ```sh sudo nano /boot/config.txt ``` > এই ফাইলটি VS Code দিয়ে সম্পাদনা করা যাবে না কারণ এটি `sudo` অনুমতি, অর্থাৎ উচ্চতর অনুমতি, প্রয়োজন। VS Code এই অনুমতিতে চলে না। 1. কার্সর কী ব্যবহার করে ফাইলের শেষে যান। তারপর নিচের কোডটি কপি করে ফাইলের শেষে পেস্ট করুন: ```ini dtoverlay=pi3-miniuart-bt dtoverlay=pi3-disable-bt enable_uart=1 ``` আপনার ডিভাইসের জন্য সাধারণ কিবোর্ড শর্টকাট ব্যবহার করে পেস্ট করুন (`Windows, Linux বা Raspberry Pi OS-এ Ctrl+v`, macOS-এ `Cmd+v`)। 1. এই ফাইলটি সংরক্ষণ করুন এবং `Ctrl+x` চাপুন। পরিবর্তিত বাফার সংরক্ষণ করতে চাইলে `y` চাপুন, তারপর `/boot/config.txt` ওভাররাইট করতে নিশ্চিত করতে `enter` চাপুন। > যদি কোনো ভুল করেন, তাহলে সংরক্ষণ না করেই বেরিয়ে আসুন এবং এই ধাপগুলো পুনরায় করুন। 1. `nano` দিয়ে `/boot/cmdline.txt` ফাইলটি সম্পাদনা করুন। কমান্ডটি হলো: ```sh sudo nano /boot/cmdline.txt ``` 1. এই ফাইলে স্পেস দিয়ে পৃথক করা অনেক কী/মান জোড়া রয়েছে। `console` কী-এর জন্য কোনো কী/মান জোড়া থাকলে সেগুলো মুছে ফেলুন। এগুলো সম্ভবত এরকম দেখাবে: ```output console=serial0,115200 console=tty1 ``` কার্সর কী ব্যবহার করে এই এন্ট্রিগুলোতে যান এবং `del` বা `backspace` কী ব্যবহার করে মুছে ফেলুন। উদাহরণস্বরূপ, যদি আপনার মূল ফাইলটি এরকম দেখায়: ```output console=serial0,115200 console=tty1 root=PARTUUID=058e2867-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait ``` তাহলে নতুন সংস্করণটি হবে: ```output root=PARTUUID=058e2867-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait ``` 1. উপরের ধাপগুলো অনুসরণ করে এই ফাইলটি সংরক্ষণ করুন এবং `nano` থেকে বেরিয়ে আসুন। 1. আপনার পাই রিবুট করুন, তারপর পাই রিবুট হওয়ার পর VS Code-এ পুনরায় সংযোগ করুন। 1. টার্মিনাল থেকে, `pi` ব্যবহারকারীর হোম ডিরেক্টরিতে `gps-sensor` নামে একটি নতুন ফোল্ডার তৈরি করুন। এই ফোল্ডারে `app.py` নামে একটি ফাইল তৈরি করুন। 1. এই ফোল্ডারটি VS Code-এ খুলুন। 1. GPS মডিউলটি সিরিয়াল পোর্টের মাধ্যমে UART ডেটা পাঠায়। Python কোড থেকে সিরিয়াল পোর্টের সাথে যোগাযোগ করতে `pyserial` Pip প্যাকেজটি ইনস্টল করুন: ```sh pip3 install pyserial ``` 1. আপনার `app.py` ফাইলে নিচের কোডটি যোগ করুন: ```python import time import serial serial = serial.Serial('/dev/ttyAMA0', 9600, timeout=1) serial.reset_input_buffer() serial.flush() def print_gps_data(line): print(line.rstrip()) while True: line = serial.readline().decode('utf-8') while len(line) > 0: print_gps_data(line) line = serial.readline().decode('utf-8') time.sleep(1) ``` এই কোডটি `pyserial` Pip প্যাকেজ থেকে `serial` মডিউলটি ইমপোর্ট করে। এটি `/dev/ttyAMA0` সিরিয়াল পোর্টের সাথে সংযোগ স্থাপন করে - এটি Grove Pi Base Hat-এর UART পোর্টের সিরিয়াল পোর্টের ঠিকানা। এটি এই সিরিয়াল সংযোগ থেকে বিদ্যমান ডেটা মুছে ফেলে। এরপর একটি `print_gps_data` নামের ফাংশন সংজ্ঞায়িত করা হয় যা কনসোলে প্রাপ্ত লাইনের ডেটা প্রিন্ট করে। এরপর কোডটি অনন্তকাল ধরে লুপ করে, প্রতিটি লুপে সিরিয়াল পোর্ট থেকে যতটা সম্ভব লাইন পড়ে। এটি প্রতিটি লাইনের জন্য `print_gps_data` ফাংশনটি কল করে। সমস্ত ডেটা পড়ার পর, লুপটি ১ সেকেন্ডের জন্য ঘুমায়, তারপর আবার চেষ্টা করে। 1. এই কোডটি চালান। আপনি জিপিএস সেন্সরের কাঁচা আউটপুট দেখতে পাবেন, যা এরকম কিছু হতে পারে: ```output $GNGGA,020604.001,4738.538654,N,12208.341758,W,1,3,,164.7,M,-17.1,M,,*67 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $BDGSA,A,1,,,,,,,,,,,,,,,*0F $GPGSV,1,1,00*79 $BDGSV,1,1,00*68 ``` > যদি কোডটি বন্ধ করে পুনরায় চালানোর সময় নিচের যেকোনো ত্রুটি পান, তাহলে আপনার while লুপে একটি `try - except` ব্লক যোগ করুন। ```output UnicodeDecodeError: 'utf-8' codec can't decode byte 0x93 in position 0: invalid start byte UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf1 in position 0: invalid continuation byte ``` ```python while True: try: line = serial.readline().decode('utf-8') while len(line) > 0: print_gps_data() line = serial.readline().decode('utf-8') # There's a random chance the first byte being read is part way through a character. # Read another full line and continue. except UnicodeDecodeError: line = serial.readline().decode('utf-8') time.sleep(1) ``` > 💁 আপনি এই কোডটি [code-gps/pi](../../../../../3-transport/lessons/1-location-tracking/code-gps/pi) ফোল্ডারে খুঁজে পেতে পারেন। 😀 আপনার জিপিএস সেন্সর প্রোগ্রাম সফল হয়েছে! --- **অস্বীকৃতি**: এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা তার জন্য দায়ী থাকব না।