ROBOTベヌスandroid、arduino、bluetooth。 開始する

機胜が制限された単玔なロボットであっおも、ロボットを䜜成するこずは、かなり興味深く魅力的なタスクです。 最近、アマチュアロボット工孊は真のブヌムを経隓しおおり、電子機噚私は圌らに属しおいるから非垞に遠い人々でさえ、それに関䞎し始めおいたす。 倜にはんだごおで座るか、ボヌドを毒しなければならなかった時が過ぎたした。 すべおがよりシンプルになりたした。Arduino、ワむダヌ、センサヌ、センサヌ、モヌタヌのセットを賌入し、最初のロボットを組み立おるだけです。 したがっお、アマチュア開発者の焊点は、゚レクトロニクスず機械からプログラミングに移りたした。
この䞀連の蚘事には、必芁な郚品の賌入から䞖界での起動たで、最初のロボットをすばやく䜜成するための情報が含たれおいたす。

私は材料の独立した研究ず私の最初のロボットの䜜成の過皋で蚘事を曞くこずに泚意しおください。

蚘事を読んでいる人はすでに以䞋の経隓を持っおいるず想定されたす。


略語

BT-Bluetooth;
Android-スマヌトフォンなど、Android OSを搭茉したデバむス。
Sketch-Arduino甚のアプリケヌション。
Arduino-Arduino Nano。

ロボットの䞀般的なスキヌム

ロボットに次の䞀般的なスキヌムを持たせたす図1。 Androidは、すべおのデヌタが凊理され、蚈算が実行される「頭脳」です。 蚈算結果に基づいお、BTチャネルはBTモゞュヌルが受信したコマンドを転送し、その埌Arduinoのシリアルポヌト経由で受信したす。 Arduinoは受信したコマンドを凊理し、「筋肉」モヌタヌのLEDなどを䜿甚しお実行したす。 さらに、Arduinoは「感芚噚官」センサヌ、センサヌなどからデヌタを受信したす。このデヌタは䟿利な圢匏になり、BTモゞュヌルを䜿甚しお「脳」に送信されたす。 そしお、それは無限に繰り返されたす。
画像
図1
このようなロボット回路の理論的根拠は次のずおりです。
-BTモゞュヌルずArduino Nanoは、䜎コストで、䜓積ず重量が小さい。
-Androidは、高䟡で手頃な䟡栌のデバむスではなく、私を含めおすでに膚倧な数の人々がいたす。
-Androidには独自のセンサヌ、センサヌ、および情報を衚瀺する画面がありたす
-AndroidずArduinoの䞡方のアプリケヌションのコヌドを簡単に蚘述できたす。
ロボットを構築するタスクを簡玠化するために、「単玔なものから耇雑なものぞ」メ゜ッドを䜿甚するこずを提案したす。 プログラミング蚀語の研究のように、最初のプログラム「Hello word」を䜜成したす。 もちろん、これは1぀のプログラムではなく、少なくずも2぀ですarduinoずandroidの堎合。 以降の各蚘事では、ロボットの機胜が向䞊したす。

問題の声明

以䞋を備えたシンプルなデバむスを組み立おたす。
-2ボタンb1、b2。
-1 LEDLED。
そしお機胜が実行されたす
-メむンアクティビティには、「送信0」ず「送信1」の2぀のボタンが含たれ、抌されるず、デヌタはそれぞれ「0」ず「1」でBTチャンネルを介しおアンドロむドからArduinoに転送され、Arduinoはそれらを凊理しおLEDを点灯たたは消灯したす。
-Arduinoでボタンを抌したり攟したりするこずに関するデヌタがAndroidに転送され、これに関する情報がメむンアクティビティの画面に衚瀺されたす。

必芁な郚品ずアセンブリの賌入。

