Étape 3: Logiciel - analyse
1) lire le bâton position du récepteur
3) servo de contrôle
2) commande ESC
Pour cela proposer nous allons utiliser la configuration de test mentionnée à la page 2. Les composants sont :
1) IOIO android avec écran de la page 2.
2) récepteur connecté à broches numériques 3-7
3) ESC relié à la broche 10 bornes
4) servo connecté à la broche 11 terminal
Mon ESC comprend BEC, cela signifie que vous pouvez fournir IOIO Conseil formulaire lié ESC. Dans ce cas, lumper noir sur notre bouclier sera placé sur le côté gauche, broche de VIN à bord IOIO sera connecté aux bornes de servo (ESC fournira Conseil IOIO).
Pour le développement de logiciel, vous devrez installer l’environnement de développement Android standard et comprennent des bibliothèques de IOIO à votre projet. Vous pouvez trouver le tutoriel ici : https://www.sparkfun.com/tutorials/280 et doc umentation pour projet Android IOIO ici : https://github.com/ytai/ioio/wiki
Notre application de test ai gui simple, nous aurons besoin :
2 slider x servo contrôle et ESC (contrôle broches PWM 10, 11)
5 x montrant les valeurs étiquette du récepteur (largeur d’impulsion de roseaux sur les broches 3-7)
IOIO Android offre entrée d’impulsion. Ce type d’entrée vous permet de lire la largeur d’impulsion entrante, donc son idéal pour la lecture des impulsions récepteur de forme. IOIO ont 6 disponible ones (3 simple précision, 3 double précision) vous ne pouvez pas utiliser seul 6 ou 6 double précision, vous devez diviser. Nous utiliserons PWM pour conduire ces et Servos. Vous pouvez trouver des fonctions pour chaque individu pin ici https://github.com/ytai/ioio/wiki/Getting-To-Know-The-Board
Cette application de test ont relais simple code :
SerializableAttribute public class MainActivity extends IOIOActivity {}
privé TextView ch1, ch2, ch3, ch4 ch5 ;
privé SeekBar seekBar1, seekBar2 ;
private int seekBar1_val, seekBar2_val ;
protected 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() {}
{} public void onStopTrackingTouch (SeekBar seekBar)
}
{} public void onStartTrackingTouch (SeekBar seekBar)
}
{} public onProgressChanged Sub (SeekBar seekBar, progrès int, boolean fromUser)
seekBar1_val = progression + 1000 ;
}
});
seekBar2.setOnSeekBarChangeListener (new OnSeekBarChangeListener() {}
{} public void onStopTrackingTouch (SeekBar seekBar)
}
{} public void onStartTrackingTouch (SeekBar seekBar)
}
{} public onProgressChanged Sub (SeekBar seekBar, progrès int, boolean fromUser)
seekBar2_val = progression + 1000 ;
}
});
}
{} public boolean onCreateOptionsMenu (menu Menu)
Gonfler le menu ; Cela ajoute des éléments à la barre d’action si elle est présente.
getMenuInflater () .inflate (menu, R.menu.main) ;
retourne la valeur true ;
}
classe du boucleur étend BaseIOIOLooper {}
Private PulseInput pulse_ch1 ;
Private PulseInput pulse_ch2 ;
Private PulseInput pulse_ch3 ;
Private PulseInput pulse_ch4 ;
Private PulseInput pulse_ch5 ;
privé PwmOutput M1 ;
privé PwmOutput Servo ;
public Float ch1_val ;
public Float ch2_val ;
public Float ch3_val ;
public Float ch4_val ;
public Float ch5_val ;
Private DigitalOutput led_ ;
protected void setup() lève {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,
faux) ;
pulse_ch5 = ioio_.openPulseInput (new DigitalInput.Spec(7),
PulseInput.ClockRate.RATE_250KHz,
PulseInput.PulseMode.POSITIVE,
faux) ;
M1 = ioio_.openPwmOutput (10, 50) ;
Servo = ioio_.openPwmOutput (11, 50) ;
led_ = ioio_.openDigitalOutput (0, true) ;
}
public void loop() lève {ConnectionLostException}
led_.Write(false) ;
try {}
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() {}
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)) ;
}
});
}
}
protected IOIOLooper createIOIOLooper() {}
retour de nouveau Looper() ;
}
}
Notre analyse s’est bien passé, que nous pouvons :
1) lire le bâton position de récepteur via les entrées numériques
3) servo de contrôle
2) commande ESC
Test vidéo :