日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

arduino陀螺仪蓝牙通讯手势小车

發布時間:2023/12/8 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

一.學習目標
知識目標

  • 了解智能小車模塊引腳接口圖
  • 了解HC-05,HC-06的工作原理
  • 了解陀螺儀模塊MPU6050工作原理
  • 技能目標
    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 :通過if指令,用戶可以讓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,同理后面的代碼皆是如此。

    電路設計:
    本實驗主要是三部分,

  • 通過Arduino和庫實現藍牙和藍牙溝通連接.
  • 直流電機的速度改變
  • 陀螺儀算法和程序
    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陀螺仪蓝牙通讯手势小车的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 男人和女人日批 | 超碰导航 | 久久77777| 一级肉体全黄裸片中国 | 天堂在线资源8 | 91丨porny丨在线 | 好了av在线 | 色伊伊| 午夜激情欧美 | 精品欧美一区二区久久久久 | 国产激情一区 | 国产91av在线 | 成av人片在线观看www | 综合色网站 | 91麻豆精品国产午夜天堂 | 波多野结衣电影在线播放 | 蜜桃久久一区二区三区 | 2018中文字幕在线观看 | 中国毛片网| 国产女人水真多18毛片18精品 | 耳光调教vk| a级成人毛片 | 日日淫| 少妇激情网 | 国产又粗又长又大 | 97国产在线播放 | 欧美乱日| 日韩不卡免费视频 | 国精品一区 | 亚洲大逼 | 国内偷拍久久 | 国产精品毛片一区二区在线看舒淇 | 亚洲综合图 | 国产女人18水真多毛片18精品 | 曰批免费视频播放免费 | 涩涩视屏 | 三级黄色在线视频 | 少妇一级淫片免费播放 | 超污视频软件 | 91天天干 | 91精品国产91久久久久福利 | 一本色道久久综合亚洲二区三区 | 91美女片黄在线观看 | 综合久久中文字幕 | 日韩三级在线 | 国产成人精品在线视频 | 国产在线观看免费 | 国产黄色录相 | 美女在线观看视频 | 一极黄色大片 | 久久av资源网 | 伊人久久久久久久久久 | 国产精品久久久久久一区二区三区 | 久久在线播放 | 欧美日韩一区三区 | 熟妇人妻系列aⅴ无码专区友真希 | www.爱色av.com | 豆花视频在线 | 午夜视频在线观看一区二区 | 在线观看亚洲区 | 四虎影院新网址 | 国产精品电影一区二区三区 | 日韩欧美视频一区二区三区 | 日韩www在线观看 | 99r热| 亚洲精品国产成人无码 | 成人精品毛片 | 天天5g天天爽免费观看 | 黄色av国产 | 亚洲综合图片一区 | 欧美18—19性高清hd4k | 欧美3p视频 | 久久久久久久久久一区二区 | 久久成人乱码欧美精品一区二区 | 久久精品夜色噜噜亚洲a∨ 中文字幕av网 | 91久久精品日日躁夜夜躁国产 | 国产又粗又猛又爽又黄 | 强行挺进白丝老师里呻吟 | 91美女片黄在线观看 | a级片在线播放 | 国产三级在线观看视频 | 午夜精品福利视频 | 一区二区在线影院 | 精品色综合 | 涩涩视频在线 | 成人va在线观看 | 一区二区三区免费观看 | 日韩电影在线观看一区二区 | 午夜激情啪啪 | 国产盗摄一区二区 | 国产精品福利网站 | 91av中文字幕| 色综合久 | 亚洲日本在线观看 | 色优久久 | 黄色wwwww | 激情内射亚洲一区二区三区爱妻 | 午夜视频免费观看 | 999一区二区三区 |