مقدمه
آنچه در این آموزش یاد می گیرید
- • اطلاعات کلی راجع به پروتکل بلوتوث
- • چگونگی ارسال داده از طریق بلوتوث
- • چگونگی ارسال AT-Command به HC05
معرفی ارتباط و پروتکل بلوتوث
روش های مختلفی برای برقراری ارتباط بیسیم وجود دارد مانند ارتباط از طریق پروتکل های Wi-Fi، ZigBee، NRF و بلوتوث.
ارتباط بلوتوث یک ارتباط ارزان قیمت در شبکه PAN با نرخ ارسال اطلاعات حداکثر 1Mb/s، با برد نامی تا 100 متر در فرکانس 2.4 گیگ یک روش مناسب و رایج در برقراری ارتباط بیسیم است.
ماژول HC05 یک ماژول بلوتوث با ارتباط سریال است که بصورت معمول در پروژه های الکترونیکی استفاده می شود.
مهمترین مشخصات ماژول HC05 عبارتند از:
- ولتاژ کاری 3.6 تا 5 ولت
- دارای آنتن داخلی
- دارای قابلیت اتصال خودکار به آخرین دستگاه
جهت دریافت دیتاشیت ماژول بلوتوث به سریال HC05 اینجا کلیک کنید.
HC05 Datasheet
معرفی پایه ها (Pinout) ماژول بلوتوث HC05
ماژول بلوتوث HC05 دارای 6 پایه به شرح زیر است:
- VIN: تغذیه ماژول – 6-3.6 ولت
- GND: زمین
- STATE: تعیین وضعیت اتصال
- EN: تنظیم جهت ورود به تنظیمات AT Command
- RX: دریافت اطلاعات از طریق پروتکل سریال
- TX: ارسال اطلاعات از طریق پروتکل سریال
لوازمی که به آن احتیاج دارید
قطعات مورد نیاز
نرم افزارهای مورد نیاز
ارسال داده به آردوینو از طریق بلوتوث
ولتاژ تغذیه این ماژول 5 ولت است ولی سطح منطقی پایه های ارتباط سریال آن 3.3 ولت می باشد اما به دلیل وجود رگولاتور در برد ماژول HC05، میتوانید پایه های آن را مستقیما به آردوینو متصل کنید.
راهاندازی ابتدایی ماژول بلوتوث HC05 با آردوینو
گام اول: سیم بندی
مطابق مدار زیر، ماژول را به آردوینو وصل کنید.
گام دوم: نصب کتابخانه
کتابخانه زیر را بر آردوینوی خود نصب کنید.
گام سوم: کد
/*
Modified on March 09, 2021
Modified by MohammedDamirchi from https://github.com/PaulStoffregen/SoftwareSerial
Home
*/
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
// set the data rate for the SoftwareSerial port
mySerial.begin(9600);
}
void loop() { // run over and over
if (mySerial.available()) {
Serial.write(mySerial.read());
}
if (Serial.available()) {
mySerial.write(Serial.read());
}
}
این کد جهت تست ارتباط مابین سریال مانیتور آردوینو و دستگاهی که به ماژول بلوتوث متصل شده است، میباشد.
کنترل یک LED از طریق بلوتوث گوشی اندروید
سیم بندی
کد
برای برقرای ارتباط با ماژول HC05 از طریق بلوتوث نیاز به یک اپلیکشن ترمینال بلوتوث برای تلفن همراه خود دارید. برای این کار می توانید از این برنامه استفاده کنید.
حال برای برقرای ارتباط کد زیر را روی آردوینو خود آپلود کنید و به از طریق ترمینال بلوتوث به ماژول HC05 متصل شوید، بصورت پیشفرض نام ارتباط HC05 و رمز آن 1234 یا 0000 و نرخ بادریت برای ارتباط 9600 می باشد.
/*
HC05 - Bluetooth AT-Command mode
modified on 10 Feb 2019
by Saeed Hosseini
https://electropeak.com/learnfarsi/
*/
#include <SoftwareSerial.h>
SoftwareSerial MyBlue(10, 11); // RX | TX
String flag;
int LED = 8;
void setup()
{
Serial.begin(9600);
MyBlue.begin(9600);
pinMode(LED, OUTPUT);
Serial.println("Ready to connect\nDefualt password is 1234 or 000");
}
void loop()
{
if (MyBlue.available())
flag = MyBlue.read();
flag.trim();
if (flag == '1')
{
digitalWrite(LED, HIGH);
Serial.println("LED On");
}
else if (flag == '0')
{
digitalWrite(LED, HIGH);
Serial.println("LED Off");
}
}
بگذارید به کد با دقت بیشتری نگاه کنیم:
#include <SoftwareSerial.h>
کتابخوانه مورد نیاز برای راه اندازی سریال نرم افزاری
SoftwareSerial MyBlue(10, 11);
تعریف سریال نرم افزاری، پایه 10 RX و پایه 11 TX
MyBlue.begin(9600);
پیکربندی سریال نرم افزاری با بادریت 9600
void loop()
{
if (MyBlue.available())
flag = MyBlue.read();
flag.trim();
if (flag == '1')
{
digitalWrite(LED, HIGH);
Serial.println("LED On");
}
else if (flag == '0')
{
digitalWrite(LED, HIGH);
Serial.println("LED Off");
}
}
ارسال AT-Command به ماژول HC05
با فشردن و نگه داشتن کلید، ماژول به مد AT-Command می رود و در غیر این صورت در مد ارتباط کار می کند. برخی از ماژول ها روی خود کلید فشاری دارند که در اینصورت نیازی به اضافه کردن کلید نخواهید داشت.
برای ورود به مد AT-Command نرخ بادریت پیشفرض 38400 می باشد.
حال کد زیر را برروی بورد خود آپلود کرده و از طریق Serial Monitor دستورات لازم را به ماژول خود بدهید.
/*
HC05 - Bluetooth AT-Command mode
modified on 10 Feb 2019
by Saeed Hosseini
https://electropeak.com/learnfarsi/guides
*/
#include "SoftwareSerial.h"
SoftwareSerial MyBlue(10, 11); // RX | TX
void setup()
{
Serial.begin(9600);
MyBlue.begin(38400); //Baud Rate for AT-command Mode.
Serial.println("***AT commands mode***");
}
void loop()
{
//from bluetooth to Terminal.
if (MyBlue.available())
Serial.write(MyBlue.read());
//from termial to bluetooth
if (Serial.available())
MyBlue.write(Serial.read());
}
Command | Response | Description |
---|---|---|
AT | OK | Just test |
AT+RESET | OK | Reset module |
AT+VERSION? | +VERSION: OK | Firmware version of module |
AT+ORGL | OK | Restore to default |
AT+ADDR? | +ADDR: OK | Module address |
AT+NAME? | +NAME: OK | Module name |
AT+NAME=your name\r\n | OK | Change module name |
AT+RNAME?param1\r\n | +NAME: OK | Bluetooth device name |
AT+ROLE? | +ROLE: | Module role(0 is slave & 1 is master) |
AT+ROLE=(0 as slave,1 as master)\n\r | OK | Change module role |
AT+PSWD? | PSWD: OK | Module password |
AT+PSWD=your pass\r\n | OK | Change module password |
AT+UART? | P3: Parity +UART= OK | P1: Baud rate P2: Stop bit P3: Parity |
برای مشاهده دستورات بیشتر به دیتاشیت HC05 مراجعه کنید.
Comments (24)
با عرض سلام وخسته نباشید بنده این برنامه رو در اردویینو upload کردمولی کار نمیکنه اون برنامه ای رو که شما گفته بودید رو هم نصب کردم ولی نشد
میخواستم که کیمکی بکیند تا بتونم این رو راه اندازی بکنم
از روش AT-Command کد مربوطه را آپلود کنید و سریال مانیتور خود را در فرکانس بادریت را در 9600 قرار بدهید سپس دستور at را بفرستید در صورتی که جواب ok را دریافت نکردید سیم های rx , tx را از یک سمت عوض کرده و سپس تلاش کنید.
درصوتی که چیزی دریافت نکردید به احتمال زیاد ماژول شما مشکل دارد.
سلام اقا/خانوم ادمین
امکان داره بگویید چگونه و با چه کدی می توانیم به کمک اردینو ماژول را از حالت slave به حالت master تغییر دهیم
پیشاپیش کمال تشکر را از شما دارم
سلام، ممنون از سایت خوبتون.
آیا امکانش هست اسم default رو عوض کنیم؟
باسلام. بله، امکان پذیر است.
با سلام
من این کد رو روی آردوینو آپلود کردم اما led خاموش و روشن نشد.
سیم بندی رو چک کردم اما مشکلی نداشت.
بعد رفتم تو برنامه نویشه و بجای (if (flog == 1 وو ..
نوشتم if (flog == ‘1’) { m و به این شکل به درستی کار کرد.
مشکلش این بود که مقداری عددی که ماژول بلوتوث دریافت میکنه عدد نیست بلکه یک کاراکتر هست و باید در ‘1’ قرار بگیره!
خب سوالم اینه که من میخوام زاویه سروو موتور رو با بلوتوث و گوشی کنترل کنم اما بخاطر اینکه اون مقدار فقط یه کاراکتر هست و یک عدد نیست نمیدونم چیکار کنم که بجای یک کاراکتر یک عدد دریافت کنم و یا کاراکتر رو به عدد تبدیل کنم؟
میشه یک برنامه به من بگید که کاراکتر رو به عدد تبدیل کنم.
با تشکر
سلام دوست عزیز
اعداد و حروفی که پورت سریال میفرسته به بلوتوث بصورت کدهای اسکی هستند…با نگاه به جدول کدهای اسکی مشکلتون حل میشه…برای تبدیل کدهای اسکی عداد ۰ تا ۹ به عدد دسیمال باید کارکتر دریافت شده را متهای ۴۸ کنید تا به عدد دسیمال برسید و در برنامه اتون از اون عدد استفاده کنید
سلام، مقاومت هایی که توی مسیر RX گذاشتید چه مقداری هست؟
سلام.
از دو مقاومت هم اندازه بین 1کیلو تا 10کیلواهم می تونید استفاده کنید.
سلام ، یه ماشین ساختم که با این ماژول کنترل میشه ، فقط نمیدونم چرا هر چن ثانیه یه بار تاخیر ایجاد میشه ، در واقع وقتی که گزینه حرکت رو میزنم بعد چن ثانیه میره ، و با اینکه دستم رو از جهت های حرکت برداشتم ولی بازم به حرکت ادامه میده ، تو کد هیچ delay وجود نداره ،مشکل از کجاست
سلام دوست عزیز. از اونجایی که از کد شما اطلاعی نداریم به طور دقیق نمیتوان نظر داد. اما در حالت کلی برای بررسی روند دقیق کد خود، میتونید در قسمتهای مختلف کد، از serial.print استفاده کنید تا متوجه بشید که کدام قسمت کدتون باعث کندی در عملکردتون میشه.
با سلام
رباتی ساختم اما بلوتوث بعد از متصل شدن به موبایل و تست کردن سریع قطع میشه برای روشن کردنLED مشکلی نداره فقط برای حرکت موتورهای ربات با یک دستور حرکت ارتباط قطع میشه
سلام دوست عزیز
ازونجایی که اطلاعات کافی در مورد کد مورد استفادتون، ماژولها و اتصالات ندارم، نمیتونم به طور قطع ایراد کارتون رو متوجه بشم. اما مسالهای که ممکنه وجود داشته باشه مشکل تغذیه ماژول ها هست. ازونجایی که فقط موقع ارسال دستور حرکت به موتورها ارتباط بلوتوثی قطع میشه، این میتونه بخاطر جریانکشی موتورها و نرسیدن تغذیه کافی به ماژول بلوتوث در اون لحظه باشه.
سلام
بنده نمیتونم برنامه را نصب کنم
زمانی که کلیک می کنم برنامه را نمی آورد
میشه اسم برنامه را بفرمایید؟
سلام
اسم برنامه Bluetooth Terminal هست. از همین لینک گوگل پلی https://play.google.com/store/apps/details?id=Qwerty.BluetoothTerminal&hl=en میتونید اون رو دریافت کنید. در صورتی هم که به هر دلیلی از گوگل پلی نمیتونید اون رو دانلود و نصب کنید از طریق سرچ در گوگل میتونید این برنامه رو به سادگی پیدا کنید.
سلام وقتتون بخیر
چطور میتونم رمز ماژولی ک فراموش شده را ریست یا بازیابی کنم؟
ممنون میشم راهنمایی کنید
سلام
من این پروژه رو انجام دادم ولی وقتی اردوینو رو به تغذیه وصل می کنم بلوتوث قطع میشه
چکار باید بکنم؟
سلام
متوجه منظورتون نشدم ، یعنی با وجود برق در مدار، قطع میشه؟
یعنی قبل از این روشن بوده؟!!!
سلام دوست عزیز من هم دقیقا مشکل علیرضا رو دارم برای اینکه بفهم مشکل از کجاست یک LED و یک مقاومت ۱۵۰ اهم رو روی rx و tx قرار دادم دیدم هر چند ثانیه یک بار چشمک میزنه و در اون زمان ربات تحت کنترل است وقتی چشمک نمی زنه دیگه توی اون چند ثانیه تحت کنترل نیست تا چند ثانیه بعد که دوباره شروع به چشمک زدن و تبادل دیتا کنه ممنون میشم راهنمایی کنید که چرا ارتباط دائم نیست و پریودیک و چند ثانیه یک بار برقرار و قطع میشود اینم از کد
#include
AF_DCMotor motor1(1, MOTOR12_1KHZ);
AF_DCMotor motor2(2, MOTOR12_1KHZ);
AF_DCMotor motor3(3, MOTOR34_1KHZ);
AF_DCMotor motor4(4, MOTOR34_1KHZ);
char command;
void setup()
{
Serial.begin(9600);
}
void loop(){
if(Serial.available() > 0){
command = Serial.read();
Stop();
switch(command){
case ‘F’:
forward();
break;
case ‘B’:
back();
break;
case ‘L’:
left();
break;
case ‘R’:
right();
break;
}
}
}
void forward()
{
motor1.setSpeed(255);
motor1.run(FORWARD);
motor2.setSpeed(255);
motor2.run(FORWARD);
motor3.setSpeed(255);
motor3.run(FORWARD);
motor4.setSpeed(255);
motor4.run(FORWARD);
}
void back()
{
motor1.setSpeed(255);
motor1.run(BACKWARD);
motor2.setSpeed(255);
motor2.run(BACKWARD);
motor3.setSpeed(255);
motor3.run(BACKWARD);
motor4.setSpeed(255);
motor4.run(BACKWARD);
}
void left()
{
motor1.setSpeed(255);
motor1.run(BACKWARD);
motor2.setSpeed(255);
motor2.run(BACKWARD);
motor3.setSpeed(255);
motor3.run(FORWARD);
motor4.setSpeed(255);
motor4.run(FORWARD);
}
void right()
{
motor1.setSpeed(255);
motor1.run(FORWARD);
motor2.setSpeed(255);
motor2.run(FORWARD);
motor3.setSpeed(255);
motor3.run(BACKWARD);
motor4.setSpeed(255);
motor4.run(BACKWARD);
}
void Stop()
{
motor1.setSpeed(0);
motor1.run(RELEASE);
motor2.setSpeed(0);
motor2.run(RELEASE);
motor3.setSpeed(0);
motor3.run(RELEASE);
motor4.setSpeed(0);
motor4.run(RELEASE);
}
سلام
نمیشه گفت دقیقا مشکل از کجا میتونه باشه اما چند راه رو میتونید تست کنید
اول اینکه switch case رو از زیر شرط serial.available خارج کنید و در لوپ قرار بدید
مسئله دوم اینکه حتما چک کنید که سطح ولتاژ مدارتون استیبل باشه و افت نکنه خصوصا در موقع راه اندازی موتورها
سوالی هم میتونه اینجا مطرح بشه اینکه مدارتون ریست هم میشه؟
یا فقط ارتباط بلوتوث رو از دست میدید؟
در ضمن میتونید یه تست دیگه هم انجام بدید اینکه جدای از راه اندازی موتورهای شروع کنید به ارسال و دریافت اطلاعات توسط بلوتوث با یک ثابت زمانی مشخص و این زمان و رفته رفته کم کنید که سرعت تبادل بیشتر بشه و باز بررسی کنید که آیا بولوتوث ارتباطش قطع میشه یا خیر؟
متشکرم
سلام، به چه نحو می توان همزمان ماژول بلوتوث و wifi رو راه اندازی کرد؟
با سلام
جناب بر روی HC05
WiFi نداریم
شما فقط میتوانید از بلوتوث آن استفاده کنید که آن هم از طریق سریال امکان پذیر می باشد.
برای استفاده همزمان این 2 میتوانید از میکروکنترلر ESP32 استفاده کنید و نیازی به ماژول جانبی و آردوینو نیست و خودش هر دو را دارد و با کد های دستوری فعال می شوند.
با سلام. من دستورات AT Command رو روی اردوینو راه اندازی کردم ولی فقط روی دستور AT جواب OK میداد و برای هیچ کدوم دیگه ی دستور ها جواب نمیداد میگید چه کنم؟
با سلام
از نرم افزار زیر برای تنظیم کردن ماژول بلوتوث خود استفاده کنید.
همچنین به نسخه کپی و اورجینال بودن HC05 توجه کنید مقداری متفاوت می باشند
نرم افزار تنظیم ماژول های بلوتوث