- Napięcie zasilające: 230 V AC/10 VA.
- Możliwość zasilenia serwomechanizmów z zewnętrznego źródła napięcia zasilającego lub z wbudowanego stabilizatora +5 V.
- Możliwość kontrolowania 4 serwomechanizmów.
- Położenie serwomechanizmów w wypadku zaniku transmisji: domyślne lub ostatnio ustawione (konfigurowane).
- Interfejs DMX, adres konfigurowany za pomocą zworek.
- Mikrokontroler ATmega168.
Napięcie sieciowe jest obniżane w transformatorze, następnie prostowane za pomocą mostka prostowniczego. Na potrzeby zasilania układów scalonych zastosowano stabilizator U1 dający na wyjściu napięcie +5 V. Może on również zasilać serwomechanizmy (założona zwora JP5), ale trzeba mieć świadomość, że zależnie od typu i obciążenia, serwomechanizmy mogą pobierać prąd większy niż 1 A. W takiej sytuacji należy podać odpowiednie napięcie zasilające, na przykład z zakresu 4…6 V, o odpowiedniej wydajności prądowej do złącza J8 oraz zdjąć zworę JP5. Dane DMX są konwertowane do poziomów TTL za pomocą układu U4. Zwora JP6 umożliwia załączenie terminatorów linii.
JP1 ustala adres DMX. Należy pamiętać, że sterownik zajmuje cztery kolejne adresy. U3 dekoduje dane DMX i generuje impulsy dla serwomechanizmów. Impulsy są generowane w przerwaniach Timera 1. Najistotniejszy fragment procedury inicjalizującej pokazano na listingu 1.
Listing 1. Najbardziej istotny fragment procedury inicjującej mikrokontroler
// Preskaler na 256, F = 16000000/64 = 250kHz, t = 4us
TCCR1B = ( CNT1_PRESCALER_64 );
TCNT1 = 0xFFFF - 2;
// Zezwolenie na IRQ od przepełnienia timera
TIMSK1 |= (1<<TOIE1);
Na listingu 2 zamieszczono procedurę generującą impulsy dla serwomechanizmów i przerwę synchronizującą.
Listing 2. Fragment procedury generującej impulsy dla serwomechanizmów i przerwę synchronizującą
/* Ustawiamy timer na czas w 4 * us, co da zakres: */
TCNT1 = 0xFFFF - ( TabServ[servo] + (1000/4) );
switch( servo )
/* ( 1000us / 4 + 0 ) * 4 = 1,000ms, ( 1000us / 4 + 128 ) * 4 = 1,512ms, (1000us / 4 + 256 ) * 4 = 2,024ms */
{
case( 0 ): SetS1(); break; // Ustawiamy Serwo1
case( 1 ): ClrS1(); SetS2(); break; // Ustawiamy Serwo2, kasujemy 1
case( 2 ): ClrS2(); SetS3(); break; // Ustawiamy Serwo3, kasujemy 2
case( 3 ): ClrS3(); SetS4(); break; // Ustawiamy Serwo4, kasujemy 3
case( 4 ): ClrS4(); // Kasujemy serwo
TCNT1 = 0xFFFF - (20000 / 4); // ustawiamy Sync 20ms
break;
}
servo++; if ( servo > 4 ) servo = 0;
W programie, za pomocą Timera 0 zrealizowano liczenie przekroczenie czasu (timeout) braku transmisji. Jeśli komendy nie docierają przez ponad 1 sekundę, serwomechanizmy są ustawiane w ostatniej pozycji lub przyjmą pozycję domyślną, zachowaną w pamięci EEPROM.
Montaż i uruchomienie
Montaż elementów jest typowy i nie wymaga szczegółowego omawiania. Płytka jest 1-warstwowa, co spowodowało konieczność zastosowania dwóch zworek. Pod mikrokontroler warto zastosować podstawkę.