আমার সাথে

Personal Blog of Zonayed
কম্পিউটার সাইন্স জনি-ফাইভ জাভাস্ক্রিপ্ট প্রোগ্রামিং বাংলা

রোবোটিক্স এর শুরু হউক জাভাস্ক্রিপ্ট দিয়েই

মার্চ 31, 2019

আশা করি সবাই ভালো আছেন। জাভাস্ক্রিপ্ট দিন দিন বেশ জনপ্রিয় হয়েই চলছে। আমি আমার জাভাস্ক্রিপ্ট লেখার উপর বলেছিলাম আমরা চাইলে জাভাস্ক্রিপ্ট ব্যবহার করেও রোবোটিক্স এর কাজ করতে পারি। আজকে তারই ধারাবাহিকতায় আমরা খুবই সিম্পল একটা প্রোজেক্টের মাধ্যমে দেখবো কিভাবে আমরা জাভাস্ক্রিপ্ট ব্যবহার করে রোবোটিক্স এ কাজ করা শুরু করতে পারি।

আমরা এজন্যে জাভাস্ক্রিপ্ট এর আইওটি ও রোবোটিক্স প্ল্যাটফর্ম জনি-ফাইভ ইউজ করবো। জনি-ফাইভ নামটি আসলে একটা ফিকশনাল ক্যারেক্টার। এই নামটি এসেছে বহুল জনপ্রিয় “Short Circuit” মুভি থেকে। এই মুভির দুইটা পর্ব আছে, যথাক্রমে Short Circuit(1986) ও Short Circuit 2(1988) নামে। খুব বেশী আগ্রহ থাকলে মুভি দুইটি দেখতেও পারেন। দেখে আমাকে রিভিও জানাবেন।

যাই হউক জনি-ফাইভ আসলে একই সাথে আর্ডুইনো ও রেস্পবেরি-পাইসহ এরকম আরো কিছু ইলেক্টনিক্স প্ল্যাটফর্মে জাভাস্ক্রিপ্ট দিয়ে রোবোটিক্স এর কাজ করার প্ল্যাটফর্ম/ফ্রেমওয়ার্ক। কিন্তু আমরা এই পর্বে বহুল ব্যবহৃত এবং সহজলভ্য আর্ডুইনো বোর্ড দিয়েই সিম্পল একটা প্রোজেক্ট দেখবো। আমাদের এই প্রোজেক্টে আসলে একটা এলইডি লাইট ব্লিঙ্ক করানো, অন-অফ করানো দেখাবো। প্রোজেক্ট সিম্পল হলেও এখান থেকে আপনি আর্ডুইনোর সাথে কিভাবে জাভাস্ক্রিপ্টকে কাজে লাগাবেন সেটার ধারণা পরিষ্কার হয়ে যাবে।

আর্ডুইনোরও অনেকরকমের বোর্ড আছে। জনি-ফাইভ এখান থেকে কোন কোন বোর্ড সাপোর্ট করে তার একটা লিস্ট পাবেন।

আমরা যদিও বেশীরভাগ আর্ডুইনো ইউনো(Arduino Uno) বোর্ড ব্যবহার করি, কিন্তু এই পর্বে আমরা আর্ডুইনো ন্যানো(Arduino Nano) ব্যবহার করবো। বোর্ড অন্য মডেলের হলেও কাজ করার ধরণ অনেকটাই এক। তো আপনার অন্য কোনো বোর্ড থাকলে সেটাতেও চলবে। আপনি জাস্ট স্টেপগুলো ফলো করে যাবেন।

প্রথমেই কমান্ড লাইন ওপেন করে আমরা দেখে নিবো আমাদের নোড জেএস ইন্সটল করা আছে কিনা। কমান্ড লাইন ওপেন করুন এবং লিখুনঃ

node -v

যদি ভার্শন নাম্বার আউটপুট আসে তাহলে বুঝবেন নোড জেএস ইন্সটল আছেঃ

আরো চেক করুনঃ

npm -v

এরকম কিছু আউটপুট পাবেনঃ

আর যদি কোনো এরর আসে তাহলে নোড জেএস এখান থেকে ইন্সটল করে নিন। ইন্টলেশন প্রসেস একদম সিম্পল। তো কোনো ঝামেলা হবে না আশা করি। ইন্সটল করার পর আবার ভার্শন নাম্বার চেক করে শিউর হয়ে নিন নোড জেএস ইন্সটল হয়েছে কিনা।

নোড জেএস তৈরী হয়ে গেলে এবার আপনাকে আর্ডুইনো বোর্ডটাকে একটু সেটাপ করে নিতে হবে। আপনি প্রথমে আপনার এলইডিটার ছোটো পা’টাকে আর্ডুইনোর পিন নাম্বার 13 এর সাথে অথবা অন্য যেকোনো পোর্টে কানেক্ট করুন। তবে যে পিনেই যুক্ত করুন না কেনো, সেটাই কোডে ব্যবহার করতে হবে। তারপর লম্বা পা’টাকে GND এর সাথে কানেক্ট করে নিন। আপনি চাইল ব্রেডবোর্ড বা যেকোনোভাবেই কানেকশন দিতে পারেন। আর চাইলে একটা রেজিস্টারও লাগিয়ে নিতে পারেনঃ

আমরা এখানে পিন 13 ব্যবহার করেছি, তার একটা কারণ আছে। আমি লিখা লেখার সময় এক ফ্রেন্ড এর কাছ থেকে আর্ডুইনো ধার করে এনেছিলাম। কিন্তু সাথে এলইডি অথবা কানেকশন দেওয়ার মতো কিছু ছিলো না। আর তাই আর্ডুইনো বোর্ডেরই একটা এলইডিL বিল্ট-ইন থাকে, যেটা ব্যবহার করেছি। এই এলইডিটা পিন 13 সাথে কানেক্টেড আছে। তাই আপনি এখানেই আউটপুট দেখতে পাবেন সরাসরি। আপনিও আপনার বোর্ডে এরকম এলইডি, L দিয়ে মার্ক করা দেখতে পাবেন।

এখন আর্ডুইনোর আইডিই এখান থেকে ডাউনলোড করে ইন্সটল করে নিতে হবে। ইন্সটল হয়ে গেলে ওপেন করুনঃ

এবার আপনার আর্ডুইনোর বোর্ডটা হাতে নিন এবং ক্যাবল দিয়ে আপনার ম্যাশিনের সাথে কানেক্ট করুন। কানেক্ট হয়ে গেলে আর্ডুইনোর আইডিইতে গিয়ে Tools > Port থেকে পোর্ট নাম্বার সিলেক্ট করে নিন। এটা আশা করি অটোই সিলেক্ট করা থাকবে, তারপরেও শিউর হওয়ার জন্যে পোর্ট চেক করে নিনঃ

এবার আমরা আর্ডুইনো আইডিই তে Tools > Board থেকে গিয়ে আমরা আমাদের বোর্ডের টাইপ সিলেক্ট করে নিবো। আমি যেহেতু এখানে আর্ডুইনো ন্যানো ইউজ করতেছি তাই আর্ডুইনো ন্যানো সিলেক্ট করবোঃ

আমরা এবার আমাদের প্রসেসরও সিলেক্ট করে নিবো। আপনি আপনার বোর্ড টাইপ অনুযায়ী সিলেক্ট করবেন। আমি যেহেতু আর্ডুইনো ন্যানো চালাচ্ছি, আমার প্রসেসর টাইপ ATmega328P (Old Bootloader)। তাই Tools> Processor থেকে সেটা সিলেক্ট করবোঃ

এখন আমাদের আর্ডুইনো কিন্তু জাভাস্ক্রিপ্ট বুঝে না। বরং আর্ডুইনোকে জাভাস্ক্রিপ্ট বুঝানোর জন্যে আমাদের একটা প্রটোকল ইউজ করতে হবে। আর সেজন্যেই এবার আমরা আমাদের আর্ডুইনোতে ফার্মাটা ইন্সটল দিবো। এটা মূলত একটা প্রটোকল হিসেবে কাজ করবে আপনার ম্যাশিনের সফটয়্যার এর সাথে অথবা আরো পরিষ্কার করে বললে, জাভাস্ক্রিপ্ট এর এনভারোমেন্ট এর সাথে আপনার আর্ডুইনোর কমিউনেকেশন করার জন্যে। ফার্মাটা আসলে আমাদের আর্ডুইনোর আইডিই এর সাথেই এক্সাম্পল হিসেবে দেওয়া আছে। আমরা File > Examples > StandardFirmataPlus থেকে গিয়ে লোড করে নিবোঃ

এখানে ক্লিক করার সাথে সাথে আর্ডুইনো আইডিই এর আরেকটা উইন্ডো ওপেন হবে কিছু কোডসহঃ

এবার উপরের আপলোড বাটনে ক্লিক করলে কিছুক্ষনের মধ্যেই আর্ডুইনোতে আপলোড হয়ে যাবে। আপলোড শেষে এরকম কোনো ম্যাসেজ পাবেন আর্ডুইনোর আইডিই এর নিচের দিকেঃ

আর যদি কোনো এরর আসে, এরর ম্যাসেজটা দেখে ফিক্স করার চেষ্টা করুন। হয়তো বোর্ড টাইপ ভুল হতে পারে। সেক্ষেত্রে ভালো করে শিউর হয়ে নিন কোন বোর্ড ইউজ করছেন। আবার প্রসেসর টাইপও ভুল হতে পারে। সেক্ষেত্রে শিউর হয়ে নিন কোন টাইপের প্রসেসর ইউজ করছেন। একইভাবে পোর্ট নাম্বারের কারণেও ভুল হতে পারে। পোর্ট নাম্বারটাও শিউর হয়ে নিন।

এবার আমাদের কোড আপলোড হয়ে গেলে আর্ডুইনোর আইডিই তে কাজ শেষ। এবার আমরা জাভাস্ক্রিপ্ট নিয়ে খেলা শুরু করবো।

আমরা অন্যান্য নোড জেএস এর প্রোজেক্টের মতো করেই একটা প্রোজেক্ট তৈরি করে কাজ শুরু করবো। আপনি যেখানে কাজ করবেন সেখানে একটা ডিরেক্টরি নিন। ধরুন আমি ডেক্সটপে কাজ করবো, তাই এখানে arduino-js-basic নামে একটা ডিরেক্টরি তৈরী করলামঃ

mkdir arduino-js-basic

এবার আমি সেই ডিরেক্টরিতে যাবো কমান্ড লাইন ইউজ করেঃ

cd arduino-js-basic

 এখানে একটা প্রোজেক্ট সেটাপ করবো। সহজভাবে এক কমান্ডে প্রোজেক্ট সেটাপঃ

npm init -y

ব্যাস এবার দেখবেন আপনার ডিরেক্টরিতে package.json নামে একটা ফাইল তৈরী হয়েছে। ব্যাস আপনি এবার কাজ করার জন্য তৈরী।

আমরা এবার আমাদের আসল জনি-ফাইভ ইন্সটল করে নিবো এনপিএম এর সাহায্যেঃ

npm i johnny-five

এবার package.json চেক করলে দেখবেন dependencies হিসেবে johnny-five কে পাবেনঃ

এবার আমরা একটা নতুন ফাইল নিবো। যেকোনো নামেই নিতে পারেন, তবে আমি নিলাম app.js নামেঃ

touch app.js

এখানেই মূলত আমাদের আসল কোড থাকবে বোর্ড কন্ট্রোল করার জন্যে। app.js ওপেন করুনঃ

এবার জনি-ফাইভ রিকোয়ার করুনঃ

const five = require('johnny-five');

এবার আমরা নতুন একটা বোর্ডের অবজেক্ট তৈরী করবোঃ

const board = new five.Board();

এগুলো সবই জনি-ফাইভের ডকুমেন্টেশনে উল্লেখ করা আছে। বিস্তারিত জানতে ডকুমেন্টেশনের বিকল্প কিছু নাই। এবার আমরা বোর্ড রেডির একটা ইভেন্ট লিসেনার লাগাবো, যেটা বোর্ড তৈরী (ready) হলেই একটা কলব্যাক ফাংশন কল করবেঃ

