Zeus писал(а):Я вот что думаю - дороговато это выходит. Сколько контроллер на 32 сервы стоит? и сколько будет стоить 32 такие платы одночипные для серв? пусть 100 рублей за плату - итого 3200 руб. - однако
Как у вас тут в Москве всё дорого - Ламборджини Диабло 200 тыщ баксов, то ли дело у нас в Саратове гречка - 30 рублей/килограмм
Так-то разница есть - имеешь информацию с сервы о положении или нет. К тому же - что за робот на 32 сервах?
=DeaD= писал(а):Кстати, а обычный UART он не типа открытый коллектор в AVR? Там к VCC жестко выставляет сигнал в TX? Можно переключить на режим открытый коллектор?
Нет, не открытый коллектор. Да. Штатно аппаратно - нет.
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;
Пока попробую всё это собрать на 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
Об этом серьезно будем думать после первого рабочего прототипа а так я и сам могу нафантазировать сейчас вплоть до автонумерации или опроса уникальных заводских ID - не то чтобы я не верю в свою способность это реализовать, просто всё по порядку
Если действительно при работе от внутреннего генератора пойдет рассогласование скоростей при обмене информацией - всегда можно использовать самосинхронизирующиеся коды, например манчестер-2 (он же RC-5).
Dead, смеяться будешь, но в железном тоже каждый байт Но байт - это много. 10-11 бит. Смещение на 10% - уже поймали следующий бит. На 5% - серединку между битами. На 3% - вроде еще нужный бит, но чуть помеха пришла при синхронизации, оттянула фронт - и опять промазали. В общем, для уарта рекомендуется не более 1% рассогласования по скорости. А манчестер синхронизируется на каждом бите. Применялся например при записи программ в Радио-86РК на кассетный магнитофон. Это еще хуже, чем RC-генератор, если механизм не очень качественный
С софтовым уартом еще куча проблем других будет...
Буду говорить за ПИКи.
При выполнении софтового уарта - рекомендуется отключать прерывания. Т.е. программный ШИМ уже совсем не точный получиться.
Ну и как обычно, пока выполняется софт Уарта ничего другого не делается и наоборот. Измеряем сигнал с АЦП - а тут бац запрос на чтение от центрального МК, а мы измеряем - вот и промазал запрос. Так же при передаче байта Тх чтения его Rx не предусмотрено. Тут наверное самому ручками с нуля надо реализовать такой софт уарта.
Раз уж там в серве стоит 16Ф676, то надо тоже смотреть в сторону 16 серии, но ни в коем случае не 12 серии. Взять например 16Ф628А или 16Ф648А. Кол-во ножек не сильно отличается, зато все аппаратное есть.
Последний раз редактировалось Zeus 10 ноя 2010, 11:09, всего редактировалось 1 раз.
Zeus писал(а):При выполнении софтового уарта - рекомендуется отключать прерывания. Т.е. программный ШИМ уже совсем не точный получиться
У меня он будет аппаратный.
Zeus писал(а):Ну и как обычно, пока выполняется софт Уарта ничего другого не делается и наоборот. Измеряем сигнал с АЦП - а тут бац запрос на чтение от центрального МК, а мы измеряем - вот и промазал запрос.
Вообще скорее всего я гляну в сторону навешивания UART'а на прерывание.