Stránka 1 z 1

Ovládání zvuku v divadle

Napsal: 01 kvě 2021, 11:51
od batcom
Zdravím,
potřeboval bych pomoc vytvořit kód.
Situace: v divadle dělám zvukaře. Potřebuji aby mi zmáčknuté tlačitko na jevišti spustilo zadanou klávesu v PC ( zvukové studio ).
Příklad - herec u dveří zmáčkne tlačítko dá přes relé signál do Leonarda - ten zmáčkne v PC klávesu T nebo P a pustí se zvuk zvonku z PC . Protože je to na jeviště cca 30 metrů, tak mám připojený zdroj 24VDC ( kvůli odporu kabelu - 5V by asi signál nezvládl ),
který pošle přes tlačítko signál do polovodičového relé. Z relé přes výstup NO pošlu signál do desky Leonardo . Mám dvě tlačítka - takže dva vstupy.
Potebuji spustit jedním tlačítkem klávesu T , druhým klávesu P . Klávesa T - pin 2 , klávesa P - pin 3 .
Potřebuji ale aby mi šli zvuky pustit i společně. Zkoušel jsem nějaké hotové programy, ale ty mají zásadní chybu. Je tam delay, zmáčknutí klávesy se při malém delay opakuje , při velkém delay se zas klávesa zaznamená se zpožděním.
Já potřebuji vstup delay IN - max 10 ms - klávesa se musí zmáčknout hned a jen jednou - aby zvuk nejel opakovaně. To znamená Impulz na hranu - i kdyby herec držel tlačítko 3 sekundy - zvuk to pořád pustí jen jeden.
Můžete mi prosím někdo pomoct???
Děkuji
ImageXXX.jpeg
Toto jsem zkoušel, ale není to dobré:

Kód: Vybrat vše

#include <Keyboard.h>


void setup()
{
  Serial.begin(9600);
  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  Keyboard.begin();
}

void loop()
{
  if (digitalRead(2) == LOW)
  {
    Keyboard.write('T'); // send a 'T' to the computer via Keyboard HID 
    delay(1000);  // delay so there aren't a kajillion z's
    }
    if (digitalRead(3) == LOW)
  
    Keyboard.write('P'); // send a 'P' to the computer via Keyboard HID 
    delay(1000);  // delay so there aren't a kajillion z's
Keyboard.end();
    }

Re: Ovládání zvuku v divadle

Napsal: 01 kvě 2021, 15:47
od gilhad
https://www.arduino.cc/en/Tutorial/Buil ... thoutDelay

takhle muzes v loop v pohode mit tech vstupu a vystupu bambilion a navzajem se neblokujou

obecne postup
- jakmile je tlacitko stisknuto (LOW) tak vis, ze i kdyz treba jeste zakmitava, tak stisknute bylo - tedy akci muzes spustit okamzite, az pak cekat na debounce tlacitka
- az uplyne debounce tlacitka, tak budes cekat na jeho pusteni (tedy HIGH) pak tam das zase debounce a pak povolist spusteni akce
- kdyz to budes delat prez millis, nikoli delay, tak to muzes naflakat za sebe do loop a bude to reagovat ihned

Pseudo kod (nechce se mi myslet a ladit to bez arduina, tak si to dolad sam)

Kód: Vybrat vše

#define Pin_T 2
#define Pin_P 3

unsigned long T_millis, P_millis; // rovno nule
bool T_state, T_enabled, P_state, P_enabled;

unsigned long debounce=1000; // 1 sec = 1000 millis


void setup()
{
// ...
// stavajici kod plus niva inicializace
T_state=UP;
T_enabled=TRUE;
P_state=UP;
P_enabled=TRUE;
}


void loop() {
	unsigned long now=millis(); // staci mi jeden rozhodny okamzik
	bool state; // sem dam stav tlacitka, at ho ctu jen jednou a nemuze mi v pulce rozhodovani zakmitnout
	
	// T
	state=digitalRead(Pin_T);
	if ( !T_enabled && (now - T_millis > debounce)) { // pokud debounce dobehl,tak nastavim Enabled
		T_enabled=TRUE;
		};
	if (T_enabled && (T_state != state) ) { // zmena (jiny stav) po debouncu = hrana vzestupna/sestupna
		T_state = state;
		T_enabled=FALSE; // debouncujeme ...
		T_milis=now; // ... od ted
		if (T_state==LOW) { // sem se dostameme jen jednou pri stisknuti, pak uz plati T_state==state a cely blok se preskoci (dokud nedojde ke zmene a ta pak musi byt na HIGH, vic moznosti neni)
			Keyboard.write('T');
		};
	};

	// P
	state=digitalRead(Pin_P);
	if ( !P_enabled && (now - P_millis > debounce)) {
		P_enabled=TRUE;
		};
	if (P_enabled && (P_state != state) ) { // hrana
		P_state = state;
		P_enabled=FALSE;
		P_milis=now;
		if (P_state==LOW) {
			Keyboard.write('P');
		};
	};

}


Re: Ovládání zvuku v divadle

Napsal: 01 kvě 2021, 16:50
od batcom
Ahoj, díky... ale ten kód si sám neopravím. Nemám s tím žádné zkušenosti. Vše dělám přes klasické PLC ( většinou Omron nebo malé aplikace SE - zelio ) , ale PLC nespojím jako keyboard. A je to moc velké. Arduino se mi zdálo na toto super.
Proto jsem si Arduino koupil , abych to nějak dokázal, ale v práci fakt v automatizaci pracuji s něčím jiným.
Tento projekt mám do divadla, tak si to chci nějak "rozjet" , ale bez pomoci to nedám.
Můžeš mi s tím prosím pomoct.
Dostaneš lístek do divadla :)
Díky