Compare commits
9 Commits
Author | SHA1 | Date |
---|---|---|
Jurij Podgoršek | e03009c2e4 | |
Jurij Podgoršek | 3854ffd54e | |
Jure Podgorše | ea02fbaf63 | |
Jure Podgorše | f829d3c96b | |
Jure Podgorše | 2f896fac69 | |
Jure Podgorše | ffd3ede9c3 | |
Jure Podgorše | 9356828055 | |
Jurij Podgoršek | f4c5b9e954 | |
Jure Podgorše | fa47ab8757 |
|
@ -0,0 +1,3 @@
|
||||||
|
[submodule "mjpeg-relay"]
|
||||||
|
path = mjpeg-relay
|
||||||
|
url = https://github.com/OliverF/mjpeg-relay
|
|
@ -1,9 +1,10 @@
|
||||||
#+TITLE: Galerija BOT
|
#+TITLE: Galerija BOT
|
||||||
|
|
||||||
* Je?
|
[[file:observatorij.jpg]]
|
||||||
|
|
||||||
ESP32-CAM mikrokrmilnik, ki ga je možno upravljati po galeriji.
|
ESP32-CAM mikrokrmilnik, ki omogoča premikanje visečega objekta.
|
||||||
|
|
||||||
Pelje ga [[https://tasmota.github.io/docs/][Tasmota firmware]], s pomočjo katerega dobimo sliko kamere in poganjamo motorčke.
|
Pelje ga [[https://tasmota.github.io/docs/][Tasmota firmware]], s pomočjo katerega dobimo sliko kamere in poganjamo motorčke.
|
||||||
|
|
||||||
Z [[https://ffmpeg.org/][FFMPEG]] orodjem sliko kamere pretvorimo MJPEG videopretok v VP8 RTP obliko, ki jo [[https://janus.conf.meetecho.com/][Janus WebRTC strežnik]] z nizko zakasnitvijo pripelje v brskalnike. Sliko kamere spreljajo gumbi za navigacijo in poseben vmesnik za nastavljanje parametrov premikanja.
|
Ker se mikrokrmilnik sesuje, če več ljudi spremlja sliko, na bližnjem RockiPI 4 računalniku teče [[https://github.com/OliverF/mjpeg-relay][mjpeg-relay]], ki posreduje sliko obiskovalkam in obiskovalcem spletnega mesta https://observatorij.rhiz0.me/.
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Tole pozenemo iz rockpi plosce!
|
||||||
|
ssh -R 3343:192.168.32.1:4343 g1smo@kreten.si
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit b87d1c25d0876b067de68fe51a418d559f67beb4
|
|
@ -0,0 +1,11 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
source .env
|
||||||
|
|
||||||
|
# Inicializiraj kamero
|
||||||
|
url="$VIR/cm?cmnd=WcInit"
|
||||||
|
curl "$url"
|
||||||
|
|
||||||
|
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
|
||||||
|
cd $SCRIPT_DIR/mjpeg-relay
|
||||||
|
python2 relay.py http://localhost:8989/stream
|
Binary file not shown.
After Width: | Height: | Size: 140 KiB |
|
@ -0,0 +1,14 @@
|
||||||
|
[Unit]
|
||||||
|
Description=MJPEG relay
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
# Tuneliraj lokalni port 22 na streznikov port 2222
|
||||||
|
User=g1smo
|
||||||
|
ExecStart=/usr/bin/screen -DmS mjpeg-relay /home/g1smo/galerija-bot/mjpeg-relay.sh
|
||||||
|
RestartSec=5
|
||||||
|
Restart=always
|
||||||
|
Type=simple
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
|
@ -1,13 +1,18 @@
|
||||||
# Kompenzacija propelerjev
|
# Kompenzacija propelerjev
|
||||||
kompenzacija = 0.5
|
var kompenzacija = 0.5
|
||||||
|
|
||||||
# Kako dolgo cakam med ukazi (ms)?
|
# Kako dolgo cakam med ukazi (ms)?
|
||||||
cakaj = 3000
|
var cakaj = 3000
|
||||||
|
var dolzina = 6000
|
||||||
|
|
||||||
# Kako pogosto grem kar ravno (ms)?
|
# Kako pogosto grem kar ravno (ms)?
|
||||||
kar_naprej_cas = 10000
|
var kar_naprej_cas = 60 * 1000
|
||||||
|
|
||||||
zadnji = 0
|
var zadnji = 0
|
||||||
|
|
||||||
|
def kar_naprej() end
|
||||||
|
|
||||||
|
tasmota.add_cmd('KarNaprej', kar_naprej)
|
||||||
|
|
||||||
def ugasni_levo()
|
def ugasni_levo()
|
||||||
tasmota.set_power(0, false)
|
tasmota.set_power(0, false)
|
||||||
|
@ -19,12 +24,12 @@ end
|
||||||
|
|
||||||
def posodobi_zadnji(cas)
|
def posodobi_zadnji(cas)
|
||||||
zadnji = tasmota.millis() + cas
|
zadnji = tasmota.millis() + cas
|
||||||
kar_naprej()
|
#tasmota.cmd('KarNaprej')
|
||||||
end
|
end
|
||||||
|
|
||||||
# payload = kako dolgo naj bo vklopljen, v milisekundah
|
# payload = kako dolgo naj bo vklopljen, v milisekundah
|
||||||
def pojdi_levo(cmd, idx, payload, payload_json)
|
def pojdi_levo(cmd, idx, payload, payload_json)
|
||||||
if zadnji > tasmota.millis() + cakaj end
|
if tasmota.millis() < zadnji + cakaj return nil end
|
||||||
|
|
||||||
tasmota.set_power(0, true)
|
tasmota.set_power(0, true)
|
||||||
|
|
||||||
|
@ -32,12 +37,11 @@ def pojdi_levo(cmd, idx, payload, payload_json)
|
||||||
tasmota.set_timer(cas, ugasni_levo)
|
tasmota.set_timer(cas, ugasni_levo)
|
||||||
|
|
||||||
posodobi_zadnji(cas)
|
posodobi_zadnji(cas)
|
||||||
kar_naprej()
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# payload = kako dolgo naj bo vklopljen, v milisekundah
|
# payload = kako dolgo naj bo vklopljen, v milisekundah
|
||||||
def pojdi_desno(cmd, idx, payload, payload_json)
|
def pojdi_desno(cmd, idx, payload, payload_json)
|
||||||
if zadnji > tasmota.millis() + cakaj end
|
if tasmota.millis() < zadnji + cakaj return nil end
|
||||||
|
|
||||||
tasmota.set_power(1, true)
|
tasmota.set_power(1, true)
|
||||||
|
|
||||||
|
@ -54,30 +58,54 @@ end
|
||||||
|
|
||||||
# payload = kako dolgo naj bo vklopljen, v milisekundah
|
# payload = kako dolgo naj bo vklopljen, v milisekundah
|
||||||
def pojdi_ravno(cmd, idx, payload, payload_json)
|
def pojdi_ravno(cmd, idx, payload, payload_json)
|
||||||
if zadnji > tasmota.millis() + cakaj end
|
if tasmota.millis() < zadnji + cakaj return nil end
|
||||||
|
|
||||||
tasmota.set_power(0, true)
|
tasmota.set_power(0, true)
|
||||||
tasmota.set_power(1, true)
|
tasmota.set_power(1, true)
|
||||||
|
|
||||||
#tasmota.set_timer(int(payload), ugasni_vse)
|
#tasmota.set_timer(int(payload), ugasni_vse)
|
||||||
# Kompenziramo razliko v motorjih
|
# Kompenziramo razliko v motorjih
|
||||||
var cas = int(payload)
|
var cas = int(payload) * 2
|
||||||
tasmota.set_timer(int(cas * kompenzacija), ugasni_levo)
|
tasmota.set_timer(int(cas * kompenzacija), ugasni_levo)
|
||||||
tasmota.set_timer(cas, ugasni_desno)
|
tasmota.set_timer(cas, ugasni_desno)
|
||||||
|
|
||||||
posodobi_zadnji(cas)
|
posodobi_zadnji(cas)
|
||||||
end
|
end
|
||||||
|
|
||||||
def auto_naprej()
|
def odkimaj()
|
||||||
pojdi_ravno(nil, nil, 1000)
|
tasmota.set_power(2, false)
|
||||||
tasmota.set_timer(kar_naprej_cas, auto_naprej, "auto_naprej")
|
end
|
||||||
|
def pokimaj()
|
||||||
|
tasmota.set_power(2, true)
|
||||||
|
tasmota.set_timer(20, odkimaj)
|
||||||
end
|
end
|
||||||
|
|
||||||
def kar_naprej()
|
def auto_naprej()
|
||||||
tasmota.set_timer(kar_naprej_cas, auto_naprej, "auto_naprej")
|
if tasmota.millis() > zadnji + kar_naprej_cas * 0.9
|
||||||
|
pokimaj()
|
||||||
|
var n = tasmota.millis() % 3
|
||||||
|
|
||||||
|
if n == 0
|
||||||
|
pojdi_ravno(nil, nil, dolzina * 2)
|
||||||
|
elif n == 1
|
||||||
|
pojdi_levo(nil, nil, dolzina * 1.5)
|
||||||
|
else
|
||||||
|
pojdi_desno(nil, nil, dolzina)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
tasmota.set_timer(kar_naprej_cas, auto_naprej)
|
||||||
end
|
end
|
||||||
|
|
||||||
tasmota.add_cmd('PojdiLevo', pojdi_levo)
|
tasmota.add_cmd('PojdiLevo', pojdi_levo)
|
||||||
tasmota.add_cmd('PojdiDesno', pojdi_desno)
|
tasmota.add_cmd('PojdiDesno', pojdi_desno)
|
||||||
tasmota.add_cmd('PojdiRavno', pojdi_ravno)
|
tasmota.add_cmd('PojdiRavno', pojdi_ravno)
|
||||||
tasmota.add_cmd('UgasniVse', ugasni_vse)
|
tasmota.add_cmd('UgasniVse', ugasni_vse)
|
||||||
|
tasmota.add_cmd('KarNaprej', auto_naprej)
|
||||||
|
|
||||||
|
def inicializiraj()
|
||||||
|
tasmota.cmd('WcInit')
|
||||||
|
end
|
||||||
|
tasmota.set_timer(5000, inicializiraj)
|
||||||
|
|
||||||
|
tasmota.set_timer(kar_naprej_cas, auto_naprej)
|
|
@ -36,13 +36,13 @@
|
||||||
<body>
|
<body>
|
||||||
<section id="glavno">
|
<section id="glavno">
|
||||||
<h1>OBSERVATORIJ</h1>
|
<h1>OBSERVATORIJ</h1>
|
||||||
<h2>je umetniška instalacija, ki je del razstave Nevidni sopotnik v Mestni galeriji Nova Gorica. Spodnja konzola vam omogoča upravljanje tamkajšnjega lebdečega objekta.</h2>
|
<h2>je umetniška instalacija, ki je del razstave Opazovalna postaja K23 v MMC KIBELA v Mariboru. Spodnja konzola vam omogoča upravljanje tamkajšnjega lebdečega objekta.</h2>
|
||||||
|
|
||||||
|
|
||||||
<section class="zaslon">
|
<section class="zaslon">
|
||||||
<!--video id="videofeed" muted="" autoplay="" playsinline=""></video-->
|
<!--video id="videofeed" muted="" autoplay="" playsinline=""></video-->
|
||||||
<img id="videofeed" src="/stream"></video>
|
<img id="videofeed" src="/stream"></video>
|
||||||
<button id="predvajaj">⏵</button>
|
<!--button id="predvajaj">⏵</button-->
|
||||||
|
|
||||||
<section class="gumbi">
|
<section class="gumbi">
|
||||||
<button id="levo"></button>
|
<button id="levo"></button>
|
||||||
|
@ -55,7 +55,7 @@
|
||||||
<p>Avtor: BOŠTJAN DRINOVEC</p>
|
<p>Avtor: BOŠTJAN DRINOVEC</p>
|
||||||
<p>programiranje: JURIJ PODGORŠEK</p>
|
<p>programiranje: JURIJ PODGORŠEK</p>
|
||||||
<p>elektronika: BORUT SAVSKI</p>
|
<p>elektronika: BORUT SAVSKI</p>
|
||||||
<p>produkcija: Mestna galerija Nova Gorica in Boštjan Drinovec, 2023</p>
|
<!--p>produkcija: Mestna galerija Nova Gorica in Boštjan Drinovec, 2023</p-->
|
||||||
</section>
|
</section>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
|
|
@ -4,18 +4,24 @@ function xhttp() {
|
||||||
|
|
||||||
window.peljiLevo = function () {
|
window.peljiLevo = function () {
|
||||||
var xh = xhttp();
|
var xh = xhttp();
|
||||||
xh.open('GET', "/cm?cmnd=PojdiLevo%20" + DOLZINA);
|
//xh.open('GET', "/cm?cmnd=PojdiLevo%20" + DOLZINA);
|
||||||
|
xh.open('GET', "/cm/PojdiLevo");
|
||||||
|
|
||||||
xh.send();
|
xh.send();
|
||||||
}
|
}
|
||||||
|
|
||||||
window.peljiDesno = function () {
|
window.peljiDesno = function () {
|
||||||
var xh = xhttp();
|
var xh = xhttp();
|
||||||
xh.open('GET', "/cm?cmnd=PojdiDesno%20" + DOLZINA);
|
//xh.open('GET', "/cm?cmnd=PojdiDesno%20" + DOLZINA);
|
||||||
|
xh.open('GET', "/cm/PojdiDesno");
|
||||||
|
|
||||||
xh.send();
|
xh.send();
|
||||||
}
|
}
|
||||||
|
|
||||||
window.peljiRavno = function () {
|
window.peljiRavno = function () {
|
||||||
var xh = xhttp();
|
var xh = xhttp();
|
||||||
xh.open('GET', "/cm?cmnd=PojdiRavno%20" + DOLZINA);
|
//xh.open('GET', "/cm?cmnd=PojdiRavno%20" + DOLZINA);
|
||||||
|
xh.open('GET', "/cm/PojdiRavno");
|
||||||
|
|
||||||
xh.send();
|
xh.send();
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
var server = null;
|
||||||
|
//if(window.location.protocol === 'http:')
|
||||||
|
//server = "http://" + window.location.hostname + ":8088/janus";
|
||||||
|
//else
|
||||||
|
//server = "https://" + window.location.hostname + ":8089/janus";
|
||||||
|
//server = window.location.protocol + '//' + window.location.hostname + '/janus';
|
||||||
|
//server = window.location.protocol + '//' + window.location.hostname + ':8089/janus';
|
||||||
|
//server = '/janus';
|
||||||
|
//server = "ws://" + window.location.hostname + ":8188/";
|
||||||
|
//server = "ws://" + window.location.hostname + ":8188/";
|
||||||
|
//server = "wss://" + window.location.hostname + ":8989/";
|
||||||
|
server = "wss://janus.rhiz0.me/";
|
||||||
|
//server = '/janus';
|
||||||
|
|
||||||
|
var turnUrl = 'turn:turn.rhiz0.me:5349';
|
||||||
|
//var stunUrl = 'stun:turn.rhiz0.me:5349';
|
||||||
|
var turnUser = 'turnserver';
|
||||||
|
var turnPass = '85ThXzKLce2oZkXz76tM0tibWL88Ik';
|
||||||
|
|
||||||
|
var iceServers = [{
|
||||||
|
urls: turnUrl,
|
||||||
|
username: turnUser,
|
||||||
|
credential: turnPass
|
||||||
|
}]
|
||||||
|
|
||||||
|
var BOT="http://192.168.32.139/";
|
||||||
|
|
||||||
|
// Koliko milisekund se naj vrtijo propelerji?
|
||||||
|
var DOLZINA=1000;
|
||||||
|
var PAVZA=1000;
|
|
@ -46,4 +46,4 @@ window.addEventListener('DOMContentLoaded', function () {
|
||||||
onemogociGumbe();
|
onemogociGumbe();
|
||||||
omogociGumbe(DOLZINA + PAVZA);
|
omogociGumbe(DOLZINA + PAVZA);
|
||||||
});
|
});
|
||||||
}
|
});
|
||||||
|
|
12
www/stil.css
12
www/stil.css
|
@ -38,6 +38,7 @@ h2 {
|
||||||
}
|
}
|
||||||
|
|
||||||
#videofeed {
|
#videofeed {
|
||||||
|
display: block;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: auto;
|
height: auto;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
|
@ -46,7 +47,8 @@ h2 {
|
||||||
border-top-right-radius: 50% 12%;
|
border-top-right-radius: 50% 12%;
|
||||||
border-bottom-left-radius: 50% 12%;
|
border-bottom-left-radius: 50% 12%;
|
||||||
border-bottom-right-radius: 50% 12%;
|
border-bottom-right-radius: 50% 12%;
|
||||||
min-height: 482.5px;
|
/*min-height: 482.5px;*/
|
||||||
|
min-height: 250px;
|
||||||
}
|
}
|
||||||
|
|
||||||
#predvajaj {
|
#predvajaj {
|
||||||
|
@ -71,7 +73,7 @@ h2 {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.cakam:after {
|
#videofeed:before {
|
||||||
display: block;
|
display: block;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
content: 'Nalaganje...';
|
content: 'Nalaganje...';
|
||||||
|
@ -90,7 +92,7 @@ h2 {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
display: none;
|
/*display: none;*/
|
||||||
}
|
}
|
||||||
|
|
||||||
.gumbi button {
|
.gumbi button {
|
||||||
|
@ -117,12 +119,12 @@ button[disabled] {
|
||||||
}
|
}
|
||||||
|
|
||||||
#levo {
|
#levo {
|
||||||
left: 5rem;
|
left: calc(20% - 2rem);
|
||||||
bottom: 2rem;
|
bottom: 2rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
#desno {
|
#desno {
|
||||||
right: 5rem;
|
right: calc(20% - 2rem);
|
||||||
bottom: 2rem;
|
bottom: 2rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue