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 #+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/.

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

View File

@ -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. &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"> <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>

View File

@ -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();
} }

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(); onemogociGumbe();
omogociGumbe(DOLZINA + PAVZA); omogociGumbe(DOLZINA + PAVZA);
}); });
} });

View File

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