![]() |
|
|
#81 |
|
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9824 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Вот теперь подошла очередь сделать из этой платформы робота шпиона
Следующий этап это прикрутить к нему беспроводную зарядку и автоматический поиск базы |
|
|
|
|
|
#82 |
|
Junior Member
Регистрация: 03.07.2013
Адрес: Санкт-Петербург
Возраст: 29
Сообщений: 14
Вес репутации: 0 ![]() |
а какую программу вы использовали для андроид?
|
|
|
|
|
|
#83 |
|
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9824 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Я использую веб браузер и не важно на каком это устройстве
Хоть на PC, Android, iPhon или iPad На роботе установлен роутер wr703N с веб сервером и mjpg stremer |
|
|
|
|
|
#84 |
|
Junior Member
Регистрация: 05.08.2013
Адрес: Москва
Сообщений: 19
Вес репутации: 0 ![]() |
Подключил акселерометр-гироскоп и магнитометр.
С магнитометром пока не пробовал. При отладке заметил, что в состоянии покоя значения акселерометра плавают. А значения гироскопа стабильны. Поэтому решил для коррекции движения прямо использовать показания оси Z. Скорректировал программу объезда препятствий. Робот стал ездить прямо. Библиотеку для работы с акселерометром-гироскопом взял из интернета. Только добавил настройку фильтра низких частот до 10 Гц + децимацию. С гироскопом работаю по прерываниям для стабильности показаний. Коррекцию выполняю каждую 1/10 секунды. Николай. |
|
|
|
|
|
#85 |
|
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9824 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
А подробности по гироскопу MPU9250 хотелось бы услышать, какая либа использовалась?
|
|
|
|
|
|
#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);
}
|
|
|
|
|
|
#87 |
|
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9824 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Спасибо!
Я не думал что гироскоп будет так точно контролировать отклонения Судя по видео, очень хороший результат, буду с гироскопом тоже пробовать |
|
|
|
|
|
#88 |
|
Junior Member
Регистрация: 23.09.2013
Сообщений: 1
Вес репутации: 0 ![]() |
Я тоже делаю похожего робота, только на гусеничном ходу.
Вы web-морду на чём делали? На javascript\ajax или php? (или на том и другом вместе)? можете показать код странички? В браузере не проблема поток с камеры показать. А вот во внешнее приложение, например C++ (вы на первой странице упоминали opencv) у вас получилось поток передать? Я пока на этом этапе застрял.... |
|
|
|
|
|
#89 | |||
|
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9824 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Цитата:
Цитата:
Цитата:
Через пару дней будет доступна прошивка |
|||
|
|
|
|
|
#90 | |
|
Senior Member
|
Цитата:
PHP код:
|
|
|
|
|
![]() |
| Метки |
| сделать робота дома, робот, робота свими руками, robot, как сделать робота, платформа для робота |
| Здесь присутствуют: 2 (пользователей: 0 , гостей: 2) | |
| Опции темы | Поиск в этой теме |
| Опции просмотра | |
|
|