前幾天我從老師那裡得到了一個問題,但我無法解決:
如果您有兩個來自兩個不同輸出的傳感器,但希望它們進入一個輸入,
簡而言之,該項目包含一個Arduino Uno。有兩個超聲波傳感器。
前幾天我從老師那裡得到了一個問題,但我無法解決:
如果您有兩個來自兩個不同輸出的傳感器,但希望它們進入一個輸入,
簡而言之,該項目包含一個Arduino Uno。有兩個超聲波傳感器。
針對您的問題,有兩種基本解決方案,一種是主動解決方案,一種是被動解決方案,哪種方案最好(甚至可以起作用)取決於您的其餘設置。
主動解決方案需要一個解決方案稱為多路復用器的設備。基本上,這是一個開關,它選擇其輸入之一以路由至其輸出,因此可用於將輸入引腳連接至其中一個傳感器的輸出。不過,它需要一個額外的IO引腳,因此毫無意義,因為您可以將該IO引腳用作第二個傳感器的輸入。不過,這確實意味著兩個傳感器都可以同時處於活動狀態,而您只需選擇一個即可讀取輸出。
被動解決方案稱為開漏或集電極開路(如果您使用的是TTL而不是CMOS術語)。這意味著您可以使用晶體管(NPN BJT或N溝道MOSFET)將傳感器的每個輸出轉換為開關,以將輸入引腳接地。然後,當晶體管關閉時,輸入引腳通過上拉電阻(可以在IO引腳內部或外部)上拉。當一個傳感器的輸出激活時,它將導通晶體管,然後將輸入引腳拉低。這意味著一次只能激活一個傳感器,因此它們必須由單獨的輸出引腳觸發。
打開漏極是I2C之類的東西如何在同一總線上支持多個設備而沒有任何電壓衝突。
該解決方案實際上僅使用一個引腳,但僅適用於簡單的操作,例如按鈕(打開或關閉)。
串聯(不同)電阻器(端對端)結束)。將每個電阻的鬆散端連接到+ 5V。將這兩個開關的鬆散端連接在一起,然後通過另一個電阻器接地。在兩個開關相遇的地方,將它們連接到Arduino上的模擬引腳。
例如,您可以在按鈕A上使用20k電阻,在按鈕B上使用10k電阻,並且將10k電阻連接到地面。它們應該非常接近相同的值,並且每個值至少應為1k。
使用ReadAnalogVoltage草圖通過按鈕的不同組合(未按下按鈕,A,B,A + B)來測量電壓。 ,然後,在最終草圖中,您可以將讀數與該表中的值進行比較-選擇最接近的值,因為實際讀數可能會略有不同。對於上面的電阻,您應該獲得:(無按鈕= 0v; A = 1.7v,B = 2.5v,均為3v)。對它們進行數字排序(在這種情況下,它們已經是),並精確計算出每對之間的值(最多0.85最接近0 =>無按鈕;否則最多2.1 =>按鈕A;否則最接近2.75
所描述的電路如下所示:
導線
結果可以在表中,循環中使用,也可以在if / else if語句中使用(我在12鍵鍵盤上使用了此技術,因此列表要長得多。)
閱讀有關分壓器的信息 https://learn.sparkfun.com/tutorials/voltage-dividers,對於同時按下兩個按鈕,並聯的電阻 https://learn.sparkfun.com/tutorials/series-and-parallel-circuits
如果您有兩個來自兩個不同輸出的傳感器,但希望它們進入一個輸入,那麼您需要什麼,以及如何讀取輸入?
如果希望您的老師對此失去理智,回答這個問題:
我需要什麼? :)
解決方案是使用一個三角超聲波傳感器和兩個回波。
或一個回波和兩個觸發器。
超聲波傳感器發送脈衝>脈衝返回>現在回波引腳連接到第二個傳感器trig> Second Ultrasonic傳感器發送脈衝,然後開始監聽。當第二次超聲回波返回時,它發送到另一個Arduino引腳,如果要在一個輸入引腳上將其反轉:)
#define trigPin 6#define echoPin 4#define echoPin2 7void setup( ){Serial.begin(9600); pinMode(trigPin,OUTPUT); pinMode(echoPin,INPUT); pinMode(echoPin2,INPUT);} void loop(){持續時間,距離,距離2; digitalWrite(trigPin,HIGH); delayMicroseconds(20); digitalWrite(trigPin,LOW);持續時間= pulseIn(echoPin,HIGH);距離=(持續時間/ 2)/ 29.1;持續時間=持續時間+ pulseIn(echoPin2,HIGH); distance2 =(持續時間/ 2)/ 29.1;如果(距離> = 200 ||距離< = 0){Serial.println(“ Out of range”); } else {Serial.print(distance); Serial.println(“ cm”); Serial.print(distance2); Serial.println(“ cm”); Serial.println(“ HHH”); } delay(500);}
就是這樣。
我遇到了同樣的問題,只是我想將8個HC-SR04傳感器放在pro-mini上。
我使用I2C引腳擴展器作為觸發器,並使用八進制OR / NOR
庫,示例和圖片
https://github.com/arielnh56/SonarI2C http:// redhunter.com/blog/2016/04/28/sonari2c-multiple-hc-sr04-sensors-on-arduino-i2c/
OP並沒有指定重點是硬件還是軟件。
因此,我假定教授可能正在尋找的是使用最少電路的解決方案。盡可能靠近圖表。因此,該解決方案將在軟件中實現。
鑑於所有這些,我建議將觸發信號發送到傳感器1上,並在接收引腳處測量反射。
它是有時間限制的(傳感器在最大範圍內對物體做出反應的時間)。如果檢測到,則設置一個變量以保存在傳感器1上測得的距離。
然後可以從第二個傳感器的觸發針發送相同的變量。如果時間門內有反射,則可以將其記錄在另一個變量中。
這將需要創建兩個超聲波傳感器實例,而它們恰好共享同一接收脈衝引腳。
嘗試以上邏輯使用555計時器,其C1:10uF,R2:300k和R1:30k的切換時間為1.1秒,現在大約每當定時器OUT為高電平時,USS1的一秒數據進入SIN(Arduino IN),同樣,當定時器OUT為低電平時,USS2的信號也變為SIN(Arduino),
但是您將無法知道輸出來自哪個傳感器。
如果您想知道輸出來自哪個傳感器,您只需在一個分支中添加一個INVERTER即可,這樣兩個傳感器將給出不同的狀態例如,一個將返回高電平而另一個將返回低電平
希望這會有所幫助
編輯:請注意555計時器設計部分不完整,我只是給出一個主意:) >
SPDT開關非常適合問號所在的圖表。
問題是,兩個超聲波數據只能輸入一個。這很簡單。您只需要兩個ID。創建每個傳感器的ID。您也可以使用I2C總線。您需要使誰將兩個輸入保留為原始數據。然後用地址進行數字寫入,然後進行編碼以讀取數據。 z,我的主意們?