Sari la conținut
ELFORUM - Forumul electronistilor

Comunicare status între module


Postări Recomandate

Cu toate ca nu vorbesc despre exact o placa de dezvoltare Arduino, ma refer pe platforma Arduino IDE cu un 328PU. Dar se poate considera doua module arduino uno in discutie. 

 

care ar fi cea mai simplista metoda si cu un consum mai mic de resurse pentru a comunica de la modulul A la modulul B un status pe 1 fir exceptând UART si I2C hardware.. 

 

Statusul e doar un byte sau un număr de la 1-9, pr care modulul B trebuie sa-l primească. 

 

Eu m-am gândit ca cel mai simplist ar fi sa folosesc un timer cu frecventa variabila. de ex pentru status 1 frecventa de 100Hz, 2=110 Hz.. etc

 

modulul doi va folosi pulseIn pentru decodare frecventa ai cam atat. 

exista totuși o alta varianta mai minimalista?.. 

Link spre comentariu
  • Răspunsuri 15
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Top autori în acest subiect

Acum 15 ore, Gilbert Sparios a spus:

...

care ar fi cea mai simplista metoda si cu un consum mai mic de resurse pentru a comunica de la modulul A la modulul B un status pe 1 fir exceptând UART si I2C hardware.. 

...

 

Poti sa te foloseste de exemplele cu modulele RF, 433Mhz de exemplu, care au un singur pin, DATA. Am postat asa ceva pe forum mai de mult, cu exemplu, dar din anumite motive, am iesit de pe forum si am pierdut controlul la vechile postari.

 

Link spre comentariu
Acum 4 ore, Liviu M a spus:

Dacă tot ce vrei e număr mic de sârme, poți folosi liniștit uart. Un cip doar transmite, unul doar recepționează. La cel care doar transmite legi eventual rx la + printr-o rezistență. 

 

Aşa am făcut eu la un proiect cu un 328P care controlează starea unei baterii şi raportează unui ESP32 pe serial. Tx ATMega la Rx ESP32 şi gata legătura.

Link spre comentariu

transmisii am făcut si nu e vorba ca nu as ști dar. modulul A care ar fi Tx-ul, e cu timpul de execuție la critic. 

 

chiar nu merge cu transmisia fara sa fie afectate cadentele, timerele.. o sa incerc si cu librăria de la rs485 a lui Cameron dar dacă îmi aduc aminte bine si acolo am cli() pe undeva. 

 

asa cum am spus. UART nu se mai poate fizic. 

Editat de Gilbert Sparios
Link spre comentariu

One Wire are delayMicroseconds(), dar le poti inlocui cu micros() sau millis(), astfel incat programul tau sa nu aiba intarzieri. Fiind un 1wire personalizat, poti avea timinguri mai flexibile, un reset urmat de 3-4 biti (asta iti ofera deja 8-16 stari transmise) fiind suficient, cred, pentru ceea ce vrei. One Wire este destul de usor de implementat, fie cu delay-uri, fie cu micros sau millis.

Link spre comentariu
5 hours ago, Gilbert Sparios said:

modulul A care ar fi Tx-ul, e cu timpul de execuție la critic.

Poate dacă ai posta ceva din codul sursa utilizat, ideiile ar fi mai aproape de ce doresti.
Si UART si 1Wire (sau alt protocol) se pot face si fără delay dacă ai ceva timer pornit si nu opresti intreruperile (prea mult si des. sau mai bine deloc).
Nu am glumit (prea tare) cand ti-am propus mai sus "Codul Morse".

 

 

Editat de Vizitator
Link spre comentariu

eu cred ca raman la ce am gandit initial. cred ca e cea mai simplista metoda.

modulul A nu trebuie decat sa comute un pin intr-un timer care oricum face si altceva o frecventa acolo..si nimic mai mult.

cred ca ar fi ok si cu micros() in functie apelata in loop() la frecvente de 100Hz..1K, asta nu neaparat.

 

iar modulul B, nici macar nu trebuie sa sincronizeze, citeste cand vrea el ce frecventa e pe pinul X si asta e tot.

daca ar fi fost nevoie sa trimit o structura sau un byte* poate s-ar merita dar pentru ce vreau eu zic ca e cel mai minimalist.

 

de fapt..cred ca o sa incerc tone() cu timer2..

/*
0x00	NO ERROR / STANDBY
0x01	MOTOR ERROR
0x02	OVERVOLTAGE
0x03	UNDERVOLTAGE
0x04	TO MANY RETRY-FAIL
0x05	OVERHEAT
0x06	SENSOR ERROR
*/
/*-------------------------------------------------------------------------------------------*/
void status_output(byte ERRORCODE) {
	static byte prevERROR = ERRORCODE;
	
	if (prevERROR != ERRORCODE) {
		prevERROR = ERRORCODE;
		noTone(PIN_STATUS);	
	
		if (ERRORCODE == 0) tone(PIN_STATUS, 100);	// NO ERRORS / STANDBY
		if (ERRORCODE == 1) tone(PIN_STATUS, 120);
		if (ERRORCODE == 2) tone(PIN_STATUS, 140);
		if (ERRORCODE == 3) tone(PIN_STATUS, 160);
		if (ERRORCODE == 4) tone(PIN_STATUS, 180);
		if (ERRORCODE == 5) tone(PIN_STATUS, 200);
		if (ERRORCODE == 6) tone(PIN_STATUS, 220);
	}
}
/*-------------------------------------------------------------------------------------------*/

 

Editat de Gilbert Sparios
Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări