اگر به رباتها علاقه مند هستید، حتما در مورد میکروکنترلرها شنیدهاید. به زبان ساده، یک میکروکنترلر یک کامپیوتر کامل است که به صورت یک چیپ جامع شامل پردازنده، حافظه، پینهای ورودی و خروجی و … درآمدهاست. بیشتر ماشینآلات خودکار همچون ماشینهای لباسشویی، ماکروفرها، تلفنهای همراه، ابزار بازی دارای یک میکروکنترلر هستند که در داخل مدار پیچیده این دستگاهها قرار گرفتهاند و تصمیمات هوشمندانهای میگیرند.
میکروکنترلرها به اندازه کامپیوترها قدرتمند نیستند. اما به اندازه کافی برای ارتباط و کنترل دیگر دستگاهها همچون سنسورها، موتورها، صفحههای نمایش و یا حتی یک میکروکنترلر دیگر از طریق پین ورودی و خروجیاش مناسب و کارآمد هستند. یک میکروکنترلر معمولی، دارای پینهای متوالی است، که میتواند از طریق خواندن یا نوشتن توالی «صفر» ها و «یک» ها با دیگر وسایل ارتباط داشته باشد. از منظر الکترونیک، پینها میتوانند به گونهای برنامهریزی شوند که در هنگام ارتباط با دیگر ابزار، به حالت روشن (high) یا خاموش (low) درآیند.
انتخاب یک میکروکنترلر
امروزه سازندههای میکروکنترلر بسیاری همچون AVR، PIC، 8051، ARM و … وجود دارند. هر سازنده یک کاتالوگ از میکروکنترلرهای مختلف تولیدی خود دارد که بر اساس معماری استفاده شده، مقدار حافظه، پینهای موجود و ویژگیهای داخلی از یکدیگر متمایز شدهاند.
انتخاب یک میکروکنترلر میتواند دشوار باشد. همچنین باید بدانید که میکروکنترلرهایی با ویژگیهای مشابه توسط سازندگان و نامهای تجاری متفاوت در دسترس هستند. در صورت آشنایی با نحوه برنامه نویسی و راهاندازی یک مدل میکروکنترلر، کار کردن با انواع دیگر ساده خواهد بود.
در یک میکروکنترلر چه وجود دارد؟
یک میکروکنترلر به طور کلی شامل یک واحد پردازش، رم (حافظه فرار)، حافظه فلش و پایههای ورودی-خروجی دیجیتال است. تعداد کمی از میکروکنترلرها ممکن است دارای ویژگیهای اضافی مانند مبدل آنالوگ به دیجیتال (ADC)، تایمر، مدولاسیون عرض پالس (PWM)، شمارنده، وقفه، انتقال سریال (UART)، باس سریال (I2C) و … باشند.
پردازنده
واحد پردازش مرکزی (CPU) یک میکروکنترلر شامل یک واحد محاسباتی-منطقی (ALU) و یک واحد کنترل (CU) و تعدادی رجیستر (حافظه) عمومی و اختصاصی است. اگر در زمینه علم کامپیوتر آگاهی دارید و فکر میکنید که CPU چیزی کم دارد باید بدانید که واحد مدیریت حافظه (MU یا MMU) در میکروکنترلر وجود ندارد.
حافظه
اینجا جایی است که برنامه ذخیره میشود. حافظه میتواند حافظه فلش، رم، EEPROM (حافظهای که به صورت الکترونیکی قابلیت برنامه ریزی و پاکسازی را دارد) و .. باشد که هرکدام برای هدفی مخصوص به کار میروند.
پینهای ورودی-خروجی (پینهای IO)
مهمترین ویژگی یک میکروکنترلر از دیدگاه یک برنامهنویس میباشند. تعداد پینها و حافظه موجود معمولا قدرت یک میکروکنترلر را تعیین میکند. پینها میتوانند فقط پایههای ورودی، پایههای خروجی یا هر دو پایه ورودی و خروجی باشند. آنها میتوانند به عنوان پین آنالوگ یا پین دیجیتال عمل کنند. معمولا میکروکنترلرها دارای مبدل آنالوگ به دیجیتال داخلی هستند تا با دنیای مشابه واقعی ارتباط برقرار کنند.
پینهای ورودی-خروجی عموما در پورتهایی دستهبندی میشوند که هر پورت دارای 8 پین است (ممکن است کمتر از 8 پین فیزیکی داشته باشند، اما پینها به صورت یک بایت در دسترس هستند و هر بیت یک پین را کنترل میکند).
تایمر یا شمارنده
از تایمر برای اندازهگیری فاصله یا وقفههای زمانی بین فعالیتها استفاده میشود. اما شمارندهها همانگونه که از اسمشان پیداست برای شمردن فعالیتها به کار میروند.
وقفهها
اینها قاعدهشکن هستند و برای قطع کردن یک برنامه عادی استفاده میشوند. به طور کلی اکثر میکروکنترلرها دارای یک تابع وقفه داخلی هستند.
ویژگیهای دیگر
از میکروکنترلرها اکثرا برای عملیات اصلی ورودی و خروجی استفاده میشود. با این حال، ممکن است شامل ویژگیهای تخصصی مانند تبدیل آنالوگ به دیجیتال، کنترلکنندههای باس (bus controllers)، پشتیبانی از اترنت (Ethernet support)، رابط USB، ویژگیهای ورودی-خروجی سریال (UART) و پشتیبانی از پروتکلهای ارتباطی دیگر مانند I2C (TWI در میکروکنترلرهای AVR)، SPI (واسط جانبی سریال) و غیره باشند.
برنامهریزی یک میکروکنترلر
مبنای یک میکروکنترلر در پینهای ورودی-خروجی آن قرار دارد. خوشبختانه، میکروکنترلرها را میتوان برنامهریزی کرد و مجموعهای از دستورالعملها میتوانند به کنترل این پینهای ورودی-خروجی کمک کنند. اگر قبلا از برنامهنویسی در رایانه شخصی مطلع هستید، برنامهریزی یک میکروکنترلر دشوار نخواهد بود. یک واقعیت مهم که باید بدانید این است که وقتی یک میکروکنترلر را برنامهریزی میکنید، مستقیما با سختافزار در تعامل هستید.
زبانهای برنامهنویسی
بیشتر میکروکنترلرها از انواع گستردهای از زبانها پشتیبانی میکنند که زبان C پرکاربردترین زبان در میان میکروکنترلرهاست. دیگر زبانها همچون جاوا، C++ و بیسیک نیز پشتیبانی میشوند و همینطور اگر میخواهید عصبانی شده و سرتان را بخارید و موهایتان را بکشید، زبان اسمبلی هم پشتیبانی میشود اما این را بدانید که برنامهنویسی با زبان اسمبلی کنترل بیشتری به شما میدهد. (جهت مطالعه بیشتر به مقالات روشهای برنامه نویسی ربات و سطحهای زبان رباتیک مراجعه نمایید.)
زبان C پرکاربردترین است، البته این یک زبان انتخابی است و یک جامعه پشتیبانی بزرگ از آن پشتیبانی میکند، به خصوص اگر با میکروکنترلرهای AVR کار میکنید. (واقعیت این است که «من» به خصوص کدنویسی در C را آسانتر میدانم و تعداد کمی استدلال میکنند که بیسیک بسیار بهتر است)
مانند سایر روشهای توسعه نرمافزار، پیروی از مجموعهای از مراحل از پیشتعریفشده (Waterfall، Agile، Iterative و … ؛ برای کسانی که به توسعه نرمافزار علاقه دارند) همیشه معقول است. اما مطمئن شوید که حداکثر زمان را به مرحله طراحی خود اختصاص دادهاید زیرا یک طراحی خوب به احتمال زیاد منجر به یک محصول نهایی موفق خواهد شد.
چه زمانی نباید از میکروکنترلر استفاده کرد؟
اگر باید رباتی طراحی کنید که هوشمند باشد و قدرت تصمیمگیری داشته باشد، بهتر است از یک میکروکنترلر استفاده کنید. اما رباتهایی وجود دارند که بر اساس سختافزارهای منطقی و مدارهای آنالوگ کار میکنند و از میکروکنترلر استفاده نمیکنند؛ مثلا اگر به ساختن یک ربات BEAM (خلاصه برای زیستشناسی، الکترونیک، زیباییشناسی و مکانیک) علاقه دارید و هدف شما این است که ربات را به وسیله انرژی خورشیدی شارژ کنید و پس از شارژ کامل حرکت دهید، بنابراین تنها به مجموعهای از ترانزیستورها و خازنها نیاز دارید. اگر می خواهید یک ربات مانعردکن بسازید، پس یک سنسور ضربه (کلید ضربهای لمسی) با تعدادی ترانزیستور میتواند مدار منطقی لازم برای کنترل ربات در اختیار شما قرار دهد.
با برنامهریزی و کنترل پینهای یک میکروکنترلر میتوانید زندگی آسانتری برای خود فراهم کنید. اگر به اندازه کافی باهوش هستید که آزمایش کنید، میتوان رباتها را حتی بدون استفاده از میکروکنترلر ساخت. اما وقتی میتوانید با کمک میکروکنترلر با آسودگی خیال کار کنید، چرا ریسک کنید.
برای اطلاعات بیشتر در مورد میکروکنترلرها مجموعهای از آموزشها و پروژهها در ردرونیک تهیه شده است، که میتوانید به آنها مراجعه کنید (آموزش AVR و آموزش ARM).
طبقهبندی میکروکنترلرها
میکروکنترلرها بر اساس جنبههای مختلف همچون معماری، زبان برنامهنویسی استفادهشده، پهنای باس، حافظه، مجموعه دستورالعمل و … طبقهبندی میشوند.
پهنای باس
میکروکنترلرها بر اساس اندازه پهنای باس همچون 4 بیت، 8 بیت، 16 بیت، 32 بیت و … طبقهبندی میشوند. زمانی که میگوییم از یک میکروکنترلر 16 بیت استفاده میکنیم، منظور ما این است که دستورالعملها به صورت دستههای 8 بیت (یا 1 بایت) فرستاده میشوند. (اگر میخواهید بدانید که منظور از بیت و بایت چیست، به مقاله آموزشی اعداد دودویی در مفاهیم پایه الکترونیک مراجعه کنید)
معماری
معماری، طراحی مفهومی و ساختار عملیاتی یک سیستم است. در طراحی میکروکنترلرها دو معماری اصلی یعنی معماری هاروارد و معماری فون نیومان در نظر گرفته شدهاست. تفاوت این دو معماری در نحوه دسترسی و ذخیرهسازی دادهها و برنامهها است.
- معماری هاروارد: در این معماری، از حافظههای فیزیکی مجزا همراه با باسهای اختصاصی خود برای دستورالعملها و دادهها استفاده میشود. این طراحی باعث میشود تا اجرای سریعتر و جریان دادهها به موازات یکدیگر اتفاق بیفتد.
- فون نیومان: برخلاف معماری هاروارد، این کنترلکننده میتواند یک دستورالعمل را بخواند، دادهها را از حافظه بخواند یا روی آن بنویسد. هر دو نمیتوانند همزمان اتفاق بیفتند زیرا از یک باس، برای کدهای دستوری و انتقال داده استفاده میشود.
مطمئنا تا به حال حدس زدهاید که معماری هاروارد مزایای بیشتری دارد و بیشتر میکروکنترلرها از این معماری بهره میبرند.
مجموعه دستورالعمل
نوع دیگر طبقه بندی، معماری بر اساس مجموعه دستورالعمل است. رایانهها بر اساس دستورالعملهای سختافزاری کار میکنند که به آن «مجموعه فرمان» نیز گفته میشود که مجموعه اصلی دستوراتی است که یک میکروکنترلر یا یک ریزپردازنده درک میکند. این دستورات را میتوان توسط نرم افزار فراخوانی کرد تا دستورات مختلفی مانند جمع، تفریق، انتقال داده و غیره را بر روی CPU آغاز کند.
دو سبک طراحی اساسی، بازار کنونی را تحت تسلط خود قرار داده است. این دو سبک CISC و RISK هستند.
- CISC که به صورت «سیسک» تلفظ می شود، مخفف «مجموعه دستورالعمل پیچیده محاسباتی» است که از دستورالعملهای پیچیدهای استفاده میکند که در رام (حافظه فقط خواندنی) رمزگذاری شدهاند و هر زمان که نیاز باشد توسط نرم افزار فراخوانی میشوند؛ اکثر CPU های کامپیوتر از این معماری استفاده کردهاند؛ اساسا مجموعهای از دستورالعملهای بزرگ و پیچیده هستند که مستقیما از حافظه اجرا میشوند و به عنوان لایه انتقال بین دستورالعملها و ابزار الکترونیکی عمل میکند. در زمانی که کامپیوترها شروع به گسترشکردند، توسعه CISC یک جهش بزرگ در افزایش عملکرد ایجاد کرد و همچنین به دلیل وجود کدهای ریز در دستورالعملها هزینه کمتری داشت. با این حال، CPUها برای اجرای یک دستورالعمل به سیکلهای انتقال اطلاعات زیادی نیاز داشتند.
- با ظهور هر نسل جدید کامپیوتر، سختافزار تراشهها پیچیدهتر و پیچیدهتر میشد و کدگذاری ریز هر دستورالعمل شروع به ایجاد مشکل کرد. در این زمان، طراحان و محققان به فکر استفاده از مجموعه کوچکی از دستورالعملهای سادهشده و همچنین کاهش تعداد سیکلهای داده مورد نیاز برای اجرای یک دستورالعمل افتادند. این طرح جدید به عنوان «مجموعه دستورالعمل کاهش یافته محاسباتی» یا RISC (تلفظ به صورت «ریسک») شناخته شد. معماری RISC سریعتر بود، به سختافزار سادهتری نیاز داشت و در مقایسه با معماری CISC ارزانتر بود (دستورالعملهای ساده از ترانزیستورهای کمتری استفاده میکنند و طراحی آن آسانتر میباشد). امروزه اکثر CPU ها و میکروکنترلرها از معماری RISC استفاده میکنند و CISC برای بقا به سختی با رقیب خود مبارزه میکند.
همیشه در مورد اینکه کدام طراحی بهتر است بین کارشناسان اختلاف نظر کلی وجود دارد. برخی اظهار میکنند CISC پیچیده است و برخی دیگر می گویند RISC به نرم افزار پیچیده نیاز دارد. اما ما به انتخاب بهتر بودن اهمیتی نمیدهیم. هر طرحی که هدف ما را برآورده کند، خوب و مناسب است.
انواع میکروکنترلرها
دهها سازنده مختلف وجود دارند که میکروکنترلرها را تولید میکنند: برخی از آنها عبارتنداز: اینتل (8051)، اتمل (AVR)، تکنولوژی میکروچیپ (PIC)، هیتاچی (Hitachi)، موتورولا و … . در مورد دو نوع میکروکنترلر، AVR و PCI، که اخیرا غوغا کردهاند، بحث خواهیم کرد.
AVR
AVR که توسط اتمل (Atmel ) توسعه داده شدهاست، یک میکروکنترلر تک چیپ است که بر اساس معماری هاروارد اصلاحشده RISC پیادهسازی شدهاست. AVR مخفف کلمات خاصی نیست و هیچ معنایی ندارد و فقط نامی است که شرکت اتمل برای میکروکنترلر با معماری RISC خود برگزیده است.
خانواده میکروکنترلرهای AVR منسجم و قابل درک هستند و معماری آن به ویژه برای کامپایلر C مناسب است. GCC، نوعی از زبان برنامهنویسی C برای پشتیبانی از پردازنده هدف AVR است و به طور گسترده به عنوان AVR-GCC شناخته میشود. این بدان معنا نیست که هیچ حمایتی از زبان اسمبلی وجود ندارد؛ کامپیوترها میتوانند به خوبی از زبان اسمبلی و کنترل سطح پایین آن بهره ببرند. همچنین از زبان بیسیک نیز برای علاقهمندان به استفاده از آن پشتیبانی میشود.
PIC
این میکروکنترلر نیز مبتنی بر معماری هاروارد است که هم در میان توسعهدهندگان صنعتی و هم در میان علاقهمندان محبوبیت دارد. PIC مخفف «کنترلر رابط محیطی-Peripheral Interface Controller» است. این نوع میکروکنترلر از زبانهای برنامهنویسی C، اسمبلی و بیسیک پشتیبانی میکند.
AVR در برابر PIC
در دنیای رباتیک، این یک بحث همیشه داغ است. برخی AVR را دوست دارند در حالی که برخی به PIC علاقهمندند. شخصا AVR را ترجیح میدهم، اما PIC هم دنبالکنندگان خاص خود را دارد. بدون وارد شدن به این مشاجره، دلایلی را که چرا AVR را ترجیح میدهم بیان خواهم کرد. هنگامی که با هر نوع میکروکنترلر آشنا شدید، درک آن و تغییر آن به سایر میکروکنترلرها آسانتر میشود. (البته اگر آماده هستید دوباره وارد روند یادگیری شوید)
زبانهای برنامهنویسی
زبان اسمبلی
هر دو میکروکنترلر AVR و PIC از زبان اسمبلی پشتیبانی میکنند و اسمبلرهای رایگان ارایه میدهند؛ MPLab برای کنترلر PIC و AVRTools برای کنترلر AVR که از سیستم عامل ویندوز پشتیبانی میکنند. اسمبلرها برای سیستم عامل لینوکس هم وجود دارند؛ اما به دلیل معماری پیچیدهشان، برنامهنویسی در زبان اسمبلی برای کنترلر PIC دشواریهای خاص خود را دارد.
زبان C
این زبان سریع و سبک توسط هر دو میکروکنترلر پشتیبانی میشود. AVR از C پشتیبانی میکند و شرکت اتمل یک کامپایلر رایگان با کیفیت بالا و پلتفرم کاملا متقابل را ارائه دادهاست. از طرف دیگر، اگرچه PIC از C پشتیبانی میکند، کامپایلری که ارائه دادهاند رایگان نیست. یک نسخه دانشجویی رایگان موجود است، اما محدودیتهای خاص خود را دارد؛ مانند عدم به روز رسانی مکرر؛ بهینهسازی محدود کد و غیره. اینجا جایی است که AVR برتری پیدا میکند و بسیاری از علاقهمندان (از جمله من) برای انتخاب کامپایلرها و میکروکنترلرها به سراغ AVR میروند.
زبان بیسیک
در این عصر چه کسی از زبان بیسیک استفاده میکند؟ من که استفاده نمیکنم. اگر کسی هنوز هم به این زبان علاقه دارد، برای AVR و PIC، کامپایلرهای بیسیک وجود دارند.
IDE (محیط توسعه یکپارچه)
نرمافزارهای (Integrated development environment) به توسعهدهندگان کمک میکنند تا سرعت توسعه، اشکالزدایی و کامپایل را بالا ببرند و همچنین ویژگیهای دیگری همچون شبیهسازی دارند. IDE، برای هر دو کنترلر AVR و PCI، نرمافزارهای IDE جالبی برای توسعه، اشکالزدایی و کامپایل آسان فراهم کردهاند.
هزینه
هر دو میکروکنترلر قیمت مناسبی دارند و با تمام ویژگیهایشان در بازار موجود هستند.
نتیجهگیری
برای طراحی اولین ربات خود، هیچ تفاوتی برای انتخاب میکروکنترلر بین AVR و PCI وجود ندارد. تنها موضوع مهم، شروع به کار و انتخاب یکی از میکروکنترلرهاست. از آنجایی که بیشتر پروژههای این سایت بر روی میکروکنترلر AVR توسعه داده خواهند شد، پیشنهاد میکنم از AVR استفاده کنید. با این وجود اگر میکروکنترلر PIC را انتخاب کردهاید، پس تغییرات کوچکی در طراحی و تغییرات دیگری در برنامه نوشتهشده میتواند در شروع کار به شما کمک کند. زمانی که کار با AVR را یاد گرفتید (یا هر میکروکنترلر دیگر)، میتوانید بر اساس نیازهایتان به دیگر میکروکنترلرها رجوع کنید.