@Artrue

Что происходит с сервой на PanStamp?

У меня возникли проблемы с проектом 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);

}
  • Вопрос задан
  • 361 просмотр
Пригласить эксперта
Ответы на вопрос 1
Neuroware
@Neuroware
Программист в свободное от работы время
наблюдал похожую ситуацию, в моем случае оказалось что питание сервой просаживалось и поэтому возникали проблемы
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы