Aller au contenu


Photo
- - - - -

AilgorRC : une voiture télécommandée IOIO + L293D

IOIO L293D

11 réponses à ce sujet

#1 ailgorbot

ailgorbot

    Membre occasionnel

  • Membres
  • Pip
  • 107 messages
  • Gender:Male
  • Interests:IOIO

Posté 19 mars 2015 - 12:45

Il fallait bien commencer par un début et ce fut une voiture télécommandée :
 
La Base :

Pour plus de détail sur les composants : http://www.robot-maker.com/forum/blog/55/entry-44-les-composants-dailgor-bot/
 
Les schémas :
AilgorRC%20T0.2_schema.jpg

post-1-0-08100100-1432292063.jpg
Enfin le code : https://github.com/ailgorbot/AilgorRC
Il y a évidement 4 boutons (left, right, up, down) à créer sur votre MainActivity (voir le fichier AndroidManifest.xml dans GitHub)

package fr.ailgor.ailgorrc;

import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import android.widget.ToggleButton;

import ioio.lib.api.DigitalOutput;
import ioio.lib.api.PwmOutput;
import ioio.lib.api.exception.ConnectionLostException;
import ioio.lib.util.BaseIOIOLooper;
import ioio.lib.util.IOIOLooper;
import ioio.lib.util.android.IOIOActivity;


public class MainActivity extends IOIOActivity {

    private ToggleButton toggleButtonLedSTAT;
    protected Button buttonLeft;
    protected Button buttonRight;
    protected Button buttonUp;
    protected Button buttonDown;


    private boolean motorLeft=false;
    private boolean motorRight=false;
    private float speed = 0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        toggleButtonLedSTAT = (ToggleButton)findViewById(R.id.toggleButtonLedSTAT);

        buttonLeft = (Button) findViewById((R.id.buttonLeft));
        buttonRight = (Button) findViewById((R.id.buttonRight));
        buttonUp = (Button) findViewById((R.id.buttonUp));
        buttonDown = (Button) findViewById((R.id.buttonDown));

        enableUi(false);

        buttonLeft.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if ((event.getAction() == MotionEvent.ACTION_MOVE)||(event.getActionMasked()!=MotionEvent.ACTION_UP))
                {
                    motorLeft = false;
                    motorRight = false;
                    speed = (float)0.5;
                }
                else
                speed = 0;


                return false;
            }
        });

        buttonRight.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if ((event.getAction() == MotionEvent.ACTION_MOVE)||(event.getActionMasked()!=MotionEvent.ACTION_UP))
                {
                    motorLeft = true;
                    motorRight = true;
                    speed = (float)0.5;
                }
                else
                    speed = 0;


                return false;
            }
        });

        buttonUp.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if ((event.getAction() == MotionEvent.ACTION_MOVE)||(event.getActionMasked()!=MotionEvent.ACTION_UP))
                {
                    motorLeft = false;
                    motorRight = true;
                    speed = 1;
                }
                else
                    speed = 0;


                return false;
            }
        });


        buttonDown.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if ((event.getAction() == MotionEvent.ACTION_MOVE)||(event.getActionMasked()!=MotionEvent.ACTION_UP))
                {
                    motorLeft = true;
                    motorRight = false;
                    speed = (float)0.5;
                }
                else
                    speed = 0;


                return false;
            }
        });

    } // End onCreate

    private void enableUi(final boolean enable) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {

                toggleButtonLedSTAT.setEnabled(enable); // the toggleButton is disable
                toggleButtonLedSTAT.setChecked(enable); // switch on the toggleButton
                if (enable)
                    Toast.makeText(MainActivity.this, getString(R.string.IOIOConnected), Toast.LENGTH_LONG).show();
                else
                    Toast.makeText(MainActivity.this, getString(R.string.IOIODisconnected), Toast.LENGTH_LONG).show();

            }
        });
    } // End enableUi


    @Override
    protected IOIOLooper createIOIOLooper() {
        return new Looper();
    } // End IOIOLooper


    class Looper extends BaseIOIOLooper{

        // Declare PIN
        private DigitalOutput PinDO0; // LED STAT

        // Motor DC : Right
        private DigitalOutput PinDIO36; // L293D In 3
        private DigitalOutput PinDIO37; // L293D In 4
        private PwmOutput PinPWM38; // L293D Enable 2

        // Motor DC : Left
        private DigitalOutput PinDIO40; // L293D In 2
        private DigitalOutput PinDIO41; // L293D In 1
        private PwmOutput PinPWM39; // L293D Enable 1



        @Override
        protected void setup() throws ConnectionLostException, InterruptedException {
//            super.setup();
// Assign PIN
            // LED STAT
            PinDO0 = ioio_.openDigitalOutput(0, true);

            // Motor DC : Right
            PinDIO36 = ioio_.openDigitalOutput(36);
            PinDIO37 = ioio_.openDigitalOutput(37);
            PinPWM38 = ioio_.openPwmOutput(38,100);


            // Motor DC : Left
            PinDIO40 = ioio_.openDigitalOutput(40);
            PinDIO41 = ioio_.openDigitalOutput(41);
            PinPWM39 = ioio_.openPwmOutput(39,100);


            enableUi(true); // Start IOIO
        } // End setup

        @Override
        public void loop() throws ConnectionLostException, InterruptedException {
//            super.loop();


            PinDO0.write(!toggleButtonLedSTAT.isChecked());


                PinPWM39.setDutyCycle(speed);
                PinDIO41.write(motorLeft);
                PinDIO40.write(!motorLeft);

                PinPWM38.setDutyCycle(speed);
                PinDIO37.write(motorRight);
                PinDIO36.write(!motorRight);



            try {
                Thread.sleep(10);
            } catch (InterruptedException e)
            {
                e.printStackTrace();
            }

        } // End Loop



        @Override
        public void disconnected() {
//            super.disconnected();
            enableUi(false);
            toggleButtonLedSTAT.setEnabled(false); // the toggleButton is disable
            toggleButtonLedSTAT.setChecked(false); // switch off the toggleButton
            Toast.makeText(MainActivity.this,getString(R.string.IOIODisconnected),Toast.LENGTH_LONG).show();

        } // End disconnected
    } //End Looper


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    } // End onCreateOptionsMenu

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    } // End onOptionsItemSelected
}

 
 La vidéo :

 


 

 
IMG_20150311_232357.jpgIMG_20150311_232513.jpg

Image(s) jointe(s)

  • AilgorRC T0.2_platine_1.jpg

Robot de téléprésence : IOIO-OTG Robot WebRTC 

Car RC : AilgorRC


#2 Melmet

Melmet

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 143 messages
  • Gender:Male
  • Location:Saint-Sozy (46200)

Posté 19 mars 2015 - 04:18

pas trop mal, ça manque de détails par contre.

moi j'aurais raccourci les tiges fileter (risques de basculement et esthétique)!

j'attend la suite  :thank_you:


Ne demande jamais à un robot de faire ce que tu peux faire toi même. :nono: :laugh1:


#3 ailgorbot

ailgorbot

    Membre occasionnel

  • Membres
  • Pip
  • 107 messages
  • Gender:Male
  • Interests:IOIO

Posté 19 mars 2015 - 05:13

J'ajouterai également une vidéo du robot en mouvement, et des photos supplémentaires.
 
Les tiges filetées, je pense les garder car je voudrai lui adjoindre un poncho noir comme le personnage d'Igor dans Frankenstein Junior.
Effectivement il y a un risque de bascule, surtout si je lui adjoint sa tête composée d'un téléphone GalaxyS et de sa tourelle PAN/TIL. Le centrage de l'ensemble se situera plus près de la roue libre (avant). 
 
Les prochaines étapes sont :
  • de le contrôler par WIFI (du GalaxyS implanté sur sa tourelle) et non par le bluetooth natif de IOIO-OTG
  • de transmettre la vidéo d'un téléphone à l'autre
Bref ça :
 
Une fois la partie Car RC+wifi+vidéo terminée, il y a encore le reste... j'en parle ici : http://www.robot-maker.com/forum/topic/9826-ailgor-bot/

Robot de téléprésence : IOIO-OTG Robot WebRTC 

Car RC : AilgorRC


#4 ailgorbot

ailgorbot

    Membre occasionnel

  • Membres
  • Pip
  • 107 messages
  • Gender:Male
  • Interests:IOIO

Posté 12 mai 2015 - 10:43

Ah enfin !!!

Après avoir galéré sur le code Java, je suis en mesure 

  • de transmettre la vidéo d'un téléphone à l'autre
  • d'utiliser IOIOService au lieu IOIOActivity
  • de mettre en oeuvre des échanges Client/Serveur Wifi entre les Androids (pour transmettre les commandes, et recevoir des information des capteurs)

En somme j'ai tous les éléments pour construire la Car RC+wifi+vidéo


Robot de téléprésence : IOIO-OTG Robot WebRTC 

Car RC : AilgorRC


#5 ailgorbot

ailgorbot

    Membre occasionnel

  • Membres
  • Pip
  • 107 messages
  • Gender:Male
  • Interests:IOIO

Posté 14 mai 2015 - 10:15

Une petite vidéo sur la communication entre les 2 Androids par wifi.
L'un transmet par WIFI l'ordre de faire clignoter la Led IOIO à l'autre Android qui transmet l'ordre par Bluetooth à la carte IOIO-OTG.
 

 
En fait la partie applicative est complètement opérationnelle, mais j'ai le soucis décrit dans ce post :  http://www.robot-maker.com/forum/topic/9907-est-ce-le-l293d-2-moteurs-dc-6v/

Robot de téléprésence : IOIO-OTG Robot WebRTC 

Car RC : AilgorRC


#6 ailgorbot

ailgorbot

    Membre occasionnel

  • Membres
  • Pip
  • 107 messages
  • Gender:Male
  • Interests:IOIO

Posté 21 mai 2015 - 09:24

Mise à part la gestion de la tourelle, il est opérationnel sur les points suivants :
- l'Android sur la voiture transmet les ordres sur la carte IOIO-OTG
- l'Android sur la voiture transmet les images de sa camera par wifi
- l'Android télécommande reçoit les images de la voiture
- l'Android télécommande transmet les ordres à l'Android sur la voiture.
 
 

 
 
Mais avant de passer à autres aspects du robot, je vais devoir :
- le rendre plus léger. il y a trop de visserie lourdes
- l’aplatir, il a une tendance à basculer avec sa hauteur et le téléphone positionné en hauteur.

Robot de téléprésence : IOIO-OTG Robot WebRTC 

Car RC : AilgorRC


#7 ailgorbot

ailgorbot

    Membre occasionnel

  • Membres
  • Pip
  • 107 messages
  • Gender:Male
  • Interests:IOIO

Posté 24 mai 2015 - 10:43

IMG_20150524_215851%255B1%255D.jpg

 

 

Voilà pour le code :

L'Android connecté au IOIO-OTG : https://github.com/a...rbot/AilgorIOIO

L'Android télécommande : https://github.com/a...ot/AilgorRemote

 

Le code ne comporte pas encore la gestion du servomoteur pour le pivotement de la tête.


Robot de téléprésence : IOIO-OTG Robot WebRTC 

Car RC : AilgorRC


#8 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 8 191 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 25 mai 2015 - 03:46

Par curiosité : tu as quoi comme temps de latence au niveau de la vidéo ? et tu as quoi comme portée max ?
Bonne continuation pour la suite en tout cas ! ;) 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 

 

Les réalisations de Mike118  

 

 

 


#9 ailgorbot

ailgorbot

    Membre occasionnel

  • Membres
  • Pip
  • 107 messages
  • Gender:Male
  • Interests:IOIO

Posté 25 mai 2015 - 08:23

Il y a plusieurs paramètres à prendre en compte pour la latence de la vidéo.

- Mon pauvre Galaxy S est un peu lent pour traiter les mjeg qu'il diffuse. L'OS 4.4.2 est probablement trop lourd pour ce téléphone et ses 512Mb, vendu à l'origine avec une version 2.2.

- Mon réseau Free a très peu de bande passante. Pour avoir quelque chose de fluide je diffuse une image de 320x200

C'est principalement au démarrage que j'ai une latence perceptible d'1 à 2 secondes. Ensuite l'image est fluide. Elle est diffusée sur le port 8080, alors que les commandes sont reçues sur le port 8090.

 

Pour la portée, elle se limite à ma maison, puisque c'est du WIFI. Mais si tu regardes la vidéo du post #3, le gars utilise le réseau de sa boîte...

La prochaine étape sera d'ouvrir 2 ports sur la Freebox reliés aux port 8080 et 8090 du Galaxy S. Ainsi avec 4G de mon téléphone, je me connecterai à distance.   

 

Mais je t'avoue que l'idéal aurait-été, d'utiliser Skype, mais son API n'est plus supportée. Et pour Hangout, je suis en train de regarder, même si leur test "Hello world" ne fonctionne pas pour l'instant. 


Robot de téléprésence : IOIO-OTG Robot WebRTC 

Car RC : AilgorRC


#10 ailgorbot

ailgorbot

    Membre occasionnel

  • Membres
  • Pip
  • 107 messages
  • Gender:Male
  • Interests:IOIO

Posté 26 mai 2015 - 12:18

Bon la vidéo avec Hangout, j'ai beau essayé ça plante encore avec leur exemple pour débutant...

 

Mais je vais essayer une autre méthode plus fluide. WebRTC

Il y a plein de site qui propose d'utiliser leurs serveurs pour faire la jonction

 

exemple : https://opentokrtc.com/


Robot de téléprésence : IOIO-OTG Robot WebRTC 

Car RC : AilgorRC


#11 microrupteurman2

microrupteurman2

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 2 040 messages
  • Gender:Male
  • Location:33
  • Interests:Tout

Posté 26 mai 2015 - 12:25

Salut, petite question, Ca marche bien le rechargement solaire ?


 
 
 

#12 ailgorbot

ailgorbot

    Membre occasionnel

  • Membres
  • Pip
  • 107 messages
  • Gender:Male
  • Interests:IOIO

Posté 26 mai 2015 - 03:43

L'objectif est qu'il se dore la pilule la journée et qu'il fonctionne au moins 20 à 30 minutes le soir.

Je t'avoue que je n'ai pas encore essayé de le décharger et de le recharger avec les cellules uniquement.


Robot de téléprésence : IOIO-OTG Robot WebRTC 

Car RC : AilgorRC




Répondre à ce sujet



  



Aussi étiqueté avec au moins un de ces mots-clés : IOIO, L293D

0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users