基于android和arduino 的小车控制

迷南。 2022-08-26 11:10 670阅读 0赞

基于android和arduino 的小车控制,小车部分采用的是 arduino 开源硬件实现,arduino 学起来比较简单,看看文档在看几个例子基本就会了。官网是http://arduino.cc/

我是在某宝上购买的一组套件,最终发现很多都没有用上,有点眼高手低。android 和 arduino 通信 是通过蓝牙。小车控制比较简单,前、后、左、右、向左转圈、向右转圈。

以下是源码;

1:arduino 源码:

  1. #include <BaseCar.h>
  2. // log
  3. const boolean VERBOSE = true;
  4. const int SERIAL_SPEED = 9600;
  5. // for Car
  6. //1-ok
  7. const int MOTO1_PIN = 2;
  8. const int I11_PIN = 3;
  9. const int I12_PIN = 4;
  10. //2
  11. const int MOTO2_PIN = 5;
  12. const int I21_PIN = 6;
  13. const int I22_PIN = 7;
  14. //3-ok
  15. const int MOTO3_PIN = 8;
  16. const int I31_PIN = 9;
  17. const int I32_PIN =10;
  18. //4
  19. const int MOTO4_PIN = 11;
  20. const int I41_PIN = 12;
  21. const int I42_PIN = 13;
  22. // speed
  23. const int SPEED_VAL =500;
  24. // delay
  25. const int DELAY_TIME = 300;
  26. //bouttooth
  27. char RECEIVE_VALUE='q_z_1';
  28. // car control
  29. BaseCar car(MOTO1_PIN, MOTO2_PIN, MOTO3_PIN, MOTO4_PIN,I11_PIN, I12_PIN, I21_PIN, I22_PIN,I31_PIN, I32_PIN, I41_PIN, I42_PIN);
  30. const int adj = 19;
  31. void setup() {
  32. if (VERBOSE) {
  33. Serial.begin(SERIAL_SPEED);
  34. }
  35. }
  36. void loop() {
  37. // RECEIVE_VALUE=Serial.read();
  38. //Serial.println(RECEIVE_VALUE);
  39. if(RECEIVE_VALUE=='q_z_1'){
  40. // 左前一度
  41. car.forward(SPEED_VAL, adj);
  42. }else if(RECEIVE_VALUE=='q_z_2'){
  43. // 左前二度
  44. car.turnLeft(SPEED_VAL, adj);
  45. }else if(RECEIVE_VALUE=='q_z_3'){
  46. // 左前三度-向左旋转
  47. car.rotateLeft(SPEED_VAL, adj);
  48. }else if(RECEIVE_VALUE=='q_y_1'){
  49. // 右前一度
  50. car.forward(SPEED_VAL, adj);
  51. }else if(RECEIVE_VALUE=='q_y_2'){
  52. // 右前二度
  53. car.turnRight(SPEED_VAL, adj);
  54. }else if(RECEIVE_VALUE=='q_y_3'){
  55. // 右前三度-向右旋转
  56. car.rotateRight(SPEED_VAL, adj);
  57. }else{
  58. // 刹车
  59. car.standBy();
  60. }
  61. }
  62. 1.1 以下两个类放在libiriary 文件夹名命名为 car
  63. #include "Arduino.h"
  64. #include "BaseCar.h"
  65. BaseCar::BaseCar(int left_back_speed, int left_forward_speed,int right_forward_speed, int right_back_speed, int left_back_1, int left_back_2, int left_forward_1, int left_forward_2,int right_forward_1, int right_forward_2,int right_back_1, int right_back_2){
  66. _left_back_speed = left_back_speed;
  67. _left_forward_speed = left_forward_speed;
  68. _right_forward_speed = right_forward_speed;
  69. _right_back_speed = right_back_speed;
  70. pinMode(left_back_speed, OUTPUT);
  71. pinMode(left_forward_speed, OUTPUT);
  72. pinMode(right_forward_speed, OUTPUT);
  73. pinMode(right_back_speed, OUTPUT);
  74. _left_back_1 = left_back_1;
  75. _left_back_2 = left_back_2;
  76. _left_forward_1 = left_forward_1;
  77. _left_forward_2 = left_forward_2;
  78. _right_forward_1 = right_forward_1;
  79. _right_forward_2 = right_forward_2;
  80. _right_back_1 = right_back_1;
  81. _right_back_2 = right_back_2;
  82. pinMode(left_back_1, OUTPUT);
  83. pinMode(left_back_2, OUTPUT);
  84. pinMode(left_forward_1, OUTPUT);
  85. pinMode(left_forward_2, OUTPUT);
  86. pinMode(right_forward_1, OUTPUT);
  87. pinMode(right_forward_2, OUTPUT);
  88. pinMode(right_back_1, OUTPUT);
  89. pinMode(right_back_2, OUTPUT);
  90. }
  91. //停止
  92. void BaseCar::standBy() {
  93. _status.left_back_speed_h = 0;
  94. _status.left_forward_speed_h = 0;
  95. _status.right_forward_speed_h = 0;
  96. _status.right_back_speed_h = 0;
  97. _status.left_back_1_h = HIGH;
  98. _status.left_back_2_h = HIGH;
  99. _status.left_forward_1_h = HIGH;
  100. _status.left_forward_2_h = HIGH;
  101. //
  102. _status.right_forward_1_h = HIGH;
  103. _status.right_forward_2_h = HIGH;
  104. _status.right_back_1_h = HIGH;
  105. _status.right_back_2_h = HIGH;
  106. _go();
  107. }
  108. //向前
  109. void BaseCar::forward(int moto_speed, int adj) {
  110. _status.left_back_speed_h = moto_speed + adj;
  111. _status.left_forward_speed_h = moto_speed + adj;
  112. _status.right_forward_speed_h = moto_speed + adj;
  113. _status.right_back_speed_h = moto_speed + adj;
  114. _status.left_back_1_h = LOW;
  115. _status.left_back_2_h = HIGH;
  116. _status.left_forward_1_h = LOW;
  117. _status.left_forward_2_h = HIGH;
  118. _status.right_forward_1_h = LOW;
  119. _status.right_forward_2_h = HIGH;
  120. _status.right_back_1_h = LOW;
  121. _status.right_back_2_h = HIGH;
  122. _status.adj = adj;
  123. _go();
  124. }
  125. //向后
  126. void BaseCar::backward(int moto_speed, int adj) {
  127. _status.left_back_speed_h = moto_speed + adj;
  128. _status.left_forward_speed_h = moto_speed + adj;
  129. _status.right_forward_speed_h = moto_speed + adj;
  130. _status.right_back_speed_h = moto_speed + adj;
  131. _status.left_back_1_h = HIGH;
  132. _status.left_back_2_h = LOW;
  133. _status.left_forward_1_h = HIGH;
  134. _status.left_forward_2_h = LOW;
  135. _status.right_forward_1_h = HIGH;
  136. _status.right_forward_2_h = LOW;
  137. _status.right_back_1_h = HIGH;
  138. _status.right_back_2_h = LOW;
  139. _status.adj = adj;
  140. _go();
  141. }
  142. //左转
  143. void BaseCar::turnLeft(int moto_speed, int adj) {
  144. _status.left_back_speed_h = moto_speed - adj;
  145. _status.left_forward_speed_h = moto_speed - adj;
  146. _status.right_forward_speed_h = moto_speed + adj;
  147. _status.right_back_speed_h = moto_speed + adj;
  148. _status.left_back_1_h = LOW;
  149. _status.left_back_2_h = HIGH;
  150. _status.left_forward_1_h = LOW;
  151. _status.left_forward_2_h = HIGH;
  152. _status.right_forward_1_h = LOW;
  153. _status.right_forward_2_h = HIGH;
  154. _status.right_back_1_h = LOW;
  155. _status.right_back_2_h = HIGH;
  156. _status.adj = adj;
  157. _go();
  158. }
  159. //右转
  160. void BaseCar::turnRight(int moto_speed, int adj) {
  161. _status.left_back_speed_h = moto_speed + adj;
  162. _status.left_forward_speed_h = moto_speed + adj;
  163. _status.right_forward_speed_h = moto_speed - adj;
  164. _status.right_back_speed_h = moto_speed - adj;
  165. _status.left_back_1_h = LOW;
  166. _status.left_back_2_h = HIGH;
  167. _status.left_forward_1_h = LOW;
  168. _status.left_forward_2_h = HIGH;
  169. _status.right_forward_1_h = LOW;
  170. _status.right_forward_2_h = HIGH;
  171. _status.right_back_1_h = LOW;
  172. _status.right_back_2_h = HIGH;
  173. _status.adj = adj;
  174. _go();
  175. }
  176. //向左旋转(右边向前转,左边向后转)
  177. void BaseCar::rotateLeft(int moto_speed, int adj) {
  178. _status.left_back_speed_h = moto_speed + adj;
  179. _status.left_forward_speed_h = moto_speed + adj;
  180. _status.right_forward_speed_h = moto_speed + adj;
  181. _status.right_back_speed_h = moto_speed + adj;
  182. _status.left_back_1_h = HIGH;
  183. _status.left_back_2_h = LOW;
  184. _status.left_forward_1_h = HIGH;
  185. _status.left_forward_2_h = LOW;
  186. _status.right_forward_1_h = LOW;
  187. _status.right_forward_2_h = HIGH;
  188. _status.right_back_1_h = LOW;
  189. _status.right_back_2_h = HIGH;
  190. _status.adj = adj;
  191. _go();
  192. }
  193. //向右旋转
  194. void BaseCar::rotateRight(int moto_speed, int adj) {
  195. _status.left_back_speed_h = moto_speed + adj;
  196. _status.left_forward_speed_h = moto_speed + adj;
  197. _status.right_forward_speed_h = moto_speed + adj;
  198. _status.right_back_speed_h = moto_speed + adj;
  199. _status.left_back_1_h = LOW;
  200. _status.left_back_2_h = HIGH;
  201. _status.left_forward_1_h = LOW;
  202. _status.left_forward_2_h = HIGH;
  203. _status.right_forward_1_h = HIGH;
  204. _status.right_forward_2_h = LOW;
  205. _status.right_back_1_h = HIGH;
  206. _status.right_back_2_h = LOW;
  207. _status.adj = adj;
  208. _go();
  209. }
  210. void BaseCar::_go() {
  211. digitalWrite(_left_back_1, _status.left_back_1_h);
  212. digitalWrite(_left_back_2, _status.left_back_2_h);
  213. digitalWrite(_left_forward_1, _status.left_forward_1_h);
  214. digitalWrite(_left_forward_2, _status.left_forward_2_h);
  215. digitalWrite(_right_forward_1, _status.right_forward_1_h);
  216. digitalWrite(_right_forward_2, _status.right_forward_2_h);
  217. digitalWrite(_right_back_1, _status.right_back_1_h);
  218. digitalWrite(_right_back_2, _status.right_back_2_h);
  219. analogWrite(_left_back_speed, _status.left_back_speed_h);
  220. analogWrite(_left_forward_speed, _status.left_forward_speed_h);
  221. analogWrite(_right_forward_speed, _status.right_forward_speed_h);
  222. analogWrite(_right_back_speed, _status.right_back_speed_h);
  223. }
  224. CarStatus BaseCar::getStatus() {
  225. return _status;
  226. }
  227. #ifndef BaseCar_h
  228. #define BaseCar_h
  229. #include "Arduino.h"
  230. struct CarStatus {
  231. int left_back_1_h;
  232. int left_back_2_h;
  233. int left_forward_1_h;
  234. int left_forward_2_h;
  235. int right_forward_1_h;
  236. int right_forward_2_h;
  237. int right_back_1_h;
  238. int right_back_2_h;
  239. int left_back_speed_h;
  240. int left_forward_speed_h;
  241. int right_forward_speed_h;
  242. int right_back_speed_h;
  243. int adj;
  244. };
  245. class BaseCar {
  246. public:
  247. BaseCar(int left_back_speed, int left_forward_speed,int right_forward_speed, int right_back_speed, int left_back_1, int left_back_2, int left_forward_1, int left_forward_2,int right_forward_1, int right_forward_2,int right_back_1, int right_back_2);
  248. void standBy();
  249. void forward(int moto_speed, int adj);
  250. void backward(int moto_speed, int adj);
  251. void turnLeft(int moto_speed, int adj);
  252. void turnRight(int moto_speed, int adj);
  253. void rotateLeft(int moto_speed, int adj);
  254. void rotateRight(int moto_speed, int adj);
  255. CarStatus getStatus();
  256. private:
  257. int _left_back_speed;
  258. int _left_forward_speed;
  259. int _right_forward_speed;
  260. int _right_back_speed;
  261. int _left_back_1;
  262. int _left_back_2;
  263. int _left_forward_1;
  264. int _left_forward_2;
  265. int _right_forward_1;
  266. int _right_forward_2;
  267. int _right_back_1;
  268. int _right_back_2;
  269. CarStatus _status;
  270. void _go();
  271. };
  272. #endif

2:android 源码如下:

  1. package com.robot;
  2. import java.io.IOException;
  3. import java.io.OutputStream;
  4. import java.util.UUID;
  5. import android.app.Activity;
  6. import android.bluetooth.BluetoothAdapter;
  7. import android.bluetooth.BluetoothDevice;
  8. import android.bluetooth.BluetoothSocket;
  9. import android.content.pm.ActivityInfo;
  10. import android.os.Bundle;
  11. import android.util.Log;
  12. import android.view.Gravity;
  13. import android.view.MotionEvent;
  14. import android.view.View;
  15. import android.view.View.OnTouchListener;
  16. import android.widget.CheckBox;
  17. import android.widget.CompoundButton;
  18. import android.widget.CompoundButton.OnCheckedChangeListener;
  19. import android.widget.ImageView;
  20. import android.widget.TextView;
  21. import android.widget.Toast;
  22. public class AAActivity extends Activity {
  23. private TextView state;
  24. private ImageView forward;
  25. private ImageView back;
  26. private ImageView left_2;
  27. private ImageView right_2;
  28. boolean isStart = false;
  29. private static final UUID MY_UUID = UUID
  30. .fromString("00001101-0000-1000-8000-00805F9B34FB");
  31. private static String address = "00:12:02:06:01:32";
  32. private static final String TAG = "THINBTCLIENT";
  33. private static final boolean D = true;
  34. private BluetoothAdapter mBluetoothAdapter = null;
  35. private BluetoothSocket btSocket = null;
  36. private OutputStream outStream = null;
  37. @Override
  38. public void onCreate(Bundle savedInstanceState) {
  39. super.onCreate(savedInstanceState);
  40. setContentView(R.layout.index);
  41. initUI();
  42. }
  43. @Override
  44. protected void onStart() {
  45. super.onStart();
  46. }
  47. public void setValue(String message, final String text) {
  48. if (isStart) {
  49. state.setText(text);
  50. byte[] msgBuffer;
  51. try {
  52. outStream = btSocket.getOutputStream();
  53. } catch (IOException e) {
  54. Log.e(TAG, "ON RESUME: Output stream creation failed.", e);
  55. }
  56. msgBuffer = message.getBytes();
  57. try {
  58. outStream.write(msgBuffer);
  59. } catch (IOException e) {
  60. Log.e(TAG, "ON RESUME: Exception during write.", e);
  61. }
  62. } else {
  63. Toast.makeText(this, "请先选择开启!", Toast.LENGTH_SHORT).show();
  64. }
  65. }
  66. private void initUI() {
  67. state = (TextView) findViewById(R.id.state);
  68. CheckBox blueT = (CheckBox) findViewById(R.id.blueT);
  69. blueT.setOnCheckedChangeListener(new OnCheckedChangeListener() {
  70. public void onCheckedChanged(CompoundButton buttonView,
  71. boolean isChecked) {
  72. isStart = isChecked;
  73. }
  74. });
  75. forward = (ImageView) findViewById(R.id.forward);
  76. forward.setImageResource(R.drawable.forward);
  77. forward.setOnTouchListener(new OnTouchListener() {
  78. public boolean onTouch(View v, MotionEvent event) {
  79. if (event.getAction() == MotionEvent.ACTION_DOWN) {
  80. forward.setImageResource(R.drawable.forward_r);
  81. setValue("1", "直走");
  82. }
  83. if (event.getAction() == MotionEvent.ACTION_UP) {
  84. forward.setImageResource(R.drawable.forward);
  85. setValue("7", "刹车");
  86. }
  87. return true;
  88. }
  89. });
  90. back = (ImageView) findViewById(R.id.back);
  91. back.setImageResource(R.drawable.back);
  92. back.setOnTouchListener(new OnTouchListener() {
  93. public boolean onTouch(View v, MotionEvent event) {
  94. if (event.getAction() == MotionEvent.ACTION_DOWN) {
  95. back.setImageResource(R.drawable.back_r);
  96. setValue("6", "后退");
  97. }
  98. if (event.getAction() == MotionEvent.ACTION_UP) {
  99. back.setImageResource(R.drawable.back);
  100. setValue("7", "刹车");
  101. }
  102. return true;
  103. }
  104. });
  105. left_2 = (ImageView) findViewById(R.id.left_2);
  106. left_2.setImageResource(R.drawable.left_2);
  107. left_2.setOnTouchListener(new OnTouchListener() {
  108. public boolean onTouch(View v, MotionEvent event) {
  109. if (event.getAction() == MotionEvent.ACTION_DOWN) {
  110. left_2.setImageResource(R.drawable.left_2_r);
  111. setValue("3", "左前二度");
  112. }
  113. if (event.getAction() == MotionEvent.ACTION_UP) {
  114. left_2.setImageResource(R.drawable.left_2);
  115. setValue("7", "刹车");
  116. }
  117. return true;
  118. }
  119. });
  120. right_2 = (ImageView) findViewById(R.id.right_2);
  121. right_2.setImageResource(R.drawable.right_2);
  122. right_2.setOnTouchListener(new OnTouchListener() {
  123. public boolean onTouch(View v, MotionEvent event) {
  124. if (event.getAction() == MotionEvent.ACTION_DOWN) {
  125. right_2.setImageResource(R.drawable.right_2_r);
  126. setValue("5", "右前二度");
  127. }
  128. if (event.getAction() == MotionEvent.ACTION_UP) {
  129. right_2.setImageResource(R.drawable.right_2);
  130. setValue("7", "刹车");
  131. }
  132. return true;
  133. }
  134. });
  135. if (D)
  136. Log.e(TAG, "+++ ON CREATE +++");
  137. mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
  138. if (mBluetoothAdapter == null) {
  139. Toast.makeText(this, "蓝牙设备不可用,请打开蓝牙!", Toast.LENGTH_LONG).show();
  140. finish();
  141. return;
  142. }
  143. if (!mBluetoothAdapter.isEnabled()) {
  144. Toast.makeText(this, "请打开蓝牙并重新运行程序!", Toast.LENGTH_LONG).show();
  145. finish();
  146. return;
  147. }
  148. if (D)
  149. Log.e(TAG, "+++ DONE IN ON CREATE, GOT LOCAL BT ADAPTER +++");
  150. }
  151. public void onPause() {
  152. if (getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
  153. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
  154. }
  155. super.onPause();
  156. if (D)
  157. Log.e(TAG, "- ON PAUSE -");
  158. if (outStream != null) {
  159. try {
  160. outStream.flush();
  161. } catch (IOException e) {
  162. Log.e(TAG, "ON PAUSE: Couldn't flush output stream.", e);
  163. }
  164. }
  165. try {
  166. btSocket.close();
  167. } catch (IOException e2) {
  168. DisplayToast("套接字关闭失败!");
  169. }
  170. }
  171. public void onStop() {
  172. super.onStop();
  173. if (D)
  174. Log.e(TAG, "-- ON STOP --");
  175. }
  176. public void onDestroy() {
  177. super.onDestroy();
  178. if (D)
  179. Log.e(TAG, "--- ON DESTROY ---");
  180. }
  181. public void DisplayToast(String str) {
  182. Toast toast = Toast.makeText(this, str, Toast.LENGTH_LONG);
  183. toast.setGravity(Gravity.TOP, 0, 220);
  184. toast.show();
  185. }
  186. public void onResume() {
  187. super.onResume();
  188. if (D) {
  189. Log.e(TAG, "+ ON RESUME +");
  190. Log.e(TAG, "+ ABOUT TO ATTEMPT CLIENT CONNECT +");
  191. }
  192. DisplayToast("正在尝试连接智能小车,请稍后····");
  193. BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
  194. try {
  195. btSocket = device.createRfcommSocketToServiceRecord(MY_UUID);
  196. } catch (IOException e) {
  197. e.printStackTrace();
  198. DisplayToast("套接字创建失败!");
  199. }
  200. DisplayToast("成功连接智能小车!可以开始操控了~~~");
  201. mBluetoothAdapter.cancelDiscovery();
  202. try {
  203. btSocket.connect();
  204. DisplayToast("连接成功建立,数据连接打开!");
  205. } catch (IOException e) {
  206. try {
  207. btSocket.close();
  208. } catch (IOException e2) {
  209. DisplayToast("连接没有建立,无法关闭套接字!");
  210. }
  211. }
  212. if (D)
  213. Log.e(TAG, "+ ABOUT TO SAY SOMETHING TO SERVER +");
  214. }
  215. }

发表评论

表情:
评论列表 (有 0 条评论,670人围观)

还没有评论,来说两句吧...

相关阅读