基于android和arduino 的小车控制

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

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

以下是源码;

1:arduino 源码:

 

 

#include 


// log
const boolean VERBOSE = true;
const int SERIAL_SPEED = 9600;

// for Car
//1-ok
const int MOTO1_PIN = 2;
const int I11_PIN = 3;
const int I12_PIN = 4;
//2
const int MOTO2_PIN = 5;
const int I21_PIN = 6;
const int I22_PIN = 7;
//3-ok
const int MOTO3_PIN = 8;
const int I31_PIN = 9;
const int I32_PIN =10;
//4
const int MOTO4_PIN = 11;
const int I41_PIN = 12;
const int I42_PIN = 13;

 
// speed
const int SPEED_VAL =500;

// delay
const int DELAY_TIME = 300;

//bouttooth
 char RECEIVE_VALUE='q_z_1';
// car control
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);

const int adj = 19;
 
void setup() {
  if (VERBOSE) {
    Serial.begin(SERIAL_SPEED);
  }
}

void loop() {
  // RECEIVE_VALUE=Serial.read();
  //Serial.println(RECEIVE_VALUE);
   if(RECEIVE_VALUE=='q_z_1'){   
      // 左前一度
      car.forward(SPEED_VAL, adj);
   }else if(RECEIVE_VALUE=='q_z_2'){
   // 左前二度
      car.turnLeft(SPEED_VAL, adj);
   }else if(RECEIVE_VALUE=='q_z_3'){
   // 左前三度-向左旋转
      car.rotateLeft(SPEED_VAL, adj);
   }else if(RECEIVE_VALUE=='q_y_1'){
   // 右前一度
      car.forward(SPEED_VAL, adj);
   }else if(RECEIVE_VALUE=='q_y_2'){
   // 右前二度
      car.turnRight(SPEED_VAL, adj);
   }else if(RECEIVE_VALUE=='q_y_3'){
   // 右前三度-向右旋转
      car.rotateRight(SPEED_VAL, adj);
   }else{
   // 刹车
     car.standBy();
   }
}






 

1.1 将 以下两个类放在libiriary 下 文件夹名命名为 car


#include "Arduino.h"
#include "BaseCar.h"

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){

    _left_back_speed = left_back_speed;
    _left_forward_speed = left_forward_speed;
	_right_forward_speed = right_forward_speed;
	_right_back_speed = right_back_speed;

    pinMode(left_back_speed, OUTPUT);
    pinMode(left_forward_speed, OUTPUT);
	pinMode(right_forward_speed, OUTPUT);
    pinMode(right_back_speed, OUTPUT);

    _left_back_1 = left_back_1;
    _left_back_2 = left_back_2;
    _left_forward_1 = left_forward_1;
    _left_forward_2 = left_forward_2;
	_right_forward_1 = right_forward_1;
    _right_forward_2 = right_forward_2;
    _right_back_1 = right_back_1;
    _right_back_2 = right_back_2;

    pinMode(left_back_1, OUTPUT);
    pinMode(left_back_2, OUTPUT);
    pinMode(left_forward_1, OUTPUT);
    pinMode(left_forward_2, OUTPUT);
	pinMode(right_forward_1, OUTPUT);
    pinMode(right_forward_2, OUTPUT);
    pinMode(right_back_1, OUTPUT);
    pinMode(right_back_2, OUTPUT);
}
//停止
void BaseCar::standBy() {
    _status.left_back_speed_h = 0;
    _status.left_forward_speed_h = 0;
	_status.right_forward_speed_h = 0;
    _status.right_back_speed_h = 0;
    _status.left_back_1_h = HIGH;
    _status.left_back_2_h = HIGH;
    _status.left_forward_1_h = HIGH;
    _status.left_forward_2_h = HIGH;
	//
	_status.right_forward_1_h = HIGH;
    _status.right_forward_2_h = HIGH;
    _status.right_back_1_h = HIGH;
    _status.right_back_2_h = HIGH;
    _go();
}
//向前
void BaseCar::forward(int moto_speed, int adj) {
    _status.left_back_speed_h = moto_speed + adj;
    _status.left_forward_speed_h = moto_speed + adj;
	_status.right_forward_speed_h = moto_speed + adj;
    _status.right_back_speed_h = moto_speed + adj;

    _status.left_back_1_h = LOW;
    _status.left_back_2_h = HIGH;

    _status.left_forward_1_h = LOW;
    _status.left_forward_2_h = HIGH;
	 
    _status.right_forward_1_h = LOW;
    _status.right_forward_2_h = HIGH;

    _status.right_back_1_h = LOW;
    _status.right_back_2_h = HIGH;
    _status.adj = adj;
    _go();
}
//向后
void BaseCar::backward(int moto_speed, int adj) {
    _status.left_back_speed_h = moto_speed + adj;
    _status.left_forward_speed_h = moto_speed + adj;
	_status.right_forward_speed_h = moto_speed + adj;
    _status.right_back_speed_h = moto_speed + adj;

    _status.left_back_1_h = HIGH;
    _status.left_back_2_h = LOW;

    _status.left_forward_1_h = HIGH;
    _status.left_forward_2_h = LOW;
	 
	_status.right_forward_1_h = HIGH;
    _status.right_forward_2_h = LOW;

    _status.right_back_1_h = HIGH;
    _status.right_back_2_h = LOW;

    _status.adj = adj;
    _go();
}
//左转
void BaseCar::turnLeft(int moto_speed, int adj) {
    _status.left_back_speed_h = moto_speed - adj;
    _status.left_forward_speed_h = moto_speed - adj;

	_status.right_forward_speed_h = moto_speed + adj;
    _status.right_back_speed_h = moto_speed + adj;

    _status.left_back_1_h = LOW;
    _status.left_back_2_h = HIGH;

    _status.left_forward_1_h = LOW;
    _status.left_forward_2_h = HIGH;

	_status.right_forward_1_h = LOW;
    _status.right_forward_2_h = HIGH;

    _status.right_back_1_h = LOW;
    _status.right_back_2_h = HIGH;
    _status.adj = adj;
    _go();
}
//右转
void BaseCar::turnRight(int moto_speed, int adj) {
    _status.left_back_speed_h = moto_speed + adj;
    _status.left_forward_speed_h = moto_speed + adj;

	_status.right_forward_speed_h = moto_speed - adj;
    _status.right_back_speed_h = moto_speed - adj;

    _status.left_back_1_h = LOW;
    _status.left_back_2_h = HIGH;

    _status.left_forward_1_h = LOW;
    _status.left_forward_2_h = HIGH;

	_status.right_forward_1_h = LOW;
    _status.right_forward_2_h = HIGH;

    _status.right_back_1_h = LOW;
    _status.right_back_2_h = HIGH;
    _status.adj = adj;
    _go();
}
//向左旋转(右边向前转,左边向后转)
void BaseCar::rotateLeft(int moto_speed, int adj) {
    _status.left_back_speed_h = moto_speed + adj;
    _status.left_forward_speed_h = moto_speed + adj;

	_status.right_forward_speed_h = moto_speed + adj;
    _status.right_back_speed_h = moto_speed + adj;

    _status.left_back_1_h = HIGH;
    _status.left_back_2_h = LOW;

    _status.left_forward_1_h = HIGH;
    _status.left_forward_2_h = LOW;

	_status.right_forward_1_h = LOW;
    _status.right_forward_2_h = HIGH;

    _status.right_back_1_h = LOW;
    _status.right_back_2_h = HIGH;
    _status.adj = adj;
    _go();
}
//向右旋转
void BaseCar::rotateRight(int moto_speed, int adj) {
    _status.left_back_speed_h = moto_speed + adj;
    _status.left_forward_speed_h = moto_speed + adj;

	_status.right_forward_speed_h = moto_speed + adj;
    _status.right_back_speed_h = moto_speed + adj;

    _status.left_back_1_h = LOW;
    _status.left_back_2_h = HIGH;

    _status.left_forward_1_h = LOW;
    _status.left_forward_2_h = HIGH;

	_status.right_forward_1_h = HIGH;
    _status.right_forward_2_h = LOW;

    _status.right_back_1_h = HIGH;
    _status.right_back_2_h = LOW;
    _status.adj = adj;
    _go();
}

