Dima Kim: вряд ли на ардуине + лишь на начальном этапе освоения.
Ардуино скорее для себя больше, никак не для военного использования. :D Во всяком случае будут познания в том, что и как работает. :)
Виталий: а длины импульсов уже определяют работу серво привода.
Если ничего не укажете вторым и третьим операндом, то будет использовать константы, по идее.
Виталий: в исходниках есть такой код:
uint8_t Servo::attach(int pin)
{
return this->attach(pin, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH);
}
uint8_t Servo::attach(int pin, int min, int max)
{
if(this->servoIndex < MAX_SERVOS ) {
pinMode( pin, OUTPUT) ; // set servo pin to output
servos[this->servoIndex].Pin.nbr = pin;
// todo min/max check: abs(min - MIN_PULSE_WIDTH) /4 < 128
this->min = (MIN_PULSE_WIDTH - min)/4; //resolution of min/max is 4 uS
this->max = (MAX_PULSE_WIDTH - max)/4;
// initialize the timer if it has not already been initialized
timer16_Sequence_t timer = SERVO_INDEX_TO_TIMER(servoIndex);
if(isTimerActive(timer) == false)
initISR(timer);
servos[this->servoIndex].Pin.isActive = true; // this must be set after the check for isTimerActive
}
return this->servoIndex ;
intTosha: можно поэкспериментировать, но врядли выйдет.
Хотя можно сделать так
отправлять на регистр очередности символов в цикле таким образом делать прямоугольник, но я не знаю какие при этом ожидать частоты)))
Илья: в итоге: если только 3.3 В модули I2C, то проще будет первый вариант из сообщения, но будет работа на грани и наводки смогут взять и всё испортить, или взять норм конвертер/сделать самому, благо схемы не сложные и они там есть.
Илья: пожалуй лучше дождаться более квалифицированных в этом вопросе людей)
А можжно сылку на конкретный модуль, по беглому поиску есть совместимые с 5В
intTosha: А скрип, насколько я помню зависит от частот.
Если запустить tone от 0 и в плюс, то можно заметить, как на некоторых просто противный писк, а не некоторых частотах хрип.
intTosha: для деления с остатком в одном из операндов должна быть точка и результат должен быть возможен в вещественном типе.
например 100/2.0 это вещественное, а 100/2 целочисленное :)
intTosha: На звук влияет частота. попробуйте millis() впихивать.
По хорошему надо подрубить осцилограф/логический анализатор и смотреть выходы.
Причем для более прямоугольного варианта
if((millis() % 4) >2)
где второе число (2) в два раза меньше того, с чем сравниваем.
как вариант сделать функцию
void ms_tone(int value, int pin_numb)
{
if((millis() % value) >(value/2))
digitalWrite(pin_numb,1);
else digitalWrite(pin_numb,0);
}
и вызывать в цикле в виде us_tone(500,5);
т.е. в диапазоне 500мкс будет генерировать меандр (менее 250 один уровень, иначе другой). Это, наверное будет около 2кГц (1/период)+погрешности быстродействия дуньки.
При желании переделать так, что бы оно задавалось уже в Герцах :)