সুচিপত্র:

আরডুইনো টোন জেনারেটর কোন লাইব্রেরি বা সিরিয়াল ফাংশন সহ (বাধা সহ): 10 টি ধাপ
আরডুইনো টোন জেনারেটর কোন লাইব্রেরি বা সিরিয়াল ফাংশন সহ (বাধা সহ): 10 টি ধাপ

ভিডিও: আরডুইনো টোন জেনারেটর কোন লাইব্রেরি বা সিরিয়াল ফাংশন সহ (বাধা সহ): 10 টি ধাপ

ভিডিও: আরডুইনো টোন জেনারেটর কোন লাইব্রেরি বা সিরিয়াল ফাংশন সহ (বাধা সহ): 10 টি ধাপ
ভিডিও: 555 Timers - Astable Multivibrator Configuration 2024, সেপ্টেম্বর
Anonim
Arduino টোন জেনারেটর কোন লাইব্রেরি বা সিরিয়াল ফাংশন ছাড়া (বাধা সহ)
Arduino টোন জেনারেটর কোন লাইব্রেরি বা সিরিয়াল ফাংশন ছাড়া (বাধা সহ)

এটি এমন কিছু নয় যা আমি সাধারণত একটি নির্দেশযোগ্য করতে চাই, আমি আমার মেটালওয়ার্ক পছন্দ করি, কিন্তু যেহেতু আমি একজন বৈদ্যুতিক প্রকৌশলী ছাত্র এবং মাইক্রোকন্ট্রোলার (এমবেডেড সিস্টেম ডিজাইন) এ একটি ক্লাস নিতে হয়, আমি ভেবেছিলাম আমি একটি নির্দেশনা তৈরি করব আমার একটি প্রকল্প। যখন আমি মূলত এই ক্লাসের জন্য প্রজেক্ট এবং অন্যদের তৈরি করেছি, আমি দেখেছি যে খুব কম টিউটোরিয়াল আছে যা arduino লাইব্রেরি ফাংশন বা সিরিয়াল ফাংশন ব্যবহার করে না, এটি আরেকটি কারণ যা আমি ভেবেছিলাম এটি একটি ভাল নির্দেশযোগ্য হবে।

এই কোডটি Atmega 2560 মাইক্রোকন্ট্রোলারের জন্য ডিজাইন করা হয়েছে, তাই আপনি যদি এটি অন্য বোর্ডে প্রয়োগ করতে চান তাহলে আপনার কন্ট্রোলার ইউজার ম্যানুয়ালের উপর ভিত্তি করে কোডের ঠিকানা রেজিস্টারগুলি পরিবর্তন করতে হবে। কোডের পিছনে মৌলিক ধারণা হল যে যখনই আপনি সিরিয়াল মনিটরে কীবোর্ডের একটি কী প্রবেশ করান, তখন Arduino মেগা আপনি কোন কী টিপবেন তার উপর ভিত্তি করে একটি নির্দিষ্ট ফ্রিকোয়েন্সি আউটপুট করবে, "q" রিসেট করে। আমি এটা তৈরি করেছি যাতে "a" A সমতল ফ্রিকোয়েন্সি এবং "A" A ধারালো ফ্রিকোয়েন্সি আউটপুট করবে, "b" B ফ্ল্যাট ফ্রিকোয়েন্টি আউটপুট করবে, C ফ্ল্যাটের জন্য "c", C শার্পের জন্য "C" ইত্যাদি। সম্পূর্ণ কোডটি শেষ পর্যন্ত আপলোড করা হয়েছে, কিন্তু প্রতিটি ধাপে কোডটি টুকরো টুকরো হয়ে যাবে যাতে ব্যাখ্যা করা সহজ হয়।

ধাপ 1: নিবন্ধনের ঠিকানা নির্ধারণ করা

রেজিস্টার ঠিকানা নির্ধারণ
রেজিস্টার ঠিকানা নির্ধারণ

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

ধাপ 2: অ্যারে এবং গ্লোবাল ভেরিয়েবল

অ্যারে এবং গ্লোবাল ভেরিয়েবলস
অ্যারে এবং গ্লোবাল ভেরিয়েবলস
অ্যারে এবং গ্লোবাল ভেরিয়েবলস
অ্যারে এবং গ্লোবাল ভেরিয়েবলস
অ্যারে এবং গ্লোবাল ভেরিয়েবলস
অ্যারে এবং গ্লোবাল ভেরিয়েবলস

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

ধাপ 3: "serial.begin" ফাংশন

দ্য
দ্য

আমরা আমাদের কাস্টম ফাংশনকে কল করব যা "serial.begin" ফাংশন U0init () এর প্রতিলিপি করে। এটি ইনপুট হিসাবে কাঙ্ক্ষিত বাউড্রেট নেয় এবং সেই বাডরেটে সিরিয়াল পোর্ট শুরু করে।

ধাপ 4: "serial.available" ফাংশন

দ্য
দ্য

আমরা "serial.available" U0kbhit () অনুকরণকারী ফাংশনটিকে কল করব। এটি ইনপুট নেয় না বরং RDA স্ট্যাটাস বিট ব্যবহার করে কীবোর্ডে কোন পরিবর্তন হয় কিনা তা সনাক্ত করে এবং পরিবর্তন সনাক্ত হলে সত্য ফিরে আসে।

ধাপ 5: "serial.read" ফাংশন

দ্য
দ্য

আমরা যে ফাংশনটিকে "serial.read" ফাংশন U0getchar () অনুকরণ করে কল করব, যা কোন ইনপুট নেয় না এবং কীবোর্ডে যে কোন পরিবর্তন করা হয়, যা UDR0 রেজিস্টারে সংরক্ষিত থাকে।

ধাপ 6: "serial.write" ফাংশন

দ্য
দ্য

আমরা "serial.write" U0putchar () অনুকরণকারী ফাংশনকে কল করব, যা UDR0 রেজিস্টার থেকে ডেটা গ্রহণ করে যখন একটি পরিবর্তন সনাক্ত এবং সংরক্ষণ করা হয়, এবং আউটপুট যা সিরিয়াল মনিটরে ফিরে আসে।

ধাপ 7: সেটআপ ফাংশন

সেটআপ ফাংশন
সেটআপ ফাংশন

এটি মৌলিক সেটআপ ফাংশন যা সিরিয়াল পোর্ট শুরু করার জন্য আমাদের "serial.begin" অনুকরণ ব্যবহার করবে, এবং টাইমার রেজিস্টারগুলির জন্য আমাদের বিট সেটিংস আরম্ভ করবে এবং PB6 কে আমাদের টোন আউটপুট করার জন্য সেট করবে।

ধাপ 8: লুপ এবং ISR ফাংশন

লুপ এবং আইএসআর ফাংশন
লুপ এবং আইএসআর ফাংশন

লুপ এইভাবে কাজ করে: যদি আমাদের "serial.available" ফাংশনের সাথে কোন পরিবর্তন ধরা পড়ে, তাহলে আমাদের "serial.read" ফাংশনটি পরিবর্তিত হয় এবং আমাদের "serial.write" ফাংশন সেই পরিবর্তনকে সিরিয়াল মনিটরে রাখে। যতক্ষণ একটি ভেরিয়েবল i ফ্রিকোয়েন্সি অ্যারের আকারের চেয়ে কম, এটি আউটপুটটিকে সেই অ্যারেতে i এর অবস্থান হিসাবে সেট করবে, সেই অবস্থানে ফ্রিকোয়েন্সি আউটপুট করবে। ISR রিসেট হিসাবে কাজ করে, যেখানে ফ্রিকোয়েন্সি অ্যারের অবস্থান 0 এর সমান না হলে (অন্য কথায় যদি "q" টিপানো না হয়), এটি ফ্রিকোয়েন্সি আউটপুট করবে, কিন্তু যখন "q" চাপবে তখন এটি পুনরায় সেট হবে। দয়া করে মনে রাখবেন: এই কোডটি ইন্টারাপ্ট ব্যবহার করে, কিন্তু এটি নিষ্ক্রিয় ইন্টারাপ্ট দিয়ে করা যেতে পারে। যদি আমি এর জন্য কোন অনুরোধ পাই তবে আমি বাধা ছাড়াই কোডটি পোস্ট করব, আমি শুধু মনে করি বাধা সংস্করণটি আরও মজাদার।

ধাপ 9: তারের

তারের
তারের

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

ধাপ 10: সবকিছু একসাথে করা

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

এছাড়াও, অনুগ্রহ করে মাইক্রোকন্ট্রোলার প্রতিযোগিতায় এর জন্য ভোট দিন: D

প্রস্তাবিত: