Otázka:
Dva Arduinové posílají data přes analogový pin?
lucidgold
2015-02-10 09:58:55 UTC
view on stackexchange narkive permalink

To, co chci udělat, je povolit aplikaci Arduino A odeslat určitou konstantní hodnotu do aplikace Arduino B .

Cítím něco, co je neodmyslitelně špatné na mém přístupu , ale nemůžu přijít na to, o co jde.

Takže v níže uvedeném diagramu uvidíte, že Arduino A nastavuje svůj analogový pin 0 na VÝSTUP a píše hodnota 2 každých 500 ms. Na Arduino B máme Analog Pin 0 nastaven jako INPUT pro příjem a tisk dat na Serial. Připojeny jsou také piny GND obou Arduinos.

Když je toto nastavení provedeno, Arduino B neustále přijímá data ve formě 3 číslic číslo začínající 3XX. Začínám věřit, že se jedná o hodnotu napětí?

Co je na této myšlence inherentně špatně?

enter image description here

Zkusili jste spojit zemnicí kolíky také?
@Kynit: Ano, piny GND byly připojeny (zapomněli jsme to nakreslit).
Ne, nežiji ve světě EE, ale můžu to zkusit! Zde jsou skvělé odpovědi, snažím se to všechno vstřebat. Brzy se aktualizuje.
@lucidgold Souhrn na začátku mé odpovědi vám řekne přesně, co máte dělat. Zbytek vám řekne proč.
šest odpovědi:
Russell McMahon
2015-02-10 11:53:03 UTC
view on stackexchange narkive permalink

Tato odpověď poskytuje jak Arduino specifické znalosti, tak obecné elektrické znalosti - obě jsou nezbytné pro dobré řešení (bohužel).


Shrnutí

Provádět Arduino analogicky analogový přenos:

  • Použijte analogWrite (pin, hodnota) na platný digitální pin (viz níže)

  • Použijte analogRead (pin) na platný analogový vstupní pin.

  • Připojte sériový rezistor mezi dva piny - řekněme 10k.
    Umístěte kondenzátor z analogového vstup na zem, řekněme 100 nF až 10 uF.

R & C funguje jako dolní propust pro převod PWM na DC.
Podrobnosti níže.


Analogové piny Arduino jsou POUZE pro analogový vstup, nikoli pro analogový výstup.
Takže pokus o analogový výstup na analogovém pinu zničí váš pokus o selhání.

Arduino analogWrite (pin, value) funguje pouze na DIGITÁLNÍ piny a pak pouze na podmnožinu digitálních piny, které mají schopnost PWM. Obvykle se jedná o digitální piny 3 5 6 9 10 11.

„AnalogWrite (pin, hodnota) produkuje, jak říkají ostatní - signál PWM - hranaté vlny kolejnice na kolejnici s poměrem značek, který se mění, takže průměr Hodnota DC se mění. Pro systém 5V =
V_DC_mean ~~ = hodnota / 256 x 5V.
Kde „hodnota“ pochází z analogWrite (pin, hodnota)

Převod PWM na dobrý -je zapotřebí stejnosměrný nízkofrekvenční filtr s mezní hodnotou o něco nižší, než je snímková frekvence PWM. Snímková frekvence PFAA Arduino PWM je asi 800 Hz - takže komponenty jsou obvykle vyšší než to. Jednoduchý RC filtr, kde R x C je užitečně více než Začne pracovat 0,001 S. Větší RC je plynulejší, ale se sekundárními efekty. Použití keramického krytu 10 uF a odporu 10 k je pravděpodobně v pořádku. 10 uF x 10k = 0,1S. 1uF a 1k = 0,001 s = okraj. Elektrolytický kryt lze použít, ale svodový proud může mírně ovlivnit přesnost. Takže -


Z místa v Arduino zemi (neznámé) jsem zkopíroval níže uvedený materiál.
Toto NENÍ v základním odkazu, ale mělo by b E.

  • Zapíše analogovou hodnotu (vlnu PWM) na pin. Může být použit k rozsvícení LED s různými jasy nebo k řízení motoru různými rychlostmi. Po volání funkce analogWrite () bude pin generovat ustálenou obdélníkovou vlnu zadaného pracovního cyklu až do dalšího volání analogWrite () (nebo volání digitalRead () nebo digitalWrite () na stejném kolíku). Frekvence signálu PWM na většině pinů je přibližně 490 Hz. Na deskách Uno a podobných deskách mají piny 5 a 6 frekvenci přibližně 980 Hz. Piny 3 a 11 na Leonardu také běží na 980 Hz.

    Na většině desek Arduino (u desek ATmega168 nebo ATmega328) funguje tato funkce na piny 3, 5, 6, 9, 10 a 11 Na Arduino Mega to funguje na pinech 2 - 13 a 44 - 46. Starší desky Arduino s ATmega8 podporují pouze analogWrite () na pinech 9, 10 a 11.

    Arduino Due podporuje analogWrite () na piny 2 až 13, plus piny DAC0 a DAC1. Na rozdíl od pinů PWM jsou DAC0 a DAC1 digitální na analogové převodníky a fungují jako skutečné analogové výstupy.

Ignacio Vazquez-Abrams
2015-02-10 10:02:09 UTC
view on stackexchange narkive permalink

analogWrite () na Uno ve skutečnosti nevydává analogovou hodnotu. Vydává vlnu PWM, jejíž průměr je ekvivalentní této hodnotě. Chcete-li ji proměnit ve skutečnou analogovou hodnotu, musíte ji propustit přes dolní propust, abyste místo ní odstranili komponenty, které z ní dělají PWM vlnu.

Co je tento „low-pass filtr“?
Nízkoprůchodový filtr odřízne vysoké frekvence (tj. Čtvercově zvlněné bity PWM). Vygooglete si jej nebo se rozhlédněte po tomto webu - existuje spousta příkladů.
To je pro arduino / ATmega těžké; velmi málo mikrokontrolérů obsahuje skutečné DAC, s výjimkou sigma-delta bloků jedinečně přizpůsobených zvuku.
Sridhar Rajagopal
2015-02-11 04:08:34 UTC
view on stackexchange narkive permalink

Pokud je vaším cílem poslat konstantní hodnotu z Arduina A do Arduina B, pak je opravdu snadný způsob použití SoftwareSerial.

Řekněme, že používáte Arduino Uno - pro SoftwareSerial můžete použít piny 2 a 3 (které piny jsou pro které zařízení podporovány na http://arduino.cc/en/Reference/SoftwareSerial)

Křížové propojení pinů 2 a 3 z Arduina A na pin 3 a 2 Arduina B. Mezi oběma Arduinos můžete odesílat libovolná náhodná data nahráním náčrtu, jako je následující, do každého . Můžete použít program, jako je CoolTerm, abyste měli „SerialMonitor“ otevřený pro každé Arduino (pomocí IDE Arduino můžete otevřít pouze jeden monitor najednou)

Výhodou tohoto přístupu oproti použití AnalogWrite / AnalogRead je to, že s AnalogRead můžete získat pouze 1024 hodnot, které jsou založeny na napětí. Pomocí SoftwareSerial můžete odesílat libovolná data.

  // zahrnout knihovnu SoftwareSerial, abyste mohli využívat její funkce: #include <SoftwareSerial.h> # define rxPin 2 # define txPin 3SoftwareSerial mySerial = SoftwareSerial (rxPin, txPin); void setup () pinMode (rxPin, INPUT); pinMode (txPin, VÝSTUP); mySerial.begin (9600); Serial.begin (9600); } void loop () {if (mySerial.available ()) {while (mySerial.available ()) Serial.write (mySerial.read ()); Serial.println (); } if (Serial.available ()) {delay (5); while (Serial.available ()) mySerial.write (Serial.read ()); }}  
tomnexus
2015-02-10 11:57:54 UTC
view on stackexchange narkive permalink

Jak již bylo zmíněno výše, použití analogWrite nebude fungovat. (Předpokládám, že byste mohli vzorkovat předpokládaný analogový signál s rychlou smyčkou a měřit pracovní cyklus ...)

Proč nepoužívat SoftwareSerial k odesílání dat mezi dvěma Arduinos?

Je to knihovna, která vytváří další sériový port, zcela v softwaru, takže je nezávislý na hlavním UART na USB portu.

Je již součástí IDE a jeho použití je snadné - ve skutečnosti demo kód na stránce nápovědy již pro vás bude fungovat a přenese všechny znaky ze sériového portu USB do sériového portu softwaru.

AnalogWrite je naprosto v pořádku, pokud je přidán jednoduchý 1 x rezistor a 1 x kondenzátorový filtr (viz moje odpověď). Může být dobrý důvod používat analogový, který zde není zřejmý.
Milliways
2015-02-11 06:28:41 UTC
view on stackexchange narkive permalink

Jak již uvedli ostatní, váš původní návrh nebude fungovat.

Můžete použít výstup PWM a filtr, který může fungovat (budete potřebovat poměrně velký kondenzátor nebo odpor). Vstup na druhém konci by byl pouze aproximací výstupu (lze vypočítat na základě podrobné znalosti hodnot a frekvencí komponent). V závislosti na rychlosti, jakou se hodnota mění, můžete při každém čtení získat jiné hodnoty.

Existují lepší způsoby. Jak bylo navrženo, seriál bude fungovat (buď hardware nebo software v závislosti na dalších faktorech) a je pravděpodobně nejjednodušší. Můžete použít kterýkoli z běžných komunikačních protokolů (I²C nebo SPI) nebo dokonce odesílat hodnoty přes IP.

bot3663369
2015-02-12 06:59:28 UTC
view on stackexchange narkive permalink

Analog In dělá přesně to, co říká - pouze čte (vzorky) úrovně analogového napětí.

Použití AnalogWrite (0,2) nečiní pin A0 v Analog In pro výstup napětí 2 * AVCC / 1024, ale místo toho dělá pin D0, který to dělá. (Většina pinů D0 na deskách Arduino nemá s nimi spojený výstup PWM, takže chování by nebylo definováno.) Mezitím vaše A0 nedělá nic. (Mám podezření, že je to plovoucí / nepřipojené, proto hodnota 3xx. Mohl bych si pro jistotu zkontrolovat datový list.)

Takže co bychom měli dělat místo toho? Pro začátek připojte A0 Arduino B k pwm kolíku Arduino A. Pokud používáte Uno, můžete se připojit k některému z pinů 11,10,9,6,5,3. Pak můžete použít kód:

int PWMPin = 11; int SignalLvl = 2; analogWrite (PWMPin, SignalLvl);

Zkuste to. A uvidíte, že to funguje ... tak nějak.

Ale pak je tu problém. vaše čtení se bude blížit tomu, co chcete, ale docela nepravidelné. Důvod je částečně proto, že analogové signály jsou velmi nespolehlivé a jsou plné šumu. Ale hlavním důvodem je ve skutečnosti to, že Arduino's analogWrite ve skutečnosti NENÍ navrženo jako výstup analogového signálu. Jedná se o PWM, který vydává úrovně GND a AVcc v různých obdobích vysokou rychlostí, takže se při průměrování přibližuje požadované úrovni napětí.

Pokud s tím chcete experimentovat, můžete k výstupu připojit rezistor a kondenzátor a vytvořit dolní propust. (Zde je více informací: http://provideyourown.com/2011/analogwrite-convert-pwm-to-voltage/)


Když už jsem to řekl, myslím otázka, kterou by se většina z nás chtěla zeptat, je: existuje důvod, proč chcete posílat data přes analog? Analogové signály jsou náchylné k šumu. Pokud je věrnost dat kritická, je nejlepší použít sériovou komunikaci, jak je zde zvýrazněno většinou odpovědí.

Pro zjednodušení navrhuji I2c, který ke komunikaci používá pouze 2 vodiče. Pokud je rychlost zásadní (například zápis na 10 000 bajtů dat každou sekundu), můžete zkusit SPI nebo dokonce paralelní komunikaci.

Doufám, že to pomůže a hodně štěstí!



Tyto otázky a odpovědi byly automaticky přeloženy z anglického jazyka.Původní obsah je k dispozici na webu stackexchange, za který děkujeme za licenci cc by-sa 3.0, pod kterou je distribuován.
Loading...