আমাদের প্রোজেক্টি হলো বল অনুসরনকারী রোবট যেটা র্যাস্পবেরি পাই এবং পাই ক্যামেরার সাহায্যে ইমেজ প্রোসেসিং করে বল কে অনুসরন করবে। এই প্রোজেক্টে কালার কোডের মাধ্যমে ইমেজ প্রোসেসিং করা হয়েছে । তাই কোনো একটা নির্দিষ্ট রঙের বলকে সামনে পেলে সেটাকে রোবট অনুসরন করে সামনে -পিছনে ,দানে -বামে যাবে।
১ .র্যাস্পবেরি পাই।
২ .পাই ক্যামেরা।
৩ .এল ২৯৩ ডি মোটর ড্রাইভ।
৪. ২ হুইল চেসিস (মোটর সহ)
৫.পাওয়ার ব্যাংক অথবা যেকোনো পাওয়ার সোর্স।
৬.সংযোক কারী তার।
১। প্রথমে র্যাস্পবেরি পাইইয়ের সাথে মাউস, কিবোর্ড ও মনিটোর সংযোগ করে চালু করি।
২। আমাদের আরও একটি বিষয়ে খেয়াল রাখতে হবে যেন র্যাস্পবেরি পাইটি ইন্টারনেটের সাথে সংযুক্ত করা থাকে। কারন অনেক কিছু ডাউনলোড করা দরকার হবে।
৩।এখন প্রোসেস আর্ম (http://download.processing.org/processing-3.3.6-linux-armv6hf.tgz) থেকে র্যাস্পবেরি পাই এর প্রোসেসিং আই ডি ই নামাতে হবে। একটা জিপ ফাইল নামবে। সেটাকে আনজিপ করে এক্সিকিউট করতে হবে।
৪। এখন প্রোসেসিং নামক ফাইল খুললে নিচে দেখানো ছবির মতো একটা উইন্ডো আসবে।
৫। উপরের এই উইন্ডোটি কোড লিখার জন্য ব্যবহার করা হয় ।
৬। আমাদের কোডটা রান করার জন্য দুইটা লাইব্রেরি সংযুক্ত করা লাগবে সেটার জন্য Sketch -> Import Library -> Add Library তে যেতে হবে।এবং এখানে নিচের মতো একটা ডাইলোগ বক্স আসবে।
৭।বাম পাশে উপরে সার্চ বক্সে Raspberry Pi লিখে সার্চ দিলে নিচের মতো কিছু একটা আসবে।
৮। এখন এখান থেকে “GL Video” and “Hardware I/O” লাইব্রেরি দুইটা ইন্সটল করতে হবে । এখানে অনেক সময় দেখা যায় “Hardware I/O” লাইব্রেরিটি আগে থেকেই থাকে । সেক্ষেত্রে আবার নতুন করে সংযোগ করার দরকার নেই।
৯। এভাবে সফটওয়ার ইন্সটলেশন শেষ করে হার্ডওয়ার এর কাজ শুরু করতে হবে।
১০। হার্ডওয়ারের জন্য প্রথমেই নিচের সার্কিট ডায়াগ্রামটির মতো করে সংযোগ স্থাপন করতে হবে।
মোটর ড্রাইভার এর সাথে মোটর সংযুক্ত
্্রর্যাস্পবেরি পাই
পাওয়ার ব্যাঙ্ক
পাই ক্যামেরা সংযুক্ত র্যাস্পবেরি পাই এর সাথে
সংযোগ স্থাপনের সময় খেয়াল রাখতে হবে যেন কোডের পিনের সাথে যেন রাস্পবেরী পাই ও মোটর ড্রাইভারের পিন মিল করে সংযোগ তা দেয়া হয়। তা না হলে মোটর ঠিক মতো কাজ করবে না । এবং মোটর ড্রাইভারের গ্রাউন্ডের সাথে যেন পাও্যার সোর্স এর নেগেটিভ সংযোগ দেয়া হয়।
নিচে এই প্রজেক্টের জন্য যেই কোড ব্যবহার করা হয়েছে সেটি দিয়ে দেওয়া হলো।
import processing.io.*;
import gohai.glvideo.*;
GLCapture video;
color trackColor;
void setup() {
size(320, 240, P2D);
video = new GLCapture(this);
video.start();
trackColor = color(255, 0, 0);
GPIO.pinMode(4, GPIO.OUTPUT);
GPIO.pinMode(14, GPIO.OUTPUT);
GPIO.pinMode(17, GPIO.OUTPUT);
GPIO.pinMode(18, GPIO.OUTPUT);
}
void draw() {
background(0);
if (video.available()) {
video.read();
}
video.loadPixels();
image(video, 0, 0);
float worldRecord = 500;
int closestX = 0;
int closestY = 0;
// Begin loop to walk through every pixel
for (int x = 0; x < video.width; x ++ ) {
for (int y = 0; y < video.height; y ++ ) {
int loc = x + y*video.width;
// What is current color
color currentColor = video.pixels[loc];
float r1 = red(currentColor);
float g1 = green(currentColor);
float b1 = blue(currentColor);
float r2 = red(trackColor);
float g2 = green(trackColor);
float b2 = blue(trackColor);
// Using euclidean distance to compare colors
float d = dist(r1, g1, b1, r2, g2, b2); // We are using the dist( ) function to compare the current color with the color we are tracking.
// If current color is more similar to tracked color than
// closest color, save current location and current difference
if (d < worldRecord) {
worldRecord = d;
closestX = x;
closestY = y;
}
}
}
if (worldRecord < 10) {
// Draw a circle at the tracked pixel
fill(trackColor);
strokeWeight(4.0);
stroke(0);
ellipse(closestX, closestY, 16, 16);
println(closestX,closestY);
if (closestX<140)
{
GPIO.digitalWrite(4, GPIO.HIGH);
GPIO.digitalWrite(14, GPIO.HIGH);
GPIO.digitalWrite(17, GPIO.HIGH);
GPIO.digitalWrite(18, GPIO.LOW);
delay(10);
GPIO.digitalWrite(4, GPIO.HIGH);
GPIO.digitalWrite(14, GPIO.HIGH);
GPIO.digitalWrite(17, GPIO.HIGH);
GPIO.digitalWrite(18, GPIO.HIGH);
println("Turn Right");
}
else if (closestX>200)
{
GPIO.digitalWrite(4, GPIO.HIGH);
GPIO.digitalWrite(14, GPIO.LOW);
GPIO.digitalWrite(17, GPIO.HIGH);
GPIO.digitalWrite(18, GPIO.HIGH);
delay(10);
GPIO.digitalWrite(4, GPIO.HIGH);
GPIO.digitalWrite(14, GPIO.HIGH);
GPIO.digitalWrite(17, GPIO.HIGH);
GPIO.digitalWrite(18, GPIO.HIGH);
println("Turn Left");
}
else if (closestY<170)
{
GPIO.digitalWrite(4, GPIO.HIGH);
GPIO.digitalWrite(14, GPIO.LOW);
GPIO.digitalWrite(17, GPIO.HIGH);
GPIO.digitalWrite(18, GPIO.LOW);
delay(10);
GPIO.digitalWrite(4, GPIO.HIGH);
GPIO.digitalWrite(14, GPIO.HIGH);
GPIO.digitalWrite(17, GPIO.HIGH);
GPIO.digitalWrite(18, GPIO.HIGH);
println("Go Frwd");
}
else
{
GPIO.digitalWrite(4, GPIO.HIGH);
GPIO.digitalWrite(14, GPIO.HIGH);
GPIO.digitalWrite(17, GPIO.HIGH);
GPIO.digitalWrite(18, GPIO.HIGH);
}
}
else
{
GPIO.digitalWrite(4, GPIO.HIGH);
GPIO.digitalWrite(14, GPIO.HIGH);
GPIO.digitalWrite(17, GPIO.HIGH);
GPIO.digitalWrite(18, GPIO.HIGH);
}
}
void mousePressed() {
// Save color where the mouse is clicked in trackColor variable
int loc = mouseX + mouseY*video.width;
trackColor = video.pixels[loc];
}