আই ব্লিংক ডিটেকশনের ক্ষেত্রে সবচেয়ে কার্যকর পদ্ধতী হচ্ছে ইমেজ প্রসেসিং। সেটি আপাতত ভবিষ্যতের জন্য তোলা থাকুক। এই টিউটোরিয়ালে আমরা আই ব্লিংক কাউন্টার তৈরীতে ব্যবহার করব SparkFun Particle Sensor Breakout – MAX30105 । ইতোমধ্যে আমরা এটি রক্তের অক্সিজেন স্যাচুরেশন নির্ণয়ে ব্যবহার করেছি। পার্টিকেল সেন্সরটিতে রয়েছে লাল ও সবুজ রঙয়ের দুইটি সাধারন এলইডি এবং একটি ইনফ্রারেড এলইডি। আরও আছে একটি ফোটন ডিটেক্টর।এই এক্সপেরিমেন্টের জন্য আমরা পার্টিকেল সেন্সরের আইআর ভ্যালু পর্যবেক্ষন করব। সেন্সর চালু অবস্থায় আইসির উপরে চোখ রাখলে খোলা চোখের জন্য প্রাপ্ত আইআর ভ্যালুর চেয়ে বন্ধ চোখের জন্য প্রাপ্ত আই আর ভ্যালু বড় হয়। আইআর ভ্যালুর ওঠানামা দেখে আমরা এক মিনিটে আই ব্লিংকের সংখ্যা গণনা করেছি।
প্রয়োজনীয় যন্ত্রপাতি | পরিমাণ | প্রোডাক্ট লিংক |
Arduino Nano | 1 | এখানে ক্লিক করুন |
SparkFun Particle Sensor Breakout – MAX30105 | 1 | এখানে ক্লিক করুন |
LCD 84×48 – Nokia 5110 | 1 | এখানে ক্লিক করুন |
Male to male jumpers | 12 | এখানে ক্লিক করুন |
Breadboard | 1 | এখানে ক্লিক করুন |
অতিরিক্ত যন্ত্রপাতি(Optional) | পরিমাণ | প্রোডাক্ট লিংক |
Mini breadboard | 1 | এখানে ক্লিক করুন |
LED 5mm | 1 | এখানে ক্লিক করুন |
Male to male jumpers | 2 | এখানে ক্লিক করুন |
100 ohm 1/4W resistors | 1 | এখানে ক্লিক করুন |
সার্কিটঃ আরডুইনো ন্যানো এবং পার্টিকেল সেন্সরের মধ্যে নিচের কানেকশনটি সম্পন্ন করুন।
Arduino Nano | SparkFun Particle Sensor Breakout – MAX30105 |
5V | 5V |
GND | GND |
SDA | A4 |
SCL | A5 |
এলসিডি এবং আরডুইনো ন্যানোর মধ্যে নিচের কানেকশনটি সম্পন্ন করতে হবে।
Arduino Nano | LCD 84×48 – Nokia 5110 |
GND | GND |
4 | LIGHT |
VCC | VCC |
13 | CLK |
11 | DIN |
9 | DC |
10 | CE |
8 | RST |
অতিরিক্ত অংশঃ
Arduino Nano | LED |
5 | +(In series with 100 ohm resistor) |
– | – |
সেন্সরের আইসি বরাবর চোখ রাখতে হবে। আলোকিত অংশটি চোখের উপরের ও নিচের পাঁপড়ির মাঝখানে স্থাপন করতে হবে।
কমলা মিনি সার্কিট বোর্ডটি অপশনাল। এটা ছাড়াও এক্সপেরিমেন্ট করা যাবে। তবে এটি ব্যবহারের সুবিধা অবশ্যই আছে। মিনি ব্রেডবোর্ডের লাল এলইডি ব্যবহৃত হয়েছে একটি ইন্ডিকেটর হিসেবে। চোখের পাতা খোলা অবস্থায় এটি জ্বলবে , বন্ধ অবস্থায় নিভে থাকবে।
চোখ বরাবর সেন্সর এবং নাক বরাবর মিনি ব্রেডবোর্ড ধরলে আমরা নিজেরাই আমাদের চোখের পলক ফেলার সাথে সাথে লাল এলইডির জ্বলানেভা দেখতে পাব। পরীক্ষামূলকভাবে প্রথমে ইচ্ছে করেই কয়েকবার চোখ খুলে আর বন্ধ করে আমরা দেখে নিতে পারি এলইডিটি যেভাবে জ্বলা নেভা করার কথা সেভাবে করছে কি না। যদি করে, তাহলে বুঝতে হবে আমাদের সেন্সরের প্লেসমেন্ট ঠিক আছে।
এক মিনিট পর এলসিডির নীল আলো জ্বলে উঠবে এবং এক মিনিটে গননাকৃত ব্লিংকের সংখ্যা এলসিডির পর্দায় দেখা যাবে।
শুধু এলসিডি না, সিরিয়াল মনিটরেও সকল প্রয়োজনীয় ডেটা দেখা যাবে। এক মিনিট অতিক্রান্ত হবার পর পরবর্তী রিডিং নেওয়ার জন্য অবশ্যই আরডুইনোকে রিসেট করে নিতে হবে।
কোডঃ প্রথমে নিচের লাইবেরিগুলো ডাউনলোড করে আরডুইনোতে ইন্সটল করতে হবে।
২)এলসিডির জন্য এই ফোল্ডারটি ডাউনলোড করুন। ফোল্ডারটি আনজিপ করবেন না। নিচের ছবিতে দেখানো উপায়ে জিপ ফোল্ডার থেকেই লাইব্রেরি ইন্সটল করুন।
নিচের কোডটি কম্পাইল করে আরডুইনোতে আপলোড করতে হবে।
/*
Eye blink counter
Outputs and compares IR value and thus counts eye blink.
*/
#include <Wire.h>
#include "MAX30105.h"
#include "U8glib.h"
U8GLIB_PCD8544 u8g(13, 11, 10, 9, 8); // CLK, DIN, CE, DC, RST
// Variables
MAX30105 particleSensor;
#define debug Serial //Uncomment this line if you're using an Uno or ESP
//#define debug SerialUSB //Uncomment this line if you're using a SAMD21
//#define SCOUNT 30
//unsigned long int Buffer[2];
//unsigned long int BufferIndex = 0,copyIndex = 0, Blink=0,openclose=0;
int Buffer[2];
int BufferIndex = 0,copyIndex = 0, Blink=0,openclose=0;
char BLINK[5];
void setup()
{
pinMode(4, OUTPUT);
digitalWrite(4,HIGH);
pinMode(5, OUTPUT);
debug.begin(115200);
debug.println("Eye blink counter");
// Initialize sensor
if (particleSensor.begin() == false)
{
debug.println("MAX30105 was not found. Please check wiring/power. ");
while (1);
}
particleSensor.setup(); //Configure sensor. Use 6.4mA for LED drive
}
void loop()
{
Buffer[BufferIndex] = particleSensor.getIR(); //read the analog value and store into the buffer
BufferIndex++;
if(BufferIndex == 2)
BufferIndex = 0;
debug.print(",openclose=");
debug.print(openclose);
debug.println();
debug.print(millis() / 1000);
debug.print(',');
if(millis() / 1000==60)
{
debug.print("Blink=");
debug.print(openclose/2);
debug.println();
itoa(openclose/2,BLINK,10);
u8g.firstPage();
do {
u8g.setScale2x2();
u8g.drawStr( 10, 14, BLINK);
u8g.undoScale();
u8g.setFont(u8g_font_unifont);
u8g.setFont(u8g_font_6x10);
u8g.drawStr( 45, 35, "Blinks");
} while( u8g.nextPage() );
}
if(millis() / 1000>60){
digitalWrite(4,LOW);
}
if(Buffer[0]<10000 && Buffer[1]>10000)
{
openclose++;
}
else if(Buffer[1]<10000 && Buffer[0]>10000)
{
openclose++;
}
if(particleSensor.getIR()>10000)
{
digitalWrite(5,LOW);
debug.print("Eyes shut");
debug.print(", IR[");
debug.print(particleSensor.getIR());
debug.print("]");
}
else
{
digitalWrite(5,HIGH);
debug.print("Eyes open");
debug.print(", IR[");
debug.print(particleSensor.getIR());
debug.print("]");
}
}
]]>