در این جلسه برخی از توابع پایه مرتبط با ارتباط سریال، که پیوسته در IDE آردوینو استفاده میشوند را با هم ملاحظه میکنیم.
USART
- تابع (Serial.begin(baud_rate
- Baud_rate: باودریتی که برای ارتباط سریال استفاده میشود. میتواند ۴۸۰۰، ۹۶۰۰، ۱۴۴۰۰، ۱۹۲۰۰ و … باشد.
- این تابع برای تعریف باودریت مورد استفاده در ارتباط سریال به کار میرود.
- مثال (begin(9600 باودریت ۹۶۰۰ را برای ارتباط تعریف میکند.
- تابع ()Serial.available
- این تابع برای به دست آوردن تعداد بایتهای موجود برای خواندن در پورت سریال استفاده میشود. این تابع تعداد بایتهای دادهای که وارد شده و در بافر دریافت سریال ذخیره شده است را برمیگرداند
- مثال (()if(Serial.available اگر دادهای در پورت سریال موجود باشد، عملیات انجام میشود.
- تابع (Serial.print(value
- Value: کارکتر، رشته یا عددی که قرار است چاپ شود.
- این تابع برای چاپ داده در پورت سریال در قالبی قابل فهم برای انسان (کارکتر، رشته، اعداد) به کار میرود.
- مثال (”print(“Hi 1234 عبارت Hi 1234 را روی سریال مانیتور چاپ میکند.
- تابع (Serial.println(value
- Value: کارکتر،رشته یا عددی که قرار است چاپ شود.
- این تابع برای چاپ داده در پورت سریال در قالبی قابل فهم برای انسان (کارکتر، رشته، اعداد) همراه با یک کارکتر (carriage return(\r و کارکتر خط جدید (n\) به کار میرود.
- تابع ()Serial.read
- این تابع کارکتری که روی پین RX آردوینو رسیده است را برمیگرداند.
- مثال char read_byte
()read_byte = Serial.read
بایت داده خوانده شده را در read_byte ذخیره میکند.
- تابع (Serial.write(value), Serial.write(string), Serial.write(buff, length
- Value: مقداری ارسالی به عنوان یک تک بایت.
- String: رشته ارسالی به عنوان یک مجموعه بایت.
- Buff: آرایه داده بایتی.
- Length: تعداد بایتهای ارسالی.
- این تابع داده را در قالب باینری در پورت سریال مینویسد. داده در قالب بایت یا مجموعه بایت ارسال میشود.
چاپ داده دریافتی از ارتباط سریال روی سریال مانیتور آردوینو
/* Print data received through serial communication on to the serial monitor of Arduino */ /* Setup is run once at the start (Power-On or Reset) of sketch */ void setup() { Serial.begin(9600); /* opens serial port, sets data rate to 9600 bps */ } /* Loop runs over and over after the startup function */ void loop() { char data = 0; if(Serial.available()>0) /* If data available at serial port, enter if loop */ { data = Serial.read(); /* Read data present at serial port */ Serial.println("Data Received is : "); /* Print string with \r\n */ Serial.write(data); /* Print data received */ } }
SPI
- تابع (SPISettings(speedMax, dataOrder, dataMode
- Speedmax: بیشینه سرعت ارتباط
- MSBFIRST :dataOrder یا LSBFIRST
- SPI_MODE2 ،SPI_MODE1 ،SPI_MODE0 :dataMode یا SPI_MODE3
- این تابع برای پیکربندی پورت SPI دستگاه به کار میرود.
- مثال (SPISettings(10000000, MSBFIRST, SPI_MODE0
پورت SPI را با بیشینه سرعت 10MHZ در مد mode0 با فرمت MSB first پیکربندی میکند.
- تابع (SPI.beginTransaction(settings
- setting: تنظیمات برای ارتباط SPI میباشد. یک شی از کلاس SPISetting تعریف کرده و از آن به عنوان پارامتر استفاده میشود.
- گذرگاه SPI را با SPISettings تعریف شده مقداردهی اولیه میکند.
- مثال (beginTransaction(SPISettings(10000000, MSBFIRST, SPI_MODE0
یا
(SPISettings newSettings(10000000, MSBFIRST, SPI_MODE0
(SPI.beginTransaction(newSettings
- تابع ()SPI.endTransaction
- این تابع برای توقف بکارگیری گذرگاه SPI استفاده میشود.
- تابع ()SPI.begin
- این تابع گذرگاه SPI را با تنظیمات SCK ،MOSI و SS به خروجی آغاز میکند، SCK و MOSI را به low و SS را به high میبرد.
- تابع ()SPI.end
- این تابع گذرگاه SPI را بدون تغییر مدهای پین غیرفعال میکند.
- تابع (SPI.transfer(value
- Value: بایتی که قرار است روی گذرگاه ارسال شود.
- انتقال SPI مبتنی بر ارسال و دریافت همزمان میباشد.
- از آنجایی که ارسال و دریافت همزمان است، هر زمان که یک بایت داده ارسال کنیم، یک بایت داده نیز دریافت میکنیم.
- مثال char received_val
(’received_val = SPI.transfer(‘A
پیکربندی تنظیماتSPI برای آردوینو به عنوان ارباب و انتقال داده به برده
/* Configure device as SPI master and send character H to the slave device at an interval of 1 second */ /* Pin 4 of Arduino is used as chip select pin for the slave device */ #include <SPI.h> const int slavePin = 4; /* Pin used as chip select pin for the Slave device */ /* Setup is run once at the start (Power-On or Reset) of sketch */ void setup() { pinMode(slavePin, OUTPUT); /* Configure slavePin as an output pin */ SPI.begin(); /* Initialize SPI */ } /* Loop runs over and over after the startup function */ void loop() { SPI.beginTransaction(SPISettings (4000000, MSBFIRST, SPI_MODE0)); /* Configure SPI port for 4MHz maximum speed in SPI mode0 with MSB first data format */ digitalWrite(slavePin, LOW); /* Chip Select pin low to initialize communication with slave */ SPI.transfer('H'); /* Transfer data */ digitalWrite(slavePin, HIGH); /* Chip Select pin high to end communication with slave */ SPI.endTransaction(); delay(1000); }
نکته: تنظیمات SPI مبتنی بر دستگاه برده انجام میشود. بردهای که استفاده میکنیم برای MSBFIRST ،4MHz و SPIMODE0 پیکربندی شده است.
پیکربندی تنظیمات SPI آردوینو به عنوان برده و انتقال داده به برده
/* Configure device as SPI slave which receives data from SPI master and prints it on serial monitor */ /* Setup is run once at the start (Power-On or Reset) of sketch */ void setup() { SPI_Init(); /* Configure device as SPI slave */ Serial.begin(9600); /* opens serial port, sets data rate to 9600 bps */ } /* Loop runs over and over after the startup function */ void loop() { char data; data = SPI_Receive(); Serial.print("Received : "); Serial.println(data); } void SPI_Init() /* SPI Initialize function */ { DDRB &= ~((1<<MOSI)|(1<<SCK)|(1<<SS)); /* Make MOSI, SCK, SS pin direction as input pins */ DDRB |= (1<<MISO); /* Make MISO pin as output pin */ SPCR = (1<<SPE); /* Enable SPI in slave mode */ } char SPI_Transmit(char data) /* SPI transmit data function */ { SPDR = data; /* Write data to SPI data register */ while(!(SPSR & (1<<SPIF))); /* Wait till transmission complete */ return(SPDR); /* return received data */ } char SPI_Receive() /* SPI Receive data function */ { while(!(SPSR & (1<<SPIF))); /* Wait till reception complete */ return(SPDR); /* return received data */ }
نکته: کتابخانهی SPI آردوینو تنها برای ارباب میباشد. در این کتابخانه برای SPI برده چیزی مهیا نشده است. بنابراین در اینجا ما از تابع خودمان برای تنظیمات و ارتباط SPI برده استفاده کردهایم.
آردوینو UNO از ATmega328P استفاده میکند. برای مشاهده جزئیات درباره پیکربندی SPI برده به دیتاشیت ATmega328P رجوع کنید.
I2C
- تابع (Wire.begin(address
- Address: آدرس ۷ بیتی برده برای دستگاه میباشد. اگر مشخص نشود، دستگاه گذرگاه را به عنوان ارباب متصل میکند.
- این تابع برای آغاز کتابخانه wire و اتصال گذرگاه به عنوان ارباب یا برده به کار میرود.
- تابع (Wire.beginTransmission(address
- Address: آدرس ۷ بیتی دستگاهی که میخواهیم به آن داده ارسال کنیم.
- این تابع برای آغاز فرآیند ارتباط به دستگاه I2C برده با آدرس داده شده به کار میرود. بعد از این تابع، با استفاده از تابع ()write بایتها صفبندی شده و سپس با فراخوانی تابع ()Wire.endTransmission ارسال میگردند.
- مثال (beginTransmission(0x23
ارتباط با دستگاه I2C با آدرس 0x23 را آغاز میکند.
- تابع (Wire.endTransmission(stop
- Stop: نوع داده بولی است. True یک پیام توقف بعد از درخواست ارسال میکند، بنابراین گذرگاه آزاد میشود. False یک restart را به صورت بیوقفه بعد از درخواست ارسال میکند، بنابراین اتصال فعال نگه داشته میشود.
- این تابع فرآیند انتقالی که با تابع ()beginTransmission شروع شده بود را پایان داده و دادههایی که با تابع ()Wire.write صفبندی شده بود را ارسال میکند.
- تابع (Wire.write(value), Wire.write(string), Wire.write(data, length
- Value: مقداری ارسالی به عنوان یک تک بایت
- String: رشتهی ارسالی به عنوان یک مجموعه بایت
- data: آرایه داده بایتی
- Length: تعداد بایتهای ارسالی
- این تابع داده را در پاسخ به درخواست ارباب، از طرف برده مینویسد و یا بایتهای داده را از ارباب به برده بین فراخوانی توابع ()beginTransmission و ()Wire.endTransmission صفبندی میکند.
- تابع ()Wire.available
- این تابع تعداد بایتهای موجود برای خواندن توسط تابع ()read را برمیگرداند.
- تابع ()Wire.read
- این تابع بایتی که پس از تابع ()requestFrom، از برده به ارباب ارسال شده است را میخواند، و یا بایتی که از ارباب به برده ارسال شده است را میخواند.
- تابع (Wire.requestFrom(address, quantity, stop
- Address: آدرس ۷ بیتی دستگاهی که میخواهیم از آن بایت داده درخواست کنیم.
- Quantity: تعداد بایتهای مورد درخواست
- Stop: نوع داده بولی است. True یک پیام توقف بعد از درخواست ارسال میکند، بنابراین گذرگاه آزاد میشود. False بدون وقفه یک restart بعد از درخواست ارسال میکند، بنابراین اتصال فعال نگه داشته میشود.
- این تابع را ارباب برای درخواست داده بایتی از برده به کار میبندد.
درخواست داده از دستگاه برده با آدرس ۴۵ از طریق ارتباط I2C، و چاپ داده دریافت شده روی مانیتور سریال آردوینو و سپس ارسال داده به یک دستگاه برده دیگر با آدرس ۷۰
/* Request data using I2C communication from slave device with address 45, print the received data and then send data to another slave with address 70 */ #include <Wire.h> /* Setup is run once at the start (Power-On or Reset) of sketch */ void setup() { Wire.begin(); /* Join I2C bus as master */ Serial.begin(9600); /* opens serial port, sets data rate to 9600 bps */ } /* Loop runs over and over after the startup function */ void loop() { char rx_data; Wire.requestFrom(45, 8); /* Request 8 bytes of data from slave with address 45 */ while(Wire.available()) /* While data is available from the slave, enter while loop */ { rx_data = Wire.read(); /* Read byte of data */ Serial.println(rx_data); /* Print the received data on serial terminal */ } delay(500); /* Wait for 500 milliseconds */ Wire.beginTransmission(70); /* Begin transmission to device with address 70 */ Wire.write(0x30); /* Data to be transmitted */ Wire.write(0x50); Wire.endTransmission(); /* End transmission */ }
مقاله پروتکل I2C در آردوینو میتونه براتون مفید واقع بشه.
منبع: ترجمه از سایت electronicwings.com
امیدوارم آموزش «توابع پایه مرتبط با ارتباط سریال در آردوینو» براتون مفید واقع شده باشه. همچنین شدیدا توصیه میکنم دیگر آموزشهای آردوینو و پروژههای آردوینو را هم ببینید.
اگر این نوشته برایتان مفید بود لطفا کامنت بنویسید.