آردوینو آردوینو Arduino Uno برد STM نمایشگر LCD

ارتباط بین برد آردوینو و میکروکنترلر STM32 با کمک پروتکل USART

نوشته شده توسط علی زاهدی, معین صابری

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

در این آموزش به برقراری ارتباط بین میکروکنترلر STM32 و برد آردوینو می پردازیم. در این آموزش، به کمک رابط سریال UART دو میکروکنترلر، دمای خوانده شده توسط سنسور LM35 متصل به میکروکنترلر STM32 را از طریق رابط سریال UART به برد آردوینو UNO ارسال کرده و این دیتا را بر روی نمایشگر کاراکتری متصل به آردوینو نمایش خواهیم داد. در ادامه با مرجع تخصصی آردوینو به زبان فارسی ، دیجی اسپارک همراه باشید.

 


میکروکنترلر STM32


خانواده STM32 میکروکنترلرهای ۳۲ بیتی شرکت ST هستند. این محصول با ترکیب عملکرد بسیار قوی، ولتاژ کاری پایین، پردازش سیگنال دیجیتال و  سهولت در توسعه، محبوبیت بسیار زیادی را کسب کرده اند. دامنه وسیعی از میکروکنترلر های STM32  وجود دارد که مبتنی بر یک هسته صنعتی استاندارد ساخته شده اند. میکروکنترلر های STM32 از پروتکل های ارتباطی گسترده‌ای پشتیبانی می‌کنند، که از جمله آنها میتوان به UART ،I2C ،SPI ،USB و … اشاره نمود.

Bluepill

 


برد آردوینو UNO


برد آردوینو UNO یکی از مهم ترین و پرکاربردترین بردها در پروژه های میکروکنترلری به شمار می رود.  این برد که در حقیقت یک برد توسعه برای میکروکنترلر ATMEGA328P به شمار می رود، توانسته توجه توسعه دهندگان الکترونیک را به خود جلب کند. به کمک این برد شما می توانید به سادگی برد را پروگرام کرده و برنامه مورد نظر خود را بر روی آن اجرا نمایید.

UNO

از آنجاییکه قطعات لازم جهت راه اندازی یک میکروکنترلر بر روی برد آردوینو قرار گرفته است، لذا بدون نیاز به هیچ قطعه جانبی، شما می توانید میکروکنترلر را راه اندازی نمایید. از طرفی دیگر، زبان برنامه نویسی آردوینو که مبتنی بر زبان C++ توسعه یافته، برنامه نویسی را به لطف وجود کتابخانه های متعدد برای سنسورها و المان های مختلف، بسیار ساده می نماید.

 


سنسور دمای LM35


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

LM35

 


نمایشگر LCD کاراکتری


یکی از مهم ترین جز هر سیستم، نمایشگر آن است. به کمک نمایشگر می توان داده های مختلف نظیر دما، رطوبت و هر آنچه که در خروجی یک پردازش تولید می گردد، به کاربر بر روی نمایشگر نمایش داده شود. برای اتصال نمایشگر به بردهای آردوینو و ARM، نمایشگر های مختلفی وجود دارند. نمایشگرهای کاراکتری، سن سگمنتی، TFT، OLED و …از مهم ترین و پرکاربردترین نمایشگر ها به شمار می روند. در این پروژه ما نیز از نمایشگر کاراکتری ۲×۱۶ جهت نمایش داده های ارسالی از سوی میکروکنترلر STM32 استفاده می نماییم.

Ch LCD

 


پروتکل سریال UART


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

 UART communication between 2 MCU

 

یکی از پروتکل های ارتباطی پرکاربرد، پروتکل UART است. این پروتکل دارای ۲ پایه RX , TX جهت ارسال و دریافت داده بوه و می تواند با سرعت های مختلفی، اقدام به ارسال و دریافت داده نماید. این پروتکل در اکثر میکروکنترلرها اعم از آردوینو و STM32 پشتیبانی می شود. در این پروژه ما نیز جهت برقرای ارتباط بین آردوینو و STM32، از پروتکل سریال UART استفاده می کنیم. روال کلی کار به این صورت خواهد بود که ابتدا دمای محیط به کمک سنسور LM35 توسط مبدل آنالوگ به دیجیتال میکروکنترلر STM32 خوانده می شود. سپس دمای اندازه گیری شده از طریق پروتکل سریال UART به آردوینو ارسال می شود. در اینجا آردوینو با دریافت داده ها از طریق سریال  سخت افزاری، آن را بر روی نمایشگر کاراکتری نمایش خواهد داد.

 


