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微控制器(1838的VCC、GND和訊號腳分別接Arduino的VCC、GND和11腳),Arduino微控制器通過串列埠連線電腦,電腦開啟Arduino,並開啟IRrecvDump這一例程,選擇好Arduino微控制器型號和串列埠(我的是
用nikon自帶遙控器對著1838按一下,就可以在Serial Monitor讀到如圖的Raw碼。
首先我是不知道這些Raw碼是什麼意思,先留著。各種參考資料說就獲得的Raw做以下操作:
1、去掉第一個數字;2、全部數字取絕對值;3、將空格改為逗號(英文狀態)。並存儲為以下陣列,比如
unsigned int test[]={550,1350,550,3350,500}。
為什麼要這麼操作,一開始我也是不知道。後面通過檢視下載的IRremote庫的IRremot.h和IRremote.cpp程式碼終於明白了,下文會提及到
將上圖的電路連線好了之後(紅外發送二極體接330歐姆電阻接Arduino的PWM腳,即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這個函式就是用來改變PWM(3號腳)的高低值(0或1),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.h和IRremote.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.