راه اندازی ماژول بلوتوث HC-05 و ارتباط با گوشی هوشمند

راه اندازی ماژول بلوتوث HC-05 و ارتباط با گوشی هوشمند

در  این آموزش (راه اندازی ماژول بلوتوث HC-05 و ارتباط با گوشی هوشمند) قصد داریم ماژول رو در به ساده ترین شکل ممکن راه اندازی کنیم و با یک گوشی هوشمند ارتباط برقرار کنیم.

در قدم اول باید با پایه های ماژول بلوتوث آشنا شویم.

پایه های ماژول بلوتوث HC-05 به پنج دسته تقسیم میشوند:

  1.  پایه های ارتباطی ماژول:  ارتباط سریال UART (پایه های Tx و Rx) ، ارتباط USB  و ارتباط سریال SPI
  2. پایه های ورودی و خروجی دیجیتال:  [PIO[0..11
  3. پایه های ورودی و خروجی آنالوگ: [AIO[0..1
  4. پایه های ارتباطی PCM
  5. پایه های تغذیه و ریست بلوتوث

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

  1. پایه های ارتباطی: پایه 1 (UART-TX) و پایه 2 (UART-RX)
  2. پایه های تغذیه ماژول: پایه 12 (تغذیه 3.3 ولت) و پایه 13 (زمین ماژول)
  3. پایه های LED نشانگر: پایه 31 نشانگر وضعیت و پایه 32 نشانگر اتصال
  4. پایه مد کاری ماژول : پایه 34 که با یک شدن این پایه ماژول وارد مد تنظیمات میشود و با صفر شدن آن ماژول وارد مد کاری خواهد شد.
پایه های ماژول بوتوث

پایه های ماژول بوتوث

پایه های مهم ماژول بلوتوث hc-05

پایه های مهم ماژول بلوتوث hc-05

حال مراحل زیر را با رعایت ترتیب برای راه اندازی ماژول و اتصال به گوشی هوشمند دنبال کنید

  1. بوسیله یک مبدل پایه های ماژول را به کامپیوتر وصل میکنیم
  2. پایه کلید (پایه 34) را به 3.3 ولت وصل میکنیم (ورود به حالت تنظیم)
  3. تغذیه ماژول را به 3.3 ولت و زمین وصل کنید
  4. ترمینال سریال کامپیوتر را با پورت مشخص شده و baudrate=38400 باز میکنیم.
    1. دستور AT+ORGL را برای بازگردانی ماژول به تنظیمات پیش فرض وارد میکنیم. باید پاسخ O.k. از طرف ماژول بازگردانده شود.
  5. سپس پایه کلید (پایه 34) را به زمین وصل میکنیم (ورود به حالت کاری ماژول)
  6.  تغذیه ماژول را یک بار قطع و سپس وصل میکنیم (در این حالت LED وضعیت چشمک زن به خود خواهد گرفت)
  7. حال روی گوشی هوشمندتان برنامه “BlueTerm-2” را نصب کرده کنید و دستگاه های بلوتوث را از داخل برنامه جستجو کنید (نام پیش فرض  ماژول بلوتوث میتواند “H-C-2010-06-01” باشد )
  8. از شما رمز اتصال میخواهد. پسورد پیش فرض “1234” میباشد. با وارد کردن رمز و تایید آن شما به ماژول متصل شده اید.
  9. حال هر آنچه داخل ترمینال کامپیوتر تایپ کنید در گوشی هوشمند قابل مشاهده و بلعکس هر آنچه از گوشی تایپ کنید در کامپیوتر قابل مشاهده است. با متصل شدن کامیوتر به ماژول چراغ وضعیت 3 بار سریع روشن و خاموش شده و یک ثانیه خاموش میماند.

 

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

 

در آموزش بعدی دستورات تنظیمی ماژول رو با هم بیشتر بررسی خواهیم کرد

موفق باشید

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

انتخاب دیوایس بلوتوث

وارد کردن پسورد ماژول بلوتوث

وارد کردن پسورد ماژول بلوتوث

ترمینال سریال کامپیوتر

ترمینال سریال کامپیوتر

ترمینال بلوتوث گوشی هوشمند

ترمینال بلوتوث گوشی هوشمند

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

راه اندازی انکودر موتور-قسمت دوم

انکودر نوری

 راه اندازی انکودر موتور – قمست دوم

بسم الله

در مورد انواع انکودرها، کاربرد و چگونگی عملکر آنها در قسمت پیشین این آموزش (راه اندازی انکودر موتور) به تفضیل بحث شد. در قسمت دوم از این آموزش میخواهیم به پیاده سازی عملی راه اندازی انکودر موتور توسط ARM LPC1788 بپردازیم. در قسمت قبل دو دسته بندی برای روشهای خواندن و کار با انکودر (encoder) ارائه شد.

  • روش ساده : خواندن پایه انکودر و شمردن به ازای هر بار صفر و یک شدن پایه
  • روش اصولی : استفاده از کانتر برای شمارش اتوماتیک پالس ها بدون درگیرشدن پروسسور
LPC1788 - ARM CORTEX-M3

LPC1788 – ARM CORTEX-M3

حال میخواهیم به روش اصولی که استفاده از کانتر (counter) میکر.کنترلر است، خواندن مقادیر انکودر را انجام و مسافت طی شده توسط ربات متحرک را محاسبه کنیم.

 

کانتر میکرو کنترلر میتواند برحسب تنظیم به ازای هر لبه بالا یا پایین رونده یک عدد بشمرد. صرفا جهت یادآوری این لبه ها از همان لبه پالس های تولیدی توسط انکودر نوری میباشد. با توجه به اینکه انکودر مورد استفاده در این پروژه به ازای یک دور کامل موتور 200 پالس تولید میکنند، پس با دیدن هر 200 لبه پایین رونده میتوانیم مطمئن باشیم موتور یک دور کامل زده است. از طرف دیگر محیط چرخ ربات ما 10 سانتی متر است یعنی با چرخش یک دور کامل موتور (چرخ) ربات 10 سانتی متر حرکت کرده است. پس میتوانیم بگوییم با گرفتن هر 200 پالس انکودر ربات 10 سانتی متر حرکت کرده است.

 

میکروی LPC1788 دارای 4 کانتر(تایمر) است که میتوان به انتخاب، از هرکدام استفاده کرد که ما در اینجا از کانتر صفر استفاده میکنیم.

تنظیمات کانتر بسیار ساده و کوتاه است که توجه شما رو به اون جلب میکنم.

 

تنظیم رجیسترهای کانتر

تنظیم رجیسترهای کانتر

 

برای راه اندازی کانتر تنها باید سه رجیستر بالا تنظیم شوند:

  1. رجیستر PR تعیین کننده اینست که به ازای چند لبه کانتر یک عدد بالا برود.
  2. رجیستر CTCT برای انتخاب لبه پایین رونده پالس به عنوان معیار شمارش و تعیین کننده شماره پایه ورودی کانتر است.
  3. رجیستر TCR برای راه اندازی (start) کانتر مورد استفاده قرار گرفته است.

با تنظیمات بالا با هر بار لبه پایین رونده مقدار عدد کانتر یکی اضافه میشود و این مقدار را میتوان مشابه زیر از رجیستر TC کانتر خواند. با دانستن تعداد پالس انکودر در هر دقیقه (200 پالس) و محیط چرخ (10 سانتی متر) میتوان مسافت طی شده را محاسبه نمود.

محاسبه مسافت

محاسبه مسافت

 

جهت یادگیری بهتر، کد پروژه از انتهای مطلب قابل دانلود میباشد. در کد ذکر شده برای تست بجای شمارش پالس های انکودر از واحد PWM برای تولید پالس استفاده شده است که در ذات کاری تفاوتی ایجاد نمی کند. میزان اندازه گیری شده مسافت در داخل پورت سریال UART نمایش داده میشود.

دانلود کد پروژه خواندن انکودر

 

 

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

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

انکودر نوری

 راه اندازی انکودر موتور – قمست اول

بسم الله

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

موتور به همراه انکودر

موتور به همراه انکودر

انکودرها از نظر ساختمان به دو دسته خطی (Linear) و دوّار (Rotary) تقسیم میشوند. انکودر خطی جهت اندازه گیری مسافت خطی استفاده میشود ولی انکودر دوّار یا چرخشی که موضوع بحث ها هم هست، برای سنجش میزان دوران استفاده میشوند.

انکودر خطی و چرخشی

انکودر خطی و چرخ

انکودرهای چرخشی نیز به دو نوع مطلق (Absolute) و افزایشی (Incremental) تقسیم میشوند. انکودرهای مطلق دارای چندین بیت هستند که در هر لحظه با کنار هم گذاشتن آنها موقعیت دقیق دوران مشخص میشود و انکودرهای افزایش تنها دارای شیارهایی هستند ایجاد پالس میکنند و باید با شمردن پالس ها میزان چرخش را مشخص کنید، مثلا در وقتی شما یک انکودر افزایشی 200 پالس، در طی چرخش کامل 360 درجه ای 200 پالس تولید خواهد کرد.

انکودر چرخشی نوری

انکودر افزایشی (Incremental)

انکودر مطلق (Absolute)

انکودر مطلق (Absolute)

انکودرهای دوّار بطور متداول از یک جفت LED، که یکی فرستنده و دیگری گیرنده و یک دیسک مدرج (سیاه و سفید با جاهای خالی یا پر) استفاده میکنند. به این شکل که دیسک مدرج مابین سنسور فرستنده و گیرنده قرار میگیرد و با چرخش دیسک که به شفت موتور متصل است، سیگنال هایی از سمت فرستنده به گیرنده ارسال میشود. در صورتی که بین فرستنده و گیرنده قسمت تو پر دیسک قرار بگیرد هیچ نوری از فرستنده به گیرنده نمیرسد و در نتیجه انکودر عدد صفر منطقی را بر میگرداند و در غیر این صورت انکودر عدد یک منطقی را برمیگرداند. این صفر و یک شدن یک قطار پالس درست میکند که با استفاده از آن میزان چرخش موتور بدست می آید، به همچین ساختاری انکودر نوری میگویند.

انکودر افزایشی نوری

انکودر افزایشی نوری

انکودر افزایشی نوری

انکودر افزایشی نوری

برای شمارش پالس های انکودر نوری دو روش وجود دارد

  • روش ساده : خواندن پایه انکودر و شمردن به ازای هر بار صفر و یک شدن پایه
  • روش اصولی : استفاده از کانتر برای شمارش اتوماتیک پالس ها بدون درگیرشدن پروسسور

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

LPC1788 - ARM CORTEX-M3

LPC1788 – ARM CORTEX-M3

 

codevisionavrFAT6

راه اندازی FATوکار با حافظه های MMC و SDCباAVR – قسمت6

به نام خدا

راه اندازی FAT با AVR قسمت 6 : دو نکته مهم و بررسی یک برنامه عملی

پس از آن که با توابع اصلی و مهم FAT آشنا شدیم حال می خواهیم به بررسی یک برنامه عملی بپردازیم، قبل از آن که وارد بحث برنامه نویسی شویم باید به دو نکته مهم در مورد کار با توابع FAT توجه کنیم.

  • برای عملکرد صحیح کارت حافظه چه MMC,SDC و SD HC باید تابع زیر که یک تابع low level می باشد هر 10 میلی ثانیه فراخوانی شود.

void disk_timerproc (void);

به منظور عملکرد صحیح این تابع را در وقفه تایمری که 10 میلی ثانیه تنظیم شده است باید قرار دهیم. باید اطمینان پیدا کنید که این تابع در برنامه شما هر 10 میلی ثانیه اجرا می شود در غیر این صورت توابع کارت حافظه زمانی که، time out شدن عملیات را بررسی می کنند، در انتهای حلقه قفل می گردند.

  • پس از آن که دیتای مورد نظر را در فایل نوشتیم برای ذخیره شدن اطلاعات باید از دستور زیر استفاده کنیم:

FRESULT f_close(FIL* fp);

  • این تابع دارای یک ورودی و یک مقدار برگشتی می باشد. ورودی ما از جنس استراکچر FIL می باشد، که باید اسم فایلی را بدهیم که دیتا را در آن نوشته ایم. همچنین مقدار برگشتی می تواند یکی از مقادیر زیر باشد:
    1. FR_OK : در صورت موفقیت آمیز بودن عملیات این تابع این مقدار را بر می گرداند.
    2. FR_NOT_READY : دسترسی به دیسک امکان پذیر نمی باشد، ممکن است به دلیل گم کردن اطلاعات یا چیزی دیگر باشد.
    3. FR_DISK_ERR : عملیات ناموفق بوده است ،زیرا دسترسی فیزیکی به دیسک از دست رفته است.
    4. FR_INT_ERR : عملیات به علت اشتباه بودن استراکچر FAT و یا خطای داخلی ناموفق بوده است.
    5. FR_INVALID_OBJECT : فایل با تابع f_open باز نشده است.

حال که اطلاعات لازم برای کار با حافظه ها را داریم به برنامه نویسی برای آن ها می پردازیم.

  • تابع زیر هر 10 میلی ثانیه اجرا می گردد:

1-int

 

 

 

  • تابع زیر فضای لازم برای کار با FAT را آماده سازی می کند:

2-mount

 

  • تابع زیر فایل با آدرس مورد نظر ما را باز می کند:

3-open

 

  • تابع زیر در فایل باز شده 17 بایت از دیتا را می نویسد:

4-write

 

  • و در آخر تابع زیر فایل را ذخیره می کند و سپس می بندد:

5-close

 

 

 

کنترل موتور steper با استفاده از FPGA

توصیف کنترل موتور steper با استفاده از زبان VHDL

دراین پروژه به  راه اندازی کنترل موتور steper با استفاده از VHDL پرداخته می شود. موتور استپر استفاده شده یک موتور استپر ساده دارای مشخصات زیل می باشد

Specifications

  • Rated Voltage: DC 5V
  • Number of Pole: 4
  • Speed Variation Ratio: 1/64
  • Stride Angle: 5.625°/64
  • DC Resistance: 200Ω ± 7%(25°C)
  • Idle In-traction Frequency: > 600Hz
  • Idle Out-traction Frequency: > 1000Hz
  • In-traction Torque: > 34.3mN.m(120Hz)
  • Self-positioning Tor: > 34.3mN.m
  • Insulated Resistance: > 10MΩ(500V)
  • Insulated Electricity Power: 600VAC/1mA/1s
  • Insulation Grade: A
  • Rise in Temperature: < 40K(120Hz)
  • Noise: < 40dB(120Hz, No load, 10cm)

 

c3ce5ac0079a449b99543bf2d5f41c63.image.530x397

این پروژه با استفاده از زبان VHDL نوشته شده است و برای سرعت 125 استپ و 500 استپ در ثانیه طراحی گردیده است.

 

——————————————————-

 stepper_test.vhd – Driving a low cost stepper motor–

                  using a low cost driver board–

               Uses ‘Full Step Drive’ – see–

——————————————————-

;library IEEE

;use IEEE.STD_LOGIC_1164.ALL

;use IEEE.NUMERIC_STD.ALL

entity stepper_test is

  ;  Port ( clk32M   : in   STD_LOGIC

           — Control signals

          ; sw_dir      : in   STD_LOGIC

         ;  sw_enable   : in   STD_LOGIC

         ;  sw_speed    : in   STD_LOGIC

           — Outputs

        ; (position : out  STD_LOGIC_VECTOR(15 downto 0

           — Signals to the drivers

        ;   phase_a  : out  STD_LOGIC

         ;  phase_b  : out  STD_LOGIC

        ;   phase_c  : out  STD_LOGIC

         ; ( phase_d  : out  STD_LOGIC

;end stepper_test

architecture Behavioral of stepper_test is

  ; “signal coils      : std_logic_vector(3 downto 0) := “0011

 ; ( ‘signal count      : unsigned(17 downto 0) := (others => ‘0

 ; ( ‘signal step_count : unsigned(15 downto 0) := (others => ‘0

begin

;   (phase_a <= coils(0

   ;   (phase_b <= coils(1

;   (phase_c <= coils(2

   ;   (phase_d <= coils(3

   ;   (position <= std_logic_vector(step_count

 

 

همانطور که در زیل مشاهده می شود،در فرایند برنامه به ازای هر لبه بالا رونده کلاک در شرایطی که  sw_enable برابر با یک است با یک،صفر شدن  sw_dir موتور به راست و چپ می چرخد.

(p: process(clk32M

   begin

      if rising_edge(clk32M) then

         if count = 0 then

            if sw_enable = ‘1’ then

               if sw_dir = ‘1’ then

                  ;   (coils <= coils(0) & coils(coils’high downto 1

                  ;step_count <= step_count + 1

               else

              ;  (  coils <= coils(coils’high-1 downto 0) & coils(coils’high

                  ;    step_count <= step_count – 1

                ;   end if

             ;   end if

          ;  end if

 

سرعت موتور در دو وضعیت 125 استپ در ثانیه و 500 استپ در ثانیه با سیگنال sw_speed تعیین می شود.

 Control the speed —

if sw_speed = ‘1’ and count =  64000-1 then

 500 steps every second – fast —

  ;  (‘count <= (others => ‘0

elsif count = 256000-1 then

 125 steps every second – slow  —

;(‘count <= (others => ‘0

else

;count <= count + 1

;end if

;end if

;end process

;end Behavioral

 

در برنامه ی فوق در شرایطی که count = 0 نمی باشد مطابف شرط  sw_speed به count    به ازای هر سیگنال کلاک اضافه شده ودر شرایطی که count = 0 است شرایط برای حرکت موتور مهیا می شود بنابر این هر زمان sw_speed  تغییر کند سرعت چرخش موتور تغییر می کند.

آموزش کار با ماژول بلوتوث_قسمت سوم

آموزش کار با ماژول بلوتوث_قسمت سوم

آموزش کار با ماژول بلوتوث_قسمت سوم

 

بسم الله

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

ماژول های بلوتوث موجود در بازار به تعدادی انگشت شمار محدود میشوند. تفاوت آنها معمولاًدر نوع تولید، ولتاژ کاری، برد مفید و قیمت آنها و البته نرم افزار پروگرام شده در چیپ آن خواهد بود.  شکل ظاهری ماژول های بلوتوث بسیار شبیه و گاهاً کاملا مشابه یکدیگرند و بصورت شهودی معمولا قابل تشخیص نیستند و تفاوت آنها اکثراً در نرم افزار (firmware) بکار رفته درون آنها میباشد.

ماژول های موجود در بازار ایران HC-05 ، HC-06، HC-07، BC-04B، HC-08، SD200، AUBTM20، AUBTM22 و AUBTM23 هستند که از این مدلها HC-05 از محبوبیت بیشتری در بین طراحان برخوردار است که دلیل آن را میتوان کامل بودن نرم افزار داخلی چیپ و پشتیبانی کامل از مدهای Master و Slave و دستورات AT آنها دانست.

 

جدول پایین به مقایسه اجمالی سه ماژول محبوب و پرکاربرد بلوتوث می پردازد.

HC-05 BC-04 HC-06 نام ماژول
صنعتی نظامی عمومی نوع تولید (سطح تولید)
tick_pic tick_pic tick_pic پشتیبانی از AT-COMMAND
tick_pic tick_pic cross_pic قابلیت تنظیم نرم افزاری master و slave
cross_pic tick_pic cross_pic قابلیت تنظیم سخت افزاری master و slave
3.3 الی 3.6 3 الی 4.3 3.3 الی 3.6 ولتاژ کاری (ولت)
30 الی 40 2 الی 10 30 الی 40 جریان مصرفی (میلی آمپر)
17.500 22.000 18.000 قیمت در بازار ایران (تومان)

 

ماژول ها میتوانند در دو مد Master یا Slave کار کنند، که معمولاً تفاوت این دو مد برای کاربران روشن نیست. در مد Slave هر وسیله ای مثل گوشی میتواند به ماژول متصل شود و پس از متصل شدن ماژول میتواند ارتباط دوطرفه داشته باشد اما در مد Master ماژول میتواند انتخاب کند که به چه دیوایسی متصل شود.

  • هسته نرم افزاری با پشتیبانی تنها بخشی از دستورات AT
  • پشتیبانی از بلوتوث نسخه 2.0
  • پشتیبانی از مد Slave
  •  آنتن روی بردی
HC-06
  • هسته نرم افزاری British CSR BlueCore4
  • پشتیبانی از بلوتوث نسخه 2.1
  • پشتیبانی از دو مد Master و Slave
  • آنتن روی بردی
BC-04
  • هسته نرم افزاری با پشتیبانی از تمام دستورات AT
  • پشتیبانی از بلوتوث نسخه 2.0
  • پشتیبانی از دو مد Master و Slave
  • آنتن روی بردی
HC-05

 

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

موفق باشید

راه اندازی FAT با AVR

راه اندازی FATوکار با حافظه های MMC و SDCباAVR – قسمت5

به نام خدا

راه اندازی FAT با AVR قسمت 5 : بررسی توابع  FAT –  خواندن و نوشتن در حافظه های MMC و SDC

در ادامه بحث راه اندازی FAT با AVR پس از آنکه یک فایل را برای با تابع f_open باز کردیم، با توجه به mode انتخاب شده می توانیم روی آن فایل بنویسیم و از آن بخوانیم. برای این منظور می بایست از توابعی که در زیر به توضیح آن ها می پردازیم استفاده نمود.

تابع نوشتن در فایل:

FRESULT f_write(FIL* fp, const void* buff, unsigned int btw, unsigned int* bw);

این تابع دارای چهار ورودی و یک مقدار برگشتی می باشد، در ادامه به برسی ورودی ها و مقدار برگشتی می پردازیم.

پارامتر های ورودی:

  • fp* : یک متغییر پوینتری به استراکچری از جنس FIL می باشد. این استراکچر حاوی اطلاعتی از قبیل اطلاعات FATFS فایل، ID ، آدرس سکتور در کلاستر، مسیر فایل،… می باشد. این استراکچر را در جلسه قبل در تابع f_open توضیح دادیم، در تابع f_write دیتای مورد نظر ما روی این استراکچر نوشته می شود.
  • buff* : اشاره گر به یک بافر آرایه ای از جنس بایت است که در RAM قرار دارد. در اصل محتوایی را که می خواهیم بنویسیم در این متغییر باید قرار گیرد.
  • Btw : یک متغییر از جنس unsigned int می باشد. این متغییر تعداد بایت ها یا کاراکترهایی از بافر را که می خواهیم در فایل بنویسیم تعیین می کند.
  • bw* : یک متغییر پوینتری از جنس unsigned int می باشد که اشاره گر به تعداد بایت هایی از آرایه است که بتواند داخل فایل بنویسد.

مقدار برگشتی:

  • این تابع دارای مقدار برگشتی نیز می باشد که مقدار برگشتی از جنس FRESULT که از نوع enum تعریف شده است می باشد این نوع مقادیر را در جلسات گذشته بررسی کردیم. این تابع یکی از مقدار های زیر را بر می گرداند:
    1. FR_OK : در صورت موفقیت آمیز بودن عملیات این تابع این مقدار را بر می گرداند.
    2. FR_DENIED: دسترسی به فایل مورد نظر به دلیل آن که فایل به صورت Read_only باز شده است، ممکن نیست.
    3. FR_NOT_READY : دسترسی به دیسک امکان پذیر نمی باشد، ممکن است به دلیل گم کردن اطلاعات یا چیزی دیگر باشد.
    4. FR_DISK_ERR : عملیات ناموفق بوده است ،زیرا دسترسی فیزیکی به دیسک از دست رفته است.
    5. FR_INT_ERR : عملیات به علت اشتباه بودن استراکچر FAT و یا خطای داخلی ناموفق بوده است.
    6. FR_INVALID_OBJECT : فایل با تابع f_open باز نشده است.

تابع خواندن از فایل:

FRESULT f_read(FIL* fp, void* buff, unsigned int btr, unsigned int* br);

این تابع نیز دارای چهار ورودی و یک مقدار برگشتی می باشد.

پارامتر های ورودی:

  • fp*: یک متغییر پوینتری به استراکچری از جنس FIL می باشد. این استراکچر حاوی اطلاعتی از قبیل اطلاعات FATFS فایل، ID ، آدرس سکتور در کلاستر، مسیر فایل،… می باشد. این استراکچر را در جلسه قبل در تابع f_open توضیح دادیم، در تابع f_read دیتای مورد نظر از روی این استراکچر خوانده می شود.
  • buff* : اشاره گر به یک بافر آرایه ای از جنس بایت است که در RAM قرار دارد. در اصل محتوایی را که از فایل می خوانیم در این متغییر قرار می گیرد. طول این آرایه باید به اندازه کافی بزرگ باشد، حداقل طول این آرایه باید به اندازه بزرگترین عددی باشد که جای btr قرار می گیرد.
  • Btr : یک متغییر از جنس unsigned int می باشد. این متغییر تعداد بایت ها یا کاراکترهایی را که از فایل می خواهیم بخوانیم را تعیین می کند.
  • br* : یک متغییر پوینتری از جنس unsigned int می باشد که اشاره گر به تعداد بایت هایی است که از آرایه می خوانیم. در حالتب که تابع موفقیت آمیز کار خود را به پایان برساند و عدد داخل br کمتر از btr باشد، یا به عبارتی از تعداد کاراکترهایی که قصد خواندن آن ها را داشتیم کمتر باشد، به این معنی است که به انتهای فایل رسیده ایم.

مقدار برگشتی:

  • این تابع دارای مقدار برگشتی نیز می باشد که مقدار برگشتی از جنس FRESULT که از نوع enum تعریف شده است می باشد همان طور که در بالا گفتیم این نوع مقادیر را در جلسات گذشته بررسی کردیم. این تابع یکی از مقدار های زیر را بر می گرداند:
    1. FR_OK : در صورت موفقیت آمیز بودن عملیات این تابع این مقدار را بر می گرداند.
    2. FR_DENIED: دسترسی به فایل مورد نظر به دلیل آن که فایل به صورت write_only باز شده است، ممکن نیست.
    3. FR_NOT_READY : دسترسی به دیسک امکان پذیر نمی باشد، ممکن است به دلیل گم کردن اطلاعات یا چیزی دیگر باشد.
    4. FR_DISK_ERR : عملیات ناموفق بوده است ،زیرا دسترسی فیزیکی به دیسک از دست رفته است.
    5. FR_INT_ERR : عملیات به علت اشتباه بودن استراکچر FAT و یا خطای داخلی ناموفق بوده است.
    6. FR_INVALID_OBJECT : فایل با تابع f_open باز نشده است.

در جلسه بعد به بررسی یک برنامه عملی می پردازیم.

 

400W_ac_servo_drive_EVTA_F_series

کاربرد FPGA ها در طراحی درایور موتورهای Servo

سروُ موتورها(موتورهای مبتنی بر سیستم سروُ)  به لحاظ عملکرد  در اصل  موتورهایی هستند  که  مجهز به  یک سیستم  کنترلی می باشند، برای سروُ موتورهای صنعتی  این سیستم در قالب یک موتورانکودر دار و یک  درایور ظاهر می شود ؛ که درایور مشتمل  بر یک  کنترلر ، تغذیه سویچینگ،  ورودی خروجی ها و..می باشد که این طراحی متناسب با  ساختار موتور و سایر اجزا می باشد. موتور نیز از یک انکودر و یک  موتور الکتریکی تشکیل شده است.
AC-SERVO-KIT-1KW-1024x1024

با پیشرفت  این تکنولوژی  پیچیدگی ساختار افزایش یافته است به طوری که نیاز به پردازنده هایی که  اولا؛ با سرعت بالا تری کارکنند دوم؛ انعطاف پذیری بالاتری داشته باشند، سوم؛ به سرعت بتوان آنها را برای ساختارهای جدید بروز رسانی کرد، چهارم آنکه  بتوان از آنها در طراحی سیستم های کنترلری بهره برد ، نظر به استفاده از  FPGA ها را (که هم از سرعت بالایی برخوردارند و هم طیفی وسیعی از قیمت ها برخوردارند ، هم  از انعطاف بالا در طراحی بر خوردارند ) با لا برده است. اگر شما یک سرو درایور را باز کنید یک  پردازنده DSP و یک FPGA مشاهده خواهید نمود.

controler

در شکل فوق یک نمای درایور موتور سرو که با استفاده از سافت پروسسور NIOS (یک ابزار قوی موجود در FPGA های شرکت Altera) که برای دو موتور طراحی شده، نمایش داده شده است.

باید اضافه نمود، سروُ موتورها در محدوده ای وسیع از تجهیزات صنعتی،پزشکی، نظامی و… نظیر CNCها،  ،  نوار نقاله، ربات های عنکبوتی و… کاربرد فراوان دارند.

Servo-Drive

Lab

داشتن آزمایشگاه دیجیتال در درون FPGA

FPGA ها به عنوان یک ابزار قدرتمند این امکان را فراهم می­کند تا با بهره گیری  از کتابخانه ­های مختلف  نظیر گیت های AND ،  NAND ،  NOR  و… و ده ­ها کتابخانه های مختلف  و استفاده از Mega Core ها، شرایط  را برای داشتن یک  آزمایشگاه  دیجیتال  در اختیار کاربر  قرار­دهد تا با بهره­ گیری از آنها یک طرح  ساده  تا یک طرح پیچیده پیاده سازی شود.

2mwbhft.png;

 

یک طرح دیجیتال ساده پیاده سازی شده در FPGA که در محیط شماتیک نمایش داده¬شده-است؛

در زیل طرح فضای اشغال شده در FPGA نمایش داده شده است.

 

 

البته باید توجه داشت روشهای مختلفی  وجود دارد تا یک طرح دیجیتال در FPGA  پیاده سازی شود ، که  می­توان  به Mega Core ها ، زبانهای توصیف سخت افزار و… اشاره نمود.  

راه اندازی FAT با AVR

راه اندازی FAT و کار با حافظه های MMC و SDC با AVR – قسمت 4

به نام خدا

راه اندازی FAT با AVR قسمت 4 : بررسی توابع FAT – آماده سازی کارت های حافظه MMC و SDC برای خواندن، نوشتن و یا ایجاد فایل

در ادامه مبحث راه اندازی FAT با AVR پس از آنکه با نحوه فضا سازی برای کار با سیستم FAT آشنا شدیم حال می خواهیم به نحوه آماده سازی کارت های حافظه برای خواندن، نوشتن و ایجاد فایل در حافظه های MMC و SDC بپردازیم.

قبل از هرگونه عملیات روی فایل (خواندن، نوشتن، اضافه کردن و …) ابتدا باید فایل مورد نظر را باز کنیم، برای این کار از تابع زیر استفاده می کنیم:

FRESULT f_open(FIL* fp, const char* path, unsigned char mode);

این تابع فایل مورد نظر را برای اجرای عملیات آماده می کند، اما این تابع چه عملیات هایی را می تواند انجام دهد را در ادامه بیان می کنیم.

تابع فوق دارای سه ورودی و یک مقدار بازگشتی می باشد که در زیر آن ها را توضیح می دهیم.

پارامتر های ورودی:

  • fp* : یک متغییر پوینتری به استراکچری از جنس FIL می باشد. در صورت موفقیت آمیز بودن عملیات f_open این استراکچر توسط سایر توابع قابل استفاده می باشد. این استراکچر حاوی اطلاعتی از قبیل اطلاعات FATFS فایل، ID ، آدرس سکتور در کلاستر، مسیر فایل،… می باشد. در ادامه اطلاعات کامی این استراکچر آورده شده است.
  • path* : آدرس فایلی است که تابع f_open می خواهد آن را باز و آماده سازی کند.
  • Mode : با استفاده از این پارامتر تعیین می شود که چه دسترسی هایی به فایل باز شده داشته باشیم در زیر لیست این دسترسی ها بررسی می شود.

لیست Mode هایی که می توان استفاده نمود:

  1. FA_READ : این حالت فقط دسترسی خواندن از فایل را به ما می دهد. اگر فایل تنها در این حالت باز گردد امکان نوشتن در آن وجود ندارد.
  2. FA_WRITE : این حالت فقط دسترسی نوشتن در فایل را به ما می دهد. اگر فایل تنها در این حالت باز گردد امکان خواندن از آن وجود ندارد.
  3. FA_OPEN_EXISTING : فایل با آدرس خواسته شده را باز می کند. اگر فایل وجود نداشته باشد تابع با شکست روبرو می شود.
  4. FA_OPEN_ALWAYS : فایل با آدرس خواسته شده را اگر وجود داشته باشد باز می کند، اگر وجود نداشته باشد ابتدا آن را ایجاد می کند و سپس باز می کند.
  5. FA_CREATE_NEW : یک فایل جدید ایجاد می کند، اگر فایل از قبل وجود داشته باشد عملیات با شکست مواجه می شود.
  6. FA_CREATE_ALWAYS : یک فایل جدید ایجاد می کند ، اگر فایل از قبل وجود داشته باشد روی آن از اول می نویسد و حجم فایل را صفر می کند.

محتویات اسراکچر FIL :

typedef struct _FIL_

      {

      FATFS*   fs;                  /* Pointer to the owner file system object */

      unsigned short    id;         /* Owner file system mount ID */

      unsigned char     flag;       /* File status flags */

      unsigned char     csect;      /* Sector address in the cluster */

      unsigned long     fptr;       /* File R/W pointer */

      unsigned long     fsize;      /* File size */

      unsigned long     org_clust;  /* File start cluster */

      unsigned long     curr_clust; /* Current cluster */

      unsigned long     dsect;      /* Current data sector */

      unsigned long     dir_sect;   /* Sector containing the directory entry */

      unsigned char*    dir_ptr;    /* Pointer to the directory entry in the window */

      unsigned char     buf[512];   /* File R/W buffer */

      } FIL;

 

مقدار برگشتی:

  • این تابع دارای مقدار برگشتی نیز می باشد که مقدار برگشتی ما نیز از جنس FRESULT که از نوع enum تعریف شده است می باشد این نوع مقادیر در جلسه گذشته بررسی کردیم. این تابع یکی از مقدار های زیر را بر می گرداند:
    1. FR_OK : در صورت موفقیت آمیز بودن عملیات این تابع این مقدار را بر می گرداند.
    2. FR_NO_FILE: در صورت پیدا نکردن فایل با آدرس مورد نظر این مقدار را بر می گرداند.
    3. FR_NO_PATH : در صورت پیدا نکردن مسیر فایل این مقدار را برمی گرداند.
    4. FR_INVALID_NAME: در صورت نامعتبر بودن نام فایل این مقدار را برمی گرداند.
    5. FR_INVALID_DRIVE : در صورت نامعتبر بودن شماره درایو این پیغام را برمی گرداند.
    6. FR_EXIST: در صورت وجود فایل از قبل این پیغام را برمی گرداند.
    7. FR_DENIED: دسترسی به فایل مورد نظر به علت یکی از دلایل زیر ممکن نیست:
      1. تلاش برای باز کردن فایلی در حالت نوشتن است در حالی که این فایل Read_Only تنظیم شده است.
      2. فایل نمی تواند ایجاد شود، چراکه یک فایل به همین اسم از قبل وجود دارد و یا این که فایل به صورت Read_only است.
      3. فایل نمی تواند ایجاد گردد، چراکه دایرکتوری و یا فضای دیسک پر شده است.
    8. FR_NOT_READY : دسترسی به دیسک امکان پذیر نمی باشد، ممکن است به دلیل گم کردن اطلاعات یا چیزی دیگر باشد.
    9. FR_WRITE_PROTECTED : باز کردن فایل در حالت نوشتن و یا اسجاد فایل امکان پذیر نمی باشد، زیرا دیسک محافظت از نشتن (Write Protect) شده است.
    10. FR_DISK_ERR : عملیات ناموفق بوده است ،زیرا دسترسی فیزیکی به دیسک از دست رفته است.
    11. FR_INT_ERR : عملیاتبه علت اشتباه بودن استراکچر FAT و یا خطای داخلی ناموفق بوده است.
    12. FR_NOT_ENABLED : فضای درایو در RAM با تابع f_mount پیاده سازی نشده است.
    13. FR_NO_FILESYSTEM : فضای فت (FAT Partition) معتبر روی دیسک وجود ندارد.

نکته ای که در مورد تابع f_open لازم است بدان توجه شود این است برای باز کردن فایل می توان از مد های ترکیبی با ستفاده از OR استفاده کرد. برای نمونه می تواین یک فایل را هم خواند هم روی آن نوشت برای این منظور mode را باید به فرم زیر اعمال کرد:

Result = f_open(&file,path,FA_READ |FA_WRITE);

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