坦克的移動部分用L298N控制左右2個直流減速馬達
做好前後左右停的動作
用I2C通訊接收訊息
m->0-4->l->0-255->r->0-255
Bottom
#include <Wire.h>
int x=0,m=0;
int pinIn1=7,pinIn2=6,pinIn3=5,pinIn4=4;
int pinP1=9,pinP4=3;
int pwr1=40,pwr4=40;
void setup() {
Wire.begin(8);// join i2c bus with address #8
Wire.onReceive(receiveEvent); // register event
pinMode(pinIn1, OUTPUT);
pinMode(pinIn2, OUTPUT);
pinMode(pinIn3, OUTPUT);
pinMode(pinIn4, OUTPUT);
pinMode(pinP1, OUTPUT);
pinMode(pinP4, OUTPUT);
}
void loop() {
delay(100);
switch(m){
case 0:stopCar();break;
case 1:turnLeft();break;
case 2:turnRight();break;
case 3:forward();break;
case 4:backward();break;
}
}
// function that executes whenever data is received from master
// this function is registered as an event, see setup()
void receiveEvent(int howMany) {
while (1 < Wire.available()) { // loop through all but the last
char c = Wire.read(); // receive byte as a character
if(c == 'm'){
m = Wire.read();// receive byte as an integer
}
if(c == 'l'){
pwr1 = Wire.read();
}
if(c == 'r'){
pwr4 = Wire.read();
}
}
}
void forward(){
digitalWrite(pinIn1, HIGH);
digitalWrite(pinIn2, LOW);
analogWrite(pinP1, pwr1);
digitalWrite(pinIn3, LOW);
digitalWrite(pinIn4, HIGH);
analogWrite(pinP4, pwr4);
}
void backward(){
digitalWrite(pinIn1, LOW);
digitalWrite(pinIn2, HIGH);
analogWrite(pinP1, pwr1);
digitalWrite(pinIn3, HIGH);
digitalWrite(pinIn4, LOW);
analogWrite(pinP4, pwr4);
}
void turnRight(){
digitalWrite(pinIn3, LOW);
digitalWrite(pinIn4, HIGH);
analogWrite(pinP4, pwr4);
digitalWrite(pinIn1, HIGH);
digitalWrite(pinIn2, LOW);
analogWrite(pinP1, pwr1);
}
void turnLeft(){
digitalWrite(pinIn1, HIGH);
digitalWrite(pinIn2, LOW);
analogWrite(pinP1, pwr1);
digitalWrite(pinIn3, LOW);
digitalWrite(pinIn4, HIGH);
analogWrite(pinP4, pwr4);
}
void stopCar(){
analogWrite(pinP1, 0);
analogWrite(pinP4, 0);
}
接收手機藍芽
top
#include <Wire.h>
#include <SoftwareSerial.h>
SoftwareSerial BT(11,12);
char ch;
byte x = 0;
int speedBase = 50,speedTmp=45;
void setup() {
Wire.begin(); // join i2c bus (address optional for master)
BT.begin(9600);
}
void loop() {
if(BT.available()){
ch = BT.read();
if(ch == 'F'){
sendI2TF();
}
if(ch == 'R'){
sendI2TR();
}
if(ch == 'L'){
sendI2TL();
}
if(ch == 'B'){
sendI2TB();
}
if(ch == 'S'){
sendI2TS();
}
}
}
void sendI2TF(){
Wire.beginTransmission(8); // transmit to device #8
x=3;
Wire.write("m");// sends five bytes
Wire.write(x);// sends one byte
Wire.endTransmission();// stop transmitting
delay(100);
Wire.beginTransmission(8); // transmit to device #8
Wire.write("l");// sends five bytes
Wire.write(speedBase);// sends one byte
Wire.endTransmission();// stop transmitting
delay(100);
Wire.beginTransmission(8); // transmit to device #8
Wire.write("r");// sends five bytes
Wire.write(speedBase);// sends one byte
Wire.endTransmission();// stop transmitting
delay(100);
}
void sendI2TR(){
Wire.beginTransmission(8); // transmit to device #8
x=2;
Wire.write("m");// sends five bytes
Wire.write(x);// sends one byte
Wire.endTransmission();// stop transmitting
delay(100);
Wire.beginTransmission(8); // transmit to device #8
Wire.write("l");// sends five bytes
Wire.write(speedBase);// sends one byte
Wire.endTransmission();// stop transmitting
delay(100);
Wire.beginTransmission(8); // transmit to device #8
Wire.write("r");// sends five bytes
speedTmp = speedBase -10;
Wire.write(speedTmp);// sends one byte
Wire.endTransmission();// stop transmitting
delay(100);
}
void sendI2TL(){
Wire.beginTransmission(8); // transmit to device #8
x=1;
Wire.write("m");// sends five bytes
Wire.write(x);// sends one byte
Wire.endTransmission();// stop transmitting
delay(100);
Wire.beginTransmission(8); // transmit to device #8
Wire.write("l");// sends five bytes
speedTmp = speedBase -10;
Wire.write(speedTmp);// sends one byte
Wire.endTransmission();// stop transmitting
delay(100);
Wire.beginTransmission(8); // transmit to device #8
Wire.write("r");// sends five bytes
Wire.write(speedBase);// sends one byte
Wire.endTransmission();// stop transmitting
delay(100);
}
void sendI2TB(){
Wire.beginTransmission(8); // transmit to device #8
x=4;
Wire.write("m");// sends five bytes
Wire.write(x);// sends one byte
Wire.endTransmission();// stop transmitting
delay(100);
Wire.beginTransmission(8); // transmit to device #8
Wire.write("l");// sends five bytes
Wire.write(speedBase);// sends one byte
Wire.endTransmission();// stop transmitting
delay(100);
Wire.beginTransmission(8); // transmit to device #8
Wire.write("r");// sends five bytes
Wire.write(speedBase);// sends one byte
Wire.endTransmission();// stop transmitting
delay(100);
}
void sendI2TS(){
Wire.beginTransmission(8); // transmit to device #8
x=0;
Wire.write("m");// sends five bytes
Wire.write(x);// sends one byte
Wire.endTransmission();// stop transmitting
delay(100);
Wire.beginTransmission(8); // transmit to device #8
Wire.write("l");// sends five bytes
Wire.write(0);// sends one byte
Wire.endTransmission();// stop transmitting
delay(100);
Wire.beginTransmission(8); // transmit to device #8
Wire.write("r");// sends five bytes
Wire.write(0 );// sends one byte
Wire.endTransmission();// stop transmitting
delay(100);
}
TankWithGun
#include <Wire.h>
#include <SoftwareSerial.h>
#include <Servo.h>
SoftwareSerial BT(11,12);
char ch;
byte x = 0;
int speedBase = 50,speedTmp=45;
int insize=0;
byte cmmd[20];
int hPos = 90;
int hDir=1;
int hCurrentPos = 0;
const int SERVOS = 2;
int DELAYTIME = 200;
int PIN[SERVOS],currentAngle[SERVOS],idle[SERVOS],MIN[SERVOS],MAX[SERVOS],INITANGLE[SERVOS];
Servo myservo[SERVOS];
void setup() {
Wire.begin(); // join i2c bus (address optional for master)
BT.begin(9600);
PIN[0]=2; PIN[1]=3;
currentAngle[0]=0; currentAngle[1]=0;
idle[0]=0; idle[1]=0;
MAX[0]=170; MAX[1]=90;
MIN[0]=10; MIN[1]=0;
INITANGLE[0]=90; INITANGLE[1]=10;
for(int i = 0; i < SERVOS; i++){
//myservo[i].attach(PIN[i]);
//myservo[i].write(INITANGLE[i]);
//delay(DELAYTIME);
//myservo[i].detach();
}
Serial.begin(9600);
}
void loop() {
if(BT.available()){
ch = BT.read();
if(ch == 'F'){
Serial.println("F");
sendI2TF();
}
if(ch == 'R'){
Serial.println("R");
sendI2TR();
}
if(ch == 'L'){
Serial.println("L");
sendI2TL();
}
if(ch == 'B'){
Serial.println("B");
sendI2TB();
}
if(ch == 'S'){
Serial.println("S");
sendI2TS();
}
if(ch == 'H'){
sendI2TH();
}
if(ch == 'U'){
Serial.println("U");
sendI2TU();
}
if(ch == 'D'){
Serial.println("D");
sendI2TD();
}
if(ch == 'Z'){
Serial.println("Z");
sendI2TZ();
}
}
if(hCurrentPos!=hPos){
if(!myservo[0].attached()){
myservo[0].attach(PIN[0]);
}
myservo[0].write(hCurrentPos+hDir);
delay(100);
hCurrentPos = myservo[0].read();
}else{
idle[0]++;
if(idle[0]==10){
myservo[0].detach();
}
}
}
void sendI2TF(){
Wire.beginTransmission(8); // transmit to device #8
x=3;
Wire.write("m"); // sends five bytes
Wire.write(x); // sends one byte
Wire.endTransmission(); // stop transmitting
delay(100);
Wire.beginTransmission(8); // transmit to device #8
Wire.write("l"); // sends five bytes
Wire.write(speedBase); // sends one byte
Wire.endTransmission(); // stop transmitting
delay(100);
Wire.beginTransmission(8); // transmit to device #8
Wire.write("r"); // sends five bytes
Wire.write(speedBase); // sends one byte
Wire.endTransmission(); // stop transmitting
delay(100);
}
void sendI2TR(){
Wire.beginTransmission(8); // transmit to device #8
x=2;
Wire.write("m"); // sends five bytes
Wire.write(x); // sends one byte
Wire.endTransmission(); // stop transmitting
delay(100);
Wire.beginTransmission(8); // transmit to device #8
Wire.write("l"); // sends five bytes
Wire.write(speedBase); // sends one byte
Wire.endTransmission(); // stop transmitting
delay(100);
Wire.beginTransmission(8); // transmit to device #8
Wire.write("r"); // sends five bytes
speedTmp = speedBase -10;
Wire.write(speedTmp); // sends one byte
Wire.endTransmission(); // stop transmitting
delay(100);
}
void sendI2TL(){
Wire.beginTransmission(8); // transmit to device #8
x=1;
Wire.write("m"); // sends five bytes
Wire.write(x); // sends one byte
Wire.endTransmission(); // stop transmitting
delay(100);
Wire.beginTransmission(8); // transmit to device #8
Wire.write("l"); // sends five bytes
speedTmp = speedBase -10;
Wire.write(speedTmp); // sends one byte
Wire.endTransmission(); // stop transmitting
delay(100);
Wire.beginTransmission(8); // transmit to device #8
Wire.write("r"); // sends five bytes
Wire.write(speedBase); // sends one byte
Wire.endTransmission(); // stop transmitting
delay(100);
}
void sendI2TB(){
Wire.beginTransmission(8); // transmit to device #8
x=4;
Wire.write("m"); // sends five bytes
Wire.write(x); // sends one byte
Wire.endTransmission(); // stop transmitting
delay(100);
Wire.beginTransmission(8); // transmit to device #8
Wire.write("l"); // sends five bytes
Wire.write(speedBase); // sends one byte
Wire.endTransmission(); // stop transmitting
delay(100);
Wire.beginTransmission(8); // transmit to device #8
Wire.write("r"); // sends five bytes
Wire.write(speedBase); // sends one byte
Wire.endTransmission(); // stop transmitting
delay(100);
}
void sendI2TS(){
Wire.beginTransmission(8); // transmit to device #8
x=0;
Wire.write("m"); // sends five bytes
Wire.write(x); // sends one byte
Wire.endTransmission(); // stop transmitting
delay(100);
Wire.beginTransmission(8); // transmit to device #8
Wire.write("l"); // sends five bytes
Wire.write(0); // sends one byte
Wire.endTransmission(); // stop transmitting
delay(100);
Wire.beginTransmission(8); // transmit to device #8
Wire.write("r"); // sends five bytes
Wire.write(0 ); // sends one byte
Wire.endTransmission(); // stop transmitting
delay(100);
}
void sendI2TH(){
while((insize=(BT.available()))==0){
insize=BT.available();
}
hPos = BT.read();
Serial.print("hPos=");
Serial.print(hPos);
Serial.print(" ");
int i=0;
hCurrentPos = myservo[i].read();
if(hCurrentPos>hPos){
hDir=-1;
}else{
hDir=1;
}
//while(currentPos!=hPos){
// if(!myservo[i].attached()){
// myservo[i].attach(PIN[i]);
// }
// myservo[i].write(currentPos+dir);
// delay(100);
// currentPos = myservo[i].read();
//}
//myservo[i].detach();
//Serial.print(insize);Serial.print(" ");
//for (int i=0; i<insize; i++){
// int tt = BT.read();Serial.print(tt);Serial.print(" ");
// cmmd[i]=char(BT.read());
// Serial.println(cmmd[i]);
//}
}
void sendI2TU(){
if(!BT.available()){
int i=0;
if(currentAngle[i] < MAX[i]){
++currentAngle[i];
if(!myservo[i].attached()){
myservo[i].attach(PIN[i]);
}
myservo[i].write(currentAngle[i]);
}else{
myservo[i].detach();
}
delay(100);
}else{
sendI2TZ();
}
}
void sendI2TD(){
if(!BT.available()){
int i=0;
if(currentAngle[i] > MIN[i]){
--currentAngle[i];
if(!myservo[i].attached()){
myservo[i].attach(PIN[i]);
}
myservo[i].write(currentAngle[i]);
}else{
myservo[i].detach();
}
delay(100);
}else{
sendI2TZ();
}
}
void sendI2TZ(){
int i=0;
if(myservo[i].attached()){
myservo[i].detach();
}
delay(100);
}