Jump to content

Moduły sterujące oświetleniem modelu


milczacy
 Share

Recommended Posts

Jak niektórzy wiedzą mam na "koncie" dwa modele samolotów w skali 1:144, w których zastosowałem oświetlenie nawigacyjne. Nie wdając się w tym momencie w szczegóły, tym razem chciałbym tylko napisać o samych modułach sterujących.

Pomoc otrzymałem od kolegi "AndyCopter" z forum pfmrc.eu i w wykonanych modelach, z racji ich sporych rozmiarów zastosowałem płytkę Arduino Nano. Jest to o tyle dobre rozwiązanie, że możemy dzięki odpowiedniemu programowi zasymulować praktycznie dowolną sekwencję świecenia lamp strobo i beacon. Niestety do mniejszych modeli ta płytka jest po prostu za duża.

 

GQtnQhH.jpg?1

 

Jednak inny kolega "bluuu" z pfmrc.eu, zaprojektował, wykonał i przysłał mi mikro płytkę rozmiarów 9,7x13,2mm. Zmieści się ona chyba w każdym modelu, nawet w skali 1:144.

Poniżej zamieszczam schemat tego modułu oraz filmik demonstrujący jej pracę. Jego jedyną wadą jest fakt, że programu sterującego nie można zmienić, jest on wgrany już "fabrycznie".

 

Jn2Nnx5.png?1

 

W razie pytań - postaram się pomóc.

Link to comment
Share on other sites

Podaję zatem garść 'konkretów'.

Zacząć należy od zakupu płytki Arduino Nano lub jej klona (na allegro jest tego pokaźna ilość) koszt ~15zł. Następnie należy pobrać darmowe oprogramowanie ze strony https://www.arduino.cc/en/Main/Software

W międzyczasie może być potrzebne zainstalowanie sterowników obsługi USB. W sprzedaży są dostępne moduły z chipem CH340 (mniej typowy, potrzebne odpowiednie sterownika dla Windows) oraz FTDI (Windows rozpoznaje je automatycznie).

Po rozpoznaniu modułu w komputerze uruchamiamy program Arduino, ustawiamy w nim odpowiednie opcje (typ posiadanego modułu Arduino oraz port szeregowy do komunikacji), kopiujemy kod sterujący oświetleniem i wgrywamy do pamięci modułu.

Przykładowy kod, który steruje oświetleniem w moim B748F wygląda tak:

/* Oświetlenie nawigacyjne Boening 747
Program przeznaczony dla Arduino, udostępniany jest na licencji OpenSource.
autor: warp3r[at]wp.pl
modified by milczacy 
*/

const int LEDOFF = 0;
const int LEDON = 96; // 25%
const int LEDBLINK = 244;  // 100%
const int LEDHALF = 120; // 50%

class LED {
 private:
   byte _ledPin;
   int _ledState;
   int _ledLastState;
   long _currentMillis;
   long _previousMillis;
 public:
   byte _brightness;
   long _interval;
   long _time;
   LED ( byte pin);
   void setOn();
   void setOff();
   void setOnTime();
   void setBrightness( byte brightness);
};

LED::LED( byte ledpin) : _ledPin(ledpin) {
 _brightness = 0;
   _ledState = LOW;
   _ledLastState = LOW;
   _currentMillis = millis();
   _previousMillis = _currentMillis;
   long _time;  pinMode(_ledPin, OUTPUT);
}

void LED::setOn() {
 analogWrite (_ledPin, _brightness);
}

void LED::setOff() {
 digitalWrite (_ledPin, LOW);
}

void LED::setBrightness ( byte brightness) {
 _brightness = brightness;
}

void LED::setOnTime(){
 _currentMillis = millis();
 if( _currentMillis - _previousMillis > _interval) {
   _previousMillis = _currentMillis;   
   if (_ledState == LOW) {
     _ledState = HIGH;
     _brightness = LEDBLINK;
   } else {
     _ledState = LOW;
     _brightness = LEDOFF;
   }
   _ledLastState = _ledState;
 }
 if (_ledLastState == _ledState) {
   if ( (_currentMillis - _time) < _previousMillis) {
     _brightness = LEDBLINK;
   } else {
     _brightness = LEDOFF;
   }
   setOn();
 }
   
}

/* dla Arduino Nano */
int Led_1 = 3;  //ogon, białe flash
int Led_2 = 5;  //strobo skrzydla, biały flash
int Led_3 = 6;  //beacon, czerwony flash
int Led_4 = 9;  //position-zielone,czerwone,białe
int Led_5 = 10;  
int Led_6 = 13;  
int Led_7 = 2;  //landing golen, białe stałe
int Led_8 = 7;  //landing skrzydla wew, białe stałe
int Led_9 = 8;  //landing skrzydla zew, białe stałe
int sensorPin = A0;    // select the input pin for the potentiometer
int ledPin = 12;      // oświetlenie wnętrza modelu, białe
int sensorValue = 0;  // variable to store the value coming from the sensor

LED Led_tail(Led_1);
LED Led_strobe(Led_2);
LED Led_beacon(Led_3);

// Ustawienia po uruchomieniu układu
void setup() {
 // ustawiamy stan IO, internal pull
 pinMode(Led_1, OUTPUT);     
 pinMode(Led_2, OUTPUT);     
 pinMode(Led_3, OUTPUT);     
 pinMode(Led_4, OUTPUT);     
 pinMode(Led_7, OUTPUT);       
 pinMode(Led_8, OUTPUT);       
 pinMode(Led_9, OUTPUT);         
 pinMode(ledPin, OUTPUT);

 // tu regulujesz czas błysków
 Led_tail._interval = 1700;
 Led_tail._time = 60;
 
 Led_strobe._interval = 1000;
 Led_strobe._time = 70;
 
 Led_beacon._interval = 2400;
 Led_beacon._time = 100;
}

/* Wszystkie światła wyłączone */
void LEDS_OFF() {
 analogWrite(Led_1, LEDOFF);
 analogWrite(Led_2, LEDOFF);
 analogWrite(Led_3, LEDOFF);
 analogWrite(Led_4, LEDOFF); 
 analogWrite(Led_7, LEDOFF); 
 analogWrite(Led_8, LEDOFF);
 analogWrite(Led_9, LEDOFF);
 analogWrite(ledPin, LEDOFF);
}

/* Tylko światła nawigacyjne i pozycyjne (obrysowe) */
void Mode1() {  
 Led_tail.setOnTime();
 Led_strobe.setOnTime();
 Led_beacon.setOnTime();
 analogWrite(Led_4, LEDBLINK);
 analogWrite(Led_7, LEDOFF);
 analogWrite(Led_8, LEDOFF);
 analogWrite(Led_9, LEDOFF);
}

/* Światła nawigacyjne, pozycyjne i lądowania*/
void Mode2a() {  
 Led_tail.setOnTime();
 Led_strobe.setOnTime();
 Led_beacon.setOnTime();
 analogWrite(Led_4, LEDBLINK);
 analogWrite(Led_7, LEDBLINK);
 analogWrite(Led_8, LEDOFF);
 analogWrite(Led_9, LEDOFF);
}

void Mode2b() {  
 Led_tail.setOnTime();
 Led_strobe.setOnTime();
 Led_beacon.setOnTime();
 analogWrite(Led_4, LEDBLINK);
 analogWrite(Led_7, LEDBLINK);
 analogWrite(Led_8, LEDBLINK);
 analogWrite(Led_9, LEDOFF);
 
}

void Mode2c() {  
 Led_tail.setOnTime();
 Led_strobe.setOnTime();
 Led_beacon.setOnTime();
 analogWrite(Led_4, LEDBLINK);
 analogWrite(Led_7, LEDBLINK);
 analogWrite(Led_8, LEDBLINK);
 analogWrite(Led_9, LEDBLINK);
}

/* Tylko światła pozycyjne - obrysowe */
void Mode3() {
 analogWrite(Led_1, LEDOFF);
 analogWrite(Led_2, LEDOFF);
 analogWrite(Led_3, LEDOFF);
 analogWrite(Led_4, LEDBLINK);
 analogWrite(Led_7, LEDOFF);
 analogWrite(Led_8, LEDOFF);
 analogWrite(Led_9, LEDOFF);
}

/* w tej pętli, program wykonuje się w nieskończoność */
void loop() {
   /* read the value from the sensor:
   potencjometr dzielę na 6 pozycji, dla 6 trybów pracy */
 sensorValue = analogRead(sensorPin);    
 if ( sensorValue < 170 ) {
   LEDS_OFF();
   analogWrite(ledPin, LEDOFF);
 }
 if ((sensorValue > 170) and (sensorValue < 340)) {
   Mode3(); 
   analogWrite(ledPin, LEDHALF); }
 if ((sensorValue > 340) and (sensorValue < 510)) {  
   analogWrite(ledPin, LEDOFF);   
   Mode1(); }
 if ((sensorValue > 510) and (sensorValue < 680)) {
   analogWrite(ledPin, LEDOFF);   
   Mode2a(); }
 if ((sensorValue > 680) and (sensorValue < 850)) {
     analogWrite(ledPin, LEDOFF);   
   Mode2b(); }
 if (sensorValue > 850) {
   Mode2c(); }
}
/* a tu jest koniec kodu v2.3.2 */

Jest to wersja nieco rozbudowana, bo wymyśliłem sobie kilka trybów świecenia, w najprostszej wersji, gdyby był tylko jeden tryb, kod byłby prostszy.

W kolejnym poście opiszę stosowane diody świecące - LED.

