{"id":290091,"date":"2018-09-29T15:50:02","date_gmt":"2018-09-29T11:50:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=290091"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=290091","title":{"rendered":"\u041c\u0430\u0448\u0438\u043d\u043a\u0430 \u043d\u0430 Arduino, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u0430\u044f Android-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c \u043f\u043e Bluetooth, \u2014 \u043a\u043e\u0434 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u043c\u043a (\u0447\u0430\u0441\u0442\u044c 2)"},"content":{"rendered":"\n<div class=\"post__text post__text-html js-mediator-article\">\n<h2>\u041e \u043f\u0435\u0440\u0432\u044b\u0439 \u0447\u0430\u0441\u0442\u0438<\/h2>\n<p>  \u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u044f \u043e\u043f\u0438\u0441\u0430\u043b \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0438 \u043b\u0438\u0448\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043a\u0443\u0441\u043e\u043a \u043a\u043e\u0434\u0430. \u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u0443\u044e \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0443\u044e \u2014 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f Android \u0438 \u0441\u043a\u0435\u0442\u0447 Arduino. <\/p>\n<p>  \u0412\u043d\u0430\u0447\u0430\u043b\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430, \u0430 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043e\u0441\u0442\u0430\u0432\u043b\u044e \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u0446\u0435\u043b\u0438\u043a\u043e\u043c + \u0432\u0438\u0434\u0435\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0432\u0430\u0441 <s>\u0440\u0430\u0437\u043e\u0447\u0430\u0440\u043e\u0432\u0430\u0442\u044c<\/s> \u043e\u0431\u043e\u0434\u0440\u0438\u0442\u044c.<br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h2>Android-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435<\/h2>\n<p>  \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0434\u043b\u044f \u0430\u043d\u0434\u0440\u043e\u0438\u0434\u0430 \u0440\u0430\u0437\u0431\u0438\u0442\u0430 \u043d\u0430 \u0434\u0432\u0435 \u0447\u0430\u0441\u0442\u0438: \u043f\u0435\u0440\u0432\u0430\u044f \u2014 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043f\u043e Bluetooth, \u0432\u0442\u043e\u0440\u0430\u044f \u2014 \u0434\u0436\u043e\u0439\u0441\u0442\u0438\u043a \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f. <br \/>  \u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0430\u044e \u2014 \u0434\u0438\u0437\u0430\u0439\u043d \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u043f\u0440\u043e\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b\u0441\u044f \u0438 \u0434\u0435\u043b\u0430\u043b\u0441\u044f \u043d\u0430 \u0442\u044f\u043f-\u043b\u044f\u043f, \u043b\u0438\u0448\u044c \u0431\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e. \u0410\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0438 UX \u043d\u0435 \u0436\u0434\u0438\u0442\u0435, \u043d\u043e \u0432\u044b\u043b\u0435\u0437\u0430\u0442\u044c \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u044d\u043a\u0440\u0430\u043d\u0430 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e. <\/p>\n<h3>\u0412\u0435\u0440\u0441\u0442\u043a\u0430<\/h3>\n<p>  \u0421\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u044f \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u043d\u0430 \u0432\u0435\u0440\u0441\u0442\u043a\u0435, \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b: \u043a\u043d\u043e\u043f\u043a\u0438 \u0438 layout \u0434\u043b\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432. \u041a\u043d\u043e\u043f\u043a\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0441 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u043c Bluetooth. \u0412 ListView \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0442\u0441\u044f \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430.<\/p>\n<pre><code class=\"xml\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt; &lt;RelativeLayout xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"     xmlns:tools=\"http:\/\/schemas.android.com\/tools\"     android:layout_width=\"match_parent\"     android:layout_height=\"match_parent\"     &gt;       &lt;Button         android:layout_width=\"wrap_content\"         android:layout_height=\"60dp\"         android:layout_alignParentStart=\"true\"         android:layout_alignParentTop=\"true\"         android:layout_marginStart=\"40dp\"         android:layout_marginTop=\"50dp\"         android:text=\"@string\/start_search\"         android:id=\"@+id\/button_start_find\"          \/&gt;     &lt;Button         android:layout_width=\"wrap_content\"         android:layout_height=\"60dp\"         android:layout_marginEnd=\"16dp\"         android:layout_marginBottom=\"16dp\"         android:id=\"@+id\/button_start_control\"         android:text=\"@string\/start_control\"         android:layout_alignParentBottom=\"true\"         android:layout_alignParentEnd=\"true\"\/&gt;      &lt;ListView         android:id=\"@+id\/list_device\"         android:layout_width=\"300dp\"         android:layout_height=\"200dp\"         android:layout_marginEnd=\"10dp\"         android:layout_marginTop=\"10dp\"         android:layout_alignParentEnd=\"true\"         android:layout_alignParentTop=\"true\"         \/&gt;  &lt;\/RelativeLayout&gt; <\/code><\/pre>\n<p>  \u042d\u043a\u0440\u0430\u043d \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0432\u0435\u0440\u0441\u0442\u043a\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043d\u043e\u043f\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0441\u0442\u0430\u043d\u0435\u0442 \u0434\u0436\u043e\u0439\u0441\u0442\u0438\u043a\u043e\u043c. \u041a \u043a\u043d\u043e\u043f\u043a\u0438, \u0447\u0435\u0440\u0435\u0437 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 background, \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0435\u043d \u0441\u0442\u0438\u043b\u044c, \u0434\u0435\u043b\u0430\u044e\u0449\u0438\u0439 \u0435\u0435 \u043a\u0440\u0443\u0433\u043b\u043e\u0439. <br \/>  TextView \u0432 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u043d\u043e \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043e\u043d \u0431\u044b\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438: \u0432\u044b\u0432\u043e\u0434\u0438\u043b\u0438\u0441\u044c \u0446\u0438\u0444\u0440\u044b, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0435 \u043f\u043e \u0431\u043b\u044e\u0442\u0443\u0437\u0443. \u041d\u0430 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0441\u043e\u0432\u0435\u0442\u0443\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c. \u041d\u043e \u043f\u043e\u0442\u043e\u043c \u0446\u0438\u0444\u0440\u044b \u043d\u0430\u0447\u043d\u0443\u0442 \u0432\u044b\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a TextView.<\/p>\n<pre><code class=\"xml\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt; &lt;RelativeLayout     xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"      android:layout_width=\"match_parent\"     android:layout_height=\"match_parent\"&gt;      &lt;Button         android:layout_width=\"200dp\"         android:layout_height=\"200dp\"         android:layout_alignParentStart=\"true\"         android:layout_alignParentBottom=\"true\"         android:layout_marginBottom=\"25dp\"         android:layout_marginStart=\"15dp\"         android:id=\"@+id\/button_drive_control\"         android:background=\"@drawable\/button_control_circle\" \/&gt;      &lt;TextView         android:layout_height=\"wrap_content\"         android:layout_width=\"wrap_content\"         android:layout_alignParentEnd=\"true\"         android:layout_alignParentTop=\"true\"         android:minWidth=\"70dp\"         android:id=\"@+id\/view_result_touch\"         android:layout_marginEnd=\"90dp\"         \/&gt; &lt;\/RelativeLayout&gt; <\/code><\/pre>\n<p>  \u0424\u0430\u0439\u043b button_control_circle.xml (\u0441\u0442\u0438\u043b\u044c), \u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043f\u0430\u043f\u043a\u0443 drawable:  <\/p>\n<pre><code class=\"xml\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt; &lt;shape xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"     android:shape=\"rectangle\"&gt;     &lt;solid android:color=\"#00F\" \/&gt;     &lt;corners android:bottomRightRadius=\"100dp\"         android:bottomLeftRadius=\"100dp\"         android:topRightRadius=\"100dp\"         android:topLeftRadius=\"100dp\"\/&gt; &lt;\/shape&gt; <\/code><\/pre>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0444\u0430\u0439\u043b item_device.xml, \u043e\u043d \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441\u043f\u0438\u0441\u043a\u0430:  <\/p>\n<pre><code class=\"xml\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt; &lt;LinearLayout     xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"     android:layout_width=\"match_parent\"     android:layout_height=\"match_parent\"&gt;     &lt;TextView         android:layout_width=\"150dp\"         android:layout_height=\"40dp\"         android:id=\"@+id\/item_device_textView\"\/&gt; &lt;\/LinearLayout&gt; <\/code><\/pre>\n<p>  <\/p>\n<h3>\u041c\u0430\u043d\u0438\u0444\u0435\u0441\u0442<\/h3>\n<p>  \u041d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430. \u041d\u0443\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0431\u043b\u044e\u0442\u0443\u0437\u0443 \u0447\u0435\u0440\u0435\u0437 uses-permission \u0438 \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0432\u0442\u043e\u0440\u0443\u044e \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0442\u0435\u0433 activity.   <\/p>\n<pre><code class=\"xml\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt; &lt;manifest xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"     package=\"com.example.bluetoothapp\"&gt;      &lt;uses-permission android:name=\"android.permission.BLUETOOTH\" \/&gt;     &lt;uses-permission android:name=\"android.permission.BLUETOOTH_ADMIN\" \/&gt;     &lt;application         android:allowBackup=\"true\"         android:icon=\"@mipmap\/ic_launcher\"         android:label=\"@string\/app_name\"         android:roundIcon=\"@mipmap\/ic_launcher_round\"         android:supportsRtl=\"true\"         android:theme=\"@style\/AppTheme\"&gt;          &lt;activity android:name=\"com.arproject.bluetoothworkapp.MainActivity\"             android:theme=\"@style\/Theme.AppCompat.NoActionBar\"             android:screenOrientation=\"landscape\"&gt;             &lt;intent-filter&gt;                 &lt;action android:name=\"android.intent.action.MAIN\" \/&gt;                  &lt;category android:name=\"android.intent.category.LAUNCHER\" \/&gt;             &lt;\/intent-filter&gt;         &lt;\/activity&gt;         &lt;activity android:name=\"com.arproject.bluetoothworkapp.ActivityControl\"             android:theme=\"@style\/Theme.AppCompat.NoActionBar\"             android:screenOrientation=\"landscape\"\/&gt;     &lt;\/application&gt;  &lt;\/manifest&gt; <\/code><\/pre>\n<p>  <\/p>\n<h3>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c, \u0441\u043e\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u0435 Arduino \u0438 Android<\/h3>\n<p>  \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u043a\u043b\u0430\u0441\u0441 \u043e\u0442 AppCompatActivity \u0438 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435:  <\/p>\n<pre><code class=\"java\">public class MainActivity extends AppCompatActivity {         private BluetoothAdapter bluetoothAdapter;         private ListView listView;         private ArrayList&lt;String&gt; pairedDeviceArrayList;         private ArrayAdapter&lt;String&gt; pairedDeviceAdapter;         public static BluetoothSocket clientSocket;         private Button buttonStartControl; } <\/code><\/pre>\n<p>  \u041c\u0435\u0442\u043e\u0434 onCreate() \u043e\u043f\u0438\u0448\u0443 \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u043e:  <\/p>\n<pre><code class=\"java\">@Override protected void onCreate(Bundle savedInstanceState) {      super.onCreate(savedInstanceState); \/\/\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u0447\u043a\u0430      \/\/\u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u044f\u0435\u043c \u0440\u0430\u043d\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u0443\u044e \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0443      setContentView(R.layout.activity_main);       \/\/\u0446\u0435\u043f\u043b\u044f\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 \u0438\u0437 \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0438                Button buttonStartFind = (Button) findViewById(R.id.button_start_find);       \/\/\u0446\u0435\u043f\u043b\u044f\u0435\u043c layout, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430      listView = (ListView) findViewById(R.id.list_device);              \/\/\u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043d\u0430 \u043a\u043b\u0438\u043a                                                                                 buttonStartFind.setOnClickListener(new View.OnClickListener() {                                                                                                                @Override          public void onClick(View v) {              \/\/\u0435\u0441\u043b\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u044b (\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0438\u0436\u0435)              if(permissionGranted()) {                 \/\/\u0430\u0434\u0430\u043f\u0442\u0435\u0440 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u043b\u044e\u0442\u0443\u0437\u043e\u043c                 bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();                  if(bluetoothEnabled()) { \/\/\u0435\u0441\u043b\u0438 \u0431\u043b\u044e\u0442\u0443\u0437 \u0432\u043a\u043b\u044e\u0447\u0435\u043d (\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0438\u0436\u0435)                     findArduino(); \/\/\u043d\u0430\u0447\u0430\u0442\u044c \u043f\u043e\u0438\u0441\u043a \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 (\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0438\u0436\u0435)                   }               }          }     });       \/\/\u0446\u0435\u043f\u043b\u044f\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043a \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044e      buttonStartControl = (Button) findViewById(R.id.button_start_control);       buttonStartControl.setOnClickListener(new View.OnClickListener() {          @Override          public void onClick(View v) {                 \/\/\u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043d\u043e\u0432\u044b\u0445 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0435\u0439                 Intent intent = new Intent();                  \/\/\u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u0441 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c\u044e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f                 intent.setClass(getApplicationContext(), ActivityControl.class);                 \/\/\u0437\u0430\u043a\u0440\u044b\u0442\u044c \u044d\u0442\u0443 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c, \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u044d\u043a\u0440\u0430\u043d \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f                 startActivity(intent);           }      });   } <\/code><\/pre>\n<p>  \u041d\u0438\u0436\u0435\u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043e \u043b\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u043b\u044e\u0442\u0443\u0437\u0430 (\u0431\u0435\u0437 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043c\u044b \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435) \u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d \u043b\u0438 \u0431\u043b\u044e\u0442\u0443\u0437:  <\/p>\n<pre><code class=\"java\">private boolean permissionGranted() {      \/\/\u0435\u0441\u043b\u0438 \u043e\u0431\u0430 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c true      if (ContextCompat.checkSelfPermission(getApplicationContext(),           Manifest.permission.BLUETOOTH) == PermissionChecker.PERMISSION_GRANTED &amp;&amp;           ContextCompat.checkSelfPermission(getApplicationContext(),                   Manifest.permission.BLUETOOTH_ADMIN) == PermissionChecker.PERMISSION_GRANTED) {           return true;      } else {           ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.BLUETOOTH,                   Manifest.permission.BLUETOOTH_ADMIN}, 0);           return false;      }  }    private boolean bluetoothEnabled() { \/\/\u0435\u0441\u043b\u0438 \u0431\u043b\u044e\u0442\u0443\u0437 \u0432\u043a\u043b\u044e\u0447\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c true, \u0435\u0441\u043b\u0438 \u043d\u0435\u0442, \u0432\u0435\u0436\u043b\u0438\u0432\u043e \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0435\u0433\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c      if(bluetoothAdapter.isEnabled()) {          return true;      } else {          Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);          startActivityForResult(enableBtIntent, 0);          return false;      }  } <\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u044b, \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0438\u0441\u043a \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. \u0415\u0441\u043b\u0438 \u043e\u0434\u043d\u043e \u0438\u0437 \u0443\u0441\u043b\u043e\u0432\u0438\u0439 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e, \u0442\u043e \u0432\u044b\u0441\u0432\u0435\u0442\u0438\u0442\u0441\u044f \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435, \u043c\u043e\u043b, \u00ab\u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u0435\\\u0432\u043a\u043b\u044e\u0447\u0438\u0442\u0435?\u00bb, \u0438 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c\u0441\u044f, \u043f\u043e\u043a\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u0430. <br \/>  \u041f\u043e\u0438\u0441\u043a \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430 \u0442\u0440\u0438 \u0447\u0430\u0441\u0442\u0438: \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0441\u043f\u0438\u0441\u043a\u0430, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c.   <\/p>\n<pre><code class=\"java\">private void findArduino() {    \/\/\u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432     Set&lt;BluetoothDevice&gt; pairedDevice = bluetoothAdapter.getBondedDevices();      if (pairedDevice.size() &gt; 0) { \/\/\u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0445\u043e\u0442\u044c \u043e\u0434\u043d\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e    pairedDeviceArrayList = new ArrayList&lt;&gt;(); \/\/\u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a    for(BluetoothDevice device: pairedDevice) {         \/\/\u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430        \/\/\u0444\u043e\u0440\u043c\u0430\u0442: \"\u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441\/\u0438\u043c\u044f\"        pairedDeviceArrayList.add(device.getAddress() + \"\/\" + device.getName());        }     }     \/\/\u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u0443, \u043f\u0440\u0438\u0433\u043e\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0440\u0430\u043d\u0435\u0435 item_device.xml     pairedDeviceAdapter = new ArrayAdapter&lt;String&gt;(getApplicationContext(), R.layout.item_device, R.id.item_device_textView, pairedDeviceArrayList);      listView.setAdapter(pairedDeviceAdapter);     \/\/\u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u0435\u0448\u0430\u0435\u043c \u0441\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u044c     listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {     @Override     public void onItemClick(AdapterView&lt;?&gt; adapterView, View view, int i, long l) {          \/\/\u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0441\u0442\u044b\u043b\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0430\u0434\u0440\u0435\u0441           String itemMAC =  listView.getItemAtPosition(i).toString().split(\"\/\", 2)[0];         \/\/\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u043b\u0430\u0441\u0441 \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043e\u0431 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435         BluetoothDevice connectDevice = bluetoothAdapter.getRemoteDevice(itemMAC);         try {             \/\/\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c socket - \u043f\u043e\u0442\u043e\u043a, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0441\u044b\u043b\u0430\u0442\u044c\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435             Method m = connectDevice.getClass().getMethod(                  \"createRfcommSocket\", new Class[]{int.class});             clientSocket = (BluetoothSocket) m.invoke(connectDevice, 1);            clientSocket.connect();            if(clientSocket.isConnected()) {                 \/\/\u0435\u0441\u043b\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e, \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u043c \u043f\u043e\u0438\u0441\u043a                bluetoothAdapter.cancelDiscovery();                  }            } catch(Exception e) {                  e.getStackTrace();              }           }      });  } <\/code><\/pre>\n<p>  \u041a\u043e\u0433\u0434\u0430 Bluetooth-\u043c\u043e\u0434\u0443\u043b\u044c, \u043f\u043e\u0432\u0435\u0448\u0435\u043d\u043d\u044b\u0439 \u043d\u0430 Arduino (\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u0435), \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u043e\u043d \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0432 \u0441\u043f\u0438\u0441\u043a\u0435. \u041d\u0430\u0436\u0430\u0432 \u043d\u0430 \u043d\u0435\u0433\u043e, \u0432\u044b \u043d\u0430\u0447\u043d\u0435\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 socket (\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043f\u043e\u0441\u043b\u0435 \u043a\u043b\u0438\u043a\u0430 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u043e\u0436\u0434\u0430\u0442\u044c 3-5 \u0441\u0435\u043a\u0443\u043d\u0434 \u0438\u043b\u0438 \u043d\u0430\u0436\u0430\u0442\u044c \u0435\u0449\u0435 \u0440\u0430\u0437). \u0412\u044b \u043f\u043e\u0439\u043c\u0435\u0442\u0435, \u0447\u0442\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e, \u043f\u043e \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u0430\u043c \u043d\u0430 Bluetooth-\u043c\u043e\u0434\u0443\u043b\u0435: \u0431\u0435\u0437 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043e\u043d\u0438 \u043c\u0438\u0433\u0430\u044e\u0442 \u0431\u044b\u0441\u0442\u0440\u043e, \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0447\u0430\u0441\u0442\u043e\u0442\u0430 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442\u0441\u044f. <br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/hg\/ok\/nf\/hgoknf_kwj_yobhcauvx_9lwf1o.png\">  <\/p>\n<h3>\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043a\u043e\u043c\u0430\u043d\u0434<\/h3>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e, \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043a\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u2014 ActivityControl. \u041d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0438\u043d\u0438\u0439 \u043a\u0440\u0443\u0436\u043e\u043a \u2014 \u0434\u0436\u043e\u0439\u0441\u0442\u0438\u043a. \u0421\u0434\u0435\u043b\u0430\u043d \u043e\u043d \u0438\u0437 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 Button, \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0430 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0430 \u0432\u044b\u0448\u0435.   <\/p>\n<pre><code class=\"java\">public class ActivityControl extends AppCompatActivity {     \/\/\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f     private Button buttonDriveControl;     private float BDCheight, BDCwidth;     private float centerBDCheight, centerBDCwidth;     private String angle = \"90\"; \/\/0, 30, 60, 90, 120, 150, 180     private ConnectedThread threadCommand;     private long lastTimeSendCommand = System.currentTimeMillis(); } <\/code><\/pre>\n<p>  \u0412 \u043c\u0435\u0442\u043e\u0434\u0435 onCreate() \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u0441\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u043e:<\/p>\n<pre><code class=\"java\">\/\/\u0431\u0435\u0437 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0441\u0442\u0443\u0434\u0438\u044f \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434 performClick() \/\/\u043d\u0430\u043c \u043e\u043d\u043e \u043d\u0435 \u043d\u0435\u0434\u043e @SuppressLint(\"ClickableViewAccessibility\")  @Override protected void onCreate(Bundle savedInstanceState) {     \/\/\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430     super.onCreate(savedInstanceState);     \/\/\u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0443, \u0435\u0435 \u043a\u043e\u0434 \u0432\u044b\u0448\u0435     setContentView(R.layout.activity_control);          \/\/\u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443     buttonDriveControl = (Button) findViewById(R.id.button_drive_control);     \/\/\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043a\u043d\u043e\u043f\u043a\u0435      final ViewTreeObserver vto = buttonDriveControl.getViewTreeObserver();     vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {             @Override             public void onGlobalLayout() {                 \/\/\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u044b\u0441\u043e\u0442\u0443 \u0438 \u0448\u0438\u0440\u0438\u043d\u0443 \u043a\u043d\u043e\u043f\u043a\u0438 \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u0445(!)                 BDCheight = buttonDriveControl.getHeight();                 BDCwidth = buttonDriveControl.getWidth();                 \/\/\u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0446\u0435\u043d\u0442\u0440 \u043a\u043d\u043e\u043f\u043a\u0438 \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u0445(!)                 centerBDCheight = BDCheight\/2;                 centerBDCwidth = BDCwidth\/2;                 \/\/\u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u043c GlobalListener, \u043e\u043d \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f                  buttonDriveControl.getViewTreeObserver().removeOnGlobalLayoutListener(this);             }         });         \/\/\u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043b\u0438\u0441\u0442\u0435\u043d\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043b\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043a\u043e\u0441\u043d\u043e\u0432\u0435\u043d\u0438\u044f          \/\/\u0435\u0433\u043e \u043a\u043e\u0434 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043d\u0438\u0436\u0435         buttonDriveControl.setOnTouchListener(new ControlDriveInputListener());         \/\/\u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u0442\u043e\u043a, \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043d\u044f\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445         \/\/\u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0441\u043e\u043a\u0435\u0442, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438          \/\/\u043a\u043e\u0434 \u043f\u043e\u0442\u043e\u043a\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043d\u0438\u0436\u0435         threadCommand = new ConnectedThread(MainActivity.clientSocket);         threadCommand.run();     } <\/code><\/pre>\n<p>  \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 (!) \u2014 \u043c\u044b \u0443\u0437\u043d\u0430\u0435\u043c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0430. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c: \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u043d\u043e\u043f\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0432\u0438\u0441\u0435\u0442\u044c \u043e\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u043a\u0440\u0430\u043d\u0430, \u043d\u043e \u0432\u0435\u0441\u044c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u0434 \u043b\u0435\u0433\u043a\u043e \u043f\u043e\u0434 \u044d\u0442\u043e \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u044b \u043d\u0435 \u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0437\u0430\u0440\u0430\u043d\u0435\u0435. \u041f\u043e\u0437\u0436\u0435 \u043d\u0430\u0443\u0447\u0438\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0443\u0437\u043d\u0430\u0432\u0430\u0442\u044c, \u0432 \u043a\u0430\u043a\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0431\u044b\u043b\u043e \u043a\u0430\u0441\u0430\u043d\u0438\u0435, \u0430 \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u044c \u044d\u0442\u043e \u0432 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0435 \u0434\u043b\u044f \u0430\u0440\u0434\u0443\u0438\u043d\u043a\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0442 0 \u0434\u043e 255 (\u0432\u0435\u0434\u044c \u043a\u0430\u0441\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432 456 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u0445 \u043e\u0442 \u0446\u0435\u043d\u0442\u0440\u0430, \u0430 \u041c\u041a \u0441 \u0442\u0430\u043a\u0438\u043c \u0447\u0438\u0441\u043b\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442). <\/p>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043a\u043e\u0434 ControlDriveInputListener(), \u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 \u0441\u0430\u043c\u043e\u0439 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438, \u043f\u043e\u0441\u043b\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 onCreate(). \u041d\u0430\u0445\u043e\u0434\u044f\u0441\u044c \u0432 \u0444\u0430\u0439\u043b\u0435 ActivityControl, \u043a\u043b\u0430\u0441\u0441 ControlDriveInputListener \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u043c, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0438\u043c\u0435\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a\u043e \u0432\u0441\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430. <\/p>\n<p>  \u041d\u0435 \u043e\u0431\u0440\u0430\u0449\u0430\u0439\u0442\u0435 \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438. \u0421\u0435\u0439\u0447\u0430\u0441 \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u0441\u0430\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u0442\u043b\u0430\u0432\u043b\u0438\u0432\u0430\u043d\u0438\u044f \u043a\u0430\u0441\u0430\u043d\u0438\u0439: \u0432 \u043a\u0430\u043a\u0443\u044e \u0442\u043e\u0447\u043a\u0443 \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b \u043f\u0430\u043b\u0435\u0446 \u0438 \u043a\u0430\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u044b \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u043c. <\/p>\n<p>  \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u043a\u043b\u0430\u0441\u0441 java.util.Timer: \u043e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u0442\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u0441\u044f \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0440\u0430\u0437 \u0447\u0435\u0440\u0435\u0437 \u043a\u0430\u0436\u0434\u043e\u0435 \u044d\u043d\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0441\u0435\u043a\u0443\u043d\u0434. \u0415\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438: \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b \u043f\u0430\u043b\u0435\u0446, \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043c\u0435\u0442\u043e\u0434 ACTION_DOWN, \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043f\u043e\u0448\u043b\u0430 \u043d\u0430 \u0430\u0440\u0434\u0443\u0438\u043d\u043a\u0443, \u0430 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u0440\u0435\u0448\u0438\u043b \u043d\u0435 \u0441\u0434\u0432\u0438\u0433\u0430\u0442\u044c \u043f\u0430\u043b\u0435\u0446, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0435\u0433\u043e \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442. \u0412\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0437 \u043c\u0435\u0442\u043e\u0434 ACTION_DOWN \u043d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0442\u0430\u043a \u043a\u0430\u043a \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c ACTION_UP (\u043e\u0442\u043e\u0434\u0440\u0430\u0442\u044c \u043f\u0430\u043b\u0435\u0446 \u043e\u0442 \u044d\u043a\u0440\u0430\u043d\u0430). <\/p>\n<p>  \u0427\u0442\u043e\u0436, \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0446\u0438\u043a\u043b \u043a\u043b\u0430\u0441\u0441\u0430 Timer() \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u043a\u0430\u0436\u0434\u044b\u0435 10 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u0435 \u0436\u0435 \u0441\u0430\u043c\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435. \u041a\u043e\u0433\u0434\u0430 \u0436\u0435 \u043f\u0430\u043b\u0435\u0446 \u0431\u0443\u0434\u0435\u0442 \u0441\u0434\u0432\u0438\u043d\u0443\u0442 (\u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 ACTION_MOVE) \u0438\u043b\u0438 \u043f\u043e\u0434\u043d\u044f\u0442 (ACTION_UP), \u0446\u0438\u043a\u043b Timer \u043d\u0430\u0434\u043e \u0443\u0431\u0438\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0442 \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043d\u0435 \u043d\u0430\u0447\u0430\u043b\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0441\u043d\u043e\u0432\u0430. <\/p>\n<pre><code class=\"java\">public class ControlDriveInputListener implements View.OnTouchListener {     private Timer timer;      @Override     public boolean onTouch(View view, MotionEvent motionEvent) {      \/\/\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u043e\u0447\u043a\u0438 \u043a\u0430\u0441\u0430\u043d\u0438\u044f \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u0445       \/\/\u043e\u0442\u0441\u0447\u0435\u0442 \u0432\u0435\u0434\u0435\u0442\u0441\u044f \u043e\u0442 \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e \u0443\u0433\u043b\u0430 (!)      final float x = motionEvent.getX();      final float y = motionEvent.getY();        \/\/\u0443\u0437\u043d\u0430\u0435\u043c, \u043a\u0430\u043a\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e       switch(motionEvent.getAction()) {           \/\/\u0435\u0441\u043b\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0435            \/\/\u043e\u043d\u043e \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432\u0441\u0435\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u0434\u043e\u0442\u0440\u043e\u043d\u0435\u0442\u0435\u0441\u044c \u0434\u043e \u043a\u043d\u043e\u043f\u043a\u0438            case MotionEvent.ACTION_DOWN:                 \/\/\u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0442\u0430\u0439\u043c\u0435\u0440                 timer = new Timer();                 \/\/\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0446\u0438\u043a\u043b                 \/\/\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442: \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0432\u0442\u043e\u0440\u0430\u043c\u0438 0,                                    \/\/\u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0435 10 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434                 timer.schedule(new TimerTask() {                     @Override                      public void run() {                            \/\/\u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0438\u0436\u0435                             calculateAndSendCommand(x, y);                      }                  }, 0, 10);                  break;             \/\/\u0435\u0441\u043b\u0438 \u043f\u0430\u043b\u0435\u0446 \u0431\u044b\u043b \u0441\u0434\u0432\u0438\u043d\u0443\u0442 (\u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435 ACTION_DOWN)             case MotionEvent.ACTION_MOVE:                 \/\/\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e (!)                 \/\/\u0435\u0441\u043b\u0438 \u0440\u0430\u043d\u0435\u0435 \u0431\u044b\u043b \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u0446\u0438\u043a\u043b Timer(), \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u043c \u0435\u0433\u043e                 if(timer != null) {                      timer.cancel();                      timer = null;                  }                  \/\/\u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u0446\u0438\u043a\u043b                  timer = new Timer();                  \/\/\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u0442\u043e\u0439 \u0436\u0435 \u0447\u0430\u0441\u0442\u043e\u0442\u043e\u0439, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 ACTION_UP                  timer.schedule(new TimerTask() {                      @Override                      public void run() {                          calculateAndSendCommand(x, y);                      }                  }, 0, 10);                  break;             \/\/\u0435\u0441\u043b\u0438 \u043f\u0430\u043b\u0435\u0446 \u0443\u0431\u0440\u0430\u043b\u0438 \u0441 \u044d\u043a\u0440\u0430\u043d\u0430             case MotionEvent.ACTION_UP:                  \/\/\u0443\u0431\u0438\u0432\u0430\u0435\u043c \u0446\u0438\u043a\u043b                  if(timer != null) {                      timer.cancel();                      timer = null;                  }                 break;          }         return false;     } } <\/code><\/pre>\n<p>  \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0435\u0449\u0435 \u0440\u0430\u0437 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u043e\u0442\u0441\u0447\u0435\u0442 x \u0438 y \u043c\u0435\u0442\u043e\u0434 onTouch() \u0432\u0435\u0434\u0435\u0442 \u043e\u0442 \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e \u0443\u0433\u043b\u0430 View. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0442\u043e\u0447\u043a\u0430 (0; 0) \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0443 Button \u0442\u0443\u0442:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/7m\/yt\/on\/7mytonhvh6albac02enghpbmce0.png\"><\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0443\u0437\u043d\u0430\u043b\u0438, \u043a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0430\u043b\u044c\u0446\u0430 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0438, \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c\u0441\u044f, \u043a\u0430\u043a \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0438\u043a\u0441\u0435\u043b\u0438 (\u0432\u0435\u0434\u044c x \u0438 y \u2014 \u0438\u043c\u0435\u043d\u043d\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u0445) \u0432 \u0440\u0430\u0431\u043e\u0447\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u043c\u0435\u0442\u043e\u0434 calculateAndSendCommand(x, y), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 ControlDriveInputListener. \u0422\u0430\u043a\u0436\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b, \u0438\u0445 \u043f\u0438\u0448\u0435\u043c \u0432 \u044d\u0442\u043e\u0442 \u0436\u0435 \u043a\u043b\u0430\u0441\u0441 \u043f\u043e\u0441\u043b\u0435 calculateAndSendCommand(x, y).  <\/p>\n<pre><code class=\"java\">private void calculateAndSendCommand(float x, float y) {             \/\/\u0432\u0441\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0438\u0436\u0435             \/\/\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u0443\u0436\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f                          \/\/\u0447\u0435\u0442\u0432\u0435\u0440\u0442\u044c - 1, 2, 3, 4              \/\/\u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u043e \u0447\u0435\u043c \u044f, \u043f\u0440\u043e\u0432\u0435\u0434\u0438\u0442\u0435 \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443 \u043a\u043d\u043e\u043f\u043a\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b              \/\/\u0438 \u0434\u0430, \u0434\u0430\u043b\u044c\u0448\u0435 \u043e\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435 \u0431\u0443\u0434\u0435\u0442, \u043d\u043e \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u043f\u0440\u0438\u0433\u043e\u0436\u0434\u0430\u043b\u043e\u0441\u044c             int quarter = identifyQuarter(x, y);              \/\/\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435 \u043e\u0442 \u0446\u0435\u043d\u0442\u0440\u0430 \u0432 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c            \/\/\u0432\u044b\u0447\u0438\u0442\u0430\u0435\u043c y, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u043e\u0442 \u0446\u0435\u043d\u0442\u0440\u0430 \u043a\u043d\u043e\u043f\u043a\u0438             int speed = speedCalculation(centerBDCheight - y);            \/\/\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0443\u0433\u043e\u043b \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430             \/\/\u0432\u0441\u043f\u043e\u043c\u043d\u0438\u0442\u0435 \u043f\u0435\u0440\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u0438, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c 7 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0443\u0433\u043b\u0430              String angle = angleCalculation(x);        \/\/\u0435\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043d\u0430 \u044d\u043a\u0440\u0430\u043d, \u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u044d\u0442\u043e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431       \/\/\u043d\u043e \u0432 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043e\u043d \u043d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0442\u0430\u043a \u043a\u0430\u043a \u0437\u0430\u0442\u0440\u0430\u0433\u0438\u0432\u0430\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a       \/*String resultDown = \"x: \"+ Float.toString(x) + \" y: \" + Float.toString(y)                + \" qr: \" + Integer.toString(quarter) + \"\\n\"                + \"height: \" + centerBDCheight + \" width: \" + centerBDCwidth + \"\\n\"                + \"speed: \" + Integer.toString(speed) + \" angle: \" + angle; *\/       \/\/viewResultTouch.setText(resultDown);              \/\/\u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435, \u043c\u043e\u0436\u043d\u043e \u0438\u0445 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c             \/\/\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0441\u0442\u043e\u0438\u0442\u044c \u043d\u0435 \u0447\u0430\u0449\u0435 (\u0438 \u043d\u0435 \u0440\u0435\u0436\u0435), \u0447\u0435\u043c \u0432 100 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434             if((System.currentTimeMillis() - lastTimeSendCommand) &gt; 100) {                 \/\/\u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0434\u0430\u043b\u044c\u0448\u0435                 threadCommand.sendCommand(Integer.toString(speed), angle);                 \/\/\u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445                 lastTimeSendCommand = System.currentTimeMillis();             }         }          private int identifyQuarter(float x, float y) {             \/\/\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0430 \u0442\u043e\u0447\u043a\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0446\u0435\u043d\u0442\u0440\u0430             \/\/\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0443\u0433\u043e\u043b             if(x &gt; centerBDCwidth &amp;&amp; y &gt; centerBDCheight) {             return 4;               } else if (x &lt; centerBDCwidth &amp;&amp; y &gt;centerBDCheight) {                 return 3;                 } else if (x &lt; centerBDCwidth &amp;&amp; y &lt; centerBDCheight) {                 return 2;                  } else if (x &gt; centerBDCwidth &amp;&amp; y &lt; centerBDCheight) {                 return 1;             }             return 0;         }          private int speedCalculation(float deviation) {             \/\/\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442             \/\/\u043e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u043f\u0438\u043a\u0441\u0435\u043b\u0438 \u0432 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c              float coefficient = 255\/(BDCheight\/2);             \/\/\u0432\u044b\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u043e \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0443              \/\/\u043e\u043a\u0440\u0443\u0433\u043b\u044f\u0435\u043c \u0432 \u0446\u0435\u043b\u043e\u0435              int speed = Math.round(deviation * coefficient);              \/\/\u0435\u0441\u043b\u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435 \u043c\u0435\u043d\u044c\u0448\u0435 70, \u0441\u0442\u0430\u0432\u0438\u043c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043d\u043e\u043b\u044c             \/\/\u044d\u0442\u043e \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u0437\u0430\u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c, \u043d\u043e \u043d\u0435 \u0435\u0445\u0430\u0442\u044c             if(speed &gt; 0 &amp;&amp; speed &lt; 70) speed = 0;             if(speed &lt; 0 &amp;&amp; speed &gt; - 70)  speed = 0;             \/\/\u043d\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430 \u043e\u0442\u0441\u044b\u043b\u0430\u0442\u044c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043d\u0438\u0436\u0435 120             \/\/\u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u0430\u043b\u043e, \u043a\u043e\u043b\u0435\u0441\u0430 \u043d\u0435 \u043d\u0430\u0447\u043d\u0443\u0442 \u043a\u0440\u0443\u0442\u0438\u0442\u044c\u0441\u044f             if(speed &lt; 120 &amp;&amp; speed &gt; 70) speed = 120;             if(speed &gt; -120 &amp;&amp; speed &lt; -70) speed = -120;             \/\/\u0435\u0441\u043b\u0438 \u0432\u044b \u0443\u043d\u0435\u0441\u0435\u0442\u0435 \u043f\u0430\u043b\u0435\u0446 \u0437\u0430 \u043a\u043d\u043e\u043f\u043a\u0443, ACTION_MOVE \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u0435             \/\/\u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0432 \u043a\u043d\u043e\u043f\u043a\u0435             \/\/\u043d\u0430 \u044d\u0442\u043e\u0442 \u0441\u043b\u0443\u0447\u0430\u0439 \u043d\u0443\u0436\u043d\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c             if(speed &gt; 255 ) speed = 255;             if(speed &lt; - 255) speed = -255;             \/\/\u043f\u043e\u043c\u0435\u0442\u043a\u0430: \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c &gt; 0 - \u0434\u0432\u0438\u0436\u0435\u043c\u0441\u044f \u0432\u043f\u0435\u0440\u0435\u0434, &lt; 0 - \u043d\u0430\u0437\u0430\u0434             return speed;         }          private String angleCalculation(float x) {             \/\/\u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c \u0448\u0438\u0440\u0438\u043d\u0443 \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0430 7 \u0447\u0430\u0441\u0442\u0435\u0439             \/\/0 - \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0432\u043b\u0435\u0432\u043e, 180 - \u0432\u043f\u0440\u0430\u0432\u043e             \/\/90 - \u044d\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u044f\u043c\u043e             if(x &lt; BDCwidth\/6) {                 angle = \"0\";             } else if (x &gt; BDCwidth\/6 &amp;&amp; x &lt; BDCwidth\/3) {                 angle = \"30\";             } else if (x &gt; BDCwidth\/3 &amp;&amp; x &lt; BDCwidth\/2) {                 angle = \"60\";             } else if (x &gt; BDCwidth\/2 &amp;&amp; x &lt; BDCwidth\/3*2) {                 angle = \"120\";             } else if (x &gt; BDCwidth\/3*2 &amp;&amp; x &lt; BDCwidth\/6*5) {                 angle = \"150\";             } else if (x &gt; BDCwidth\/6*5 &amp;&amp; x &lt; BDCwidth) {                 angle = \"180\";             } else {                 angle = \"90\";             }             return angle;         } <\/code><\/pre>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043d\u044b \u0438 \u043f\u0435\u0440\u0435\u0432\u0435\u0434\u0435\u043d\u044b, \u0432 \u0438\u0433\u0440\u0443 \u0432\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u0442\u043e\u043a. \u041e\u043d \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u0437\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438. \u041d\u0435\u043b\u044c\u0437\u044f \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0431\u0435\u0437 \u043d\u0435\u0433\u043e, \u0438\u043d\u0430\u0447\u0435 \u0441\u043e\u043a\u0435\u0442, \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0449\u0438\u0439 \u0434\u0430\u043d\u043d\u044b\u0435, \u0431\u0443\u0434\u0435\u0442 \u0442\u043e\u0440\u043c\u043e\u0437\u0438\u0442\u044c \u043e\u0442\u043b\u0430\u0432\u043b\u0438\u0432\u0430\u043d\u0438\u0435 \u043a\u0430\u0441\u0430\u043d\u0438\u0439, \u0441\u043e\u0437\u0434\u0430\u0441\u0442\u0441\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438 \u0432\u0441\u0435 \u043a\u043e\u043d\u0435\u0446 \u0432\u0441\u0435\u043c\u0443 \u043a\u043e\u0440\u043e\u0447\u0435. <br \/>  \u041a\u043b\u0430\u0441\u0441 ConnectedThread \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 ActivityControl. <\/p>\n<pre><code class=\"java\">private class ConnectedThread extends Thread {         private final BluetoothSocket socket;         private final OutputStream outputStream;          public ConnectedThread(BluetoothSocket btSocket) {             \/\/\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043e\u043a\u0435\u0442             this.socket = btSocket;             \/\/\u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0441\u0442\u0440\u0438\u043c - \u043d\u0438\u0442\u044c \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0430\u0440\u0434\u0443\u0438\u043d\u043e              OutputStream os = null;             try {                 os = socket.getOutputStream();             } catch(Exception e) {}             outputStream = os;         }          public void run() {          }          public void sendCommand(String speed, String angle) {             \/\/\u0431\u043b\u044e\u0442\u0443\u0437 \u0443\u043c\u0435\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u0430\u0439\u0442\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u043c             byte[] speedArray = speed.getBytes();             byte[] angleArray = angle.getBytes();             \/\/\u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f   \/\/\u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0432\u044b \u043f\u043e\u0439\u043c\u0435\u0442\u0435, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u0441\u043a\u0435\u0442\u0447\u0430 \u0430\u0440\u0434\u0443\u0438\u043d\u043e             String a = \"#\";             String b = \"@\";             String c = \"*\";              try {                 outputStream.write(b.getBytes());                 outputStream.write(speedArray);                 outputStream.write(a.getBytes());                  outputStream.write(c.getBytes());                 outputStream.write(angleArray);                 outputStream.write(a.getBytes());             } catch(Exception e) {}         }      } <\/code><\/pre>\n<p>  <\/p>\n<h3>\u041f\u043e\u0434\u0432\u043e\u0434\u0438\u043c \u0438\u0442\u043e\u0433\u0438 \u0410\u043d\u0434\u0440\u043e\u0438\u0434-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h3>\n<p>  \u041a\u043e\u0440\u043e\u0442\u043a\u043e \u043e\u0431\u043e\u0431\u0449\u0443 \u0432\u0441\u0435 \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u043e\u0435 \u0432\u044b\u0448\u0435\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435.<\/p>\n<ol>\n<li> \u0412 ActivityMain \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u0431\u043b\u044e\u0442\u0443\u0437, \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435. <\/li>\n<li> \u0412 ActivityControl \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u043d\u0435\u0439. <\/li>\n<li> \u0412\u0435\u0448\u0430\u0435\u043c \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 OnTouchListener, \u043e\u043d \u043e\u0442\u043b\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043a\u0430\u0441\u0430\u043d\u0438\u0435, \u043f\u0435\u0440\u0435\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u0438 \u043f\u043e\u0434\u044a\u0435\u043c \u043f\u0430\u043b\u044c\u0446\u0430. <\/li>\n<li> \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u0442\u043e\u0447\u043a\u0443 \u0441 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438 x \u0438 y) \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0432 \u0443\u0433\u043e\u043b \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c <\/li>\n<li> \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435, \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044f \u0438\u0445 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u043a\u0430\u043c\u0438 <\/li>\n<\/ol>\n<p>  \u0410 \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043a \u0432\u0430\u043c \u043f\u0440\u0438\u0434\u0435\u0442, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0432\u0435\u0441\u044c \u043a\u043e\u0434 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u2014 <a href=\"https:\/\/github.com\/IDolgopolov\/BluetoothWorkAPP.git\">github.com\/IDolgopolov\/BluetoothWorkAPP.git<\/a>. \u0422\u0430\u043c \u043a\u043e\u0434 \u0431\u0435\u0437 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0441\u044f \u043a\u0443\u0434\u0430 \u0447\u0438\u0449\u0435, \u043c\u0435\u043d\u044c\u0448\u0435 \u0438 \u043f\u0440\u043e\u0449\u0435.  <\/p>\n<h2>\u0421\u043a\u0435\u0442\u0447 Arduino<\/h2>\n<p>  \u0410\u043d\u0434\u0440\u043e\u0438\u0434-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u043e, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e, \u043f\u043e\u043d\u044f\u0442\u043e\u2026 \u0430 \u0442\u0443\u0442 \u0443\u0436\u0435 \u0438 \u043f\u043e\u043f\u0440\u043e\u0449\u0435 \u0431\u0443\u0434\u0435\u0442. \u041f\u043e\u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u043f\u043e\u044d\u0442\u0430\u043f\u043d\u043e \u0432\u0441\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0430 \u043f\u043e\u0442\u043e\u043c \u0434\u0430\u043c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043f\u043e\u043b\u043d\u044b\u0439 \u0444\u0430\u0439\u043b.   <\/p>\n<h3>\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435<\/h3>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f.   <\/p>\n<pre><code>#include &lt;SoftwareSerial.h&gt; \/\/\u043f\u0435\u0440\u0435\u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0435\u043c \u043f\u0438\u043d\u044b \u0432\u0445\u043e\u0434\u0430\\\u0432\u044b\u0432\u043e\u0434\u0430 \u0431\u043b\u044e\u0442\u0443\u0437\u0430 \/\/\u043d\u0435 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0432\u044b\u043d\u0438\u043c\u0430\u0442\u044c \u0435\u0433\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043b\u0438\u0432\u043a\u0438 \u0441\u043a\u0435\u0442\u0447\u0430 \u043d\u0430 \u043f\u043b\u0430\u0442\u0443 SoftwareSerial BTSerial(8, 9);  \/\/\u043f\u0438\u043d\u044b \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 int speedRight = 6; int dirLeft = 3; int speedLeft = 11; int dirRight = 7;  \/\/\u043f\u0438\u043d\u044b \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044f, \u043f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u043a\u043e\u043b\u0435\u0441\u0430 int angleDirection = 4; int angleSpeed = 5;  \/\/\u043f\u0438\u043d, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d \u043f\u043b\u044e\u0441 \u0448\u0442\u0443\u043a\u0438, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0435\u0439 \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \/\/\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0430\u044f \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 int pinAngleStop = 12;  \/\/\u0441\u044e\u0434\u0430 \u0431\u0443\u0434\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f String val; \/\/\u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 int speedTurn = 180; \/\/\u043f\u0438\u043d\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442 \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \/\/\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 int pinRed = A0; int pinWhite = A1; int pinBlack = A2;  \/\/\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0434\u043b\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0438 long lastTakeInformation; \/\/\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0435, \u0447\u0442\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f boolean readAngle = false; boolean readSpeed = false; <\/code><\/pre>\n<p>  <\/p>\n<h3>\u041c\u0435\u0442\u043e\u0434 setup()<\/h3>\n<p>  \u0412 \u043c\u0435\u0442\u043e\u0434\u0435 setup() \u043c\u044b \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u0438\u043d\u043e\u0432: \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u043d\u0438 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0438\u043b\u0438 \u0432\u044b\u0445\u043e\u0434. \u0422\u0430\u043a\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430 \u0441 \u0430\u0440\u0434\u0443\u0438\u043d\u043a\u043e\u0439, \u0431\u043b\u044e\u0442\u0443\u0437\u0430 \u0441 \u0430\u0440\u0434\u0443\u0438\u043d\u043a\u043e\u0439.   <\/p>\n<pre><code>void setup() {       pinMode(dirLeft, OUTPUT);   pinMode(speedLeft, OUTPUT);      pinMode(dirRight, OUTPUT);   pinMode(speedRight, OUTPUT);      pinMode(pinRed, INPUT);   pinMode(pinBlack, INPUT);   pinMode(pinWhite, INPUT);    pinMode(pinAngleStop, OUTPUT);    pinMode(angleDirection, OUTPUT);   pinMode(angleSpeed, OUTPUT);    \/\/\u0434\u0430\u043d\u043d\u0430\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0438 HC-05   \/\/\u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043c\u043e\u0434\u0443\u043b\u044c \u0434\u0440\u0443\u0433\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438, \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e   BTSerial.begin(38400);    \/\/\u044d\u0442\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430    Serial.begin(9600); } <\/code><\/pre>\n<p>  <\/p>\n<h3>\u041c\u0435\u0442\u043e\u0434 loop() \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/h3>\n<p>  \u0412 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0435\u043c\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u0435 loop() \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u0430 \u043f\u043e\u0442\u043e\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432 \u043d\u0435\u043c.  <\/p>\n<pre><code> void loop() {   \/\/\u0435\u0441\u043b\u0438 \u0445\u043e\u0442\u044c \u043d\u0435\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0435 \u0431\u0430\u0439\u0442\u044b   if(BTSerial.available() &gt; 0) {      \/\/\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043d\u0435\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0439 \u0431\u0430\u0439\u0442      char a = BTSerial.read();           if (a == '@') {       \/\/\u0435\u0441\u043b\u0438 \u043e\u043d \u0440\u0430\u0432\u0435\u043d @ (\u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u043c\u043d\u043e\u044e \u0441\u0438\u043c\u0432\u043e\u043b)       \/\/\u043e\u0431\u043d\u0443\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e val       val = \"\";       \/\/\u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u0447\u0442\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c       readSpeed = true;      } else if (readSpeed) {       \/\/\u0435\u0441\u043b\u0438 \u043f\u043e\u0440\u0430 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0438 \u0431\u0430\u0439\u0442 \u043d\u0435 \u0440\u0430\u0432\u0435\u043d \u0440\u0435\u0448\u0435\u0442\u043a\u0435       \/\/\u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0431\u0430\u0439\u0442 \u043a val       if(a == '#') {         \/\/\u0435\u0441\u043b\u0438 \u0431\u0430\u0439\u0442 \u0440\u0430\u0432\u0435\u043d \u0440\u0435\u0448\u0435\u0442\u043a\u0435, \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043a\u043e\u043d\u0447\u0438\u043b\u0438\u0441\u044c         \/\/\u0432\u044b\u0432\u043e\u0434\u0438\u043c \u0432 \u043c\u043e\u043d\u0438\u0442\u043e\u0440 \u043f\u043e\u0440\u0442\u0430 \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438         Serial.println(val);         \/\/\u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u0447\u0442\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c         readSpeed = false;         \/\/\u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0443\u044e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0435\u0437\u0434\u044b          go(val.toInt());         \/\/\u043e\u0431\u043d\u0443\u043b\u044f\u0435\u043c val         val = \"\";         \/\/\u0432\u044b\u0445\u043e\u0434\u0438\u043c \u0438\u0437 \u0446\u0438\u043a\u043b\u0430, \u0447\u0442\u043e\u0431\u044b \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0431\u0430\u0439\u0442         return;       }       val+=a;     } else if (a == '*') {       \/\/\u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0443\u0433\u043e\u043b \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430       readAngle = true;      } else if (readAngle) {       \/\/\u0435\u0441\u043b\u0438 \u0440\u0435\u0448\u0435\u0442\u043a\u0430, \u0442\u043e \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u043c \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0443\u0433\u043e\u043b       \/\/\u043f\u043e\u043a\u0430 \u043d\u0435 \u0440\u0435\u0448\u0435\u0442\u043a\u0430, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a val       if(a == '#') {        Serial.println(val);        Serial.println(\"-----\");         readAngle = false;         \/\/\u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430         turn(val.toInt());         val= \"\";         return;       }       val+=a;     }     \/\/\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043f\u0440\u0438\u0435\u043c\u0430 \u0434\u0430\u043d\u043d\u044b\u0445     lastTakeInformation = millis();   } else {      \/\/\u0435\u0441\u043b\u0438 \u043d\u0435\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0445 \u0431\u0430\u0439\u0442\u043e\u0432 \u043d\u0435\u0442, \u0438 \u0438\u0445 \u043d\u0435 \u0431\u044b\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u0435 150 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434       \/\/\u0433\u043b\u0443\u0448\u0438\u043c \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u0438      if(millis() - lastTakeInformation &gt; 150) {      lastTakeInformation = 0;      analogWrite(angleSpeed, 0);      analogWrite(speedRight, 0);      analogWrite(speedLeft, 0);      }         } } <\/code><\/pre>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442: \u0441 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0431\u0430\u0439\u0442\u044b \u0432 \u0441\u0442\u0438\u043b\u0435 &#171;@\u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c#\u0443\u0433\u043e\u043b#&#187; (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0438\u043f\u0438\u0447\u043d\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 &#171;@200#60#&#187;. \u0414\u0430\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 100 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430 \u0430\u043d\u0434\u0440\u043e\u0438\u0434\u0435 \u043c\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438 \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u043a \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043a\u043e\u043c\u0430\u043d\u0434. \u041a\u043e\u0440\u043e\u0447\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0438 \u043d\u0430\u0447\u043d\u0443\u0442 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0430 \u0435\u0441\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u043b\u0438\u043d\u043d\u0435\u0435, \u0442\u043e \u043a\u043e\u043b\u0435\u0441\u0430 \u043d\u0430\u0447\u043d\u0443\u0442 \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u0440\u044b\u0432\u043a\u0430\u043c\u0438. <\/p>\n<p>  \u0412\u0441\u0435 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 delay(), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u0434\u0430\u043b\u0435\u0435, \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u043d\u044b \u043d\u0435 \u0447\u0435\u0440\u0435\u0437 \u0444\u0438\u0437\u0438\u043a\u043e-\u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f, \u0430 \u043e\u043f\u044b\u0442\u043d\u044b\u043c \u043f\u0443\u0442\u0435\u043c. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0432\u0441\u0435\u043c \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u043c \u0437\u0430\u0434\u0440\u0435\u0436\u0430\u043c, \u043c\u0430\u0448\u0438\u043d\u043a\u0430 \u0435\u0434\u0435\u0442 \u043f\u043b\u0430\u0432\u043d\u043e, \u0438 \u0443 \u0432\u0441\u0435\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 \u0435\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u043a\u0443 (\u0442\u043e\u043a\u0438 \u0443\u0441\u043f\u0435\u0432\u0430\u044e\u0442 \u043f\u0440\u043e\u0431\u0435\u0436\u0430\u0442\u044c\u0441\u044f).<\/p>\n<p>  \u0412 \u0446\u0438\u043a\u043b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u0432\u0435 \u043f\u043e\u0431\u043e\u0447\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043e\u043d\u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u043c\u0430\u0448\u0438\u043d\u043a\u0443 \u0435\u0445\u0430\u0442\u044c \u0438 \u043a\u0440\u0443\u0442\u0438\u0442\u0441\u044f.   <\/p>\n<pre><code>void go(int mySpeed) {   \/\/\u0435\u0441\u043b\u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 0   if(mySpeed &gt; 0) {   \/\/\u0435\u0434\u0435\u043c \u0432\u043f\u0435\u0440\u0435\u0434   digitalWrite(dirRight, HIGH);   analogWrite(speedRight, mySpeed);   digitalWrite(dirLeft, HIGH);   analogWrite(speedLeft, mySpeed);   } else {     \/\/\u0430 \u0435\u0441\u043b\u0438 \u043c\u0435\u043d\u044c\u0448\u0435 0, \u0442\u043e \u043d\u0430\u0437\u0430\u0434     digitalWrite(dirRight, LOW);     analogWrite(speedRight, abs(mySpeed) + 30);     digitalWrite(dirLeft, LOW);      analogWrite(speedLeft, abs(mySpeed) + 30);   }   delay(10);   }  void turn(int angle) {   \/\/\u043f\u043e\u0434\u0430\u0435\u043c \u0442\u043e\u043a \u043d\u0430 \u043f\u043b\u044e\u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044f \u0443\u0433\u043b\u0430   digitalWrite(pinAngleStop, HIGH);   \/\/\u0434\u0430\u0435\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443, \u0447\u0442\u043e\u0431\u044b \u0442\u043e\u043a \u0443\u0441\u043f\u0435\u043b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f   delay(5);      \/\/\u0435\u0441\u043b\u0438 \u0443\u0433\u043e\u043b 150 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435, \u043f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u043f\u0440\u0430\u0432\u043e    \/\/\u0435\u0441\u043b\u0438 30 \u0438 \u043c\u0435\u043d\u044c\u0448\u0435, \u0442\u043e \u0432\u043b\u0435\u0432\u043e    \/\/\u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u043a \u043e\u0442 31 \u0434\u043e 149 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0434\u043b\u044f \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u044f\u043c\u043e   if(angle &gt; 149) {         \/\/\u0435\u0441\u043b\u0438 \u0437\u0430\u043c\u043a\u043d\u0443\u0442 \u0431\u0435\u043b\u044b\u0439, \u043d\u043e \u0440\u0430\u0437\u043e\u043c\u043a\u043d\u0443\u0442\u044b  \u0447\u0435\u0440\u043d\u044b\u0439 \u0438 \u043a\u0440\u0430\u0441\u043d\u044b\u0439         \/\/\u0437\u043d\u0430\u0447\u0438\u0442 \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0443\u0442\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0434\u0430\u043b\u044c\u0448\u0435 \u043a\u0440\u0443\u0442\u0438\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f         \/\/\u0432\u044b\u0445\u043e\u0434\u0438\u043c \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 return          if( digitalRead(pinWhite) == HIGH &amp;&amp; digitalRead(pinBlack) == LOW &amp;&amp; digitalRead(pinRed) == LOW) {           return;         }         \/\/\u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0443\u0433\u043e\u043b \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u0430         \/\/\u043a\u0440\u0443\u0442\u0438\u043c \u043a\u043e\u043b\u0435\u0441\u0430         digitalWrite(angleDirection, HIGH);         analogWrite(angleSpeed, speedTurn);   } else if (angle &lt; 31) {          if(digitalRead(pinRed) == HIGH &amp;&amp; digitalRead(pinBlack) == HIGH &amp;&amp; digitalRead(pinWhite) == HIGH) {           return;         }         digitalWrite(angleDirection, LOW);         analogWrite(angleSpeed, speedTurn);   }   \/\/\u0443\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0438\u0442\u0430\u043d\u0438\u0435    digitalWrite(pinAngleStop, LOW);   delay(5); } <\/code><\/pre>\n<p>  \u041f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u0430\u043d\u0434\u0440\u043e\u0438\u0434 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0437\u0430\u0436\u0430\u043b \u0443\u0433\u043e\u043b 60, 90, 120, \u043d\u0435 \u0441\u0442\u043e\u0438\u0442, \u0438\u043d\u0430\u0447\u0435 \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0435\u0445\u0430\u0442\u044c \u043f\u0440\u044f\u043c\u043e. \u0414\u0430, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u043d\u0435 \u0441\u0442\u043e\u0438\u043b\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441 \u0430\u043d\u0434\u0440\u043e\u0438\u0434\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043d\u0430 \u043f\u043e\u0432\u043e\u0440\u043e\u0442, \u0435\u0441\u043b\u0438 \u0443\u0433\u043e\u043b \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u0430\u043b, \u043d\u043e \u044d\u0442\u043e \u043a\u0430\u043a-\u0442\u043e \u043a\u043e\u0440\u044f\u0432\u043e \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434.   <\/p>\n<h3>\u0418\u0442\u043e\u0433\u0438 \u0441\u043a\u0435\u0442\u0447\u0430<\/h3>\n<p>  \u0423 \u0441\u043a\u0435\u0442\u0447\u0430 \u0432\u0441\u0435\u0433\u043e \u0442\u0440\u0438 \u0432\u0430\u0436\u043d\u044b\u0445 \u044d\u0442\u0430\u043f\u0430: \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u0438 \u043f\u043e\u0434\u0430\u0447\u0430 \u0442\u043e\u043a\u0430 \u043d\u0430 \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u0438. \u0412\u0441\u0435, \u0437\u0432\u0443\u0447\u0438\u0442 \u043f\u0440\u043e\u0441\u0442\u043e, \u0434\u0430 \u0438 \u0432 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043b\u0435\u0433\u0447\u0435 \u0447\u0435\u043c \u043b\u0435\u0433\u043a\u043e, \u0445\u043e\u0442\u044f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u043e\u0441\u044c \u0434\u043e\u043b\u0433\u043e \u0438 \u0441 \u0437\u0430\u0442\u0443\u043f\u0430\u043c\u0438. \u041f\u043e\u043b\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0441\u043a\u0435\u0442\u0447\u0430 \u2014 <a href=\"https:\/\/github.com\/IDolgopolov\/AgroArduinoF\">github.com\/IDolgopolov\/AgroArduinoF<\/a>.  <\/p>\n<h2>\u0412 \u043a\u043e\u043d\u0446\u0435 \u043a\u043e\u043d\u0446\u043e\u0432<\/h2>\n<p>  \u041f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u0430\u044f \u043e\u043f\u0438\u0441\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043c\u0435\u0441\u044f\u0446\u0435\u0432 \u0440\u0430\u0431\u043e\u0442\u044b \u043e\u043a\u043e\u043d\u0447\u0435\u043d\u0430. \u0424\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u0430, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u0430\u044f \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435. \u041f\u0440\u0438\u043d\u0446\u0438\u043f \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u0442 \u0436\u0435 \u2014 \u043e\u0431\u0440\u0430\u0449\u0430\u0439\u0442\u0435\u0441\u044c \u043f\u043e \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u044b\u043c \u044f\u0432\u043b\u0435\u043d\u0438\u044f\u043c, \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0435. <br \/>  \u0410 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u043f\u043e\u0434 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b, \u043d\u0430\u0441\u043e\u0432\u0435\u0442\u043e\u0432\u0430\u043b\u0438 \u0433\u043e\u0440\u0443 \u043f\u043e\u043b\u0435\u0437\u043d\u0435\u0439\u0448\u0438\u0445 \u0441\u043e\u0432\u0435\u0442\u043e\u0432, <u>\u0441\u043f\u0430\u0441\u0438\u0431\u043e<\/u> \u043a\u0430\u0436\u0434\u043e\u043c\u0443.  <\/p>\n<h3>\u0412\u0438\u0434\u0435\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430<\/h3>\n<p>  <\/p>\n<div class=\"oembed\">\n<div>\n<div style=\"left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.2493%;\"><iframe src=\"https:\/\/www.youtube.com\/embed\/tRlm48wx9-Q?rel=0&amp;showinfo=1&amp;hl=en-US\" style=\"border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;\" allowfullscreen scrolling=\"no\"><\/iframe><\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>        <script class=\"js-mediator-script\">!function(e){function t(t,n){if(!(n in e)){for(var r,a=e.document,i=a.scripts,o=i.length;o--;)if(-1!==i[o].src.indexOf(t)){r=i[o];break}if(!r){r=a.createElement(\"script\"),r.type=\"text\/javascript\",r.async=!0,r.defer=!0,r.src=t,r.charset=\"UTF-8\";var d=function(){var e=a.getElementsByTagName(\"script\")[0];e.parentNode.insertBefore(r,e)};\"[object Opera]\"==e.opera?a.addEventListener?a.addEventListener(\"DOMContentLoaded\",d,!1):e.attachEvent(\"onload\",d):d()}}}t(\"\/\/mediator.mail.ru\/script\/2820404\/\",\"_mediator\")}(window);<\/script>     <br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/post\/424813\/\"> https:\/\/habr.com\/post\/424813\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html js-mediator-article\">\n<h2>\u041e \u043f\u0435\u0440\u0432\u044b\u0439 \u0447\u0430\u0441\u0442\u0438<\/h2>\n<p>  \u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u044f \u043e\u043f\u0438\u0441\u0430\u043b \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0438 \u043b\u0438\u0448\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043a\u0443\u0441\u043e\u043a \u043a\u043e\u0434\u0430. \u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u0443\u044e \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0443\u044e \u2014 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f Android \u0438 \u0441\u043a\u0435\u0442\u0447 Arduino. <\/p>\n<p>  \u0412\u043d\u0430\u0447\u0430\u043b\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430, \u0430 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043e\u0441\u0442\u0430\u0432\u043b\u044e \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u0446\u0435\u043b\u0438\u043a\u043e\u043c + \u0432\u0438\u0434\u0435\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0432\u0430\u0441 <s>\u0440\u0430\u0437\u043e\u0447\u0430\u0440\u043e\u0432\u0430\u0442\u044c<\/s> \u043e\u0431\u043e\u0434\u0440\u0438\u0442\u044c.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-290091","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/290091","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=290091"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/290091\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=290091"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=290091"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=290091"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}