# برنامه نویسی میکروکنترلر (MicroController) ها و MicroProcessor ها > برنامه نویسی سیستم های Embeded > مباحث عمومی کار با سخت افزارها، سنسورها و لوازم جانبی >  یک سوال اساسی حداقل برای من!!

## prince0fpersia

با سلام به همگی دوستان و عزیزان

خوشحالم که بعد از یکی دو سال دوباره دارم اینجا پست میذارم

نمیدونم جایی که پست گذاشتم درسته یا نه ، دوستان به بزرگیشون ببخشند

آقا

من رشته ام سخت افزاره 

میخوام بزنم تو کار سیستم های هوشمند مثل رباتیک (مثلا انسان نما ) و شبیه اون

اما نمیخوام از میکرو کنترولر در اون استفاده کنم و میخوام از یک مادر برد کامل توش استفاده کنم 

و یا اگه واقعا دیدم اصلا به صرفه نیست ، از میکروپروسسورهایی مثل خانواده کرتکس آرم استفاده کنم

درمورد برنامه نویسی آرم که مشخصه ...بخش جدا هم داره ، این هیچی

اما در مورد قسمت اول سوالم ، اگر بخوام همین لپتاپی که باهاش دارم مینویسم بشه مغز اون سیستم من ، و مثلا 4 تا وسیله جانبی ( از بازوهای مکانیکی گرفته تا موتور های دی سی واسه چرخ!! ) بهش وصل کنم ، من باید چه طور برنامه نویسی کنم؟

باید برم کار با پورت ها (همون درگاه های آی / او ) رو یاد بگیرم و بعد ببینم مادر  برد من چیا داره و از اون پرت ها استفاده کنم؟

چه کتابی هست که به صورت تخصصی روی این مورد آموزش داده باشه و ترجمه هم شده باشه؟ (تو کتاب C++‎‎ how to program) همچین مباحثی پیدا میشه؟

اصلا کدوم زبون واسه این کار خوبه؟( سی ++ ؟ جاوا؟ یا حتی سی # که انگار جدیدا میکرو ها هم دارن به اون سمت میرن!!)


بازم سوال دارم اما اگه دوستان لطف کنند و به همینا جواب بدند سراغ بقیه هم میرم و شاید جواب بقیه شو هم گرفتم

با سپاس فراوان و آرزوی موفقیت برای همگی

----------


## IamOverlord

زبان مشترک همه ی Micro ها : Assembly
وقتی Assembly رو یاد گرفتی (نه صرفا برای PC)، بعد می تونی از C برای تسریع کار استفاده کنی.
در کل که باید از Micro-Processor یا Micro-Controller استفاده کنی. ولی اگه می خوای از پردازنده ی PC استفاده کنی باید Instruction های Assembly برای X86 رو یاد بگیری، بعد نحوه ی برقراری ارتباط از طریق Port های I/O با دستورات IN و OUT.
اما بهتره از سیستم عاملی برای کارت استفاده کنی و اون رو برای کارت تغییر بدی.
زبان های سطح بالا رو بی خیال! چون فقط با ساختار های سطح بالا کمکت می کنن تا کارو انجام بدی وگرنه در نهایت باید با زبون اون Micro باهاش صحبت کنی (با Op-Code هاش در Assembly)، پس بهتره ابتدا Assembly رو یاد بگیری نه زبونی مثل #C.
ضمنا Motherboard بدون Micro-Processor هیچه، اما همین Motherboard ها با یه 80386 می شن ... ! در نهایت بگم اگه می خوای با PC ات این کارو کنی و از تمام قابلیت های CPU ات (مثل Multitasking و هزار تا قابلیت دیگه که در حالت Protected Mode هست) استفاده کنی برنامه نویسی Assembly برای سری i386 در Protected Mode رو یاد بگیر.

----------


## maktoom

سلام
چندوقت پیش یه گروه تو مشهد برای پردازش جالبی کاری مشابه کاری که شما می خواید انجام بدید رو انجام دادن(البته از حیث سخت افزار)
اونا چندین گوی(ماتریسهای مثلا 50 در 100 تایی که درایه های اون گوی ها بودن) رو با نخ های نامرئی آوزیون کرده بودن و اونها رو بصورت بسیار منعطف و البته بسیار دقیق به اشکالی که مورد نظرشون بود در میوردن.

----------


## Felony

> باید برم کار با پورت ها (همون درگاه های آی / او ) رو یاد بگیرم و بعد ببینم مادر برد من چیا داره و از اون پرت ها استفاده کنم؟


بله .




> چه کتابی هست که به صورت تخصصی روی این مورد آموزش داده باشه و ترجمه هم شده باشه؟ (تو کتاب C++‎‎‎‎‎ how to program) همچین مباحثی پیدا میشه؟


تو نت در مورد استفاده از USB جست و جو کنید ، مقالات خیلی خیلی زیادی پیدا میشه .




> اصلا کدوم زبون واسه این کار خوبه؟( سی ++ ؟ جاوا؟ یا حتی سی # که انگار جدیدا میکرو ها هم دارن به اون سمت میرن!!)


بهترین زبان بی شک ++C هست ولی اگر اسمبلی هم بلد باشی خیلی مفید هست .

در مورد استفاده از Motherboard هم خیلی راحت میتونی یک سیستم ضعیف و جمع و جور پیدا کنی و روش یک ویندوز ( حتی 98 ! ) بریزی و با استفاده از API هایی که ویندوز در اختیارتون قرار میده با پورت ها ارتباط برقرار کنید .

----------


## prince0fpersia

> بهترین زبان بی شک ++C هست ولی اگر اسمبلی هم بلد باشی خیلی مفید هست


میشه در این مورد بیشتر توضیح بدید؟ چون مثلا زبونی مثل جاوا یه چیزی هستش که رو همه سخت افزارها فکر میکنم اجرا میشه و زبون قوی هم هست ...یا مثلا دلیل تغییر زبان دادن میکرو های جدید(خانواده آرم) به سی شارپ چی هستش؟ چون قبلا با سی ++ پروگرم میشدند ( آیا دلیلش فقط راحت شدن کار برای کاربر بوده؟!) یا مثلا چه ضعفی نسبت به سی ++ داره؟

اما در مورد اسمبلی هم که دوستان اشاره کرده بودند ... یعنی کارهایی هست که با سی++ نشه انجام داد و با اسمبلی بشه؟ اصلا پیشنهاد یاد گرفتن اسمبلی برای چی هست؟ و در چه سطحی مد نظره و به چه کارهایی ممکنه بیاد؟

چون ما تو دانشگاه یه آشنایی مقدماتی با اسمبلی داشتیم منتهی اغلب پراکنده بوده و چیز خاصی هم ازش سر در نیاوردیم!! :اشتباه:

----------


## Felony

> چون مثلا زبونی مثل جاوا یه چیزی هستش که رو همه سخت افزارها فکر میکنم اجرا میشه و زبون قوی هم هست ...


جاوا رو همه سخت افزاری اجرا میشه ؟! کی همچین چیزی گفته ؟ جاوا خودش وابسته به JVM هست اون وقت چه طور رو همه سخت افزار ها ...




> یا مثلا دلیل تغییر زبان دادن میکرو های جدید(خانواده آرم) به سی شارپ چی هستش؟


این ها رو کی بهتون گفته ؟! #C و ARM ؟!
اونی که میبینید برای میکروهای ARM با #C برنامه مینویسن به خاطر این هست که روی بردهاشون Windows CE نصب کردن و بعدش هم یک Net. و بنابراین با و #C براش برنامه مینویسن ، OK ؟

#C وابسته به Net Framework. هست ...




> اما در مورد اسمبلی هم که دوستان اشاره کرده بودند ... یعنی کارهایی هست که با سی++ نشه انجام داد و با اسمبلی بشه؟ اصلا پیشنهاد یاد گرفتن اسمبلی برای چی هست؟ و در چه سطحی مد نظره و به چه کارهایی ممکنه بیاد؟


تقریبا با C همه کار میتونید بکنید ولی اگر میخواین کنترل بشتری روی ثبات ها و ... داشته باشید ASM هم لازم میشه .

----------


## prince0fpersia

> این ها رو کی بهتون گفته ؟! #C و ARM ؟!


اینو تو اطلاعات برد های جدید سایت ایران میکرو دیدن که از هسته آرم استفاده میکنن ... قابلیت پرگرام شدن با سی شارپ




> جاوا رو همه سخت افزاری اجرا میشه ؟! کی همچین چیزی گفته ؟


اینو هم چند سال پیش توی یک مقاله ای با عنوان یکبار بنویس و همه جا اجرا کن ( یه همچین چیزایی) خونده بودم

ضمنا برنامه هایی که به زبون جاوا نوشته میشن رو همه موبایل ها و یا کامپیوتر ها و ... اجرا میشن ، از اون جهت عرض کردم

به هر حال رشته من نرم افزار نیست و زیاد نمیتونم تخصصی راجع به این موارد صحبت کنم و تقریبا از دید عموم گفتم این چیز هارو


من حدود دو ساعت سرچ کردم اما مطلب به درد بخوری در مورد آموزش پایه ای و جامع برنامه نویسی پورت ها و مخصوصا یو اس بی به زبان فارسی پیدا نکردم ...لطفا شما اگر در اختیارتون هست برای من و احیانا بقیه قرار بدین

بعدشم من یک چیزی به ذهنم رسید ... پورت یو اس بی در محیط داس فکر میکنم غیر فعال هست درسته؟ ( قبل بالا اومدن ویندوز که غیر فعاله)

خواستم ببینم چون من بیشتر دنبال طراحی ربات هستم این مسدله که فقط از این پورت واسه همه سیستم و ماژول ها استفاده کنم مشکل ساز نمیشه؟!! اصلا همچین چیزی ممکنه؟

----------


## IamOverlord

اولا که زبان همه ی Micro ها سطح پایین هست (نه مثل #C سطح بالا، که اصلا برای Micro قابل فهم نباشه)، اگر هم جایی گفته فلان Micro با فلان زبان Programme می شه منظورش این بوده که کدهای اون زبان به Op-Code های قابل فهم برای اون Micro تبدیل می شه.

این هم که می گن Java روی همه ی سخت افزار ها اجرا می شه غلطه، منظور اینه که Java روی همه ی Platform ها و محیط های نرم افزاری اجرا می شه، خوب طبیعتا باید اون محیط نرم افزاری از Java پشتیبانی بکنه وگرنه ... !




> من حدود دو ساعت سرچ کردم اما مطلب به درد بخوری در مورد آموزش پایه ای و جامع برنامه نویسی پورت ها و مخصوصا یو اس بی به زبان فارسی پیدا نکردم ...


این جور اتفاقات طبیعیه چون منابع فارسی بسیار ضعیف و کم محتوا هستن...




> پورت یو اس بی در محیط داس فکر میکنم غیر فعال هست درسته؟


درگاه USB خیلی دیر به جمع سخت افزار ها پیوست بنابراین در حالت 16 بیتی (Real Mode) نمی تونید مثل بقیه باهاش کار کنید.

----------


## prince0fpersia

پس با این حساب برای کار با یو اس بی باید اون سیستم حتما یک سیستم عاملی روش باشه که این درگاه رو ساپورت کنه

من با یکی دیگه از دوستان که در زمینه رباتیک و مخصوصا ربات های انسان نما کار میکنم صحبت کردم و پرسیدم به برنامه نویسی ربات آیا سبک یا اسم خاصی میگن؟ (مثلا ، مثل ویندوز اپلیکیشن) که ایشون در جواب گفتن " system programing and socket programing " 

قسمت هایی از حرفاش رو کپی میکنم :

" این ربات ها یا بهتر بگم این برد ها تقریباٌ مثل کامپیوتر هستند و روشون  سیستم عامل نصب میکنیم. حالا سیستم عامل ویندوز یا لینوکس. اگه ویندوز  روشون نصب کنیم با C#‎ کد مینیویسیم و اگه لینوکس با C++‎ 


شما برای این که شروع کنین بهتره با یه زبان برنامه نویسی مثلاٌ همون C#‎ تو ویندوز شرو کنین و....
از DLL های OpenCV هم میتونین استفاده کنین "

به همین دلیل دچار تناقض شدم من!!

راستی من از استاد درس سیستم عامل دانشگاهمون هم که پرسیدم " آیا سرعت اجرای زبان سی مثلا با سی شارپ فرق میکنه تو سیستم عامل؟ " جوابشون این بود که : " فرقش در این هست که چون در سی شارپ از توابع آماده استفاده میشه ، ممکنه اون سیستم در بهینه ترین حالت قرار نگیره و نیاز به تغییراتی در خیلی توابع آماده باشه ...از این جهت شاید سرعت برنامه هایی که با سی شارپ نوشته میشن از سی پایینتر باشن ، وگرنه برای کامپیوتر فرقی نمیکنه شما با چه زبونی کد مینویسین "

حالا نمیدونم برداشت من از حرف ایشون که نوشتم چقدر درسته


و یک چیز دیگه هم اینکه در مورد برنامه نویسی ربات ها
قسمت برنامه اصلی و اون الگوریتم ها و پیاده سازی ها و به قول معروف هوش مصنوعی مشابه برنامه نویسی عادی هستش و فقط خروجی ها باید به درگاه های آی/او فرستاده بشه؟
و یا از کتابخانه های کار با آی/او در برنامه استفاده بشه؟

راجع به DLL و API هم میشه یه توضیحی بفرمایید
همچنین open cv

----------


## IamOverlord

> پس با این حساب برای کار با یو اس بی باید اون سیستم حتما یک سیستم عاملی روش باشه که این درگاه رو ساپورت کنه


هم می تونید از یه سیستم عامل دیگه استفاده کنید و هم این که خودتون برنامشو بنویسید که اولی راحت تره...




> به همین دلیل دچار تناقض شدم من!!


چرا؟ با کدوم حرف ها؟ اگه ابهامی هست بگید...




> وگرنه برای کامپیوتر فرقی نمیکنه شما با چه زبونی کد مینویسین


چون کد همه ی زبان ها به یک زبان تبدیل می شه، هر چه قدر زبان سطح بالاتر باشه کد حجیم تر و نابهینه تری تولید می شه!




> قسمت برنامه اصلی و اون الگوریتم ها و پیاده سازی ها و به قول معروف هوش مصنوعی مشابه برنامه نویسی عادی هستش و فقط خروجی ها باید به درگاه های آی/او فرستاده بشه؟
> و یا از کتابخانه های کار با آی/او در برنامه استفاده بشه؟


برای کار با I/O هم می تونید از کتابخانه استفاده کنید برای راحتی و هم نه.

توابع API توابعی هستند که سیستم عامل (مثلا Windows) برای برنامه نویس ها تدارک دیده تا استفاده کنند، این توابع در کتابخانه هایی قرار دارند که مثلا در Windows در User32.DLL، Kernel32.DLL، GDI32.DLL و ... قرار دارند، که این ها کتابخانه ی پیوند پویا یا همان DLL هستند که مخفف Dynamic Link Library هست.
کتابخانه ی OpenCV هم برای تسهیل کار برنامه نویس ها هست در زمینه ی Computer Vision.

----------


## prince0fpersia

ممنون از راهنماییهاتون




> چون کد همه ی زبان ها به یک زبان تبدیل می شه، هر چه قدر زبان سطح بالاتر باشه کد حجیم تر و نابهینه تری تولید می شه!


یعنی حتی اگه تو زبونی مثلسی شارپ  خودمون توابع رو بنویسیم هم باز نسبت به سی سرعت اجرای کمتری داره؟

----------


## IamOverlord

بله. البته به طور معمول چون ممکنه شما کد رو در یه زبان سطح بالا بهینه شده بخوای و اون زبان با یه سری روش ها سعی کنه کد رو کم حجم کنه ولی در زبان های سطح پایین از این خبرا نیست، چون شما خودتون همه چیز رو مشخص می کنید.
به عوان مثال برنامه ی یه پنجره ی خالی در Windows با زبان Assembly، کم تر از 5 بایته ولی با زبان هایی مثل Delphi یا VB6 بیش تر از این حرفاست.

----------


## farzadsw

در صورتی که از لپتاپ استفاده می کنید .اگر از یک مدار واسط استفاده کنید کارتون خیلی راحت تر میشه . به عنوان *مثال* یه بورد دارای میکروکنترلر که دارای یکسری  ورودی آنالوگ ،  ورودی دیجیتال و خروجی دیجیتال باشه و از طریق سریال به کامیپورتر متصل بشه . اینطوری شما فرامین و دیتای مورد نظرتون رو به مدار واسط میدید و مدار واسط به خروجی ها (مثلا موتور) فرمان میده . سرعت انتقال اطلاعات بالایی برای این کار لازم نیست و به همین جهت ارتباط سریال کافی خواهد بود .
در مورد برنامه نویسی ، بستگی به این داره که چه پردازشی قرار هست اجرا بشه . برای پردازشهای عادی مثل خوندن اطلاعات از سنسور ها و ارسال فرمان به عملگر ها ، چون پردازش خیلی خیلی کمی لازمه (به نسبت قدرت پردازش لپتاپ) شما میتونید حتی از اسکریپتهای پایتون هم استفاده کنید (و با پورت سریال ارتباط برقرار کنید) و بهینه بودن زبان برنامه نویسی اصلا اهمیتی نداره .
ولی اگر پردازشهای سنگینتری مثل پردازش تصویر لازم هست اجرا بشه اینجا بهتره از زبان C/C++‎‎ استفاده بشه. زبان اسمبلی بهینه ترین زبان هست ولی در بسیاری از موارد به زمان و زحمتش نمی ارزه و زبان C جایگزین بهتری هست. البته این بحث ساده تر بودن برنامه نویسی حتی میتونه اینقدر اهمیت داشته باشه که به بهای از دست دادن پرفورمنس از زبان C#‎‎ و دات نت استفاده بشه . این هم باز بر میگرده به اینکه محدودیت سخت افزار شما چقدر هست و چه سرعتی لازم دارید.
یکسری بورد های SBC هم هست که خودشون خروجی و ورودی های زیادی دارند (ADC , DAC , I2c ,CAN ,.... ) و تقریبا نیازی به استفاده از مدار واسط نیست  ولی اولا تو ایران به راحتی پیدا نمیشن و ثانیا قیمت نسبتا بالایی دارند .

ولی در کل باتوجه به تجربیات خودم میتونم بگم که استفاده از یک لپتاپ یا مادر بورد کوچیک به همراه مدار واسط (*برای مواقعی که پردازش سنگین مثل صوت و تصویر لازمه*) بهترین روش هست و البته باید حداقل یکبار بخش الکترونیک تکمیل بشه (مدار واسط طراحی و برنامه نویسی بشه) و با توجه به اینکه کار رباتیک معمولا کار تیمی هست و برای بخشهایی مثل درایو موتو و سنسورها نیاز به طراحی مدار الکترونیکی هست ، ساخت یک مدار واسط خیلی در روند انجام پروژه تداخل ایجاد نمیکنه . اینطوری اگر پردازنده کامپیوتر شما به اندازه کافی قوی باشه ( CPU های INTEL ATOM 1.6GHz برای این کار نسبتا قوی هستند !) میتونید از C#‎‎ هم استفاده کنید . 
*یک نکته ای رو هم باید در نظر داشته باشید اینه که سیستم عامل هایی مثل ویندوز Real Time نیستد و در بعضی رباتها که تاخیر باید خیلی کم باشه (مثل ربات پرنده) باید برنامه کنترل اصلی روب میکرو کنترلر یا یک سیستم REAL TIME باشه .

----------


## prince0fpersia

سلام

ممنون از راهنمایی های همهدوستان مخصوصا جناب فرزاد عزیز

آقامن الان بعد کلی تحقیق و بررسی قرار شد که یک بردی (هنوز مشخص نیست) مثلا شبیه rb-110 بخرم و یک دوربین بهش متصل کنم و سپس بتونم پردازش تصویر انجام بدم
زبان مورد نظرم هم سی # هست 

حالا نمیدونم چطور و از کجا باید شروع کنم؟

اینم مشخصات بردی که گفتم :
http://www.roboard.com/RB-110.htm

من توی یک سایت قیمتش رو 350 تومن دیدم اما یکی از بچه های روبوکاپی به من گفت برای پردازش تصویر ضعیفه!  

اگر برد بهتر (اندازه کوچک و مصرف کم هم مد نظر باشه) با قیمت مناسبتری هم سراغ دارید بگید ... یا اگر این برد رو از جایی میشه ارزونتر خرید بگید لطفا

ممنون میشم

----------


## prince0fpersia

نظری نداره کسی؟

----------


## farzadsw

روبورد برای پردازش تصویر خیلی قوی نیست ولی نسبت به قیمتش (با اون قیمتی که شما گفتید) مناسبه . یک سری single board computer با پردازنده atom هم من قبلا تو بازار دیده بودم که حدود 600 هزار تومن قیمت داشتن والی جدیدا خبر ندارم موجود هست یا قیمتشون چقدر شده . یه چیزی شبیه این :
http://www.totalcontrolsolutions.com...-dual-core-cpu
البته شرکتهای مختلف بردهای مختلفی تولید کزدن و شما باید ببینید کدوم تو ایران پیدا میشه.

----------


## BAHAL_KEYHAN

تو سایت icrc-co
یه برد بره فروش گذاشته arm 11 داره همه چه هم داره یه سری بزن

----------

