vendredi 24 octobre 2014

Lire de la musique

Toujours dans le but de se libérer de l'interface graphique, un petit lecteur de musique en mode console : cmus
Voir l'article : http://la-vache-libre.org/cmus-un-lecteur-audio-en-mode-console-pour-gnulinux/#more-28595
Installation très simple : sudo apt-get install cmus
Ça marche nickel. N'oubliez pas de configurer votre sortie audio : hdmi ou jack.
Lisez cet article : http://www.framboise314.fr/ca-va-faire-du-bruit-chez-les-framboise314-comment-configurer-le-son-sur-le-raspberry-pi/

Emacs comme IDE python

J'ai décidé de n'utiliser l'interface graphique de Raspbian qu'en cas d'extrême nécessité. Je cherche donc à fonctionner en mode console uniquement. Ce qui permet également de travailler via ssh.
Première chose : choisir un éditeur de texte puissant. Après avoir testé vim et emacs, mon choix personnel s'est porté sur emacs. Dans un premier temps mettez sous vos yeux une liste des raccourcis clavier, je rappelle qu'il n'y a plus de souris. Ce qui bouleverse les habitudes de beaucoup.
Il faut alors le configurer pour qu'il se comporte comme un véritable IDE.
Je me suis inspiré de cet article : http://tech.novapost.fr/configurer-emacs-comme-un-developpeur-python.html
J'ai rapidement testé les outils de refactoring (ropemacs), je n'ai pas bien compris l'utilisation, je les ai donc laissés de côtés pour l'instant et j'y reviendrai peut-être plus tard. J'ai par contre trouvé l'outil d'auto-completion bien pratique (http://cx4a.org/software/auto-complete/) Je n'ai pas encore installer les outils de vérification de code mais je m'y mettrai sûrement plus tard si je continue sérieusement le développement python sur emacs.
Voici le fichier de configuration actuel nommé .emacs
; Enlever la barre de menu du haut                                           
(menu-bar-mode nil)
 ; Ajouter des numéros de lignes dans la marge gauche                        
(global-linum-mode t)
; Mettre un espace entre le numéro de ligne et le texte                     
(setq linum-format "%d ")
; Afficher l'heure en bas                                                   
(display-time-mode t)
; configuration de auto-complete                                            
(add-to-list 'load-path "~/.emacs.d/vendor/auto-complete")
(require 'auto-complete-config)
(add-to-list 'ac-dictionary-directories "~/.emacs.d/vendor/auto-complete/ac-dict")
(ac-config-default)


On peut ensuite tester son code sans quitter emacs avec la commande C-c C-c (deux fois control C). Si le buffer contenant l'interpréteur python ne s'affiche pas, divisez votre fenêtre en deux : avec C-x 2 pour une division horizontale ou C-x 3 pour une division verticale. Affichez alors la liste des buffers : C-x C-b, allez dans la fenêtre qui est apparue : C-x o et choisissez le buffer que vous voulez afficher qui doit s'appeler Python. Voilà.
Capture d'écran d'emacs comme IDE python tournant sur Raspberry pi via ssh.


mercredi 2 juillet 2014

serveur minimaliste en python

Voici en quelques lignes la création d'un serveur de page web en python permettant la commande de l'allumage d'une lampe. Côté matériel, le raspberry pi est connecté au module grovepi sur lequel est branché un module relais sur l'entrée n°7. Côté logiciel, on utilise le module flask en python.

Voici le code:

from flask import Flask, request
import grovepi
#configuration de la pin 7 en sortie
relay = 7
grovepi.pinMode(relay, "OUTPUT")
#instanciation de l'objet app, le paramètre __name__ vaut __main__
app = Flask(__name__)
#la fonction accueil est précédée de @app.route qui prend en paramètre la route par laquelle la fonction sera #accessible. On va détecter la méthode http utilisée (get ou post) lors de l'appel à cette page.
@app.route("/", methods=['GET', 'POST'])
def accueil():
    #définition du message à afficher sur le bouton
    message = ["Eteint", "Allume"]
    #lecture de l'état du relais
    d = grovepi.digitalRead(relay)
    if request.method == 'POST':
        #lors de l'appui sur le bouton on envoie une requête post, on inverse l'état de la lampe.
        grovepi.digitalWrite(relay, not d)
    else:
        #cela sert à afficher correctement le message du bouton lors du premier affichage
        d = not d
    #on renvoie un petit code html constitué d'un seul bouton dont le message varie en fonction de l'état de la       #lampe
    return '<form action="" method="post"><input type="submit" value={} /></form>'.format(message[d])
#on lance l'application en précisant l'adresse ip du raspberry et le port
if __name__=="__main__":
   app.run(host='192.168.1.10', port=5000, debug=True)



mercredi 21 mai 2014

Python, Twitter et GrovePi

J'ai récemment acquis une carte d'extension pour le raspberry pi appelée GrovePi, elle permet de brancher les extensions utilisant la connectique Grove sur le raspberry pi. Elle comporte également un microcontroleur identique à celui de l'arduino. Ce dernier communique avec le raspberry pi via le protocole i2c. On peut ainsi utiliser les instructions similaires à celles du langage c d'arduino dans un programme en python: pinMode, digitalRead, analogRead, etc.
Tout de suite une application inspirée du site de DexterIndustries utilisant les capacités du raspberry pi et des capteurs : envoyer un tweet automatique affichant la température à intervalles réguliers.
Il faut au préalable obtenir de twitter des codes d'authentification à entrer dans l'application:
Rendez vous sur le site https://apps.twitter.com/ et identifier vous avec votre compte twitter. Faites Create New App et renseignez les champs demandés. Vous verrez apparaître des codes : Api key et Api secret. Modifiez tout de suite la paramètre Access level en Read and write sinon vous ne pourrez pas poster de tweets. Il faut ensuite générer des access token pour votre appli, vous aurez notamment deux codes: Access token et Access token secret.
Il faut maintenant installer python-twitter, la procédure est décrite ici
Voici le code:

import twitter
import smbus
import time
import grovepi
import math

bus = smbus.SMBus(0)
address = 0x04

#identification twitter
api=twitter.Api(consumer_key='...',  #correspond à API key
                consumer_secret='...',       #correspond à API secret
                access_token_key='...',
                access_token_secret='...')

while(1):
    #A chaque heure on envoie un tweet
    if time.localtime().tm_min==0 and time.localtime().tm_sec==0:
        #Lecture de la température
        t = grovepi.temp(0)
       
        message="Salut, il est "+time.strftime("%H:%M.")+" La température est de %.2f°." %t

        #Envoi du tweet
        status=api.PostUpdate(message)

        #Message de confirmation
        print(message)
        
        #délai nécessaire pour que plusieurs tweets identiques ne soient pas envoyés
        time.sleep(1)


jeudi 8 mai 2014

Raspidrone

Une première version du projet de drone roulant à base de raspberry pi est finalisée. Les détails sont sur cette page web: http://raspidrone.weebly.com/



Atari STE + Raspberry Pi

J'ai réussi à recycler la coque de mon vieil Atari 520 STE de mon enfance grâce au raspberry pi et à l'arduino leonardo. Je voulais conserver le clavier d'origine et remplacer la carte mère par un raspberry pi. Bien sûr, il ne s'agit pas d'un clavier USB. Mais l'arduino leonardo peut se comporter comme un clavier USB, reste plus qu'à interpréter les signaux reçus du clavier par l'arduino qui va envoyer sur l'USB, le signal de la touche appuyée.
Plus facile à dire qu'à faire, c'est la raison pour laquelle je remercie grandement Kevin Peat, qui se trouve quelque part au Royaume-Uni je pense, d'avoir fait ce travail.
Le résultat est excellent et toutes les touches fonctionnent. Il y a toujours une nostalgie qui apparaît et un grand plaisir de revoir fonctionner l'ordinateur de mon enfance qui a plus de vingt ans.



dimanche 22 décembre 2013

Serveur node.js pour un projet domotique

Objectif : Créer un serveur simple à l'aide de node.js sur un raspberry pi qui permettra de commander l'allumage d'une lampe.
Côté matériel, le raspberry est équipé de la carte d'extension piFace qui comporte des relais.



Tout d'abord, quelques liens et tutos qui m'ont aidés à réaliser ce projet:
http://fr.openclassrooms.com/informatique/cours/des-applications-ultra-rapides-avec-node-js
http://nodejs.developpez.com/tutoriels/javascript/node-js-livre-debutant/
http://blog.rueedlinger.ch/2013/03/raspberry-pi-and-nodejs-basic-setup/
http://fr.openclassrooms.com/informatique/cours/des-applications-ultra-rapides-avec-node-js/socket-io-passez-au-temps-reel
https://npmjs.org/package/piface-node

code de l'application principale app.js:
var http = require('http');
var fs = require('fs');
var pfio = require('piface-node');

pfio.init();

// Chargement du fichier index.html affiché au client
var server = http.createServer(function(req, res) {
    fs.readFile('./index.html', 'utf-8', function(error, content) {
        res.writeHead(200, {"Content-Type": "text/html"});
        res.end(content);
    });
});

// Chargement de socket.io
var io = require('socket.io').listen(server, { log: false});

// Quand on client se connecte, on le note dans la console
io.sockets.on('connection', function (socket) {
    socket.emit('message', 'Vous êtes bien connecté !');
    socket.on('allume', function (message) {
      console.log('Allumer la lampe');
      pfio.digital_write(0, 1);
    });
    socket.on('eteint', function (message) {
      console.log('Eteindre la lampe');
      pfio.digital_write(0,0);
    });
});
server.listen(8080);

Code de index.html:
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>PiFace</title>
    </head>

    <body>
        <h1>Commande de la lampe</h1>

        <p><input type="button" value="Allumer" id="RelaisOn" /></p>
        <p><input type="button" value="Eteindre" id="RelaisOff" /></p>


        <script src="/socket.io/socket.io.js"></script>
        <script>
            var socket = io.connect('http://192.168.1.10:8080');
            socket.on('message', function(message) {
              alert('Le serveur a un message pour vous: ' + message);
            })
            var bouton1 = document.getElementById('RelaisOn');
            var bouton2 = document.getElementById('RelaisOff');
            bouton1.addEventListener('click', function() {
              socket.emit('allume', 'Allumer');
            }, false);
            bouton2.addEventListener('click', function() {
              socket.emit('eteint', 'Eteindre');
            }, false);
        </script>
    </body>
</html>