Aller au contenu

Un Cadre Photo Num


Sp@r0

Messages recommandés

Voilà je vous expose le concept, sur mon syno je dispose des informations suivantes :

- des photos

- ma domotique (températures, hygrométries, conso EDF, pression atmosphérique)

- une connexion internet pour récupérer plein d'autres infos

Mais je trouve un peu pénible de ne pas avoir d'afficheur qui m'affiche cela directement sans passez par un navigateur internet, au début je voulais utilisez un mini écran supportant la technologie DisplayLink (genre le Mino 720S) mais ces produits sont difficiles à trouver et surtout très chère !!!

Après pas mal de recherche j'ai finalement sélectionner ce produit :

samsung-spf-87h.jpg

Ce cadre photo numériques 8" coûte 80€ (SAMSUNG SPF87H) , mais je l'ai acheter d'occasion 40€. Il existe également un modèle 10"(SAMSUNG SPF107H mais il nécessite une alimentation externe). Cette gamme de produit implante une fonction "mini-monitor" qui permet normalement d'utiliser le cadre photo numérique comme un écran usb (un peu comme la technologie displayLink mais en lowcost)

Je me suis grandement inspiré de ce projet mais j'ai préféré le traduire et l'adapter pour que cela tourne sous python (du coup mon code est compatible avec tous synos disposant d'IPKG) (module pyUSB + python 2.5)

Donc ce que je parviens à faire :

- Achat du produit OK

- Protocole USB OK (je vous conseil Bus Hound pas trés connu mais vraiment super mieux que usbsniff)

- Codage en python pour envoyer une image fixe OK (enfin presque reste quelques petits bugs)

- Affichage des photos de la photostation En cours

- Affichage de la domotique KO

- Affichage d'infos du web KO

Alors ce la fonctionne vraiment bien je vous fournit mon code actuel encore largement perfectible (PS : les images doivent avoir la même résolution que le cadre)


#!/usr/bin/env python2.5

#

#	Programme de gestion du SPF 87 H

#	V 0.0 => En gros c est le premier truc qui fait qq chose !!!

#


# Import des librairies necessaires

import sys

import os

import time

import struct

import usb

MAXBUFFER = 0xffff


# Cherche les peropheriques usb

def Cherche_USB(V_vendor, V_product):

	busses = usb.busses()

	for bus in busses:

		for dev in bus.devices:

			if dev.idVendor == V_vendor and dev.idProduct == V_product:

				print "Trouvez : " + hex(dev.idVendor) + " \ " + hex(dev.idProduct)

				return dev

	print "Nada rien vue ..."

	return 0


# Basculement en mode mini-monitor

def Changement_MODE(dev):

	# Une petite verif

	assert dev.idVendor == 0x04E8

	assert dev.idProduct == 0x2033

	# Init

	conf = dev.configurations[0]

	iface = conf.interfaces[0][0]

	# On demande l'ouverture du peripherique

	handle = dev.open()

	handle.detachKernelDriver(iface.interfaceNumber)

	handle.setConfiguration(conf)

	handle.claimInterface(iface)

	handle.setAltInterface(iface)


	# Quelques preparatifs

	res = handle.getString(dev.iManufacturer,256)

	print  "usb_get_string_simple : " + res + " \n"


	S_trame = [0] * 254


	# On envoi la trame magique qui va planter mais on le sait

	try:

		res = handle.controlMsg(usb.TYPE_STANDARD | usb.ENDPOINT_IN, usb.REQ_GET_DESCRIPTOR, S_trame, 0xfe, 0xfe, 1000)

	except:

		print "Changement de mode OK"


# Init du mode mini-monitor

def Init_IMAGE(dev):

	# Une petite verif

	assert dev.idVendor == 0x04E8

	assert dev.idProduct == 0x2034

	# Init

	conf = dev.configurations[0]

	iface = conf.interfaces[0][0]

	endpoint = iface.endpoints[1]

	# On demande l'ouverture du peripherique

	handle = dev.open()

	handle.reset()


	handle.setConfiguration(1)

	handle.claimInterface(0)


	# Quelques preparatifs

	res = handle.getString(dev.iManufacturer,256)

	print  "usb_get_string_simple : " + res + " \n"


	for V_i in range(3):

		print "Endpoint:",hex(iface.endpoints[V_i].address)

		print handle.resetEndpoint(iface.endpoints[V_i].address)

		print handle.clearHalt(iface.endpoints[V_i].address)


	return handle



# Chargement d'une image

def Changement_IMAGE(handle, f_im):

	S_image = f_im.read()

	L_trame = len(S_image) + 12

	print hex(L_trame)

	S_trame = '\xa5'+'\x5a' + '\x09' + '\x04' + chr((L_trame%65536)%256) + chr((L_trame%65536)/256) + chr(L_trame/65536) + '\x00' + '\x46' + '\x00' + '\x00' + '\x00'

	print hex(ord(S_trame[4]))

	print hex(ord(S_trame[5]))

	print len(S_trame)

	V_buf = S_trame + S_image

	print " Longeur init + fichier : %d" % len(V_buf)

	if len(V_buf)<=MAXBUFFER:

		V_buffer = V_buf.ljust(MAXBUFFER, '\x00');

		print " Longeur buffer : %d" % len(V_buffer)

		res = handle.bulkWrite(0x2,V_buffer,1000)

		reqBuffer = '\x00'

		res = handle.controlMsg(0xc0, 0x6, reqBuffer, value = 0, index = 0, timeout = 100)

	else:

		V_i = 0

		while V_i < len(V_buf):

			V_bufferA = V_buf[V_i:(V_i + MAXBUFFER)]

			V_i = V_i + MAXBUFFER

			print " envoi morceau : %d" % len(V_bufferA)

			V_buffer = V_bufferA.ljust(MAXBUFFER, '\x00');

			res = handle.bulkWrite(0x2,V_buffer,1000)

		reqBuffer = '\x00'

		res = handle.controlMsg(0xc0, 0x6, reqBuffer, value = 0, index = 0, timeout = 100)


	# test control transfert

	#res = handle.ctrltransfer(0xc0, 0x6, 0, 0, 0x2)

	#reqBuffer = '\x00'

	#res = handle.controlMsg(0xc0, 0x6, reqBuffer, value = 0, index = 0, timeout = 100)




# Boucle principal on a vue plus elegant mais cela fontionne

while 1:

	# SPF en mode stockage de masse

	dev = Cherche_USB(0x04E8, 0x2033)

	if dev != 0:

		print "Passage en mode mini-monitor"

		Changement_MODE(dev)


	# SPF en mode mini-monitor

	rdev = Cherche_USB(0x04E8, 0x2034)

	if rdev != 0:

		print "Lancement de l'envoi des images"

		handle = Init_IMAGE(rdev)

		while 1:

			print "Chargement image"

			f_image = open('image1.jpg', 'r')

			Changement_IMAGE(handle, f_image)

			time.sleep(5)

			print "Chargement image"

			f_image1 = open('image2.jpg', 'r')

			Changement_IMAGE(handle, f_image1)

			time.sleep(5)

			print "Chargement image"

			f_image2 = open('image3.jpg', 'r')

			Changement_IMAGE(handle, f_image2)

			time.sleep(5)

	time.sleep(1)

Lien vers le commentaire
Partager sur d’autres sites

  • 4 semaines après...

Bon j'ai mis une vidéo du cadre en fonctionnement avec des photos de ma cuisine ...

VIDEO DU CADRE !!!

Bon les trucs qui reste à voir :

- améliorer le système de recadrage des photos qui reste perfectible sur certaine photo vertical

- modifier le hardware du cadre avec un circuit maison pour ne plus avoir à appuyer sur le bouton pour valider le mode USB

- commander la marche du cadre depuis le NAS => je vais en profiter pour développer la partie commande en X10 RF de mon projet de domotique

Lien vers le commentaire
Partager sur d’autres sites

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.