13.09.2013, 21:08 | #81 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 |
Вот теперь подошла очередь сделать из этой платформы робота шпиона
Следующий этап это прикрутить к нему беспроводную зарядку и автоматический поиск базы |
13.09.2013, 23:12 | #82 |
Junior Member
Регистрация: 03.07.2013
Адрес: Санкт-Петербург
Возраст: 28
Сообщений: 14
Вес репутации: 0 |
а какую программу вы использовали для андроид?
|
13.09.2013, 23:30 | #83 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 |
Я использую веб браузер и не важно на каком это устройстве
Хоть на PC, Android, iPhon или iPad На роботе установлен роутер wr703N с веб сервером и mjpg stremer |
18.09.2013, 21:48 | #84 |
Junior Member
Регистрация: 05.08.2013
Адрес: Москва
Сообщений: 19
Вес репутации: 0 |
Подключил акселерометр-гироскоп и магнитометр.
С магнитометром пока не пробовал. При отладке заметил, что в состоянии покоя значения акселерометра плавают. А значения гироскопа стабильны. Поэтому решил для коррекции движения прямо использовать показания оси Z. Скорректировал программу объезда препятствий. Робот стал ездить прямо. Библиотеку для работы с акселерометром-гироскопом взял из интернета. Только добавил настройку фильтра низких частот до 10 Гц + децимацию. С гироскопом работаю по прерываниям для стабильности показаний. Коррекцию выполняю каждую 1/10 секунды. Николай. |
18.09.2013, 22:36 | #85 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 |
А подробности по гироскопу MPU9250 хотелось бы услышать, какая либа использовалась?
|
18.09.2013, 23:30 | #86 |
Junior Member
Регистрация: 05.08.2013
Адрес: Москва
Сообщений: 19
Вес репутации: 0 |
Библиотеку для MPU6050 брал оттуда:
https://docs.google.com/file/d/0B2_r...htaXo1bVE/edit Код программы: Код:
//exohod.ino #include <Servo.h> // Arduino Wire library is required if I2Cdev I2CDEV_ARDUINO_WIRE implementation // is used in I2Cdev.h #include "Wire.h" // I2Cdev and MPU6050 must be installed as libraries, or else the .cpp/.h files // for both classes must be in the include path of your project #include "I2Cdev.h" #include "MPU6050.h" // class default I2C address is 0x68 // specific I2C addresses may be passed as a parameter here // AD0 low = 0x68 (default for InvenSense evaluation board) // AD0 high = 0x69 MPU6050 accelgyro; int16_t ax, ay, az; int16_t gx, gy, gz; unsigned int uiPtr = 0; int iFiltrAX = 0; int iFiltrAY = 0; int iFiltrAZ = 0; int iFiltrGX = 0; int iFiltrGY = 0; int iFiltrGZ = 0; int iAbsFiltrGZ; const int ciIR_pin = A5; Servo myservo; // create servo object to control a servo // a maximum of eight servo objects can be created const int ciSRVIR = 11;///3 // (pwm) pin 11 connected to servo of Sharp IR sensor const int ciINTpin = 2;///2 ///const int ciDRDYpin = 3; const int ciAIA = 9; // (pwm) pin 9 connected to pin A-IA const int ciAIB = 5; // (pwm) pin 5 connected to pin A-IB const int ciBIA = 10; // (pwm) pin 10 connected to pin B-IA const int ciBIB = 6; // (pwm) pin 6 connected to pin B-IB byte bHighSpeed = 255; // change this (0-255) to control the speed of the motors byte bLeftSpeed; byte bRightSpeed; int iDecCnt = 0; int iF = 0; void setup() { /// debug: /// Serial.begin(9600); /// Serial.begin(115200); /// // join I2C bus (I2Cdev library doesn't do this automatically) Wire.begin(); // initialize device accelgyro.initialize(); // verify connection /// Serial.println("\nTesting device connections..."); /// Serial.println(accelgyro.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed"); accelgyro.setInterruptLatch(false); accelgyro.setIntDataReadyEnabled(true); accelgyro.setDLPFMode(5);///10Hz pinMode(ciINTpin, INPUT); /// pinMode(ciDRDYpin, INPUT); attachInterrupt(ciINTpin, IRQ1func, RISING); myservo.attach(ciSRVIR); // attaches the servo on pin 11 myservo.writeMicroseconds(1450); // middle position (450uS...2450uS) pinMode(ciAIA, OUTPUT); // set pins to output pinMode(ciAIB, OUTPUT); pinMode(ciBIA, OUTPUT); pinMode(ciBIB, OUTPUT); bLeftSpeed = bHighSpeed; bRightSpeed = bHighSpeed; delay(2000); // forward(); } void loop() { if(iF) { iF = 0; accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); /// accelgyro.getAcceleration(&ax, &ay, &az); /// accelgyro.getRotation(&gx, &gy, &gz); ///Filter: iFiltrGZ += gz; uiPtr++; if(uiPtr > 9) { uiPtr = 0; iFiltrGZ += 2200; iFiltrGZ >>= 9;///9 if(iFiltrGZ < 0) iAbsFiltrGZ = iFiltrGZ * -1; else iAbsFiltrGZ = iFiltrGZ; if(iAbsFiltrGZ > 255) iAbsFiltrGZ = 255; if(iFiltrGZ < 0) { bLeftSpeed = bHighSpeed - (byte)iAbsFiltrGZ; bRightSpeed = bHighSpeed; } else { bLeftSpeed = bHighSpeed; bRightSpeed = bHighSpeed - (byte)iAbsFiltrGZ; } /// debug: /// Serial.print(bLeftSpeed); Serial.print("\t"); /// Serial.print(bRightSpeed); Serial.print("\t"); /// Serial.print(iFiltrGZ); Serial.print("\t"); /// Serial.println(iAbsFiltrGZ); /// Serial.println(iDecCnt); /// iFiltrGZ = 0; forward(); } } int iDistance = GetDist(); /// debug: ///Serial.print((byte)(iDistance>>8),HEX); ///Serial.println((byte)iDistance,HEX); /// if(iDistance > 0x240)///10cm { pause(); delay(100); myservo.writeMicroseconds(950); // Left 45degrees position delay(200); int iDistLeft = GetDist(); myservo.writeMicroseconds(1950); // Right 45degrees position delay(400); int iDistRight = GetDist(); myservo.writeMicroseconds(1450); // middle position delay(300); if(iDistRight > iDistLeft) right(); else left(); delay(350); pause(); delay(200); forward(); } } void IRQ1func() { iDecCnt++; if(iDecCnt > 8) { iF = 1; iDecCnt = 0; } } int GetDist() { int iD = 0; for(int iA = 0; iA < 8; iA++) { iD += analogRead(ciIR_pin); } iD >>= 3; return iD; } void backward() { analogWrite(ciAIA, LOW); analogWrite(ciAIB, bRightSpeed); analogWrite(ciBIA, LOW); analogWrite(ciBIB, bLeftSpeed); } void forward() { analogWrite(ciAIA, bRightSpeed); analogWrite(ciAIB, LOW); analogWrite(ciBIA, bLeftSpeed); analogWrite(ciBIB, LOW); } void left() { analogWrite(ciAIA, bHighSpeed); analogWrite(ciAIB, LOW); analogWrite(ciBIA, LOW); analogWrite(ciBIB, bHighSpeed); } void right() { analogWrite(ciAIA, LOW); analogWrite(ciAIB, bHighSpeed); analogWrite(ciBIA, bHighSpeed); analogWrite(ciBIB, LOW); } void pause() { analogWrite(ciAIA, LOW); analogWrite(ciAIB, LOW); analogWrite(ciBIA, LOW); analogWrite(ciBIB, LOW); } |
18.09.2013, 23:39 | #87 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 |
Спасибо!
Я не думал что гироскоп будет так точно контролировать отклонения Судя по видео, очень хороший результат, буду с гироскопом тоже пробовать |
23.09.2013, 21:36 | #88 |
Junior Member
Регистрация: 23.09.2013
Сообщений: 1
Вес репутации: 0 |
Я тоже делаю похожего робота, только на гусеничном ходу.
Вы web-морду на чём делали? На javascript\ajax или php? (или на том и другом вместе)? можете показать код странички? В браузере не проблема поток с камеры показать. А вот во внешнее приложение, например C++ (вы на первой странице упоминали opencv) у вас получилось поток передать? Я пока на этом этапе застрял.... |
23.09.2013, 22:21 | #89 | |||
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 |
Цитата:
Цитата:
Цитата:
Через пару дней будет доступна прошивка |
|||
24.09.2013, 10:36 | #90 | |
Senior Member
|
Цитата:
PHP код:
|
|
Метки |
сделать робота дома, робот, робота свими руками, robot, как сделать робота, платформа для робота |
Здесь присутствуют: 9 (пользователей: 0 , гостей: 9) | |
|
|