1. 程式人生 > >bluetooth控制Arduino微控制器的紅外發射裝置(一)——Arduino部分

bluetooth控制Arduino微控制器的紅外發射裝置(一)——Arduino部分

開學初,聽到某同學在臺灣留學時候,成功使用Android手機通過bluetooth裝置控制Arduino微控制器來實現對宿舍空調的遙控。當時就覺得蠻有趣的,但是他的Android手機程式是通過Appinventor寫的,我就想是否自己能夠通過Eclipse來重新實現這一過程,也就是用Android手機通過Bluetooth控制Arduino微控制器來遙控空調。但是宿舍空調離我的實驗室比較遠,所以先用Nikon D3300來試試手。

今天先Arduino遙控nikon d3300的心酸歷程。

廢話不多講,接下來我們進入正題。首先我們來看一下總的思路

 

相信上圖顯示的流程大家都不難理解。接下來就是各個部分的詳細情況。

首先我們知道,要通過Arduino來遙控紅外裝置,就得知道Arduino微控制器需要傳送給紅外發射二極體什麼碼型或者什麼波形。我參考了《Arduino互動設計入門》以及網上各大Arduino資料,基本上都是使用IRremote這個開源的庫來讀取碼型IRremote庫下載地址:點選開啟連結


當然,我也會去嘗試。將1838一體化紅外接收頭連線好Arduino微控制器(1838VCCGND和訊號腳分別接ArduinoVCCGND11腳),Arduino微控制器通過串列埠連線電腦,電腦開啟Arduino,並開啟IRrecvDump這一例程,選擇好Arduino微控制器型號和串列埠(我的是

Arduino MEGA 2560),並開啟Serial Monitor,如圖。

 

nikon自帶遙控器對著1838按一下,就可以在Serial Monitor讀到如圖的Raw碼。

 

首先我是不知道這些Raw碼是什麼意思,先留著。各種參考資料說就獲得的Raw做以下操作:

1、去掉第一個數字;2、全部數字取絕對值;3、將空格改為逗號(英文狀態)。並存儲為以下陣列,比如

unsigned int test[]={550,1350,550,3350,500}。


為什麼要這麼操作,一開始我也是不知道。後面通過檢視下載的IRremote庫的IRremot.hIRremote.cpp程式碼終於明白了,下文會提及到

 

將上圖的電路連線好了之後(紅外發送二極體接330歐姆電阻接ArduinoPWM腳,即3號腳),通過Arduino編寫如下程式碼傳送剛剛獲取的Raw碼。

unsigned int test[]={550,1350,550,3250,500};
irsend.sendRaw(test,5,38);
delay(100);
irsend.sendRaw(test,5,38);


其實我也不知道兩次碼型傳輸之間的間隔是多少,所以就試了100ms(這並不重要)。

照理來說,這時候應該是可行了吧。

但是但是,冥冥註定,這篇文照會有所不同,所以我還未能通過Arduino來操控nikon d3300

一開始很灰心,因為明明按照參考書來操作的,怎麼就跟劇本發展不同呢。接下來就是本文的重點了。

我從實驗室找來了一臺示波器(型號:Agilent Technologies InfiniiViision DSO-X 3034A),來記錄遙控器和Arduino傳送的波形有什麼區別。

 

上圖為接收到的遙控器的波形。

 

上圖為Arduino微控制器通過test傳送的Raw碼接收到的波形。對比遙控器的波形,很明顯我們可以看出,Arduino傳送的波形少了前面一小段,那麼只要我們增加前面的一小段訊號,那麼就可以用Arduino來遙控單反了。現在問題來了,前面一小段波形怎麼新增呢?

通過檢視IRremote.cpp裡面的IRsendRaw函式,我們就可以知道IRsendRaw這個函式是做了什麼事情。

void IRsend::sendRaw(unsigned int buf[], int len, int hz)
{
  enableIROut(hz);
  for (int i = 0; i < len; i++) {
    if (i & 1) {
      space(buf[i]);
    } 
    else {
      mark(buf[i]);
    }
  }
  space(0); // Just to be sure
}
 
 
void IRsend::mark(int time) {
  // Sends an IR mark for the specified number of microseconds.
  // The mark output is modulated at the PWM frequency.
  TIMER_ENABLE_PWM; // Enable pin 3 PWM output
  delayMicroseconds(time);
}
 
void IRsend::space(int time) {
  // Sends an IR space for the specified number of microseconds.
  // A space is no output, so the PWM output is disabled.
  TIMER_DISABLE_PWM; // Disable pin 3 PWM output
  delayMicroseconds(time);
}


來到這裡,我們就可以比較清IRsendRaw這個函式就是用來改變PWM3號腳)的高低值(01),test陣列內的數字是用來延時的(單位:微秒),這也就是要講讀取到的陣列內的數字全部取絕對值的原因。一旦我們讀取出遙控器傳送的訊號波形的時間引數,再重新定義一個test2[]陣列,讓Arduino傳送這個test2[陣列,我們就可以讓Arduino傳送的波形和遙控器傳送的波形一模一樣,也就可以來遙控單反了

通過測量遙控器傳送波形的時間引數,我們重新定義了

unsigned int test1[]={2086,27038,556,1372,532,3384,516};
irsend.sendRaw2(test1,7,38);
delay(67);
irsend.sendRaw2(test1,7,38);


  and 

上左圖為Arduino重新發送的波形,上右圖是遙控器傳送的波形。基本上訊號(兩段)是一樣的(PS:兩段訊號之間的時間間隔影響不大)。到這裡,我他喵的終於成功了。

細心的同學可能會發現我使用的是irsend.sendRaw2(test1,7,38)函式而非irsend.sendRaw(test1,7,38)函式。這是涉及到溢位問題,可參考http://www.geek-workshop.com/archiver/tid-9763.html

這篇文章寫得很好,我也是按照裡面去IRremote.hIRremote.cpp新增sendRaw2()mark2()space2()函式的。

接下來,我會更新如何使用Eclipse來程式設計Android連線Bluetooth模組的。

相關推薦

bluetooth控制Arduino微控制器紅外發射裝置——Arduino部分

開學初,聽到某同學在臺灣留學時候,成功使用Android手機通過bluetooth裝置控制Arduino微控制器來實現對宿舍空調的遙控。當時就覺得蠻有趣的,但是他的Android手機程式是通過Appinventor寫的,我就想是否自己能夠通過Eclipse來重新實現這一過程

Arduino ESP8266 建立OneNet裝置

使用者註冊 使用者註冊和產品建立我們在OneNET平臺上開展產品開發的前提。為了使用OneNET裝置雲的強大功能,首要做的是在OneNET上註冊您的開發者賬號,來建立您專屬的“開發者中心”; 點選首頁右上角的“註冊”按鈕,註冊使用者賬號; 填寫使用者名稱、使用者密碼、有效手機號

輕松了解Spring中的控制反轉和依賴註入

xml文件 span 做到 添加 resource exce http 實的 name 原文轉自:https://www.cnblogs.com/xxzhuang/p/5948902.html   我們回顧一下計算機的發展史,從最初第一臺計算機的占地面積達170平方米,重達

微控制器高階裸機程式設計-- 資料驅動程式

我理解的所謂資料驅動程式的方法,簡單而言:將資料與程式分析,將程式碼邏輯的組織轉換成數字規律的統計。即將資料作為一個要處理的指令碼(當做資料庫),然後程式作為直譯器,將指令碼的內容用程式碼邏輯解釋出來,實現程式設計功能。 這就要求我們將程式碼邏輯分解出其內在資料關係,這樣我們就可以寫出與資料

噴水裝置貪心

噴水裝置(一) 時間限制:3000 ms  |  記憶體限制:65535 KB 難度:3 描述 現有一塊草坪,長為20米,寬為2米,要在橫中心線上放置半徑為Ri的噴水裝置,每個噴水裝置的效果都會讓以它為中心的半徑為實數Ri(0<Ri<

噴水裝置 nyoj

#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<cmath> using

STC89C52RC控制WS2812B LED 調色調光

前言        一直想自己做一個LED的檯燈,能夠實現三色調節和光暗調節,搜尋了下淘寶裡的可調LED燈發現要麼是隻能調光暗,無法做到單色的調節,要麼就是可以能實現調各種顏色,但是是無線的,多出一個遙控器是什麼鬼...我只是想在臺燈的底座上開三個孔,連上

NYOJ:噴水裝置

http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=6 描述 現有一塊草坪,長為20米,寬為2米,要在橫中心線上放置半徑為Ri的噴水裝置,每個噴水裝置的效果都會讓以它為中心的半徑為實數Ri(0<Ri<15)的圓被溼潤,這有充

微控制器的中斷系統

        想總結中斷由來已久,但是總感覺一章的東西,太多,無從下手。         前幾天看到一句話“能把自己學會的東西說出來,才是真的學會”。今天,就要會一會這中斷系統。     &

微控制器高階裸機程式設計-- 資料驅動程式

我理解的所謂資料驅動程式的方法,簡單而言:將資料與程式分析,將程式碼邏輯的組織轉換成數字規律的統計。即將資料作為一個要處理的指令碼(當做資料庫),然後程式作為直譯器,將指令碼的內容用程式碼邏輯解釋出來,實現程式設計功能。 這就要求我們將程式碼邏輯分解出其內在資料關係,這樣我

南陽理工ACM:噴水裝置題目及解法

描述 現有一塊草坪,長為20米,寬為2米,要在橫中心線上放置半徑為Ri的噴水裝置,每個噴水裝置的效果都會讓以它為中心的半徑為實數Ri(0<Ri<15)的圓被溼潤,這有充足的噴水裝置i(1<i<600)個,並且一定能把草坪全部溼潤,你要做的是:選擇儘量

鬆翰微控制器--SN8F5702學習筆記uart暫存器

暫存器 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 S0CON SM0 SM

NYOJ 6:噴水裝置貪心

6-噴水裝置(一) 記憶體限制:64MB 時間限制:3000ms 特判: No 通過數:68 提交數:111 難度:3 題目描述: 現有一塊草坪,長為20米,寬為2米,要在橫中心線上放置半徑為Ri的噴水裝置,每個噴水裝置的效果都會讓以它為中心的半徑為實數Ri(0<R

貪心演算法之——噴水裝置

描述 現有一塊草坪,長為20米,寬為2米,要在橫中心線上放置半徑為Ri的噴水裝置,每個噴水裝置的效果都會讓以它為中心的半徑為實數Ri(0<Ri<15)的圓被溼潤,這有充足的噴水裝置i(1

Linux裝置驅動之字元裝置

Linux中裝置驅動的分類 從上圖可以看到Linux系統將各異的裝置分為三大類:字元裝置,塊裝置和網路裝置。核心針對每一類裝置都提供了對應驅動模型架構,包括基本的核心設施和檔案系統介面。 字元裝置:在傳送過程中以字元為單位,一個位元組一個位元組的讀寫,不

自定義控制元件三部曲之動畫篇——alpha、scale、translate、rotate、set的xml屬性及用法

前言:這幾天做客戶回訪,感觸很大,使用者只要是留反饋資訊,總是一種恨鐵不成鋼的心態,想用你的app,卻是因為你的技術問題,讓他們不得不放棄,而你一個回訪電話卻讓他們盡釋前嫌,當最後把手機號留給他們以便隨時溝通的時候,總會發來一條條的鼓勵簡訊,讓我不自主的開始內疚。哎,多麼可愛

南陽理工學院oj_噴水裝置

#include<iostream> #include<algorithm> #include<cmath> using namespace std; int main() { int n; while(cin >> n)

ESP32入門Arduino開發--Arduino環境搭建

注:對於ESP32開源技術感興趣的可以加群,我們一起探索交流學習,群號:782473783。群名:ESP32開源技術交流群。 在64位Windows7機器上測試 Windows Installer從arduino.cc下載並安裝最新的ArduinoIDE

轉:定義控制元件三部曲之動畫篇——alpha、scale、translate、rotate、set的xml屬性及用法

前言:這幾天做客戶回訪,感觸很大,使用者只要是留反饋資訊,總是一種恨鐵不成鋼的心態,想用你的app,卻是因為你的技術問題,讓他們不得不放棄,而你一個回訪電話卻讓他們盡釋前嫌,當最後把手機號留給他們以便隨時溝通的時候,總會發來一條條的鼓勵簡訊,讓我不自主的開始內疚。哎,多麼

字元裝置最簡單的字元裝置

1. read_mem 和 write_mem這兩個函式比較容易理解,主要是使用copy_to_user和copy_frome_user對資料時行拷貝,其他的函式也都類似,較容易理解/* * This funcion reads the *physical* memory.