Commit b5133291 authored by hazaa's avatar hazaa

cleanup ; added websocket in telepresence

parent 68ee7f26
......@@ -17,7 +17,7 @@ Sommaire:
Les sujets:
* 2019-2020 : [NILM](docs/nilm.md)
* 2019-2020 : [NILM](docs/nilm.md), [BLDC](docs/tp-motor-bldc.md)
* 2018-2019 : [robot mobile](docs/mobile_robot2.md) (groupe A1), [seed watch](docs/seed_watch.md)(groupe B1).
* 2017-2018 : [Convoyeur et tri visuel d'objets](docs/convoyeur.md)
......
......@@ -81,6 +81,20 @@
websocket.close();
}
document.onkeydown = function (e) {
switch (e.key) {
case 'ArrowUp':
// up arrow
break;
case 'ArrowDown':
// down arrow
break;
case 'ArrowLeft':
// left arrow
break;
case 'ArrowRight':
// right arrow
}
</script>
......
'''
The MIT License (MIT)
Copyright (c) 2013 Dave P.
https://github.com/dpallot/simple-websocket-server
'''
import signal
import sys
import ssl
from SimpleWebSocketServer import WebSocket, SimpleWebSocketServer, SimpleSSLWebSocketServer
from optparse import OptionParser
class SimpleEcho(WebSocket):
def handleMessage(self):
print self.data
self.sendMessage(self.data)
def handleConnected(self):
print 'connected'
def handleClose(self):
pass
clients = []
class SimpleChat(WebSocket):
def handleMessage(self):
for client in clients:
if client != self:
client.sendMessage(self.address[0] + u' - ' + self.data)
def handleConnected(self):
print (self.address, 'connected')
for client in clients:
client.sendMessage(self.address[0] + u' - connected')
clients.append(self)
def handleClose(self):
clients.remove(self)
print (self.address, 'closed')
for client in clients:
client.sendMessage(self.address[0] + u' - disconnected')
if __name__ == "__main__":
parser = OptionParser(usage="usage: %prog [options]", version="%prog 1.0")
parser.add_option("--host", default='', type='string', action="store", dest="host", help="hostname (localhost)")
parser.add_option("--port", default=8000, type='int', action="store", dest="port", help="port (8000)")
parser.add_option("--example", default='echo', type='string', action="store", dest="example", help="echo, chat")
parser.add_option("--ssl", default=0, type='int', action="store", dest="ssl", help="ssl (1: on, 0: off (default))")
parser.add_option("--cert", default='./cert.pem', type='string', action="store", dest="cert", help="cert (./cert.pem)")
parser.add_option("--key", default='./key.pem', type='string', action="store", dest="key", help="key (./key.pem)")
parser.add_option("--ver", default=ssl.PROTOCOL_TLSv1, type=int, action="store", dest="ver", help="ssl version")
(options, args) = parser.parse_args()
cls = SimpleEcho
if options.example == 'chat':
cls = SimpleChat
if options.ssl == 1:
server = SimpleSSLWebSocketServer(options.host, options.port, cls, options.cert, options.key, version=options.ver)
else:
server = SimpleWebSocketServer(options.host, options.port, cls)
def close_sig_handler(signal, frame):
server.close()
sys.exit()
signal.signal(signal.SIGINT, close_sig_handler)
server.serveforever()
This diff is collapsed.
'''
The MIT License (MIT)
Copyright (c) 2013 Dave P.
https://github.com/dpallot/simple-websocket-server
modified by A.Hazan
'''
import signal
import sys
from SimpleWebSocketServer import WebSocket, SimpleWebSocketServer
from optparse import OptionParser
class SimpleEcho(WebSocket):
def handleMessage(self):
print self.data
self.sendMessage(self.data)
if(self.data=="led1"):
print "call script toggle led1"
def handleConnected(self):
print 'connected'
def handleClose(self):
pass
if __name__ == "__main__":
parser = OptionParser(usage="usage: %prog [options]", version="%prog 1.0")
parser.add_option("--host", default='', type='string', action="store", dest="host", help="hostname (localhost)")
parser.add_option("--port", default=8000, type='int', action="store", dest="port", help="port (8000)")
(options, args) = parser.parse_args()
cls = SimpleEcho
server = SimpleWebSocketServer(options.host, options.port, cls)
def close_sig_handler(signal, frame):
server.close()
sys.exit()
signal.signal(signal.SIGINT, close_sig_handler)
server.serveforever()
<!DOCTYPE html>
<meta charset="utf-8" />
<title>WebSocket Test</title>
<script language="javascript" type="text/javascript">
function init()
{
document.myform.url.value = "ws://localhost:8000/"
document.myform.inputtext.value = "Hello World!"
document.myform.disconnectButton.disabled = true;
}
function doConnect()
{
websocket = new WebSocket(document.myform.url.value);
websocket.onopen = function(evt) { onOpen(evt) };
websocket.onclose = function(evt) { onClose(evt) };
websocket.onmessage = function(evt) { onMessage(evt) };
websocket.onerror = function(evt) { onError(evt) };
}
function onOpen(evt)
{
writeToScreen("connected\n");
document.myform.connectButton.disabled = true;
document.myform.disconnectButton.disabled = false;
}
function onClose(evt)
{
writeToScreen("disconnected\n");
document.myform.connectButton.disabled = false;
document.myform.disconnectButton.disabled = true;
}
function onMessage(evt)
{
writeToScreen("response: " + evt.data + '\n');
}
function onError(evt)
{
writeToScreen('error: ' + evt.data + '\n');
websocket.close();
document.myform.connectButton.disabled = false;
document.myform.disconnectButton.disabled = true;
}
function doSend(message)
{
writeToScreen("sent: " + message + '\n');
websocket.send(message);
}
function writeToScreen(message)
{
document.myform.outputtext.value += message
document.myform.outputtext.scrollTop = document.myform.outputtext.scrollHeight;
}
window.addEventListener("load", init, false);
function sendText() {
doSend( document.myform.inputtext.value );
}
function clearText() {
document.myform.outputtext.value = "";
}
function doDisconnect() {
websocket.close();
}
function led1(){
doSend("led1");
}
document.onkeydown = function (e) {
switch (e.key) {
case 'ArrowUp':
// up arrow
break;
case 'ArrowDown':
// down arrow
break;
case 'ArrowLeft':
// left arrow
break;
case 'ArrowRight':
led1();// right arrow
}
};
</script>
<div id="output"></div>
<form name="myform">
<p>
<textarea name="outputtext" rows="20" cols="50"></textarea>
</p>
<p>
<textarea name="inputtext" cols="50"></textarea>
</p>
<p>
<textarea name="url" cols="50"></textarea>
</p>
<p>
<input type="button" name=sendButton value="Send" onClick="sendText();">
<input type="button" name=clearButton value="Clear" onClick="clearText();">
<input type="button" name=disconnectButton value="Disconnect" onClick="doDisconnect();">
<input type="button" name=connectButton value="Connect" onClick="doConnect();">
<input type="button" name=led1Button value="led1" onClick="led1();">
</p>
</form>
<img src="http://192.168.2.246:9000/mjpg"/>
</html>
<!DOCTYPE html>
<meta charset="utf-8" />
<title>WebSocket Test</title>
<script type="text/javascript" src="../qr/instascan.min.js"></script>
<script language="javascript" type="text/javascript">
function init()
{
document.myform.url.value = "ws://localhost:9999/"
document.myform.inputtext.value = "Hello World!"
document.myform.disconnectButton.disabled = true;
}
function doConnect()
{
websocket = new WebSocket(document.myform.url.value);
websocket.onopen = function(evt) { onOpen(evt) };
websocket.onclose = function(evt) { onClose(evt) };
websocket.onmessage = function(evt) { onMessage(evt) };
websocket.onerror = function(evt) { onError(evt) };
}
function onOpen(evt)
{
writeToScreen("connected\n");
document.myform.connectButton.disabled = true;
document.myform.disconnectButton.disabled = false;
}
function onClose(evt)
{
writeToScreen("disconnected\n");
document.myform.connectButton.disabled = false;
document.myform.disconnectButton.disabled = true;
}
function onMessage(evt)
{
writeToScreen("response: " + evt.data + '\n');
}
function onError(evt)
{
writeToScreen('error: ' + evt.data + '\n');
websocket.close();
document.myform.connectButton.disabled = false;
document.myform.disconnectButton.disabled = true;
}
function doSend(message)
{
writeToScreen("sent: " + message + '\n');
websocket.send(message);
}
function writeToScreen(message)
{
document.myform.outputtext.value += message
document.myform.outputtext.scrollTop = document.myform.outputtext.scrollHeight;
}
window.addEventListener("load", init, false);
function sendText() {
doSend( document.myform.inputtext.value );
}
function clearText() {
document.myform.outputtext.value = "";
}
function doDisconnect() {
websocket.close();
}
let scanner = new Instascan.Scanner({ video: document.getElementById('preview'),refractoryPeriod:100 });
scanner.addListener('scan', function (content) {
websocket.send(content);
console.log(content);
});
Instascan.Camera.getCameras().then(function (cameras) {
if (cameras.length > 0) {
scanner.start(cameras[0]);
} else {
console.error('No cameras found.');
}
}).catch(function (e) {
console.error(e);
});
</script>
<body>
<video id="preview"></video>
</body>
<div id="output"></div>
<form name="myform">
<p>
<textarea name="outputtext" rows="20" cols="50"></textarea>
</p>
<p>
<textarea name="inputtext" cols="50"></textarea>
</p>
<p>
<textarea name="url" cols="50"></textarea>
</p>
<p>
<input type="button" name=sendButton value="Send" onClick="sendText();">
<input type="button" name=clearButton value="Clear" onClick="clearText();">
<input type="button" name=disconnectButton value="Disconnect" onClick="doDisconnect();">
<input type="button" name=connectButton value="Connect" onClick="doConnect();">
</p>
</form>
</html>
This diff is collapsed.
Moteur brushless
======
bldc: brushless dc
* https://fr.wikipedia.org/wiki/Moteur_sans_balais, https://www.electromecanique.net/2015/01/principe-de-fonctionnement-dun-moteur.html
* cours [cachan](http://www.geea.org/IMG/pdf/MSAP_ENS_Multon.pdf). Extrait "Selon la forme de la force électromotrice ou d’autres critères (économique notamment) on alimentera la machine en quasi-créneaux de courant ou de tension ou en courant sinusoïdal. Dans le premier cas on parle plutôt de « machine à courant continu sans balai ou brushless DC motor », dans lesecond cas de « machine synchrone autopilotée ou brushless synchronous motor"
* commande avec arduino, pont en H, pas de capteurs: http://elabz.com/bldc-motor-with-arduino-circuit-and-software/
* commande en position (step 8):https://www.instructables.com/id/DIY-Brushless-Gimbal-with-Arduino/
* modélisation matlab, commande avec onduleur http://dirac.epucfe.eu/projets/wakka.php?wiki=P09A03index
......@@ -20,7 +20,7 @@ Il se connecte sur le serveur.
Attention: Firefox ne semble pas compatible, il faut essayer un autre navigateur.
Par exemple, téléchargez chromium sur chromium.org. Vous obtenez un fichier google-chrome-stable_current_amd64.deb
Le décompacter. Aller dans le répertoire google-chrome-stable_current_amd64 et décompactez data.tar.gz .
Le décompacter. Aller dans le répertoire google-chrome-stable_current_amd64 et décompactez data.tar.gz .
Ouvrez un terminal, allez dans data/opt/google puis tapez ./chrome
Liens:
......@@ -31,12 +31,24 @@ Serveur de commande à distance du robot
------
Dans cette partie on crée un serveur qui permet de commander le robot.
Modifiez le code côté serveur [code/UI/cgi](../code/UI/cgi) pour ajouter sur la page web:
On utilisera les fichiers dans le répertoire [code/UI/websocket](../code/UI/websocket).
![schema](fig/schema_websocket_telepresence.png
Coté raspi, lancer 2 serveurs:
* un qui sert les fichiers html au browser d'une autre machine (on a déjà vu comment faire avec python).
* un serveur qui écoute le traffic websocket et commande l'arduino.
Côté pc de bureau, connectez-vous à la raspi pour récupérer la page websocket.html.
Puis cliquer sur connecter.
Vérifier que la communication fonctionne entre votre navigateur et le serveur de websocket sur la raspi.
Modifiez le code côté serveur [code/UI/websocket](../code/UI/websocket) pour ajouter sur la page web:
1. un bouton qui permet de lancer un print côté serveur.
1. un bouton qui permet d'allumer une led sur l'arduino.
1. un bouton qui permet de faire tourner un moteur sur l'arduino (rotation dans un seul sens).
1. des boutons qui permettent de commander les deux moteurs du robot (rotation de chaque moteur dans un seul sens).
1. idem pour l'autre moteur
1. une information sur l'état du robot: état d'un pin digital 0/1, état d'un pin analogique.
Liens:
......@@ -50,6 +62,9 @@ Serveur de streaming + commande à distance du robot
En utilisant ce qui précède, codez un serveur qui permet à la fois de streamer et de commander le robot.
Il faudra lancer un troisième serveur côté raspi, celui qui gère l'image.
Attention: il y aura une balise à ajouter dans websocket.html
Liens
------
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment