Paso 3: Software - análisis de
1) leer la posición de stick de receptor
3) servo control
2) control ESC
Para esto proponemos vamos a utilizar configuración de prueba mencionado en la página 2. Los componentes son:
1) android IOIO con escudo de la página 2.
2) receptor conectado a los pines digitales 3-7
3) conectado al pin 10 terminal de ESC
4) servo conectado al pin 11 terminal
Mi ESC incluye BEC, que significa que puede suministrar el IOIO forma tablero conectado ESC. En este caso, Lumpur negro en nuestro escudo se colocará en el lado izquierdo, pin VIN en tablero IOIO se conectará a bornes de servo (ESC suministrará Junta IOIO).
Desarrollo de software, necesita instalar el entorno de desarrollo Android estándar e incluyen bibliotecas IOIO para su proyecto. Usted puede encontrar el tutorial aquí: umentation https://www.sparkfun.com/tutorials/280 y doc Proyecto Android IOIO aquí: https://github.com/ytai/ioio/wiki
Nuestra aplicación de prueba tiene interfaz gráfica de usuario sencilla, necesitamos:
2 slider x servo control y ESC (control de pines PWM 10, 11)
5 x valores de muestra de etiqueta del receptor (anchura de pulso de caña en las patillas 3-7)
Android IOIO ofrece entrada de pulsos. Este tipo de entrada permite leer ancho de pulso entrante, por lo que es ideal para la lectura pulsos receptor forma. IOIO tiene disponibles 6 unos (3 precisión simple, precisión doble 3) se puede utilizar 6 sola o precisión doble 6, debe separar. Utilizamos PWM para la conducción de CES y Servos. Usted puede encontrar las funciones de cada pin aquí https://github.com/ytai/ioio/wiki/Getting-To-Know-The-Board
Esta aplicación de prueba tener relé simple código:
la clase MainActivity extiende {IOIOActivity}
privado TextView ch1, ch2, ch3, ch4, ch5;
seekBar1 privado de SeekBar, seekBar2;
int privados seekBar1_val, seekBar2_val;
protegido void onCreate(Bundle savedInstanceState) {}
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
CH1=(TextView)findViewById(R.ID.ch1_text);
CH2=(TextView)findViewById(R.ID.ch2_text);
CH3=(TextView)findViewById(R.ID.ch3_text);
CH4=(TextView)findViewById(R.ID.ch4_text);
CH5=(TextView)findViewById(R.ID.ch5_text);
seekBar1 = findViewById(R.id.seekBar1) (SeekBar);
seekBar2 = findViewById(R.id.seekBar2) (SeekBar);
seekBar1_val = 1000;
seekBar2_val = 1500;
seekBar1.setMax(1000);
seekBar2.setMax(1000);
seekBar2.setProgress(500);
seekBar1.setOnSeekBarChangeListener (new OnSeekBarChangeListener() {
público vacío onStopTrackingTouch (SeekBar seekBar) {}
}
público vacío onStartTrackingTouch (SeekBar seekBar) {}
}
público vacío onProgressChanged (SeekBar seekBar, progreso de int, boolean fromUser) {}
seekBar1_val = progreso + 1000;
}
});
seekBar2.setOnSeekBarChangeListener (new OnSeekBarChangeListener() {
público vacío onStopTrackingTouch (SeekBar seekBar) {}
}
público vacío onStartTrackingTouch (SeekBar seekBar) {}
}
público vacío onProgressChanged (SeekBar seekBar, progreso de int, boolean fromUser) {}
seekBar2_val = progreso + 1000;
}
});
}
{} público boolean onCreateOptionsMenu (menú)
Inflar el menú; Esto, agrega elementos a la barra de acción si está presente.
getMenuInflater () .inflate (R.menu.main, menu);
verdaderas;
}
clase del lazador amplía {BaseIOIOLooper}
pulse_ch1 de PulseInput privado;
pulse_ch2 de PulseInput privado;
pulse_ch3 de PulseInput privado;
pulse_ch4 de PulseInput privado;
pulse_ch5 de PulseInput privado;
privado PwmOutput M1;
PwmOutput Servo privada;
pública ch1_val de flotador;
pública ch2_val de flotador;
pública ch3_val de flotador;
pública ch4_val de flotador;
pública ch5_val de flotador;
privado led_ DigitalOutput;
lanza de protegidas void setup() {} ConnectionLostException
pulse_ch1 = ioio_.openPulseInput (3, PulseMode.POSITIVE);
pulse_ch2 = ioio_.openPulseInput (4, PulseMode.POSITIVE);
pulse_ch3 = ioio_.openPulseInput (5, PulseMode.POSITIVE);
pulse_ch4 = ioio_.openPulseInput (new DigitalInput.Spec(6),
PulseInput.ClockRate.RATE_250KHz,
PulseInput.PulseMode.POSITIVE,
falso);
pulse_ch5 = ioio_.openPulseInput (new DigitalInput.Spec(7),
PulseInput.ClockRate.RATE_250KHz,
PulseInput.PulseMode.POSITIVE,
falso);
M1 = ioio_.openPwmOutput (10, 50);
Servo = ioio_.openPwmOutput (11, 50);
led_ = ioio_.openDigitalOutput (0, true);
}
lanza de público void loop() {ConnectionLostException}
led_.Write(false);
trate de {}
ch1_val = pulse_ch1.getDuration() * 1000;
ch2_val = pulse_ch2.getDuration() * 1000;
ch3_val = pulse_ch3.getDuration() * 1000;
ch4_val = pulse_ch4.getDuration() * 1000;
ch5_val = pulse_ch5.getDuration() * 1000;
M1.setPulseWidth(seekBar1_val);
Servo.setPulseWidth(seekBar2_val);
Thread.Sleep(100);
} catch (InterruptedException e) {}
}
runOnUiThread (new Runnable() de {}
público void run() {}
CH1.setText (String.format ("%.2f", ch1_val));
CH2.setText (String.format ("%.2f", ch2_val));
CH3.setText (String.format ("%.2f", ch3_val));
CH4.setText (String.format ("%.2f", ch4_val));
CH5.setText (String.format ("%.2f", ch5_val));
}
});
}
}
protegida IOIOLooper createIOIOLooper() {
volver a Looper() nuevo;
}
}
Nuestro análisis ha ido bien, que podemos:
1) leer la posición de stick de receptor vía entradas digitales
3) servo control
2) control ESC
Vídeo de la prueba: