I know this is kind of a noob question. I am trying to establish a wireless communication between two 8051 microcontrollers using a 433 MHz RF module. But since 433 MHz is a quite noisy frequency, the receiver immediately starts collecting the garbage around. In this case, would implementing a software filter do the job to eliminate the garbage data or is my data getting completely disturbed on the way? Thanks in advance.
-
\$\begingroup\$ Can you characterize the noise source(s) involved? \$\endgroup\$– ThreePhaseEelCommented Dec 17, 2017 at 15:57
-
\$\begingroup\$ It is actually that I am sending ascii characters from one microcontroller to the other and then display it on the lcd. But the characters that are displayed on the lcd are not as expected. I don't know if this is due to the noise corrupting the data or is it just a transmission issue with the hardware I am using. As for the source of the noises, I can not point a certain source that is using 433 MHz for communication in the environment that is dominating my module. \$\endgroup\$– İlker DemirelCommented Dec 17, 2017 at 16:00
4 Answers
Are you using such type of modules?
If yes, then don't expect them to work without proper software noise filtering algorithms. This module will give out data at Rx output even if there is no other transmitter operating at 433MHz. This is because this device works on OOK(On-Off Keying) and AGC (automatic gain control). Thus if Rx does not detect any signal for some time it will automatically reduce the threshold, and once the threshold gets close to the noise level, then the noise will get interpreted as the bitstream of \$ 1\$'s and \$0\$'s.
To properly identify your packets, add 3-4 identification bytes to each of the frames you transmit. Adding more number of identification bytes will reduce the probability that the noise will get interpreted as your packet. Usually, 3-4 bytes are sufficient.
Also, it takes some time (few bit durations) to get the threshold adjusted with the transmitting signal level, so if you are not transmitting continuously then it is better to send 1 or 2 junk bytes before transmitting any frame (as initial bits have some chance of getting corrupted due to improper initial threshold level).
Hardware solution: A common chipset used in such receiver module is PT4317. If you check the datasheet then you can see that the data slicer inputs are available off-chip. Thus the slicing threshold can be manually adjusted by properly assigning threshold voltage to DSN pin. But this will compromise the sensitivity of the receiver and thus the longest range it can operate with. You will have to experiment with different values of this pin's voltage and the range it produces.
-
1\$\begingroup\$ Yes and this is exactly the case. For instance when I send 6 bytes of data, the last for bytes are always safely arrives and appears on the lcd but the first two bytes are very inconsistent, they may be true or false. Thank you for your advice. \$\endgroup\$ Commented Dec 18, 2017 at 10:39
It does not have to be the environment that's noisy, it is also the receiver itself which produces noise. How that's solved in most 433 MHz devices is by using coding of the data. So the data packets consist of the data itself plus extra code so that the micro can recognize the data packets and distinguish them from the noise.
There are libraries for Arduino for data transfer over 433 (or 315) MHz. One example is the Virtualwire library. I suggest you look into those to see how it is done.
Just don't expect a "clear" channel when you're not sending data. 433 MHz communications do not work like that. They are designed with extremely simple (and cheap) receiver and transmitter using OOK modulation (also simple), the "clever" bit is then done in software by correlation, pattern recognition etc. Since it is for low data rates this can be done even in a simple micro controller.
There is nothing about the 433MHz band that makes it especially noisy, though there may be occasional interference from other users of the band, that's probably not what you're seeing.
Simple receivers can crank up the gain in the absence of a signal until their own internal noise is decoded as spurious signals, and that's probably what you are seeing : software filtering is unlikely to be a fix.
Check the datasheet for your receiver : there might be an RSSI output - (Received Signal Strength Indicator) - usually an analog voltage, representing the incoming signal strength (and not very precisely).
One approach is to read this in an analog (ADC) channel, and ignore the receiver output if the RSSI is below a certain level. If you're not attempting maximum range, you can set this level fairly high so that you only decode a strong signal with few errors.
Otherwise you may need to combine with some other error mitigation scheme - re-transmitting faulty messages or error correcting codes for example - details are far too wide for a simple Q&A but how to meet a specific service goal might be a better question.
-
\$\begingroup\$ Cheap 433 MHz receivers are typically regenerative designs, which in essence are always going to "receive" something and only quiet down when there's a qualifying signal. This is vaguely akin to a hyperactive AGC on a better receiver, but a bit different, and far more primitive. \$\endgroup\$ Commented Dec 17, 2017 at 20:39
-
\$\begingroup\$ @ChrisStratton That's right (though I think you mean superregenerative). And not all have RSSI: better to find one that does. \$\endgroup\$– user16324Commented Dec 17, 2017 at 20:42
Thought experiment: remove the receiver antenna, replace with short circuit from antenna connection on pcb to ground on pcb. Place receiver in a perfect faraday cage and only when you cool it down to significantly close to absolute zero will the automatic gain control in the receiver not be sensitive enough to pick up noise and amplify it.
-
\$\begingroup\$ These are typically regenerative receivers, so it's not just noise, but the actual behavior of the receiver itself in the absence of signal. \$\endgroup\$ Commented Dec 17, 2017 at 20:38