ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 3. 태양광 시스템 구성
    만들어보기/자연광 모방 조명 2023. 8. 4. 16:20

    작성해둔 지는 꽤 됐는데...

    임시저장한 채로 거의 한달 반을 방치해서 8월이 되어서야 올립니다...

    이것저것 많은 일이 있었어서...


    우선 Arduino와 nRF24L01, TCS34725가 조합된 모듈의 전력 소비량을 알아보기 위해서

    이들을 5000mAh 보조배터리에 연결해서 동작시켜 보았다.

    시간 기록은 PC에 연결된 수신기 역할의 Arduino의 시리얼 메세지의 타임스태프 기준으로 하였다.

    시리얼 메세지는 날려버렸고 남은 건 이것뿐

    약 46시간 동작 후 메세지가 오지 않았고, 확인해 보니 배터리가 방전되어 전원 공급이 끊겨 있었다.

    5000mAh로 46시간을 동작했으니, 시간당 약 108mA를 소비한다.

    절전을 위한 코드는 일절 없고, nRF24L01의 PA 출력도 최대. Arduino는 ATmega328P 외에 ATmega16U2가 같이 장착되어 있는 Arduino UNO를 사용했으니 전력을 더 사용하게 될 일은 없을 것이다.

     

    이를 바탕으로 태양광 전원 시스템을 구성해보자.

    우선 사용할 컨트롤러는 DFRobot의 DFR0559

    DFR0559

    최대 4.5V~6V의 태양광 패널로부터의 전력을 받아 1셀 Li-Po 배터리에 저장하고, 이를 다시 DC 5V로 출력해준다. Micro USB 입력으로 배터리 충전도 가능.

     

    여기에 1W 솔라패널1500mAh Li-Po 배터리를 구매하였다.

     

    한편, Arduino의 소비 전력을 하드웨어 단계에서 줄여보도록 하자.

    우선 Uno에서 필요없는 것을 대부분 제거한 Pro Mini를 사용.

    ATMEGA16U2 및 그와 관련된 회로, 배터리 전원 입력을 위한 커넥터, OP-AMP 회로, 3.3V LDO, TX/RX LED가 제거되었고, Power LED도 녹색에서 적색으로 바뀌었다. 그 외에 몇몇 역전류 방지 다이오드가 제거되었다.

     

    여기에 온보드 5V LDO를 사용하지 않기 위해, DFR0559에서 공급되는 5V를 VIN이 아닌 VCC에 직결하였다.

    nRF24L01과 TCS34725도 DFR0559에서 바로 전원을 공급

     

    완성

    여기에 TCS34725의 인터럽트 기능을 이용하여, 인터럽트 발생 시 통신하도록 코드를 수정하였다.

    테스트에서 사용한 코드는 LED 밝기를 부드럽게 조절하고 이를 출력하기 위해 인터럽트가 발생하지 않았을 때에도 계속 값을 출력했지만,

    이번에 작성한 코드는 인터럽트 발생 시점에만 1회 통신한다. 

    #include <Adafruit_TCS34725.h>
    #include <RF24.h>
    #include <SPI.h>
    #include <Wire.h>
    
    #define DATA_SIZE 32
    
    int valueR, valueG, valueB;
    
    // Initialise with specific int time and gain values
    Adafruit_TCS34725 tcs =
        Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_614MS, TCS34725_GAIN_1X);
    const int interruptPin = 2;
    volatile boolean state = false;
    
    // Interrupt Service Routine
    void isr() { state = true; }
    
    // Instantiate an object for the nRF24L01 transceiver
    RF24 radio(7, 8); // using pin 7 for the CE pin, and pin 8 for the CSN pin
    
    uint8_t address[7] = "TXNode";
    
    void getRawData_noDelay(uint16_t *r, uint16_t *g, uint16_t *b, uint16_t *c) {
      *c = tcs.read16(TCS34725_CDATAL);
      *r = tcs.read16(TCS34725_RDATAL);
      *g = tcs.read16(TCS34725_GDATAL);
      *b = tcs.read16(TCS34725_BDATAL);
    }
    
    void setup(void) {
      pinMode(interruptPin,
              INPUT_PULLUP); // TCS interrupt output is Active-LOW and Open-Drain
      attachInterrupt(digitalPinToInterrupt(interruptPin), isr, FALLING);
    
      // Serial.begin(115200);
    
      // wait until tcs.begin() returns true
      while (!tcs.begin()) {
        // Serial.println("No TCS34725 found");
        delay(1000);
      }
      // Serial.println("Found TCS34725 sensor");
    
      // wait until radio.begin() returns true
      while (!radio.begin()) {
        // Serial.println("No radio module found");
        delay(1000);
      }
      // Serial.println("Found radio module");
    
      radio.setPALevel(RF24_PA_MIN); // RF24_PA_MAX is default.
      radio.setPayloadSize(DATA_SIZE);
      radio.openWritingPipe(address);
      radio.stopListening();
    
      // Set persistence filter to generate an interrupt for every RGB Cycle,
      // regardless of the integration limits
      tcs.write8(TCS34725_PERS, TCS34725_PERS_NONE);
      tcs.setInterrupt(true);
    
      // Serial.flush();
    }
    
    void loop(void) {
      // if interrupt is triggered, read the data and send raw data to the receiver
      if (state) {
        uint16_t r, g, b, c;
        getRawData_noDelay(&r, &g, &b, &c);
    
        // send raw data to the receiver
        char payload[DATA_SIZE];
        sprintf(payload, "%u, %u, %u, %u", r, g, b, c);
        radio.write(&payload, sizeof(payload));
        // Serial.println(payload);
    
        state = false;
        // clear interrupt flag
        tcs.clearInterrupt();
      }
    }

    이제 소비 전력을 더 줄이려면 Power ON LED를 뜯어내거나, ATmega328의 LOW POWER MODE를 설정하면 되는데,

    그렇게까지 할 필요가 있을까? 싶다. 전원 쪽 용량이 충분하다고 생각하기 때문에...

    그래서 테스트를 해 보긴 해야 하는데, 하필 TCS34725의 interrupt 기능이 맛이 갔다.

    결선 중 실수로 잘못 연결한 적이 있는데 그 때 죽어버린 게 아닌가 싶다.

     

    그렇다고 측정 시간만큼 delay()를 거는 무식한 코드로 가고 싶지는 않으니, 새 모듈이 올 때까지 일단 보류...

    '만들어보기 > 자연광 모방 조명' 카테고리의 다른 글

    2. nRF24L01과 씨름하기  (0) 2023.06.09
    1. TCS34725 테스트  (0) 2023.05.27
    0. 들어가며  (0) 2023.05.19
Designed by Tistory.