void BaseCar::_go() {

    digitalWrite(_left_back_1, _status.left_back_1_h);
    digitalWrite(_left_back_2, _status.left_back_2_h);
    digitalWrite(_left_forward_1, _status.left_forward_1_h);
    digitalWrite(_left_forward_2, _status.left_forward_2_h);

    digitalWrite(_right_forward_1, _status.right_forward_1_h);
    digitalWrite(_right_forward_2, _status.right_forward_2_h);
    digitalWrite(_right_back_1, _status.right_back_1_h);
    digitalWrite(_right_back_2, _status.right_back_2_h);

    analogWrite(_left_back_speed, _status.left_back_speed_h);
    analogWrite(_left_forward_speed, _status.left_forward_speed_h);
	analogWrite(_right_forward_speed, _status.right_forward_speed_h);
    analogWrite(_right_back_speed, _status.right_back_speed_h);
}

CarStatus BaseCar::getStatus() {
    return _status;
}

 
#ifndef BaseCar_h
#define BaseCar_h
#include "Arduino.h"

struct CarStatus {
	 
    int left_back_1_h;
    int left_back_2_h;
    int left_forward_1_h;
    int left_forward_2_h;
	 
	int right_forward_1_h;
    int right_forward_2_h;
	int right_back_1_h;
    int right_back_2_h;
    int left_back_speed_h;
    int left_forward_speed_h;
    int right_forward_speed_h;
    int right_back_speed_h;
    int adj;
};

class BaseCar {
    public:
        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);
        void standBy();
        void forward(int moto_speed, int adj);
        void backward(int moto_speed, int adj);
        void turnLeft(int moto_speed, int adj);
        void turnRight(int moto_speed, int adj);
        void rotateLeft(int moto_speed, int adj);
        void rotateRight(int moto_speed, int adj);
        CarStatus getStatus();
    private:
        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;
        CarStatus _status;
        void _go();
};
#endif
  
 

 

2:android 源码如下:

package com.robot;

import java.io.IOException;
import java.io.OutputStream;
import java.util.UUID;

import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class AAActivity extends Activity {
	private TextView state;
	private ImageView forward;
	private ImageView back;
	private ImageView left_2;
	private ImageView right_2;
	boolean isStart = false;
	private static final UUID MY_UUID = UUID
			.fromString("00001101-0000-1000-8000-00805F9B34FB");
	private static String address = "00:12:02:06:01:32";
	private static final String TAG = "THINBTCLIENT";
	private static final boolean D = true;
	private BluetoothAdapter mBluetoothAdapter = null;
	private BluetoothSocket btSocket = null;
	private OutputStream outStream = null;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.index);
		initUI();
	}

	@Override
	protected void onStart() {
		super.onStart();
	}

	public void setValue(String message, final String text) {
		if (isStart) {
			state.setText(text);
			byte[] msgBuffer;
			try {
				outStream = btSocket.getOutputStream();
			} catch (IOException e) {
				Log.e(TAG, "ON RESUME: Output stream creation failed.", e);
			}
			msgBuffer = message.getBytes();
			try {
				outStream.write(msgBuffer);
			} catch (IOException e) {
				Log.e(TAG, "ON RESUME: Exception during write.", e);
			}
		} else {
			Toast.makeText(this, "请先选择开启!", Toast.LENGTH_SHORT).show();
		}
	}

	private void initUI() {
		state = (TextView) findViewById(R.id.state);
		CheckBox blueT = (CheckBox) findViewById(R.id.blueT);
		blueT.setOnCheckedChangeListener(new OnCheckedChangeListener() {
			public void onCheckedChanged(CompoundButton buttonView,
					boolean isChecked) {
				isStart = isChecked;
			}
		});
		forward = (ImageView) findViewById(R.id.forward);
		forward.setImageResource(R.drawable.forward);
		forward.setOnTouchListener(new OnTouchListener() {
			public boolean onTouch(View v, MotionEvent event) {
				if (event.getAction() == MotionEvent.ACTION_DOWN) {
					forward.setImageResource(R.drawable.forward_r);
					setValue("1", "直走");
				}
				if (event.getAction() == MotionEvent.ACTION_UP) {
					forward.setImageResource(R.drawable.forward);
					setValue("7", "刹车");
				}
				return true;
			}
		});

		back = (ImageView) findViewById(R.id.back);
		back.setImageResource(R.drawable.back);
		back.setOnTouchListener(new OnTouchListener() {
			public boolean onTouch(View v, MotionEvent event) {
				if (event.getAction() == MotionEvent.ACTION_DOWN) {
					back.setImageResource(R.drawable.back_r);
					setValue("6", "后退");
				}
				if (event.getAction() == MotionEvent.ACTION_UP) {
					back.setImageResource(R.drawable.back);
					setValue("7", "刹车");
				}
				return true;
			}
		});

		left_2 = (ImageView) findViewById(R.id.left_2);
		left_2.setImageResource(R.drawable.left_2);
		left_2.setOnTouchListener(new OnTouchListener() {
			public boolean onTouch(View v, MotionEvent event) {
				if (event.getAction() == MotionEvent.ACTION_DOWN) {
					left_2.setImageResource(R.drawable.left_2_r);
					setValue("3", "左前二度");
				}
				if (event.getAction() == MotionEvent.ACTION_UP) {
					left_2.setImageResource(R.drawable.left_2);
					setValue("7", "刹车");
				}
				return true;
			}
		});

		right_2 = (ImageView) findViewById(R.id.right_2);
		right_2.setImageResource(R.drawable.right_2);
		right_2.setOnTouchListener(new OnTouchListener() {
			public boolean onTouch(View v, MotionEvent event) {
				if (event.getAction() == MotionEvent.ACTION_DOWN) {
					right_2.setImageResource(R.drawable.right_2_r);
					setValue("5", "右前二度");
				}
				if (event.getAction() == MotionEvent.ACTION_UP) {
					right_2.setImageResource(R.drawable.right_2);
					setValue("7", "刹车");
				}
				return true;
			}
		});

		if (D)
			Log.e(TAG, "+++ ON CREATE +++");
		mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
		if (mBluetoothAdapter == null) {
			Toast.makeText(this, "蓝牙设备不可用,请打开蓝牙!", Toast.LENGTH_LONG).show();
			finish();
			return;
		}
		if (!mBluetoothAdapter.isEnabled()) {
			Toast.makeText(this, "请打开蓝牙并重新运行程序!", Toast.LENGTH_LONG).show();
			finish();
			return;
		}
		if (D)
			Log.e(TAG, "+++ DONE IN ON CREATE, GOT LOCAL BT ADAPTER +++");
	}

	public void onPause() {
		if (getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
			setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
		}
		super.onPause();
		if (D)
			Log.e(TAG, "- ON PAUSE -");
		if (outStream != null) {
			try {
				outStream.flush();
			} catch (IOException e) {
				Log.e(TAG, "ON PAUSE: Couldn't flush output stream.", e);
			}
		}
		try {
			btSocket.close();
		} catch (IOException e2) {
			DisplayToast("套接字关闭失败!");
		}
	}

	public void onStop() {
		super.onStop();
		if (D)
			Log.e(TAG, "-- ON STOP --");
	}

	public void onDestroy() {
		super.onDestroy();
		if (D)
			Log.e(TAG, "--- ON DESTROY ---");
	}

	public void DisplayToast(String str) {
		Toast toast = Toast.makeText(this, str, Toast.LENGTH_LONG);
		toast.setGravity(Gravity.TOP, 0, 220);
		toast.show();
	}

	public void onResume() {
		super.onResume();
		if (D) {
			Log.e(TAG, "+ ON RESUME +");
			Log.e(TAG, "+ ABOUT TO ATTEMPT CLIENT CONNECT +");

		}
		DisplayToast("正在尝试连接智能小车,请稍后····");
		BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
		try {
			btSocket = device.createRfcommSocketToServiceRecord(MY_UUID);
		} catch (IOException e) {
			e.printStackTrace();
			DisplayToast("套接字创建失败!");
		}
		DisplayToast("成功连接智能小车!可以开始操控了~~~");
		mBluetoothAdapter.cancelDiscovery();
		try {
			btSocket.connect();
			DisplayToast("连接成功建立,数据连接打开!");
		} catch (IOException e) {
			try {
				btSocket.close();
			} catch (IOException e2) {
				DisplayToast("连接没有建立,无法关闭套接字!");
			}
		}
		if (D)
			Log.e(TAG, "+ ABOUT TO SAY SOMETHING TO SERVER +");

	}
}

 

 

 

 

 

 

 

你可能感兴趣的:(Android)