Python দিয়ে আর্ডুইনোর সাথে সিরিয়াল কমিউনেকশন, আর্ডুইনো সিরিয়াল ইভেন্ট পরিচিতি ও PyQt4 দিয়ে ডেস্কটপ অ
Last updated
Last updated
পাইথনে সিরিয়াল কম্যুনিকেশনের জন্য আমরা ব্যবহার করব পাইথনের PySerial
লাইব্রেরি।
পাইথন জানতে হবে - না জানলে
পাইথন ২.৭ - আপনার পিসিতে পাইথন না সেটাপ দেয়া থাকলে থেকে দেখে নিন।
একটি আর্ডুইনো বোর্ড
নেট কানেকশন বা PySerial লাইব্রেরি
PyQt4
[optional]
পাইসিরিয়াল সেটাপ দেব আমরা pip
পাইথন প্যাকেজ ইন্সটলারের মাধ্যমে। আপনার পিসিতে যদি pip
ইন্সটলড না করা থাকে তাহলে দেখুন।
পাইসিরিয়াল ইন্সটল করার জন্য টার্মিনাল(লিনাক্স) বা কমান্ড প্রম্পট (উইন্ডোজ) ওপেন করে নিচের কমান্ডটি রান করুন
pip install pyserial
কিছুক্ষণের মধ্যে পাইসিরিয়াল সেটাপ হয়ে যাবে।
পাইথন দিয়ে সিরিয়াল কম্যুনিকেশন অন্যান্য ল্যাঙ্গুয়েজ দিয়ে কমিউনিকেট করার মতই। নিচে আর্ডুইনোর কোডটা দেখা যাক,
আগের আর্ডুইনো পর্বগুলি দেখে নিন।
void loop() {}
আমরা সিরিয়াল কম্যুনিকেশন হ্যান্ডেল করব serialEvent()
নামক ইন্টারাপ্ট হ্যান্ডলার ফাংশন দিয়ে। লুপে কিছু না লিখলেও এই ইন্টারাপ্ট ফাংশনের মাধ্যমে আমরা কিভাবে কম্যুনিকেট করব সেটাই দেখানো মূখ্য উদ্দেশ্য।
void serialEvent(){
সিরিয়াল ইভেন্ট ফাংশনের শুরু। এটা একটা ইন্টারাপ্ট ফাংশন। মাইক্রোকন্ট্রোলার/মাইক্রোপ্রসেসরে ইন্টারাপ্ট থাকেই। ইন্টারাপ্ট আসলে এমন ধরণের সিগনাল যেটার প্রায়োরিটি নরমাল ফাংশনের চেয়ে বেশি।
একটা উদাহরণের মাধ্যমে ব্যাখ্যা করা যাক, ধরুন আপনি বই পড়ছেন এবং পাশে আপনার মোবাইল। এখন যদি মোবাইলে কোন Call আসে তাহলে মোবাইলটি বেজে উঠবে, সাধারণত যে কেউ বই পড়া বন্ধ করে মোবাইলে কথা সেরে তারপর বই পড়বে।
এখানে মোবাইলের রিংয়িং কে আমরা Interrupt Signal
বলতে পারি এবং আপনি যে কথা বললেন সেটাকে আমরা Interrupt Function
বলতে পারি।
ঠিক তেমনই, আর্ডুইনোতে সিরিয়ালে কোন ডেটা আসে তাহলে ইন্টারাপ্ট টেবিলের প্রায়োরিটি লিস্ট অনুযায়ী serialEvent()
ফাংশনটি অটো কল হয়।
String command = Serial.readStringUntil('\n')
এর অর্থ হচ্ছে যতক্ষণ না পর্যন্ত আর্ডুইনো \n
ক্যারেক্টারটি ডিটেক্ট করছে, ততক্ষণ পর্যন্ত সে সিরিয়ালের ডেটা রিড করে command
নামের String
ভ্যারিয়েবলে রাখছে।
if (command.equals("on")) ...
equals
হল String
ক্লাসের একটা ফাংশন। যেহেতু command
হল String
ক্লাসের অবজেক্ট তাই আমরা command.equals(another_string)
এভাবে কল করতে পারি।
equals
ফাংশনের ইনপুট প্যারামিটার হল আরেকটি স্ট্রিং, যেটার সাথে তুলনা করা হবে। equals
এর রিটার্ন টাইপ boolean
। অর্থাৎ, দুইটা স্ট্রিংয়ের প্রতিটি ক্যারেক্টার যদি সমান হয় তাহলে equals
রিটার্ন করে true
অথবা এটা false
রিটার্ন করবে।
digitalWrite ... ; Serial.println ...
যদি আর্ডুইনো on
স্ট্রিং টা রিসিভ করে তাহলে সে 13 no LED
অন করবে এবং একটা রিপ্লাই দিয়ে দেবে যে LED
অন হয়েছে।
আর যদি off
রিসিভ করে.... এটা আশা করি বলা লাগবে না। :P
আমরা এতক্ষণ আর্ডুইনো প্রোগ্রাম নিয়ে আলোচনা করলাম, এবার একটু পাইথন প্রোগ্রাম দেখা যাক।
import serial
লাইব্রেরি ইম্পোর্ট করলাম।
arduino = serial.Serial(com_port)
সিরিয়াল ক্লাস দিয়ে Serial
টাইপ অবজেক্ট তৈরি করলাম ও ইনপুট প্যারামিটার দিলাম আমার পিসির যে পোর্টে Arduino
কানেক্টেড হয়েছে। অর্থাৎ আমার পিসিতে কানেক্ট হয়েছে COM3
তে, আপনার পিসি যদি উইন্ডোজ হয় তাহলে নতুন আর্ডুইনো IDE ওপেন করেই দেখতে পারেন, অথবা Device manager > Ports
এ গেলেও দেখতে পাবেন (আর্ডুইনো অবশ্যই কানেক্টেড থাকতে হবে)
arduino.close()
অনেক সময় আর্ডুইনো পোর্ট কারণে অকারণে বিজি থাকে, সেটা বিজি থাকুক কি না থাকুক, তাকে ফ্রি করার জন্য আমরা ফাংশনটা কল করলাম। এতে করে পোর্ট যদি বিজিও থাকে তাহলেও সেটা ফ্রি হয়ে যাবে। Safety check হিসেবেও নেয়া যেতে পারে।
arduino.baudrate = 9600
আর্ডুইনো কোডে নিশ্চয়ই দেখেছেন, আমি বডরেট 9600
দিয়েছি, তাই পাইথনেও একই স্পিড রাখলাম।
if not ...
যদি আর্ডুইনো পোর্ট ওপেন না থাকে তাহলে ওপেন করব। (ডেটা রিড রাইটের জন্য)
while True:
আমরা বেশ কিছু স্ট্রিং পাঠাতে চাচ্ছি তাই ইনফিনিট লুপ দিয়ে ভেতরের প্রোগ্রামটা লিখছি।
command = raw_input('Enter command: ')
বেসিক পাইথন জানলে এটা অবশ্যই জানবেন, না জানলে বলি, কনসোল থেকে ইনপুট নেওয়ার জন্যই এই স্টেটমেন্ট।
arduino.write(command + '\n')
সিরিয়ালে ডেটা রাইট করার জন্য আমরা write
ফাংশনটি কল করেছি। আর ভিতরে কনসোলে ইনপুট দেয়া স্ট্রিংটি পাঠাচ্ছি।
শেষে + \n
দেওয়ার উদ্দেশ্য হল, আর্ডুইনো সাইডে কোড লেখার সময় আমরা শর্ত দিয়েছিলাম readStringUntil('\n')
, তাই স্ট্রিং পাঠানোর আগে একটা 'ডেলিমিটার' জুড়ে দিচ্ছি। আপনি \n
এর বদলে ;, -, +
যেটা খুশি সেটাই বসাতে পারবেন, শর্ত হল পাইথন থেকে স্ট্রিং পাঠানোর সময় যেন ডেলিমিটারটা স্ট্রিংয়ের শেষে থাকে এবং আর্ডুইনোতে readStringUntil(delimiter)
ডেলিমিটার একই থাকে।
print arduino.readline()
আর্ডুইনো যদি কোন কিছু পাঠায় তাহলে সেটা প্রিন্ট হবে।
এখানে আর্ডুইনো সাইডের কোড উপরের দেওয়া কোডটাই ব্যবহার করা হয়েছে।
PySerial
আপনার যদি PyQt4 সম্পর্কে ধারণা থাকে তাহলে এই কোড মডিফাই করে খুব সহজেই আপনার কাজের জন্য পাইথন দিয়ে আর্ডুইনোর গুই তৈরি করতে পারবেন। ।
এখানে বেসিক কিছু আইডিয়া দেয়া হল, ভালভাবে জানতে দেখুন ।