Arduino 電路與程式



藍芽板

第一組
CS1#1
CS1#2
CS1#3
CS1#4
第二組
CS2#1
CS2#2
CS2#3
CS2#4

第十組
CS10#1
CS10#2
CS10#3
CS10#4

第十一組
CS11#1
CS11#2
CS11#3
CS11#4





//upload to ATmega328   
#define  led  6
void setup() {
delay(500);
pinMode(led,OUTPUT);
digitalWrite(led,LOW);
Serial.begin(38400);
delay(500);
Serial.println("AT+NAME=James");
delay(500);
Serial.println("AT+PSWD=1234");
delay(500);
digitalWrite(led,HIGH);
}

void loop() {

}


//upload to ATmega328 
//IC_LCD 版本
#define  led  6
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,16,2);
char val;
String  s="";
void setup() {
Serial.begin(38400);
 lcd.init();
  lcd.backlight();
  delay(500);
pinMode(led,OUTPUT);
digitalWrite(led,LOW);

lcd.clear();
lcd.setCursor(0,0);
s="AT+NAME=James";
lcd.print(s);
Serial.println(s);
 delay(500);
 s="";
  while (Serial.available()) {
    val = Serial.read();
    s=s+val;
    //Serial.print(val);
   }
    lcd.setCursor(0,1);
    lcd.print(s);
delay(2000);
lcd.clear();
lcd.setCursor(0,0);
s="AT+PSWD=1234";
lcd.print(s);
Serial.println(s);
delay(500);
s="";
  while (Serial.available()) {
    val = Serial.read();
    s=s+val;
    }
    lcd.setCursor(0,1);
    lcd.print(s);
     lcd.setCursor(10,1);
 lcd.print("Done!");

digitalWrite(led,HIGH);
}

void loop() {

}



換上藍牙板(加上jumper)  上電 設定  NAME

svg


以USB Uploader 上傳以下程式
完成後 再換成 藍牙板(移除Jumper)


#define led  6
int  inB;
void setup() {

  Serial.begin(115200);
  pinMode(led,OUTPUT) ;
  digitalWrite(led,LOW);
}

void loop() {

  if (Serial.available() > 0) {
     inB = Serial.read();
     if (inB=='1') digitalWrite(led,HIGH);//LED ON
     if (inB=='0') digitalWrite(led,LOW); //LED OFF
   }
}



Android 手機設定


先將手機與藍芽板配對 (1234)

      
 


 


Android 手機程式





App Inventor 2(web)


UniversalBT.aia

UniversalBT.aia.zip
UniversalBT.apk.zip
UniversalBT.apk




以下二選一


萬用藍芽遙控器


萬用藍芽遙控器


使用 serialEvent


#define led  6
static int inB;
void serialEvent() {
  inB = Serial.read();
}

void setup() {
   Serial.begin(115200);
   pinMode(led,OUTPUT) ;
   digitalWrite(led,LOW);
}
void loop() {
     if (inB=='1') digitalWrite(led,HIGH);//LED ON
     if (inB=='0') digitalWrite(led,LOW); //LED OFF
}



#define led  6
static int inB;
void serialEvent() {
  inB = Serial.read();
  if (inB=='1') digitalWrite(led,HIGH);//LED ON
  if (inB=='0') digitalWrite(led,LOW); //LED OFF
}

void setup() {
   Serial.begin(115200);
   pinMode(led,OUTPUT) ;
   digitalWrite(led,LOW);
}
void loop() {
    
}


#define led  6
#define led1 7 
static int inB;
void serialEvent() {
  inB = Serial.read();
  if (inB=='1') digitalWrite(led,HIGH);//LED ON
  if (inB=='0') digitalWrite(led,LOW); //LED OFF
}

void setup() {
   Serial.begin(115200);
   pinMode(led,OUTPUT) ;
   pinMode(led1,OUTPUT) ;
   digitalWrite(led,LOW);
}

void loop() {
   digitalWrite(led1,HIGH);
   delay(500);
   digitalWrite(led1,LOW);
   delay(500);
}








svg







#define   DirR    12
#define   DirL    11
#define   PwmL   9
#define   PwmR  10
int inB;

void cM(int dL,int dR,int sL,int sR){
  digitalWrite(DirL,dL);
  digitalWrite(DirR,dR);
  analogWrite(PwmL,sL);
  analogWrite(PwmR,sR);
}

void setup()
{
  Serial.begin(115200);
  pinMode( DirL , OUTPUT);
  pinMode( DirR , OUTPUT);
  cM(HIGH,HIGH,0,0);

}

void loop()
{
  if (Serial.available() > 0) {
     inB= Serial.read();
     if (inB=='0') cM(HIGH,HIGH,0,0); //停
     if (inB=='1') cM(HIGH,HIGH,255,255);//前進
     if (inB=='2') cM(LOW,LOW,255,255);//後退
     if (inB=='3') cM(LOW,HIGH,255,255);//逆時針
     if (inB=='4') cM(HIGH,LOW,255,255);//順時針
    
    }
}

//若前進 直接 後退
//若左轉 直接 右轉
//可能會有什麼問題?    



#define   DirR    12
#define   DirL    11
#define   PwmL   9
#define   PwmR  10
int inB;

void cM(int dL,int dR,int sL,int sR){
  digitalWrite(DirL,dL);
  digitalWrite(DirR,dR);
  analogWrite(PwmL,sL);
  analogWrite(PwmR,sR);
}

void setup()
{
  Serial.begin(115200);
  pinMode( DirL , OUTPUT);
  pinMode( DirR , OUTPUT);
  cM(HIGH,HIGH,0,0);

}

void loop()
{
  if (Serial.available() > 0) {
     inB= Serial.read();
     if (inB=='0')
      {cM(LOW,LOW,0,0); //停
        delay(200);
       }
     if (inB=='1')
     { cM(LOW,LOW,0,0); //停
       delay(200);
       cM(HIGH,HIGH,255,255);//前進
     } 
     if (inB=='2')
     {
      cM(LOW,LOW,0,0); //停
       delay(200);
      cM(LOW,LOW,255,255);//後退
     }
     if (inB=='3')
     { cM(LOW,LOW,0,0); //停
      delay(200);
      cM(LOW,HIGH,255,255);//逆時針
     }
     if (inB=='4') {
       cM(LOW,LOW,0,0); //停
        delay(200);
      cM(HIGH,LOW,255,255);//順時針
     }
    
    }
}


#define   DirR    12
#define   DirL    11
#define   PwmL   9
#define   PwmR  10
int inB;

void cM(int dL,int dR,int sL,int sR){
  digitalWrite(PwmL,0);
  digitalWrite(PwmR,0);
  delay(200);

  digitalWrite(DirL,dL);
  digitalWrite(DirR,dR);
  analogWrite(PwmL,sL);
  analogWrite(PwmR,sR);
}

void setup()
{
  Serial.begin(115200);
  pinMode( DirL , OUTPUT);
  pinMode( DirR , OUTPUT);
  cM(LOW,LOW,0,0);

}

void loop()
{
  if (Serial.available() > 0) {
     inB= Serial.read();
     if (inB=='0') cM(LOW,LOW,0,0); //停
     if (inB=='1') cM(HIGH,HIGH,255,255);//前進
     if (inB=='2') cM(LOW,LOW,255,255);//後退
     if (inB=='3') cM(LOW,HIGH,255,255);//逆時針
     if (inB=='4') cM(HIGH,LOW,255,255);//順時針
    
    }
}


使用語音控制輪型機器人(App Inventor 2)






svg


//注意 LCD Address
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
byte inB;
LiquidCrystal_I2C lcd(0x3F,16,2);
void setup(){
  lcd.init();
  Serial.begin(115200);
  lcd.backlight();
 
  }

void loop(){
  if (Serial.available() > 0) {
     inB = Serial.read();
     lcd.clear();
     lcd.setCursor(0,0);
     lcd.print(inB) ;
     lcd.setCursor(8,0);
     lcd.print(char(inB));
     lcd.setCursor(0,1);
     lcd.write(inB) ;
   }
}


ASCII  Code


void setup()
{
  Serial.begin(9600);
}
void loop()
{
  Serial.write(0x48); // H
  Serial.write(0x65); // e
  Serial.write(0x6C); // l
  Serial.write(0x6C); // l
  Serial.write(0x6F); // o
  Serial.write(0x21); // !
  Serial.write(0x0A); // \n  換行
  delay(1000);
}


顯 示器:
如 Serial Monitor , LCD
一律將收到的8位元之二進位以ASCII 之字元顯示


The write() command sends a raw byte across the serial line.
print(), on the other hand, will try and interpret the number and send the ASCII-encoded version of that number.
For example, Serial.print(72) would print '7'  '2' in the console.


參考:
print( )
write()


使用Serial.write() 與Serial.read()傳送2 Byte data
send the 16-bit value as two 8-bit values
Serial.write(0xCC);//send the start byte
Serial.write(sensorVal>>8 &0xff);//send the higher byte
Serial.write(sensorVal & 0xff);// send the lower byte

uint16_t  data = 1000;
uint8_t  buf[2];
buf[0] = data & 255;
buf[1] = (data >> 8)  & 255;
Serial.write(buf, 2);


使用union





#define Led  12
union uData
{
byte b[2];
int value;
};
union uData data;
#define Led  8
void setup() {
pinMode(Led,OUTPUT);
digitalWrite(Led,0);
data.b[0]=0x34;
data.b[1]=0x12;
if(data.value==0x1234)
digitalWrite(Led,1);
}

void loop() {
  }

2個Arduino
使用Serial.write() 與Serial.read()傳送2 Byte data

送端
nion uData
{
byte b[2];
int value;
};


union uData data;
void setup() {
Serial.begin(9600);
delay(1000);
}

void loop() {
data.value=0x3456;
 //while(!(UCSR0A & (1<<UDRE0)));// 若UDRE0=0 等待
Serial.write(0x21);//起始 字元
 //while(!(UCSR0A & (1<<UDRE0)));// 若UDRE0=0 等待
Serial.write(data.b[0]);
// while(!(UCSR0A & (1<<UDRE0)));// 若UDRE0=0 等待
Serial.write(data.b[1]);
delay(1000);
}
或
union uData
{
byte b[2];
int value;
};

union uData data;
void setup() {
Serial.begin(9600);
delay(1000);
}

void loop() {
data.value=0x3456;
Serial.write(0x21);//起始 字元
Serial.write(data.b,2);
delay(1000);
}



接收端

#define Led  12
union uData
{
byte b[2];
int value;
};

union uData data;
 
void setup() {
 Serial.begin(9600);
pinMode(Led,OUTPUT);
digitalWrite(Led,1);
}

void loop() {
  if(Serial.available()>0)
{
  if(Serial.read()==0x21) //判斷是否為起始字元
  {
   //delay(10);//若資料傳遞不正確 可再加長
   // Wait until data is received  (不用delay)
   while ( !(UCSR0A & (1 << RXC0)) )  ;
   data.b[0]=Serial.read();
  
//delay(10);//若資料傳遞不正確 可再加長
  // Wait until data is received  (不 用delay) 
   while ( !(UCSR0A & (1 << RXC0)) )  ;
   data.b[1]=Serial.read();
   if(data.value==0x3456)
    { //Toggle D12
        digitalWrite(Led,1-digitalRead(Led));
      //asm("SBI 0x03,4");
    }
  }
 
  }
 }

或

#define Led  12
union uData
{
byte b[2];
int value;
};

union uData data;
 
void setup() {
 Serial.begin(9600);
pinMode(Led,OUTPUT);
digitalWrite(Led,1);
}

void loop() {
  if(Serial.available()>0)
{
  if(Serial.read()==0x21) //判斷是否為起始字元
  {
 // delay(10);//若資料傳遞不正確 可再加長
  Serial.readBytes(data.b,2);
   if(data.value==0x3456)
    {
     //Toggle D12
        digitalWrite(Led,1-digitalRead(Led));
      //asm("SBI 0x03,4");
    }
  }
 
  }
 }

使用拉桿控制輪型機器人速度(App Inventor 2)




//紅外線感測 與 藍芽遙控  (練習程式合併)
//#define 與 #include 區
#define led  6
#define led1  7
#define irIn A3
//宣告區
int  inB;
int val;
//setup() 設定區:只執行一次
void setup() {
  Serial.begin(115200);
  pinMode(led,OUTPUT) ;
  digitalWrite(led,LOW);

  pinMode(led1,OUTPUT) ;
  digitalWrite(led1,LOW);
}
//loop() 無限迴圈區
void loop() {
    val=analogRead(irIn);
    if(val>500)
      digitalWrite(led1,LOW);
    else
      digitalWrite(led1,HIGH);
   if (Serial.available() > 0) {
     inB = Serial.read();
     if (inB=='1') digitalWrite(led,HIGH);//LED ON
     if (inB=='0') digitalWrite(led,LOW); //LED OFF
   }

}





RoboRemo(web)(pdf)
Google play   搜尋:  RoboRemoFree Arduino Bluetooth