ارتباط آردوینو و بلوتوث و اندروید
امروزه تکنولوژی ارتباط بیسیم با سرعت زیادی در حال پیشرفت است. در این میان، فناوری بلوتوث از جایگاه خوبی برخوردار است. بهنحویکه بسیاری از دیوایسها (مانند: تلفنهای همراه، موس، کیبرد ، هدفونهای بیسیم، خانههای هوشمند و …) از این بستر ارتباطی برای انجام کارهای خود استفاده میکنند.
ایدهی این فناوری در سال 1994 مطرح شد. در سال 1998 توسط شرکت اریکسون معرفی گشت و از سال 2000 در محصولات الکترونیکی بطور گسترده استفاده شده و همچنان در حال پیشرفت و کاملتر شدن است. این فناوری کمک شایانی به رشد اینترنت اشیاء کرده است.
در این قسمت از پروژه های آردوینو سعی میکنیم با یک آردوینو نانو به یک ماژول بلوتوث از خانواده HC متصل شویم و در نهایت توسط آنها، با یک گوشی اندرویدی ارتباط بگیریم.
ماژول بلوتوث خانوادهی HC
از بین ماژولهای موجود در بازار، ما از ماژول HC-06 استفاده میکنیم. شما میتوانید از هرکدام از ماژولهای این خانواده ( HC-03 , HC-04 , HC-05 ) استفاده کنید. این ماژول به لطف دوستان چشمبادامی قیمت مناسبی دارد (حدود 20 هزار تومان، در زمان نگارش این مطلب).
بیشتر ماژولها از تراشهی BC417 به همراه حافظهی فلش استفاده میکنند و دارای مشخصههای زیر هستند:
CSR چیپ: بلوتوث ورژن 2
باند فرکانسی: 2.4GHz , 2.8GHz و باند ISM
ولتاژ کاری: 3.3 ولت (2.7V – 4.2V)
جریان مصرفی: حداکثر 35 میلی
میتوانید شماتیک HC-06 را در زیر مشاهده کنید:
پایههای HC-04 و HC-06 به ترتیب زیر:
UART_TX (pin 1), UART_RX (pin 2), UART_CTS (pin 3), UART_RTS (pin 4) – UART.
3,3V (pin 12) – Power 3.3V.
GND (pin 13) – GND.
PIO1 (pin 24) – LED working mode indicato
و پایههای HC-03 و HC-05 نیز به این ترتیب هستند:
UART_TX (pin 1), UART_RX (pin 2), UART_CTS (pin 3), UART_RTS (pin 4) – UART.
PIO8 (pin 31) – LED1 working mode indicator.
PIO9 (pin 32) – LED2. Before paired, it output low level. Once the pair is finished, it output high level.
PIO11 (pin 34) – KEY. Mode switch input.
درصورتیکه کلید Mode در حالت صفر باشد، ماژول در حالت ارتباطی و اگر کلید Mode در حالت یک باشد، ماژول در حالت دستوری AT قرار میگیرد.
میتوانید داکیومنت ماژول را از لینک زیر دانلود کنید:
HC-Serial-Bluetooth-Products-201104.pdf
اتصال ماژول HC-06 به آردوینو نانو
پایههای آردوینو را به ترتیب زیر به ماژول بلوتوث متصل میکنیم:
پایه 3.3V آردوینو به پایه 12 ماژول بلوتوث
پایه زمین آردوینو به پایه 13 ماژول بلوتوث
پایه TX آردوینو به پایه 2 ماژول بلوتوث (RX)
پایه RX آردوینو به پایه 1 ماژول بلوتوث (TX)
بعد از اینکه ماژول را به آردوینو متصل کردیم، برای تست کارکرد صحیح برد آردوینو و ماژول، برنامه زیر را برای آردوینو استفاده میکنیم:
1 2 3 4 5 6 7 8 9 10 11 12 | int cnt = 0; // Counter void setup() { Serial.begin(9600); // Initialization } void loop() { cnt++; Serial.print("Hello BB from Arduino! Counter:"); // print message Serial.println(cnt); // print counter delay(1000); // wait 1 sec } |
برای صحت ارسال داده میتوانید توسط بلوتوث کامپیوتر به ماژول بلوتوث متصل به آردوینو متصل (pair) شوید. پسورد بهصورت پیشفرض 1234 است.
برای مشاهدهی دادههای ارسالی از نرمافزار Tera Term استفاده کنید. پورت مربوط به بلوتوث را انتخاب کرده و دیتاهای ارسالی را مشاهده کنید.
تا اینجا توسط آردوینو و یک ماژول بلوتوث، دادههای خود را انتقال دادیم.
حال میخواهیم توسط یک گوشی اندرویدی، یک لامپ را خاموش و روشن کنیم. برای این منظور برنامهی زیر را روی آردوینو پروگرام میکنیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | char incomingByte; // incoming data int LED = 12; // LED pin void setup() { Serial.begin(9600); // initialization pinMode(LED, OUTPUT); Serial.println("Press 1 to LED ON or 0 to LED OFF..."); } void loop() { if (Serial.available() > 0) { // if the data came incomingByte = Serial.read(); // read byte if(incomingByte == '0') { digitalWrite(LED, LOW); // if 1, switch LED Off Serial.println("LED OFF. Press 1 to LED ON!"); // print message } if(incomingByte == '1') { digitalWrite(LED, HIGH); // if 0, switch LED on Serial.println("LED ON. Press 0 to LED OFF!"); } } } |
برنامه اندرویدی برای ارتباط با بلوتوث
برای ارتباط با بلوتوث از یک برنامهی جاوا استفاده میکنیم. برنامه را روی دستگاه اندرویدی نصب و اجرا میکنیم. توسط بلوتوث دستگاه به بلوتوث آردوینو متصل میشویم. در برنامه دو کلید با نامهای LED ON و LED OFF وجود دارد که با فشار کلید مربوطه LED روی برد آردوینو روشن و یا خاموش میشود.
کد مربوط به برنامهی اندروید را مشاهده میکنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 | package com.example.bluetooth1; import java.io.IOException; import java.io.OutputStream; import java.lang.reflect.Method; import java.util.UUID; import com.example.bluetooth1.R; import android.app.Activity; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothSocket; import android.content.Intent; import android.os.Build; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public class MainActivity extends Activity { private static final String TAG = "bluetooth1"; Button btnOn, btnOff; private BluetoothAdapter btAdapter = null; private BluetoothSocket btSocket = null; private OutputStream outStream = null; // SPP UUID service private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); // MAC-address of Bluetooth module (you must edit this line) private static String address = "00:15:FF:F2:19:5F"; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnOn = (Button) findViewById(R.id.btnOn); btnOff = (Button) findViewById(R.id.btnOff); btAdapter = BluetoothAdapter.getDefaultAdapter(); checkBTState(); btnOn.setOnClickListener(new OnClickListener() { public void onClick(View v) { sendData("1"); Toast.makeText(getBaseContext(), "Turn on LED", Toast.LENGTH_SHORT).show(); } }); btnOff.setOnClickListener(new OnClickListener() { public void onClick(View v) { sendData("0"); Toast.makeText(getBaseContext(), "Turn off LED", Toast.LENGTH_SHORT).show(); } }); } private BluetoothSocket createBluetoothSocket(BluetoothDevice device) throws IOException { if(Build.VERSION.SDK_INT >= 10){ try { final Method m = device.getClass().getMethod("createInsecureRfcommSocketToServiceRecord", new Class[] { UUID.class }); return (BluetoothSocket) m.invoke(device, MY_UUID); } catch (Exception e) { Log.e(TAG, "Could not create Insecure RFComm Connection",e); } } return device.createRfcommSocketToServiceRecord(MY_UUID); } @Override public void onResume() { super.onResume(); Log.d(TAG, "...onResume - try connect..."); // Set up a pointer to the remote node using it's address. BluetoothDevice device = btAdapter.getRemoteDevice(address); // Two things are needed to make a connection: // A MAC address, which we got above. // A Service ID or UUID. In this case we are using the // UUID for SPP. try { btSocket = createBluetoothSocket(device); } catch (IOException e1) { errorExit("Fatal Error", "In onResume() and socket create failed: " + e1.getMessage() + "."); } // Discovery is resource intensive. Make sure it isn't going on // when you attempt to connect and pass your message. btAdapter.cancelDiscovery(); // Establish the connection. This will block until it connects. Log.d(TAG, "...Connecting..."); try { btSocket.connect(); Log.d(TAG, "...Connection ok..."); } catch (IOException e) { try { btSocket.close(); } catch (IOException e2) { errorExit("Fatal Error", "In onResume() and unable to close socket during connection failure" + e2.getMessage() + "."); } } // Create a data stream so we can talk to server. Log.d(TAG, "...Create Socket..."); try { outStream = btSocket.getOutputStream(); } catch (IOException e) { errorExit("Fatal Error", "In onResume() and output stream creation failed:" + e.getMessage() + "."); } } @Override public void onPause() { super.onPause(); Log.d(TAG, "...In onPause()..."); if (outStream != null) { try { outStream.flush(); } catch (IOException e) { errorExit("Fatal Error", "In onPause() and failed to flush output stream: " + e.getMessage() + "."); } } try { btSocket.close(); } catch (IOException e2) { errorExit("Fatal Error", "In onPause() and failed to close socket." + e2.getMessage() + "."); } } private void checkBTState() { // Check for Bluetooth support and then check to make sure it is turned on // Emulator doesn't support Bluetooth and will return null if(btAdapter==null) { errorExit("Fatal Error", "Bluetooth not support"); } else { if (btAdapter.isEnabled()) { Log.d(TAG, "...Bluetooth ON..."); } else { //Prompt user to turn on Bluetooth Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, 1); } } } private void errorExit(String title, String message){ Toast.makeText(getBaseContext(), title + " - " + message, Toast.LENGTH_LONG).show(); finish(); } private void sendData(String message) { byte[] msgBuffer = message.getBytes(); Log.d(TAG, "...Send data: " + message + "..."); try { outStream.write(msgBuffer); } catch (IOException e) { String msg = "In onResume() and an exception occurred during write: " + e.getMessage(); if (address.equals("00:00:00:00:00:00")) msg = msg + ".\n\nUpdate your server address from 00:00:00:00:00:00 to the correct address on line 35 in the java code"; msg = msg + ".\n\nCheck that the SPP UUID: " + MY_UUID.toString() + " exists on server.\n\n"; errorExit("Fatal Error", msg); } } } |
(میتوانید برنامه را نسبت به نیاز خود، کامل کرده و از آن استفاده کنید.)
سورس برنامه آردوینو و اندروید و فایلهای APK را از لینک زیر دانلود کنید:
این ویدیو ارتباط آردوینو، بلوتوث و کامپیوتر را نشان میدهد:
سلام
آیا امکان اتصال اتومات گوشی به ماژول هست؟
یعنی وقتی گوشی نزدیک محدوده ماژول بشه، گوشی اتومات به ماژول وصل بشه؟
سلام فکر میکنم این مقوله رو باید به شکل نرم افزاری توی اندروید حل کرد.
سلام و خسته نباشید. سورس اندروید استودیو هست؟
سلام سورس جاوا هست و توی اندروید استودیو هم قابل استفاده است
سلام
ببخشید این کد الان ارسال میکنه فقط ؟ برای دریافت اطلاعات از ماژول از چه کدی باید استفاده کنیم در اندروید استودیو؟
سلام امکان ارسال و دریافت دو طرفه وجود داره با همین ماژول
ولی برنامه اندرویدی که نوشته شده فقط برای ارسال داده هست – اگر نه به سادگی میشه دریافت هم بهش اضافه کرد
سلام، هزینه یه برنامه خیلی ساده با 5 تا دکمه چقدره؟
هر دکمه از یک تل چهار، عدد ارسال کنه و یه دکمه خاموش.
با تشکر
دوست عزیز ما پروژه انجام نمیدیم
اینجا پروژه را قرار دادیم که با تغییرات پروژه را خودتون انجام بدید