board.on('ready', function() {
  // code to execute when 'ready'
});

এবার আমরা এই ফাংশনের ভিতরে যে কোডগুলো লিখবো, বোর্ড তৈরী হয়ে গেলেই সেগুলো রান করবে। আমরা সিম্পল একটা কাজ করতে চাচ্ছি যেটা অফিশিয়াল ডকুমেন্টেশনেও প্রথম উল্লেখ করা হয়েছে। সেটা হচ্ছে একটা এলইডি লাইটকে ব্লিঙ্ক করানো। এখন আমাদের জনি-ফাইভের প্যাকেজের সাথে এলইডি নিয়ে কাজ করার জন্যেও একটা কন্সট্রাকটর আছে। সেটা থেকে নতুন একটা অবজেক্ট তৈরী করে নিবোঃ

const led = new five.Led(13);

এখানে এই কন্সট্রাকটর একটা আর্গুমেন্ট নিয়েছে যেটা আপনার বোর্ডের কোন পোর্ট ব্যবহার করতে চাচ্ছেন সেটা মেনশন করবেন। আমি পোর্ট 13 ব্যবহার করবো তাই সেটাই দিয়েছি। এবার এই led এ আমরা অনেকগুলো মেথডের অ্যক্সেস পাবো, তারমধ্যে ব্লিঙ্ক(blink) করারও একটা মেথড আছে। আমরা সেই মেথডটাকে কল করবো আমাদের মনমতো মিলিসেকেন্ড আর্গুমেন্ট হিসেবে পাস করে। এই মিলিসেকেন্ডটা আসলে কতক্ষন পরপর ব্লিঙ্ক করবে সেটা ডিফাইন করবেঃ

led.blink(500);

পুরোটা প্রোগ্রাম ইভেন্ট হ্যান্ডেলারসহ এরকম দেখাবেঃ

const five = require('johnny-five');
const board = new five.Board();
board.on('ready', function() {
  const led = new five.Led(13);
  led.blink(500);
});

ব্যাস আমাদের কোড তৈরী। এবার আমরা আরেকটু সুবিধার জন্যে আমাদের package.json এর ভিতরে একটা স্টার্ট(start) স্ক্রিপ্ট অ্যাড করে নিবো, এটা একদমই অপশনালঃ

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node app"
 },

ব্যাস এবার আমরা যদি আমাদের কমান্ড লাইন থেকে এই কমান্ড দেইঃ

npm start

তাহলে দেখবেন আপনার বোর্ড কাজ করা শুরু করেছেঃ

কিন্তু একটা জিনিস হয়তো খেয়াল করবেন যে আমরা কমান্ড দেওয়ার পর আমাদের কমান্ড লাইনে কিছু একটা অ্যাক্টিভ দেখাচ্ছে। এটা আসলে জনি-ফাইভ এর REPL, এখান থেকেও আমরা সরাসরি আর্ডুইনোর সাথে কথা বলতে পারবো। কিন্তু তারজন্যে আরেকটু সেটাপ লাগবে।

app.js আবার ওপেন করুন। উপরে যদি লক্ষ করে থাকেন যে আমরা আমাদের কলব্যাক ফাংশনটায় আসলে অ্যারো ফাংশন ইউজ করিনাই। কারণ আমাদের এখানে খুবই গুরুত্বপূর্ণ কাজে this কীওয়ার্ড লাগবে। আমরা কোড রান করার পর যে REPL টা দেখতে পেয়েছিলাম সেখানে চাইলে আমরা বিভিন্ন অবজেক্ট ইনজেক্ট করিয়ে দিতে পারি। তাহলে আমরা এই REPL থেকে সেই অবজেক্ট অ্যাক্সেস করতে পারবো এবং একই সাথে অবজেক্ট এর মেথডগুলোও অ্যাক্সেস করতে পারবো আমরা খুবই সিম্পলভাবে আমাদের led অবজেক্টটাকে REPL এ অ্যাক্সেস করার জন্যে আমাদের ইভেন্ট হ্যান্ডেলারের ভিতরে এরকম কোড লিখবোঃ

this.repl.inject({
  led
});

এখানে মূলত আমরা led নামে একটা কী ইঞ্জেক্ট করেছি REPL এ যার ভ্যালু হচ্ছে আমাদের led অবজেক্ট যেটা আমরা উপরে তৈরী করেছি। ব্যাপারটা একটু কনফিউজিং হতে পারে, আসল সিন্টেক্স এমনঃ led: led, কিন্তু ইএস৬ এর সিনট্যাক্স অনুযায়ী কী আর ভ্যালু একইরকম হলে শুধুমাত্র একটা লিখলেই চলে। তাই আমরা কোডটাকে শর্ট করে শুধুমাত্র led লিখেছি। পুরো প্রোগ্রাম এখন এমন দেখাবেঃ

const five = require('johnny-five');
const board = new five.Board();
board.on('ready', function() {
  const led = new five.Led(13);
  led.blink(500);
  this.repl.inject({
    led
  });
});

এবার আমরা আমাদের প্রোগ্রাম আবার স্টার্ট করলেঃ

npm start

এখন আমরা REPL থেকে led অ্যাক্সেস করতে পারবো। আমাদের এলইডি লাইট ব্লিঙ্ক করছে। আমরা চাইলে REPL থেকে led অবজেক্ট এর stop() মেথড দিয়ে ব্লিঙ্কটাকে স্টপ করে দিতে পারিঃ

led.stop()
L বন্ধ

ব্যাস দেখবেন এলইডি ব্লিঙ্ক করা স্টপ হয়ে গেছে। এমন led এর on() , off() ও আছে যেগুলো ঠিক যেরকম নাম সেরকম কাজই করে। এলইডি অন করতে REPL এ লিখুনঃ

led.on()

আবার অফ করতে লিখুনঃ

led.off()

এবার আবার ব্লিঙ্ক করাতে লিখুনঃ

led.blink()

ব্লিঙ্ক এ কোনো আর্গুমেন্ট না দিলে বাই ডিফল্ট ২০০ মিলিসেকেন্ড হিসেবে ব্লিঙ্ক করবে।

আশা করি খুব ছোটো কিছু হলেও এখান থেকেই আপনি জাভাস্ক্রিপ্ট এর সাহায্যে রোবোটিক্স এর কাজ শুরু করতে পারবেন। জনি-ফাইভের অফিশিয়াল ডকুমেন্টেশনে সবকিছু বেশ ভালোভাবেই দেওয়া আছে। আপনার বিভিন্ন কম্পোনেন্ট কিভাবে কাজ করাবেন সব দেওয়া আছে। ঐখান থেক সাহায্য নিয়ে নিয়ে অনেক কাজ করে ফেলতে পারবেন। আমিও চেষ্টা করবো ভবিষ্যৎ এ রিয়েল লাইফ কিছু প্রোজেক্ট করার এবং একইসাথে আপনাদের সাথে শেয়ার করার।

আপনি আর্ডুইনোর আরো যে যে কম্পোনেন্ট এর অ্যাপিআই পাবেন জনি-ফাইভের সাথে সেগুলোর লিস্ট পাবেন এখানে। বিশাল বড় লিস্ট কিন্তু, আপনি যে প্রোজেক্ট তৈরী করবেন সেখানে যে যে কম্পোনেন্টগুলো লাগবে সেগুলো এখান থেকে দেখে দেখে অ্যাপিআই শিখে কাজ করতে পারবেন।

আজকের তৈরী করা প্রোজেক্টটা আমার গিটহাব রিপোতে পাবেন।

ভালো থাকবেন, সুস্থ থাকবেন, আর পাশের মানুষগুলোকে ভালোবাসবেন। আমার লেখায় উপকৃত হলে সৃষ্টিকর্তার কাছে আমার জন্যে দুআ করবেন।


Subscribe Me


Comments

comments