У меня возникли проблемы с проектом PanStamp
https://github.com/panStamp/panstamp/wiki
Я передаю с одного устройства PanStamp на другое через радиоканал, непрерывно градус угла поворота для сево (от 0 до 180 градусов.) Сервопривод при этом дергается на видео видно
https://yadi.sk/i/2ikGURLcfTGND
1) Когда я подключаю серву напрямую к потенциометру без радиосвязи такой проблемы нет, она плавно поворачивается на заданный градус.
2) Во время передачи данных с подключенной сервой на последовательном порту видны какие-то левые символы во время дерганий. Когда я отключаю серву то эти символы не появляются.
3) Я проверил 3 сервы (все рабочие) у всех одна и даже проблема.
4) Шумность данных с потенциометра исключена т.к. я их усредняю через функцию "Average" прежде чем послать на приемник.
5) Обвязку для стабилизатора напряжения для сервы делал двумя кондерами по 470 мфарад
Код передатчика:
#define POT_PIN 0 // потенциометр
#define K 0.1 // коэфициэнт усреднения
#define RFCHANNEL 0 // Let's use channel 0
#define SYNCWORD1 0xB5 // Synchronization word, high byte
#define SYNCWORD0 0x47 // Synchronization word, low byte
#define SOURCE_ADDR 4 // Sender address
#define DESTINATION_ADDR 5 // Receiver address
CCPACKET txPacket; // Задаем объект txPacket
int newX, oldX; // Переменные для усреднения
byte POT_NEW; // Рабочее (усредненное) значение потенциометра
void setup()
{
// panstamp.setHighTxPower (); // режим мах мощности 10 дБ
panstamp.radio.setChannel(RFCHANNEL);
panstamp.radio.setSyncWord(SYNCWORD1, SYNCWORD0);
panstamp.radio.setDevAddress(SOURCE_ADDR);
panstamp.radio.setCCregs();
// Откючение адреса, устройство будет получать/отправлять на любое устройство
panstamp.radio.disableAddressCheck();
}
void loop()
{
txPacket.length = 2; // Размер пакета
Average(analogRead(POT_PIN));
// txPacket.data[0] = DESTINATION_ADDR; // Первый байт данных должен быть адресом назначения
txPacket.data[1] = POT_NEW; // Передаем байту 1 переменную
panstamp.radio.sendData(txPacket); // Посылаем пакет
}
byte Average(int x)
{
newX=(x*K)+(oldX*(1.0-K));
oldX = newX;
POT_NEW=map(newX, 0, 1013, 0, 180);
return POT_NEW;
}
Код приемника:
#include <Servo.h>
#include <HardwareSerial.h>
#define RFCHANNEL 0 // Let's use channel 0
#define SYNCWORD1 0xB5 // Synchronization word, high byte
#define SYNCWORD0 0x47 // Synchronization word, low byte
#define SOURCE_ADDR 4 // Sender address
#define DESTINATION_ADDR 5 // Receiver address
int i;
int S_POS; // Позиция сервапривода
int S_PIN=9; // Серво пин
Servo myservo;
void rfPacketReceived(CCPACKET *packet) // функция приема данных
{
if (packet->length > 1)
{
// packet.data[0]; // Первый байт адрес устройства
S_POS=packet->data[1]; // Данные с потенциометра
}
}
void setup()
{
// Инициализация приемника
panstamp.radio.setChannel(RFCHANNEL);
panstamp.radio.setSyncWord(SYNCWORD1, SYNCWORD0);
panstamp.radio.setDevAddress(SOURCE_ADDR);
panstamp.radio.setCCregs();
myservo.attach(S_PIN); // инициализация сервопривода
Serial.begin(9600);
// Выключаем адресацию устройств, приемник будет принимать от любого устр
panstamp.radio.disableAddressCheck();
// Обратный вызов RF
panstamp.setPacketRxCallback(rfPacketReceived);
}
void loop() {
myservo.write(S_POS);
Serial.println(S_POS);
}