شماتیک و اتصالات


برای اتصال نمایشگر کاراکتری به برد آردوینو، علاوه بر تصویر، می توانید به صورت زیر عمل کنید.

  • اتصال پایه RS نمایشگر به پایه GPIO8 آردوینو
  • اتصال پایه EN نمایشگر به پایه GPIO9 آردوینو
  • اتصال پایه D4 نمایشگر به پایه GPIO10 آردوینو
  • اتصال پایه D5 نمایشگر به پایه GPIO11 آردوینو
  • اتصال پایه D6 نمایشگر به پایه GPIO12 آردوینو
  • اتصال پایه D7 نمایشگر به پایه GPIO13 آردوینو
  • اتصال پایه GND نمایشگر به پایه GND آردوینو
  • اتصال پایه VCC نمایشگر به پایه ۵ ولت آردوینو
  • اتصال پایه VO نمایشگر به پایه GND آردوینو
  • اتصال پایه R/W نمایشگر به پایه GND آردوینو

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

  • اتصال پایه ۵V برد BluePill به پایه ۵ ولت آردوینو
  • اتصال پایه GND برد BluePill به پایه GND آردوینو
  • اتصال پایه A9 برد BluePill به پایه ۵ ولت آردوینو
  • اتصال پایه A10 برد BluePill به پایه ۵ ولت آردوینو
  • اتصال پایه سمت چپی سنسور LM35 به پایه ۵V برد BluePill
  • اتصال پایه وسط سنسور LM35 به پایه A0 برد BluePill
  • اتصال پایه سمت راستی سنسور LM35 به پایه GND برد BluePill

شماتیک ارتباط آردوینو و STM32 - دیجی اسپارک

 


پیکربندی میکروکنترلر STM32


پس از ساخت پروژه جدید در نرم افزار STM32CubeMX مطابق بخش اول آموزش میکروکنترلر های STM32 بخش های RCC و SYS را تنظیم کنید. سپس از نوار سمت راست نرم افزار یکی از ADC های میکروکنترلر را انتخاب کنید و سپس کانال ADC مورد نظر خود را انتخاب کنید. اگر با بخش ADC میکروکنترلر های STM32 آنشایی کافی را ندارد. آموزش بررسی ADC میکروکنترلر STM32 را مطالعه کنید. سپس در بخش Parameter Setting ابتدا بایستی مد کاری ADC را انتخاب کنید. در قدم بعدی بایستی برای این که ADC به طور پیوسته کار کند، گزینه Continuous Conversion Mode را فعال کنید. پس از آن در بخش ADC_Regular_ConversionMode گزینه Number of Conversion را ۱ قرار دهید. زیرا قصد خواندن مقدار آنالوگ از یک ورودی را داریم. سپس بخش Rank گزینه Sampling Time را بر روی ۱٫۵ Cycles تنظیم کنید.

Parameter Setting

 

سپس بایستی از همان نوار سمت راست وارد بخش USART1 شوید. سپس  گزینه Mode را بر روی Asynchronous سپس در قسمت Parameter Setting می‌توانید تنظیماتی از جمله تنظیم Baud Rate ، Parity و … را انجام دهید. در این آموزش تنها بخش Baud Rate را بر روی مقدار ۹۶۰۰ تنظیم می‌کنیم. پس از آن همانند تصویر زیر مشاهده می‌کنید که پایه‌ PA10 بعنوان RX و پایه PA9 بعنوان TX تعریف شده است.

STM32 Pinout

 

