出來工作也有快兩年的時間了,總結一下自己在嵌入式學習的心路歷程:
大一期間一直待實驗室敲C語言。真正玩起的微控制器還是從大二開始的,當時實驗室導師自己做了一批IAP15的微控制器,但是沒什麼資料,上手很難,於是自己就花了幾十塊錢買了塊STC89C52的微控制器,就跟着視訊教學走,點燈、點蜂鳴器、做密碼鎖和搞矩陣按鍵等等。記得大概是大二末期,老師讓實驗室的成員每個人想一個微控制器專案報給他,然後按計劃實施,當時那段時間我喜歡上了無線傳輸,像什麼藍牙、ESP8266、NRF24L01和紅外NEC傳輸都再玩,覺得很有意思,看不見摸不着的東西在自己手上實現了數據傳輸。於是乎就報了無線紅外空調遙控器,其主要功能:
① 學習實驗室格力和美的空調遙控器的開關鍵碼,實現對空調的控制。
② 實現鍵碼掉電儲存。
③ 增加WIFI模組,實現手機控制收發。
最開始,我在某寶上買了一塊可以支援收發的紅外模組。當時帶紅外發射同時又帶紅外接收模組的微控制器不多,找了好久才找到了一個賣家。好像是做什麼專案剩的幾個,也是STC15系列的主控,賣家很好,送了我一個demo,能夠實現紅外解碼功能的,當時也不知道怎麼驗證,就只會串列埠printf列印。僅僅只有這個小模組,怎麼才能 纔能實現我的無線空調遙控器專案呢?首先這個模組也沒法外接WiFi模組,權衡之下只能先在這個板上調紅外功能,然後自己做板新增其他硬體模組。於是我就拉了實驗室的一個同學合作做這個東西,他重點負責硬體畫圖,我就重點負責軟體功能設計。
因爲都是小白呀,所以一切都得從頭做,我就負責在之前的小模組上偵錯軟體,他就照着這個小模組的原理圖做圖,每天七點鐘去實驗室,晚上十點鐘離開(該上課上課)。當時偵錯過程遇見了很多棘手的問題,這裏列舉一二:
其中有一個很煩的問題,買的那小模組經常下不進去程式,硬體一點都不穩定,非常影響進度。怎麼辦呢?找賣家返修。老闆人也不情願:就一個幾十塊錢的小的東西,你來來回回找我好幾遍。最後軟磨硬泡終於給我換了個,然後老闆人直接商品下架了。換了以後,剛開始用的挺好,最後還是會出現程式下不進去,很迷茫呀!不知道爲啥,也不能找賣家了。模組總是出一些亂七八糟的幺蛾子,進度幾次出現停滯狀態,最後實在沒辦法,尋求實驗室老師幫助,老師給我們換了主控晶片,就好了很多。
還有就是軟體實際偵錯發現,格力和美的人遙控器的數據協定跟你書本上的不一樣呀!書本上是16個位元組好像,但是當時我們實驗室那兩個品牌的空調好像一個是36+36個位元組另一個是48個位元組(時間太久,記不太清了)。關鍵是格力(還是美的)會發兩遍,中間有一個固定時長的低電平連線,實際測試中少發一遍都不能控制。最後沒辦法不能按書本上的來,實現對這兩種品牌的定製化程式設計,因爲兩者的起始碼時序不一樣的,可以憑藉這個識別是哪個品牌,進而實現定製化程式設計。
歷經三四個月,終於板子圖PCB出來了,列印墨紙,腐蝕銅板、焊接元器件,無線空調遙控器V1.0 硬體總算出爐了,第一次下程式很謹慎呀,生怕哪哪弄不好把板子燒了,其實板子也沒有我們想象那麼脆弱,只要保證電源電壓不給高了就行。三四個月的時間,我對紅外NEC通訊協定研究的七七八八了,在小模組上基本實現了對空調的控制(通過按鍵觸發)。最後在做出來的大板上,程式跑的跟小模組一樣,能夠實現基本的控制。但是有一點缺陷,距離太**近了,實測是在1米之內,但是人家遙控器就能在五米前後精準控制,起初懷疑是不是功率不夠呀,又是改電阻又是換電容的,換上之後好像是有點改善,1米內能夠穩定控制,2米穩中帶虛時靈時不靈的。千思百想不應該啊!總是懷疑電路問題,突然有一天,突發奇想測測遙控器的紅外發射管的波形,上了邏輯分析儀,一測!發現門道了,人紅外加的載波跟課本上的不一樣呀!書上說是38KHZ頻率的載波,但是人家用了76KHZ的紅外載波呀!於是,在軟體上改定時器週期,加大了載波頻率。滿懷激動的測了一下,終於成功了,且距離大大提升基本和遙控器的控制距離不相上下!我和另一個同學非常正式的握了握手:「合作愉快!」
這個專案最基本的也是最難的就是紅外來鍵碼的學習和發射了,再後來,爲了那這個作品去參賽,我們又完善了WiFi功能、新增了DHT11模組和ds18b20模組,同時又拉了兩個同學組成團隊,他們負責安卓的app開發和電腦端的上位機開發,實現電腦端和手機與硬體的WiFi數據互動。進了國賽,拿了二等。還有一筆不錯得到獎勵金,高興!
當時就是這個專案,讓我的微控制器程式設計能力有了一些小提高,可以說是完全入門了。學會了畫原理圖,對電路也有深一步瞭解,會用邏輯分析儀、建立通訊協定、各種串列埠互動架構搭建和偵錯方法等等。最後在大四階段就自己完成了用stm32做的一個畢業設計。
大四的下學期11月份,做完畢設就出來實習了。入職了一家搞IOT的方案公司,主要負責搞共用專案的,其主要由GSM模組+微控制器構成,其中GSM通過MQTT/HTTP連線到阿裡雲,公司會做一個自己的平臺連線到阿裡雲上,我主要負責硬體連線阿裡雲以及與阿裡雲數據互動,其實主要就是做Json的封裝與解析以及微控制器對底層控制邏輯。當時鬧了個笑話: 我最開始把Json叫成Jason,被阿裡雲的技術吊: Jason是人名! 除了做這個,還會做stm32的一些專案。記得有一個: 當時老大丟給我一個電機小模組,就是門上的電機小鎖,整合一個微控制器+電機+GSM,我就負責驅動電機和降低功耗。最後待機做到幾百uA,但是手冊寫的好像是能達到10幾uA好像。前後也做了好幾個共用的專案,不過都是現成的程式碼,自己在裏面加功能。唯一有一個自己獨立實現所有程式碼邏輯的專案,還黃掉了(功能都做齊全了!)。帶我的老大,話很少,但是微控制器的能力經驗還是很強的,從他身上我又學會了很多程式設計和偵錯的技巧,也學會了keil工具debug的更多使用方法。
畢業後,跳槽到了現在的公司,最初做的也是微控制器IOT,公司架構調整以後,轉到了安卓驅動,當時一門心思想搞linux驅動,覺得linux更有趣且以後發展也會更好。買了一塊韋東山老師的imx6ull開發板,跟着手冊學習。也會參照安卓驅動來寫一些驅動放到imx6ull開發板執行。
本篇就是對自己入門嵌入式的前後的一個小總結,路線就是C語言 --> 51微控制器 --> stm32微控制器 --> Linux。
幾點對自己的忠告:
1. 原則上,不要因爲一些特例否定正確的原則。不要因爲身邊的人,輕易放棄自己的初心。別人做不到的事情,不一定自己也做不到,總結別人的失敗,充實自己的想法。
2. 技術上,學習與沉澱。大方的將自己的經驗與程式碼開源到網上讓更多人看到,自己玩自己的,進步不會太大。如果自己的觀點有錯,坦蕩的承認,真正的大牛也不會與你計較。
3. 爲人上,不要把別人身上看不慣的毛病在自己身上重現。
4. 處事上,萬事留一線,對於所有可能性,不要一票否決。不要過多去爭論一些沒有意義的觀點。謙虛的對待每一個人,不要輕易忽視他人的觀點,思考別人說不定對你就有啓發。
5. 學習上,多做筆記,遇見一個需要思考過的問題,就立馬記下來。
最後,也是衆所周知的道理:認準一件事,踏實的堅持下去。正確的堅持是成功另一個宏定義!