Имеется URM37 и 2 серво. Оба серво подключены к IO Shield к пинам 8 и 9. URM37 подключено и настроено по данной статье http://www.quadmotor.org/doku.php (пины 6 и 7). Похоже что при передачи данных с датчика информация вещается на все пины и соответственно серво приводы начинают сходить с ума. Как с этим бороться? (код прилагается) Можно ли заставить URM37 давать более точные показания? не в сантиметрах а в мм... Код (Text): #include <Servo.h> #include "URMSerial.h" #define DISTANCE 1 URMSerial urm; Servo s_ver; Servo s_gor; int g = 0; int v = 0; int i = 0; int value; void setup() { Serial.begin(9600); urm.begin(6,7,9600); s_gor.attach(8); s_ver.attach(9); s_gor.write(90); s_ver.write(90); } void loop() { while(Serial.available() == 0); for(v = 100; v > 80; v--) { s_ver.write(v); if(v%2 == 0) { for(g = 60; g < 120; g++) { s_gor.write(g); urm.requestMeasurementOrTimeout(DISTANCE, value); Serial.println(value); delay(15); } } else { for(g = 120; g > 60; g--) { s_gor.write(g); urm.requestMeasurementOrTimeout(DISTANCE, value); Serial.println(value); delay(15); } } } }
У меня оно так-же неадекватно дёргает сервами, решения пока не нашёл, но видео на ютубе с работающими примерами есть, надо разбираться, что не так... Собственно, это один из затыков, почему не пишу статью до конца...
Придумал вариант вполне рабочий, но скорость "сканирования" при таком подходе удручает... Код (Text): servo.attach(9); servo.write(pos); delay(25); servo.detach(); urm.requestMeasurementOrTimeout(DISTANCE, value); Serial.println(value); А как на счет подключения серво к самому URM37? Пробовали? Получилось? И если да то как?
К самому urm получилось!!!! я с ним вообще только второй день вожусь. Это делается очень легко и просто подключаете так: на 5v(urm) - 5v(arduino) gnd(urm) - gnd(arduino) nc(urm) - 5v(arduino) tx(urm) - pin2(arduino) rx(urm) - pin3(arduino) moto(urm) - оранжевый проводок на сервоприводе. И подключаем красный и коричневый проводки серва к питанию! Записываем на ардуино следующий код: (Компилируется только на версии ПО 2300!!! #include "URMSerial.h" #define DISTANCE 1 #define TEMPERATURE 2 #define ERROR 3 #define NOTREADY 4 #define TIMEOUT 5 URMSerial urm; void setup() { Serial.begin(9600); urm.begin(2,3,9600); Serial.println("URM37 Library by Miles Burton - Distance and Servo. Version 2.0 modified by <Lame>") urm.setServoMax(180); urm.setServoMin(0); } void loop() { for(int angle=0; angle<180; angle++) { // Set servo angle urm.setServo(angle); Serial.print("Measurement: "); Serial.print(getMeasurement()); // Output measurement Serial.print(" At: "); Serial.print(angle); Serial.print("*\n"); } } int value; // This value will be populated int getMeasurement() { switch(urm.requestMeasurementOrTimeout(DISTANCE, value)) // Find out the type of request { case DISTANCE: Serial.println(value); return value; break; case TEMPERATURE: return value; break; case ERROR: Serial.println("Error"); break; case NOTREADY: Serial.println("Not Ready"); break; case TIMEOUT: Serial.println("Timeout"); break; } return -1; } Запускаем serial monitor и радуемся!