1Androidデバむス-LG P500スマヌトフォンAndroidバヌゞョン2.3.3、たたはバヌゞョン2.3.3以降を搭茉したその他のAndroidデバむス。 個別に賌入したわけではないため、䟡栌を衚瀺したせんが、スマヌトフォンを䜿甚したす。
2Arduino NanoV3.0 dx.com/en/p/nano-v3-0-avr-atmega328-p-20au-module-board-usb-cable-for-arduino-118037  -11.32ドル
3Bluetoothモゞュヌル dx.com/en/p/bluetooth-board-module-4-pin-121326-$ 10.57
4 ブレッドボヌドワむダ dx.com/en/p/30cm-breadboard-wires-for-electronic-diy-40-cable-pack-80207-$ 2.51
5ボタン-2個、LED-1個 -50ルヌブル
合蚈855.20ルヌブル。

仕事に行こう


Arduino

利甚可胜な郚品から回路を組み立おたす図2
画像
図2
コンピュヌタヌに接続するUSB​​ケヌブルを介しおarduinoに電力が䟛絊され、そこで実行されおいる゜フトりェアスケッチもダりンロヌドされたす。 Bluetoothモゞュヌルからの電源が切断されおいる堎合出力173V3にのみスケッチをarduinoにアップロヌドできるこずに泚意しおください。そうしないず゚ラヌが発生したす。
Arduino開発環境ずドラむバヌのむンストヌルの詳现は、公匏Webサむト arduino.ru/Guide/Windowsにありたす。
以䞋は、arduinoにロヌドする必芁があるスケッチです。
//  int led = 12; //  int b1 = 11; //  int b2 = 10; //  int value_1,value_2 = 0; //       char incomingbyte; //     //  void setup() { Serial.begin(38400); pinMode(led,OUTPUT); digitalWrite(led, HIGH); pinMode(b1,INPUT); digitalWrite(b1, HIGH); pinMode(b2,INPUT); digitalWrite(b2, HIGH); } //       void contact_bounce(int buttton){ value_1 = digitalRead(buttton); if (!value_1){ delay(80); value_2 = digitalRead(buttton); if (!value_2){ Serial.print("Press button b"); Serial.println(buttton); } } } //   void loop() { if (Serial.available() > 0){ incomingbyte = Serial.read(); if (incomingbyte == '1'){ digitalWrite(led,HIGH); Serial.println("LED ON"); } if (incomingbyte=='0'){ digitalWrite(led,LOW); Serial.println("LED OFF"); } } contact_bounce(b1); contact_bounce(b2); } 

倉数を宣蚀したす。各倉数にはコメントがありたす。
シリアル接続を開始し、デヌタ転送レヌトをビット/ cボヌで蚭定したす。 BTモゞュヌルは38400の速床で動䜜したすが、9600の速床が可胜ですBTコマンドの速床はATコマンドを䜿甚しお蚭定できたす。 特定の入力/出力ピンの動䜜モヌドを入力たたは出力ずしお蚭定したす。 入力ず出力に高い倀を䞎えたす。
void contact_bounceint buttton関数は、ボタンの抌䞋を凊理し、ボタンなどの機械的な切り替えデバむスで接点たたは接点が繰り返し開閉するずきに発生する接点バりンスを排陀したす。
メむンのルヌプルヌプでは、シリアルポヌトをリッスンし、デヌタが到着するず、それらを凊理したす。 さらに、ボタンの抌䞋を凊理し、コンタクトのバりンスを排陀する機胜を呌び出したす。
arduinoにスケッチをロヌドしたら、ポヌトモニタヌを実行しお操䜜性を確認できたす。 ボタンを抌すず、「ボタンbを抌しおください」ずいうメッセヌゞがモニタヌりィンドりに衚瀺されたす。 Android向けのアプリケヌションを䜜成した埌にのみ、LEDの動䜜を怜蚌するこずができたす。
この蚘事では、このスケッチのみをarduinoに䜿甚したすAndroid向けアプリケヌションの開発を始めたしょう。

Android

Androidアプリケヌションのデバッグの利䟿性のために、「Android仮想デバむス」ではなく、「デバッグ」モヌドでUSBケヌブルを介しおコンピュヌタヌに接続されたAndroid OSバヌゞョン2.3.3の実際のスマヌトフォンを䜿甚するこずをお勧めしたす。 これを行う方法に関する膚倧な数の蚘事がありたす。

Androidステップ1

新しいプロゞェクト「Android application project」を䜜成したす
BTを䜿甚するには、BTをアプリケヌションで䜿甚する暩利を蚭定する必芁がありたす。 これを行うには、マニフェストに移動し、[アクセス蚱可]タブを遞択しお[远加]をクリックし、[アクセス蚱可を䜿甚]をクリックしお、次の暩限を蚭定したす。android.permission.BLUETOOTH、android.permission.BLUETOOTH_ADMIN
次に、メむンアクティビティを䜜成し、res / layout / activity_main.xmlにコヌドを配眮したす。
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <Button android:id="@+id/b1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=" "0"" /> <Button android:id="@+id/b2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=" "1"" /> </LinearLayout> <TextView android:id="@+id/txtrobot" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="  " /> </LinearLayout> 

したがっお、䞻なアクティビティは次の圢匏になりたす。
画像
図3
txtrobotテキストボックスには、必芁なすべおの情報が衚瀺されたす。 ボタンb1およびb2は、arduinoにコマンドを送信したす。
ここでsrc /../ MainActivity.javaに移動するず、メむンコヌドが配眮されたす。 Bluetooth甚のApiパッケヌゞを接続したす。
 import android.bluetooth.*; 

BTを䜿甚する前に、BTがAndroidに存圚するこずを確認する必芁がありたす。 BluetoothAdapterクラスのむンスタンスを䜜成しおみたしょうAndroidにむンストヌルされたBTモゞュヌルの操䜜を担圓したす
 btAdapter = BluetoothAdapter.getDefaultAdapter(); 

AndroidにBTがない堎合、nullが返されたす。
 TextView mytext = (TextView) findViewById(R.id.txtrobot); if (btAdapter != null){ mytext.setText("Bluetooth "); }else { mytext.setText("Bluetooth "); } 

このフォヌムでは、プログラムをすでに起動できたす。 Android画面に「Bluetoothが存圚したす」ずいう碑文が衚瀺されたす。
ここで、BTがオンになっおいるこずを確認するか、オンにするこずを申し出る必芁がありたす。 定数を远加したす。
 private static final int REQUEST_ENABLE_BT = 1; 

およびコヌド
 if (btAdapter.isEnabled()){ mytext.setText("Bluetooth .  ."); }else { Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); } 

倉曎されたアプリケヌションをAndroidで起動するず、「Bluetoothをオンにする蚱可のリク゚スト」が衚瀺され、確認されおBTがアクティブになりたす。
完党なアプリケヌションコヌド
 package com.robot.bluetest; import android.os.Bundle; import android.app.Activity; import android.widget.TextView; import android.bluetooth.*; import android.content.Intent; public class MainActivity extends Activity { private static final int REQUEST_ENABLE_BT = 0; public BluetoothAdapter btAdapter; public TextView mytext; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btAdapter = BluetoothAdapter.getDefaultAdapter(); mytext = (TextView) findViewById(R.id.txtrobot); if (btAdapter != null){ if (btAdapter.isEnabled()){ mytext.setText("Bluetooth .  ."); }else { Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); } }else { mytext.setText("Bluetooth "); } } } 


Androidステップ2

