niedziela, 27 marca 2011

DIY: Ręczny wyświetlacz widmowy na ATmega88

Autor: Aldaris
Redakcja: Dondu


Na wstępie odpowiedzmy sobie na pytanie czym właściwie jest wyświetlacz widmowy?

Jak sama nazwa wskazuje, wyświetlany obraz stanowi widmo, czyli wykorzystujemy bezwładność oka ludzkiego i oszukujemy własny wzrok. Dzięki temu możemy użyć jednowymiarowej linii złożonej np. z diod LED, którą odpowiednio szybko poruszając oszukamy własne oczy i stworzymy wrażenie dwuwymiarowej płaszczyzny obrazu!




... wyświetlacz wygląda tak:




... i działa następująco:







Zasada działania


Schemat blokowy wyświetlacza widmowego


Układ zasilany jest z akumulatora 3,6 V, litowo-jonowego o pojemności 2200mA. Zabezpieczenie stanowi dioda Schottky'ego, na której spadek napięcia wynosi około 200 mV, zatem diody RGB wraz z sterującymi je driverami SCT2024 zasilane są napięciem 3,4 V. Pozostała cześć układu, czyli serce urządzenia - ATmega88 oraz akcelerometr ADXL344 zasila stabilizator 3 V. Pobór prądu w skrajnym przypadku, czyli przy świeceniu każdego koloru wszystkich diod wynosi 950 mA, zatem minimalny czas pracy (przy ciągłym świeceniu) urządzenia zasilanego z akumulatora wynosi 2 godziny 20 minut.

Sterowniki diod LED RGB stanowi sześć 16-bitowych, szeregowo-równoległych rejestrów, które są ze sobą połączone w sposób  szeregowy (wyjście->wejście), tworząc 96-bitowy rejestr (32 diody RGB dają w sumie 96 diod). Dane do sterownika przesyłane są z wykorzystaniem magistrali SPI.

Za jasność świecenia diod odpowiada tranzystor MOSFET z kanałem P, który kluczowany jest sygnałem PWM. Magistrala I2C (TWI) wykorzystana jest do komunikacji z akcelerometrem, który przyczynia się między innymi do oszczędzania energii. Do mikrokontrolera podłączona jest także dioda sygnalizująca różne stany układu oraz przycisk, który po naciśnięciu zmienia wyświetlany obraz, lub po przytrzymaniu wyłącza urządzenie.



Dobieranie prądu wyjść SCT2024


Napięcie przewodzenia każdego z kolorów diod RGB różni się. W celu uzyskania jednolitej jasności świecenia należałoby połączyć szeregowo rezystor do każdego pojedynczego koloru. Na szczęście wyjścia układu SCT2024 działają jako źródła prądowe, a rezystor REXT umożliwia ustalenie stałego prądu dla każdego z wyjść! Pozbywamy się w ten sposób aż 96 rezystorów i uzyskujemy jednakową jasność świecenia każdego koloru.

Dokumentacja STC2024: SCT2024V01_03.pdf (kopia)





Schemat oraz PCB


Schemat modułu sterowania wraz z modułami RGB


Projekt schematu oraz płytki wykonany został w programie KiCad. Urządzenie zostało zaprojektowane w sposób modułowy. Powyższy schemat przedstawia część odpowiedzialną za sterowanie wraz z podłączonymi dwoma modułami RGB i w takiej konfiguracji go zbudowano.

Może pojawić się pytanie dlaczego na magistrali SPI brakuje rezystorów podciągających, skoro piny są współdzielone z interfejsem ISP. Są one zbędne, ponieważ używamy tylko linii MOSI, czyli urządzenie slave nie przesyła do mikrokontrolera żadnych danych, co mogłoby zakłócić proces programowania, a oprócz tego, wewnątrz układu znajdują się rezystory podciągające linie wejściowe do zasilania, dzięki czemu, w trakcie programowania nic nam nie miga oraz nie świeci na modułach RGB.


Schemat modułu RGB


Całość została tak zaprojektowana w ten sposób, aby można było do modułu sterującego dołączyć dowolną ilość modułów RGB. Należy przy tym pamiętać, że każdy moduł zawiera 16 diod LED RGB i co za tym idzie, wydłuża rejestr szeregowo-równoległy o 48 bitów. Płytki łączą zwory oraz gniazda AVX.



Płytki PCB













Płytki PCB zostały wykonane przez firmę (pliki ze schematem oraz mozaiką ścieżek znajdują się na końcu artykułu). Podczas projektowania korzystałem z bibliotek pobranych ze strony: KiCad - Electronic CAD libraries.




Program

Program napisany został w darmowym środowisku Atmel Studio. Wszystkie pliki źródłowe znajdują się w załączniku. Postaram się opisać program według części algorytmu.


Algorytm działania programu



Główna pętla programu

Po włączeniu zasilania następuje inicjalizacja urządzenia, składa się ona z kilku funkcji wewnętrznych pliku PixelPoi.c, inicjalizujących procesor oraz akcelerometr. Funkcje podzielono na mniejsze bloki, w celu uzyskania przejrzystości kodu.

void hardware_init(){
 port_init();
 cpu_init();
 SPI_init();
 TWI_init();
 ADC_init();
 wdt_init();
 ADXL344_init();
}

Biblioteka użyta do obsługi interfejsu TWI pochodzi z książki Tomasza Francuza "Język C dla mikrokontrolerów AVR"i nie będę jej opisywał.

Przetwornik analogowo-cyfrowy wykorzystywany jest do pomiaru napięcia zasilania, za diodą Schottky'ego. Pin konfigurujemy jako wejście, wyłączamy część cyfrową, używamy wewnętrznego źródła odniesienia, wynik wyrównujemy do lewej oraz preskaler ustawiamy na 16 (8 MHz / 16 = 500 kHz). Producent zaleca dokładne pomiary dla sygnału taktującego przetwornik poniżej częstotliwości 250 kHz, nam nie zależy jednak na bardzo dokładnym pomiarze i wartość odczytywać będziemy tylko z rejestru ADCH.

static inline void ADC_init(){
 DDRC &= ~_BV(PC0);    //PC0 jako wejscie
 DIDR0 |= _BV(ADC0D);  //PC0 - zablokowanie czesci cyfrowej
 ADMUX |= _BV(REFS1) | _BV(REFS0) | _BV(ADLAR);  //wew. zrodlo odniesienia,
        //wyrownanie wyniku do lewej odczytywany bedzie tylko rejestr ADCH
 ADCSRA |= _BV(ADEN) | _BV(ADPS2); //wlaczenie przetwornika, 
         //ustawienie preskalera zegara taktujacego na 16
}

Watchdog został skonfigurowany do generowania przerwań co 4sek, a funkcja resetowania procesora została wyłączona, dzięki temu uzyskaliśmy dodatkowy timer. Należy pamiętać, że ustawienie fusebitu WDTON uniemożliwi użycie Watchdoga do generowania przerwań. Należy także pamiętać, że przed zmianą rejestru WDTCSR warto wykonać reset rejestru Watchdoga, ponieważ może nastąpić jego natychmiastowe zadziałanie.

static inline void wdt_init(){
 wdt_reset(); //konfiguracja timera watchdog
 WDTCSR = _BV(WDCE) | _BV(WDE);
 WDTCSR =_BV(WDIE) | _BV(WDP3); //przerwanie watchdog co 4 sek
}

Po włączeniu zasilania akcelerometr ADXL344 znajduje się w trybie niskiego poboru mocy i należy w pierwszej kolejności zmienić tryb jego pracy. Następnie należy dokonać odpowiedniej konfiguracji. Funkcje ADXL_send_byte oraz ADXL_recive_byte zawierają wewnątrz odpowiednie instrukcje do wysłania oraz odebrania bajtu po magistrali TWI (biblioteka do obsługi TWI z książki Tomasza Francuza znajduje się w załączniku).

static inline void ADXL344_init(){
 ADXL344_send_byte(0x2D, 0x08); //POWER_CTL: tryb ciaglego pomiaru
 ADXL344_send_byte(0x31, 0x20); //DATA_FORMAT: przerwanie stanem niskim
 ADXL344_send_byte(0x2C, 0x0A); //PW_RATE: częstotliwość pomiarów 50HZ
 ADXL344_send_byte(0x3B, 0x89); //ORIENT_CONF: przerwania orient, 3D
 ADXL344_send_byte(0x2E, 0x01); //INT_ENABLE: uruchomienie przerwan orient
 ADXL344_send_byte(0x2F, 0x01); //INT_MAP: przerwanie orient na pin int2
}

Główna pętla odpowiada za sprawdzenie czy grawitacja lub siła odśrodkowa działa w osi -X akcelerometru (jeśli nie diody zostają wyłączone) i następnie wyświetla obraz, przy sprawdzeniu który powinien być obecnie rysowany. Obrazy zapisane są do pamięci flash jako dwu wymiarowa macierz w postaci ilość_linii_obrazu x 12. Dlaczego 12? Ponieważ interfejs SPI wysyła kolejno po jednym bajcie, zatem dzieląc 96 bitów (wszystkie kolory) przez 8 otrzymujemy 12 (dla dwóch połączonych ze sobą modułów).

#include "PixelPoi.h"
#include "img.h"

void RGB_line(const unsigned char matrix[][6*NO_OF_RGB_MOD], uint8_t );

int main(void)
{
 hardware_init(); //inicjalizacja urzadzenia
 
 while(1)
    {
  while(STATUS_REG & _BV(X_FLG)){ //wyswietlaj tylko, gdy grawitacja 
                             //lub sila odsrodkowa dziala na os -X
   switch(PROG_CNT){
    case 0:    
     for(uint8_t j=0; j<26; j++){
      RGB_line(&img_a, j);
      _delay_us(500);
     }
     break;
    case 1:
     for(uint8_t j=0; j<19; j++){
      RGB_line(&img_b, j);
      _delay_us(500);
     }
     break

                            //kolejne programy 
                            //case 2, 3, 4, 5... itd.     

    default:;    
   }
   
  }
  RGB_line(&img_tst, 7);//diody wylaczone poza petla
 }
}
  
void RGB_line(const unsigned char matrix[][6*NO_OF_RGB_MOD], uint8_t line){
 PORTC |= _BV(OE);
 PORTC &= ~_BV(LA);
 for(uint8_t i=0; i<(6*NO_OF_RGB_MOD); i++)
 {
  SPDR = pgm_read_byte(&matrix[line][i]);
  while(!(SPSR & _BV(SPIF)));
 }
 PORTC |= _BV(LA);
 PORTC &= ~_BV(LA);
 PORTC &= ~_BV(OE);
}//funkcja pobierajaca z pamieci flash kolejna linie do wyswietlenia
//zmiany stanow na liniach OE oraz LA sluza do wlasciwej obslugi aktywacji wyjsc
//oraz zatrzasku drivera LED -> patrz datasheet

Nie zdążyłem niestety napisać programu do generowania pliku tekstowego z macierzą obrazu, zrobię to w wolnej chwili. Wpisywanie "ręczne" wbrew pozorom nie jest trudne, ponieważ jeśli dobrze się przyjrzymy, to da się zauważyć, że sekwencja kolorów powtarza się co 3 bajty, a tworzenie symetrycznych obrazów i wzorów jest naprawdę proste! ;-)

const unsigned char PROGMEM img_tst[8][12]={
 {0b01001001, 0b00100100, 0b10010010, /*...*/ 0b00100100, 0b10010010},
    //{GRBgrbGR,  BgrbGRBg,  rbGRBgrb  /*...*/     BgrbGRBg    rbGRBgrb},
  //32 31 30     29 28      27 26   /*...*/      5  4  3      2  1
        /*...*/
};//struktura macierzy obrazu

Struktura ramki danych dla linii z 32 diod LED wygląda następująco:


Ramka danych obrazu


Barwy możliwe do wyświetlenia:
G R B KOLOR
1 1 1 Biały
1 1 0 Żółty
1 0 1 Cyjan
1 0 0 Zielony
0 1 1 Magneta
0 1 0 Czerwony
0 0 1 Niebieski
0 0 0 Czarny




Mieszanie barw RGB


Przerwanie Watchdog

Przerwanie Watchdog występuję co 4 sekundy. W przerwaniu dokonujemy pomiaru napięcia zasilania i jeśli jest ono zbyt niskie usypiamy procesor. Sprawdzamy także, czy układ znajduje się w pozycji innej niż -X, jeśli tak, zamrugamy diodą sygnalizując w ten sposób, że urządzenie jest włączone, ponieważ linia diod RGB w pozycji innej niż -X jest wyłączona.

Pod makrem ADC_MIN ukryta jest wartość 0x7F, która została obliczona w następujący sposób: minimalne przyjęte napięcie akumulatora (dioda niebieskiego i zielonego koloru przestaje świecić - zbyt niskie napięcie) wynosi 3,35 V, zatem za diodą Schottky'ego wynosi ono 3,1 V, a z kolei napięcie podawane na przetwornik ADC, poprzez dzielnik rezystancyjny jest równe 0,5 V.