Link to comment
Share on other sites

Ostatnią sprawą pozostaje wybór diod świecących. Z uwagi na dłubanie w skali 1:144 stosują małe diody LED SMD typu 0603, które są naprawdę małe (choć są jeszcze mniejsze typu 0402) i pewien problem może sprawić przylutowanie do nich przewodów. Jest to jednak do zrobienia, a być może oświetlając większy model możemy użyć większych diod.

Oto kilka propozycji LED z oferty Conrad:

czerwona 250 mcd

zielona 430 mcd

biała (ale nie podano zimna czy ciepła)

czerwona 50 mcd

zielony 50 mcd

czerwony 80 mcd

czerwony 100 mcd

W/w diody dobrze nadają się jako światła pozycyjne, czy stroboskopy. Do oświetlenia wnętrza, jako 'beacon' można z powodzeniem stosować diody THT czyli takie z nóżkami, które lutuje się bardzo łatwo.

Do modułu Arduino diody podłączam poprzez rezystory o oporności 200-600 Ohm, w zależności jaką jasność chcę otrzymać.

Edited by Guest
Link to comment
Share on other sites

A są jakieś malutkie diody, które można wysunąć poza obrys kadłuba i na przykład umieścić wewnątrz wywierconych światełek pozycyjnych z plastiku clear?

Do tego dochodzą jeszcze światła antykolizyjne, które migają, więc to już by takie proste nie było.

Ja jestem kompletnym lajkonikiem w tym temacie, więc nawet nie wiedziałbym od czego zacząć, jakie diody kupić, jaki układy elektroniczne, jak je połączyć, czym zasilić itp.

Taki przewodnik dla niekumatych byłby tutaj pewnie nie tylko przeze mnie bardzo gorąco powitany.

Link to comment
Share on other sites

Ja osobiście kupowałem u tego użytkownika, ale każda płytka Arduino Nano się nada.

 

@Solo - ja aż tak małych LED nie znam, w tym przypadku pomyślałbym o światłowodach wyprowadzonych poza obrys modelu. Tylko wtedy należy bardzo dobrze "zaizolować" samo źrodło światła w modelu, gdyż może ono prześwitywać przez plastik modelu.

Link to comment
Share on other sites

  • Super Moderator

No dobra płytkę już zamówiłem, czas przejść z teorii do praktyki.

Mamy już płytkę Audrino Nano V3.0 i co dalej?

Gdzie, które przewody lutujemy?

A i jeszcze jedno, czym to jest zasilane? Bo chyba jakaś bateria musi być?

Poprosimy jakiś schemat?

Link to comment
Share on other sites

Jutro postaram się opisać to jakoś prościej, przyda się jednak informacja do jakiego samolotu chciałbyś to wbudować - trzeba bowiem rozpoznać i odwzorować właściwą sekwencję świecenia.

Arduino Nano może być zasilane z zasilacza 5V (każdy zasilacz do smartfona) lub dowolnedo stałoprądowego zasilacza 6 do chyba 15V.

Ja po prostu zasilam to z portu USB.

Link to comment
Share on other sites

  • Super Moderator

Będę budował Airbusa A380 z Revell i jak mam się męczyć i malować te setki foteli co są w tym modelu, to czemu mam się nie pomęczyć i zrobić mu oświetlenie jak należy. Na pewno urozmaici urok tego modelu.

Tylko się zastanawiam czy pokład miałby się świecić stale, czy tylko co jakiś czas, na jakiś czas. Za to kabina pilotów świeciła by stale.

Link to comment
Share on other sites

Tutaj jest opis wyprowadzeń:

W sekcji programu masz przypisanie nóżki płytki do obwodu świetlnego

/* dla Arduino Nano */
int Led_1 = 3;  //ogon, białe flash
int Led_2 = 5;  //strobo skrzydla, biały flash
int Led_3 = 6;  //beacon, czerwony flash
int Led_4 = 9;  //position-zielone,czerwone,białe
int Led_5 = 10;  
int Led_6 = 13;  
int Led_7 = 2;  //landing golen, białe stałe
int Led_8 = 7;  //landing skrzydla wew, białe stałe
int Led_9 = 8;  //landing skrzydla zew, białe stałe
int sensorPin = A0;    // select the input pin for the potentiometer
int ledPin = 12;      // oświetlenie wnętrza modelu, białe
int sensorValue = 0;  // variable to store the value coming from the sensor
 

gdzie liczba po znaku równości określa właśnie oznaczenie wyjścia (D2...D13) na płytce Arduino.

Testowo podłączaj LED przez opornik 300-500 Ohm do anody(+) diody; masa jest wspólna, podłączana do katody (-) diody.

12960_10.jpg

Edited by milczacy
aktualizacja opisu płytki Arduino Nano
Link to comment
Share on other sites

  • 2 years later...
  • 10 months later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.