dimanche 26 août 2012

Cours en ligne: Artificial Intelligence (CS373), Programming A Robotic Car


Je suis à peu près à mi-chemin dans ce cours en ligne offert par Udacity:  Artificial Intelligence (CS373)Programming A Robotic Car.  Offert par le Profresseur Sebastian Thrun, leader de l'équipe Standford/Google qui travaille à la mise au point d'une automobile capable de conduire toute seule, sans la moindre intervention humaine.

Ce cours s'intéresse aux algorithmes permettant à un robot de se situer dans l'espace, d'éviter les obstacles et de trouver son chemin dans un labyrinthe jusqu'à une destination imposée.

Comme c'est maintenant le cas pour tous les cours offerts par Udacity, vous pouvez vous inscrire au cours à n'importe quel moment et le compléter à votre rythme.  Mes connaissances dans le domaines étant nulles, j'y apprend beaucoup de choses:  c'est vraiment intéressant!  Je regrette un peu, toutefois, que l'examen final soit aussi ridiculement facile:  accessible dès le début du cours, il comporte un trop grand nombre de questions à choix de réponses auxquelles n'importe qui peut répondre avec succès en essayant toutes les combinaisons possibles (puisque le nombre de tentatives pour répondre à la question n'est aucunement limité!).


Préalables:  Comprendre l'anglais, savoir un peu programmer en langage Python, connaître quelques notions de base en calcul de probabilités et en algèbre linéaire (vecteurs et matrices).  Si comme moi vous êtes un néophyte en langage Python, je vous conseille de suivre d'abord le cours  Intro to Computer Science: Building a Search Engine (CS101) , également offert pas Udacity.  Si vous n'avez jamais suivi de cours de probabilités, le cours Intro to Statistics (ST101)Making Decisions Based on Data constitue également un préalable logique.

Pour plus d'informations (ou pour vous inscrire):  Artificial Intelligence (CS373)Programming A Robotic Car.

Ci-dessous la présentation du cours, sur vidéo.



P.S.:  Si vous avez manqué la première cohorte du cours 6.002x: Circuits and Electronics offert par MITx dont j'ai déjà parlé ici et ici, veuillez noter qu'il démarre à nouveau dans quelques jours, soit le 5 septembre.

Yves Pelletier (Twitter: @ElectroAmateur)

samedi 25 août 2012

Un multimètre de pacotille

J'achète beaucoup de matériel sur eBay, auprès de vendeurs asiatiques.  Les prix sont imbattables, et je suis généralement satisfait de la qualité... mais pas cette fois-ci!

J'ai commandé un multimètre de poche Victor VC921.  Pour $15, je ne m'attendais pas à un appareil de haut calibre, mais je cherchais quelque chose d'économique qui puisse mesurer des fréquences, et l'idée de disposer d'un deuxième multimètre (pouvant facilement être transporté dans une poche, en plus) était séduisante.

Mais lorsque j'ai reçu le multimètre, j'ai dû me rendre à l'évidence:  il ne fonctionne pas du tout:  aucun chiffre n'apparaît sur l'écran LCD.  De plus, lorsqu'on le met en mode "test de continuité", il produit un "beep" peu importe que les sondes se touchent ou non...

Bien entendu, des piles sont présentes dans l'appareil, et elles sont parfaitement fonctionnelles.



Jetons un petit coup d'oeil à l'intérieur; le boîtier s'ouvre facilement, sans qu'il soit nécessaire de dévisser quoi que ce soit.


Ha, c'est un peu peu brouillon, comme soudure, ça.  C'est normal que deux des broches d'un même transistor soient soudées ensemble?


En retournant le circuit imprimé, je constate qu'il n'y a aucun contact électrique entre l'afficheur à cristaux liquides et le reste du circuit, qui sont séparés l'un de l'autre par un carré de mousse isolante.  Pas étonnant que rien ne s'affiche à l'écran!  Je m'attendait à une liaison par l'entremise d'un ruban conducteur mais non.


Dans les jours qui ont suivi la transaction, le vendeur a été expulsé d'eBay.  Je suppose que le remboursement (suite à une plainte officielle auprès de Paypal) sera une formalité.

Mise à jour  (8 septembre 2012):
Paypal a effectivement décidé que je mérite un remboursement...à la condition de retourner le multimètre en Chine par une méthode permettant d'en faire le suivi en ligne.  Pour obtenir un remboursement, il faudrait donc que je paie beaucoup plus cher que le prix payé au départ! (Et puisque le vendeur a été évincé d'eBay, je ne peux même pas lui écrire un feedback négatif...)

Yves Pelletier (Twitter: @ElectroAmateur)

mercredi 22 août 2012

Fabrication d'un module MIDI (IN et OUT) pour Arduino

J'ai finalement mis la main sur quelques octocoupleurs 4N35 afin d'expérimenter le "MIDI input", c'est à dire l'entrée de signaux MIDI dans l'Arduino (il était temps:  ça fait plus d'un an que je sais faire du "MIDI output")!

Voici donc le schéma d'un circuit qui a bien fonctionné pour moi.  Certaines personnes ont plus de succès avec une résistance plus petite à la sortie de l'octocoupleur (ce qui n'était pas mon cas), d'autres utilisent une résistance plus élevée (ce que j'aurais pu faire:  ça continuait de fonctionner quand même).

Ma seule perte de temps se situait au niveau logiciel (mais je croyais que c'était un problème de circuit, d'où la perte de temps...).  Lorsqu'on effectue une recherche des mots clés "Arduino MIDI in" dans Google, le premier résultat est une vieille discussion du forum Arduino datant de 2007.  D'une part le schéma du circuit qui y est présenté est un peu controversé (avec cette résistance de 100 kΩ à la broche 6 de l'octocoupleur, que la plupart des gens trouvent inutile), mais surtout le sketch qui y est proposé ne tient pas compte des "running status", une caractéristique du protocole MIDI que je ne connaissais pas.


En principe, chaque fois que vous appuyez sur une touche d'un clavier MIDI, celui-ci émet un message "Note On" constitué de 3 bytes:  l'identification de la commande "Note On", suivie du numéro de la note jouée et de sa vélocité.  Supposons maintenant que vous appuyez sur plusieurs notes consécutives assez rapidement (bref:  vous jouez de la musique):  pour ne pas surcharger la bande passante, la norme MIDI permet aux instruments d'envoyer un seul byte "Note On" suivi de plusieurs numéros de notes / vélocité.  À l'autre bout, l'instrument qui reçoit les messages est responsable d'interpréter ça comme une succession de plusieurs notes.

Mais voilà:  le sketch que j'utilisais pour vérifier l'arrivée de messages MIDI prenait pour acquis que toutes les notes jouées étaient précédées d'un byte "Note On", ce qui n'était pas le cas.  Une LED supposée s'allumer chaque fois que j'appuyais sur une touche ne s'allumait qu'à la condition que je laisse une bonne dizaine de secondes s'écouler avant l'exécution d'une nouvelle note...

La solution:  la bibliothèque MIDI, que je ne m'étais jamais donné la peine d'utiliser pour faire du "MIDI OUT", mais qui se révèle drôlement utile pour faire du "MIDI IN".  Un sketch très simple trouvé ici allume une LED chaque fois que j'appuie sur une touche du clavier.  La LED s'éteint aussitôt que je relâche la note.

J'en ai profité pour bricoler sur une carte perforée un module comportant à la fois une entrée et une sortie MIDI, qu'il ne reste plus qu'à brancher à l'Arduino:  quelque chose d'à peu près équivalent au "MIDI shield" de Sparkfun, mais pour une minuscule fraction du prix (surtout que les deux jacks MIDI ont été récupérés sur une interface MIDI "MacMan" désuète, je dirais que ça m'a coûté environ 5% de ce que demande Sparkfun).
Je n'ai plus tellement tendance à produire mes propres shields empilables, préférant des cartes qui se branchent à l'Arduino au moyen de quelques fils.  Les avantages que j'y vois: beaucoup moins de soudures lors de la fabrication, et plus de flexibilité lors de l'utilisation (on peu plus facilement modifier l'endroit où les fils se branchent sur l'Arduino, remplacer l'Arduino par un Launchpad, etc.).

Puisque la librairie MIDI, par défaut, transmet à la sortie de l'Arduino tous les messages reçu à l'entrée (MIDI THROUGH) j'ai rapidement pu vérifier que l'Arduino retransmettait efficacement (et sans délai de latence perceptible) la totalité des messages MIDI reçus (pour les tests, ces messages étaient relayés au logiciel MIDI-Ox par l'entremise d'une interface MIDI-USB.

À partir d'ici, la création commence:  l'Arduino pourra dorénavant modifier les messages reçus avant de les retransmettre...

Yves Pelletier (Twitter: @ElectroAmateur)

lundi 13 août 2012

Importante mise à jour d'Energia

Avec la version 0101E0008 du logiciel Energia (disponible ici depuis quelques jours), la compatibilité du MSP Launchpad  avec nos sketches Arduino s'est encore améliorée.

Un aperçu des nouveautés de cette version (dont la liste exhaustive se trouve ici):   on a ajouté les librairies  "Liquid Cristal", "Servo" et "Stepper", "Internal Flash Read/Write", ainsi que les fonctions randomSeed() , random(),  micros(), tone(), noTone().  De plus, le bug qui empêchait de dépasser 50% du "duty cycle" en PWM a été réparé.

Yves Pelletier (Twitter: @ElectroAmateur)

samedi 11 août 2012

MIDI sans fil (Arduino)

Pendant un de vos légendaires solos de keytar endiablés, vous faites un faux mouvement et...zut, l'ordinateur portable hébergeant vos soft synths se fracasse par terre...  C'est vrai que le câble MIDI d'un mètre de longueur entre le contrôleur MIDI et l'ordinateur ne permetait une très grande liberté de mouvement...

La solution?  Le MIDI sans fil!


Matériel:

2 Arduinos (Uno, par exemple), 2 modules radiofréquence NRF24L01, un connecteur MIDI femelle (DIN-5), une résistance de 220 Ω, câble MIDI et clavier MIDI qui recevra les messages MIDI (ou si vous préférez:  interface MIDI-USB et ordinateur doté d'un logiciel MIDI).

Les branchements:

Les modules NRF24l01 se branchent de la même façon que pour le véhicule téléguidé.   Quoi?  Vous n'avez pas lu ma rubrique concernant mon véhicule téléguidé!?!?  Alors voici comment on branche ces modules (c'est la même chose sur les deux Arduinos:  l'émetteur et le récepteur).


  • Pin GND du module rf  :  Pin GND de l'Arduino
  • Pin VCC du module rf:    Pin 3.3 V de l'Arduino
  • Pin CE du module rf:       Pin 9 de l'Arduino
  • Pin CSN du module rf:    Pin 10 de l'Arduino
  • Pin MOSI du module rf:  Pin 11 de l'Arduino
  • Pin MISO du module rf:  Pin 12 de l'Arduino
  • Pin SCK du module rf:    Pin 13 de l'Arduino
  • Pin IRQ du module rf:     On ne l'utilise jamais





Ensuite, vous branchez le connecteur MIDI femelle à l'Arduino qui agira comme récepteur (voir le schéma de branchement sur le site officiel arduino.cc).  Et vous reliez ça à un clavier MIDI par l'entremise d'un câble MIDI (branché dans l'entrée MIDI-in, bien sûr).

Les sketches:

Après avoir installé la librairie mirf (si vous ne l'aviez pas déjà), il ne vous reste plus qu'à installer les sketchs disponibles ci-dessous dans leur Arduino respectif.

Sketch de l'Arduino émetteur
Sketch de l'Arduino récepteur

Résultat:

Le clavier MIDI se met à jouer une succession d'arpèges (do-fa-do-sol), même s'il n'est pas directement relié à l'Arduino qui émet ces instructions.

Bien sûr, ce serait plus pratique si on pouvait brancher un instrument MIDI à l'Arduino émetteur, et ainsi acheminer notre propre musique jusqu'à l'Arduino récepteur...  Malheureusement, je ne dispose pour l'instant d'aucun optocoupleur qui me permettrait de faire un branchement "MIDI-in" dans l'Arduino émetteur (le plus frustrant, c'est que j'ai fait une grosse commande de matériel à Tayda la semaine dernière, et j'ai complètement oublié les optocoupleurs!).  Ce sera donc pour une autre fois...

Yves Pelletier (Twitter: @ElectroAmateur)

vendredi 10 août 2012

Envoi de messages MIDI par le MSP430 Launchpad

Dans cette rubrique, j'utilise le MSP430 Launchpad de Texas Instruments pour jouer le début de Für Elise (Beethoven) sur un clavier MIDI (pour émettre des messages MIDI avec un Arduino, voir ma rubrique de l'été dernier).

Le matériel:

Une carte MSP Launchpad (un investissement de $4.30, frais d'expéditions inclus!), un clavier MIDI, un câble MIDI, un connecteur MIDI femelle (DIN-5), résistances (220 Ω, 1 kΩ, 1,8 kΩ et 100 kΩ), un comparateur LM393 (ou solution équivalente pour élever à 5 volts le signal émis par le Launchpad), source de tension de 5 V.

Le circuit:

Tout d'abord il faut savoir que le launchpad émettra le signal MIDI par l'entremise de sa pin "P1.2".  Toutefois, ce signal numérique de 3,3 V est inférieur à la norme MIDI qui est de 5 V; il faut donc ajouter un étage d'amplification (le comparateur LM393). Ce signal est ensuite acheminé à la broche 4 du connecteur MIDI (un câble MIDI achemine ce signal jusqu'à l'entrée "MIDI-IN" du clavier).


J'ai utilisé un LM393 parce que j'en avais sous la main.  Il existe d'autres solutions possibles (un MOSFET, par exemple).


Le code:  

Puisque j'ai utilisé Energia pour programmer le Launchpad, il s'agit d'un simple sketch Arduino.



La seule partie un peu "intéressante" est la routine "noteOn", à la toute fin, qui envoie un message midi par l'entremise de la pin TX (P1.2) du Launchpad:


     void noteOn(int cmd, int pitch, int velocity) {
       Serial.write(cmd);
       Serial.write(pitch);
       Serial.write(velocity);
     }

(Tout comme la version 1.0 de l'environnement Arduino, Energia requiert la commande "Serial.write" plutôt que "Serial.print" lorsqu'on veut envoyer des bytes.)

Le reste du sketch consiste à envoyer à la routine "noteOn" les notes appropriées, au moment approprié.

Yves Pelletier (Twitter: @ElectroAmateur)

mardi 7 août 2012

Séquenceur programmable Arduino

Je me suis amusé à faire cette réplique de l'Arduino Punk Console conçu par Dano, auteur de l'excellent site Beavis Audio Research.

Il s'agit d'un séquenceur "8 steps":  vous faites mémorisez à l'Arduino 8 notes musicales, qu'il joue ensuite en boucle à une vitesse réglable. Tout comme le Weird Sound Generator de Music from Outer Space, je classerais ce bidule dans la catégorie "jouets musicaux" (ma fille de 4 ans l'a beaucoup apprécié).

Pour placer une première note en mémoire, vous tournez le potentiomètre "frequency" afin d'ajuster la fréquence à la valeur désirée, et vous appuyez sur le bouton "step 1" .  Vous tournez à nouveau le potentiomètre "frequency" pour changer la fréquence et, lorsqu'elle vous convient, vous appuyez sur le bouton "step 2" pour la mettre en mémoire.  Vous répétez l'opération jusqu'à ce que chacune des 8 notes ait été mémorisée.

Pour jouer le résultat, vous maintenez le bouton "Start/Stop" enfoncé, et vous tournez les potentiomètres "duration" (durée des notes) et "tempo" délai entre deux notes successives jusqu'à ce que le résultat vous plaise!


La page de Beavis Audio concernant ce projet étant déjà très complète, je vous invite à la consulter pour le schéma du circuit et le sketch.  Faites attention à une petite erreur sur le schéma:  la broche libre du potentiomètre "tempo" doit en fait être reliée à 5 V (sinon l'entrée analogique 1 de l'Arduino ne recevra jamais le moindre signal).

De plus, Dano a utilisé un type d'écran LCD spécialement conçu pour le communication série (ce qui économise les pins de l'Arduino).  Puisque je ne dispose pas de ce genre spécifique d'écran LCD (et qu'il n'y a plus assez de pins disponibles pour utiliser un écran LCD conventionnel), j'ai effacé du sketch tout ce qui concernait le LCD.

Toutefois, l'absence d'informations affichées rendait hasardeux l'ajustement des fréquences (on ne pouvait que tourner le potentiomètre à une position aléatoire, ce qui donnait des résultats imprévisibles...).  J'ai donc ajouté une modification supplémentaire au sketch:  pendant que le bouton "step 1" (par exemple) est enfoncé, la note est jouée par le haut-parleur et il est facile de la modifier à votre convenance au moyen du potentiomètre avant de relâcher le bouton.  De cette façon, les 8 notes peuvent être choisies "à l'oreille" (je suis ainsi parvenu à séquencer une gamme à peu près juste).

Voici mon sketch (version modifiée)


Yves Pelletier (Twitter: @ElectroAmateur)

lundi 6 août 2012

Fabrication d'une voiture téléguidée (Arduino)

Ce projet consiste à produire un véhicule/robot téléguidé au moyen du matériel suivant:  une base de robot de type "smart car" (chaque roue est munie de son propre moteur), 2 cartes Arduino, deux modules radiofréquence NRF24L01, un pilote de de moteur L293D et un joystick (de type Playstation).

En gros, il s'agissait d'améliorer mon précédent projet de véhicule contrôlé au moyen d'un joystick (janvier 2012) qui comportait un câble peu pratique entre le joystick et le véhicule (un peu comme si on promenait le véhicule en laisse...).

Puisque j'avais déjà un peu d'expérience avec les modules NRF24L01 (Arduino Télépathe, avril 2012), je m'attendais à un projet rapide et facile...  Ce que je n'avais pas prévu, c'est tout le temps perdu à cause d'un module NRF24L01 instable qui ne fonctionnait que de façon intermittente.

Nous disposons donc de deux cartes Arduino (j'ai utilisé des Duemilanove, mais c'est évidemment pareil pour le Uno), chacune étant munie d'un module NRF24L01.  Un premier Arduino émet les informations en provenance d'un joystick, le deuxième Arduino reçoit ces informations et les utilise pour contrôler les moteurs par l'entremise d'un circuit intégré L293D.

Branchement des modules rf

Les modules radiofréquence NRF24L01 sont des périphériques SPI (comme les modules pour carte SD, par exemple).  Les branchements sont identiques sur les deux cartes Arduino:

  • Pin GND du module rf  :  Pin GND de l'Arduino
  • Pin VCC du module rf:    Pin 3.3 V de l'Arduino
  • Pin CE du module rf:       Pin 9 de l'Arduino
  • Pin CSN du module rf:    Pin 10 de l'Arduino
  • Pin MOSI du module rf:  Pin 11 de l'Arduino
  • Pin MISO du module rf:  Pin 12 de l'Arduino
  • Pin SCK du module rf:    Pin 13 de l'Arduino
  • Pin IRQ du module rf:     On ne l'utilise jamais

Concernant l'alimentation, vous pourrez trouver un tas d'informations contradictoires sur le web:  certaines personnes affirment que le module sera instantanément détruit si on l'alimente avec 5 V, d'autres disent qu'il n'y a pas de problème puisque les modules sont munis d'un régulateur de tension.  Une chose est certaine, ça marche très bien avec 3.3 V.  Lors de mes premiers essais en avril, j'avais utilisé 5 V sans aucun problème (est-ce que c'est lié au fait que mes modules fonctionnaient mal quand je les ai réutilisés en juillet?).

Pour ceux qui tiennent à tout savoir:  MISO signifie "Master In Slave Out" (les données sont acheminées de l'Arduino vers le module rf), MOSI signifie "Master Out Slave In" (les données sont acheminées du module rf vers l'Arduino), SCK signifie "Serial Clock", CE signifie "Chip Enable" (ou parfois SS pour Slave Select; si plusieurs périphériques SPI sont branchés au même Arduino, cette broche vous permet de choisir le périphérique avec lequel l'Arduino dialogue), et CSN "Chip Select Negative" (?).

Je connais deux types de modules NRF24L01 (les deux sont vendus sur eBay à un prix dérisoire par des expéditeurs chinois):  un modèle vert à 10 pins et un modèle noir à 8 pins.  Sur le modèle vert, les pins sont identifiées, mais sur le noir elles ne le sont pas!  Le schéma ci-dessous vous sera peut-être utile.

Branchements du joystick sur l'Arduino émetteur

Un joystick n'est rien d'autre que deux potentiomètres:  un qui change de valeur lorsque le joystick est incliné selon l'axe des x, et un autre qui change de valeur lorsque le joystick est incliné selon l'axe des y.

Chacun des deux potentiomètres est utilisé en diviseur de tension entre les pins GND et 5 V de l'Arduino.  Le potentiomètre Y (qui permet d'avancer ou de reculer) achemine son signal à la pin analogique 0, et le potentiomètre X (qui permet de tourner à gauche ou à droite) achemine son signal à la pin analogique 1.

Branchements du circuits intégré L293D sur l'Arduino récepteur (sur le véhicule)

Le module rf occupait déjà les pins 9-10-11-12 de l'Arduino, le pilote de moteur L293D encombrera pour sa part les pins 3-4-5-6-7-8!

Voir les détails sur le schéma ci-contre.

Voici, finalement, les sketchs à télécharger dans chaque Arduino.  J'ai utilisé la librairie "mirf", qui exige que les données soient acheminées un byte à la fois (d'où la nécessité de convertir mes deux "int" en une suite de deux bytes, et de reconvertir les bytes en "int" à la réception).

L'affichage des données dans le moniteur série ne sert qu'aux fins de débogage.  Je suis conscient que ces sketchs pourraient être améliorés (par exemple, le véhicule pourrait se déplacer un peu plus rapidement en augmentant la valeur de la variable passée en paramètre à analogWrite) mais ça fonctionne!

Sketch de l'émetteur
Sketch du récepteur

Yves Pelletier (Twitter: @ElectroAmateur)
Related Posts Plugin for WordPress, Blogger...