6135 links
  • GuiGui's Show
  • Home
  • Login
  • RSS Feed
  • ATOM Feed
  • Tag cloud
  • Picture wall
  • Daily
Links per page: 20 50 100
 
  • Piloter des moteurs d'instrumentalisation, avec des boîtiers Newport SMC100CC, dans un labo de biologie, sous GNU/Linux
    Dans un labo de recherche français, il y a du matos Newport SMC100CC pour piloter des moteurs avec le logiciel Micro-Manager (Java mais LGPL/BSD donc ça va :D). Notons que la version GNU/Linux compilée depuis les sources ne gère pas le boîtier Newport alors que la version winwin gère pour une raison encore non identifiée :/

    Le but étant de monter une plate-forme d'acquisition : images prises au microscope de cellules/embryon et des moteurs pour déplacer le sujet entre chaque prise.

    La caméra apposée au microscope, une Hamamatsu, n'a pas (encore ?) de pilote libre utilisable sous GNU/Linux donc c'est plié. En revanche, le Newport SMC100CC, boîtier d'interfaçage avec les moteurs, se pilote via un port série. La datasheet étant disponible en ligne (http://assets.newport.com/webDocuments-EN/images/SMC100CC_And_SMC100PP_User_Manual.pdf), on sait quelles commandes il faut passer pour communiquer avec les moteurs. \o/

    Ici nous  utilisons un convertisseur série<->USB d'où ttyUSB0 mais ça n'a pas d'importance. Pour savoir sur quel /dev/ttySxx le port série de votre ordinateur a été mappé par le noyau, voir : http://shaarli.guiguishow.info/?ciyU6w

    Évidemment, vous devez être root, ou, beaucoup plus propre, être membre du groupe dialout ou, beaucoup plus crade, chmod o+rw /dev/ttySx (ou ttyUSB0) pour lire/écrire sur le port série, comme d'hab.

    Avec Minicom, il faut penser à ajouter le caractère LF en plus de CR pour le retour à la ligne car c'est ce qu'attend le SMC100CC. Winwin style quoi. Pour ce faire : on entre dans le mode configuration de minicom (ctrl-a + z) -> « Ecran et clavier » -> p (« Add linefeed). On peut ensuite passer des commandes.

    Ensuite, on se fatigue en essayant et on se dit qu'écrire directement dans le device avec echo, ça a la classe. Allons-y.

    On a un seul boîtier SMC100CC (ID = 1), on l'initialise (OR), on se déplace à la position 42.0 (PA42.0, le paramètre est un double), on revient à la position 0 (PA0.0), puis on reset le boîtier (RS).
    echo -e '\r\n\r\n1OR\r\n\r\n' > /dev/ttyUSB0 (moins lisible, en héxa : echo -e '\x0d\x0a1OR\x0d\x0a\x0d\x0a')
    sleep 1
    echo -e '\r\n1PA42.0\r\n\r\n' > /dev/ttyUSB0
    sleep 5
    echo -e '\r\n1PA0.0\r\n\r\n' > /dev/ttyUSB0
    sleep 5
    echo -e '\r\n1RS\r\n\r\n' > /dev/ttyUSB0

    Notons que lors d'une initialisation (OR), le moteur revient à sa position initiale (0) mais comme le temps dépend du déplacement à faire (sisi, sans blague), il vaut mieux revenir à la position d'origine avant de reset dans le but que l'initialisation se fasse en un temps fini, sans surprise.
     

    Ces boîtiers peuvent être chaînés pour piloter plusieurs moteurs en même temps. Un boîtier qui reçoit des instructions par le port série a toujours un ID = 1 !

    Dans un premier temps, il faut indiquer son ID à chaque boîtier. Pour cela, il faut le relier en série à l'ordinateur et positionner le jumper sur « first ». On initialise (OR), on change son ID pour 2 (SA2), et on reset (RS). Le boîtier se souviendra de son ID tout le temps à partir de maintenant, même en cas de reset, reboot électrique ou autre.
    echo -e '\r\n\r\n1OR\r\n\r\n' > /dev/ttyUSB0
    sleep 1
    echo -e '\r\n1SA2\r\n\r\n' > /dev/ttyUSB0
    sleep 1
    echo -e '\r\n1RS\r\n\r\n' > /dev/ttyUSB0

    Pareil pour le deuxième boîtier :
    echo -e '\r\n\r\n1OR\r\n\r\n' > /dev/ttyUSB0
    sleep 1
    echo -e '\r\n1SA3\r\n\r\n' > /dev/ttyUSB0
    sleep 1
    echo -e '\r\n1RS\r\n\r\n' > /dev/ttyUSB0


    Maintenant, on stacke les boîtiers, on positionne les jumper (« first » sur le boîtier qui recevra la connexion série, « other » sur le boîtier d'ID = 2 et « last » sur le dernier boîtier de la chaîne. On peut maintenant les initialiser :
    echo -e '\r\n\r\n1OR\r\n\r\n' > /dev/ttyUSB0
    sleep 1
    echo -e '\r\n\r\n2OR\r\n\r\n' > /dev/ttyUSB0
    sleep 1
    echo -e '\r\n\r\n3OR\r\n\r\n' > /dev/ttyUSB0
    sleep 1

    Maintenant, on peut s'amuser (on déplace le moteur du premier boîtier en 42, celui du 2e en 12, ...) :
    echo -e '\r\n1PA42.0\r\n\r\n' > /dev/ttyUSB0
    echo -e '\r\n2PA12.0\r\n\r\n' > /dev/ttyUSB0
    echo -e '\r\n3PA6.0\r\n\r\n' > /dev/ttyUSB0

    Toutes les commandes que l'on utilisait avec un seul boîtier sont disponibles, il suffit de simplement de changer l'ID du boîtier auquel on s'adresse.


    Pour le fun :D :
    for ((i=0; i<43;i=i++)); do
      echo -e "\r\n\r\n1PA$i\r\n\r\n" > /dev/ttyUSB0
      echo -e "\r\n\r\n2PA$i\r\n\r\n" > /dev/ttyUSB0
      echo -e "\r\n\r\n3PA$i\r\n\r\n" > /dev/ttyUSB0
      sleep 5
    done

    On va par palier de 1 car certains moteurs sont assez sensibles.


    Pour changer un numéro d'ID. On initialise, on entre dans le mode configuration (PW1), on change l'ID pour x (SAx), on quitte le mode configuration (PW0) et on reset (RS) :
    echo -e '\r\n\r\n1OR\r\n\r\n' > /dev/ttyUSB0
    sleep 1
    echo -e '\r\n\r\n1PW1\r\n\r\n' > /dev/ttyUSB0
    sleep 1
    echo -e '\r\n\r\n1SA3\r\n\r\n' > /dev/ttyUSB0
    sleep 1
    echo -e '\r\n\r\n1PW0\r\n\r\n' > /dev/ttyUSB0
    sleep 1
    echo -e '\r\n\r\n1RS\r\n\r\n' > /dev/ttyUSB0
    sleep 1

    Maintenant, il ne manque plus qu'une interface plus pratique pour les utilisateur qui écrira sur le port série de cette manière mais on a au moins compris le fond des choses et le fonctionnement de ces boîtiers. \o/
    October 17, 2014 at 6:15:49 PM UTC - permalink - http://shaarli.guiguishow.info/?u8g4KQ
Links per page: 20 50 100
 
Mentions légales identiques à celles de mon blog | CC BY-SA 3.0

Shaarli - The personal, minimalist, super fast, database-free, bookmarking service by the Shaarli community