Canalblog
Suivre ce blog Administration + Créer mon blog

Atelier code

2 novembre 2015

Pilotage de robot : le module de puissance pour un raspberryPi

 

Bonsoir à tous

 

Je reprends ce blog au moins ce soir pour transmettre quelques informations complémentaires à mon Tweet de ce weekend sur mon premier robot un peu autonome.

 

Mon projet est à terme de faire un robot assez autonome mélange de Jarvis et de D2R2 mais comme il faut commencer plus simplement j'ai jeté mon dévolu sur une carte raspberry. J'ai d'autres essais sur une arduino et un gadgeteer que je pourrai raconter une autre fois mais je trouve que la raspberry est finalement ma préférée.

platines

Bref suivant l'inspiration et quelques tutoriels j'ai assemblé :

  • Un rover DAGU (car mon rover initial en mecano n'a pas supporté le poids) qui a sa propre alimentation (6 piles de 1,5V) acheté chez Selectronic,
  • Un raspberry (acheté chez Selectronic aussi),
  • Une alimentation autonome (un chargeur de téléphone acheté à Boulanger),
  • Une carte relai 8 canaux acheté chez Eyrolles (au sous-sol côté informatique),
  • Une télécommande WII,
  • Une platine prototype et des tonnes de fil.

A gauche une photo que j'avais pris chez Eyrolles pour vous donner une petite idée des platines.

 Un truc important car on m'a posé la question est que chaque contacteur est à priori indépendant et que c'est un deux position. Une entrée et 2 sorties si on veut (pfiou j'ai tout oublié en terme de "notation" électronique). Bref vous pouvez l'avoir en mode fermé ou ouvert au repos. 

Ce que j'ai bien aimé c'est que comme les relais sont indépendants vous pouvez y brancher du 220V  (si vous souhaitez contrôler toutes les lampes chez vous par exemple !!!

 

rover-web

Bref un dernier petit mot pour vous montrer le résultat.

Comme vous le constaterez on est encore loin du D2R2 et j'ai même eu l'indécence ou la flemme de ne piloter les 4 moteurs qu'avec 2 de mes relais mais ça à bien amusé.

Ma prochaine étape sera déjà de faire une berceau plus sympa et d'acheter une plaque de bakélite pour essayer au moins de faire un système de branchement un peu propre.

 

A oui un dernier tuyau pour le branchement du raspberry.

Voici un lien par exemple mais le plus important est de faire une recherche sur votre version du raspberry. Le branchement sur la carte est simple ensuite : Le plus, le moins et 8 entrées à piloter.

 

Un premier billet de retour un peu brouillon mais avec des infos intéressantes je l'espère. Sinon n'hésitez pas à commenter ou à me twitter (@nekogeekaku)

Dernière note : Si vous cherchez d'autres types de contrôleur j'ai fait pas mal de recherches que je pourrai condenser dans un billet.

Publicité
Publicité
13 avril 2012

Mise à jour d'un controleur de tableau par code (NSArrayController)

Bonjour,

En ce moment, pour parfaire ma connaissance de Cocoa sur MAC, je m'amuse à écrire un outil pour aider les MJ (maitres de jeu) car s'il y a pléthore de logiciels de ce type sur PC ce n'est pas forcément le cas sous MAC.

Pour commencer tranquille j'ai écrit un petit gestionnaire d'initiative (on prend une liste de "combattants" et on génére un nombre entre 1 et 20 puis on classe le tout).

Capture d’écran 2012-04-13 à 15Ca donne ce que vous voyez dans la copie ci-contre.

Pour ce faire en cocoa on travaille avec 2 objets:

  • le tableau (NSTableView)
  • un controleur de données (le NSArrayController)

Avec quelques manips rapide et très peu de code (et le chapitre 8 de la programmation cocoa), on arrive rapidement à un résultat mais il manque le tri après le calcul.

Bien sur on peut se contenter de cliquer sur la colonne "initiative calculée" qui fera le travail pour vous mais ça fait un clic de plus qu'un MJ débordé aura du mal à faire :-)

J'ai donc voulu faire le travail en background en faisant le travail par code.

Il suffit d'écrire une fonction de tri façon lambda expression sur C# et ça donne ce genre de choses:

    NSArray  *sortedArray;
    NSComparisonResult (^sortBlock)(id, id) = ^(id obj1, id obj2) 
    {
        Combattant *first = (Combattant*)obj1;
        Combattant *second = (Combattant*)obj2;
        if (first.initiative > second.initiative) {
            return (NSComparisonResult)NSOrderedAscending;
        } else if (first.initiative < second.initiative) {
            return (NSComparisonResult)NSOrderedDescending;
        }                
        return (NSComparisonResult)NSOrderedSame;
    }; 
    sortedArray = [combattants sortedArrayUsingComparator:sortBlock];    

Mais une fois que l'on met à jour le tableau rien ne se passe sur l'écran (alors qu'un NSLog me prouve que ça marche)....

.. quelques recherches plus tard .....

J'ai découvert qu'il fallait prévenir le(s) controleur(s) de ce changement. Cela se fait assez simplement de la manière suivante:

    [self willChangeValueForKey:@"combattants"];//on prévient les controleurs du changement à venir
    [a retain];
    [combattants release];
    combattants = a;
    [self didChangeValueForKey:@"combattants"];//on prévient les controleurs que le changement est fait

Au final 2 petites lignes de code très précieuses. L'autre gros avantage de cette méthode est que tous les controlleurs se rattachant au tableau (si vous avez plusieurs fenêtre) pourront se mettre à jour ensemble.

A très bientôt dans l'atelier.

 

6 avril 2012

Drag and drop sur un icone d'application winform

Bonjour,

Ce n'est pas l'article d'introduction que j'avais prévu pour commencer ce blog (je n'ai pas fini de l'écrire), mais j'ai trouvé ce sujet suffisament intéressant pour vous en parler sans attendre.

Je voulais créer une petite application du genre suivant:

  • on a l'icône d'une application sur le bureau,
  • On drag/drop un fichier dessus
  • l'appli se lance et fait une action.

Ca rappellera à tous le monde le comportement de la corbeille sous windows. La seule spécificité ici est que l'action implique l'affiche d'une petite winform (pour ajouter un choix).

En utilisant mon ami google, je ne trouvait que des explications concernant des applications console et qui donnent généralement le code suivant:

class Program
{
    static void Main(string[] args)   
    {
        //args[0] contient le nom de l'exécutable avec son chemin   
        //args[1] contient le nom du fichier droppé   
    }
}

Intéressant me direz vous mais voila dans un winform vous avez plutôt:

    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }

Assez ennuyeux pour appeler les arg. Heureusement à force de requêtes j'ai trouvé la solution ici.

Ce qui va donner le code suivant:

string[] args = Environment.GetCommandLineArgs();
 
foreach (string arg in args)
{
//balaie l'ensemble des arguemnts
}

 Ce que j'ai traduit dans mon cas de la façon suivante:

if (args.Count() >= 2)
   ChargeLeFichier(args[1]);

 Une solution toute simple mais toujours difficile à trouver.

A bientôt (avec une introduction j'espère :-p )

Publicité
Publicité
Atelier code
  • Développeur dotnet dans ma vie quotidienne je suis un touche à tout : iPhone, Raspberry, robotique, développement de jeux vidéos, design. J’ai décidé de partager mes aventures dans le code avec vous et j'espère que vous y prendrez autant plaisir que moi.
  • Accueil du blog
  • Créer un blog avec CanalBlog
Publicité
Archives
Publicité