Przeglądając notę katalogową mikrokontrolera możemy znaleźć wzór na obliczenie wartości rejestru przetwornika: Vin * 1024 / Vref, gdzie Vin jest naszym napięciem 0,5 V, a Vref, to napięcie referencyjne, które dla tego procesora jest równe 1,1 V. Otrzymujemy w ten sposób 0x1D1. Ponieważ wynik przesuwamy w lewo (skonfigurowane to zostało w ADC_init), w rejestrze ADCH pojawia się wartość 0x74 (116) i dla bezpieczeństwa i spokoju ducha zwiększamy do 0x7F (127). ;-)

Podczas usypiania procesora należy pamiętać o wyłączeniu Watchdoga oraz uśpieniu akcelerometru, ponieważ przerwania wybudzały by mikrokontroler. Opóźnienia delay oczywiście zastosowane z prostoty i lenistwa. ;-)

uint8_t ADC_one_measurement(){
 ADCSRA |= _BV(ADSC); //uruchomienie pojedynczej konwersji
 while(ADCSRA & _BV(ADSC));//czekaj do zakonczenia konwersji
 return ADCH;
}

static inline void wdt_stop(){ //wylaczenie watchdoga
 wdt_reset(); 
 WDTCSR = 0;
}

static inline void power_down(){
 cli();
 timer1_stop(); 
 ADXL344_send_byte(0x2D, 0x00); //POWER_CTL: uspienie akcelerometru
 wdt_stop(); //wylaczenie watchdoga, aby nie wybudzal procesora
  sleep_bod_disable(); //wylaczenie ukladu BOD
 sei();
  sleep_cpu();
}

static void led_blink(){
 PORTD |= _BV(LED);
 _delay_ms(50);
 PORTD &= ~_BV(LED);
 _delay_ms(100);
 PORTD |= _BV(LED);
 _delay_ms(50);
 PORTD &= ~_BV(LED);
 _delay_ms(100);
}

ISR(WDT_vect){
 if(ADC_one_measurement() < ADC_MIN){//jezeli napiecie zasilania jest
                               //zbyt niskie uspij
  led_blink();
  sleep_cpu();
 }
 if(!(STATUS_REG & _BV(X_FLG))){//jezeli urzadzenie znajduje sie w 
                                //innym polozeniu niz -X, to zamrugaj dioda
  led_blink();
 }
}

 

Przerwanie akcelerometru

Przerwanie pochodzące od akcelerometru pojawia się w momencie zmiany jego orientacji. Ustawiając urządzenie linią diod pionowo w górę, układ ADXL344 zorientowany jest tak, jak na rysunku - grawitacja działa tylko w dodatnim kierunku osi X. Po otrzymaniu przerwania musimy dokonać odczytu najpierw z rejestru flag źródeł przerwań, a następnie z rejestru orientacji, aby mogło pojawić się kolejne przerwanie.

Podczas inicjalizacji skonfigurowano układ do pomiaru orientacji w przestrzeni XYZ. W momencie ustawienia urządzenia linią diod RGB w kierunku ziemi jak i zarówno podczas obracania nim w powietrzu (siła odśrodkowa działa na zewnątrz - w tym przypadku kierunku ujemnym osi X), diody RGB zaczynają świecić. Początkowo obraz był rysowany tylko w trakcie obracania urządzeniem, pod wpływem przeciążenia większego niż 1 g, ale okazało się to niepraktyczne, ponieważ podczas zmiany programu nic się nie wyświetlało na diodach RGB.

Pod makrodefinicją STATUS_REG ukryty jest rejestr ogólnego przeznaczenia GPIOR0 i używany jest jako rejestr statusu.

ISR(INT0_vect){ //przerwanie akcelerometru zmiany polozenia urzadzenia XYZ
 uint8_t xyz;
 xyz = ADXL344_recive_byte(0x30); //INT_SOURCE
 xyz = ADXL344_recive_byte(0x3C); //ORIENT jezeli nie odczytamy powyższych
                    //rejestrow,to nie zostanie wygenerowane kolejne przerwanie
 if((xyz & 0b00000111)==0x04){ //sprawdzenie czy grawitacja lub sila 
                                   //odsrodkowa dziala na os -X
  STATUS_REG |= _BV(X_FLG);
 }else{
  STATUS_REG &= ~_BV(X_FLG);
 }
}



ADXL334 rejestr flag przerwań oraz orientacji


Orientacja akcelerometru ADXL344


Przerwanie przycisku

Wciśnięcie przycisku wywołuje przerwanie (dla odmiany przerwanie maskowane pin change), które wykonywane jest atomowo i nie może zostać przerwane przez inne przerwanie. Dziwnie to brzmi, ale tak działa, no cóż. ;-)

W następnej kolejności timer1 jest rekonfigurowany do obsługi przycisku, a sygnał PWM wyłączony i przy tym zasilanie zostaje zdjęte z anod diod RGB. Mignięcie diodą sygnalizuje wciśnięcie klawisza i prosta eliminacja drgań styków na pętli while. Kolejna pętla to ponownie while i jest ona wykonywana do czasu trzymania wciśniętego przycisku lub do upłynięcia czasu jednej sekundy.

Po upływie jednej sekundy (przy założeniu ciągłego wciśnięcia klawisza) następuję sprawdzenie, czy procesor był uśpiony, jeśli tak, zostaje wybudzony, jeśli nie - zostaje uśpiony, poprzez przerwanie pętli instrukcją break i wykonanie lub nie warunku if znajdującego się zaraz za pętlą. Zdjęcie palca z klawisza przed upływem jednej sekundy zmienia wyświetlany obraz na kolejny, pod warunkiem, że procesor nie był uśpiony, w przeciwnym razie następuje jego uśpienie.

Na sam koniec timer1 jest ponownie konfigurowany i sygnał PWM przywrócony do sterowania jasnością świecenia.

Pojawiają się kolejne makrodefinicje zamieszczone w pliku PixelPoi.h. DUTY_PWM służy do ustalania jasności świecenia, PROG_CNT (GPIOR1) jest licznikiem aktualnie wyświetlanego obrazu, a NUMB_OF_PROG mówi o ilości użytych obrazów.

static inline void timer1_pwm_init(){
 //zmiana konfiguracji timera1 na rzecz pwm
 TCCR1B = 0;
 OCR1A = (100-DUTY_PWM) * 2.5;  
 //tryb 8-bitowy, zatem regulacja liczbami 0-255, gdzie 0 -> 100%, 255 -> 0%
 TCCR1B = _BV(WGM12) | _BV(CS11); 
 //wybor trybu pwm 8-bitowego oraz taktowanie timera1 sygnalem fcpu / 8
 TCCR1A = _BV(COM1A1) | _BV(WGM10);

}

static inline void timer1_sw_init(){
 //zmiana konfiguracji timera1 na rzecz przycisku
 TCCR1B = 0;
 TCCR1A = 0;
 TCNT1 = 0;
 TCCR1B =  _BV(CS12) | _BV(CS10); //taktowanie timera1 sygnalem fcpu / 1024
 PORTB |= _BV(PWM); //wylaczenie klucza tranzystorowego
}

ISR(PCINT2_vect){
 ATOMIC_BLOCK(ATOMIC_FORCEON){//wykonanie bloku w sposob atomowy
  timer1_sw_init();//rekonfiguracja timera1 do obslugi przycisku    
  
  PORTD |= _BV(LED); 
  while(TCNT1 < 200){//eliminacja drgan stykow (okolo 25ms)
   asm("nop");
  }
  PORTD &= ~_BV(LED);
 
  while((!(PIND & _BV(SW)))){//jesli przycisk jest wcisniety
   if(TCNT1>8000)
   {//jesli przycisk jest wcisniety dluzej niz sekunde
    if(STATUS_REG & _BV(SLEEP_FLG)){
    //jesli procesor byl uspiony
     STATUS_REG &= ~_BV(SLEEP_FLG); 
    //ustwaienie flagi po przerwaniu petli nastapi obudzenie
     wdt_init(); //uruchomienie watchdoga
     ADXL344_send_byte(0x2D, 0x08); 
    //rejestr: POWER_CTL: tryb ciaglego pomiaru
     led_blink();
     break;     
    }else{//jesli procesor pracowal normalnie
     STATUS_REG |= _BV(SLEEP_FLG); 
    //po przerwaniu petli nastapi uspienie
     led_blink();
     break;     
    }
    PORTD ^= _BV(LED);
   }
  }
  //cnt = TCNT1;
  
  if(STATUS_REG & _BV(SLEEP_FLG)){
   //usypia procesor, gdy flaga uspienia jest ustawiona
   power_down();
  }
  
  if(TCNT1>500){//inkrementuje licznik wyswietlanego programu
   if(PROG_CNT < NUMB_OF_PROG){
    PROG_CNT++;
    }else{
    PROG_CNT = 0;
   }
   
  }
  timer1_pwm_init(); //włączenie PWM na anodach diod RGB
 }
}



Do pobrania

Spakowane pliki .rar z projektem urządzenia: Projekt-KICad.rar (kopia)
oraz kodem źródłowym: Source.rar (kopia)



Podsumowanie

Niestety zdjęcia robione trybem automatycznym w aparacie nie odzwierciedlają kolorów. Filmy również nie odzwierciedlają kolorów wyświetlanych przez urządzenie, a kamerę nie sposób tak łatwo oszukać jak ludzkie oko.

Zdjęcie znajdujące się na początku artykułu oraz poniższe oddają w pewnym stopniu żywe kolory, ale konsekwencją tego jest rozmycie. Zastosowane diody RGB są bardzo jasne i podczas robienia zdjęć i filmów współczynnik wypełnienia sygnału PWM ustawiony był tylko na 10%! (przy 100% trudno patrzeć na urządzenie).

Możliwości zmian

W pętli głównej programu można zauważyć po każdym wyświetleniu linii opóźnienie 500 μs. Zostało ono dobrane doświadczalnie w celu prawidłowego wyświetlania obrazu (interfejs SPI jest bardzo szybki i bez opóźnienia nie było możliwości prawidłowego wyświetlania).

Program można także zrealizować tylko za pomocą przerwań, a pętle główną zoptymalizować i umieścić w przerwaniu timera. Jeżeli chcemy wyświetlać statyczne grafiki, potrzebna jest nam synchronizacja. Można przykładowo badać dwa punkty: moment kiedy urządzenie skierowane jest pionowo w górę - siła grawitacji odejmie się od siły odśrodkowej oraz moment, w którym urządzenie skierowane jest pionowo w dół - siła grawitacji doda się do siły odśrodkowej; czyli badając minima i maksima siły działającej na oś X podczas obrotu.

Można także pokusić się o dodanie więcej opcji do przycisku, przykładowo może to być zmiana jasności świecenia czy oprócz inkrementacji licznika aktualnie wyświetlanego obrazu także jego dekrementacja (przydatne przy dużej liczbie programów).




Orientacyjne ceny elementów (za jedną sztukę):

  • Mikrokontroler Atmega88PA - 5zł
  • Akcelerometr ADXL344 - 10zł
  • Driver LED SCT2024 - 1,50zł
  • Dioda LED RGB WW-FCE50TC-C - 1zł
  • Gniazdo akumulatora KEYS1042 - 6,50zł
  • Akumulator ICR18650-22F - 20zł
  • Dla leniwych - wykonanie PCB około 55zł

Zdjęcia:




















Dziękuję za oddany głos i zachęcam wszystkich do zbudowania własnego wyświetlacza widmowego! Niestety nie udało mi się wszystkich pomysłów zrealizować i przy tym zmieścić się w ramach czasowych.

Program oraz pliki KiCada można traktować jako pewną ideę, ale życzę każdemu zaprojektowania i zaprogramowania tego lepiej niż ja! ;-) Osobiście zamierzam rozwijać w dalszym ciągu swój projekt, wzbogacając go przede wszystkim o obwody ładowania akumulatora czy komunikację USB.

Wszelkie sugestie oraz rady mile widziane. Jeśli ktoś zbuduje własną wersję, będzie mi bardzo miło, jeśli się nią pochwali. ;-)

Pozdrawiam serdecznie i życzę wesołych świąt Bożego Narodzenia oraz szczęśliwego Nowego Roku!

Wojtek





Uwagi redakcji

Właściwie nie mamy większych uwag do tego artykułu jak i całego projektu, stąd też nasza ocena była prawie maksymalna. Zastosowane rozwiązanie z wymiennym akumulatorem ma swoje zalety. Inną wersją mogłaby być dedykowana przetwornica do LiIon z ładowarką np. na USB, byłoby być może wygodniej i można by trochę bardziej wydrenować akumulator. Ale to tylko pomysł do przedyskutowania :-)


19 komentarzy:

  1. GRATULACJE, pomysł na 102 wykonanie też - ode mnie 10+1 pkt

    OdpowiedzUsuń
    Odpowiedzi
    1. Zagłosować można tylko raz. System ocen jest odporny na manipulowanie wynikami :-)

      Usuń
    2. Odporny w jaki sposób? ;) Nie można zrobić odpornego systemu. Wszelkie zabezpieczenia ciasteczkowe (którego i tak system ocen nie używa) jak i sprawdzanie adresu IP nie jest żadną przeszkodą. Ciasteczka można wyczyścić/wyłączyć a obecnie większość ludzi ma dynamiczne adresy IP więc wystarczy restart routera.

      Usuń
    3. Jest wiele różnych sposobów, nie tylko te które wymieniłeś :-)

      Usuń
    4. Wiele? To jedyne metody identyfikacji użytkownika (poza systemem kont). A jak są to dlaczego nie podałeś konkretnych przykładów? No chyba że (co jest bardzo prawdopodobne) po prostu tak piszesz żeby ktoś przypadkiem nie chciał tego sprawdzić :) Rozumiem, w sumie to głosowanie na podstawie którego później ktoś dostanie nagrodę. Ja tylko uważam że jednak na wyznaczanie wcale nie takich tanich nagród bezpieczeństwo tego systemu jest zbyt małe.

      Usuń
    5. Czy bank zdradzi Ci metody ochrony konta? Nie żądaj więc ode mnie wyjawiania metod ochrony przed manipulacją. Dwóch autorów już się o tym przekonało. Jeszcze raz powtórzę, że to co wymieniłeś to proste podstawowe proste metody, ale są jeszcze inne i ja je stosuję. Nie oceniaj więc bezpieczeństwa systemu skoro nie znasz jego od podszewki.

      Usuń
    6. Niczego nie żądam, tylko uważam że na przyznawanie nagród taki system oceniania przez użytkowników nie wymagający logowania nie nadaje się do przyznawania nagród. Co do przykładu z bankiem - idąc Twoim tokiem rozumowania to np. opensourcowe oprogramowanie do szyfrowania danych jest niebezpieczne. A jest całkowicie odwrotnie - ma się pewność że algorytm nie zawiera żadnych błędów czy backdoorów dla autora aplikacji czy NSA bo każdy kto się na tym zna może to sprawdzić. Programistów na świecie nie brakuje. Oczywiście nie zachęcam Cię do dalszej dyskusji, bo o twoich 'innych metodach' mam swoje zdanie ;) Ew. jak uważasz że ta cała dyskusja ma wpływ na bezpieczeństwo systemu to po prostu ją skasuj. Nie obrażę się :)

      Usuń
    7. Jeżeli miałbyś taki system do zaprojektowania, to po głębszej analizie doszedłbyś do podobnych wniosków i systemów zabezpieczeń jak te, które opracowałem. Poziom bezpieczeństwa wyników jest bardzo wysoki, a ewentualne manipulacja ograniczona do minimum poniżej 2%. Znasz mnie pod kątem zawartości merytorycznej bloga, więc bądź pewien, że pod kątem zabezpieczeń systemu głosowania jest podobnie :-)

      Jeżeli natomiast nadal masz swoje zdanie, to i tak Ciebie nie przekonam bez zdradzenia sposobu i algorytmów, a tego zrobić nie mogę. To się nazywa pat.

      Usuń
    8. Ja tylko przypomnę, że w ostatecznej ocenie duży udział mają autorzy bloga - Dondu dobrze to przemyślał, w efekcie nawet jeśli ktoś skrzyknie kumpli, a projekt ma cieńki i tak nie przejdzie.
      Poza tym traktujmy to jako zabawę - autorzy projektów już wygrali - mają naprawdę fajne cacka. Nie ma systemu ocen w 100% obiektywnego i sprawiedliwego, ktoś zawsze zdobędzie 4 miejsce i będzie mu przykro, że ten na trzecim nie ma aż tak istotnie lepszego projektu. Cóż, świat nie jest idealny, ale niech nam to nie psuje zabawy.

      Usuń
    9. Potwierdzam - regulamin punkt 9.
      Mam także nadzieję, że już w ferie zrobimy podobny konkurs, jeśli sponsorzy ponownie nagrody dla Was ufundują.

      Usuń
  2. masz 10 z Pabianic

    OdpowiedzUsuń
  3. Projekt spoko, a teraz: "Widzę że się nudzisz i czekasz na jakąś pracę. DO ROBOTY! "

    OdpowiedzUsuń
  4. Witam serdecznie! Jestem początkujący i mam pytanie odnośnie układu SCT2024. Zapoznałem się z datasheet jak również z tym FAQ:
    http://www.starchips.com.tw/pdf/LED_Driver_FAQV01_01.pdf
    Ale nadal nie rozumiem skąd się biorą dwa różne zakresy parametru Output Voltage, inne dla Output On (1-4V)i Output Off (0-17). Wszystkie wykresy kończą się na V=4. Co zatem oznacza parametr 17V i czy można do wyjścia tego układu podłączyć takie napięcie, czy trzeba je najpierw ograniczyć do 4V?

    OdpowiedzUsuń
    Odpowiedzi
    1. Witaj!
      W datasheet układu SCT2024, na stronie 3 masz schemat obwodów wyjściowych (Equivalent Circuits of Output). W przypadku przewodzenia dolnego tranzystora, prąd wpływa do układu i podłączona do konkretnego wyjścia dioda LED zaczyna świecić. Podłączając diody LED nie musimy do końca przejmować się ich napięciem przewodzenia (oczywiście napięcie zasilające diody jest istotne), ponieważ układ SCT2024 ma wewnątrz źródło prądowe, którego parametry ustawiamy rezystorem Rext, zatem napięcie Output ON zależy od ustalonego prądu i mieści się w granicach od 1 do 4V.
      Z kolei w przypadku, gdy dioda nie świeci, przewodzi górny tranzystor, czyli wektor napięcia zasilającego diody, nazwijmy go Vled będzie odwrotnie skierowany do wektora napięcia, o którym pisałem wyżej, nazwijmy go Voutput_on, zatem napięcie Vled - Voutput_on musi być mniejsze od 17V. Jest to istotne, jeżeli podłączysz przykładowo w szereg kilka diod i zasilisz je wyższym napięciem. Dla bezpieczeństwa warto przyjąć 17 - 4 = 13, zatem nie zasilać obciążenia wyjść wyższym napięciem niż 13V.
      Pozdrawiam ;-)

      Usuń
    2. Witam ponownie! Mam pytanie za 1000 punktów. Z datasheet użytych diod RGB wynika, że poszczególne kolory mają różną jasność (wartość mcd) przy tym samym prądzie. Jednak żeby zachodziło sumowanie barw jasność wszystkich kolorów powinna być chyba identyczna, w przeciwnym razie nie powstanie czysta barwa. Jak to jest w praktyce? W projekcie widzę, że wszystkie kolory zasilane są takim samym prądem (te same wartości Rext).

      Usuń
    3. Aldaris - Nic się nie zgadza z tego co napisałeś. Obwody wyjściowe do świecenia LED nie są pokazane na 3 stronie (jest tam tylko SDO - zupełnie inny temat), ani napięcie na wyjściu nie zależy od ustalonego prądu. Zależy tylko od napięcia LED i spadku w kierunku przewodzenia na diodzie. A już na pewno nie zgadza się to, że gdy dioda LED nie świeci, to żaden "górny tranzystor" nie ma prawa przewodzić (bo to nie schemat wyjścia do świecenia LED).

      Usuń
    4. Co do dokumentacji, to masz rację - wskazane schematy nie dotyczą wyjść diod.

      Co do napięcia diody, to nie jest ono stałe np. 1,54V. Każda dioda ma swoją charakterystykę prądowo-napięciową. Ponieważ STC2024 ma za zadanie utrzymać stały zadany rezystorem Rext prąd, stąd na wyjściu musi podać takie napięcie, by zgodnie z w/w charakterystyką diody osiągnąć zadany prąd.

      Dlatego też tak reguluje napięciem na wyjściu, by zadany prąd osiągnąć w zależności od podłączonej na diody. Jest to tzw. źródło prądowe, czyli takie, które utrzymuje stały prąd, a jedyne czym może regulować jest więc napięcie na wyjściu. Dlatego Aldaris napisał prawidłowo.

      Usuń
  5. Witam, czym można zastąpić akcelerometr ADXL344 ??

    OdpowiedzUsuń
  6. witam!
    Mam taki mały problem. Otóż nie mogę otworzyć pliku z PCB tego projektu i na różne sposoby nie wychodzi mi mógłbym prosić o pomoc lub o wysłanie pliku z PCB tego proejktu byłbym bardzo wdzięczny za taką pomoc ;)

    OdpowiedzUsuń