Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Форум умного дома > Сделай сам > Робототехника

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 13.09.2013, 21:08   #81
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Вот теперь подошла очередь сделать из этой платформы робота шпиона



Следующий этап это прикрутить к нему беспроводную зарядку и автоматический поиск базы
Admin вне форума   Ответить с цитированием
Старый 13.09.2013, 23:12   #82
Alex98
Junior Member
 
Регистрация: 03.07.2013
Адрес: Санкт-Петербург
Возраст: 28
Сообщений: 14
Вес репутации: 0
Alex98 is an unknown quantity at this point
По умолчанию

а какую программу вы использовали для андроид?
Alex98 вне форума   Ответить с цитированием
Старый 13.09.2013, 23:30   #83
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Я использую веб браузер и не важно на каком это устройстве
Хоть на PC, Android, iPhon или iPad
На роботе установлен роутер wr703N с веб сервером и mjpg stremer
Admin вне форума   Ответить с цитированием
Старый 18.09.2013, 21:48   #84
Ynicky
Junior Member
 
Регистрация: 05.08.2013
Адрес: Москва
Сообщений: 19
Вес репутации: 0
Ynicky is an unknown quantity at this point
По умолчанию

Подключил акселерометр-гироскоп и магнитометр.
С магнитометром пока не пробовал.
При отладке заметил, что в состоянии покоя значения акселерометра плавают.
А значения гироскопа стабильны. Поэтому решил для коррекции движения прямо
использовать показания оси Z. Скорректировал программу объезда препятствий.
Робот стал ездить прямо.
Библиотеку для работы с акселерометром-гироскопом взял из интернета.
Только добавил настройку фильтра низких частот до 10 Гц + децимацию.
С гироскопом работаю по прерываниям для стабильности показаний.
Коррекцию выполняю каждую 1/10 секунды.



Николай.
Ynicky вне форума   Ответить с цитированием
Старый 18.09.2013, 22:36   #85
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

А подробности по гироскопу MPU9250 хотелось бы услышать, какая либа использовалась?
Admin вне форума   Ответить с цитированием
Старый 18.09.2013, 23:30   #86
Ynicky
Junior Member
 
Регистрация: 05.08.2013
Адрес: Москва
Сообщений: 19
Вес репутации: 0
Ynicky is an unknown quantity at this point
По умолчанию

Библиотеку для 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);
}
Николай.
Вложения
Тип файла: rar MPU-6050.rar (2.93 Мб, 2439 просмотров)
Ynicky вне форума   Ответить с цитированием
Старый 18.09.2013, 23:39   #87
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Спасибо!
Я не думал что гироскоп будет так точно контролировать отклонения
Судя по видео, очень хороший результат, буду с гироскопом тоже пробовать
Admin вне форума   Ответить с цитированием
Старый 23.09.2013, 21:36   #88
zuluss008
Junior Member
 
Регистрация: 23.09.2013
Сообщений: 1
Вес репутации: 0
zuluss008 is an unknown quantity at this point
По умолчанию

Я тоже делаю похожего робота, только на гусеничном ходу.
Вы web-морду на чём делали?
На javascript\ajax или php? (или на том и другом вместе)?
можете показать код странички?
В браузере не проблема поток с камеры показать. А вот во внешнее
приложение, например C++ (вы на первой странице упоминали opencv)
у вас получилось поток передать?
Я пока на этом этапе застрял....
zuluss008 вне форума   Ответить с цитированием
Старый 23.09.2013, 22:21   #89
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Цитата:
Вы web-морду на чём делали?
На javascript\ajax или php? (или на том и другом вместе)?
Веб морда на html+cgi+js.

Цитата:
В браузере не проблема поток с камеры показать. А вот во внешнее
приложение, например C++ (вы на первой странице упоминали opencv)
у вас получилось поток передать?
Я пока на этом этапе застрял....
Еще не проверял

Цитата:
можете показать код странички?
Там кроме странички еще куча скриптов
Через пару дней будет доступна прошивка
Admin вне форума   Ответить с цитированием
Старый 24.09.2013, 10:36   #90
filinmd
Senior Member
 
Регистрация: 18.09.2012
Адрес: Moscow
Сообщений: 157
Вес репутации: 0
filinmd is an unknown quantity at this point
Отправить сообщение для filinmd с помощью ICQ
По умолчанию

Цитата:
Сообщение от zuluss008 Посмотреть сообщение
В браузере не проблема поток с камеры показать. А вот во внешнее
приложение, например C++ (вы на первой странице упоминали opencv)
у вас получилось поток передать?
Я пока на этом этапе застрял....
Я пишу софт для своего "робота" ( Досталась RC машинка без пульта. Решил сделать пульт на arduino + mr3020) на Adobe Air под Android и нашел на просторах интернета примеры для работы с потоком MJPEG. Это конечно не C++, но тоже может быть интересно. Правда задержка картинки большая получается.

PHP код:
package 
{  
    
import flash.display.Loader;  
    
import flash.events.Event;  
    
import flash.events.ProgressEvent;  
    
import flash.net.Socket;  
    
import flash.utils.ByteArray;  
    
    
//import mx.utils.Base64Encoder;  
    
    /** 
     * This is a class used to view a MJPEG 
     * @author Josh Chernoff | GFX Complex 
     *  
     */  
    
public class  Main extends Loader  
    
{  
        private var 
_user:String;                                   //Auth user name  
        
private var _pass:String;                                   //Auth user password  
        
        
private var _host:String;                                   //host server of stream  
        
private var _port:int;                                      //port of stream          
        
private var _file:String;                                   //Location of MJPEG  
        
private var _start:int 0;                                 //marker for start of jpg  
        
        
private var webcamSocket:Socket = new Socket();             //socket connection  
        
private var imageBuffer:ByteArray = new ByteArray();        //image holder  
        
        /** 
         * Create's a new instance of the MJPEG class. Note that due a sandbox security problem, unless you can place a crossdomain.xml  
         * on the host server you will only be able to use this class in your AIR applications. 
         *  
         * @example import MJPEG; 
         *          var cam:MJPEG = new MJPEG("192.168.0.100", "/img/video.mjpeg", 80); 
         *          addChild(cam); 
         *           
         * @param   host:String | Host of the server. Do not include protocol  
         * @param   file:String | Path to the file on the server. Start with a forward slash 
         * @param   port:int    | Port of the host server; 
         * @param   user:String | User name for Auth 
         * @param   pass:String | User password for Auth 
         */  
        
        
public function Main ():void {
            
MJPEG("192.168.1.99","",8888);
        }
        
        public function 
MJPEG (host:Stringfile:Stringport:int 80user:String nullpass:String null )  :void
        
{  
            
_host host;  
            
_file file;  
            
_port port;  
            
_user user;  
            
_pass pass;  
            
            
webcamSocket.addEventListener(Event.CONNECThandleConnect);  
            
webcamSocket.addEventListener(ProgressEvent.SOCKET_DATAhandleData);  
            
webcamSocket.connect(hostport);  
            
        }  
        
        private function 
handleConnect(e:Event):void   
        
{  
            
// we're connected send a request  
            
var httpRequest:String "GET "+_file+" HTTP/1.1\r\n";  
            
httpRequest+= "Host: localhost:80\r\n";  
            
/*  
            if(_user != null && _pass != null){ 
            var source:String = String(_user + ":" + _pass); 
            var auth:String = Base64.encode(source); 
            httpRequest += "Authorization: Basic " + auth.toString()+ "\r\n";   //NOTE THIS MAY NEEED TO BE EDITED TO WORK WITH YOUR CAM 
            } 
            */  
            
httpRequest+="Connection: keep-alive\r\n\r\n";  
            
webcamSocket.writeMultiByte(httpRequest"us-ascii");  
        }  
        
        private function 
handleData(e:ProgressEvent):void {  
            
//trace("Got Data!" + e);  
            // get the data that we received.  
            
            // append the data to our imageBuffer  
            
webcamSocket.readBytes(imageBufferimageBuffer.length);  
            
//trace(imageBuffer.length);  
            
while(findImages()){  
                
//donothing  
            
}  
            
            
        }  
        
        
        private function 
findImages():Boolean  
        
{  
            
            var 
x:int _start;  
            var 
startMarker:ByteArray = new ByteArray();      
            var 
end:int 0;  
            var 
image:ByteArray;  
            
            if (
imageBuffer.length 1) {  
                if(
_start == 0){  
                    
//Check for start of JPG  
                    
for (ximageBuffer.length 1x++) {  
                        
                        
// get the first two bytes.  
                        
imageBuffer.position x;  
                        
imageBuffer.readBytes(startMarker02);  
                        
                        
//Check for end of JPG  
                        
if (startMarker[0] == 255 && startMarker[1] == 216) {  
                            
_start x;  
                            break;                    
                        }  
                    }  
                }  
                for (
ximageBuffer.length 1x++) {  
                    
// get the first two bytes.  
                    
imageBuffer.position x;  
                    
imageBuffer.readBytes(startMarker02);  
                    if (
startMarker[0] == 255 && startMarker[1] == 217){  
                        
                        
end x;  
                        
                        
image = new ByteArray();  
                        
imageBuffer.position _start;  
                        
imageBuffer.readBytes(image0end _start);  
                        
                        
displayImage(image);  
                        
                        
// truncate the imageBuffer  
                        
var newImageBuffer:ByteArray = new ByteArray();  
                        
                        
imageBuffer.position end;  
                        
imageBuffer.readBytes(newImageBuffer0);  
                        
imageBuffer newImageBuffer;  
                        
                        
_start 0;  
                        
0;  
                        return 
true;  
                    }  
                }  
            }  
            
            return 
false;  
        }  
        
        private function 
displayImage(image:ByteArray):void  
        
{  
            
this.loadBytes(image);  
        }  
        
    }  
    

filinmd вне форума   Ответить с цитированием
Ответ

Метки
сделать робота дома, робот, робота свими руками, robot, как сделать робота, платформа для робота


Здесь присутствуют: 9 (пользователей: 0 , гостей: 9)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 02:25. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика