Achindra Bhatnagar
Published © MIT

20bps Digital Data Wireless Transceiver (Laser)

Extending Morse Code Transceiver to work with digital data. This project achieves a throughput of 20bps, 2x over Morse code.

AdvancedFull instructions provided8 hours5,987
20bps Digital Data Wireless Transceiver (Laser)

Things used in this project

Story

Read more

Schematics

Transmitter

Receiver

Code

Encoded Data

Plain text
H: 1011010010001101
E: 1011010001011101
L: 1011010011001101
L: 1011010011001101
O: 1011010011111101

Encoded Data with Signature

Plain text
H: 10110100100000101101
E: 10110100010100111101
L: 10110100110000111101
L: 10110100110000111101
O: 10110100111101011101

Transmitter

Arduino
#define PULSE 50

#define START_MSG one(); zero(); one(); one();
#define   END_MSG one(); one(); zero(); one();

#define MSG_PACK(x) START_MSG x END_MSG

void setup() {
  pinMode(13, OUTPUT);
}

void loop() {
  // <MSG_HEAD><8_Data_Bits><4_Sign_Bits><MSG_TAIL>
  //H: 2 set bits
  MSG_PACK(zero(); one(); zero(); zero(); one(); zero(); zero(); zero(); \
           zero(); zero(); one(); zero(); )
  //E: 3 set bits
  MSG_PACK(zero(); one(); zero(); zero(); zero(); one(); zero(); one(); \
           zero(); zero(); one(); one(); )
  //L: 3 set bits
  MSG_PACK(zero(); one(); zero(); zero(); one(); one(); zero(); zero(); \
           zero(); zero(); one(); one(); )
  //L: 3 set bits
  MSG_PACK(zero(); one(); zero(); zero(); one(); one(); zero(); zero(); \
           zero(); zero(); one(); one(); )
  //O: 5 set bits
  MSG_PACK(zero(); one(); zero(); zero(); one(); one(); one(); one(); \
           zero(); one(); zero(); one(); )
  //CR: 3 set bits
  MSG_PACK(zero(); zero(); zero(); zero(); one(); one(); zero(); one(); \
           zero(); zero(); one(); one(); )
  //LF: 2 set bits
  MSG_PACK(zero(); zero(); zero(); zero(); one(); zero(); one(); zero(); \
           zero(); zero(); one(); zero(); )
}

void zero()
{
  digitalWrite(13, LOW);
  delay(PULSE);
}

void one()
{
  digitalWrite(13, HIGH);
  delay(PULSE);
}

Receiver

Arduino
#define SOM 0xB
#define EOM 0xD
#define PULSE 50

unsigned long data = 0; 

void setup() {
  Serial.begin(9600);
}

void loop() {
  int val = analogRead(4);
  unsigned long sign = 0;

  data = (data << 1);
  if(val >= 10){
    data |= 1;
  } else {
    data |= 0;
  }

  //check tail signature
  if(EOM == (data&EOM))
  {
    //check head signature
    if(SOM == ((data >> 16)&0xF)){
      sign = (data>>4)&0xF; // 4 bits of signature
      data = (data>>8)&0xFF;// 8 bits of data

      if(sign == getSetBits(data))
      {
        Serial.print((char)data);
      }

      //Diagnostics
      //if(data==72||data==69||data==76||data==79||data==13||data==10){
        //data
        //digitalWrite(13, HIGH);
      //}else{
        //error
        //digitalWrite(12, HIGH);
      //}
      data = 0;
    }
  }
  delay(PULSE);
  //digitalWrite(13, LOW);
  //digitalWrite(12, LOW);
}

unsigned long getSetBits(unsigned long n)
{
  unsigned long count = 0;
  while(n)
  {
    n &= (n-1);
    count++;
  }
  return count;
}

Credits

Achindra Bhatnagar

Achindra Bhatnagar

20 projects • 161 followers
Windows Kernel Hacker, IoT Hobbyist, Enthusiast, Developer and Dreamer

Comments