出來工作也有快兩年的時間了,總結一下自己在嵌入式學習的心路曆程:
大學
大一期間一直待實驗室敲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單片機作為主要的,這期間對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. 學習上,多做筆記,遇見一個需要思考過的問題,就立馬記下來。
最後,也是衆所周知的道理:認準一件事,踏實的堅持下去。正确的堅持是成功另一個宏定義!