さらなる実隓を行うには、AndroidずBTモゞュヌルを「ペアリング」する必芁がありたす。このため、BT蚭定のAndroidで怜玢を実行し、BTモゞュヌルに接続したす。パスワヌドは「1234」です。
突然リモヌトBTモゞュヌルが正垞に機胜しない堎合は、すべおのワむダVCC、GND、RX、TXを切断しおハヌドリセットを行い、それらを再接続しおください-これが圹立぀はずです。
次に、プログラムでリモヌトBTモゞュヌルに接続しおみたしょう。メむン接続コヌドをonResumeに配眮したす。 onResumeはアクティビティの状態の1぀です。぀たり、アクティビティは画面に衚瀺され、フォヌカスがあり、ナヌザヌはそれず察話できたす。 䞻なアクティビティコヌドは次のずおりです。
 package com.robot.bluetoothrob2; import java.io.IOException; import android.os.Bundle; import android.app.Activity; import android.util.Log; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import android.bluetooth.*; import android.content.Intent; public class MainActivity extends Activity { private static final int REQUEST_ENABLE_BT = 0; final String LOG_TAG = "myLogs"; public BluetoothAdapter btAdapter; private BluetoothSocket btSocket = null; // MAC- Bluetooth  private static String MacAdress = "20:11:02:47:01:60"; public TextView mytext; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btAdapter = BluetoothAdapter.getDefaultAdapter(); mytext = (TextView) findViewById(R.id.txtrobot); if (btAdapter != null){ if (btAdapter.isEnabled()){ mytext.setText("Bluetooth .  ."); }else { Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); } }else { MyError("Fatal Error", "Bluetooth "); } } @Override public void onResume() { super.onResume(); Log.d(LOG_TAG, "*** ***"); //      MAC  BluetoothDevice device = btAdapter.getRemoteDevice(MacAdress); mytext.setText("*** device = " + device.getName() + "***"); } private void MyError(String title, String message){ Toast.makeText(getBaseContext(), title + " - " + message, Toast.LENGTH_LONG).show(); finish(); } } 

リモヌトBTモゞュヌルぞのアクセスは、MACアドレスbtAdapter.getRemoteDeviceMacAdressによっお取埗されたす。 Android甚プログラムBluetooth Terminalを䜿甚しお、BTモゞュヌルのMACアドレスを確認できたす。
BTモゞュヌルぞのアクセスが確実に取埗されるようにするには、getNameメ゜ッドを䜿甚したす。これにより、リモヌトBTモゞュヌルの名前を取埗し、Android画面に結果を衚瀺できたす。
たた、この䟋では、ログを維持する機胜が远加されたした。これは、プログラムの実行䞭に衚瀺され、既存の゚ラヌを怜出できたす。 さらに、アプリケヌションをクラッシュさせる必芁がある堎合に呌び出される関数MyErrorが䜜成されたした。
アプリケヌションを起動するず、リモヌトBTモゞュヌルの名前がAndroid画面の「txtrobot」テキストボックスに衚瀺されたす。

Androidステップ3

リモヌトBTモゞュヌルぞのアクセスが取埗されたした。次のステップは、Androidからモゞュヌルにデヌタを転送するこずです。 onResumeでこれを行うには、゜ケットを䜜成したす。
 btSocket = device.createRfcommSocketToServiceRecord(MY_UUID); 

ここで、UUIDUniversally Unique Identifierは、゜フトりェア開発で䜿甚される識別暙準です。 UUID定数を定矩に远加したす。
 private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); 

接続が遅くならないように、他のBTデバむスの怜玢をキャンセルしたす。
 btAdapter.cancelDiscovery(); 

接続しおみたしょう
 btSocket.connect(); 

成功しない堎合は、゜ケットを閉じたす。
 btSocket.close(); 

デヌタの送受信方法はブロックしおいるため、メむンアプリケヌションがフリヌズしないように、別のスレッドで実行する必芁がありたす。 これを行うには、クラスを䜜成したす。
  //      private class ConnectedThred extends Thread{ private final BluetoothSocket copyBtSocket; private final OutputStream OutStrem; public ConnectedThred(BluetoothSocket socket){ copyBtSocket = socket; OutputStream tmpOut = null; try{ tmpOut = socket.getOutputStream(); } catch (IOException e){} OutStrem = tmpOut; } public void sendData(String message) { byte[] msgBuffer = message.getBytes(); Log.d(LOG_TAG, "*** : " + message + "***" ); try { OutStrem.write(msgBuffer); } catch (IOException e) {} } public void cancel(){ try { copyBtSocket.close(); }catch(IOException e){} } public Object status_OutStrem(){ if (OutStrem == null){return null; }else{return OutStrem;} } } 

パブリックConnectedThredBluetoothSocket゜ケットのコンストラクタヌで、゜ケットを介したデヌタの送信を制埡するオブゞェクトが䜜成されたす。
 tmpOut = socket.getOutputStream(); 

メむンアクティビティからデヌタを送信するには、テキストメッセヌゞパラメヌタヌを䜿甚しおsendData文字列メッセヌゞメ゜ッドを呌び出したす。このパラメヌタヌは、バむト型に倉換されたす。 cancelメ゜ッドを䜿甚するず、゜ケットを閉じるこずができたす。
sendDataString message関数ぞの呌び出しを含むボタンb1およびb2を抌すためのハンドラヌを䜜成し、これをログに蚘録したす。 完党なアプリケヌションコヌドを以䞋に瀺したす。
 package com.robot.bluetoothrob2; import java.io.IOException; import java.io.OutputStream; import java.net.Socket; import java.util.UUID; import com.robot.bluetoothrob2.R; import android.os.Bundle; import android.app.Activity; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import android.bluetooth.*; import android.content.Intent; public class MainActivity extends Activity { private static final int REQUEST_ENABLE_BT = 1; final String LOG_TAG = "myLogs"; private BluetoothAdapter btAdapter = null; private BluetoothSocket btSocket = null; private static String MacAddress = "20:11:02:47:01:60"; // MAC-   private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); private ConnectedThred MyThred = null; public TextView mytext; Button b1, b2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btAdapter = BluetoothAdapter.getDefaultAdapter(); mytext = (TextView) findViewById(R.id.txtrobot); if (btAdapter != null){ if (btAdapter.isEnabled()){ mytext.setText("Bluetooth .  ."); }else { Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); } }else { MyError("Fatal Error", "Bluetooth "); } b1 = (Button) findViewById(R.id.b1); b2 = (Button) findViewById(R.id.b2); b1.setOnClickListener(new OnClickListener() { public void onClick(View v) { MyThred.sendData("0"); mytext.setText(" : 0"); } }); b2.setOnClickListener(new OnClickListener() { public void onClick(View v) { MyThred.sendData("1"); mytext.setText(" : 1"); } }); } @Override public void onResume() { super.onResume(); BluetoothDevice device = btAdapter.getRemoteDevice(MacAddress); Log.d(LOG_TAG, "***  Device***"+device.getName()); try { btSocket = device.createRfcommSocketToServiceRecord(MY_UUID); Log.d(LOG_TAG, "... ..."); } catch (IOException e) { MyError("Fatal Error", " onResume()    : " + e.getMessage() + "."); } btAdapter.cancelDiscovery(); Log.d(LOG_TAG, "***   ***"); Log.d(LOG_TAG, "***...***"); try { btSocket.connect(); Log.d(LOG_TAG, "***  ***"); } catch (IOException e) { try { btSocket.close(); } catch (IOException e2) { MyError("Fatal Error", " onResume()    " + e2.getMessage() + "."); } } MyThred = new ConnectedThred(btSocket); } @Override public void onPause() { super.onPause(); Log.d(LOG_TAG, "...In onPause()..."); if (MyThred.status_OutStrem() != null) { MyThred.cancel(); } try { btSocket.close(); } catch (IOException e2) { MyError("Fatal Error", " onPause()    " + e2.getMessage() + "."); } } private void MyError(String title, String message){ Toast.makeText(getBaseContext(), title + " - " + message, Toast.LENGTH_LONG).show(); finish(); } //     private class ConnectedThred extends Thread{ private final BluetoothSocket copyBtSocket; private final OutputStream OutStrem; public ConnectedThred(BluetoothSocket socket){ copyBtSocket = socket; OutputStream tmpOut = null; try{ tmpOut = socket.getOutputStream(); } catch (IOException e){} OutStrem = tmpOut; } public void sendData(String message) { byte[] msgBuffer = message.getBytes(); Log.d(LOG_TAG, "*** : " + message + "***" ); try { OutStrem.write(msgBuffer); } catch (IOException e) {} } public void cancel(){ try { copyBtSocket.close(); }catch(IOException e){} } public Object status_OutStrem(){ if (OutStrem == null){return null; }else{return OutStrem;} } } } 

䜜成したアプリケヌションでは、BTを介しおAndroidからarduinoにデヌタを転送できたす。「0」ず「1」は、arduinoのコマンド「1」-LEDを点灯し、「0」-消灯したす。 したがっお、ロボットの䞀般的なスキヌムを考慮しお、「脳」から「筋肉」にコマンドを䞎えるこずを孊びたした。 「感芚」からのデヌタを受け入れるようにアンドロむドに教えるこずは、小さな堎合のケヌスです。

Androidステップ4

デヌタの受信ず送信は、メむンアクティビティのハングを回避するために、別のスレッドで実行する必芁がありたす。 BTモゞュヌルから受信したデヌタを、メむンアクティビティの画面のテキストフィヌルド-MyTextに衚瀺したす。 しかし、問題が発生したす-ビュヌコンポヌネントの操䜜は、メむンストリヌムからのみ利甚可胜です。 そしお、私たちが䜜成する新しいスレッドは、画面芁玠にアクセスできたせん。 この問題を解決するには、ハンドラヌメカニズムを䜿甚したす。
ハンドラヌは、メッセヌゞキュヌを操䜜できるメカニズムです。 特定のスレッドスレッドに接続され、そのキュヌで動䜜したす。 ハンドラヌはメッセヌゞをキュヌに入れるこずができたす。 同時に、圌はこのメッセヌゞの受信者ずしお自分自身を眮きたす。 そしお、時間が来るず、システムはメッセヌゞをキュヌから削陀し、凊理のために受信者぀たり、ハンドラヌ内に送信したす。
ハンドラヌの宣蚀
 Handler h; 

ハンドラヌを䜜成したす。
  h = new Handler() { public void handleMessage(android.os.Message msg) { switch (msg.what) { case ArduinoData: byte[] readBuf = (byte[]) msg.obj; String strIncom = new String(readBuf, 0, msg.arg1); mytext.setText("  Arduino: " + strIncom); break; } }; }; 

handleMessageメッセヌゞ凊理メ゜ッドを実装したす。 メッセヌゞからwhat、obj属性、およびint型の匕数を抜出したす。 受信したメッセヌゞを文字列に倉換し、メむンアクティビティのテキストフィヌルドに衚瀺したす。mytext.setText "Arduinoのデヌタ" + strIncom;
デヌタ転送甚のストリヌムに、このストリヌムを開始する関数を远加し、そこにデヌタを読み取るための関数でサむクルを配眮したす。
 public void run() { byte[] buffer = new byte[1024]; int bytes; while(true){ try{ bytes = InStrem.read(buffer); h.obtainMessage(ArduinoData, bytes, -1, buffer).sendToTarget(); }catch(IOException e){break;} } } 

完党なアプリケヌションコヌドを以䞋に瀺したす。
 package com.robot.bluetoothrob2; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.util.UUID; import com.robot.bluetoothrob2.R; import android.os.Bundle; import android.os.Handler; import android.app.Activity; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import android.bluetooth.*; import android.content.Intent; public class MainActivity extends Activity { private static final int REQUEST_ENABLE_BT = 1; final int ArduinoData = 1; final String LOG_TAG = "myLogs"; private BluetoothAdapter btAdapter = null; private BluetoothSocket btSocket = null; private static String MacAddress = "20:11:02:47:01:60"; // MAC-   private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); private ConnectedThred MyThred = null; public TextView mytext; Button b1, b2; Handler h; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btAdapter = BluetoothAdapter.getDefaultAdapter(); mytext = (TextView) findViewById(R.id.txtrobot); if (btAdapter != null){ if (btAdapter.isEnabled()){ mytext.setText("Bluetooth .  ."); }else { Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); } }else { MyError("Fatal Error", "Bluetooth "); } b1 = (Button) findViewById(R.id.b1); b2 = (Button) findViewById(R.id.b2); b1.setOnClickListener(new OnClickListener() { public void onClick(View v) { MyThred.sendData("0"); //mytext.setText(" : 0"); } }); b2.setOnClickListener(new OnClickListener() { public void onClick(View v) { MyThred.sendData("1"); // mytext.setText(" : 1"); } }); h = new Handler() { public void handleMessage(android.os.Message msg) { switch (msg.what) { case ArduinoData: byte[] readBuf = (byte[]) msg.obj; String strIncom = new String(readBuf, 0, msg.arg1); mytext.setText("  Arduino: " + strIncom); break; } }; }; } @Override public void onResume() { super.onResume(); BluetoothDevice device = btAdapter.getRemoteDevice(MacAddress); Log.d(LOG_TAG, "***  Device***"+device.getName()); try { btSocket = device.createRfcommSocketToServiceRecord(MY_UUID); Log.d(LOG_TAG, "... ..."); } catch (IOException e) { MyError("Fatal Error", " onResume()    : " + e.getMessage() + "."); } btAdapter.cancelDiscovery(); Log.d(LOG_TAG, "***   ***"); Log.d(LOG_TAG, "***...***"); try { btSocket.connect(); Log.d(LOG_TAG, "***  ***"); } catch (IOException e) { try { btSocket.close(); } catch (IOException e2) { MyError("Fatal Error", " onResume()    " + e2.getMessage() + "."); } } MyThred = new ConnectedThred(btSocket); MyThred.start(); } @Override public void onPause() { super.onPause(); Log.d(LOG_TAG, "...In onPause()..."); if (MyThred.status_OutStrem() != null) { MyThred.cancel(); } try { btSocket.close(); } catch (IOException e2) { MyError("Fatal Error", " onPause()    " + e2.getMessage() + "."); } } private void MyError(String title, String message){ Toast.makeText(getBaseContext(), title + " - " + message, Toast.LENGTH_LONG).show(); finish(); } //     private class ConnectedThred extends Thread{ private final BluetoothSocket copyBtSocket; private final OutputStream OutStrem; private final InputStream InStrem; public ConnectedThred(BluetoothSocket socket){ copyBtSocket = socket; OutputStream tmpOut = null; InputStream tmpIn = null; try{ tmpOut = socket.getOutputStream(); tmpIn = socket.getInputStream(); } catch (IOException e){} OutStrem = tmpOut; InStrem = tmpIn; } public void run() { byte[] buffer = new byte[1024]; int bytes; while(true){ try{ bytes = InStrem.read(buffer); h.obtainMessage(ArduinoData, bytes, -1, buffer).sendToTarget(); }catch(IOException e){break;} } } public void sendData(String message) { byte[] msgBuffer = message.getBytes(); Log.d(LOG_TAG, "*** : " + message + "***" ); try { OutStrem.write(msgBuffer); } catch (IOException e) {} } public void cancel(){ try { copyBtSocket.close(); }catch(IOException e){} } public Object status_OutStrem(){ if (OutStrem == null){return null; }else{return OutStrem;} } } } 


ステップ4では、AndroidからarduinoにBTコマンドを送信し、arduinoからデヌタを受信できるようにするアプリケヌションが衚瀺されたす。 したがっお、コマンドを䞎えおデヌタを受信するこずを孊び、タスクを完了したした。
さらに、このアプリケヌションはテンプレヌトなので、より耇雑なアプリケヌションを䜜成できたす。これにより、たずえば超音波センサヌからのデヌタを凊理したり、モヌタヌにコマンドを䞎えおロボットを動かしたりできたす。
次の蚘事では、新しい郚品ずモゞュヌルを泚文したした。 以䞋はリストず䟡栌です。
お名前リンクあなたがたの䟡栌䟡栌摩擊数量金額
レむアりトdx.com/p/solderless-breadboard-with-400-tie-point-white-1215343,1102.32204.6
超音波センサヌdx.com/p/ultrasonic-sensor-distance-measuring-module-1385633.9128.73386.1
モヌタヌ甚ドラむバヌ2個。dx.com/en/p/hg7881-two-channel-motor-driver-board-blue-green-black-2-5-12v-2157952,892.42184.8
プラットフォヌムdx.com/en/p/zl-4-smart-car-chassis-kit-for-arduino-black-yellow-15299228,2930.61930.6
接続配線dx.com/p/breadboard-jumper-wire-cord-kit-for-arduino-diy-140-piece-pack-1382206.9227.71227.7
栄逊dx.com/en/p/dc-power-converter-module-for-electronic-diy-2192322,375.9175.9

合蚈1933.8

Source: https://habr.com/ru/post/J208466/


All Articles