Accueil > Projet Made by Sp@r0, Synology > Lance missile sur DS110j : MAJ

Lance missile sur DS110j : MAJ

11/01/2011

Donc voilà après avoir mis de coté ce projet pendant des mois j’ai enfin réussit à sortir quelques chose de fonctionnelle !!!! Sans plus attendre la vidéo (je remercie ma fille de m’avoir prêté Crispy pour servir de cible!!!)

You need to install or upgrade Flash Player to view this content, install or upgrade by clicking here.

Nouvelle version du code qui utilise un serveur WEB qui fait à la fois proxy pour la webcam + permet de piloter le mouvement

Pour les curieux le code source utilisé dans la vidéo :

?View Code PYTHON
#!/usr/bin/env python2.5
#
#	Programme de gestion du lance missile de Spar0
#	Permet de gerer le lance missile avec Webcam integree que j'ai achete chez Pearl.com
#	V 0.0 => En gros c est le premier truc qui fait qq chose !!!
#
 
# Import des librairies necessaires
import sys
import time
import struct
import usb
import string,cgi,time
import urllib
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
from os import curdir, sep
 
# Creation du serveur WEB
class MyHandler(BaseHTTPRequestHandler):
	def do_GET(self):
		try:
			print self.path
			if self.path == "/missile.html":
				f = open(curdir + sep + "/missile.html") 
				self.send_response(200)
				self.send_header('Content-type',	'text/html')
				self.end_headers()
				self.wfile.write(f.read())
				f.close()
				return
			if self.path == "/":
				f = open(curdir + sep + "/missile.html") 
				self.send_response(200)
				self.send_header('Content-type',	'text/html')
				self.end_headers()
				self.wfile.write(f.read())
				f.close()
				return
			if self.path == "/controle.html":
				f = open(curdir + sep + "/controle.html") 
				self.send_response(200)
				self.send_header('Content-type',	'text/html')
				self.end_headers()
				self.wfile.write(f.read())
				f.close()
				print "oas bouge"
				return
			if self.path == "/droite.html":
				f = open(curdir + sep + "/controle.html") 
				self.send_response(200)
				self.send_header('Content-type',	'text/html')
				self.end_headers()
				self.wfile.write(f.read())
				f.close()
				BOUGE(0x8, 0.30)
				print "droite"
				return
			if self.path == "/gauche.html":
				f = open(curdir + sep + "/controle.html") 
				self.send_response(200)
				self.send_header('Content-type',	'text/html')
				self.end_headers()
				self.wfile.write(f.read())
				f.close()
				BOUGE(0x4, 0.30)
				print "gauche"
				return
			if self.path == "/haut.html":
				f = open(curdir + sep + "/controle.html") 
				self.send_response(200)
				self.send_header('Content-type',	'text/html')
				self.end_headers()
				self.wfile.write(f.read())
				f.close()
				BOUGE(0x2, 0.15)
				print "haut"
				return
			if self.path == "/bas.html":
				f = open(curdir + sep + "/controle.html") 
				self.send_response(200)
				self.send_header('Content-type',	'text/html')
				self.end_headers()
				self.wfile.write(f.read())
				f.close()
				BOUGE(0x1, 0.15)
				print "bas"
				return
			if self.path == "/feu.html":
				f = open(curdir + sep + "/controle.html") 
				self.send_response(200)
				self.send_header('Content-type',	'text/html')
				self.end_headers()
				self.wfile.write(f.read())
				f.close()
				BOUGE(0x10, 5)
				print "feu"
				return
			if self.path.endswith(".jpg"):   #our dynamic content
				self.send_response(200)
				self.send_header('Content-type',	'image/jpeg')
				self.end_headers()
				H_ImageWC = urllib.urlopen("http://10.0.0.250:8100/?action=snapshot")
				self.wfile.write(H_ImageWC.read())
				return                
			return
 
		except IOError:
			self.send_error(404,'File Not Found: %s' % self.path)
 
 
	def do_POST(self):
		global rootnode
		try:
			ctype, pdict = cgi.parse_header(self.headers.getheader('content-type'))
			if ctype == 'multipart/form-data':
				query=cgi.parse_multipart(self.rfile, pdict)
			self.send_response(301)
 
			self.end_headers()
			upfilecontent = query.get('upfile')
			print "filecontent", upfilecontent[0]
			self.wfile.write("<HTML>POST OK.<BR><BR>");
			self.wfile.write(upfilecontent[0]);
 
		except :
			pass
 
 
# Envoi d une sequence de mouvement
def BOUGE(V_Code, V_Temp):
		reqBuffer[0] = V_Code
		handle.controlMsg(reqType, usb.REQ_SET_CONFIGURATION, reqBuffer, value=usb.DT_CONFIG, index=0)
		time.sleep(V_Temp)
		reqBuffer[0] = 0x20
		handle.controlMsg(reqType, usb.REQ_SET_CONFIGURATION, reqBuffer, value=usb.DT_CONFIG, index=0)
 
# Initilisation du peripheriques
def INITUSB():
	# Liste de tous les peripheriques USB
	busses = usb.busses()
	for bus in busses:
		for dev in bus.devices:
			print dev.idVendor
			if dev.idVendor == 0x0A81 and dev.idProduct == 0x0701:
				rdev = dev
	dev = rdev
 
	# Bon c est pas beau mais cela fonctionne
	V_usb_OK = 1
	try:
		assert dev.idVendor == 0x0A81
		assert dev.idProduct == 0x0701
		# Si on execute cela c'est que tout va bien
		# On selection la configuration / l'interface / le protocole / l'endpoint en l'occurence il n'y en a qu'un de chaque donc on prend le premier
		conf = dev.configurations[0]
		iface = conf.interfaces[0][0]
		endpoint = iface.endpoints[0]
 
		# on demande l'ouverture du peripherique
		handle = dev.open()
		handle.reset()
		#handle.detachKernelDriver(iface.interfaceNumber)
		handle.setConfiguration(conf)
		handle.claimInterface(iface)
		handle.setAltInterface(iface)
		#handle.reset()
 
		# Initilisation du mot de 8 octect que l'on envoi au lance missile
		reqBuffer = [0] * 8
		# C'est en gros l'adresse a laquel on va envoyer le mot
		reqType = usb.TYPE_CLASS | usb.RECIP_INTERFACE | usb.ENDPOINT_OUT	
	except:
		V_usb_OK = 0
		print "Probleme de connection avec le lance missile"
		curses.endwin()
		sys.exit()
 
	# On initialise la bete
	reqBuffer[0] = 0x8
	handle.controlMsg(reqType, usb.REQ_SET_CONFIGURATION, reqBuffer, value=usb.DT_CONFIG, index=0)
	time.sleep(1)
	reqBuffer[0] = 0x4
	handle.controlMsg(reqType, usb.REQ_SET_CONFIGURATION, reqBuffer, value=usb.DT_CONFIG, index=0)
	time.sleep(1)
	reqBuffer[0] = 0x20
	handle.controlMsg(reqType, usb.REQ_SET_CONFIGURATION, reqBuffer, value=usb.DT_CONFIG, index=0)
 
def main():
	try:
		# Liste de tous les peripheriques USB
		busses = usb.busses()
		for bus in busses:
			for dev in bus.devices:
				print dev.idVendor
				if dev.idVendor == 0x0A81 and dev.idProduct == 0x0701:
					rdev = dev
		dev = rdev
 
		# Bon c est pas beau mais cela fonctionne
		V_usb_OK = 1
		try:
			assert dev.idVendor == 0x0A81
			assert dev.idProduct == 0x0701
			# Si on execute cela c'est que tout va bien
			# On selection la configuration / l'interface / le protocole / l'endpoint en l'occurence il n'y en a qu'un de chaque donc on prend le premier
			global conf
			global iface
			global endpoint
			conf = dev.configurations[0]
			iface = conf.interfaces[0][0]
			endpoint = iface.endpoints[0]
 
			# on demande l'ouverture du peripherique
			global handle
			handle = dev.open()
			handle.detachKernelDriver(iface.interfaceNumber)
			handle.setConfiguration(conf)
			handle.claimInterface(iface)
			handle.setAltInterface(iface)
			#handle.reset()
 
			# Initilisation du mot de 8 octect que l'on envoi au lance missile
			global reqBuffer
			reqBuffer = [0] * 8
			# C'est en gros l'adresse a laquel on va envoyer le mot
			global reqType
			reqType = usb.TYPE_CLASS | usb.RECIP_INTERFACE | usb.ENDPOINT_OUT	
		except:
			V_usb_OK = 0
			print "Probleme de connection avec le lance missile"
			sys.exit()
 
		# On initialise la bete
		reqBuffer[0] = 0x4
		handle.controlMsg(reqType, usb.REQ_SET_CONFIGURATION, reqBuffer, value=usb.DT_CONFIG, index=0)
		time.sleep(1)
		reqBuffer[0] = 0x20
		handle.controlMsg(reqType, usb.REQ_SET_CONFIGURATION, reqBuffer, value=usb.DT_CONFIG, index=0)	
		server = HTTPServer(('', 8101), MyHandler)
		print 'started httpserver...'
		server.serve_forever()
	except KeyboardInterrupt:
		print '^C received, shutting down server'
		server.socket.close()
 
if __name__ == '__main__':
	main()
 
# Boucle principal
#while 1:
#	stdscr.addstr(0,0,'PILOTAGE DU LANCE MISSILE  -  Q pour quitter : ',curses.color_pair(1))
#	key=-1
#	key=stdscr.getkey()
#	if key == 'd':
#		BOUGE(0x8, 0.30)
#	if key == 'q':
#		BOUGE(0x4, 0.30)
#	if key == 'z':
#		BOUGE(0x2, 0.15)
#	if key == 's':
#		BOUGE(0x1, 0.15)
#	if key == ' ':
#		BOUGE(0x10, 5.0)
#	if key == 'Q':
#		curses.endwin()
#		break

Le modèle de page (controle.html) pour le contrôle à distance utilise uniquement du html et du javascript => fonctionne même sur mon iphone

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Contrôle missiles</title>
</head>
<script type="text/javascript">
</script>
<body>
	<center>
	&nbsp;&nbsp;<INPUT TYPE="button" Value="haut" onclick="window.location='haut.html';"><br />
	<INPUT TYPE="button" Value="gauche" onclick="window.location='gauche.html';"> <INPUT TYPE="button" Value="FEU" onclick="window.location='feu.html';"> <INPUT TYPE="button" Value="droite" onclick="window.location='droite.html';"><br />
	&nbsp;&nbsp;<INPUT TYPE="button" Value="bas" onclick="window.location='bas.html';"><br />
	</center>
</body>
</html>
Categories: Projet Made by Sp@r0, Synology Tags:
  1. 09/12/2010 à 00:41 | #1

    salut, amusant, mais finalement, dans 1 systeme domotique, en tant que premier accueil pour les personnes malvaillantes… C’est un piste ca !
    c’est quoi ton but avec ce joujou ?
    A+

  2. 10/12/2010 à 00:50 | #2

    @Arnaud COGNARD
    Ben si seulement il y avait un but c’est un gadget pour rigoler ;)

Les commentaires sont fermés.