Primera prueba

En la primera prueba vamos a conectar un motor brushless al arduino y lo vamos a controlar con un pequeño programa hecho con .NET C#.

Antes de nada, hemos de saber que todas estas pruebas son altamente peligrosas debido a las velocidades de los motores por lo que para empezar tenemos que enumerar todos los riesgos conocidos y sus soluciones:
  • Desconectado de emergencia: Por si algo fuera mal tenemos que tener control absoluto del motor. Para ello vamos a poner un pequeño botón que accionara el motor, SOLO se accionara en caso de de que esté pulsado.
  • Sentido de giro inverso a la rosca: Hay que cercionarse de hacia que lado gira nuestro motor y hacia que lado esta la rosca del tornillo para las hélices antes de poner ninguna hélice. El motor ha de girar en el sentido opuesto en el que se enrosca la hélice para que debido a la inercia se apriete más en lugar de aflojarse.
  • Conexiones correctas antes de LiPo: Es importantísimo que todo este bien conectado antes de enchufar la LiPo, cercionarse varias veces. Las LiPo podrían explotar si son cortocircuitadas.

Después de tomar estas precauciones realizamos el siguiente montaje. Desde el programa se manda la información al arduino y el arduino la manda al ESC con una señal PWM 50Hz con Duty cycle de 1 a 1.5 ms (Debido a esto, el máximo valor que podemos enviar con la librería servo es 127).


El código utilizado en el arduino es el siguiente:

Código Arduino

#include <Servo.h>

Servo mot;
char data[20];
int inindx;
char serialbyte;

 //pins
int Boton = 52; 
int motpin = 3;

int velmot;

void setup(){
  Serial.begin(9600);
  pinMode(Boton,INPUT);
  pinMode(45, OUTPUT);
  mot.attach(motpin);
}

void loop(){
  for(int j=0; j<20; j++){
     data[j]=0;
  }
 
  inindx=0;
  while (Serial.available()>0) {
    serialbyte= Serial.read();
    data[inindx]=serialbyte;
    inindx++;
    delay(1);
  }
 
  if (digitalRead(Boton) == HIGH)
    {
      for(int j=0; j<20; j++){
        if(data[j]==127 && data[j+1]==0)
          {
            if(data[j+2]==114) { velmot = data[j+3]; digitalWrite(45, HIGH); mot.write(velmot);}
          }
      }
    }
  else{
    velmot = 30;
    mot.write(velmot);
    digitalWrite(45, LOW);
  }
  delay(50);
}


En C#.Net hemos utilizado un formulario con los siguientes controles. Cabe destacar que el rango de la Trackbar es 0-127


Codigo Formulario C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;

namespace BrushlessControl
{
    public partial class Control : Form
    {
        SerialPort port;
        byte[] motor1cmd, startcmd;
       
        public Control()
        {
            InitializeComponent();
            port = new SerialPort("COM4", 9600, Parity.None, 8, StopBits.One);
            port.Open();
            motor1cmd = new byte[2];
            startcmd = new byte[2];
            motor1cmd[0] = 114;
            startcmd[0] = 127;
            startcmd[1] = 0;
        }

        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            textBox1.Text = trackBar1.Value.ToString();
            motor1cmd[1] = (byte)trackBar1.Value;
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            if (textBox1.Text.Length > 0)
            {
                int valor = Convert.ToInt16(textBox1.Text);
                if (valor >= 0 && valor <= 200) trackBar1.Value = valor;
            }
            motor1cmd[1] = (byte)trackBar1.Value;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            port.Write(startcmd, 0, 2);
            port.Write(motor1cmd, 0, 2);
        }
    }
}




Aquí dejamos un video del primer montaje:


NOTA: El código para la comunicación es muy cutre pero es una readaptación de un viejo código de prueba. Pronto subiremos un código de comunicación correcto y fiable.

Comments