Compare commits

...

9 Commits
sbc ... master

Author SHA1 Message Date
Jurij Podgoršek e03009c2e4 Readme update, dodana slika 2024-04-02 02:51:26 +02:00
Jurij Podgoršek 3854ffd54e Skripte za pomoc pri resevanju problemov, posodobitev teksta 2023-12-21 17:30:32 +01:00
Jure Podgorše ea02fbaf63 Manjsi popravek stilov, mjpeg relay skripta in systemd service 2023-06-09 18:44:47 +02:00
Jure Podgorše f829d3c96b Fiksirani endpointi za premike 2023-06-09 18:43:40 +02:00
Jure Podgorše 2f896fac69 mjpeg relay skripte 2023-06-06 16:33:42 +02:00
Jure Podgorše ffd3ede9c3 mjpeg relay v pythonu 2023-06-06 16:00:19 +02:00
Jure Podgorše 9356828055 Popravljeni stili, izboljsave 2023-06-06 16:00:19 +02:00
Jurij Podgoršek f4c5b9e954 Tasmota - incializacija, tweakanje dolzin 2023-06-06 15:57:38 +02:00
Jure Podgorše fa47ab8757 popravek tasmote 2023-06-06 13:26:44 +02:00
13 changed files with 130 additions and 30 deletions

3
.gitmodules vendored 100644
View File

@ -0,0 +1,3 @@
[submodule "mjpeg-relay"]
path = mjpeg-relay
url = https://github.com/OliverF/mjpeg-relay

View File

@ -1,9 +1,10 @@
#+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.
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/.

View File

@ -0,0 +1,4 @@
#!/bin/bash
# Tole pozenemo iz rockpi plosce!
ssh -R 3343:192.168.32.1:4343 g1smo@kreten.si

1
mjpeg-relay 160000

@ -0,0 +1 @@
Subproject commit b87d1c25d0876b067de68fe51a418d559f67beb4

11
mjpeg-relay.sh 100755
View File

@ -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

BIN
observatorij.jpg 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

View File

@ -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

View File

@ -1,13 +1,18 @@
# Kompenzacija propelerjev
kompenzacija = 0.5
var kompenzacija = 0.5
# Kako dolgo cakam med ukazi (ms)?
cakaj = 3000
var cakaj = 3000
var dolzina = 6000
# 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()
tasmota.set_power(0, false)
@ -19,12 +24,12 @@ end
def posodobi_zadnji(cas)
zadnji = tasmota.millis() + cas
kar_naprej()
#tasmota.cmd('KarNaprej')
end
# payload = kako dolgo naj bo vklopljen, v milisekundah
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)
@ -32,12 +37,11 @@ def pojdi_levo(cmd, idx, payload, payload_json)
tasmota.set_timer(cas, ugasni_levo)
posodobi_zadnji(cas)
kar_naprej()
end
# payload = kako dolgo naj bo vklopljen, v milisekundah
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)
@ -54,30 +58,54 @@ end
# payload = kako dolgo naj bo vklopljen, v milisekundah
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(1, true)
#tasmota.set_timer(int(payload), ugasni_vse)
# Kompenziramo razliko v motorjih
var cas = int(payload)
var cas = int(payload) * 2
tasmota.set_timer(int(cas * kompenzacija), ugasni_levo)
tasmota.set_timer(cas, ugasni_desno)
posodobi_zadnji(cas)
end
def auto_naprej()
pojdi_ravno(nil, nil, 1000)
tasmota.set_timer(kar_naprej_cas, auto_naprej, "auto_naprej")
def odkimaj()
tasmota.set_power(2, false)
end
def pokimaj()
tasmota.set_power(2, true)
tasmota.set_timer(20, odkimaj)
end
def kar_naprej()
tasmota.set_timer(kar_naprej_cas, auto_naprej, "auto_naprej")
def 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
tasmota.add_cmd('PojdiLevo', pojdi_levo)
tasmota.add_cmd('PojdiDesno', pojdi_desno)
tasmota.add_cmd('PojdiRavno', pojdi_ravno)
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)

View File

@ -36,13 +36,13 @@
<body>
<section id="glavno">
<h1>OBSERVATORIJ</h1>
<h2>je umetniška instalacija, ki je del razstave Nevidni sopotnik v Mestni galeriji Nova Gorica. &nbsp;&nbsp;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. &nbsp;&nbsp;Spodnja konzola vam omogoča upravljanje tamkajšnjega lebdečega objekta.</h2>
<section class="zaslon">
<!--video id="videofeed" muted="" autoplay="" playsinline=""></video-->
<img id="videofeed" src="/stream"></video>
<button id="predvajaj"></button>
<!--button id="predvajaj">⏵</button-->
<section class="gumbi">
<button id="levo"></button>
@ -55,7 +55,7 @@
<p>Avtor: BOŠTJAN DRINOVEC</p>
<p>programiranje: JURIJ PODGORŠEK</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>

View File

@ -4,18 +4,24 @@ function xhttp() {
window.peljiLevo = function () {
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();
}
window.peljiDesno = function () {
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();
}
window.peljiRavno = function () {
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();
}

View File

@ -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;

View File

@ -46,4 +46,4 @@ window.addEventListener('DOMContentLoaded', function () {
onemogociGumbe();
omogociGumbe(DOLZINA + PAVZA);
});
}
});

View File

@ -38,6 +38,7 @@ h2 {
}
#videofeed {
display: block;
width: 100%;
height: auto;
box-sizing: border-box;
@ -46,7 +47,8 @@ h2 {
border-top-right-radius: 50% 12%;
border-bottom-left-radius: 50% 12%;
border-bottom-right-radius: 50% 12%;
min-height: 482.5px;
/*min-height: 482.5px;*/
min-height: 250px;
}
#predvajaj {
@ -71,7 +73,7 @@ h2 {
display: none;
}
.cakam:after {
#videofeed:before {
display: block;
position: absolute;
content: 'Nalaganje...';
@ -90,7 +92,7 @@ h2 {
position: absolute;
bottom: 0;
width: 100%;
display: none;
/*display: none;*/
}
.gumbi button {
@ -117,12 +119,12 @@ button[disabled] {
}
#levo {
left: 5rem;
left: calc(20% - 2rem);
bottom: 2rem;
}
#desno {
right: 5rem;
right: calc(20% - 2rem);
bottom: 2rem;
}