рдПрдХ Arduino- рдЖрдзрд╛рд░рд┐рдд рдорд╢реАрди рдЬреЛ рдмреНрд▓реВрдЯреВрде рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдПрдВрдбреНрд░реЙрдЗрдб рдбрд┐рд╡рд╛рдЗрд╕ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рд╣реЛрддреА рд╣реИ - рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдФрд░ рдПрдордХреЗ (рднрд╛рдЧ 2)

рдкрд╣рд▓реЗ рднрд╛рдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ


рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ, рдореИрдВрдиреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рднреМрддрд┐рдХ рднрд╛рдЧ рдФрд░ рдХреЛрдб рдХреЗ рдПрдХ рдЫреЛрдЯреЗ рдЯреБрдХрдбрд╝реЗ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ред рдЕрдм рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдШрдЯрдХ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ - рдПрдХ Android рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рдПрдХ Arduino рд╕реНрдХреЗрдЪред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдкреНрд░рддреНрдпреЗрдХ рдкрд▓ рдХрд╛ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рджреВрдВрдЧрд╛, рдФрд░ рдЕрдВрдд рдореЗрдВ рдореИрдВ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдкреВрд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ + рд╡реАрдбрд┐рдпреЛ рд╕реЗ рд▓рд┐рдВрдХ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛, рдЬрд┐рд╕рд╕реЗ рдЖрдкрдХреЛ рдирд┐рд░рд╛рд╢ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдПрдВрдбреНрд░реЙрдЗрдб рдРрдк


рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдкрд╣рд▓рд╛ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдмреНрд▓реВрдЯреВрде рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░ рд░рд╣рд╛ рд╣реИ, рджреВрд╕рд░рд╛ рдирд┐рдпрдВрддреНрд░рдг рдЬреЙрдпрд╕реНрдЯрд┐рдХ рд╣реИред

рдореИрдВ рдЖрдкрдХреЛ рдЪреЗрддрд╛рд╡рдиреА рджреЗрддрд╛ рд╣реВрдВ - рдЖрд╡реЗрджрди рдХреЗ рдбрд┐рдЬрд╛рдЗрди рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдПрдХ рдЧрдбрд╝рдЧрдбрд╝рд╛рд╣рдЯ рдкрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЕрдЧрд░ рдХреЗрд╡рд▓ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЕрдиреБрдХреВрд▓рди рдХреНрд╖рдорддрд╛ рдФрд░ UX рдкреНрд░рддреАрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕реНрдХреНрд░реАрди рд╕реЗ рдмрд╛рд╣рд░ рд░реЗрдВрдЧрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдПред

рдореЗрдХрдЕрдк


рдЧрддрд┐рд╡рд┐рдзрд┐ рд╢реБрд░реВ рдХрд░рдирд╛ рд▓реЗрдЖрдЙрдЯ, рддрддреНрд╡реЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ: рдЙрдкрдХрд░рдгреЛрдВ рдХреА рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП рдмрдЯрди рдФрд░ рд▓реЗрдЖрдЙрдЯред рдмрдЯрди рд╕рдХреНрд░рд┐рдп рдмреНрд▓реВрдЯреВрде рдХреЗ рд╕рд╛рде рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред ListView рдкрд╛рдпрд╛ рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред

<?xml version="1.0" encoding="utf-8"?> <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" > <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" /> <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"/> <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" /> </RelativeLayout> 

рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдХреНрд░реАрди рдПрдХ рд▓реЗрдЖрдЙрдЯ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдмрдЯрди рд╣реИ, рдЬреЛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЬреЙрдпрд╕реНрдЯрд┐рдХ рдмрди рдЬрд╛рдПрдЧрд╛ред рдПрдХ рдмрдЯрди рдкреГрд╖реНрдарднреВрдорд┐ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрдЯрди рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдпрд╣ рдЧреЛрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
TextView рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛: рдмреНрд▓реВрдЯреВрде рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреЗрдЬреЗ рдЧрдП рдирдВрдмрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдП рдЧрдП рдереЗред рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЪрд░рдг рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рддрдм рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рдЧрдгрдирд╛ рдПрдХ рдЕрд▓рдЧ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдХреА рдЬрд╛рдиреЗ рд▓рдЧреЗрдЧреА рдЬрд╣рд╛рдБ рд╕реЗ TextView рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <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" /> <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" /> </RelativeLayout> 

Button_control_circle.xml рдлрд╝рд╛рдЗрд▓ (рд╢реИрд▓реА), рдЗрд╕реЗ рдбреНрд░рд╛ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <solid android:color="#00F" /> <corners android:bottomRightRadius="100dp" android:bottomLeftRadius="100dp" android:topRightRadius="100dp" android:topLeftRadius="100dp"/> </shape> 

рдЖрдкрдХреЛ item_device.xml рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рд╕реВрдЪреА рдЖрдЗрдЯрдо рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="150dp" android:layout_height="40dp" android:id="@+id/item_device_textView"/> </LinearLayout> 

рдШреЛрд╖рдгрд╛рдкрддреНрд░


рдмрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рдкреВрд░реНрдг рдкреНрд░рдХрдЯ рдХреЛрдб рджреЗ рджреВрдВрдЧрд╛ред рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧ-рдЕрдиреБрдорддрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмреНрд▓реВрдЯреВрде рддрдХ рдкреВрд░реНрдг рдкрд╣реБрдВрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдЧрддрд┐рд╡рд┐рдзрд┐ рдЯреИрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреВрд╕рд░реА рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛ред

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.bluetoothapp"> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <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"> <activity android:name="com.arproject.bluetoothworkapp.MainActivity" android:theme="@style/Theme.AppCompat.NoActionBar" android:screenOrientation="landscape"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.arproject.bluetoothworkapp.ActivityControl" android:theme="@style/Theme.AppCompat.NoActionBar" android:screenOrientation="landscape"/> </application> </manifest> 

рдореБрдЦреНрдп рдЧрддрд┐рд╡рд┐рдзрд┐, Arduino рдФрд░ Android рдХреА рдЬреЛрдбрд╝реА


рд╣рдо AppCompatActivity рд╕реЗ рд╡рд░реНрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

 public class MainActivity extends AppCompatActivity { private BluetoothAdapter bluetoothAdapter; private ListView listView; private ArrayList<String> pairedDeviceArrayList; private ArrayAdapter<String> pairedDeviceAdapter; public static BluetoothSocket clientSocket; private Button buttonStartControl; } 

рдореИрдВ рдСрдирдХреНрд░рд┐рдПрдЯ () рд╡рд┐рдзрд┐ рд▓рд╛рдЗрди рдХрд╛ рд╡рд░реНрдгрди рд▓рд╛рдЗрди рд╕реЗ рдХрд░реВрдВрдЧрд╛:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //  //    setContentView(R.layout.activity_main); //    Button buttonStartFind = (Button) findViewById(R.id.button_start_find); // layout,       listView = (ListView) findViewById(R.id.list_device); //    buttonStartFind.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //   ( ) if(permissionGranted()) { //    bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if(bluetoothEnabled()) { //   ( ) findArduino(); //   ( ) } } } }); //      buttonStartControl = (Button) findViewById(R.id.button_start_control); buttonStartControl.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //     Intent intent = new Intent(); //    intent.setClass(getApplicationContext(), ActivityControl.class); //  ,    startActivity(intent); } }); } 

рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдпрд╣ рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдмреНрд▓реВрдЯреВрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдкреНрд░рд╛рдкреНрдд рдХреА рдЧрдИ рд╣реИ (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдЕрдиреБрдорддрд┐ рдХреЗ рдмрд┐рдирд╛ рд╣рдо рдбреЗрдЯрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗ) рдФрд░ рдХреНрдпрд╛ рдмреНрд▓реВрдЯреВрде рдЪрд╛рд▓реВ рд╣реИ:

 private boolean permissionGranted() { //   ,  true if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.BLUETOOTH) == PermissionChecker.PERMISSION_GRANTED && 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() { //  ,  true,  ,      if(bluetoothAdapter.isEnabled()) { return true; } else { Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, 0); return false; } } 

рдпрджрд┐ рд╕рднреА рдЬрд╛рдВрдЪреЗрдВ рдкрд╛рд╕ рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ, рддреЛ рдбрд┐рд╡рд╛рдЗрд╕ рдЦреЛрдЬ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред рдпрджрд┐ рдХрд┐рд╕реА рдПрдХ рд╢рд░реНрдд рдХреЛ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдЧреА, рдЬрд┐рд╕рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛, "allow \ enable?", рдФрд░ рдпрд╣ рддрдм рддрдХ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдЪреЗрдХ рдкрд╛рд╕ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ред

рдбрд┐рд╡рд╛рдЗрд╕ рдЦреЛрдЬ рдХреЛ рддреАрди рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рд╕реВрдЪреА рддреИрдпрд╛рд░ рдХрд░рдирд╛, рдкрд╛рдП рдЧрдП рдЙрдкрдХрд░рдгреЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝рдирд╛, рдЪрдпрдирд┐рдд рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд╕рд╛рде рд╕рдВрдмрдВрдз рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ред

 private void findArduino() { //    Set<BluetoothDevice> pairedDevice = bluetoothAdapter.getBondedDevices(); if (pairedDevice.size() > 0) { //     pairedDeviceArrayList = new ArrayList<>(); //  for(BluetoothDevice device: pairedDevice) { //      //: " /" pairedDeviceArrayList.add(device.getAddress() + "/" + device.getName()); } } //  ,    item_device.xml pairedDeviceAdapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.item_device, R.id.item_device_textView, pairedDeviceArrayList); listView.setAdapter(pairedDeviceAdapter); //      listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { //    String itemMAC = listView.getItemAtPosition(i).toString().split("/", 2)[0]; //      BluetoothDevice connectDevice = bluetoothAdapter.getRemoteDevice(itemMAC); try { // socket - ,      Method m = connectDevice.getClass().getMethod( "createRfcommSocket", new Class[]{int.class}); clientSocket = (BluetoothSocket) m.invoke(connectDevice, 1); clientSocket.connect(); if(clientSocket.isConnected()) { //  ,   bluetoothAdapter.cancelDiscovery(); } } catch(Exception e) { e.getStackTrace(); } } }); } 

рдЬрдм рдПрдХ рдмреНрд▓реВрдЯреВрде рдореЙрдбреНрдпреВрд▓ Arduino (рдЗрд╕ рдкрд░ рдмрд╛рдж рдореЗрдВ) рдореЗрдВ рд▓рдЯрдХрд╛ рд╣реБрдЖ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕реВрдЪреА рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред рдЙрд╕ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ, рдЖрдк рдПрдХ рд╕реЙрдХреЗрдЯ рдмрдирд╛рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ (рдЖрдкрдХреЛ рдПрдХ рдХреНрд▓рд┐рдХ рдХреЗ рдмрд╛рдж 3-5 рд╕реЗрдХрдВрдб рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдлрд┐рд░ рд╕реЗ рдХреНрд▓рд┐рдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛)ред рдЖрдк рд╕рдордЭреЗрдВрдЧреЗ рдХрд┐ рдХрдиреЗрдХреНрд╢рди рдмреНрд▓реВрдЯреВрде рдореЙрдбреНрдпреВрд▓ рдкрд░ рдПрд▓ рдИ рдбреА рджреНрд╡рд╛рд░рд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдПрдХ рдХрдиреЗрдХреНрд╢рди рдХреЗ рдмрд┐рдирд╛, рд╡реЗ рдЬрд▓реНрджреА рд╕реЗ рдЭрдкрдХреА рд▓реЗрддреЗ рд╣реИрдВ, рдЕрдЧрд░ рдХреЛрдИ рдХрдиреЗрдХреНрд╢рди рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЖрд╡реГрддреНрддрд┐ рдмрд┐рд▓реНрдХреБрд▓ рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИред


рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░реЗрдВ рдФрд░ рдХрдорд╛рдВрдб рднреЗрдЬреЗрдВ


рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рджреВрд╕рд░реА рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ - рдПрдХреНрдЯрд┐рд╡рд┐рдЯреАрдХрдВрдЯреНрд░реЛрд▓ред рд╕реНрдХреНрд░реАрди рдкрд░ рдХреЗрд╡рд▓ рдПрдХ рдиреАрд▓рд╛ рд╕рд░реНрдХрд▓ рд╣реЛрдЧрд╛ - рдЬреЙрдпрд╕реНрдЯрд┐рдХред рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдмрдЯрди рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдорд╛рд░реНрдХрдЕрдк рдКрдкрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

 public class ActivityControl extends AppCompatActivity { //,   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(); } 

рдСрдирдХреНрд░рд┐рдПрдЯ () рд╡рд┐рдзрд┐ рдореЗрдВ, рд╕рднреА рдореБрдЦреНрдп рдХреНрд░рд┐рдпрд╛ рд╣реЛрддреА рд╣реИ:

 //        performClick() //    @SuppressLint("ClickableViewAccessibility") @Override protected void onCreate(Bundle savedInstanceState) { //  super.onCreate(savedInstanceState); // ,    setContentView(R.layout.activity_control); //  buttonDriveControl = (Button) findViewById(R.id.button_drive_control); //    final ViewTreeObserver vto = buttonDriveControl.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { //      (!) BDCheight = buttonDriveControl.getHeight(); BDCwidth = buttonDriveControl.getWidth(); //    (!) centerBDCheight = BDCheight/2; centerBDCwidth = BDCwidth/2; // GlobalListener,     buttonDriveControl.getViewTreeObserver().removeOnGlobalLayoutListener(this); } }); // ,     //    buttonDriveControl.setOnTouchListener(new ControlDriveInputListener()); //  ,      //    ,     //    threadCommand = new ConnectedThread(MainActivity.clientSocket); threadCommand.run(); } 

рдзреНрдпрд╛рди рджреЗрдВ (!) - рд╣рдореЗрдВ рдкрддрд╛ рдЪрд▓реЗрдЧрд╛ рдХрд┐ рдмрдЯрди рдХрд┐рддрдиреЗ рдкрд┐рдХреНрд╕реЗрд▓ рдкрд░ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╣рдореЗрдВ рдЕрдиреБрдХреВрд▓рдирд╢реАрд▓рддрд╛ рдорд┐рд▓рддреА рд╣реИ: рдмрдЯрди рдХрд╛ рдЖрдХрд╛рд░ рд╕реНрдХреНрд░реАрди рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдмрд╛рдХреА рдХреЛрдб рдЖрд╕рд╛рдиреА рд╕реЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЖрдХрд╛рд░реЛрдВ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рдареАрдХ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдмрд╛рдж рдореЗрдВ, рд╣рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдЦрд╛рдПрдВрдЧреЗ рдХрд┐ рд╕реНрдкрд░реНрд╢ рдХрд╣рд╛рдВ рдерд╛, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдЙрди рдорд╛рдиреЛрдВ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░реЗрдВ, рдЬреЛ 0 рд╕реЗ 255 рддрдХ рдЕрд░реНрджреБрдВрдХреА рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ (рдЖрдЦрд┐рд░рдХрд╛рд░, рдХреЗрдВрджреНрд░ рд╕реЗ рд╕реНрдкрд░реНрд╢ 456 рдкрд┐рдХреНрд╕реЗрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдПрдордХреЗ рдЙрд╕ рдирдВрдмрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛)ред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд ControlDriveInputListener () рдХреЛрдб рд╣реИ, рдпрд╣ рд╡рд░реНрдЧ onCreate () рдкрджреНрдзрддрд┐ рдХреЗ рдмрд╛рдж, рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЗ рд╡рд░реНрдЧ рдореЗрдВ рд╣реА рд╕реНрдерд┐рдд рд╣реИред рдПрдХреНрдЯрд┐рд╡рд┐рдЯреАрдХрдВрдЯреНрд░реЛрд▓ рдлрд╛рдЗрд▓ рдореЗрдВ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг, ControlDriveInputListener рд╡рд░реНрдЧ рдПрдХ рдмрдЪреНрдЪрд╛ рдмрди рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рдореБрдЦреНрдп рд╡рд░реНрдЧ рдХреЗ рд╕рднреА рдЪрд░ рд╣реИрдВред

рдХреНрд▓рд┐рдХ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдзреНрдпрд╛рди рди рджреЗрдВред рдЕрдм рд╣рдо рд╕реНрдкрд░реНрд╢ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ: рдХрд┐рд╕ рдмрд┐рдВрджреБ рдкрд░ рд╡реНрдпрдХреНрддрд┐ рдЕрдкрдиреА рдЙрдВрдЧрд▓реА рдбрд╛рд▓рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдореЗрдВ рдХреНрдпрд╛ рдбреЗрдЯрд╛ рдорд┐рд▓реЗрдЧрд╛ред

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрдВ java.util.Timer рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ: рдпрд╣ рдЖрдкрдХреЛ рдПрдХ рдирдпрд╛ рдереНрд░реЗрдб рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рджреЗрд░реА рд╣реЛ рд╕рдХрддреА рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ nth рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕реЗрдХрдВрдб рдХреЗ рдмрд╛рдж рдЕрдирдВрдд рдмрд╛рд░ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд┐рдореНрди рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП: рд╡реНрдпрдХреНрддрд┐ рдиреЗ рдПрдХ рдЙрдВрдЧрд▓реА рдбрд╛рд▓ рджреА, ACTION_DOWN рд╡рд┐рдзрд┐ рдиреЗ рдХрд╛рдо рдХрд┐рдпрд╛, рдЬрд╛рдирдХрд╛рд░реА arduino рдореЗрдВ рдЪрд▓реА рдЧрдИ, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдЙрд╕ рд╡реНрдпрдХреНрддрд┐ рдиреЗ рдЙрдВрдЧрд▓реА рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЧрддрд┐ рдЙрд╕реЗ рд╕реВрдЯ рдХрд░рддреА рд╣реИред рджреВрд╕рд░реА рдмрд╛рд░, ACTION_DOWN рд╡рд┐рдзрд┐ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ ACTION_UP (рд╕реНрдХреНрд░реАрди рд╕реЗ рдЕрдкрдиреА рдЙрдВрдЧрд▓реА рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП) рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЦреИрд░, рд╣рдо рдЯрд╛рдЗрдорд░ () рдХреНрд▓рд╛рд╕ рд▓реВрдк рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╣рд░ 10 рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдкрд░ рдПрдХ рд╣реА рдбреЗрдЯрд╛ рднреЗрдЬрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдЬрдм рдЙрдВрдЧрд▓реА рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (ACTION_MOVE рдХрд╛рдо рдХрд░реЗрдЧрд╛) рдпрд╛ рдЙрдард╛рдпрд╛ (ACTION_UP), рдЯрд╛рдЗрдорд░ рдЪрдХреНрд░ рдХреЛ рдорд╛рд░ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдкреБрд░рд╛рдиреЗ рдкреНрд░реЗрд╕ рд╕реЗ рдбреЗрдЯрд╛ рдлрд┐рд░ рд╕реЗ рднреЗрдЬрд╛ рдЬрд╛рдирд╛ рд╢реБрд░реВ рди рд╣реЛред

 public class ControlDriveInputListener implements View.OnTouchListener { private Timer timer; @Override public boolean onTouch(View view, MotionEvent motionEvent) { //     //      (!) final float x = motionEvent.getX(); final float y = motionEvent.getY(); //,     switch(motionEvent.getAction()) { //  //  ,      case MotionEvent.ACTION_DOWN: //  timer = new Timer(); //  // :    0, //  10  timer.schedule(new TimerTask() { @Override public void run() { //   calculateAndSendCommand(x, y); } }, 0, 10); break; //    (  ACTION_DOWN) case MotionEvent.ACTION_MOVE: // (!) //     Timer(),   if(timer != null) { timer.cancel(); timer = null; } //   timer = new Timer(); //     ,    ACTION_UP timer.schedule(new TimerTask() { @Override public void run() { calculateAndSendCommand(x, y); } }, 0, 10); break; //     case MotionEvent.ACTION_UP: //  if(timer != null) { timer.cancel(); timer = null; } break; } return false; } } 

рдлрд┐рд░ рд╕реЗ рдзреНрдпрд╛рди рджреЗрдВ: рдПрдХреНрд╕ рдФрд░ рд╡рд╛рдИ рдХрд╛рдЙрдВрдЯ рдСрдирдЯреВ () рд╡рд┐рдзрд┐ рд╡реНрдпреВ рдХреЗ рдКрдкрд░реА рдмрд╛рдПрдВ рдХреЛрдиреЗ рд╕реЗ рдЬрд╛рддреА рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдмрд┐рдВрджреБ (0; 0) рдпрд╣рд╛рдВ рдмрдЯрди рдкрд░ рд╕реНрдерд┐рдд рд╣реИ:



рдЕрдм рдЬрдм рд╣рдордиреЗ рд╕реАрдЦрд╛ рд╣реИ рдХрд┐ рдмрдЯрди рдкрд░ рдЙрдВрдЧрд▓реА рдХрд╛ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд╛рди рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рддреЛ рд╣рдо рдХрд╛рд░реНрдп рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд┐рдХреНрд╕реЗрд▓ (рдХреНрдпреЛрдВрдХрд┐ x рдФрд░ y рдкрд┐рдХреНрд╕реЗрд▓ рдореЗрдВ рдмрд╕ рджреВрд░реА рд╣реИрдВ) рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрддрд╛ рдХрд░реЗрдВрдЧреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ CalculAndSendCommand (x, y) рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдЬрд┐рд╕реЗ ControlDriveInputListener рд╡рд░реНрдЧ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдкрдХреЛ рдХреБрдЫ рд╕рд╣рд╛рдпрдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЧрдгрдирд╛ рдХреЗ рдмрд╛рдж рдЙрд╕реА рдХрдХреНрд╖рд╛ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ AndSendCommand (x, y)ред

 private void calculateAndSendCommand(float x, float y) { //    //   // - 1, 2, 3, 4 // ,   ,      // ,     ,     int quarter = identifyQuarter(x, y); //       // y,        int speed = speedCalculation(centerBDCheight - y); //   //   ,    7   String angle = angleCalculation(x); //     ,     //      ,      /*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); //  ,    //      (  ),   100  if((System.currentTimeMillis() - lastTimeSendCommand) > 100) { //   threadCommand.sendCommand(Integer.toString(speed), angle); //     lastTimeSendCommand = System.currentTimeMillis(); } } private int identifyQuarter(float x, float y) { //,      //  if(x > centerBDCwidth && y > centerBDCheight) { return 4; } else if (x < centerBDCwidth && y >centerBDCheight) { return 3; } else if (x < centerBDCwidth && y < centerBDCheight) { return 2; } else if (x > centerBDCwidth && y < centerBDCheight) { return 1; } return 0; } private int speedCalculation(float deviation) { //  //      float coefficient = 255/(BDCheight/2); //    //   int speed = Math.round(deviation * coefficient); //    70,    // ,    ,    if(speed > 0 && speed < 70) speed = 0; if(speed < 0 && speed > - 70) speed = 0; //     120 // ,     if(speed < 120 && speed > 70) speed = 120; if(speed > -120 && speed < -70) speed = -120; //     , ACTION_MOVE   //    ,     //      if(speed > 255 ) speed = 255; if(speed < - 255) speed = -255; //:  > 0 -  , < 0 -  return speed; } private String angleCalculation(float x) { //    7  //0 -  , 180 -  //90 -    if(x < BDCwidth/6) { angle = "0"; } else if (x > BDCwidth/6 && x < BDCwidth/3) { angle = "30"; } else if (x > BDCwidth/3 && x < BDCwidth/2) { angle = "60"; } else if (x > BDCwidth/2 && x < BDCwidth/3*2) { angle = "120"; } else if (x > BDCwidth/3*2 && x < BDCwidth/6*5) { angle = "150"; } else if (x > BDCwidth/6*5 && x < BDCwidth) { angle = "180"; } else { angle = "90"; } return angle; } 

рдЬрдм рдбреЗрдЯрд╛ рдХреА рдЧрдгрдирд╛ рдФрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рджреВрд╕рд░реА рдзрд╛рд░рд╛ рдЦреЗрд▓ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреА рд╣реИред рд╡рд╣ рд╕реВрдЪрдирд╛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдЖрдк рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдЕрдиреНрдпрдерд╛ рд╕реЙрдХреЗрдЯ рд╕рдВрдЪрд╛рд░рд┐рдд рдбреЗрдЯрд╛ рд╕реНрдкрд░реНрд╢ рдХреЗ рдХреИрдкреНрдЪрд░ рдХреЛ рдзреАрдорд╛ рдХрд░ рджреЗрдЧрд╛, рдПрдХ рдХрддрд╛рд░ рдмрдирд╛рдИ рдЬрд╛рдПрдЧреА рдФрд░ рдкреВрд░рд╛ рдЕрдВрдд рдЫреЛрдЯрд╛ рд╣реЛрдЧрд╛ред

ConnectedThread рдХреНрд▓рд╛рд╕ рдПрдХреНрдЯрд┐рд╡рд┐рдЯреАрдХрдВрдЯреНрд░реЛрд▓ рдХреНрд▓рд╛рд╕ рдореЗрдВ рднреА рд╕реНрдерд┐рдд рд╣реИред

 private class ConnectedThread extends Thread { private final BluetoothSocket socket; private final OutputStream outputStream; public ConnectedThread(BluetoothSocket btSocket) { //  this.socket = btSocket; //  -       OutputStream os = null; try { os = socket.getOutputStream(); } catch(Exception e) {} outputStream = os; } public void run() { } public void sendCommand(String speed, String angle) { //    ,   byte[] speedArray = speed.getBytes(); byte[] angleArray = angle.getBytes(); //    //  ,  ,       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) {} } } 

Android рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕рд╛рд░рд╛рдВрд╢рд┐рдд рдХрд░рдирд╛


рдКрдкрд░ рджрд┐рдП рдЧрдП рд╕рднреА рдмреЛрдЭ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рдПрдВред

  1. ActivMain рдореЗрдВ рд╣рдо рдмреНрд▓реВрдЯреВрде рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдПрдХ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
  2. рдПрдХреНрдЯрд┐рд╡рд┐рдЯреАрдХрдВрдЯреНрд░реЛрд▓ рдореЗрдВ рд╣рдо рдмрдЯрди рдХреЛ рд╕рдВрд▓рдЧреНрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред
  3. рд╣рдо OnTouchListener рдмрдЯрди рдХреЛ рд▓рдЯрдХрд╛рддреЗ рд╣реИрдВ, рдпрд╣ рд╕реНрдкрд░реНрд╢, рдЧрддрд┐ рдФрд░ рдЙрдВрдЧрд▓реА рдЙрдард╛рддрд╛ рд╣реИред
  4. рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ (x рдФрд░ y рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд╕рд╛рде рдмрд┐рдВрджреБ) рд░реЛрдЯреЗрд╢рди рдХреЛрдг рдФрд░ рдЧрддрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ
  5. рд╣рдо рдбреЗрдЯрд╛ рднреЗрдЬрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдгреЛрдВ рдХреЗ рд╕рд╛рде рдЕрд▓рдЧ рдХрд░рддреЗ рд╣реИрдВ

рдФрд░ рдЕрдВрддрд┐рдо рд╕рдордЭ рдЖрдкрдХреЛ рддрдм рдорд┐рд▓реЗрдЧреА рдЬрдм рдЖрдк рдкреВрд░реЗ рдХреЛрдб рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ - github.com/IDolgopolov/BluaxyWorkAPP.git ред рдХреЛрдИ рдЯрд┐рдкреНрдкрдгреА рдХреЛрдб рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рд╕рд╛рдл, рдЫреЛрдЯрд╛ рдФрд░ рд╕рд░рд▓ рджрд┐рдЦрддрд╛ рд╣реИред

рд╕реНрдХреЗрдЪ рдЕрд░реБрдбрд┐рдиреЛ


рдПрдВрдбреНрд░реЙрдЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЕрд╕рдВрддреБрд╖реНрдЯ, рд▓рд┐рдЦрд┐рдд, рд╕рдордЭрд╛ рдЧрдпрд╛ ... рдФрд░ рдпрд╣рд╛рдВ рдпрд╣ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдореИрдВ рдЪрд░рдгреЛрдВ рдореЗрдВ рд╕рдм рдХреБрдЫ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛, рдФрд░ рдлрд┐рд░ рдореИрдВ рдкреВрд░реА рдлрд╛рдЗрд▓ рдХрд╛ рд▓рд┐рдВрдХ рджреВрдВрдЧрд╛ред

рдЪрд░


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕реНрдерд┐рд░рд╛рдВрдХ рдФрд░ рдЪрд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬрд┐рдирдХреА рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

 #include <SoftwareSerial.h> //  \  //          SoftwareSerial BTSerial(8, 9); //    int speedRight = 6; int dirLeft = 3; int speedLeft = 11; int dirRight = 7; // ,   int angleDirection = 4; int angleSpeed = 5; //,     ,   //      int pinAngleStop = 12; //    String val; //  int speedTurn = 180; //,    //       int pinRed = A0; int pinWhite = A1; int pinBlack = A2; //   long lastTakeInformation; //, ,     boolean readAngle = false; boolean readSpeed = false; 

рд╕реЗрдЯрдЕрдк () рд╡рд┐рдзрд┐


рд╕реЗрдЯрдЕрдк () рд╡рд┐рдзрд┐ рдореЗрдВ, рд╣рдо рдкрд┐рди рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ: рд╡реЗ рдЗрдирдкреБрдЯ рдпрд╛ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред рд╣рдордиреЗ Arduino рдХреЗ рд╕рд╛рде рдХрдВрдкреНрдпреВрдЯрд░ рдХреА рд╕рдВрдЪрд╛рд░ рдЧрддрд┐, Arduino рдХреЗ рд╕рд╛рде рдмреНрд▓реВрдЯреВрде рднреА рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИред

 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); //      HC-05 //     ,   BTSerial.begin(38400); //   Serial.begin(9600); } 

рд▓реВрдк () рд╡рд┐рдзрд┐ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдп


рд▓рдЧрд╛рддрд╛рд░ рджреЛрд╣рд░рд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд▓реВрдк () рд╡рд┐рдзрд┐ рдореЗрдВ, рдбреЗрдЯрд╛ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореБрдЦреНрдп рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдлрд╝рдВрдХреНрд╢рдиред

 void loop() { //    if(BTSerial.available() > 0) { //    char a = BTSerial.read(); if (a == '@') { //   @ (   ) //  val val = ""; //,     readSpeed = true; } else if (readSpeed) { //         //   val if(a == '#') { //   ,     //      Serial.println(val); //,      readSpeed = false; //      go(val.toInt()); // val val = ""; //  ,     return; } val+=a; } else if (a == '*') { //    readAngle = true; } else if (readAngle) { // ,     //  ,    val if(a == '#') { Serial.println(val); Serial.println("-----"); readAngle = false; //     turn(val.toInt()); val= ""; return; } val+=a; } //     lastTakeInformation = millis(); } else { //   ,      150  //  if(millis() - lastTakeInformation > 150) { lastTakeInformation = 0; analogWrite(angleSpeed, 0); analogWrite(speedRight, 0); analogWrite(speedLeft, 0); } } } 

рд╣рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддрд╛ рд╣реИ: рдлреЛрди рд╕реЗ рд╣рдо "@ рдЧрддрд┐ # рдХреЛрдг #" рдХреА рд╢реИрд▓реА рдореЗрдВ рдмрд╛рдЗрдЯреНрд╕ рднреЗрдЬрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХрдорд╛рдВрдб "@ 200 # 60 #"ред рдпрд╣ рдЪрдХреНрд░ рд╣рд░ 100 рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдХреЛ рджреЛрд╣рд░рд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдВрдбреНрд░реЙрдЗрдб рдкрд░ рд╣рдо рдХрдорд╛рдВрдб рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдЕрдВрддрд░рд╛рд▓ рдХреЛ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдХрддрд╛рд░ рдореЗрдВ рд▓рдЧрдиреЗ рд▓рдЧрддреЗ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рд▓рдВрдмрд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкрд╣рд┐рдП рдЬреЛрд░-рдЬреЛрд░ рд╕реЗ рдЪрд▓рдиреЗ рд▓рдЧрддреЗ рд╣реИрдВ

ред рджреЗрд░реА () рдХрдорд╛рдВрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреЗрд░реА, рдЬрд┐рд╕реЗ рдЖрдк рдмрд╛рдж рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗ, рд╢рд╛рд░реАрд░рд┐рдХ рдФрд░ рдЧрдгрд┐рддреАрдп рдЧрдгрдирд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдЖрдиреБрднрд╡рд┐рдХ рд░реВрдк рд╕реЗ рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИред zadrezham, рдорд╢реАрди рдЖрд╕рд╛рдиреА рд╕реЗ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдореЗрдВ рд╕рднреА рдЯреАрдореЛрдВ рдХреЗ рдкрд╛рд╕ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ (рдзрд╛рд░рд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред)

рдЪрдХреНрд░ рдореЗрдВ рджреЛ рдкрдХреНрд╖ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡реЗ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдорд╢реАрди рдХреЛ рдЪрд▓рддреЗ рд╣реИрдВ рдФрд░ рд╕реНрдкрд┐рди рдХрд░рддреЗ рд╣реИрдВред

 void go(int mySpeed) { //   0 if(mySpeed > 0) { //  digitalWrite(dirRight, HIGH); analogWrite(speedRight, mySpeed); digitalWrite(dirLeft, HIGH); analogWrite(speedLeft, mySpeed); } else { //   0,   digitalWrite(dirRight, LOW); analogWrite(speedRight, abs(mySpeed) + 30); digitalWrite(dirLeft, LOW); analogWrite(speedLeft, abs(mySpeed) + 30); } delay(10); } void turn(int angle) { //      digitalWrite(pinAngleStop, HIGH); // ,     delay(5); //  150  ,   // 30  ,   //  31  149     if(angle > 149) { //  ,      //   ,    //    return if( digitalRead(pinWhite) == HIGH && digitalRead(pinBlack) == LOW && digitalRead(pinRed) == LOW) { return; } //      //  digitalWrite(angleDirection, HIGH); analogWrite(angleSpeed, speedTurn); } else if (angle < 31) { if(digitalRead(pinRed) == HIGH && digitalRead(pinBlack) == HIGH && digitalRead(pinWhite) == HIGH) { return; } digitalWrite(angleDirection, LOW); analogWrite(angleSpeed, speedTurn); } //  digitalWrite(pinAngleStop, LOW); delay(5); } 

рдЬрдм рдПрдВрдбреНрд░реЙрдЗрдб рдбрд╛рдЯрд╛ рднреЗрдЬрддрд╛ рд╣реИ рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ 60, 90, 120 рдХреЗ рдХреЛрдг рдкрд░ рдЪрдврд╝ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдЖрдк рд╕реАрдзреЗ рдирд╣реАрдВ рдЬрд╛ рдкрд╛рдПрдВрдЧреЗред рд╣рд╛рдВ, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдХреЛрдг рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рддреБрд░рдВрдд рдПрдВрдбреНрд░реЙрдЗрдб рд╕реЗ рдПрдХ рдЯрд░реНрди рдХрдорд╛рдВрдб рднреЗрдЬрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рдЕрдирд╛рдбрд╝реА рд╣реИред

рд╕реНрдХреЗрдЪ рдкрд░рд┐рдгрд╛рдо


рдПрдХ рд╕реНрдХреЗрдЪ рдореЗрдВ рдХреЗрд╡рд▓ рддреАрди рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЪрд░рдг рд╣реЛрддреЗ рд╣реИрдВ: рдПрдХ рдХрдорд╛рдВрдб рдкрдврд╝рдирд╛, рд░реЛрдЯреЗрд╢рди рдХреА рд╕реАрдорд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдФрд░ рдореЛрдЯрд░реНрд╕ рдХреЛ рдХрд░рдВрдЯ рдХреА рдЖрдкреВрд░реНрддрд┐ рдХрд░рдирд╛ред рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ рдпрд╣ рдЖрд╕рд╛рди рд╕реЗ рдЖрд╕рд╛рди рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдФрд░ рдХреБрдВрдж рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╕реНрдХреЗрдЪ рдХрд╛ рдкреВрд░реНрдг рд╕рдВрд╕реНрдХрд░рдг ред

рдЕрдВрдд рдореЗрдВ


рдХрд╛рдо рдХреЗ рдХрдИ рдорд╣реАрдиреЛрдВ рдХреА рдПрдХ рдкреВрд░реА рд╕реВрдЪреА рдЦрддреНрдо рд╣реЛ рдЧрдИ рд╣реИред рднреМрддрд┐рдХ рднрд╛рдЧ рд╡рд┐рдШрдЯрд┐рдд рд╣реИ, рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╕рднреА рдФрд░ рдЕрдзрд┐рдХред рд╕рд┐рджреНрдзрд╛рдВрдд рдПрдХ рд╣реА рд░рд╣рддрд╛ рд╣реИ - рдЕрд╕рдВрдЧрдд рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдкрд░реНрдХ, рд╣рдо рдПрдХ рд╕рд╛рде рд╕рдордЭреЗрдВрдЧреЗред

рдФрд░ рдкрд╣рд▓реЗ рднрд╛рдЧ рдХреЗ рддрд╣рдд рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИрдВ, рдЙрдиреНрд╣реЛрдВрдиреЗ рд╕рднреА рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж , рдЙрдкрдпреЛрдЧреА рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЗ рдПрдХ рдкрд╣рд╛рдбрд╝ рдХреА рд╕рд▓рд╛рд╣ рджреА ред

рдкрд░рд┐рдгрд╛рдо рд╡реАрдбрд┐рдпреЛ


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


All Articles