roboforum.ru

Технический форум по робототехнике.

Модификация сервы под 1-wire-UART

Re: Модификация сервы под 1-wire-UART

=DeaD= » 09 ноя 2010, 16:05

Zeus писал(а):Я вот что думаю - дороговато это выходит. Сколько контроллер на 32 сервы стоит? и сколько будет стоить 32 такие платы одночипные для серв? пусть 100 рублей за плату - итого 3200 руб. - однако :)

Как у вас тут в Москве всё дорого - Ламборджини Диабло 200 тыщ баксов, то ли дело у нас в Саратове гречка - 30 рублей/килограмм :ROFL:

Так-то разница есть - имеешь информацию с сервы о положении или нет. К тому же - что за робот на 32 сервах? :)

Re: Модификация сервы под 1-wire-UART

Zeus » 09 ноя 2010, 16:18

Если дело только в определении положения, то может проще с каждой сервы вытащить провод с потенциометра и на АЦП центрального МК. все дешевле выйдет.

Re: Модификация сервы под 1-wire-UART

SkyStorm » 09 ноя 2010, 16:26

И где взять 32 АЦП?

Re: Модификация сервы под 1-wire-UART

=DeaD= » 09 ноя 2010, 16:28

SkyStorm писал(а):И где взять 32 АЦП?

"Ребята, вы меня ерундой не грузите. Я стратегией занимаюсь" (с) известный анек :ROFL:

Re: Модификация сервы под 1-wire-UART

Michael_K » 09 ноя 2010, 18:05

=DeaD= писал(а):Кстати, а обычный UART он не типа открытый коллектор в AVR? Там к VCC жестко выставляет сигнал в TX? Можно переключить на режим открытый коллектор?

Нет, не открытый коллектор.
Да.
Штатно аппаратно - нет.

Re: Модификация сервы под 1-wire-UART

=DeaD= » 10 ноя 2010, 00:13

Реализацию UART софтового на сях под gcc видимо дерну из Arduino:
Код: Выделить всёРазвернуть
void SoftwareSerial::begin(long speed)
{
  _baudRate = speed;
  _bitPeriod = 1000000 / _baudRate;

  digitalWrite(_transmitPin, HIGH);
  delayMicroseconds( _bitPeriod); // if we were low this establishes the end
}

int SoftwareSerial::read()
{
  int val = 0;
  int bitDelay = _bitPeriod - clockCyclesToMicroseconds(50);
 
  // one byte of serial data (LSB first)
  // ...--\    /--\/--\/--\/--\/--\/--\/--\/--\/--...
  //    \--/\--/\--/\--/\--/\--/\--/\--/\--/
  //   start  0   1   2   3   4   5   6   7 stop

  while (digitalRead(_receivePin));

  // confirm that this is a real start bit, not line noise
  if (digitalRead(_receivePin) == LOW) {
    // frame start indicated by a falling edge and low start bit
    // jump to the middle of the low start bit
    delayMicroseconds(bitDelay / 2 - clockCyclesToMicroseconds(50));
   
    // offset of the bit in the byte: from 0 (LSB) to 7 (MSB)
    for (int offset = 0; offset < 8; offset++) {
   // jump to middle of next bit
   delayMicroseconds(bitDelay);
   
   // read bit
   val |= digitalRead(_receivePin) << offset;
    }
   
    delayMicroseconds(_bitPeriod);
   
    return val;
  }
 
  return -1;
}

void SoftwareSerial::print(uint8_t b)
{
  if (_baudRate == 0)
    return;
   
  int bitDelay = _bitPeriod - clockCyclesToMicroseconds(50); // a digitalWrite is about 50 cycles
  byte mask;

  digitalWrite(_transmitPin, LOW);
  delayMicroseconds(bitDelay);

  for (mask = 0x01; mask; mask <<= 1) {
    if (b & mask){ // choose bit
      digitalWrite(_transmitPin,HIGH); // send 1
    }
    else{
      digitalWrite(_transmitPin,LOW); // send 1
    }
    delayMicroseconds(bitDelay);
  }

  digitalWrite(_transmitPin, HIGH);
  delayMicroseconds(bitDelay);
}


Пока попробую всё это собрать на ORduino Nano, потом портирую сишный код на ATTiny45

Добавлено спустя 9 минут 11 секунд:
Для начала формат видимо будет такой:
SetPosition=\01,\(ServoPos in uS div 10), ServoPos=(0,50..250), 0 - отключить серву, изначально она отключена.
GetPosition=\02, возвращает \(Voltage*40+50), т.е. диапазон 0..5В превращается в 50..250

Re: Модификация сервы под 1-wire-UART

Michael_K » 10 ноя 2010, 00:20

Я бы серьезно подумал над адресацией и автонумерованием
Вы же небось их штук двадцать на один провод собрались вешать?

Re: Модификация сервы под 1-wire-UART

=DeaD= » 10 ноя 2010, 00:24

Об этом серьезно будем думать после первого рабочего прототипа :) а так я и сам могу нафантазировать сейчас вплоть до автонумерации или опроса уникальных заводских ID - не то чтобы я не верю в свою способность это реализовать, просто всё по порядку :pardon:

Re: Модификация сервы под 1-wire-UART

Michael_K » 10 ноя 2010, 00:25

OK :)

Re: Модификация сервы под 1-wire-UART

Radist » 10 ноя 2010, 08:54

Если действительно при работе от внутреннего генератора пойдет рассогласование скоростей при обмене информацией - всегда можно использовать самосинхронизирующиеся коды, например манчестер-2 (он же RC-5).

Re: Модификация сервы под 1-wire-UART

=DeaD= » 10 ноя 2010, 09:31

Ну в софтовом уарте который я выложил вроде синхронизация каждый байт идёт :oops:

Re: Модификация сервы под 1-wire-UART

boez » 10 ноя 2010, 10:43

Dead, смеяться будешь, но в железном тоже каждый байт :) Но байт - это много. 10-11 бит. Смещение на 10% - уже поймали следующий бит. На 5% - серединку между битами. На 3% - вроде еще нужный бит, но чуть помеха пришла при синхронизации, оттянула фронт - и опять промазали.
В общем, для уарта рекомендуется не более 1% рассогласования по скорости. А манчестер синхронизируется на каждом бите. Применялся например при записи программ в Радио-86РК на кассетный магнитофон. Это еще хуже, чем RC-генератор, если механизм не очень качественный :)

Re: Модификация сервы под 1-wire-UART

=DeaD= » 10 ноя 2010, 11:00

О! Вот чего я нашел :)

AVR274: Single-wire Software UART (на сях)
http://www.atmel.com/dyn/resources/prod ... AVR274.pdf
http://www.atmel.com/dyn/resources/prod ... AVR274.zip

На 4МГц можно завести на 28800 бит/сек с ошибкой всего 0.08%
Вложения
AVR274.pdf
(114.75 КиБ) Скачиваний: 0
AVR274.zip
(133.1 КиБ) Скачиваний: 0

Re: Модификация сервы под 1-wire-UART

Zeus » 10 ноя 2010, 11:06

С софтовым уартом еще куча проблем других будет...

Буду говорить за ПИКи.

При выполнении софтового уарта - рекомендуется отключать прерывания. Т.е. программный ШИМ уже совсем не точный получиться.

Ну и как обычно, пока выполняется софт Уарта ничего другого не делается и наоборот. Измеряем сигнал с АЦП - а тут бац запрос на чтение от центрального МК, а мы измеряем - вот и промазал запрос.
Так же при передаче байта Тх чтения его Rx не предусмотрено.
Тут наверное самому ручками с нуля надо реализовать такой софт уарта.

Раз уж там в серве стоит 16Ф676, то надо тоже смотреть в сторону 16 серии, но ни в коем случае не 12 серии.
Взять например 16Ф628А или 16Ф648А.
Кол-во ножек не сильно отличается, зато все аппаратное есть.
Последний раз редактировалось Zeus 10 ноя 2010, 11:09, всего редактировалось 1 раз.

Re: Модификация сервы под 1-wire-UART

=DeaD= » 10 ноя 2010, 11:07

Zeus писал(а):При выполнении софтового уарта - рекомендуется отключать прерывания. Т.е. программный ШИМ уже совсем не точный получиться

У меня он будет аппаратный.

Zeus писал(а):Ну и как обычно, пока выполняется софт Уарта ничего другого не делается и наоборот. Измеряем сигнал с АЦП - а тут бац запрос на чтение от центрального МК, а мы измеряем - вот и промазал запрос.

Вообще скорее всего я гляну в сторону навешивания UART'а на прерывание.


Rambler\'s Top100 Mail.ru counter