به نام خدا
سلام خدمت همه دوستان عزیز و هموطنان گرامی!
بعد از چندی وقت اومدم یه خورده راجع به اتصال ماژول وایفای به میکرو مطلب بزارم! امیدوارم خوشتون بیاد و به دردتون بخوره!
خوب من هیچ توضیحی راجع به اینکه این ماژول چیه و پایه هاش چی هستن نمیگم! فقط سایت زیر رو معرفی میکنم که همه چیز رو اونجا به طور کامل شرح داده!
سایت بالا رو به طور کامل مطالعه بفرمایید!
حالا میریم سراغ برنامه نویسی!
راستش برای این میکروکنترلر ، من فقط برد eca رو دارم! ولی اصلا فرقی نمیکنه که شما از چه بردی استفاده کنید!
این ماژول با ارتباط UART به میکرو متصل میشه! و من هم برای این کار UART0 میکرو رو انتخاب کردم که به پایه های زیر وصل میشه!
P0.2 = TX
P0.3 = RX
خوب TX یعنی فرستنده و RX یعنی گیرنده. بزارید من یه نکته ریز بگم! دقت کنید که تو اتصال UART شما باید سیم ها رو ضربدری به هم متصل کنید! یعنی TX یکیشون رو به RX دیگری وصل کنید و بلعکس! (خیلی ریز بود: نه؟.... راستش همین موضوع دو ساعت وقت منو گرفت
)
بنابراین در برنامه ای که من نوشتم شما باید پایه P0.2 میکرو رو به RX ماژول وصل کنید و پایه P0.3 میکرو رو به TX ماژول متصل کنید!
راستش طرز کار برنامه زیر اینه که UATR0 به ماژول وصل شده و UART2 به کامپیوتر، تا ببینیم آیا درست دریافت میکنه یا نه. البته شما میتونید برنامه رو تغییر بدید. من این برنامه رو خیلی ساده و برای درک چگونه دریافت و ارسال دیتا درست کردم!
راستش خیلی باهاش ور رفتم تا بتونم یک جمله رو دریافت کنم، یعنی اینکه من برم و کاراکتر به کاراکتر از ماژول بگیرم و به کامپیوتر (UART2) بفرستم اصلا کاری نداشت! ولی اینکه برای اینکه میخوایم با میکرو کار بکنیم! و باید بدونیم الان چه چیزی توسط ماژول برای ما ارسال شد و پردازش لازم رو انجام بدیم. نیاز داریم به جای کاراکتر یک استرینگ دریافت کنیم که من بعد از چند روز تلاش یه برنامه اینجوری که در زیر میبینید رو نوشتم! برنامه بدی نیست! هر وقت ماژول یه کاراکتر دریافت میکنه، این برنامه اونو وارد یه استرینگ میکنه و اگه به کاراکتر اینتر (0X0A , 0X0D) برسه، جمله رو تموم میکنه
متن خالصی که به دست شما میرسه، یک استرینگ بدون اینتر هست! تا بتونید پردازشی که میخواید رو روش انجام بدید!
فقط یه نکته بگم : ببینید منظورم از پردازش اینه که مثلا الان ماژول چه پیامی داد؟ آیا کسی به وای فای وصل شد؟ یا کسی متنی فرستاد؟ اگه کسی متنی فرستاد فلان متن رو بهش بفرست! .... خوب معلومه برای اینکار نیاز داریم که ببینیم متنی که ماژول بهمون داده در مورد چیه؟ اگه کسی پیام داده، پیام خالص اش چیه؟
آخه اگه کسی مثلا کلمه ali رو به ماژول بفرسته ماژول اونو اینطوری برای ما میفرسته
+IPD,0,3:ali
حالا ما باید بیایم و اونو پردازش کنیم و متن اصلی یعنی ali رو بیرون بکشیم!
در این جا من یه چیزی بگم و کد رو خدمتتون عرضه کنم!
برای کار بالا (یعنی پردازش متن) من تابع strtok رو بهتون پیشنهاد میکنم! (برای اطلاعات بیشتر کلیک کنید)
خوب اینم کد: (فقط توجه کنید به C++ نوشتم! و برای همینم از extern "C" استفاده کردم --اطلاعات بیشتر کلیک کنید)
#include <lpc17XX.h>
int CounterWiFi=0;
#ifdef __cplusplus
extern "C" {
#endif
void UART0_IRQHandler (void);
#ifdef __cplusplus
}
#endif
void delay () // تابع زمان
{
int a= 7000000;
while (a--);
}
unsigned char getchar0 (void) // دریافت کاراکتر از یوآرت0
{
while (!(LPC_UART0->LSR & 0X1));
return LPC_UART0->RBR;
}
unsigned char getchar2 (void) // دریافت کاراکتر از یوآرت2
{
while (!(LPC_UART2->LSR & 0X1));
return LPC_UART2->RBR;
}
void sendchar0 (unsigned char ch) // ارسال کارکتر به یوآرت 0
{
while (!(LPC_UART0->LSR & 1<<5));
LPC_UART0->THR=ch;
LPC_UART0->TER=0X80;
}
void sendchar2 (unsigned char ch) // ارسال کارکتر به یوآرت 2
{
while (!(LPC_UART2->LSR & 1<<5));
LPC_UART2->THR=ch;
LPC_UART2->TER=0X80;
}
void sendstring0 (char *str) // ارسال رشته به یوآرت 0
{
for (int i=0;str[i]!='\0';i++)
sendchar0(str[i]);
}
void sendstring2 (char *str) // ارسال رشته به یوآرت 2
{
for (int i=0;str[i]!='\0';i++)
sendchar2 (str[i]);
}
#ifdef __cplusplus
extern "C" {
#endif
void UART2_IRQHandler (void) // تابع مروبط به وقÙÙ‡ UART0
{
sendchar0(getchar2());
}
#ifdef __cplusplus
}
#endif
char RECstr[2000]; // Recive String
int main (){
LPC_GPIO2->FIODIR=0XFF; // FOR LED
// init UART0
NVIC_EnableIRQ(UART0_IRQn);
LPC_SC->PCLKSEL0|=0X0; //SET CLOCK OF UART0 CPUCLK/4=24MHZ
LPC_UART0->LCR=0X83; //SET 8bit data & enable dlab
LPC_UART0->DLL=13; // SET BAUD RATE = 115200
LPC_UART0->DLM=0;
LPC_UART0->LCR=0X3; // DESABLE DLAB
LPC_UART0->FCR=0X7; // SET FIFO AND CLAER
LPC_PINCON->PINSEL0=0X50;// SET PIN FOR UART0
LPC_UART0->IER=0X01;
// init UART2
NVIC_EnableIRQ(UART2_IRQn);
LPC_SC->PCLKSEL0|=0X0; //SET CLOCK OF UART0 CPUCLK/4=24MHZ
LPC_PINCON->PINSEL0 |= (1 << 20); // Pin P0.10 used as TXD2 (Com2)
LPC_PINCON->PINSEL0 |= (1 << 22); // Pin P0.11 used as RXD2 (Com2)
LPC_SC->PCONP = LPC_SC->PCONP|(1<<24); //Open UART2 power control bit
LPC_UART2->LCR=0X83; //SET 8bit data & enable dlab
LPC_UART2->DLL=13; // SET BAUD RATE = 115200
LPC_UART2->DLM=0;
LPC_UART2->LCR=0X3; // DESABLE DLAB
LPC_UART2->FCR=0X7; // SET FIFO AND CLAER
LPC_UART2->IER=0X01;
// init ESP8266 ESP-01
sprintf (str,"AT+CWMODE=3%c%c",0x0d,0x0a);
sendstring0(str);
delay();
sprintf (str,"AT+CIPMUX=1%c%c",0x0d,0x0a);
sendstring0(str);
delay();
sprintf (str,"AT+CIPSERVER=1,8888%c%c",0x0d,0x0a);
sendstring0(str);
delay();
CounterWiFi=0;
while (1){
LPC_GPIO2->FIOPIN=0XFF;
delay();
LPC_GPIO2->FIOPIN=0X00;
delay();
sendstring2(RECstr);
}
}
#ifdef __cplusplus
extern "C" {
#endif
void UART0_IRQHandler (void) // تابع وقفه یوآرت 0 برای دریافت کاراکتر از ماژول
{
if ((RECstr[CounterWiFi]=getchar0())!=0x0a && RECstr[CounterWiFi]!=0x0d)
RECstr[++CounterWiFi]='\0';
else{
if(RECstr[CounterWiFi]==0x0d){
RECstr[CounterWiFi]='\0';
CounterWiFi++;
}
else
CounterWiFi=0;
}
}
#ifdef __cplusplus
}
#endif
امیدوارم مفید بوده باشه!
اگه سوالی داشتید در خدمتم!
فعلا
یا علی مدد...!
peyman میگه:
سلام داداش علی دستت درد نکنه خیلی عالی بود. من میخوام با این ماژول ارسال و دریافت صدا داشته باشم. اصلنم نمیدونم از کجا شروع کنم لطفا راهنمایی کنید
علی فلاح به این سوال پاسخ داده که:
سلام پیمان جان!
راستش اونطور که من فهمیدم این ماژول خیلی برای اینکارا ضعیف به نظر میرسه! چون من همین الانم که اینو بستم به ماشین برای کنترل به عنوان ریموت کنترل اصلا خوب کار نمیکنه چون وقتی یه فرمان بهش ارسال میکنم کمی دیر عکس العمل نشون میده و یعنی سرعتش یه جورایی کمه (البته اگه یه رشته بهش ارسال کنیم،خوب همون طور که مشخصه همه ی رشته رو دریافت میکنه) بازهم اگه میخوای اینکار رو انجام بدی میتونی اینکار رو بکنی!
ولی اول باید به دو نکته توجه کنی!
1) میکرو کنترلر یا برد آموزشی ات چیه؟ از LPC1768 برد آموزشی ECA استفاده میکنی؟
2) آیا میخوای موزیک رو هم پخش کنی؟ یا مثلا فقط موزیک رو دریافت کنی و اونو توی حافظه (مثلا فلش یا sd card) ذخیره کنی!
برای ارسال موزیک از گوشی باید یه برنامه پیدا کنی که صوت رو به رشته ای تبدیل کنه و با وایفای بفرسته! (یعنی بایت ها رو پشت سر هم بفرسته) کار سختی نیست! داداش خودم برنامه اندروید مینویسه (توی همین سایت هم آموزش گذاشته) اگه خواستی میتونم بگم بهش برنامه اش رو هم بنویسه. ولی خوب میتونی توی سطح اینترنت هم پیدا کنی!
بعد اونو همنطور که دریافت کردی توی فایل txt ذخیره کنی و فرمتش رو به فرمت موزیک تغییر بدی! الان یه فایل صوتی از گوشی به کارت sd توسط میکرو و با وایفای ارسال شد
ولی برای پخشش کمی باید سختی تحمل کنی :)
برای پخش اگه یه فایل صوتی با فرمت wav رو بفرستی میتونی با DAC میکرو پخشش کنی (خودم اینکار رو کردم و برنامه اش رو هم هنوز دارم اگه از برد آموزشی LPC178 شرکت ECA استفاده میکنی میتونم بهت بدم) و اگه بخوای mp3 پخش کنی دو حالت داره! یکی اینکه توی برنامه اندروید قبل از ارسال به wav تبدیل کنیم و اونو بفرستیم و پخش کنیم. حالت دوم اینکه فایل mp3 رو بفرستیم و با آیسی های مربوطه اونو دیکد کنیم و پخش کنیم!
اینا راه حل های ارسال و دریافت صوت (داده) بود.
توضیح بیشتری خواستی باز هم در خدمتم...
یا علی مدد...!