Autonoma drone som du redan har i din ficka! (3 / 6 steg)
Steg 3: Programvara - analysera
1) läsa stick position från mottagaren
3) control servo
2) kontroll ESC
För detta föreslår kommer vi använda test setup som finns på sida 2. Komponenterna är:
1) android IOIO sköld från sidan 2.
2) mottagare ansluten till digital stift 3-7
3) ESC ansluten till pin terminal 10
4) servo ansluten till pin terminal 11
Min ESC inkluderar BEC, som betyder du kan leverera IOIO styrelsen formuläret kopplat ESC. I det här fallet svart lumper på vår sköld kommer att placeras på vänster sida, VIN stift på IOIO styrelse kommer att anslutas till servo terminaler (ESC kommer att leverera IOIO styrelsen).
För utveckling av programvara, kommer att du behöva installera standard Android utvecklingsmiljö och inkluderar IOIO bibliotek till ditt projekt. Du kan hitta tutorial här: https://www.sparkfun.com/tutorials/280 och doc umentation för Android IOIO projektet här: https://github.com/ytai/ioio/wiki
Våra test ansökan har enkel gui, vi kommer att behöva:
2 x slider kontroll servo och ESC (kontrollera PWM stift 10, 11)
5 x etikett visar värden från mottagaren (reed pulse bredd på stift 3-7)
Android IOIO erbjuder puls Input. Denna typ av indata kan du läsa bredd av inkommande puls, så dess perfekt för läsning pulser Formulärmottagaren. IOIO har 6 tillgängliga sådana (3 enkel precision, 3 dubbel precision) du inte kan använda 6 enda eller 6 dubbel precision, måste du dela dem. Vi kommer använda PWM för körning och sociala råden och servon. Du kan hitta funktioner för varje individ pin här https://github.com/ytai/ioio/wiki/Getting-To-Know-The-Board
Denna test app har relä enkel kod:
allmän klass MainActivity sträcker sig IOIOActivity {
privat TextView ch1, ch2, ch3, ch4, ch5;
privat SeekBar seekBar1, seekBar2;
privata int seekBar1_val, seekBar2_val;
skyddade 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 = (SeekBar) findViewById(R.id.seekBar1);
seekBar2 = (SeekBar) findViewById(R.id.seekBar2);
seekBar1_val = 1000;
seekBar2_val = 1500;
seekBar1.setMax(1000);
seekBar2.setMax(1000);
seekBar2.setProgress(500);
seekBar1.setOnSeekBarChangeListener (nya OnSeekBarChangeListener() {
public void onStopTrackingTouch (SeekBar seekBar) {
}
public void onStartTrackingTouch (SeekBar seekBar) {
}
public void onProgressChanged (SeekBar seekBar, int framsteg, boolesk fromUser) {
seekBar1_val = framsteg + 1000;
}
});
seekBar2.setOnSeekBarChangeListener (nya OnSeekBarChangeListener() {
public void onStopTrackingTouch (SeekBar seekBar) {
}
public void onStartTrackingTouch (SeekBar seekBar) {
}
public void onProgressChanged (SeekBar seekBar, int framsteg, boolesk fromUser) {
seekBar2_val = framsteg + 1000;
}
});
}
offentliga boolean onCreateOptionsMenu (Menu menu) {
Blåsa upp menyn; Detta lägger till innehåll i åtgärdsfältet om den finns.
getMenuInflater () .inflate (R.menu.main, menyn);
return true;
}
klassen Looper utökar BaseIOIOLooper {
privat PulseInput pulse_ch1;
privat PulseInput pulse_ch2;
privat PulseInput pulse_ch3;
privat PulseInput pulse_ch4;
privat PulseInput pulse_ch5;
privat PwmOutput M1.
privat PwmOutput Servo;
offentliga flyta ch1_val;
offentliga flyta ch2_val;
offentliga flyta ch3_val;
offentliga flyta ch4_val;
offentliga flyta ch5_val;
privat DigitalOutput led_;
skyddade void setup() kastar 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 (nya DigitalInput.Spec(6),
PulseInput.ClockRate.RATE_250KHz,
PulseInput.PulseMode.POSITIVE,
false);
pulse_ch5 = ioio_.openPulseInput (nya DigitalInput.Spec(7),
PulseInput.ClockRate.RATE_250KHz,
PulseInput.PulseMode.POSITIVE,
false);
M1 = ioio_.openPwmOutput (10, 50);
Servo = ioio_.openPwmOutput (11, 50);
led_ = ioio_.openDigitalOutput (0, true);
}
public void loop() kastar ConnectionLostException {
led_.write(false);
försök {
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);
} fånga (InterruptedException e) {
}
runOnUiThread (nya Runnable() {
public 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));
}
});
}
}
skyddade IOIOLooper createIOIOLooper() {
returnera nya Looper();
}
}
Vår analys gick bra, vi kan:
1) läsa stick position från mottagare via digitala ingångar
3) control servo
2) kontroll ESC
Testa video: