راه اندازی واحد DAC توسط EasyMCU

راه اندازی واحد DAC توسط EasyMCU

راه اندازی واحد DAC توسط EasyMCU

برای درک بهتر واحد DAC ، لازم است از قبل اطلاعاتی راجع به واحد ADC داشته باشید. جهت کسب اطلاعات راجع به واحد ADC به این مقاله مراجعه کنید.

کاربرد DAC

راه اندازی واحد DAC توسط EasyMCU : عبارت DAC کوتاه شده عبارت Digital to Analog Converter می باشد، و حتما تا الان متوجه شدید که عملکرد واحد DAC دقیقا عکس واحد ADC است! زمانی که نیاز داشتیم درکی از محیط آنالوگ و دنیای بیرون داشته باشیم ، واحد ADC پل ارتباطی دنیای باینری ( 0 ,1) و محیط آنالوگ بیرون می شد و از سیگنال های آنالوگ نمونه برداری کرده و این اطلاعات را به صورت مقادیر دیجیتال معادل مقادیر آنالوگ در پردازنده ذخیره می کرد. حال زمانی که قرار است دنیای باینری (0, 1) پردازنده در دنیای آنالوگ دخل و تصرفی داشته باشد، برای مثال باز پخش یک فایل صوتی موجود در حافظه ی جانبی، و انتقال آن به تقویت کننده و در نهایت بلندگو ، این وظیفه ایست که بر عهده واحد DAC می باشد.

 

راه اندازی واحد DAC توسط EasyMCU

برد Zcross دارای 1 واحد DAC 10 bit می باشد که طبق pinout برد از طریق پایه ی P7 در دسترس است. دقت کنید که پایه ی P7 هم می تواند به صورت IO معمولی پیکربندی شود و هم ADC و همینطور DAC و در یک لحظه فقط یک حالت از 3 حالت ذکر شده قابل انتخاب است. زمانی که P7 به صورت DAC پیکربندی شده باشد، دقت کنید که مستقیم ولتاژ آنالوگ روی این پایه ساخته می شود در رنج 0 تا 3.3 ولت. همینطور جریان دهی خروجی DAC بسیار کم و محدود می باشد و برای استفاده در کاربرد خاص حتما باید توسط یک تقویت کننده تقویت شود.

 

نحوه سیم بندی

جهت تست این واحد می توانید از مدار ساده ذیل استفاده کرده و نور یک LED را کنترل کنید.

متودها

نحوه نوشتن مقادیر آنالوگ در خروجی

توجه : واحد DAC به صورت پیشفرض فعال نمی باشد و لازم است این واحد قبل از تولید فایل های پروژه توسط نرم افزار EasyMCU فعال شده باشد.

 

مثال نمونه

 

راه اندازی سنسور دما lm35 توسط Zcross

راه اندازی سنسور دما lm35 توسط Zcross

راه اندازی سنسور دما lm35 توسط Zcross

در این پروژه آموزشی قصد داریم با نحوه راه اندازی سنسور دما lm35 توسط Zcross آشنا بشیم. سنسور دمای lm35 دارای خروجی آنالوگ و خطی می باشد که با افزایش دمای محیط ، ولتاژ خروجی نیز به صورت خطی افزایش می یابد. پس طبیعتا چون با سیگنال آنالوگ سر و کار داریم ، نیاز به استفاده از واحد ADC ( مبدل آنالوگ به دیجیتال ) سمت پردازنده می باشد. اگر با ADC آشنایی ندارید ، راه اندازی واحد ADC توسط EasyMCU را از دست ندهید.

سنسور دمای lm35

مطابق تصویر فوق شماره گذاری و ترتیب پایه ها مشخص است. رنج ولتاژ تغذیه lm35 بین 4 تا 20 ولت می باشد.

توجه : در راه اندازی سنسور دما lm35 توسط Zcross از پایه Vu برد zcross جهت تغذیه ی lm35 استفاده می کنیم که دارای سطح ولتاژ 5v می باشد.

 

نحوه سیم بندی

 

 

کتابخانه lm35

کتابخانه ی مذکور را در صفحه ی Github و از طریق لینک ذیل می توانید دانلود کنید.

دانلود کتابخانه lm35

پس از دانلود کتابخانه، محتوای آن که شامل 2 فایل با پسوند (h.* و cpp.*) می باشد را به پوشه module_libraries انتقال دهید. یک بار نرم افزار EasyMCU را ببندید و مجدد اجرا کنید.

اگر برای ایجاد اولیه پروژه مشکل دارید قسمت شروع کار با Easy MCU را ببینید.

در مراحل ایجاد پروژه از تب libraries کتابخانه ی lm35 را به پروژه اضافه کنید.

 

متودها

سازنده

در ابتدا نیاز است یک شیء از کلاس lm35 تعریف شود و پایه (کانال) ADC استفاده شده از Zcross در ارتباط با کیپد مشخص شود.

 

خواندن مقدار دما

جهت خواندن دما با واحد سلسیوس و یا فارنهایت به ترتیب از ورودی های CELCIUS و یا FAHRENHEIGHT به عنوان ورودی در متود زیر استفاده می شود.

 

نمونه کد

در مثال ذیل، پایه ی خروجی lm35 به P5 بورد zcross متصل شده که کانال 6 (CH6) واحد ADC هست. مقدار دما رو به صورت سلسیوس می خواند و در محیط ترمینال چاپ می کند، دقت کنید که در این مثال از واحد USB CDC استفاده شده و باید توسط نرم افزار EasyMCU فعال شود.

 

راه اندازی واحد ADC توسط EasyMCU

راه اندازی واحد ADC توسط EasyMCU

راه اندازی واحد ADC توسط EasyMCU

راه اندازی واحد ADC توسط EasyMCU : قریب به اتفاق میکروکنترلرهای امروزی دارای واحد ADC می باشند. ADC کوتاه شده عبارت Analog to Digital Converter به مفهوم مبدل دیجیتال به آنالوگ می باشد که با A2D نیز شناخته می شود.

 

کاربرد ADC

دنیای بیرون شامل یک محیط آنالوگ و به طبع آن شامل سیگنال های آنالوگ می باشد، اما دنیای میکروکنترلر باینری است و در این دنیا فقط سطح منطقی 0 و یا 1 معتبر است که صرفا شامل 2 سطح ولتاژ بین 0 ولت و 3.3v یا 5v و یا … می باشد. هر گاه بخواهیم اطلاعاتی از دنیای بیرون (محیط آنالوگ) دریافت کنیم و این اطلاعات توسط پردازنده پردازش شود، نیاز به واسطی به نام ADC داریم که با نمونه گیری از سیگنال های آنالوگ ، نمونه های گرفته شده را در قالب مقادیر دیجیتال متناسب با سطح ولتاژ آنالوگشان در حافظه ذخیره می کند و به این ترتیب پردازنده قادر است از سیگنال های آنالوگ دنیای بیرون درک پیدا کند. برای مثال صحبت کردن و تمام اصوات در دنیای بیرون آنالوگ هستند و اگر قصد پردازش روی آنها یا انتقال این سیگنال ها در بستر دیجیتال را داشته باشیم ، نیاز است ابتدا این سیگنال ها به دیجیتال تبدیل شوند و بعد انتقال یابند که این امر نمونه برداری و تبدیل آنالوگ به دیجیتال به عهده واحد ADC می باشد. همینطور خیلی از سنسورها (دما، فاصله سنج و …) خروجی آنالوگ دارند و بسته به تغییراتی که احساس می کند ، سطوح مختلف ولتاژ را در خروجی ایجاد می کنند. مجدد چنین اطلاعاتی بایستی توسط واحد ADC نمونه برداری شده و تبدیل به مقادیر دیجیتال شوند تا پردازنده بتواند درکی از ورودی ها داشته و روی آنها پردازش انجام دهد و خروجی مناسب را ایجاد کند.

 

راه اندازی واحد ADC توسط EasyMCU

بورد Zcross دارای 6 کانال ADC می باشد که طبق pinout بورد zcross از پایه P5 تا P10 (به ترتیب CH6 تا CH1) در دسترس می باشند.

در ادامه نحوه ی اتصال یک پتانسیومتر به عنوان نماینده سیگنال آنالوگ به بورد Zcross را بررسی می کنیم.

توجه : بیشترین ولتاژ اعمالی مجاز به ADC برد zcross برابر 3.3v می باشد.

 

نحوه سیم بندی

متودها

نحوه خواندن مقدار آنالوگ

به صورت پیشفرض واحد adc فعال می باشد و مستقیم قابل استفاده است. در کد ذیل مقدار آنالوگ روی CH6 (معادل پایه P5) خوانده و نمونه برداری می شود و حاصل نمونه برداری که یک مقدار دیجیتال متناسب با مقدار آنالوگ نمونه برداری شده است در متغییر sensorvalue ذخیره می شود.

 

مثال نمونه1:

راه اندازی واحد ADC توسط EasyMCU: چاپ کردن مقادیر دیجیتال نمونه برداری شده در محیط ترمینال EasyMCU سمت PC

 

مثال نمونه2:

راه اندازی واحد ADC توسط EasyMCU: چاپ کردن مقادیر حقیقی ولتاژ خوانده شده از ورودی آنالوگ ( ولت متر )

 

مثال نمونه 3:

راه اندازی واحد ADC توسط EasyMCU: نمایش مقدار دیجیتال خوانده شده از پتانسیومتر در قالب LED های بورد zcross

 

راه اندازی واحد PWM توسط EasyMCU

راه اندازی واحد PWM توسط EasyMCU

راه اندازی واحد PWM توسط EasyMCU

 

راه اندازی واحد PWM توسط EasyMCU : تا حالا قصد داشتید سرعت چرخش یک موتور DC را کنترل کنید؟ یا زاویه ی قرار گیری شفت سروو موتور را تعیین کنید؟ شدت روشنایی LED را کنترل کنید؟ یا با ترکیب نورهای متنوع توسط RGB LED ترکیب رنگ های جالب بسازید؟ و یا …

 

مفهوم PWM

واحد PWM که سرنام کلمات Pulse Width Modulation به مفهوم مدولاسیون عرض پالس می باشد این امکان را به سادگی میسر می سازد. در این تکنیک یک قطار پالس با فرکانس ثابت ساخته می شود و با تعیین میزان عرض پالس بین 0 تا 100% ، میزان روشن (1) و خاموش (0) بودن سیگنال تعیین می شود. به همین سبب با وجود فرکانس مطلوب می توان درصد توانی مشخص و اختیاری به مصرف کننده اختصاص داد.

 

واحد PWM در Zcross

پایه های P23 تا P28 علاوه بر ورودی/خروجی ، می توانند به عنوان خروجی PWM ( مدولاسیون عرض پالس ) نیز پیکربندی شوند و مورد استفاده قرار بگیرند. برای دسترسی به کلاس PWM و استفاده از متودهای آن در ابتدا به سراغ شیء pwm می رویم. با گذاشتن علامت “.” { “dot” خوانده می شود } بعد از آن می توانیم دسترسی به متودهای کلاس PWM داشته باشیم. به جای x در عبارت pwm.x باید یکی از متود های زیر قرار بگیرد.

 

پیکربندی واحد PWM با فرکانس 60Hz (هرتز) و رزولوشن 100

 

تعیین میزان حداقل و حداکثر مجاز برای Duty Cycle (دوره وظیفه) سیگنال PWM

Duty Cycle یا به اختصار D.C. میزان درصد 1 بودن سیگنال PWM را تعیین می کند.

 

فعال کردن پایه ی PWM مدنظر

 

تعیین مقدار Duty Cycle

 

توجه:

پایه های P23 تا P28 طبق PinOut بورد Zcross به ترتیب معادل CH6 تا CH1 می شوند. در متودهای فوق بجای CHx می توان از نام خود پایه Px نیز استفاده کرد.

 

توجه:

با متود set در هر لحظه می توان تنها میزان Duty Cycle یک پایه را تعیین کرد.اما با استفاده از ترکیب متودهای ()ch و ()apply می توان ابتدا مقادیر نهایتا 6 کانال PWM را تعیین کرد و به صورت آنی نهایتا 6 مقدار مختلف در 6 خروجی PWM بورد Zcross داشت. در مثال نمونه ی زیر از این روش استفاده شده است.

 

نحوه ی سیم بندی پروژه

مثال نمونه

 

آموزش راه اندازی keypad ماتریسی توسط EasyMCU

آموزش راه اندازی keypad ماتریسی توسط EasyMCU

آموزش راه اندازی keypad ماتریسی توسط EasyMCU

آموزش راه اندازی keypad ماتریسی توسط EasyMCU : یکی از ابزارهای مفید برای ورود اطلاعات به پردازنده توسط کاربر، استفاده از کیپدهای ماتریسی هست که به واسطه ی این کیپد ها می توان اعداد و حروف را به پردازنده انتقال و مورد پردازش قرار داد.

مطابق تصویر فوق کلیدها به صورت ماتریسی به همدیگر متصل شده اند و برای ارتباط با پردازنده کافیست 8 پایه ی کیپد به 8 پایه از پایه های پردازنده متصل شود. 4 پایه از پردازنده به صورت خروجی و 4 پایه به صورت ورودی تعریف می شوند و به این ترتیب سطرها و یا ستون ها به ترتیب جاروب می شود. در هر لحظه می توان یک کلید را فشرد. اگر کلیدی زده نشده باشد عدد 255 دسیمال یا به عبارتی 0xFF هگزا دسیمال برگشت داده می شود.

 

نحوه اتصالات و سیم بندی

کتابخانه keyPad

کتابخانه ی مذکور را در صفحه ی Github و از طریق لینک ذیل می توانید دانلود کنید.

 

دانلود کتابخانه keyPad

 

پس از دانلود کتابخانه، محتوای آن که شامل 2 فایل با پسوند (h.* و cpp.*) می باشد را به پوشه module_libraries انتقال دهید. یک بار نرم افزار EasyMCU را ببندید و مجدد اجرا کنید.

اگر برای ایجاد اولیه پروژه مشکل دارید قسمت شروع کار با Easy MCU را ببینید.

در مراحل ایجاد پروژه از تب libraries کتابخانه ی keyPad را به پروژه اضافه کنید.

 

آموزش راه اندازی keypad ماتریسی توسط EasyMCU

کیپدهای ماتریسی در دو نوع 4*4 و 3*4 وجود دارند که در این مطلب نحوه ی راه اندازی کیپد 4*4 را توسط EasyMCU بررسی می کنیم.

 

متودها

سازنده

در ابتدا نیاز است یک شیء از کلاس KEYPAD تعریف شود و پایه های استفاده شده از Zcross در ارتباط با کیپد مشخص شوند.

 

اسکن کیپد

 

مثال نمونه:

چاپ اعداد فشرده شده در محیط ترمینال EasyMCU .

توجه : در زمان ایجاد پروژه واحد USB CDC توسط نرم افزار EasyMCU فعال شود.

 

EasyMCU RTOS

EasyMCU RTOS

EasyMCU RTOS

EasyMCU RTOS : سیستم عامل بلادرنگ EasyMCU بر پایه ی سیستم عامل FreeRTOS پیاده سازی شده است.
RTOS کوتاه شده ی عبارت Real Time Operating System به مفهوم سیستم عامل بلادرنگ می باشد
اگر اطلاعی در مورد دلیل استفاده از سیستم عامل در میکروکنترلرها ندارید، این مقاله ی عالی رو از دست ندهید!
این صفحه به روز رسانی می شود. آخرین به روز رسانی 8/22/2016

 

Thread

کلاس Thread (نخ ، ریسمان) به شما امکان ایجاد و کنترل Thread ها را می دهد، در واقع در EasyMCU OS مشاهده می کنید که Task ها در قالب Thread ها تعریف می شوند!
تابع main یک thread خاص می باشد و تنظیمات اولیه و شروع باقیه thread ها از این تابع می باشد. تابع main توسط RTOS به عنوان اولین thread فراخوانی می شود.

 

حالات مختلف یک Thread

Thread : RUNNING ای که هم اکنون در حال اجراست در وضعیت RUNNING قرار می گیرد. تنها یک thread در هر لحظه می تواند در این وضعیت باشد.

Thread : READY هایی که آماده اجرا هستند در وضعیت READY قرار می گیرند. زمانی که thread در حال اجرا به پایان رسید و یا به خواب (sleep) رفت، thread بعدی که در وضعیت READY قرار دارد و اولویت بالاتری دارد به وضعیت RUNNING می رود.

Thread : WATING هایی که به خواب(sleep) رفته اند و یا منتظر یک رخداد هستند تا اتفاق بیفتند در وضعیت WAITING قرار دارند.

Thread : INACTIVE هایی که ساخته نشده اند یا پایان یافته اند (terminated) در وضعیت INACTIVE قرار می گیرند. این thread ها به صورت معمول از منابع سیستم استفاده نمی کنند.

 

Mutex

یک Mutex (میوتکس) برای محافظت از منابع در اشتراک سیستم مورد استفاده قرار می گیرد. برای مثال چند thread که ممکن است همزمان قصد دسترسی و استفاده از یک منبع خاص را داشته باشند، در حالی که در هر لحظه فقط یکی از آنها باید به این منبع دسترسی داشته باشد.

Mutex ها نباید درون روال ISR (وقفه) مورد استفاده قرار بگیرند.

 

Signals

هر thread برای اجرا شدن می تواند منتظر یک سیگنال (رویداد) باشد. منشاء سیگنال می تواند یک thread دیگر و یا روال وقفه (ISR) باشد. چرا که در سبک کد نویسی سیستم عامل همیشه سعی می کنیم روال های وقفه تا حد ممکن خلاصه و کوتاه باشند. در اصطلاح تخصصی کلاس signal همان Semaphore binary می باشد.

 

Queue

یک Queue (صف) به شما این امکان را می دهد که یک Queue از اشاره گرها به داده ها را ، از thread تولید کننده به thread مصرف کننده تشکیل دهید. به این ترتیب قادرید اطلاعات را بین دو thread مجزا رد و بدل کنید.

 

RTOS Timer

کلاس RtosTimer به شما امکان می دهد تا قابلیت کنترل کردن عملکردهای تایمر را در سیستم داشته باشید. به تعداد دلخواه می توان تایمر ایجاد کرد و تایمرها به صورت نرم افزاری و دقیق کار می کنند و زمانی که دوره ای منقضی شود تابع تایمر مدنظر فراخوانی می شود. تایمرها به دو صورت یکباره و دوره ای می توانند پیکربندی شوند. یک تایمر عملکردهای start ، reset و stop را می تواند داشته باشد.

 

روال وقفه (ISR)

تمامی API های RTOS می توانند در ISR مورد استفاده قرار بگیرند، جهت بعضی موارد خاص در انتهای نام متود از عبارت FromISR استفاده شده است که این متودها خاص ISR باید استفاده شوند. در ISR دو نکته وجود دارد.

استفاده از Mutex در ISR مجاز نیست.

استفاده از sleep و تاخیر در ISR مجاز نیست. همه پارامترهای timeout متودها باید با مقدار 0 تنظیم شوند (بدون تاخیر).

 

Timeout های پیشفرض

در EasyMCU RTOS تمام timeout های API ها به صورت پیشفرض برای متودهای تولید کننده برابر 0 (بدون تاخیر) و برای متودهای مصرف کننده این مقدار برابر بینهایت می باشد.

یک تولید کننده می تواند یک واحد جانبی باشد که جهت اعلان یک رویداد، وقفه ای را تولید می کند. در این روال وقفه استفاده از تاخیر مجاز نیست ( چرا که کل سیستم زمان بندی هسته سیستم عامل را مختل می کند. ) در سمت دیگر، مصرف کننده می تواند thread ای باشد که در پشت پرده منتظر وقوع یک رویداد است تا بتواند ایفای نقش کند. در چنین وضعیتی مادامی که مصرف کننده در پشت پرده منتظر می ماند، هیچ زمانی از CPU تلف نمی شود، بنابراین زمان تاخیر پیشفرض برای منتظر ماندن در این وضعیت بینهایت است.

 

توجه : زمانی که عملکردی برای یک شیء در روال وقفه (ISR) صدا زده می شود، پارامتر timeout باید برابر 0 مقدار دهی شود (بدون تاخیر) چرا که استفاده از تاخیر در روال وقفه مجاز نمی باشد.

آموزش راه اندازی کارت SD توسط EasyMCU

آموزش راه اندازی کارت SD توسط EasyMCU

آموزش راه اندازی کارت SD توسط EasyMCU: اگر پروژه ای دارید که در ارتباط با صوت، ویدئو، گرافیک، ثبت اطلاعات (Data logging) و غیره … می باشد، متوجه خواهید شد که استفاده از یک حافظه جانبی امری ضروری است. اکثر میکروکنترلرها محدودیت های زیادی در ایجاد حافظه داخلی دارند.

اگر فعالیت شما در هر یک از زمینه های لاگ کردن اطلاعات، گرافیک و یا صوت می باشد، به حافظه ذخیره سازی مگابایتی، حداقل در حدود 32MB احتیاج پیدا خواهید کرد. برای رسیدن به چنین حافظه ای قصد استفاده از حافظه هایی مشابه حافظه های مورد استفاده در دوربین و mp3 player را داریم (Flash Card)! که به کارت SD یا microSD  معروف هستند. این حافظه ها شامل فضاهای گیگابایتی هستند که سایز فیزکی آنها از یک سکه کوچک تر هست. همینطور به وفور در هر فروشگاه الکترونیکی موجود و دردسترس هستند. بنابراین به راحتی حجم مورد نیاز خود را می توانید تامین کنید. اکثر کامپیوتر ها دارای SD/microSD reader هستند، بنابراین می توانید اطلاعاتی را که از GPS یا هر ماژول دیگری لاگ گرفته اید به کامپیوتر انتقال دهید و در برنامه گرافیکی اطلاعات را بررسی کنید.


دقت کنید!

در زمانی که در حال تعامل با کارت SD هستید به نکات زیر توجه کنید.

اول اینکه تغذیه مورد نیاز 3.3V تمیز می باشد و از آنجایی که جریان مورد نیاز این کارت ها بسته به نوع می تواند قابل توجه باشد ، حتما از یک تغذیه ی 3.3V مناسب استفاده کنید.

مورد دوم اینکه برای ارتباط با کارت باید از منطق 3.3V استفاده کنید. کارت های جدید با لبه تریگ می شوند و به این مفهوم است که نیاز به موج مربعی بسیار تمیز دارند. اجزایی از جمله تقسیم مقاومتی و سیم های بلند اثر بسیار بدی در سرعت انتقال اطلاعات دارند، بنابراین تا جای ممکن مسیر سیم ها را کوتاه در نظر بگیرید و از تقسیم مقاومتی برای خطوط لاجیک اجتناب کنید. پیشنهاد جایگزین، استفاده از level shifter هایی مانند چیپ های HEF4050 ، 74LVX245، 74AHC125 می باشد.

مورد سوم، برای ارتباط با کارت SD دو راه وجود دارد، مود SPI و مود SDIO . مود SDIO سریع تر است اما پیچیدگی بیشتری دارد و تا جایی که می توان گفت احتیاج به اطلاعاتی دارد که فاش نشده است. به همین دلیل با مود SDIO هرگز درگیر نمی شویم. در عوض هر کارت SD  یک مود SPI با سرعت کمتر دارد که برای هر میکروکنترلری استفاده از این مود ساده است. مود SPI تنها نیاز به 4 پایه ( در ادامه با جزئیات بیشتر بررسی شان می کنیم ) دارد بنابراین مانند اجزائی که اینترفیس موازی دارند و احتیاج به پایه های زیاد دارند نیست.

کارت های SD به دو فرم معروف – micro SD و SD ارائه می شوند. اینترفیس، کدها، ساختارها و غیره … همگی مشابه هستند. تنها تفاوت در سایز فیزیکی آن هاست. Micro SD از نظر سایز فیزیکی بسیار بسیار کوچکتر است.

مورد چهارم، کارت های SD ” خام ” هستند. آنها فقط سکتورهایی در چیپ فلش هستند، ساختار ویژه ای وجود ندارد که شما را مجبور به استفاده کند. به این مفهوم که شما می توانید کارت SD را فرمت کنید تا یک فایل سیستم لینوکس ، FAT (DOC) فایل سیستم یا یک فایل سیستم Mac باشد. همینطور می تونید کلا از فایل سیستمی استفاده نکنید! گرچه 99% کامپیوترها، دوربین ها، MP3 Player ها، GPS لاگرها، و غیره … نیاز به فایل سیستم FAT16 یا FAT32 دارند.

 

فرمت کردن …

کارت SD به صورت “خام” قابل استفاده است. فرمت کردن کارت به یک نوع فایل سیستم خیلی راحت است. برای استفاده از کتابخانه ی SD ، کارت باید با فرمت FAT16 یا FAT32 فرمت شود.

دقت کنید، اگر از کارت هایی در حد مگابایت استفاده می کنید، احتمالا با FAT12 فرمت شده اند که این فرمت در کتابخانه SD مورد بحث قابل استفاده نیست. برای استفاده از کتابخانه مجبور هستید فرمت را تغییر دهید. در واقع فرمت کردن کارت در ابتدای استفاده ایده خوبی است، حتی کارتی که تازه تهیه شده. دقت کنید که فرمت کردن کارت اطلاعات موجود روی آن را حذف می کند، پس قبل از فرمت کردن اطلاعات مورد نیاز را بردارید.

 

پیشنهاد می کنیم برای فرمت کردن کارت های SD از ابزار فرمت کردن رسمی SD Card استفاده کنید، چرا که مشکلات ناشی از فرمت بد را حل می کند.

برای دانلود روی اینجا کلیک کنید.

آموزش راه اندازی کارت SD توسط EasyMCU

 

اتصالات و سیم بندی

 

 

کتابخانه ی SD

کتابخانه ای به نام SD برای آردوینو توسط (William G) نوشته شد، این کتابخانه برای  EasyMCU پورت شده و همینطور قدری بهینه سازی روی آن صورت گرفته که باعث کارایی بهتر کتابخانه در پلتفرم EasyMCU شده است.

این کتابخانه همراه نرم افزار EasyMCU دانلودی وجود دارد و نیازی به دانلود ندارد. کافیست در تب Core II تیک مربوط به SD را فعال کنید و فایل های پروژه را Generate ( تولید ) کنید.

 

اگر برای ایجاد اولیه پروژه مشکل دارید قسمت شروع کار با Easy MCU را ببینید.

 

 

کلاس SD

 

پیکربندی کتابخانه SD و کارت SD

متود اول ، به صورت پیشفرض پایه ی P22 را به عنوان ChipSelect انتخاب می کند و از واحد SPI 1 استفاده می کند. جهت تغییر پایه ی Cs و واحد SPI از متود دوم می توان استفاده کرد. دقت شود که باید از واحد SPI سخت افزاری استفاده شود.

 

وجود/عدم وجود دایرکتوری یا فایل خاص در کارت SD

 

ایجاد دایرکتوری جدید (تکی/تو در تو) در کارت SD

 

باز کردن یک فایل در کارت SD

نام فایل می تواند با استفاده از “اسلش” / شامل دایرکتوری باشد. در قسمت mode می توان FILE_READ و FILE_WRITE به صورت اختیاری استفاده کرد که به ترتیب فایل را به صورت فقط خواندنی و خواندنی و نوشتی باز می کند.

 

حذف یک فایل از کارت SD

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

 

حذف دایرکتوری از درون کارت SD

دایرکتوری باید خالی باشد!

 

کلاس File

 

چک کردن اطلاعات موجود درون فایل جهت خواندن

 

بستن فایل و اطمینان از ذخیره ی اطلاعات در کارت SD

 

اطمینان از ذخیره اطلاعات نوشته شده فایل در کارت SD

 

دریافت مکان کنونی درون فایل

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

 

نوشتن مقادیر در فایل (فایل از قبل باید باز شده باشد)

 

پوییدن مکان جدید در فایل

pos مقداری بین 0 تا سایز فایل

 

گرفتن سایز فایل

 

خواندن یک بایت از فایل

 

نوشتن اطلاعات درون فایل

 

فایل کنونی دایرکتوری است یا خیر

دایرکتوری ها (فولدرها) یک نوع خاص از فایل ها هستند.

 

گزارش فایل یا فولدر بعدی در دایرکتوری

 

برگشت به اولین فایل در دایرکتوری

 

بعد از آشنایی کلی با متودهای کتابخانه SD ، برای درک کاملتر کافیست کاربرد آنها در مثال های آماده را پیگیری کنید. مثال های بیشتر به زودی در Github در دسترس خواهد بود.

جهت مشاهده مثال های بیشتر اینجا کلیک کنید.

 

مثال نمونه 1:

 

راه اندازی LCD کاراکتری توسط EasyMCU

راه اندازی LCD کاراکتری توسط EasyMCU

راه اندازی LCD کاراکتری توسط EasyMCU : یکی از مهمترین اجزاء مدار که در اکثر پروژه های stand-alone (مستقل و بدون نیاز به دستگاه دیگر) به چشم می خورد LCD کاراکتری می باشد که وظیفه ی مانیتور کردن اطلاعات به کاربر را دارد.

این مدل LCD دارای انواعی با تعداد 1تا 4 سطر می باشند، همینطور در هر سطر به طور معمول دارای 16 کاراکتر می باشند و البته در مدل های در هر سطر گنجایش 20 کاراکتر موجود می باشد. معمول ترین مدل LCD کاراکتری 16×2 می باشد.

 

PinOut :

 

نحوه ی اتصالات و سیم بندی LCD با Zcross :

 

کتابخانه LiquidCrystal

کتابخانه ی مذکور را در صفحه ی Github و از طریق لینک ذیل می توانید دانلود کنید.

 

دانلود کتابخانه LiquidCrystal

 

پس از دانلود کتابخانه، محتوای آن که شامل 2 فایل با پسوند (h.* و cpp.*) می باشد را به پوشه module_libraries انتقال دهید. یک بار نرم افزار EasyMCU را ببندید و مجدد اجرا کنید.

اگر برای ایجاد اولیه پروژه مشکل دارید قسمت شروع کار با Easy MCU را ببینید.

در مراحل ایجاد پروژه از تب libraries کتابخانه ی LiquidCrystal را به پروژه اضافه کنید.

 

راه اندازی LCD کاراکتری توسط EasyMCU

این مدل LCD ها دارای 8 بیت خط اطلاعات می باشند و دارای 2 روش راه اندازی 8 بیتی و 4 بیتی می باشند.( از لحاظ سیم بندی ) از نظری که در روش 8 بیتی تعداد 4 پایه بیشتر از میکروکنترلر مشغول می شود، ترجیحا به طور معمول با 4 پایه از خطوط دیتا راه اندازی می شوند.

در کتابخانه های جدید امکان زمین کردن پایه ی R/W نیز وجود دارد و باز هم به اندازه ی 1 پایه بیشتر از میکروکنترلر می توان صرفه جویی کرد.

 

برخی از متودهای پر کاربرد

سازنده

در ابتدا نیاز است یک شیء از کلاس LiquidCrystal تعریف شود و پایه های استفاده شده از Zcross در ارتباط با LCD مشخص شوند.

 

تعیین تعداد سطر و ستون LCD

 

چاپ مقادیر روی LCD

 

پاک کردن LCD

 

تعیین مکان اشاره گر

 

مثال نمونه 1:

 

مثال نمونه 2:

 

نمایش ویدئو روی TFT LCD رنگی توسط EasyMCU

نمایش ویدئو روی TFT LCD رنگی توسط EasyMCU

یکی از پروژه های جالب نمایش ویدئو روی LCD رنگی است که نیاز به انتقال اطلاعات با سرعت بالا دارد. از آنجا که حافظه Flash خود میکروکنترلر در حد چند کیلوبایت است نمی توان عکس یا ویدئو روی آن ذخیره کرد، پس مانند دوربین و … نیاز به حافظه جانبی داریم که محبوب ترین این حافظه ها در دستگاه های موبایلی کارت های SD می باشد که در حجم کم دارای ظرفیت های بالای هستند.

روال پخش یک ویدئو بر روی کامپیوتر به این صورت است که سورس ویدئو در حافظه ی RAM کپی می شود و علت این است که RAM حافظه ی سرعت بالاست، حال مراحل استیریم و انتقال اطلاعات برای پخش ویدئو از روی حافظه ی RAM ادامه پیدا می کند و به این صورت پخش real time خواهیم داشت.

بنابراین چنین کاربردهایی نیاز به حافظه RAM قابل توجه ای دارند که از این نظر محدودیت هایی داریم که با تکنیک هایی از این محدودیت ها استفاده می کنیم.

ویدئو در واقع شامل فریم های عکس پشت سر هم می باشد که در ثانیه باید چندین فریم پشت سر هم پخش شود تا در چشم ما استریم این تصاویر به صورت ویدئو نمودار شود. ( استانداردهایی برای تعداد فریم های قابل پخش در ثانیه وجود دارد از جمله 5,10,15,30  و … فریم بر ثانیه )

از طرف دیگر فرمت های متفاوتی برای ویدئو موجود هست که هر کدام برای کاهش حجم ویدئو از الگوریتم متفاوتی استفاده می کنند و البته صوت ویدئو هم با یکی از الگوریتم های صوت کد می شود. به این صورت حجم ویدئو هایی مثل mp4 و … که از الگوریتم های خاصی استفاده می کنند کم می شود. لذا برای باز پخش این ویدئوها باید از کودک( codec ) های خاص فرمت ها استفاده شود تا اطلاعات کد شده به اطلاعات قابل نمایش تبدیل شوند.

این مراحل رمزگشایی نیاز به توان پردازشی بالا دارد، از آنجا که پردازنده ی مورد استفاده محدودیت هایی دارد ، پس برای نمایش real time نیاز به اطلاعات کد نشده داریم و همینطور منطبق با اطلاعات رنگی LCD . به همین منظور نرم افزار Simple Stream Maker توسط EasyMCU ارائه شده که فریم های عکس پشت سر هم به عنوان ورودی به نرم افزار داده می شود و نرم افزار یک خروجی با پسوند ssi. ایجاد می کند که فایل ویدئو مد نظر بدون اعمال کد و با کد رنگی منطبق بر LCD به فرم رنگ 565 می باشد. این خروجی را می توان در کارت SD قرار داد و توسط کتابخانه SD و TFT موجود استریم فریم ها را توسط EasyMCU روی LCD به نمایش گذاشت.

اطلاعات تکمیلی و نرم افزار مربوطه به زودی اضافه می شود.

 

نمایش ویدئو روی TFT LCD رنگی توسط EasyMCU

 

آموزش استفاده از EEPROM توسط EasyMCU

آموزش استفاده از EEPROM توسط EasyMCU

حافظه EEPROM

EEPROM حافظه ای از نوع غیر فرار می باشد. غیر فرار به این مفهوم که زمانی که جریان برق در مدار وجود ندارد اطلاعات از بین نمی روند. برای درک بهتر اجازه بدید نگاهی به دو حافظه ی معروف به نام Flash و SRAM که در میکروکنترلرها وجود دارد بیندازیم.

 

حافظه SRAM

SRAM یک نوع حافظه با سرعت بالا می باشد که فقط مادامی که جریان برق در آن برقرار است اطلاعات را در خود ذخیره می کند. به عبارت دیگر با قطع شدن جریان برق از SRAM ، تمام اطلاعات موجود در SRAM از دست می رود. پس یک حافظه ی فرار هست. تمام متغییرهایی که در کد نویسی تعریف می کنید در این متغییر قرار می گیرند.

 

حافظه FLASH

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

جمع بندی و طرح یک سوال

به عنوان یک جمع بندی ، نوشتن و خواندن در SRAM به سادگی و با سرعت بالا امکان پذیر است منتها بعد از قطع شدن برق، تمام حافظه پاک می شود. برعکس این موضوع برای FLASH صادق است. از این رو هر 2 حافظه همدیگر را کامل می کنند و موجب می شوند میکروکنترلر جوری که باید کار کند.

حالا اگر در حین اجرای برنامه یک متغییر حیاتی داشتیم که مقدار آن در همه ی حالات باید حفظ می شد ، حتی در زمانی که به علت یک حادثه نا معلوم برق قطع شده باشد یا میکروکنترلر مجبور به راه اندازی مجدد شود، چه باید کرد؟

این نقطه ضعفی است که نه حافظه ی SRAM و نه FLASH از پس انجام آن بر نمی آیند ( با صرف نظر از موارد استثناء ) و اینجاست که حافظه ی سومی نیاز می باشد که هم نوشتن و خواندن در آن در زمان اجرای برنامه امکان پذیر باشد و هم با قطع شدن برق اطلاعات از بین نرود و پیوسته اطلاعات را در خود حفظ کند.

 

راه حل

حافظه ای به نام EEPROM با این قابلیت ها وجود دارد و در ادامه ی بحث با نحوه ی راه اندازی و استفاده از این حافظه آشنا می شویم. دقت کنید که  EEPROM یک حافظه با سرعت بالا نیست و هر بار بعد از خواندن و نوشتن احتیاج به چند میلی ثانیه تاخیر دارد. همینطور طول عمری برابر 1,000,000 بار خواندن و نوشتن دارد، پس در نحوه استفاده از آن دقت کنید. به عبارت ساده تر اگر در یک حلقه ی 1,000,000 تایی ، به این حافظه بنویسید و یا بخوانید، عمر حافظه به سر می رسد!

 

آموزش استفاده از EEPROM توسط EasyMCU

راه اندازی EEPROM با Zcross

این واحد به صورت پیشفرض فعال می باشد، پس فقط کافیست با متود های ()read و ()write اطلاعاتی از حافظه بخوانید یا در آن بنویسید. حافظه ی EEPROM در Zcross برابر 2KB ( کیلو بایت ) می باشد، یا به عبارتی 1024*2 ،فلذا آخرین آدرس حافظه که می توانید استفاده کنید 2047 می باشد.

برای نوشتن و خواندن در حافظه ی EEPROM باید یک آدرس مشخص کنید. فرضا اگر در آدرس 1 مقداری ذخیره کرده اید، برای خواندن مقدار ذخیره شده مجدد باید از آدرس 1 بخوانید.

 

سینتکس های خواندن و نوشتن

 

 برای نوشتن در EEPROM :

به جای data مقدار عددی مورد نظر و به جای myAddress آدرس مورد نظر و دلخواه را قرار دهید.

 

برای خواندن از EEPROM :

از آنجایی که اگر بخواهیم چند متغییر در EEPROM ذخیره کنیم ، نمی توانیم آدرس یکایک آنها را حفظ کنید، بهتر هست برای هر آدرس یک نام در نظر بگیرید و از دستور پیش پردازنده ی #define استفاده کنید. نحوه ی استفاده در پروژه نمونه مشخص شده است.

 

پروژه نمونه

در این پروژه مقدار 85 دسیمال ( یا 0x55 هگزادسیمال ) را در آدرس 1 حافظه ی EEPROM ذخیره می کنیم. نام این آدرس را myEEP قرار می دهیم تا راحتتر بتوانیم در آدرس مقصود بنویسیم یا بخوانیم ، در ادامه ی برنامه مقادیر را از حافظه EEPROM می خوانیم و در محیط ترمینال Easy MCU مقادیر را چاپ می کنیم. بعد از اولین اجرا ،  یک بار دیگر Zcross را راه اندازی می کنیم و ترمینال را اجرا می کنیم تا در 8 ثانیه ی اول عبارت EEPROM value is correct چاپ شود و ادامه ی ماجرا مانند قبل .

برنامه main.cpp نمونه