سپس بایستی وارد بخش Clock Configuration شده و کلاک میکروکنترلر را بر روی ۷۲ مگاهرتز تنظیم کنید. در آخر در قسمت Project Manager ابتدا نام پروژه و مسیر مورد نظر برای ذخیره پروژه را مشخص کنید. سپس گزینه Toolchain را بروی MDK-ARM و ورژن آن را بر روی ۵ تنظیم کرده و بر روی گزینه GENERATE CODE در قسمت نوار بالایی کلیک کنید تا پروژه ساخته شود.

 


کدنویسی میکروکنترلر STM32


پس از ورود به نرم افزار KEIL بایستی ابتدا وارد فایل main.c شوید. بایستی ابتدا ۲ متغیر برای اندازه گیری مقدار خروجی ADC میکروکنترلر STM32 و مقدار دما محاسبه شده تعریف کنید.

uint16_t ADC_Value;
float temp;

 

سپس برای شروع به کار ADC میکروکنترلر STM32 بایستی از دستور زیر استفاده کنید.

	
HAL_ADC_Start(&hadc1);

تا به اینجا تنظیمات مورد نیاز برای خواندن از ADC را انجام شده است. حالا می‌توانید مقدار آنالوگ موجود بر روی پایه PA0 را محاسبه کنید. برای این کار بایستی از دستور زیر استفاده کنید.

ADC_Value = HAL_ADC_GetValue(&hadc1);

 

همانطور که مشاهده می‌کنید. مقدار آنالوگ اندازه گیری شده بر روی پایه ADC میکروکنترلر STM32 در متغیر ADC_Value ذخیره شده است. این مقدار عددی بین ۰ تا ۴۰۹۶ است ( عدد ۴۰۹۶ بر اساس ۱۲ بیتی بودن ADC میکروکنترلر STM32 است). برای به دست آوردن دما اندازه گیری شده توسط سنسور LM35 که بر اساس ولتاژ بر روی پایه A0 میکروکنترلر قرار میگیرد را از فرمول زیر بدست می‌آوریم.

 

حال مقدار دمای اندازه گیری شده توسط سنسور LM35 در متغیر temp ذخیر شده است. برای مشاهده ولتاژ بایستی عدد ذخیره شده در متغیر temp را با استفاده از پروتکل USART به سمت برد آردیونو ارسال کنیم. برای این کار بایستی از دستور زیر استفاده کنیم.

HAL_UART_Transmit(&huart1,&temp,1,100);

 

دز ادامه کد کامل این پروژه برای شما قرار داده شده است. میتوانید قسمت های مختلف کد را کپی نموده و در پرژه خود قرار دهید. توجه فرمایید که کد زیر فقط بخش هایی است که ما بایستی به پروژه ساخته شده توسط نرم افزار STM32CubeMX اضافه کنیم. بنابر این در قرار دادن کد زیر در بخش های مشخص شده توسط نرم افزار دقت فرمایید.

uint16_t ADC_Value;
float temp;

int main(void)
{
  while (1)
  {
	HAL_ADC_Start(&hadc1);
    HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
	
    ADC_Value = HAL_ADC_GetValue(&hadc1);
    temp = (float)(ADC_Value * 3.3 * 100) / (4095);

	HAL_UART_Transmit(&huart1,(uint8_t*)&temp,1,100);
	HAL_Delay(1000);
  }
}

سپس بایستی برنامه را کامپایل کرده و بر روی برد Bluepill پروگرام کنید. در صورتی که با نحوه پروگرام کردن میکروکنترلر های Stm32 آشنا نیستید. لطفا بخش اول آموزش های میکروکنترلر Stm32 را مطالعه نمایید. پس از دانلود کد بر روی برد BluePill بایستی یک بار کلید reset را بر روی برد فشار دهید. در صورت که اتصالات را به طور صحیح متصل کرده باشید. مقدار دما از سنسور LM35 دریافت شده و از طریق پروتکل USART به سمت برد آردوینو ارسال می شود. در ادامه به کد نویسی برد آردوینو می پردازیم.

 


کدنویسی برد آردوینو


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

#include <SoftwareSerial.h> // اضافه کردن کتابخانه پورت سریال مجازی

SoftwareSerial mySerial(2, 3); // RX, TX انتخاب پایه های پورت سریال مجازی

#include <LiquidCrystal.h>  //اضافه کردن کتابخانه نمایشگر
const int rs = 8, en = 9, d4 = 10, d5 = 11, d6 = 12, d7 = 13;   //تعریف پایه های نمایشگر جهت اتصال به اردوینو
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);   //راه اندازی کتابخانه نمایشگر

void setup() {
  lcd.begin(16, 2);  //تعریف نمایشگر به صورت ۱۶x2
  lcd.print("DIGISPARK.IR");
  delay(2000);
  mySerial.begin(9600);
  mySerial.setTimeout(50);   //تعریف مدت زمان مجاز جهت خواندن داده از بافر سریال
  /*
   * مقدار تابع فوق به صورت پیشفرض ۱ ثانیه است. از آنجاییکه STM32 داده ها را هر یک ثانیه یکبار ارسال می کند، لذا  جهت جلوگیری از
   * تداخل زمانی، ما این زمن را به ۵ میلی ثانیه کاهش می دهیم تا سریعتر داده های ارسالی از سوی STM32 را بخوانیم.
   */
}

void loop() {
  String data = "";
  if (mySerial.available() > 0) {   //در صورتیکه داده ای روی بافر سریال وجود داشت آن را دریافت کرده و نمایش می دهیم.
    data = mySerial.readString();
    lcd.clear();
    lcd.print("DIGISPARK.IR");
    lcd.setCursor(0, 1);
    lcd.print("TEMP:");
    lcd.print(data);
  }
}

 

در بخش آردوینو، داده ها از طریق رابط سریال از میکروکنترلر STM32 دریافت می گردند. پس از دریافت این داده ها بر روی نمایشگر نمایش داده خواهند شد. درون کدهای برنامه به صورت خط به خط، روال برنامه توضیح(کامنت) داده شده است. در این جا به صورت مختصر، به روال کلی کار می پردازیم. در قسمت setup آردوینو، ابتدا تابع زیر را با مقدار ورودی ۵۰ میلی ثانیه تنظیم می کنیم.

mySerial.setTimeout(50);

این تابع، یک تابع بسیار کاربردی در ارتباط سریال آردوینو است. به کمک این تابع شما می توانید زمان انتظار برای خواندن داده از بافر سریال را تعیین کنید. پیشفرض این تابع ۱۰۰۰ میلی ثانیه است. اما به کمک مقدار تعیین شده، تابع زیر به مدت ۵۰ میلی ثانیه صبر کرده تا داده جدید دریافت کند. با سپری شدن این زمان، اجرای این تابع متوقف می شود.

mySerial.readString();

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

if (mySerial.available() > 0)

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

lcd.print

 


جمع بندی


در برخی پروژه ها ممکن است به علت فاصله نمایشگر از برد اصلی، تعداد محدود پایه های پردازنده موجود در برد اصلی و یا دلایل دیگری مجبور شویم که نمایشگر و یا ماژول های دیگری را توسط یک میکروکنترلر دیگر پردازش این قسمت هارا انجام دهیم. همانطور که میدانید، میکروکنترلر ها بایستی با یک دیگر در ارتباط باشند و اطلاعات را برای یک دیگر ارسال کنند. ارتباط UART یکی از بهترین گزینه ها برای برقرار ارتباط بین میکروکنترلر های مختلف هستند. در این آموزش با استفاده از ارتباط UART دما را توسط سنسور LM35 خوانده و در میکروکنترلر STM32 پردازش های مورد نیاز را انجام داده و با استفاده از ارتباط UART به سمت برد آردوینو Uno ارسال نموده و سپس بر روی نمایشگر LCD کاراکتری نمایش دادیم.

 


لوازم مورد نیاز


 

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

 

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

 

درباره نویسنده

علی زاهدی

برنامه نویس و طراح سیستم های مبتنی بر میکروکنترلر

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

درباره نویسنده

معین صابری

کارشناسی ارشد رشته معماری سیستم های کامپیوتری

مالي که ز تو کس نستاند، علم است
حرزي که تو را به حق رساند، علم است
جز علم طلب مکن تو اندر عالم
چيزي که تو را ز غم رهاند، علم است
(شیخ بهایی)

تبادل نظر و رفع عیب با ثبت دیدگاه