JaSHin
JaSHin

Reputation: 277

Realtime sending PWM values using 433Mhz transmitter

I have tried to create wireless PWM transmission using 433Mhz transmitter modules. I found this library for transmiting https://github.com/zeitgeist87/RFTransmitter and this library for reading PWM values on some pin https://github.com/xkam1x/Arduino-PWM-Reader.

I wrote code for sending PWM values:


#include "PWM.hpp"
#include <RFTransmitter.h>

#define NODE_ID          1
#define OUTPUT_PIN       11

RFTransmitter transmitter(OUTPUT_PIN, NODE_ID);

PWM my_pwm(2);

// the setup function runs once when you press reset or power the board
void setup() {
  my_pwm.begin(true);
}

// the loop function runs over and over again forever
void loop() {

    int pwmValue = my_pwm.getValue();
    char stringValue[4];
    itoa(pwmValue, stringValue, 10);
    transmitter.send(stringValue, strlen(stringValue) + 1);
}

And similar code for receiving

#include <Servo.h>
#include <PinChangeInterruptHandler.h>
#include <RFReceiver.h>

int PWM_out_pin = 9;
Servo servo;

// Listen on digital pin 2
RFReceiver receiver(2);

void setup() {
  servo.attach(PWM_out_pin);
  receiver.begin();
}

void loop() {

  char msg[MAX_PACKAGE_SIZE];
  byte senderId = 0;
  byte packageId = 0;
  byte len = receiver.recvPackage((byte *)msg, &senderId, &packageId);

  String *stringObject = new String(msg);

  servo.writeMicroseconds(stringObject->toInt());
}

It works, but it has few problems. First is that is not optimal. I transforming all to string. How can I send int values from PWM directly? Second problem is that it has about 1 sec delay. Does it possible make it faster? I need it for realtime controlling servo.

Thanks.

Upvotes: 0

Views: 524

Answers (1)

Mark73
Mark73

Reputation: 16

How can I send int values from PWM directly?

transmitter.send((char*)pwmValue, sizeof(int));

Then on the receive side, you don't need to convert the data to a string.

  servo.writeMicroseconds((int) *msg);

(int) and (char*) are C-style typecasts. Essentially telling the compiler that you want the data to be interpreted as a different variable type.

WARNING: Be careful with the "new" keyword, you are dynamically allocating memory. Rule of thumb in C/C++: Wherever you use the "new" keyword there should be a corresponding "delete" call that cleans up the memory.

In terms of making it faster, your C/C++ code here is not the limiting factor causing the 1 sec latency from command to action. Most likely there is a parameter in your RF transmitter transmit/receive stack that needs to be tweaked. Before sending PWM values, I would benchmark your latency of sending and printing out a simple string.

Upvotes: 0

Related Questions