diumenge, 23 de març del 2014

Drone peça per peça

doncs va vinga, una petita i ràpida explicació de drones:

bàsicament s'ha d'aconseguir un sistema que al 50% de la potencia aixequi el seu propi pes, per lo general, un multirotor de hobby per a gopro sol pesar un parell de quilos, així que la força dels motors ha de ser d'uns 4 quilos, un quilo per motor en una configuració X4 o +4, (X o + és la forma)
es sol utilitzar un xassís lleuger, fins ara aquests donen molt bon resultat per començar, ja que son lleugers (com un de carbono) i molt resistents http://www.banggood.com/Wholesale-HJ450-4-Axis-RC-Remote-Control-Quapcopter-Repair-And-Replacement-Rack-p-56959.html

o amb aquesta forma per a posar una gopro amb gimbal i FPV http://www.banggood.com/REPTILE-500-V2-Alien-Multicopter-500mm-Quadcopter-Frame-Landing-Skid-p-70706.html, on la càmera no es tapada per les potes

uns motors com aquests: http://www.banggood.com/Wholesale-SunnySky-X2212-KV980-Brushless-Motor-For-RC-Airplane-Quadcopter-p-60600.html amb unes aspes 10*4.5 és ideal.

Les millors aspes son les APC slowfly, i aquestes amb aquest motor són ideals, o fibra de carboni si vols a un nivell superior:
http://www.banggood.com/Wholesale-APC-1047-Propeller-Blade-For-Multi-Copter-RC-Helicopter-p-66592.html

si t'hi fixes a la pagina del motors, on diu 11.1 V (una bateria de 3S, 3 celes Lipo) i unes aspes 11*45 com les que t'he passat consumeix màxim 18A
d'aquesta manera ara em d'anar a buscar uns ESC, el controlador dels motors, que es controlen com si fossin servos, per PWM
com son 18A buscarem uns de 20-30A, a més A, més pes
el ESC que menys pesa es aquest: http://www.banggood.com/SKY-30A-4-In-1-Brushless-ESC-2-6S-For-Quadcopter-Multicopter-p-90259.html
Que per preu no esta malament

si no, els senzills.
Aquests son els Pepinos, son necessaris, 4, un per cada motor: 
http://www.banggood.com/DJI-30A-OPTO-Brushless-ESC-For-DJI-Flame-Wheel-F450-F550-Multicopter-p-76297.html

sino pasariem a aquests: http://www.banggood.com/Hobbywing-Platinum-30A-Pro-2-6S-ESC-OPTO-For-Quadcopter-p-89406.html que donen molt bon resultat

vinga, ja tenim la mecànica bàsica, ara el controlador
el controlador que no te l'acabes es aquest:http://www.banggood.com/ArduPilot-Mega-APM-2_6-Flight-Controller-With-6M-GPS-For-Multicopters-p-89910.html d'arduino, GPS, etc

amb la telemetria en temps real per al PC http://www.banggood.com/3DR-Radio-Telemetry-915MHZ-Module-For-APM-APM2-p-73539.html però el de 440MHz, que son per EU, es de 915MHz es USA

un sensor pel controlador per saber el consum i quant queda de bateria:http://www.banggood.com/APM-2_5-Power-Module-With-5_3V-BEC-Available-With-Deans-Or-XT60-p-87586.html

una base per el GPS.. http://www.banggood.com/GPS-Folding-Antenna-Metal-Holder-For-Multicopter-YS-X4-X6-DJI-p-86774.html

bueno, això ha son petits detalls per anar posant, que si anti-vibradors, llums, etc
ara tenim lo bàsic per volar!
falta una emissora i una bateria pepina!
calculo que ja devem portar 1k- 1.4Kg, tenim encara uns 600 grams per la bateria
ja que compres a banggood (no tinc res a veure hehe) http://www.banggood.com/Wholesale-11_1V-5000mAh-3S1P-30C-Lipo-Rechargeable-Batterie-For-RC-Helicopter-p-57136.html

i l'avisador de bateria baixa http://www.banggood.com/Wholesale-1S-8S-Li-po-Battery-Voltage-Tester-Checker-Indicator-Monitor,Buzzer-Alarm-p-26049.html

 si no xof
si tinguessis el drone a hover potser arribaries als 20 minuts de vol
les zippy comptact les utilitzo, son les que menys pesen per més capacitat que tenen, encara que hi ha unes que costen 4 vegades o més vegades, però pesen una misèria autentica! reco de vol de 65 minuts amb 20A de capacitat! hahah
ara falta l'emissora i el carregador de bateries!
la millor emissora que et pots trobar, relació preu, durabilitat, qualitat, rang (6Km!!!!!!!) funcionalitat...
http://www.banggood.com/Wholesale-FlySky-Upgrade-FS-TH9X-FS-TH9XB-2_4G-9CH-RC-Remote-Control-Transmitter-Mode-2-p-47904.html

i el carregador.... http://www.banggood.com/IMAX-B6-AC-B6AC-Lipo-NiMH-3S-RC-Battery-Balance-Charger-p-908064.html

Aquest sense dubte! et carrega tot! Lipo, Nimh, de toooot! es programable, i va super be!
si, 6Km des de una muntanya a una altre! impressionant!
ara ja tindries una drone per fer-ho volar, gps, foto etc
si volguessis un bon vídeo en gopro hauries de possar-te una gimbal, k sempre et manté horitzontal la càmera facis el que facis! i t'aniria be aquesta: http://www.banggood.com/Tarot-Gopro-2-Axis-Brushless-Camera-Gimbal-With-Gyro-TL68A00-p-82497.html

però clar! aquesta es amb controlador i tot molt pepino, també hi ha versions més barates com aquesta http://www.banggood.com/DJI-Phantom-Gopro3-Brushless-Gimbaland2-axis-Brushless-Gimbal-Controller-p-917063.html

si, senzillet, si el volguessis pepino, seria passar-se a un xassís de fibra de carbono, amb potes retràctils, uns motors plans i més amples, que tenen menys RPM, però li poses unes hèlix més grans i tenen molt més rendiment! (clar un preu de 2 a 4 vegades mes car)
un controlador NAZA, una radio futaba de 6ch com a miiiiiiiiiiniiiiiiiiim!
gimbal per a una NEX5... etc
l'ardupilot aquest es d'un segon distribuïdor, k costa uns 70€, però l'original costa uns 300!!!
els motors aquests estan molt be, relaci´p qualitat preu, però els motors T motor, k son 4 vegades mes cars son molt mes pepinos, potser aconsegueixes 5 minuts més de vol...

(que quedi clar que no tinc res a veure amb banggood.com!)  Però si cliqueu aqui rebreu 10$ gift card i jo 3$! hehe 
http://www.banggood.com/?zf=393976

dijous, 6 de febrer del 2014

Código Control diferencial por joystick de un robot

El codi per a utilitzar amb la placa motor shield, el més important direccions i velocitats que es poden canviar per qualsevol llibreria. A més es pot veure per Serial les velocitats i quins casos hi ha.
S'ha utilitzat : http://www.banggood.com/Motor-Drive-Shield-L293D-For-Arduino-Duemilanove-Mega-Or-UNO-p-72855.html i l'arduino UNO. Només amb dos motors, però ampliable a 4.

/*
Para entender el código es necesario entender como funciona,
 para eso vamos a dividir el quadrado del joystick en 9 zonas diferentes, contando una banda muerta

 Estas van a ser las lecturas del potenciómetro respecto a un cuadrado (donde 512 es la posición central):
           Y(1023)
         |----------|
         |----------|
   X(0)|---512---|X(1023)
         |----------|
         |----------|
            Y(0)

 Este cuadrado lo dividiremos de esta manera:

 (11)(12)(13)
 (21)(22)(23)
 (31)(32)(33)

 (11)(12d)(13)
 (21d)(22d)(23d)
 (31)(32)(33)

 como si fuese una matriz.
 cuando X sea mayor que 512 + la zona muerta estaremos en la fila superior,
 cuanto Y sea menor que 512 - la zona muerta estaremos en la columna de la izquierda
 para detectar esta lo tendremos que hacer mediante "if", "else if" e "else".
 la cruz central es dentro del rango de la zona muerta.
 Una vez detectado el caso tendremos que hacer una cosa u otra.

 */
#include <AFMotor.h>
AF_DCMotor motorD(3);
AF_DCMotor motorI(4);
//declaración variables de entrada:
const byte Xpot=A0;
const byte Ypot=A1;

//declaración de variables:
const int cposX=502, cposY=509; //por defecto el valor del potenciometro es de 512 en el centro
unsigned int Xspeed=0, Yspeed=0; //por defecto 0 es completa parada
const int dZ=5; //ancho de banda muerta necesaria sobrepasar
int caso=0; //caso para saber el cuadrante, variables para calcular
int velIz, velDe;

void setup(){
  //declaración de pinModes:
  Serial.begin(9600);
  pinMode(Xpot, INPUT);
  pinMode(Ypot, INPUT);
}

void loop(){
  delay(200);
  int posX = analogRead(Xpot); //leemos los valores de las dos resisténcias variables
  int posY = analogRead(Ypot); //y las guardamos de 0 a 1023
  Serial.print ("Lectura X: "), Serial.print(posX), Serial.print(" Lectura Y: "), Serial.println(posY);
  //adelante o atrás
  if(posY>(cposY+dZ)){                 //delante
    caso=10;
    Yspeed= (posY-(cposY+dZ))/2;
    Yspeed=constrain(Yspeed, 0, 255);
  }
  else if(posY<(cposY-dZ)){            //atrás
    Yspeed=((cposY-dZ)-posY)/2;
    Yspeed=constrain(Yspeed, 0, 255);
    caso=30;
  }
  else {                               //centro
    caso=20;

  }

  Serial.print("Caso inicial: "), Serial.println(caso);

  //izquierda o derecha
  if(posX<(cposX-dZ))                 //izquierda
  {
    caso=caso+1;
    Xspeed=((cposX-dZ)-posX)/2;
    Xspeed=constrain(Xspeed, 0, 255);
  }
  else if(posX>(cposX+dZ)){             //derecha
    Xspeed=(posX-(cposX+dZ))/2;
    Xspeed=constrain(Xspeed, 0, 255);
    caso=caso+3;
  }
  else {                              //centro
    caso=caso+2;

  }

Serial.print("Yspeed: "), Serial.print(Yspeed),Serial.print("Xspeed: "), Serial.println(Xspeed);
  Serial.print("Caso: "), Serial.println(caso);
  switch (caso){

  case 11:
    if(Yspeed>Xspeed){
      motorI.run(FORWARD), motorD.run(FORWARD);
      velIz=Yspeed-Xspeed, velDe=Yspeed;
      motorI.setSpeed(velIz), motorD.setSpeed(velDe);
    }
    else{
      motorI.run(BACKWARD), motorD.run(FORWARD);
      velIz=Xspeed-Yspeed, velDe=Xspeed;
      motorI.setSpeed(velIz), motorD.setSpeed(velDe);
    }
    break;

  case 12:
    //estamos apuntando hacia delante, así que los dos motores irán hacia adelante con la velocidad Yspeed
    motorI.run(FORWARD), motorD.run(FORWARD);
    velIz=Yspeed, velDe=Yspeed;
    motorI.setSpeed(velIz), motorD.setSpeed(velDe);
    break;

  case 13:
    if(Yspeed>Xspeed){
      motorI.run(FORWARD), motorD.run(FORWARD);
      velIz=Yspeed, velDe=Yspeed-Xspeed;
      motorI.setSpeed(velIz), motorD.setSpeed(velDe);
    }
    else{
      motorI.run(FORWARD), motorD.run(BACKWARD);
      velIz=Xspeed, velDe=Xspeed-Yspeed;
      motorI.setSpeed(velIz), motorD.setSpeed(velDe);
    }
    break;

  case 21:
    //en este caso gira sobre si mismo hacia la izquierda, motor izquierdo atras, motor derecho adelante
    //la valocidad va respecto lo lejos que se esté del centro, con una velocidad (512-X)/2
    motorI.run(BACKWARD), motorD.run(FORWARD);
    velIz=Xspeed, velDe=Xspeed;
    motorI.setSpeed(Xspeed), motorD.setSpeed(Xspeed);
    break;

  case 22:
    //al estar en la zona muerta definiremos las velocidades como ZERO:
    motorI.run(RELEASE), motorD.run(RELEASE);
    velIz=0, velDe=0;
    motorI.setSpeed(velIz), motorD.setSpeed(velDe);
    break;

  case 23:
    //en este caso gira sobre si mismo hacia la derecha, motor izquierdo adelante, motor derecho atras
    //la valocidad va respecto lo lejos que se esté del centro, con una velocidad (X-512)/2
    motorI.run(FORWARD), motorD.run(BACKWARD);
    velIz=Xspeed, velDe=Xspeed;
    motorI.setSpeed(velIz), motorD.setSpeed(velDe);
    break;

  case 31:
    if(Yspeed>Xspeed){
      motorI.run(BACKWARD), motorD.run(BACKWARD);
      velIz=Yspeed, velDe=Yspeed-Xspeed;
      motorI.setSpeed(velIz), motorD.setSpeed(velDe);
    }
    else{
      motorI.run(BACKWARD), motorD.run(FORWARD);
      velIz=Xspeed, velDe=Xspeed-Yspeed;
      motorI.setSpeed(velIz), motorD.setSpeed(velDe);
    }
    break;

  case 32:
    //estamos apuntando hacia atras, así que los dos motores irán hacia atras con la velocidad Yspeed
    motorI.run(BACKWARD), motorD.run(BACKWARD);
    velIz=Yspeed, velDe=Yspeed;
    motorI.setSpeed(velIz), motorD.setSpeed(velDe);
    break;

  case 33:
    if(Yspeed>Xspeed){
      motorI.run(BACKWARD), motorD.run(BACKWARD);
      velIz=Yspeed-Xspeed, velDe=Yspeed;
      motorI.setSpeed(velIz), motorD.setSpeed(velDe);
    }
    else{
      motorI.run(FORWARD), motorD.run(BACKWARD);
      velIz=Xspeed-Yspeed, velDe=Xspeed;
      motorI.setSpeed(velIz), motorD.setSpeed(velDe);
    }
    break;

  }
  Serial.print("Vel mot Izq: "), Serial.print(velIz), Serial.print(", Vel mot Der: "), Serial.println(velDe);
}