this is what i made so far:
////******************************************* Libraries *******************************************////
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h>
#include <Stepper.h>
////********************************************* radio *********************************************////
#define CE_PIN 49
#define CSN_PIN 48
RF24 radio(CE_PIN, CSN_PIN);
const byte pipe[] = "00001";
////******************************************* Servo Setup ******************************************////
const byte servoPins[] = {2, 5, 4, 3}; //s1 =(2) s2 =(5) s3 =(4) s4 =(3)
const byte servosCount = sizeof servoPins / sizeof * servoPins;
int previousAngles[servosCount];
const int initialPositions[servosCount] = {90, 90, 90, 84};
const int mappedRanges[servosCount][2] = {{80, 100}, {65, 115}, {65, 115}, {80, 88}};
const unsigned int speed = 1;
Servo servos[servosCount];
////***************************************** Message Setup *****************************************////
struct __attribute__ ((packed)) t_message {
int16_t rawValues[servosCount];
} payload;
void setup() {
pinMode(10, OUTPUT);
for (byte i = 0; i < servosCount; i++) {
servos[i].write(initialPositions[i]); //set starting positions
servos[i].attach(servoPins[i]);
previousAngles[i] = initialPositions[i];
}
// Serial
Serial.begin(9600);
//radio
radio.begin();
radio.openReadingPipe(0, pipe);
radio.setPALevel(RF24_PA_MIN);
radio.startListening();
}
void loop() {
if (radio.available()) {
radio.read((uint8_t *) &payload, sizeof payload);
Serial.print(F("New positions: "));
for (byte i = 0; i < servosCount; i++) {
float angle = map(payload.rawValues[i], 0, 1023, mappedRanges[i][0], mappedRanges[i][1]);
previousAngles[i] = (angle * 0.4) + (previousAngles[i] * 0.6);
if (previousAngles[i] >= mappedRanges[i][1])
{previousAngles[i] += speed;}
else {
if (previousAngles[i] <= mappedRanges[i][0])
{previousAngles[i] -= speed;}
Serial.print(previousAngles[i]); Serial.write('\t');
}}
{
Serial.println();
}
delay(30);
} }
but the servo don't move, i know that this us due to the fact that there is no
servos[i].write(previousAngles[i]);
but it has to have it, but from what i remember reading you said that that needs to be removed.
"The point is not to tell directly with a write. You’ll do that asynchronously at every iteration of the loop when a step is due."
post #45
(sorry i dont know how to that quote thing)
forgot that i can just test it, i added it in the loop like this:
void loop() {
if (radio.available()) {
radio.read((uint8_t *) &payload, sizeof payload);
Serial.print(F("New positions: "));
for (byte i = 0; i < servosCount; i++) {
float angle = map(payload.rawValues[i], 0, 1023, mappedRanges[i][0], mappedRanges[i][1]);
previousAngles[i] = (angle * 0.4) + (previousAngles[i] * 0.6);
if (previousAngles[i] >= mappedRanges[i][1])
{previousAngles[i] += speed;}
else {
if (previousAngles[i] <= mappedRanges[i][0])
{previousAngles[i] -= speed;}
Serial.print(previousAngles[i]); Serial.write('\t');
servos[i].write(previousAngles[i]);
}}
{
Serial.println();
}
delay(30);
} }
the servos do move but not slower that normal, i have a feeling that is because i am stepping the deceleration.