前言
相信很多電子愛好者剛開始都想搞一些電子開發板之類的東西。開發板平台有很多:STM32系列,ESP系列,FPGA系列,當然還有今天的主角兒——Arduino系列。可能很多人當初是為了實現某些自動化設備開始搗鼓這些的,而我是在抖音上看到有人做指紋鎖才開始做的。雖說這玩意是那些電子相關專業的,但聽介紹也感覺不難,於是非專業的我也想做一個,誰讓我對這玩意非常感興趣呢。話不多說,上才藝!(其實是翻車記錄) 嗚嗚~
踩到的坑
-
硬件方面
- 舵機盡量買全金屬機芯的。 MG996R這個型號的舵機有便宜的(十多塊)和貴一點的(二十多塊),買之前一定要問好店家老板舵機機芯是不是純金屬的。因為有些舵機外面的齒輪是金屬的,但拆開的齒輪組全是塑料的。這樣一來,負載重的東西可能會滑絲(當時我手欠,以為舵機和普通電機一樣機芯和外部齒輪是直通的。就直接沒有通電強行轉動舵機,只聽咔一聲,滑絲了),滑絲后相當於直接報廢。
- 舵機不要買360°的版本。 360°版本是通過PWM改變舵機轉速來控制的,這樣控制開鎖會很麻煩。而180°以下的版本則是用PWM改變舵機的旋轉角度,這樣一步到位,很是方便。
- 開發板負載電機盡量加上繼電器模塊或者電機驅動模塊,不要直接把舵機連在開發板上。 在板子負載這種純電能轉換的元器件的時候,電流一般很大,如果不加上中間的繼電器的話,最直觀的現象就是舵機只要一啟動,板載LED會變暗。這時會很明顯的感受到帶動舵機很吃力,等程序運行幾次后就會莫名奇妙的卡住。更嚴重的是在其他工程中,有可能直接燒壞開發板。
- 繼電器有高電平觸發、低電平觸發和復合型觸發


這幾種繼電器是用開發板連接繼電器的IN端通過改變其高低電平來對應控制繼電器的打開和關閉(我剛開始買了一個低電平觸發的,剛買回來偶然把繼電器的VCC、GND、IN全部接觸,繼電器啪響了一下,后來再怎么搞都不響了。以為是壞了,就干脆忽略( 拆掉 )外圍電路,直接連接到藍色的部分把它當成高電平觸發的用了。后來才知道有兩種觸發模式——都是不仔細看說明惹的禍) - 如果要連接IIC的屏幕,SCL和SDA的兩個個引腳可以直接連在板子上對應的引腳上面,有些買的元件的例程中讓連接在A0、A1上或者A4、A5上,這樣有時候可能會導致屏幕不亮,應該是庫中沒有正確定義引腳導致的。
-
軟件方面
- Arduino庫的使用。Arduino IDE剛下載安裝好的時候是自帶幾個庫的,比如
<Servo.h>、<Keyboard.h>。這幾個庫都在\軟件安裝目錄下\libraries這個文件夾里,不用再費心的找了,直接引用就可以了。 - 串口監視器不能同時在兩個軟件打開。 比如你要上傳程序,發現上傳錯誤,這時可以看看上傳的端口是不是被占用了。如果同時打開兩個串口程序,很可能某個串口程序會崩潰,帶來不必要的麻煩。
- 上傳程序時要拔掉板子的0端口和1端口的連線。 因為上傳程序占用的這兩個端口。可以把需要串口通訊的部分代碼改成軟串口,這樣下載的時候就不用管這兩個端口啦。
- 程序中出現一組硬串口和一組軟串口的時候,要辨別清楚對應的串口波特率。 例如
<Adafruit_Fingerprint>庫中的實例代碼Fingerprint:
#include <Adafruit_Fingerprint.h>
SoftwareSerial mySerial(2, 3);
#else
// On Leonardo/M0/etc, others with hardware serial, use hardware serial!
// #0 is green wire, #1 is white
#define mySerial Serial
#endif
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
void setup()
{
Serial.begin(9600);
while (!Serial); // For Yun/Leo/Micro/Zero/...
delay(100);
Serial.println("\n\nAdafruit finger detect test");
// set the data rate for the sensor serial port
finger.begin(57600);
delay(5);
if (finger.verifyPassword()) {
Serial.println("Found fingerprint sensor!");
} else {
Serial.println("Did not find fingerprint sensor :(");
while (1) { delay(1); }
}
- 代碼中出現了兩個串口初始化。
- 硬串口——第13行的
Serial.begin(9600);對應的是第6行mySerial定義出的Serial這個名字,而mySerial又是第2行SoftwareSerial 這個關鍵字定義的——這對應的是單片機與電腦通訊的串口。 - 軟產口——第19行的
finger.begin(57600);對應的是<Adafruit_Fingerprint.h>這個庫中定義出的,用來讓指紋模塊和單片機通訊的串口。
- 硬串口——第13行的
- 由於軟串口的波特率設置不正確常常導致板子與指紋模塊無法通訊的情況。就如上面代碼中第19行的波特率設置為57600,而一般的指紋模塊默認的是9600。如此導致無法識別指紋模塊。
后續還可以給指紋鎖加上顯示屏,語音提示,聲光報警之類的,以后再寫啦!
