儘管我當時正在考慮幾種不同的方法將簡單數據從一個Arduino發送到另一個Arduino,為什麼不將一個Arduino的PWN引腳連接到另一個的模擬引腳呢?通過在PWM引腳上設置不同的值,我可以向彼此發送簡單的消息。除了PWM引腳通過脈沖模擬電壓外,這似乎可行。
這是鏈接兩個Arduino的可靠方法嗎,如果我只想傳達4個狀態?另外,我需要在連接中包括一些其他組件(電阻,電容器等)
要做的就是發送2v脈衝(是)和5v脈衝(否)。它每小時大約需要執行6次。
儘管我當時正在考慮幾種不同的方法將簡單數據從一個Arduino發送到另一個Arduino,為什麼不將一個Arduino的PWN引腳連接到另一個的模擬引腳呢?通過在PWM引腳上設置不同的值,我可以向彼此發送簡單的消息。除了PWM引腳通過脈沖模擬電壓外,這似乎可行。
這是鏈接兩個Arduino的可靠方法嗎,如果我只想傳達4個狀態?另外,我需要在連接中包括一些其他組件(電阻,電容器等)
要做的就是發送2v脈衝(是)和5v脈衝(否)。它每小時大約需要執行6次。
是的,通過添加兩個便宜的組件,您可以通過“一點編程”或更輕鬆地實現此目的。
如果您將PWM_Out的一個47k電阻連接到Analog_In,並將Anaolg_In的一個100uF電容器連接起來,接地,您將能夠讀取等效模擬值,精度約為1%。讀取N次(可能是10次),讀取之間要延遲12毫秒,然後取平均值以得到更好的結果。之所以可行,是因為PWM週期大約為1毫秒,因此延遲多個週期而不是精確的倍數意味著您需要半隨機採樣。
對於所需的分辨率(4個級別),可以使用更小的電容器(可能為1 uF)。但是即使是100 uF的電容器也很便宜。
您可以取而代之的是使用PWM輸出(analogWrite)和digitalRead。執行100次數字讀取,每次讀取之間間隔12毫秒(總計約1.2秒),並保持兩個計數-PinWasHigh和PinWasLow(顯然)處於高電平或低電平狀態。 PinWasHigh的內容告訴您讀取的百分比高。由於隨機抽樣,您不能依賴於100個級別,但是確定說10個級別應該可以提供良好的準確性。 PinWasHigh和PinWasLow的總和應為100,以進行健全性檢查。
雖然使用串行端口(硬件或軟件)或SPI允許每次一次傳輸更多的數據,而無需付出太多努力,但這種簡單的模擬方法是對於許多應用程序來說足夠好了。
可能,但不是最好的主意。模擬輸入需要一個相當穩定的輸入-這可以通過RC濾波器來平滑PWM輸出來實現。
您最好使用Arduino支持的眾多通信協議之一(串行,SPI,I²C)。
要獲得更高的精度,更少的代碼,更快的執行速度並且無需電容器,就可以通過
數字輸入引腳讀取另一個Arduino上的PWM“模擬”信號> pulseIn(pin,HIGH,timeout)
超時是可選的(默認為1秒)。線路變高時,計時器啟動,並在線路變低的瞬間自動停止。
使用PWM通信(與i2c,SPI等相反)的主要原因是同時廣播到無限數量的設備,而無需時鐘信號或確認。
我們目前正在使用這種通信方法進行神經網絡通信,該神經網絡由用於每個神經元子結構的單獨的微型處理器(用於每個突觸和激活功能的一個處理器)組成。
完整的解決方案,用於接收 PWM 信號並將轉換為類似 analogRead()的信號。
int var = pulseIn(digitalPin,HIGH,4200); if(var == 0 &&),它基於@Cortex_systems答案,並想與他人共享以幫助其他人獲得更全面的答案。 digitalRead(digitalPin)== 1){var = 2100;} var = map(var,0,2100,0,1023);
原因如下:
注意!這會增加多達4.2毫秒的代碼延遲。