PiSqueeze

image principale PiSqueeze

Difficulté:

Une squeezeBox en carton a base de Raspberry pi


J’ai une radio squeezebox de logitech et j’en suis vraiment très content. Malheureusement Logitech a stoppé la commercialisation de ce superbe systeme audio multiroom.
Plus d’informations au sujet de squeezebox : http://www.mysqueezebox.com/
Je cherchais une solution pour pouvoir diffuser de la musique dans une autre pièce, toujours à partir de squeezebox malgré l’arrêt de la commercialisation des produits.
La solution choisie : fabriquer ma propre radio tout seul, comme un grand!


Avec les fonctions suivantes :
– Boutons stop/start, play/pause, piste suivante
– Ecran 4 lignes retro éclairé pour
– affichage du morceau joué
– affichage du menu
– 6 boutons presets (des web radio, random sur sa bibliothèque, …) paramètrable via interface squeezebox serveur
– boutons rotatif pour navigation dans le menu
– choix artist album ou genre
– synchronisation avec les autres squeezebox de la maison (multiroom)
– liste des presets
– shutdown

Matériel :

Budget : Non défini

  • Mon installation de base :
  • – un NAS synology sur lequel tourne le serveur squeezebox (mais ça peut être autre chose)
  • – un ampli home cinema connecté et pilotable via des requetes telnet. Le mien est un DENON AVR-X2100WL’installation spécifique “pisqueeze” :
  • Obligatoire
  • – un raspberry pi (n’importe quelle version)
  • – une carte SD (8Go classe 10 minimum)
  • – une alimentation (au moins 1A, idéalement 2A)
  • – cable hdmi ou DAC audio usb pour envoyer le son vers l’ampli (la sortie RCA du raspberry pi n’est pas d’assez bonne qualité)
  • – quelques boutons poussoirs
  • – un bouton rotatif (exemple : http://www.adafruit.com/products/377)
  • – fils , soudure, …
  • – boite en carton (ou bois, ou imprimé en 3D, …)
  • facultatif :
  • – Ecran LCD (4 lignes idéalement, connexion en parallèle ou série i2c)
  • – capteur Infra Rouge
  • – disque dur usb si vous décidez de stocker votre musique dans la pisqueeze
  • – un NAS Synology pour faire serveur squeezebox
  • – dongle WIFI (EDIMAX par exemple) si vous n’avez pas de câble réseau là où la pisqueeze sera placée.

Etape 1 : Préparer sa framboise

Nous allons installer squeezeplug sur notre raspberry. Depuis peu, il existe une image toute faite qui fournit un système avec squeezeplug et Max2Play (qui permet de configurer sa raspberry en mode web en évitant les lignes de commandes).
Si vous voulez vous pouvez aussi tout installer à la main (rasbian + squeezeplug seul). Mais ici, on va essayer de se simplifier la vie!

Télécharger sur http://www.squeezeplug.eu/ une image systeme (SPMAX2PLAY_RPI_212.zip par exemple)

Copier l’image sur votre carte sd (j’utilise personnelement Win32DiskImager sous windows) (voir http://www.framboise314.fr/win32diskimager-une-nouvelle-version-est-sortie/)

Connecter la carte SD dans la raspberry pi et brancher l’alimentation et le câble réseau.

Rechercher l’adresse IP de la pisqueeze (j’utilise http://www.advanced-ip-scanner.com/) et ouvrer sa page web.

Allez dans l’onglet “settings/reboot” et changer le nom de la raspberry par “pisqueeze” (ou ce que vous souhaitez), changer la langue (si vraiment l’anglais vous rebute fortement car la traduction en français est assez pourrie, …
Toujours avec cette page web, Rebooter.
Toujours avec cette page web, “Expand file system” pour agrandir la taille de la partition sur la carte SD a sa taille physique. Rebooter encore.
Toujours avec cette page web, “Mise à jour de Max2play”.
Si vous voulez vous connecter en WiFi, paramétrer le dans l’onglet “WIFI & LAN”.

Etape 2 : Choisir son serveur squeezeBox


Je suppose ici que vous avez déjà un serveur squeezebox qui fonctionne déjà.
Dans le cas contraire, vous pouvez en créer un
– sur un NAS synologie
– sur un PC
– … (quelques recherche google devraient trouver réponses à toutes les configuration possible.
– ou même directement sur la pisqueeze (dans ce cas, il faut l’activer dans l’onglet “squeezeBox server”

Si vous avez déjà un serveur squeezebox, il a été automatiquement détecté lors de l’installation.

Etape 3 : Quelques réglages audio


Dans l’onglet “Lecteur audio”,
– désactiver Airplay
– régler l’entrée audio selon que vous utiliser la prise jack, la sortie hdmi, ou une carte audio usb
– le reste par défaut devrait fonctionner.

Etape 4 : Test de la partie squeezebox


– Brancher la sortie hdmi (ou jack, au usb) sur votre ampli (ou enceintes, ou tv, ou …).
– ouvrer votre squeezebox serveur sur un navigateur, sélectionner la platine “pisqueeze” et choisissez la musique de votre choix

=> petite danse de joie.

Ca marche déjà.
Il nous manque seulement l’interface isqueeze qui va nous permettre de se passer de navigateur (pc, mac, android, …) et de juste pouvoir appuyer sur des boutons sur la radio pour interagir avec la radio.
(ce que je trouve quand même plus pratique).

Etape 5 : Hardware : sortez le fer à souder

C’est là que ça se gâte!!!
Il va falloir tout souder (voir schéma).
A noter que rien n’est obligatoire (si vous ne souhaitez qu’un bouton qui fait marche-arrêt, c’est tout à fait possible. Il faudra juste modifier un peu le code).

Pour ma part, j’ai utilisé une vieille nappe IDE pour connexion au GPIO du Raspberry pi. Ce n’est pas vraiment l’idéal (sac de noeuds), mais çà fonctionne.)

Les trois boutons à gauche sur le schémas (sur ma boîte se sont les 3 boutons de couleurs sur le top) sont respectivement affectés à
– Bouton on_off : sur GPIO17 (11 physique) du Rpi
– Bouton play_pause : sur GPIO27 (13 physique) du Rpi
– Bouton next : sur GPIO22 (15 physique) du Rpi

Les 6 boutons suivants sur le schémas (sur ma boîte se sont les 6 petits boutons en bas) sont des boutons de presets. Branchés sur
– GPIO7 (26 physique)
– GPIO8 (24 physique)
– GPIO11 (23 physique)
– GPIO25 (22 physique)
– GPIO9 (21 physique)
– GPIO10 (19 physique)

L’écran LCD 2 ou 4 lignes est à branché soit en i2c, soit en parallèle. Sur le schéma, l’écran est branché en série i2c (le plus simple car moins de câbles).
(mais ça oblige a mettre un module i2c sur l’écran).
Pour version i2c :
Brancher le 5V et le 0V du Rpi sur les pin GND et Vcc du module i2c.
Brancher le GPIO2 (SDA1 I2C) et le GPIO3 (SCL1 I2C) du Rpi sur les pins SDA et SCL du module i2c.
Enlever le jumper des pins led du module i2c.
Brancher le GPIO14 sur la pin du haut (led+) du module i2c. Ca va nous servir à allumer ou éteindre l’écran.
Le potentiomètre du module i2c permet de régler la luminosité.

Le bouton rotatif a
– 3 pattes (ground au milieu) pour la rotation
– 2 pattes de l’autre coté pour le bouton poussoir (validation)
Si vous n’avez pas de bouton rotatif, vous pouvez utiliser à la place 3 boutons poussoirs (haut, bas, validation)
Il va nous servir à naviguer dans le menu de la pisqueeze.
Branchements :
– 0V sur la patte du milieu (coté où il y a 3 pattes)
– GPIO24 (physique 18) sur la patte de droite (coté où il y a 3 pattes)
– GPIO23 (physique 16) sur la patte de gauche (coté où il y a 3 pattes)
– 0V sur une des pattes (coté où il y a 2 pattes)
– GPIO4 (physique 7) sur l’autre patte

Enfin, le capteur infra-rouge se branche ainsi :
(quand on regarde la face capteur)
– patte de gauche : sur GPIO18
– patte du centre : 0V
– patte de droite : 5V

Etape 6 : Mode console

Etape 7 : Activer i2c


Pour pouvoir utiliser l’écran lcd en mode i2c, il faut activer l’i2c.

Dans la console :

sudo raspi-config

Puis selectionner “advanced options” / I2C.
Activer I2C et charger le i2c kernel module au boot. (oui-oui)

sudo nano /etc/modules
Ajout :
i2c-bcm2708
i2c-dev

Reboot la pisqueeze (sudo reboot)

sudo apt-get install i2c-tools
sudo apt-get install python-smbus

sudo adduser pi i2c

Pour détecter l’écran :
i2cdetect -y 1 (1 est le n° du bus)

On doit obtenir :

0 1 2 3 4 5 6 7 8 9 a b c d e f
00: — — — — — — — — — — — — —
10: — — — — — — — — — — — — — — — —
20: — — — — — — — 27 — — — — — — — —
30: — — — — — — — — — — — — — — — —
40: — — — — — — — — — — — — — — — —
50: — — — — — — — — — — — — — — — —
60: — — — — — — — — — — — — — — — —
70: — — — — — — — —

Notre écran est à l’adresse 27 sur le bus n°1
(si rien n’est détecté, essayer le bus n°2)

Etape 8 : Installation des librairies python


Installer mes librairies python à partir de https://pypi.python.org :
FGPIO (gestion des E/S Rpi avec de nombreux matériel (ici pour boutons et ecran)
FUTIL ( utilitaires perso)
FAVRIP (gestion des communications avec ampli home cinema)
isqueeze (interface squeezebox)
+ librairie pylms pour communication avec squeezebox serveur

Installation de PIP :

mkdir install
cd install/
wget https://pypi.python.org/packages/source/d/distribute/distribute-0.7.3.zip
unzip distribute-0.7.3.zip
cd distribute-0.7.3
sudo python setup.py install
sudo easy_install pip

Installation des librairies

sudo pip install FGPIO
sudo pip install FUTIL==0.1.4 (je ne sais pas pourquoi si on ne précise pas n° de version, c’est une vieille qui est installée!!)
sudo pip install FAVRIP
sudo pip install pylms
sudo pip install isqueeze

Etape 9 : Modifier le fichier myisqueeze.py


Editer le fichier myisqueeze.py : sudo nano /opt/isqueeze/myisqueeze.py
Si vous maîtriser python, pas de soucis, sinon … faites par analogie!

Modifier les adresse IP (serveur squeezeBox, ampli.
Si vous n’avez pas encore installé la partie infrarouge,
Changer la ligne 34 en :
infra_rouge = False

Supprimer ce dont vous n’avez pas besoin (attention à la syntaxe quand même).

Etape 10 : Executer le script au démarage

Il s’agit ici de lancer notre script python myisqueeze.py en deamon.

En fait l’installation de la librairie isqueeze fait la création d’un deamon nommé “pisqueeze”.

On va juste vérifier que ça fonctionne :

Installation d’un outil pour visualiser les deamons:
sudo apt-get install sysv-rc-conf
Execution de l’utilitaire :
sudo sysv-rc-conf

Vérifier bien que pisqueeze est bien dans la liste et démarre bien en 2,3,4,5.

rebooter pour vérifier
ou plus simplement :
sudo service pisqueeze start

Etape 11 : L’infra rouge

Installation LIRC : gestionnaire récepteur IR
(attention, étape non testée!!!)
Install lirc

Commande sudo apt-get install lirc liblircclient-dev

Modifier le fichier /etc/modules en ajoutant ces deux lignes :

Commande lirc_dev
Commande lirc_rpi gpio_in_pin=18 #18=port GPIO utilisé pour branché le capteur IR

Modifie le fichier /etc/licr/hardware.conf :

# /etc/lirc/hardware.conf
#
# Arguments which will be used when launching lircetc/lid
LIRCD_ARGS=”–uinput”
 
# Don’t start lircmd even if there seems to be a good config file
# START_LIRCMD=false
 
# Don’t start irexec, even if a good config file seems to exist.
# START_IREXEC=false
 
# Try to load appropriate kernel modules
LOAD_MODULES=true
 
# Run “lircd –driver=help” for a list of supported drivers.
DRIVER=”default”
# usually /dev/lirc0 is the correct setting for systems using udev
DEVICE=”/dev/lirc0″
MODULES=”lirc_rpi”
 
# Default configuration files for your hardware if any
LIRCD_CONF=””
LIRCMD_CONF=””

Reboot

Etape 12 : Et ensuite…

Je vous invite fortement a aller modifier le code.
myisqueeze.py bien sur, mais c’est assez basique.

Si vous aimez bien le cambouis : allez voir isqueeze.py de la librairie isqueeze.
Là vous pourrez
– modifier le menu
– rajouter des leds
– ….

Etape 13 : Utilisation

A l’usage, j’utilise presque toujours ma pisqueeze de la manière suivante :

J’appuie sur le bouton rouge.

et l’ampli s’allume, se met sur la bonne entrée et la squeezebox lance un random sur toute ma bibliothèque musicale.

Pour éteindre, je coupe l’ampli et ça coupe tout.
Quand un morceau me gonfle : un coup sur la télécommande !

Modifier mon Tutoriel

super projet! bravo et merci du partage 🙂

Bonjour, J'ai suivi votre tuto très précisement. Tout va bien jusqu’à l'étape 7 où l'adresse de l'écran n'est pas trouvée (bus 1 ou 2). Au final les boutons et l'ecran ne fonctionnent pas comme si le GPIO était inactif. J'ai refais l'installation, verifié les tension... Je ne sais plus quoi faire. Avez-vous une idée ? Bien à vous

Bonjour, Je suis désolé que ça ne fonctionne pas. Je propose de vérifier chaque point un par un : tout d'abord juste l'écran. Avez vous tout soudé ou les branchements sont-ils fait sur une breadoard? Le mieux est de partir sur un circuit sur breadboard pour pouvoir tester facilement. Tenez moi au courant ....

Bonjour, C'est monté avec des Câbles Dupont directement. Idem pour les boutons (sauf côté bouton où s'est soudé.) c'est comme si le GPIO était inactif.

Petite question : quel est le modèle de raspberry pi? Sinon, pour tester si ma librairie fonctionne : lancer python depuis l'invite de commande avec sudo python puis from FGPIO.led_io import * pc = rpiduino_io() led = led_io(pc.bcm_pin(22)) # 22 pour GPIO22 led.on() led.off()

Quelques jours de vacances sont l'occasion de s'y remettre... Pour la led, pas de problème : ça marche :-) mais l’écran n'est toujours pas détecté, je vais en essayer un autre. Ce qui n’explique pas l'inactivité des boutons. Est-il possible de les simuler en python ?

Pour les boutons je te propose de tester : une patte du bouton sur la masse, l'autre sur une pin GPIO (ex : le GPIO22) from FGPIO.bt_io import * import time pc = rpiduino_io() bt = bt_io(pc.bcm_pin(22)) def action_bt_change(): if bt2.th_readed(): print "bt2 Pushed." else: print "bt2 Released." bt2 = bt_io(pc.logical_pin(10), True, action_bt_change) try: #Ca permet de pouvoir planter le thread avec un CTRL-C print "Appuyer sur les boutons" while True: if bt.is_pushed(): print "Bt est appuyé" time.sleep(0.1) except KeyboardInterrupt: bt2.stop()

Attention, Oui are maker a supprimer les tabulations : a remettre

Bonjour, J'ai des erreurs mais à partir de ce code plus simple j'ai bien un retour sur le bouton next. ça marche ! from FGPIO.bt_io import * import time pc = rpiduino_io() bt = bt_io(pc.physical_pin(15)) while True: if bt.is_pushed(): print "Bt est appuyé" time.sleep(0.1) else: print "Bt off" time.sleep(0.1)

J'ai donc tenté de coller en console le code isqueeze... >>> #!/usr/bin/env python ... # -*- coding:utf-8 -* ... >>> import sys >>> sys.path.insert(0,'../../FGPIO')#Pour travailler sur les sources >>> sys.path.insert(0,'../../FAVRIP') >>> sys.path.insert(0,'../../FUTIL') >>> >>> from isqueeze import * >>> #from FAVRIP.denon import * ... from FGPIO.rpiduino_io import * >>> from FGPIO.lcd_i2c_io import * >>> from FGPIO.bt_io import * >>> from FGPIO.rotary_encoder_io import * >>> from FUTIL.my_logging import * >>> >>> my_logging(console_level = DEBUG, logfile_level = INFO, details = True) INFO:root:my_logging logger is started. Console : DEBUG. File (.log) : INFO my_logging logger is started. Console : DEBUG. File (.log) : INFO my_logging logger is started. Console : DEBUG. File (.log) : INFO my_logging logger is started. Console : DEBUG. File (.log) : INFO my_logging logger is started. Console : DEBUG. File (.log) : INFO my_logging logger is started. Console : DEBUG. File (.log) : INFO my_logging logger is started. Console : DEBUG. File (.log) : INFO my_logging logger is started. Console : DEBUG. File (.log) : INFO my_logging logger is started. Console : DEBUG. File (.log) : INFO my_logging logger is started. Console : DEBUG. File (.log) : INFO >>> >>> logging.info("isqueeze start now") INFO:root:isqueeze start now isqueeze start now isqueeze start now isqueeze start now isqueeze start now isqueeze start now isqueeze start now isqueeze start now isqueeze start now isqueeze start now >>> >>> pc = rpiduino_io() >>> >>> lcd = lcd_i2c_io(pc=pc, pin_bl=pc.physical_pin(8), lines=4, width=20) ERROR:root: File "", line 1, in File "/usr/local/lib/python2.7/dist-packages/FGPIO/lcd_i2c_io.py", line 31, in __init__ lcd_io.__init__(self, width, lines, auto_scroll) File "/usr/local/lib/python2.7/dist-packages/FGPIO/lcd_io.py", line 84, in __init__ self.send(0x33,lcd_io.cmd) # 0b00110011 Function Set : 8bits, mode 1 ligne, 5x8 dots format mode File "/usr/local/lib/python2.7/dist-packages/FGPIO/i2c_device_io.py", line 64, in lcd_i2c_UnErrorFonction return fonction(self,*args, **kwargs) File "/usr/local/lib/python2.7/dist-packages/FGPIO/lcd_i2c_io.py", line 58, in send self.send4bits(mode | (bits & 0xF0)) File "/usr/local/lib/python2.7/dist-packages/FGPIO/lcd_i2c_io.py", line 48, in send4bits self.device.write_cmd(data | lcd_io.arg_backlight_on) File "/usr/local/lib/python2.7/dist-packages/FGPIO/i2c_io.py", line 42, in write_cmd self.bus.smbus.write_byte(self.addr, cmd) File "", line 1, in File "/usr/local/lib/python2.7/dist-packages/FGPIO/lcd_i2c_io.py", line 31, in __init__ lcd_io.__init__(self, width, lines, auto_scroll) File "/usr/local/lib/python2.7/dist-packages/FGPIO/lcd_io.py", line 84, in __init__ self.send(0x33,lcd_io.cmd) # 0b00110011 Function Set : 8bits, mode 1 ligne, 5x8 dots format mode File "/usr/local/lib/python2.7/dist-packages/FGPIO/i2c_device_io.py", line 64, in lcd_i2c_UnErrorFonction return fonction(self,*args, **kwargs) File "/usr/local/lib/python2.7/dist-packages/FGPIO/lcd_i2c_io.py", line 58, in send self.send4bits(mode | (bits & 0xF0)) File "/usr/local/lib/python2.7/dist-packages/FGPIO/lcd_i2c_io.py", line 48, in send4bits self.device.write_cmd(data | lcd_io.arg_backlight_on) File "/usr/local/lib/python2.7/dist-packages/FGPIO/i2c_io.py", line 42, in write_cmd self.bus.smbus.write_byte(self.addr, cmd) File "", line 1, in File "/usr/local/lib/python2.7/dist-packages/FGPIO/lcd_i2c_io.py", line 31, in __init__ lcd_io.__init__(self, width, lines, auto_scroll) File "/usr/local/lib/python2.7/dist-packages/FGPIO/lcd_io.py", line 84, in __init__ self.send(0x33,lcd_io.cmd) # 0b00110011 Function Set : 8bits, mode 1 ligne, 5x8 dots format mode File "/usr/local/lib/python2.7/dist-packages/FGPIO/i2c_device_io.py", line 64, in lcd_i2c_UnErrorFonction return fonction(self,*args, **kwargs) File "/usr/local/lib/python2.7/dist-packages/FGPIO/lcd_i2c_io.py", line 58, in send self.send4bits(mode | (bits & 0xF0)) File "/usr/local/lib/python2.7/dist-packages/FGPIO/lcd_i2c_io.py", line 48, in send4bits self.device.write_cmd(data | lcd_io.arg_backlight_on) File "/usr/local/lib/python2.7/dist-packages/FGPIO/i2c_io.py", line 42, in write_cmd self.bus.smbus.write_byte(self.addr, cmd) File "", line 1, in File "/usr/local/lib/python2.7/dist-packages/FGPIO/lcd_i2c_io.py", line 31, in __init__ lcd_io.__init__(self, width, lines, auto_scroll) File "/usr/local/lib/python2.7/dist-packages/FGPIO/lcd_io.py", line 84, in __init__ self.send(0x33,lcd_io.cmd) # 0b00110011 Function Set : 8bits, mode 1 ligne, 5x8 dots format mode File "/usr/local/lib/python2.7/dist-packages/FGPIO/i2c_device_io.py", line 64, in lcd_i2c_UnErrorFonction return fonction(self,*args, **kwargs) File "/usr/local/lib/python2.7/dist-packages/FGPIO/lcd_i2c_io.py", line 58, in send self.send4bits(mode | (bits & 0xF0)) File "/usr/local/lib/python2.7/dist-packages/FGPIO/lcd_i2c_io.py", line 48, in send4bits self.device.write_cmd(data | lcd_io.arg_backlight_on) File "/usr/local/lib/python2.7/dist-packages/FGPIO/i2c_io.py", line 42, in write_cmd self.bus.smbus.write_byte(self.addr, cmd) File "", line 1, in File "/usr/local/lib/python2.7/dist-packages/FGPIO/lcd_i2c_io.py", line 31, in __init__ lcd_io.__init__(self, width, lines, auto_scroll) File "/usr/local/lib/python2.7/dist-packages/FGPIO/lcd_io.py", line 84, in __init__ self.send(0x33,lcd_io.cmd) # 0b00110011 Function Set : 8bits, mode 1 ligne, 5x8 dots format mode File "/usr/local/lib/python2.7/dist-packages/FGPIO/i2c_device_io.py", line 64, in lcd_i2c_UnErrorFonction return fonction(self,*args, **kwargs) File "/usr/local/lib/python2.7/dist-packages/FGPIO/lcd_i2c_io.py", line 58, in send self.send4bits(mode | (bits & 0xF0)) File "/usr/local/lib/python2.7/dist-packages/FGPIO/lcd_i2c_io.py", line 48, in send4bits self.device.write_cmd(data | lcd_io.arg_backlight_on) File "/usr/local/lib/python2.7/dist-packages/FGPIO/i2c_io.py", line 42, in write_cmd self.bus.smbus.write_byte(self.addr, cmd) File "", line 1, in File "/usr/local/lib/python2.7/dist-packages/FGPIO/lcd_i2c_io.py", line 31, in __init__ lcd_io.__init__(self, width, lines, auto_scroll) File "/usr/local/lib/python2.7/dist-packages/FGPIO/lcd_io.py", line 84, in __init__ self.send(0x33,lcd_io.cmd) # 0b00110011 Function Set : 8bits, mode 1 ligne, 5x8 dots format mode File "/usr/local/lib/python2.7/dist-packages/FGPIO/i2c_device_io.py", line 64, in lcd_i2c_UnErrorFonction return fonction(self,*args, **kwargs) File "/usr/local/lib/python2.7/dist-packages/FGPIO/lcd_i2c_io.py", line 58, in send self.send4bits(mode | (bits & 0xF0)) File "/usr/local/lib/python2.7/dist-packages/FGPIO/lcd_i2c_io.py", line 48, in send4bits self.device.write_cmd(data | lcd_io.arg_backlight_on) File "/usr/local/lib/python2.7/dist-packages/FGPIO/i2c_io.py", line 42, in write_cmd self.bus.smbus.write_byte(self.addr, cmd) File "", line 1, in File "/usr/local/lib/python2.7/dist-packages/FGPIO/lcd_i2c_io.py", line 31, in __init__ lcd_io.__init__(self, width, lines, auto_scroll) File "/usr/local/lib/python2.7/dist-packages/FGPIO/lcd_io.py", line 84, in __init__ self.send(0x33,lcd_io.cmd) # 0b00110011 Function Set : 8bits, mode 1 ligne, 5x8 dots format mode File "/usr/local/lib/python2.7/dist-packages/FGPIO/i2c_device_io.py", line 64, in lcd_i2c_UnErrorFonction return fonction(self,*args, **kwargs) File "/usr/local/lib/python2.7/dist-packages/FGPIO/lcd_i2c_io.py", line 58, in send self.send4bits(mode | (bits & 0xF0)) File "/usr/local/lib/python2.7/dist-packages/FGPIO/lcd_i2c_io.py", line 48, in send4bits self.device.write_cmd(data | lcd_io.arg_backlight_on) File "/usr/local/lib/python2.7/dist-packages/FGPIO/i2c_io.py", line 42, in write_cmd self.bus.smbus.write_byte(self.addr, cmd) File "", line 1, in File "/usr/local/lib/python2.7/dist-packages/FGPIO/lcd_i2c_io.py", line 31, in __init__ lcd_io.__init__(self, width, lines, auto_scroll) File "/usr/local/lib/python2.7/dist-packages/FGPIO/lcd_io.py", line 84, in __init__ self.send(0x33,lcd_io.cmd) # 0b00110011 Function Set : 8bits, mode 1 ligne, 5x8 dots format mode File "/usr/local/lib/python2.7/dist-packages/FGPIO/i2c_device_io.py", line 64, in lcd_i2c_UnErrorFonction return fonction(self,*args, **kwargs) File "/usr/local/lib/python2.7/dist-packages/FGPIO/lcd_i2c_io.py", line 58, in send self.send4bits(mode | (bits & 0xF0)) File "/usr/local/lib/python2.7/dist-packages/FGPIO/lcd_i2c_io.py", line 48, in send4bits self.device.write_cmd(data | lcd_io.arg_backlight_on) File "/usr/local/lib/python2.7/dist-packages/FGPIO/i2c_io.py", line 42, in write_cmd self.bus.smbus.write_byte(self.addr, cmd) File "", line 1, in File "/usr/local/lib/python2.7/dist-packages/FGPIO/lcd_i2c_io.py", line 31, in __init__ lcd_io.__init__(self, width, lines, auto_scroll) File "/usr/local/lib/python2.7/dist-packages/FGPIO/lcd_io.py", line 84, in __init__ self.send(0x33,lcd_io.cmd) # 0b00110011 Function Set : 8bits, mode 1 ligne, 5x8 dots format mode File "/usr/local/lib/python2.7/dist-packages/FGPIO/i2c_device_io.py", line 64, in lcd_i2c_UnErrorFonction return fonction(self,*args, **kwargs) File "/usr/local/lib/python2.7/dist-packages/FGPIO/lcd_i2c_io.py", line 58, in send self.send4bits(mode | (bits & 0xF0)) File "/usr/local/lib/python2.7/dist-packages/FGPIO/lcd_i2c_io.py", line 48, in send4bits self.device.write_cmd(data | lcd_io.arg_backlight_on) File "/usr/local/lib/python2.7/dist-packages/FGPIO/i2c_io.py", line 42, in write_cmd self.bus.smbus.write_byte(self.addr, cmd) File "", line 1, in File "/usr/local/lib/python2.7/dist-packages/FGPIO/lcd_i2c_io.py", line 31, in __init__ lcd_io.__init__(self, width, lines, auto_scroll) File "/usr/local/lib/python2.7/dist-packages/FGPIO/lcd_io.py", line 84, in __init__ self.send(0x33,lcd_io.cmd) # 0b00110011 Function Set : 8bits, mode 1 ligne, 5x8 dots format mode File "/usr/local/lib/python2.7/dist-packages/FGPIO/i2c_device_io.py", line 64, in lcd_i2c_UnErrorFonction return fonction(self,*args, **kwargs) File "/usr/local/lib/python2.7/dist-packages/FGPIO/lcd_i2c_io.py", line 58, in send self.send4bits(mode | (bits & 0xF0)) File "/usr/local/lib/python2.7/dist-packages/FGPIO/lcd_i2c_io.py", line 48, in send4bits self.device.write_cmd(data | lcd_io.arg_backlight_on) File "/usr/local/lib/python2.7/dist-packages/FGPIO/i2c_io.py", line 42, in write_cmd self.bus.smbus.write_byte(self.addr, cmd) ERROR:root: - i2c_device instance has no attribute 'addr' - i2c_device instance has no attribute 'addr' - i2c_device instance has no attribute 'addr' - i2c_device instance has no attribute 'addr' - i2c_device instance has no attribute 'addr' - i2c_device instance has no attribute 'addr' - i2c_device instance has no attribute 'addr' - i2c_device instance has no attribute 'addr' - i2c_device instance has no attribute 'addr' - i2c_device instance has no attribute 'addr' >>> #led = led_io(pc.physical_pin(21)) # led sur pin 2 arduino ou 13 Rpi (GPIO2) ... bt_onoff = bt_io(pc.physical_pin(11)) # Bt on_off sur la pin 3 arduino ou GPIO3 du Rpi INFO:root: is created on pin 11 : GPIO en mode INPUT. Valeur = 1. is created on pin 11 : GPIO en mode INPUT. Valeur = 1. is created on pin 11 : GPIO en mode INPUT. Valeur = 1. is created on pin 11 : GPIO en mode INPUT. Valeur = 1. is created on pin 11 : GPIO en mode INPUT. Valeur = 1. is created on pin 11 : GPIO en mode INPUT. Valeur = 1. is created on pin 11 : GPIO en mode INPUT. Valeur = 1. is created on pin 11 : GPIO en mode INPUT. Valeur = 1. is created on pin 11 : GPIO en mode INPUT. Valeur = 1. is created on pin 11 : GPIO en mode INPUT. Valeur = 1. >>> bt_playpause = bt_io(pc.physical_pin(13)) INFO:root: is created on pin 13 : GPIO en mode INPUT. Valeur = 1. is created on pin 13 : GPIO en mode INPUT. Valeur = 1. is created on pin 13 : GPIO en mode INPUT. Valeur = 1. is created on pin 13 : GPIO en mode INPUT. Valeur = 1. is created on pin 13 : GPIO en mode INPUT. Valeur = 1. is created on pin 13 : GPIO en mode INPUT. Valeur = 1. is created on pin 13 : GPIO en mode INPUT. Valeur = 1. is created on pin 13 : GPIO en mode INPUT. Valeur = 1. is created on pin 13 : GPIO en mode INPUT. Valeur = 1. is created on pin 13 : GPIO en mode INPUT. Valeur = 1. >>> bt_next = bt_io(pc.physical_pin(15)) INFO:root: is created on pin 15 : GPIO en mode INPUT. Valeur = 1. is created on pin 15 : GPIO en mode INPUT. Valeur = 1. is created on pin 15 : GPIO en mode INPUT. Valeur = 1. is created on pin 15 : GPIO en mode INPUT. Valeur = 1. is created on pin 15 : GPIO en mode INPUT. Valeur = 1. is created on pin 15 : GPIO en mode INPUT. Valeur = 1. is created on pin 15 : GPIO en mode INPUT. Valeur = 1. is created on pin 15 : GPIO en mode INPUT. Valeur = 1. is created on pin 15 : GPIO en mode INPUT. Valeur = 1. is created on pin 15 : GPIO en mode INPUT. Valeur = 1. >>> bt_rot = bt_rotatif_io(*pc.physical_pins(18,16,7), auto=True) INFO:root: is created on pin 7 : GPIO en mode INPUT. Valeur = 1. is created on pin 7 : GPIO en mode INPUT. Valeur = 1. is created on pin 7 : GPIO en mode INPUT. Valeur = 1. INFO:root:f_thread _auto_read started. f_thread _auto_read started. f_thread _auto_read started. is created on pin 7 : GPIO en mode INPUT. Valeur = 1. is created on pin 7 : GPIO en mode INPUT. Valeur = 1. f_thread _auto_read started. f_thread _auto_read started. is created on pin 7 : GPIO en mode INPUT. Valeur = 1. is created on pin 7 : GPIO en mode INPUT. Valeur = 1. f_thread _auto_read started. is created on pin 7 : GPIO en mode INPUT. Valeur = 1. is created on pin 7 : GPIO en mode INPUT. Valeur = 1. f_thread _auto_read started. f_thread _auto_read started. is created on pin 7 : GPIO en mode INPUT. Valeur = 1. >>> f_thread _auto_read started. f_thread _auto_read started. bts_preset = [ \ ... bt_io(pc.physical_pin(26)), \ ... bt_io(pc.physical_pin(24)), \ ... bt_io(pc.physical_pin(23)), \ ... bt_io(pc.physical_pin(22)), \ ... bt_io(pc.physical_pin(21)), \ ... bt_io(pc.physical_pin(19)) \ ... ] INFO:root: is created on pin 26 : GPIO en mode INPUT. Valeur = 1. is created on pin 26 : GPIO en mode INPUT. Valeur = 1. is created on pin 26 : GPIO en mode INPUT. Valeur = 1. is created on pin 26 : GPIO en mode INPUT. Valeur = 1. is created on pin 26 : GPIO en mode INPUT. Valeur = 1. is created on pin 26 : GPIO en mode INPUT. Valeur = 1. is created on pin 26 : GPIO en mode INPUT. Valeur = 1. is created on pin 26 : GPIO en mode INPUT. Valeur = 1. is created on pin 26 : GPIO en mode INPUT. Valeur = 1. is created on pin 26 : GPIO en mode INPUT. Valeur = 1. INFO:root: is created on pin 24 : GPIO en mode INPUT. Valeur = 1. is created on pin 24 : GPIO en mode INPUT. Valeur = 1. is created on pin 24 : GPIO en mode INPUT. Valeur = 1. is created on pin 24 : GPIO en mode INPUT. Valeur = 1. is created on pin 24 : GPIO en mode INPUT. Valeur = 1. is created on pin 24 : GPIO en mode INPUT. Valeur = 1. is created on pin 24 : GPIO en mode INPUT. Valeur = 1. is created on pin 24 : GPIO en mode INPUT. Valeur = 1. is created on pin 24 : GPIO en mode INPUT. Valeur = 1. is created on pin 24 : GPIO en mode INPUT. Valeur = 1. INFO:root: is created on pin 23 : GPIO en mode INPUT. Valeur = 1. is created on pin 23 : GPIO en mode INPUT. Valeur = 1. is created on pin 23 : GPIO en mode INPUT. Valeur = 1. is created on pin 23 : GPIO en mode INPUT. Valeur = 1. is created on pin 23 : GPIO en mode INPUT. Valeur = 1. is created on pin 23 : GPIO en mode INPUT. Valeur = 1. is created on pin 23 : GPIO en mode INPUT. Valeur = 1. is created on pin 23 : GPIO en mode INPUT. Valeur = 1. is created on pin 23 : GPIO en mode INPUT. Valeur = 1. is created on pin 23 : GPIO en mode INPUT. Valeur = 1. INFO:root: is created on pin 22 : GPIO en mode INPUT. Valeur = 1. is created on pin 22 : GPIO en mode INPUT. Valeur = 1. is created on pin 22 : GPIO en mode INPUT. Valeur = 1. is created on pin 22 : GPIO en mode INPUT. Valeur = 1. is created on pin 22 : GPIO en mode INPUT. Valeur = 1. is created on pin 22 : GPIO en mode INPUT. Valeur = 1. is created on pin 22 : GPIO en mode INPUT. Valeur = 1. is created on pin 22 : GPIO en mode INPUT. Valeur = 1. is created on pin 22 : GPIO en mode INPUT. Valeur = 1. is created on pin 22 : GPIO en mode INPUT. Valeur = 1. INFO:root: is created on pin 21 : GPIO en mode INPUT. Valeur = 1. is created on pin 21 : GPIO en mode INPUT. Valeur = 1. is created on pin 21 : GPIO en mode INPUT. Valeur = 1. is created on pin 21 : GPIO en mode INPUT. Valeur = 1. is created on pin 21 : GPIO en mode INPUT. Valeur = 1. is created on pin 21 : GPIO en mode INPUT. Valeur = 1. is created on pin 21 : GPIO en mode INPUT. Valeur = 1. is created on pin 21 : GPIO en mode INPUT. Valeur = 1. is created on pin 21 : GPIO en mode INPUT. Valeur = 1. is created on pin 21 : GPIO en mode INPUT. Valeur = 1. INFO:root: is created on pin 19 : GPIO en mode INPUT. Valeur = 1. is created on pin 19 : GPIO en mode INPUT. Valeur = 1. is created on pin 19 : GPIO en mode INPUT. Valeur = 1. is created on pin 19 : GPIO en mode INPUT. Valeur = 1. is created on pin 19 : GPIO en mode INPUT. Valeur = 1. is created on pin 19 : GPIO en mode INPUT. Valeur = 1. is created on pin 19 : GPIO en mode INPUT. Valeur = 1. is created on pin 19 : GPIO en mode INPUT. Valeur = 1. is created on pin 19 : GPIO en mode INPUT. Valeur = 1. is created on pin 19 : GPIO en mode INPUT. Valeur = 1. >>> infra_rouge = False >>> >>> ... myisqueeze = isqueeze( \ ... SB_serveur_ip = '192.168.10.10', \ ... SB_client_name = 'pisqueeze', \ ... ampli = False), \ ... ampli_input = False,\ ... lcd = lcd, \ ... bt_onoff = bt_onoff, \ ... bt_playpause = bt_playpause, \ ... bt_next = bt_next, \ ... bt_rot = bt_rot, \ ... bts_preset = bts_preset, \ ... infra_rouge = infra_rouge) destruction de Exception AttributeError: "'lcd_i2c_io' object has no attribute 'thread_auto_scroll'" in > ignored ERROR:root: ERROR:root: - invalid syntax (, line 13) - invalid syntax (, line 13) - invalid syntax (, line 13) - invalid syntax (, line 13) - invalid syntax (, line 13) - invalid syntax (, line 13) - invalid syntax (, line 13) - invalid syntax (, line 13) - invalid syntax (, line 13) - invalid syntax (, line 13) >>> >>> myisqueeze.wait_ctrl_c()

Benoit, a priori il y a un problème avec l'écran lcd. Mais j'avoue avoir du mal à comprendre les erreurs. L'ecran lcd est-il bien branché et l'étape 8 du tuto est elle ok (installation i2C)? Sinon, l'écran n'est pas obligatoire : si on met myisqueeze = isqueeze( ...., lcd=None, ....) ca va ignorer l'écran. Tu as executer plusieurs fois la commande du logger => tous les log et erreurs sont multipliées => pas trop lisible.

Eh les gens vous connaissez pastebin.com


Ces tutoriels devraient vous plaire

vignette Construire son Bartop Arcade de A à Z
Construire son Bartop Arcade de A à Z
vignette Fabriquer une lampe à lave
Fabriquer une lampe à lave
vignette Connecter un  écran LCD en I2C
Connecter un écran LCD en I2C

Découvrez tous les tutoriels partagés sur Oui Are Makers

Powered by Oui Are Makers