সুচিপত্র:

নিওপিক্সেল রিং সহ জিরোস্কোপ মজা: 4 টি ধাপ (ছবি সহ)
নিওপিক্সেল রিং সহ জিরোস্কোপ মজা: 4 টি ধাপ (ছবি সহ)

ভিডিও: নিওপিক্সেল রিং সহ জিরোস্কোপ মজা: 4 টি ধাপ (ছবি সহ)

ভিডিও: নিওপিক্সেল রিং সহ জিরোস্কোপ মজা: 4 টি ধাপ (ছবি সহ)
ভিডিও: EP21 SW পার্ট 1 - DIY RF পাওয়ার পরিমাপ 2024, নভেম্বর
Anonim
Image
Image

এই টিউটোরিয়ালে আমরা MPU6050 জাইরোস্কোপ, একটি নিওপিক্সেল রিং এবং একটি arduino ব্যবহার করতে যাচ্ছি এমন একটি ডিভাইস তৈরি করতে যা লাইটের প্রবণতা কোণের সাথে সম্পর্কিত।

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

আমি এই টিউটোরিয়ালটি নির্মাণ করছি কারণ আমি আমার প্রথম নির্দেশযোগ্য এখানে আগ্রহ দেখেছি (জিরোস্কোপ নেতৃত্বাধীন নিয়ন্ত্রণ সঙ্গে Arduino)। এই নির্দেশনায় আমি একটি নিওপিক্সেল রিং দিয়ে সরল নেতৃত্বকে প্রতিস্থাপন করেছি। অ্যাডাফ্রুট লাইব্রেরির মাধ্যমে রিংটি ব্যবহার করা সহজ এবং এটি অবশ্যই আরও দর্শনীয়।

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

ধাপ 1: প্রয়োজনীয় জিনিস

সমাবেশ
সমাবেশ

যন্ত্রাংশ

1. Arduino pro mini 328p (eBay) 2 $

2. ব্রেডবোর্ড

3. MPU6050 জাইরোস্কোপ (ইবে) 1.2 $

4. 24 নিওপিক্সেল নেতৃত্বাধীন রিং (Adafruit) 17 $

5. 4 x AA ব্যাটারি প্যাক 4 ব্যাটারী সহ

6. U- আকৃতির জাম্পার তারগুলি (চ্ছিক)। আমি এই জাম্পার কেবলগুলি ব্যবহার করেছি কারণ সেগুলি রুটিবোর্ডে আরও ভাল দেখাচ্ছে এবং এইভাবে লেডগুলি আরও দৃশ্যমান। আপনি ইবেতে 140 ডলারের একটি বাক্স প্রায় 4 ডলারে পাবেন। আপনার যদি এই তারগুলি না থাকে তবে আপনি সেগুলিকে ডুপন্ট তারের সাথে প্রতিস্থাপন করতে পারেন।

সরঞ্জাম:

1. ইউএসবি থেকে সিরিয়াল FTDI অ্যাডাপ্টার FT232RL আরডুইনো প্রো মিনি প্রোগ্রাম করার জন্য

2. Arduino IDE

দক্ষতা: ১। সোল্ডারিং, এই টিউটোরিয়ালটি দেখুন

3. মৌলিক arduino প্রোগ্রামিং, এই টিউটোরিয়াল দরকারী হতে পারে

ধাপ 2: সমাবেশ

সমাবেশ
সমাবেশ

আমি fzz বিন্যাসে fritzing পরিকল্পিত সংযুক্ত করেছি এবং সংযোগগুলির সহজ দৃশ্যের জন্য এটির একটি ছবি

1. ছবিতে দেখানো মত নিওপিক্সেল রিং এর পিছনে আপনাকে 3 টি পুরুষ পিন সোল্ডার করতে হবে

- ধনাত্মক পিন ঝাল

- মাটি ঝাল

- ডেটা ইনপুট পিন ঝাল

2. তারপর 4x ব্যাটারি হোল্ডারের ব্রেডবোর্ডের সাথে সংযোগের একটি উপায় থাকা উচিত, একটি সহজ সমাধান হল দুটি পুরুষ ডুপোন্ট তারের টার্মিনালে বিক্রি করা।

3. ব্রেডবোর্ড প্রস্তুত করুন।

- চিত্রের মতো ব্রেডবোর্ডে নিওপিক্সেল রিং, মাইক্রোকন্ট্রোলার এবং জাইরোস্কোপ রাখুন

- সমস্ত নেতিবাচক তারগুলি রাখুন: মাইক্রোকন্ট্রোলার, নিওপিক্সেল রিং, গাইরোতে

- সমস্ত ইতিবাচক তারগুলি রাখুন: মাইক্রোকন্ট্রোলার, নিওপিক্সেল রিং, গাইরোতে

- সমস্ত ডেটা তারের রাখুন:

* মাইক্রোকন্ট্রোলার থেকে গাইরো পর্যন্ত এসডিএ এবং এসসিএল

* মাইক্রোকন্ট্রোলার থেকে নিওপিক্সেল রিং পর্যন্ত D6 পিন করুন

- পাওয়ার করার আগে সমস্ত সংযোগ দুবার চেক করুন

- allyচ্ছিকভাবে ডাক্ট টেপ ব্যবহার করে, ব্র্যাডবোর্ডের পিছনে ব্যাটারি প্যাকটি টেপ করুন এবং এটিকে আরও বহনযোগ্য করে তুলুন

ধাপ 3: কোড এবং ক্রমাঙ্কন

প্রথমে আপনাকে দুটি লাইব্রেরি ডাউনলোড এবং ইনস্টল করতে হবে:

1. অ্যাডাফ্রুট নিওপিক্সেল লাইব্রেরি ফির নিয়পিক্সেল নিয়ন্ত্রণ করে

2. জাইরোস্কোপের জন্য MPU6050 লাইব্রেরি

3. I2CDev লাইব্রেরির উৎস

তারা দুটি দুর্দান্ত লাইব্রেরি যা ভারী উত্তোলন করবে!

নিওপিক্সেলের আরও বিশদ এখানে

তারপর এখান থেকে আমার লাইব্রেরি ডাউনলোড এবং ইনস্টল করুন অথবা নীচে থেকে এটি অনুলিপি করুন:

#অন্তর্ভুক্ত "I2Cdev.h"

#অন্তর্ভুক্ত #অন্তর্ভুক্ত #MPU6050_6Axis_MotionApps20.h " #অন্তর্ভুক্ত" Wire.h " #NEOPIXED_CONTROL_PIN 6 #সংজ্ঞায়িত করুন NUM_LEDS 24 const int MAX_ANGLE = 45; const int LED_OFFSET = 12; MPU6050 mpu; Adafruit_NeoPixel স্ট্রিপ = Adafruit_NeoPixel (NUM_LEDS, NEOPIXED_CONTROL_PIN, NEO_RBG + NEO_KHZ800); স্বাক্ষরবিহীন দীর্ঘ lastPrintTime = 0; বুল আরম্ভ = মিথ্যা; // DMP init সফল হলে uint8_t mpuIntStatus সফল হয়; // MPU uint8_t devStatus থেকে প্রকৃত বাধা অবস্থা বাইট ধারণ করে; // প্রতিটি ডিভাইস অপারেশনের পর রিটার্ন স্ট্যাটাস (0 = সাফল্য,! 0 = ত্রুটি) uint16_t প্যাকেট সাইজ; // প্রত্যাশিত DMP প্যাকেটের আকার (ডিফল্ট 42 বাইট) uint16_t fifoCount; // FIFO uint8_t fifoBuffer এ বর্তমানে সমস্ত বাইটের সংখ্যা [64]; // FIFO স্টোরেজ বাফার Quaternion q; // [w, x, y, z] quaternion ধারক VectorFloat মাধ্যাকর্ষণ; // [x, y, z] মাধ্যাকর্ষণ ভেক্টর ফ্লোট ypr [3]; // [ইয়াও, পিচ, রোল] ইয়াও/পিচ/রোল ধারক এবং মাধ্যাকর্ষণ ভেক্টর অস্থির বুল mpuInterrupt = মিথ্যা; // নির্দেশ করে যে এমপিইউ ইন্টারাপ্ট পিন বেশি হয়ে গেছে কিনা

অকার্যকর সেটআপ()

{Serial.begin (9600); Serial.println ("প্রোগ্রাম শুরু"); ইনিশিয়ালাইজেশন = initializeGyroscope (); strip.begin (); } void loop () {if (! initialization) {return; } mpuInterrupt = মিথ্যা; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); যদি (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); প্রত্যাবর্তন; } if (mpuIntStatus & 0x02) {while (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount -= packetSize; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& মাধ্যাকর্ষণ, & q); mpu.dmpGetYawPitchRoll (ypr, & q, & gravity); redrawLeds (ypr [0] * 180/M_PI, ypr [1] * 180/M_PI, ypr [2] * 180/M_PI); }} বুলিয়ান hasFifoOverflown (int mpuIntStatus, int fifoCount) {return mpuIntStatus & 0x10 || fifoCount == 1024; } অকার্যকর redrawLeds (int x, int y, int z) {x = constrain (x, -1 * MAX_ANGLE, MAX_ANGLE); y = constrain (y, -1 * MAX_ANGLE, MAX_ANGLE); যদি (y 0) {lightLeds (y, z, 0, 5, 0, 89); } অন্যথায় যদি (y <0 এবং z 0 এবং z 0 এবং z> 0) {lightLeds (y, z, 20, 24, 89, 0); }} অকার্যকর লাইটলিডস (int x, int y, int fromLedPosition, int toLedPosition, int fromAngle, int toAngle) {ডাবল এঙ্গেল = (atan ((double) abs (x) / (double) abs (y)) * 4068) / 71; int ledNr = মানচিত্র (কোণ, fromAngle, toAngle, fromLedPosition, toLedPosition); printDebug (x, y, ledNr, angle); uint32_t রঙ; জন্য (int i = 0; i পজিশন + LED_OFFSET) {রিটার্ন পজিশন + LED_OFFSET; } রিটার্ন পজিশন + LED_OFFSET - NUM_LEDS; } অকার্যকর printDebug (int y, int z, int lightLed, int angle) {if (millis () - lastPrintTime <500) {return; } সিরিয়াল.প্রিন্ট ("a ="); সিরিয়াল.প্রিন্ট (কোণ); সিরিয়াল.প্রিন্ট (";"); Serial.print ("ll ="); Serial.print (lightLed); Serial.print (";"); Serial.print ("y ="); Serial.print (y); Serial.print (";"); Serial.print ("z ="); Serial.print (z); Serial.println (";"); lastPrintTime = মিলিস (); } bool initializeGyroscope () {Wire.begin (); TWBR = 24; mpu.initialize (); Serial.println (mpu.testConnection ()? F ("MPU6050 সংযোগ সফল"): F ("MPU6050 সংযোগ ব্যর্থ")); Serial.println (F ("DMP আরম্ভ করছে …")); devStatus = mpu.dmpInitialize (); mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1788); যদি (devStatus! = 0) {Serial.print (F ("DMP ইনিশিয়ালাইজেশন ব্যর্থ (কোড")); Serial.println (devStatus); মিথ্যা ফেরত দিন; বাধা সনাক্তকরণ (Arduino বহিরাগত বাধা 0) … ")); attachInterrupt (0, dmpDataReady, RISING); = mpu.dmpGetFIFOPacketSize (); true true;} void dmpDataReady () {mpuInterrupt = true;}

কোড আপলোড করুন:

FTDI অ্যাডাপ্টার ব্যবহার করে কোডটি আরডুইনোতে আপলোড করুন।

পাওয়ার সাপ্লাই সংযোগ করুন (ব্যাটারি)

ক্রমাঙ্কন:

এখানে ক্যালিব্রেট করার সবচেয়ে গুরুত্বপূর্ণ বিষয় হল "LED_OFFSET" ধ্রুবক। আমার উদাহরণে 12। আপনাকে এটি 0 থেকে 23 পর্যন্ত সামঞ্জস্য করতে হবে যাতে বোর্ডকে পাওয়ার করার পর নেতৃত্ব যে দিকে আপনি বোর্ডকে কাত করবেন সেদিকে আলোকিত হবে।

আপনি কীভাবে এটি কাজ করে সে সম্পর্কে আরও বিশদ জানতে চাইলে শেষ ধাপটি দেখুন

ধাপ 4: এটি কিভাবে কাজ করে (alচ্ছিক)

এটি কিভাবে কাজ করে (alচ্ছিক)
এটি কিভাবে কাজ করে (alচ্ছিক)

প্রথমে MPU6050 জাইরোস্কোপ সম্পর্কে সামান্য তথ্য। এটি একটি এমইএমএস জাইরোস্কোপ (এমইএমএস মানে মাইক্রোইলেক্ট্রোমেকানিক্যাল সিস্টেম)।

প্রতিটি ধরণের এমইএমএস গাইরোস্কোপের কিছু দোলন উপাদান রয়েছে যেখানে থেকে অ্যাকক্লারেশন, এবং তাই দিক পরিবর্তন, সনাক্ত করা যায়। এর কারণ হল, গতি আইনের সংরক্ষণ অনুসারে, একটি স্পন্দিত বস্তু একই সমতলে কম্পন অব্যাহত রাখতে পছন্দ করে এবং যে কোনও কম্পনমূলক বিচ্যুতি নির্দেশের পরিবর্তন আনতে ব্যবহার করা যেতে পারে।

গাইরোতে কিছু অভিনব গণিতের মাধ্যমে রোল, পিচ এবং ইয়াও গণনা করার জন্য নিজস্ব একটি মাইক্রোকন্ট্রোলার রয়েছে।

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

নিওপিক্সেল আরজিবি এলইডি স্বতন্ত্রভাবে ঠিকানাযোগ্য এবং ব্যান্ড এবং রিংগুলিতে শিকলযুক্ত। তারা 5V তে কাজ করে এবং তাদের নিজস্ব সার্কিট্রি থাকে তাই আপনাকে শুধুমাত্র নিওপিক্সেলগুলিকে শক্তি দিতে হবে এবং ডেটা লাইন ব্যবহার করে তাদের সাথে যোগাযোগ করতে হবে। যোগাযোগটি ঘড়ি এবং ডেটা ধারণকারী একটি একক ডেটা লাইন দিয়ে সম্পন্ন করা হয় (আরও বিশদ এখানে)। অ্যাডাফ্রুট নিওপিক্সেল রিংগুলির সাথে যোগাযোগের জন্য একটি পরিষ্কার লাইব্রেরি সরবরাহ করে।

কোড

L oop () ফাংশনের ভিতরে MPU6050_6Axis_MotionApps20 লাইব্রেরি বলা হয়। যখন লাইব্রেরিতে জাইরোস্কিপ থেকে নতুন ডেটা থাকে তখন এটি redrawLeds (x, y, z) কে 3 টি যুক্তি দিয়ে ইয়া, পিচ এবং রোল উপস্থাপন করে

RedrawLeds () এর ভিতরে:

- আমরা দুটি অক্ষের উপর ফোকাস করছি: y, z

- আমরা উভয় অক্ষকে -MAX_ANGLE থেকে +MAX_ANGLE পর্যন্ত সীমাবদ্ধ করছি, আমরা সর্বোচ্চ কোণকে 45 এ নির্ধারণ করেছি এবং এটি পরিবর্তনযোগ্য

- আমরা 360 ডিগ্রীডকে 4 চতুর্ভুজে বিভক্ত করছি এবং প্রত্যেকের জন্য lightLeds () ফাংশনগুলিকে নিম্নরূপ কল করছি:

* y নেতিবাচক, z ইতিবাচক প্রথম চতুর্ভুজটি 0 থেকে 5 পর্যন্ত নেতৃত্বকে নিয়ন্ত্রণ করবে, কোণটি 0 থেকে 89 হবে

* y নেগেটিভ, z নেগেটিভ সেকেন্ড চতুর্ভুজ নিয়ন্ত্রণ 6 থেকে 12 পর্যন্ত নেতৃত্ব দেয়, কোণ 89 থেকে 0 হবে

* … ইত্যাদি

- লাইটলেডস ফাংশনের ভিতরে

* আমি আর্কট্যানজেন্ট ব্যবহার করে দুটি অক্ষের উপর ভিত্তি করে একটি কোণ গণনা করছি (সংযুক্ত ছবিটি পরীক্ষা করুন)

* আমি গণনা করছি কি arduino মানচিত্র ফাংশন ব্যবহার করে দেখানো হয়েছে

* আমি নেতৃত্বাধীন স্ট্রিপটি পুনরায় সেট করছি, দুটি নেতৃত্ব ছাড়া, যেটি আমি আগে গণনা করেছি তার নেতৃত্বাধীন অবস্থানের সাথে সম্পর্কিত এবং এর আগে একটি নেতৃত্বাধীন অবস্থান (একটি বিবর্ণ প্রভাব দেখানোর জন্য)

* আমি নিওপিক্সেল ক্রমাঙ্কন বিবেচনা করার জন্য normalizeLedPosition () নামে একটি ফাংশন ব্যবহার করছি। ক্রমাঙ্কন দরকারী কারণ নিওপিক্সেল রিং খুশি হিসাবে ঘোরানো যেতে পারে, এবং জাইরোস্কোপের সাথে সংযুক্ত করা উচিত

* আমি টো অক্ষ মুদ্রণ করছি, কি নেতৃত্বে আলো এবং কোণ আছে

গণিত

আমি নেতৃত্বাধীন রিং এবং কোণ নির্ধারণ করতে ব্যবহৃত ত্রিকোণমিতিক ফাংশনের সাথে একটি ছবি সংযুক্ত করেছি।

প্রস্তাবিত: