arduino陀螺仪蓝牙通讯手势小车
新的改變
目錄
手勢小車 1
一、學習目標 2
知識目標 2
技能目標 2
二、背景知識 2
三、知識儲備 3
ARDUINO NANO 2
ARDUINO UNO 4
面包板 6
智能小車模塊 4
藍牙模塊HC-O6 5
藍牙模塊HC-O5 5
陀螺儀模塊 5
直流電機 5
Arduino編程語句 6
Arduino邏輯運算符 7
四、案例實現 14
案例描述 14
器械清單15
電路接線 16
電路設計 16
電路仿真 16
單元調試 16
各個程序編寫 21
五、任務擴展 21
六、手勢小車程序 21
一.學習目標
知識目標
技能目標
1.學會使用if函數
2.串口通訊監視
3.學會自定義函數
4.學會設置藍牙
5.學會控制直流電機
6.學會調用庫
!](https://img-blog.csdnimg.cn/20210619155308197.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81MjUzMTY5OQ==,size_16,color_FFFFFF,t_70)
二.背景知識
小車的開發已經比較成熟,市場上遍布遙控小車等等,現階段很多的東西都可以實現手機藍牙控制,我現在的目的就是實現硬件單片機和單片機之間藍牙的連接,不斷的創新實現家中的東西萬物互聯。
三.知識儲備
Arduino Nano
Arduino Nano 是一款類似Arduino UNO的開發板。區別是Nano的尺寸更加小巧。Arduino Nano 是一款基于 ATmega328P的開發板。它可以直插面包板的 。Arduino Nano 與Arduino Uno十分類似。它與Uno的區別是Nano沒有直流電壓供電接口同時Nano通過Mini-B USB 接口與電腦連接。
主要技術參數
微控制器 ATmega328P
工作電壓 5伏特
Flash Memory(閃存) 32 KB (ATmega328P) 其中由 0.5 KB用于系統引導(bootloader)
SRAM(靜態存儲器) 2 KB (ATmega328P)
EEPROM 1 KB (ATmega328P)
模擬輸入引腳 8個
EEPROM 1Kb
輸入/輸出引腳直流電流 40 毫安
輸入電壓 7-12伏特
數字輸入輸出引腳 22個(其中有6個引腳可作為PWM引腳)
PWM引腳 6個
3.3V引腳電流 50 毫安
長 45 mm
寬 18 mm
重 7克
時鐘頻率 16 MHz
Nano的引腳圖
Arduino Uno
在Arduino開發板家族中,Uno開發板是最適合初學者的Arduino開發板。由于它簡單易學、穩定可靠,Uno開發板也是應用最為廣泛且參考資料最多的開發板。
Arduino Uno 是一款基于 微控制器 ATmega328P的開發板。它有14個數字輸入/輸出引腳(這些引腳中有6個引腳可以作為PWM輸出引腳),6個模擬輸入引腳,16 MHz石英晶振,USB接口,電源接口,支持在線串行編程以及復位按鍵。用戶只需要將開發板與電腦通過USB接口連接就可以使用。
UNO主要技術參數
微控制器 ATmega328P
工作電壓 5伏特
輸入電壓(推薦) 7-12伏特
輸入電壓(極限) 6-20伏特
數字輸入輸出引腳 14個(其中有6個引腳可作為PWM引腳)
PWM引腳 6個
模擬輸入引腳 6個
輸入/輸出引腳直流電流 20 毫安
3.3V引腳電流 50 毫安
Flash Memory(閃存) 32 KB (ATmega328P) 其中由 0.5 KB用于系統引導(bootloader)
SRAM(靜態存儲器) 2 KB (ATmega328P)
EEPROM 1 KB (ATmega328P)
內置LED引腳 13
面包板
這款面包板豎側相同(紅線處標明),藍線處顯示橫側導通
如圖這款面包板體積較小,沒有橫側通的功能但是比較方便,只可豎側通
智能小車模塊
這塊板子能實現許多小車方面的功能,非常方便試驗圖中標明了各個引腳的功能,但是以下是我使用后的獨到經驗。IN3,IN4對應的是左輪; IN1,IN2,對應的是右輪,EN2左輪改變電壓調節速度口,EN1右輪改變電壓調節速度口,同樣循跡模塊OUT3,OUT4對應左輪; OUT1,OUT2對應右輪,那4個綠色指示燈就是用來顯示循跡模塊的反應的。
智能小車上的EN1,EN2引腳作用和L298N模塊是一樣的
(個人總結:在使用智能小車模塊的時候開關處會發燙是正常現象)
還有就是電源可以連接11.4V的鋰電池連接智能小車模塊(接口再板子下方),再通過5V電源接口給Arduino供電,注意不同的電機接線方法,電機正反轉的方向會不同
HC-06藍牙模塊
藍牙通訊
定義:藍牙通訊是指依據藍牙協議進行通訊。在Arduino項目中我們常常使用藍牙模塊進行藍牙通訊,藍牙模塊是一種集成了藍牙功能的PCB板,可以實現短距離的無線數據傳輸。
HC-06是一個從機端藍牙,不可實現像手機這類主機端藍牙的功能,可以發出信息和接收信息前提是一個主機一個從機端,本次手勢小車就是用到其的從機功能用來發送信息給小車上的藍牙,實現手勢控制。切記HC06的初始波特率是9600
(實驗發現,HC-06的信息發送延時非常高,所以建議用JDY_31,HC-08等更高級的藍牙模塊)
實例程序
如圖接法,HC06的RX,TX都必須是3.3V左右,由于Uno高電頻為5V電壓需要通過歐姆電阻降壓,注意如果您是接在UNO板上的RX,TX引腳上上傳程序時需先斷開藍牙與UNO的連接因為,UNO上傳程序也是通過TX,RX引腳,這兩個引腳不能受干擾,不然程序上傳不上去的
通過搜索此軟件下載到手機后,就可通過手機連接HC06了,此時的HC06是從機狀態,輸入0,1就可控制ARDUNIO上的板載燈了。
登陸界面自己去學習學習,探索探索
復制這段內容后打開百度網盤手機App,
鏈接:https://pan.baidu.com/s/1jnMJvNdNh_yrXr3nuBh_2w
提取碼:8686
---- AT指令 ----
指令 答復 說明
AT OK 通訊測試
AT+VERSION OKlinvorV1.8 固件版本
AT+NAMEmyBTmodule OKsetname 設置設備名 “myBTmodule”
AT+PIN6789 OKsetPIN 設置設備 PIN 6789
AT+BAUD1 OK1200 設置波特率 1200
AT+BAUD2 OK2400 設置波特率 2400
AT+BAUD3 OK4800 設置波特率 4800
AT+BAUD4 OK9600 設置波特率 9600
AT+BAUD5 OK19200 設置波特率 19200
AT+BAUD6 OK38400 設置波特率 38400
AT+BAUD7 OK57600 設置波特率 57600
AT+BAUD8 OK115200 設置波特率 115200
AT+BAUD9 OK230400 設置波特率 230400
AT+BAUDA OK460800 設置波特率 460800
AT+BAUDB OK921600 設置波特率 921600
AT+BAUDC OK1382400 設置波特率 1382400
這是HC06的AT指令,打開串口監視器發送AT接收到OK后即可設置了,盡量不要修改密碼后文會提及原因的
如果打開不了AT模式,嘗試斷開電源,藍牙重新連接電源,記住一定要再NL和CR下發送信息
HC-05藍牙模塊
HC-05引腳說明
STATE:藍牙連接狀態指示,連接成功此引腳為高電平,沒有連接則為低電平
RX:接收端
TX:發送端
GND:接地端
+5V:5V電源輸入端
EN:使能端,需要進入AT模式時接3.3V。其實不接也沒有關系
接線
HC05—>Arduino
RX —>11
TX —>10
GND —>GND
+5V —>5V
接線實物圖
三. 進入AT模式
在HC-05藍牙模塊的正面會有一個圓形按鍵,摁住的過程中給藍牙模塊上電,藍牙模塊的指示燈慢閃(2秒亮一次),即說明已經進入AT模式。(切記)
四. 藍牙模塊基本配置
模塊默認波特率為38400、默認配對密碼為1234、默認名稱為HC-05, AT模式波特率固定38400,8位數據位、1位停止位、無奇偶校驗的通信格式。
AT+NAMEHC05 //修改藍牙模塊名稱為HC05
AT+ROLE=1 //藍牙模式為主模式
AT+CMODE=1 //藍牙連接模式為任意地址連接模式,也就是說該模塊可以被任意藍牙設備連接
AT+PSWD=1234 //藍牙配對密碼為1234
AT+BAUD4 //藍牙通信串口波特率為9600
如圖為HC05 AT模式設置程序,設置過程中為了方便后文實驗,我們需將其初始波特率38400改成9600,將其設置為主機,可以試試手機APP連接藍牙如果連接不上,恭喜你成功了,因為主機和主機是無法連接的。切勿修改密碼因為HC06,HC05初始PIN都是1234,只要波特率,密碼一樣這對主從即可連接。
MPU6050陀螺儀
MPU6050是一種非常流行的空間運動傳感器芯片,可以獲取器件當前的三個加速度分量和三個旋轉角速度。
上面兩個圖我是從6050芯片的中文資料上截下來的其中對應的6、7號引腳就是XDA和XCL,23、24對應的就是SCL和SDA。所以XDA和XCL就是用來與其他傳感器進行I2C通信用的,SDA與SCL就是與控制器進行I2C通信。所以我們這次所要使用的就只有SDA和SCL這兩個引腳與Arduino進行通信。而至于INT腳就是用來中斷用的。這次實驗是用不到的,所以可以選擇不接。I2C的 Slave地址的最低有效位( LSB)用AD0設置,如果AD0不接的話從"WHO I AM"寄存器(地址0X75)中讀取應該是0X68,如果接低的話應該是0XD0,接高的話就是0XD1。當然這個并不重要,不過可以檢測你的I2C通信是否正確。
在UNO板子上,SDA接口對應的是A4引腳,SCL對應的是A5引腳。MPU6050需要5V的電源,可由UNO板直接供電。
Arduino的I2C通信
因為我們大家都是初學者可能并不會什么I2C通信,但是Arduino就是為了方便我們設計的,它已經有了I2C通信的庫文件了,那就是Wire庫。具體庫的介紹,大家可以查詢官方文件什么的,我就不詳細介紹了。實例程序:
如圖試驗程序時,我們只需要使用SCL,SDA,VCC,GND這幾個引腳,其他的變量正是使用到I2C,這不是我們本次實驗要學的內容,但是可以課外拓展拓展。打開串口觀察X軸加速度變化。
左右搖擺觀察變化
直流電機
這是兩個程序關于直流電機的,如果你不使用analogWrite();那么它會默認為255“高”電壓,把電池的最大電壓直接給他而-255意思是電流反向且最大,實現倒退。 切記這些都是在L298N模塊條件下實現的功能(智能小車模塊自帶)。 再次強調,接線不同,電機轉的方向不同。
arduino編程語句
if(表達式) { 語句塊 } [/c] 上述結構表示:如果 “表達式” 的條件得到滿足則執行語句塊。否則 Arduino將不執行該語句塊。(如圖所示)
2. while: while循環將會連續地無限地循環,直到圓括號()中的表達式變為假。被測試的表達式變量必須被改變,否則while循環將永遠不會中止。可以在代碼改變測試變量,比如讓該變量遞增,或者通過外部條件改變測試變量,比如將一個傳感器的讀數賦值給測試變量。
while(表達式/循環條件){ 語句塊/循環體 }先計算表達式的值,當值為真(非0)時, 執行循環體語句;執行完循環體語句,再次計算表達式的值,如果為真,繼續執行循環體……這個過程會一直重復,直到表達式的值為假(0)才退出循環。其執行過程如圖所示:
set up函數: 當Arduino程序開始運行時會調用setup()函數。通常我們setup()函數其中初始化一些變量、引腳狀態及一些調用的庫等。當Arduino控制器通電或復位后,setup函數會運行一次。
Loop函數: 在setup()函數對程序完成了初始化后,loop()函數將會運行。loop函數是一個循環體,在Arduino啟動后,loop()函數中的程序將會不斷運行。通過loop()函數你可以利用你的程序來控制Arduino。
Arduino 庫 :通過庫的使用可以拓展Arduino開發板的功能。因為有了庫,我們可以很輕松的實現Arduino與外部硬件的協作或進行數據通訊。
邏輯運算符
<= ; >= 比較運算符用于和 if 聯合使用,測試某一條件是否達到。例如測試Arduino的某一個引腳輸入值是否達到設定數值。如果是則執行特定程序。換句話說,如果圓括號中的語句為真,大括號中的語句就會運行。否則,程序跳過該代碼。【邏輯】-【比較運算符】
模塊介紹
布爾運算符可用于if語句中的條件判斷:
&& (邏輯與)
只有在兩個操作數都為真時才返回真。 不要混淆布爾與運算符,&&(兩個&符號)和按位與運算符&(單個&符號)。它們是完全不同的概念。
|| (邏輯或)
任意一個為真時返回真
示例程序 (可雙擊程序內容全選代碼):
不要混淆布爾或運算符||(雙豎杠)和按位或運算符|(單豎杠)。
! (邏輯非)
當操作數為假時返回真
四、案例實現
再把所作的四個程序組裝,手勢小車的程序就出來了。
用物器械
名稱 數量
Ardunio Uno 1個
Ardunio Nano 1個
HC06藍牙模塊 1個
HC05藍牙模塊 1個
直流電機 2個
陀螺儀模塊 1個
智能小車模塊 1個
鋰電池 2個
面包板 2個
杜邦線 1捆
編寫主機端程序
這是主機端HC05的程序,負責接收HC06發出的數據,首先調用softwareserial庫實現藍牙功能,然后就是定義車輪的端口,ena,enb是電機的pwm端口(改變經過直流電機的電壓),10行char把val定義成字符串變量,在set up 函數中設置藍牙波特率同時2224行先讓它暫停,然后loop函數中28行如果藍牙有接收到數據且接收到的數據為“g”,則執行向前走的程序經過直流電機的電壓為電池的95/255,并在串口監視器中輸出“go”,同理4078行一個意思。(根據程序來連接引腳)
首先調用藍牙的庫,35行都是關于陀螺儀的庫,上文介紹過wire庫的內容,822行都是關于陀螺儀的算法,set up和loop中有大量的計算公式,這不是我們要學的但是圖上有部分介紹如果想學習可以上網搜索。
至147行以上數據皆是關于陀螺儀算法的,所以我們的中心在后方,Accy角速度Y軸,Accx角速度X軸,182行如果Accx大于40且小于90度則串口監視器輸出“g”,且從機端HC06發送“g”給HC05,同理后面的代碼皆是如此。
電路設計:
本實驗主要是三部分,
4.藍牙的硬件設置
五.任務擴展:
四.手勢小車實驗程序
程序編寫:
它的程序就是以上程序的拼裝,當你明白以上程序時相信你也會編寫了。
//bluetheeth host //模塊A,智能硬件模塊,與家居常用物品綁定使用,成為智慧物品 #include<SoftwareSerial.h> int input1 = 7; // 定義uno的pin 5 向 input1 輸出 int input2 = 2; // 定義uno的pin 6 向 input2 輸出 int input3 = 3; // 定義uno的pin 9 向 input3 輸出 int input4 = 4; // 定義uno的pin 10 向 input4 輸出 int enA = 5; //這里對應兩個ENA引腳 int enB = 6; SoftwareSerial BT(10, 11); // uno的10接藍牙的TX,11接藍牙的RX String *val;//定義參數接收藍牙的值 long Accx; //int temps; void setup() {Serial.begin(9600);BT.begin(9600);//藍牙波率設置為9600 pinMode(7,OUTPUT); pinMode(2,OUTPUT); pinMode(3,OUTPUT); pinMode(4,OUTPUT); pinMode(5,OUTPUT); pinMode(6,OUTPUT); //val = 0; //String變量是可以讓其只讀取字符串不讀取字符的 //&val ='j';digitalWrite(input1,LOW);digitalWrite(input2,LOW); digitalWrite(input3,LOW);digitalWrite(input4,LOW); Serial.println( "stop" ); } void loop() { if(BT.available()>0){val=BT.read();//Accx=BT.read();if(val=='g') //如果控制信息數值為FFA857 加號{ // go on 向前走Accx=BT.read();digitalWrite(input1,LOW); //給高電平digitalWrite(input2,HIGH); //給低電平digitalWrite(input3,LOW); //給高電平digitalWrite(input4,HIGH); //給低電平 analogWrite(enA,100);analogWrite(enB,103); //右輪速度較慢,需要程序調速 Serial.println( "go");Serial.println(Accx ); } else if(val=='b') //如果控制信息數值為FFE01F 減號{ // go back 向后走Accx=BT.read();digitalWrite(input1,HIGH); //給高電平digitalWrite(input2,LOW); //給低電平digitalWrite(input3,HIGH); //給高電平digitalWrite(input4,LOW); //給低電平analogWrite(enA,80);analogWrite(enB,80);Serial.println( "back" ); // Serial.println(60 ); }else if(val=='l') {Accx=BT.read(); digitalWrite(input1,LOW);//左轉digitalWrite(input2,LOW); digitalWrite(input3,LOW); digitalWrite(input4,HIGH); //digitalWrite(input3,LOW); //digitalWrite(input4,HIGH); analogWrite(enA,110);analogWrite(enB,110);Serial.println("left" ); // Serial.println(Accx ); }else if(val=='r'){Accx=BT.read();digitalWrite(input1,LOW); //右轉digitalWrite(input2,HIGH);digitalWrite(input3,LOW); digitalWrite(input4,LOW); analogWrite(enA,110);analogWrite(enB,110); Serial.println( "right" ); //Serial.println( Accx ); }else if(val=='s'){digitalWrite(input1,LOW);digitalWrite(input2,LOW); digitalWrite(input3,LOW);digitalWrite(input4,LOW); Serial.println( "stop" );}//else if(10<Accx<120){ //功能函數 // Serial.println( "hello" ); //這里是驗正是否有Accx數值輸出 // if( temps <= Accx){ // Serial.println("Accx high"); // temps = Accx ; //} // }} } //bluetheeth follow 這是陀螺儀方面的代碼 #include <SoftwareSerial.h> SoftwareSerial BTserial(10, 11); #include "Wire.h" #include "I2Cdev.h" #include "MPU6050.h" MPU6050 accelgyro; unsigned long now, lastTime = 0; float dt; //微分時間 A4連接SDA A5連接SCL int16_t ax, ay, az, gx, gy, gz; //加速度計陀螺儀原始數據 Typedef符號字符 float aax=0, aay=0,aaz=0, agx=0, agy=0, agz=0;//角度變量 long axo = 0, ayo = 0, azo = 0; //加速度計偏移量 long gxo = 0, gyo = 0, gzo = 0; //陀螺儀偏移量 float pi = 3.1415926; float AcceRatio = 16384.0; //加速度計比例系數 float GyroRatio = 131.0; //陀螺儀比例系數 uint8_t n_sample = 8; //加速度計濾波算法采樣個數 float aaxs[8] = {0}, aays[8] = {0}, aazs[8] = {0}; //x,y軸采樣隊列 long aax_sum, aay_sum,aaz_sum; //x,y軸采樣和 float a_x[10]={0}, a_y[10]={0},a_z[10]={0},g_x[10]={0},g_y[10]={0},g_z[10]={0}; //加速度計協方差計算隊列 float Px=1, Rx, Kx, Sx, Vx, Qx; //x軸卡爾曼變量 float Py=1, Ry, Ky, Sy, Vy, Qy; //y軸卡爾曼變量 float Pz=1, Rz, Kz, Sz, Vz, Qz; //z軸卡爾曼變量 volatile int Accy; volatile int Accx; void setup() {Serial.begin(9600);BTserial.begin(9600); Accy = 0;Accx = 0;Serial.print("HC-06 DEMO/TEST ");//BTserial.print("AT"); //可在此處輸入設置HC-06藍牙模塊的AT指令。//此AT指令須在HC-06未連接藍牙狀態輸入。pinMode(LED_BUILTIN, OUTPUT);//BTserial.println( "blueteeth is open");Wire.begin();accelgyro.initialize(); //初始化unsigned short times = 200; //采樣次數for(int i=0;i<times;i++){accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); //讀取六軸原始數值axo += ax; ayo += ay; azo += az; //采樣和gxo += gx; gyo += gy; gzo += gz;}axo /= times; ayo /= times; azo /= times; //計算加速度計偏移gxo /= times; gyo /= times; gzo /= times; //計算陀螺儀偏移 }void loop(){unsigned long now = millis(); //當前時間(ms)dt = (now - lastTime) / 1000.0; //微分時間(s)lastTime = now; //上一次采樣時間(ms)accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); //讀取六軸原始數值float accx = ax / AcceRatio; //x軸加速度float accy = ay / AcceRatio; //y軸加速度float accz = az / AcceRatio; //z軸加速度aax = atan(accy / accz) * (-180) / pi; //y軸對于z軸的夾角aay = atan(accx / accz) * 180 / pi; //x軸對于z軸的夾角aaz = atan(accz / accy) * 180 / pi; //z軸對于y軸的夾角aax_sum = 0; // 對于加速度計原始數據的滑動加權濾波算法aay_sum = 0;aaz_sum = 0;for(int i=1;i<n_sample;i++){aaxs[i-1] = aaxs[i]; //替換算法aax_sum += aaxs[i] * i; aays[i-1] = aays[i];aay_sum += aays[i] * i;aazs[i-1] = aazs[i];aaz_sum += aazs[i] * i;} aaxs[n_sample-1] = aax;aax_sum += aax * n_sample;aax = (aax_sum / (11*n_sample/2.0)) * 9 / 7.0; //角度調幅至0-90°aays[n_sample-1] = aay; //此處應用實驗法取得合適的系數aay_sum += aay * n_sample; //本例系數為9/7aay = (aay_sum / (11*n_sample/2.0)) * 9 / 7.0;aazs[n_sample-1] = aaz;aaz_sum += aaz * n_sample;aaz = (aaz_sum / (11*n_sample/2.0)) * 9 / 7.0;float gyrox = - (gx-gxo) / GyroRatio * dt; //x軸角速度float gyroy = - (gy-gyo) / GyroRatio * dt; //y軸角速度float gyroz = - (gz-gzo) / GyroRatio * dt; //z軸角速度agx += gyrox; //x軸角速度積分agy += gyroy; //x軸角速度積分agz += gyroz;Sx = 0; Rx = 0;/* kalman start */Sy = 0; Ry = 0;Sz = 0; Rz = 0;for(int i=1;i<10;i++){ //測量值平均值運算a_x[i-1] = a_x[i]; //即加速度平均值Sx += a_x[i];a_y[i-1] = a_y[i];Sy += a_y[i];a_z[i-1] = a_z[i];Sz += a_z[i];}a_x[9] = aax;Sx += aax;Sx /= 10; //x軸加速度平均值a_y[9] = aay;Sy += aay;Sy /= 10; //y軸加速度平均值a_z[9] = aaz;Sz += aaz;Sz /= 10; //Z軸加速度平均值for(int i=0;i<10;i++){Rx += sq(a_x[i] - Sx);Ry += sq(a_y[i] - Sy);Rz += sq(a_z[i] - Sz);}Rx = Rx / 9; //得到方差Ry = Ry / 9; Rz = Rz / 9;Px = Px + 0.0025; // 0.0025在下面有說明...Kx = Px / (Px + Rx); //計算卡爾曼增益agx = agx + Kx * (aax - agx); //陀螺儀角度與加速度計速度疊加Px = (1 - Kx) * Px; //更新p值Py = Py + 0.0025;Ky = Py / (Py + Ry);agy = agy + Ky * (aay - agy);Py = (1 - Ky) * Py;Pz = Pz + 0.0025;Kz = Pz / (Pz + Rz);agz = agz + Kz * (aaz - agz);Pz = (1 - Kz) * Pz; /* kalman end */// 通過串口監視器顯示HC-06發送的數據 // if( BTserial.available()>0 ){ //如果軟件串口有HC-06發來的數據 // char BTserialData = BTserial.read(); //將軟件串口中的數據賦值給變量BTserialData // Serial.print( BTserialData ); //通過硬件串口監視器顯示HC-06發來的數據 // // }int Accy=accy*100;int Accx=accx*100; //Serial.println(Accx); // Serial.println();// Serial.println(Accy); if (Accx >= 35 && Accx <= 95) {Serial.println('g');BTserial.println('g');delay(100);BTserial.println(Accx*1.5);Serial.println(Accx*1.5); //BTserial.write(9);}else if (Accx <= -55 && Accx >= -105) {Serial.println('b');Serial.println((-Accx*1.5));BTserial.println('b'); delay(100);BTserial.println((-Accx*1.5));}else if (Accy <= 85 && Accy >= 35) {Serial.println('l');Serial.println(Accy*1.5);BTserial.println( 'l');delay(100); BTserial.println(Accy*1.5); //BTserial.write(5 );}else if (Accy <= -40 && Accy >= -95) {Serial.println('r');Serial.println((-Accy*1.5));BTserial.println('r'); //println是發送字符串的delay(200); BTserial.println((-Accy*1.5)); //write是發送數字的(0~255)但是是二進制}else if (Accy <= 40 && Accy >= -45 && Accx <= 40 && Accx >= -60) {Serial.println('s');BTserial.println('s'); // BTserial.println努力尋找比其更小的傳輸方式delay(100);}else {BTserial.println('s');delay(100);}}總結
以上是生活随笔為你收集整理的arduino陀螺仪蓝牙通讯手势小车的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LOAM源码解析1一scanRegist
- 下一篇: 重力感应G-Sensor 方向介绍