Uživatel:Danekto5

Z MAM wiki

Přejít na: navigace, hledání

Obsah

[editovat] Semestrální práce - Ovládání otočného mechanismu kamery

[editovat] Zadání

Naším úkolem je navrhnout ovládání otočného mechanismu kamery, které bude mít dvě základní funkce. Jednou je automatický posun kamery (tam a zpět) a druhou manuální ovládání tlačítky "doleva" a "doprava".

[editovat] Realizace

Pro řízení pohybu kamery bude zapotřebí celkem 7 i/o pinů:

Vstupy:

  • přepínač automaticky/manuálně
  • spínač levého dorazu otočného mechanismu
  • spínač pravého dorazu otočného mechanismu
  • tlačítko manuálního ovládání "doleva"
  • tlačítko manuálního ovládání "doprava"

Výstupy:

  • výstup pro pohyb "doleva"
  • výstup pro pohyb "doprava"

V naší realizaci nám tedy bude stačit tedy 1 port, vybereme tedy např. PORTD. Z následujícího schématu jsou patrná přiřazení pinů jednotlivým funkcím.

Soubor:sem1.png

[editovat] Zdrojový kód

include, definice proměnných, v proměnné smer se uchovává aktuální směr otáčení.

#include <avr/io.h>
#include <util/delay.h>
#include <avr/iom88.h>

#define HIGH 0
#define LOW 1

#define AUTO 0
#define LEFT 1
#define RIGHT 2
#define B_LEFT 3
#define B_RIGHT 4
#define O_LEFT  6
#define O_RIGHT 7
#define DELAY 100

int smer = O_RIGHT;	

Následují jednotlivé funkce. Funkce automaticky, která je volána pro automatický posuv kamery. Nejprve jsou zjištěny stavy spínačů na jednotlivých dorazech a v případě sepnutí je změněn směr otáčení. Po určení požadovaného směru je kamera krokově posouvána, délku kroku jsme určili výše (DELAY).

int
automaticky ()
{
  if (!(PIND & (1<<PIND2)))
    {
      smer = O_LEFT;
    }
  else if (!(PIND & (1<<PIND1)))
    {
      smer = O_RIGHT;
    }

  if (smer == O_RIGHT)
    {
      PORTD |= 1<<PINB7;
      _delay_ms (DELAY);
      PORTD |= 0<<PINB7;
    }
  else
    {
      PORTD |= 1<<PINB6;
      _delay_ms (DELAY);
      PORTD |= 0<<PINB6;
    }

  return 0;
}

Další funkce obstarává ruční ovládání pohybu kamery. Zde kontrolujeme, zda jsou sepnuta tlačítka doleva, či doprava. Pokud ano, zkontrolujeme zda se již kamera nenachází v krajní poloze a je-li tak vůbec možný pohyb v daném směru. Pokud jsou podmínky splněny, je kamera posouvána stejně jako ve funkci "automaticky".

int
rucne ()
{
  if (!(PIND & (1<<PIND3))) 
    {
      if (PIND & (1<<PIND1)) 
	{
      PORTD |= 1<<PINB6;
      _delay_ms (DELAY);
      PORTD |= 0<<PINB6;
	}
    }
  else if (!(PIND & (1<<PIND4))) 
    {
      if (PIND & (1<<PIND2)) 
	{

      PORTD |= 1<<PINB7;
      _delay_ms (DELAY);
      PORTD |= 0<<PINB7;
	}
    }
  return 0;
}

Dále už je vlastní program. Nejprve jsou definovány vstupní/výstupní porty a zastaven případný pohyb kamery. Následuje nekonečná smyčka, která rozlišuje, zda je zvolen automatický nebo manuální mód.

int
main (void)
{
  DDRD = 0b11000000;		
  
  PORTD |= 0<<PINB6;
  PORTD |= 0<<PINB7;
  while (1)
    {				
      if (!(PIND & (1<<PIND0))) 
	{
	  automaticky ();	
	}
      else
	{
	  rucne ();
	}
    }
  return 0;
}
Osobní nástroje