본문 바로가기
큐브셋 초소형 인공위성

CubeSat - Full Wiring Diagram and All Sensors code

by 로니킴 2021. 9. 6.


본 연구의 목표는 큐브셋을 통해 우주 시스템을 이해하고 창의 임무 설계, 요구 조건 분석, 그리고 시스템 기본 설계 및 제작을 통해 학교에서 배워온 지식을 실제 응용하여 공학과 과학의 관계와 차이를 배우고 관련 전공에 대한 흥미를 유발하기 위함에 있다.  다양한 환경센서를 성층권에서 측정하는데 목적이 있다. 

 

목차

     

     

     


    CubeSat - Full Wiring Diagram and All Sensors code

     

     

     

     

     

     


    CubeSat 전제 연결도

    전체 연결도는 다음과 같다. 

     

     

    https://first.global/cubesat/

     

     

     


     

    CubeSat Full Code for All Sensors (.ino file)

    전제 소스코드는 다음과 같다. 

     

    CubeSat_Prototype_Full_Code.ino
    0.01MB

     

     

    //ArduCam Setup
    
    #include <Wire.h>
    #include <ArduCAM.h>
    #include "memorysaver.h"
    #if !(defined (OV5640_MINI_5MP_PLUS)||defined (OV5642_MINI_5MP_PLUS))
    #error Please select the hardware platform and camera module in the ../libraries/ArduCAM/memorysaver.h file
    #endif
    #define   FRAMES_NUM    0x00
    const int CS = 1;
    #define SD_CS 0
    bool is_header = false;
    int total_time = 0;
    #if defined (OV5640_MINI_5MP_PLUS)
      ArduCAM myCAM(OV5640, CS);
    #else
      ArduCAM myCAM(OV5642, CS);
    #endif
    uint8_t read_fifo_burst(ArduCAM myCAM);
    
    //Temperature Sensor Setup
    
    #include <OneWire.h>
    #include <DallasTemperature.h>
    #define ONE_WIRE_BUS 2
    OneWire oneWire(ONE_WIRE_BUS);
    DallasTemperature sensors(&oneWire);
    
    
    //ENV Shield Setup
    #include <Arduino_MKRENV.h>
    
    //RTC Setup
    #include "RTClib.h"
    RTC_DS3231 rtc;
    char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
    
    
    //SD card breakout setup
    #include <SPI.h>
    #include <SD.h>
    File myFile;
    
    
    
    //Grove Particle Sensor Setup
    #include <Seeed_HM330X.h>
    
    #ifdef  ARDUINO_SAMD_VARIANT_COMPLIANCE
        #define SERIAL_OUTPUT SerialUSB
    #else
        #define SERIAL_OUTPUT Serial
    #endif
    
    HM330X sensor;
    uint8_t buf[30];
    
    
    const char* str[] = {"sensor num: ", "PM1.0 concentration(CF=1,Standard particulate matter,unit:ug/m3): ",
                         "PM2.5 concentration(CF=1,Standard particulate matter,unit:ug/m3): ",
                         "PM10 concentration(CF=1,Standard particulate matter,unit:ug/m3): ",
                         "PM1.0 concentration(Atmospheric environment,unit:ug/m3): ",
                         "PM2.5 concentration(Atmospheric environment,unit:ug/m3): ",
                         "PM10 concentration(Atmospheric environment,unit:ug/m3): ",
                        };
    
    HM330XErrorCode print_result(const char* str, uint16_t value) {
        if (NULL == str) {
            return ERROR_PARAM;
        }
        SERIAL_OUTPUT.print(str);
        SERIAL_OUTPUT.println(value);
        return NO_ERROR;
    }
    
    HM330XErrorCode parse_result(uint8_t* data) {
        uint16_t value = 0;
        if (NULL == data) {
            return ERROR_PARAM;
        }
        for (int i = 1; i < 8; i++) {
            value = (uint16_t) data[i * 2] << 8 | data[i * 2 + 1];
            print_result(str[i - 1], value);
    
        }
    
        return NO_ERROR;
    }
    String airQuality;
    
    
    //Sound Detector
    String soundLevel;
    
    
    
    
    
    
    
    
    void setup() 
    {
      Serial.begin(115200);
      while (!Serial);
      
        //ENV Shield
        if (!ENV.begin()) {
        Serial.println("Failed to initialize!");
        while (1);
      }
    
    
      //Temperature Setup
       sensors.begin(); 
    
    
      //RTC Setup
        if (! rtc.begin()) {
        Serial.println("Couldn't find RTC");
        Serial.flush();
        abort();
      }
      // When time needs to be re-set on a previously configured device, the
      // following line sets the RTC to the date & time this sketch was compiled
      // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
      // This line sets the RTC with an explicit date & time, for example to set
      // January 21, 2014 at 3am you would call:
      // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
    
    //SD Setup
    if (!SD.begin(0)) {
        Serial.println("sd initialization failed!");
        while (1);
      }
      Serial.println("sd initialization done.");
    
    
      //ArduCam Setup
      
      uint8_t vid, pid;
    uint8_t temp;
    #if defined(__SAM3X8E__)
      Wire1.begin();
    #else
      Wire.begin();
    #endif
    Serial.println(F("ArduCAM Start!"));
    
    pinMode(CS, OUTPUT);
    digitalWrite(CS, HIGH);
    
    SPI.begin();
    myCAM.write_reg(0x07, 0x80);
    delay(100);
    myCAM.write_reg(0x07, 0x00);
    delay(100); 
      
    while(1){
      myCAM.write_reg(ARDUCHIP_TEST1, 0x55);
      temp = myCAM.read_reg(ARDUCHIP_TEST1);
      if(temp != 0x55)
      {
        Serial.println(F("SPI interface Error!"));
        delay(1000);continue;
      }else{
        Serial.println(F("SPI interface OK."));break;
      }
    }
    #if defined (OV5640_MINI_5MP_PLUS)
    while(1){
      //Check if the camera module type is OV5640
      myCAM.rdSensorReg16_8(OV5640_CHIPID_HIGH, &vid);
      myCAM.rdSensorReg16_8(OV5640_CHIPID_LOW, &pid);
      if ((vid != 0x56) || (pid != 0x40)){
        Serial.println(F("Can't find OV5640 module!"));
        delay(1000); continue;
      }else{
        Serial.println(F("OV5640 detected."));break;      
      }
    }
    #else
    while(1){
      //Check if the camera module type is OV5642
      myCAM.rdSensorReg16_8(OV5642_CHIPID_HIGH, &vid);
      myCAM.rdSensorReg16_8(OV5642_CHIPID_LOW, &pid);
      if ((vid != 0x56) || (pid != 0x42)){
        Serial.println(F("Can't find OV5642 module!"));
        delay(1000);continue;
      }else{
        Serial.println(F("OV5642 detected."));break;      
      }
    }
    #endif
    //Initialize SD Card
    while(!SD.begin(SD_CS))
    {
      Serial.println(F("SD Card Error!"));delay(1000);
    }
    Serial.println(F("SD Card detected."));
    
    
    //Change to JPEG capture mode and initialize the OV5640 module
    myCAM.set_format(JPEG);
    myCAM.InitCAM();
    myCAM.set_bit(ARDUCHIP_TIM, VSYNC_LEVEL_MASK);
    myCAM.clear_fifo_flag();
    myCAM.write_reg(ARDUCHIP_FRAMES, FRAMES_NUM);
    
    }
    
    
     
    void loop() 
    {
      //Real Time Clock
    
       if (rtc.lostPower()) {
        Serial.println("RTC lost power, let's set the time!");
        rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
      } 
      
        DateTime now = rtc.now();
    
        Serial.print(now.year(), DEC);
        Serial.print('/');
        Serial.print(now.month(), DEC);
        Serial.print('/');
        Serial.print(now.day(), DEC);
        Serial.print(" (");
        Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
        Serial.print(") ");
        Serial.print(now.hour(), DEC);
        Serial.print(':');
        Serial.print(now.minute(), DEC);
        Serial.print(':');
        Serial.print(now.second(), DEC);
        Serial.println();
    
        
      //Temperature Sensor
      sensors.requestTemperatures();
      Serial.print("DS18B20 Temperature: ");
      Serial.print(sensors.getTempCByIndex(0)); 
      Serial.print(" C, ");
      Serial.print(sensors.getTempFByIndex(0));
      Serial.println(" F");
        
      //ENV Shield
      float temperature = ENV.readTemperature();
      float humidity    = ENV.readHumidity();
      float pressure    = ENV.readPressure();
      float illuminance = ENV.readIlluminance();
      Serial.print("ENV Shield Temperature = ");
      Serial.print(temperature);
      Serial.println(" C");
      Serial.print("Humidity    = ");
      Serial.print(humidity);
      Serial.println(" %");
      Serial.print("Pressure    = ");
      Serial.print(pressure);
      Serial.println(" kPa");
      Serial.print("Illuminance = ");
      Serial.print(illuminance);
      Serial.println(" lx");
    
      
     //UV Sensor
      float sensorVoltage; 
      float sensorValue;
      float uVindex;
      sensorValue = analogRead(A6);
      sensorVoltage = sensorValue/1024*5;
      uVindex = sensorVoltage/0.1;
     // Serial.print("UV sensor reading = ");
     // Serial.print(sensorValue);
     // Serial.println("");
     // Serial.print("UV sensor voltage = ");
     // Serial.print(sensorVoltage);
     // Serial.println(" V");
      Serial.print("UV index    = ");
      Serial.println(uVindex);
    
    
      //Sound detector 
       int value;
      value = analogRead(A5);
      Serial.print("Sound Status: ");
      if(value <= 100){
        soundLevel = "Quiet";
      }else if( (value > 100) && (value <= 160) ) {
        soundLevel = "Moderate";
      }else if( (value > 160) && ( value <= 220) ) {
        soundLevel = "Loud";
      }else if(value > 220) {
        soundLevel = "Very Loud";
      }
      Serial.println(soundLevel);
    
      //Grove Particle Sensor
          if (sensor.read_sensor_value(buf, 29)) {
            SERIAL_OUTPUT.println("HM330X read result failed!!!");
        }
       if ((buf[7]) < 12.0) {
        airQuality = "Good";
       }else if ((buf[7]) < 35.4) {
        airQuality = "Moderate";
       }else if ((buf[7]) < 55.4) {
        airQuality = "Unhealthy for Sensitive Groups";
       }else if ((buf[7]) < 150.4) {
        airQuality = "Unhealthy";
       }else if ((buf[7]) < 250.4) {
        airQuality = "Very Unhealthy";
       }else {
        airQuality = "Hazardous";
       }
        
       Serial.print("Air Quality: ");
       Serial.println(airQuality);
       Serial.print("PM1.0 Concentration: ");
       Serial.print(buf[5]);
       Serial.println(" ug/m3");
       Serial.print("PM2.5 Concentration: ");
       Serial.print(buf[7]);
       Serial.println(" ug/m3");
       Serial.print("PM10 Concentration: ");
       Serial.print(buf[9]);
       Serial.println(" ug/m3");
    
    
    
    
       //SD Card
      myFile = SD.open("info.txt", FILE_WRITE);
    
      if (myFile) {
        Serial.println("Writing to SD card");
            
        myFile.print(now.year(), DEC);
        myFile.print('/');
        myFile.print(now.month(), DEC);
        myFile.print('/');
        myFile.print(now.day(), DEC);
        myFile.print(" (");
        myFile.print(daysOfTheWeek[now.dayOfTheWeek()]);
        myFile.print(") ");
        myFile.print(now.hour(), DEC);
        myFile.print(':');
        myFile.print(now.minute(), DEC);
        myFile.print(':');
        myFile.println(now.second(), DEC);
      myFile.print("DS18B20 Temperature: ");
      myFile.print(sensors.getTempCByIndex(0)); 
      myFile.print(" C, ");
      myFile.print(sensors.getTempFByIndex(0));
      myFile.println(" F");
      myFile.print("ENV Shield Temperature = ");
      myFile.print(temperature);
      myFile.println(" C");
      myFile.print("Humidity    = ");
      myFile.print(humidity);
      myFile.println(" %");
      myFile.print("Pressure    = ");
      myFile.print(pressure);
      myFile.println(" kPa");
      myFile.print("Illuminance = ");
      myFile.print(illuminance);
      myFile.println(" lx");
        myFile.print("UV index    = ");
        myFile.println(uVindex);
      myFile.print("Sound Status: ");
      myFile.println(soundLevel);
       myFile.print("Air Quality: ");
       myFile.println(airQuality);
       myFile.print("PM1.0 Concentration: ");
       myFile.print(buf[5]);
       myFile.println(" ug/m3");
       myFile.print("PM2.5 Concentration: ");
       myFile.print(buf[7]);
       myFile.println(" ug/m3");
       myFile.print("PM10 Concentration: ");
       myFile.print(buf[9]);
       myFile.println(" ug/m3");
       myFile.println("----------------------------------------------------------------------");
       myFile.println();
    
        myFile.close();
      } else {
        // if the file didn't open, print an error:
        Serial.println("error opening test.txt");
      }
    
      
        //ArduCam
    
        myCAM.flush_fifo();
    myCAM.clear_fifo_flag();
    #if defined (OV5640_MINI_5MP_PLUS)
      myCAM.OV5640_set_JPEG_size(OV5640_320x240);delay(1000);
    #else
      myCAM.OV5642_set_JPEG_size(OV5642_320x240);delay(1000);
    #endif
    //Start capture
    myCAM.start_capture();
    Serial.println(F("start capture."));
    total_time = millis();
    while ( !myCAM.get_bit(ARDUCHIP_TRIG, CAP_DONE_MASK)); 
    Serial.println(F("CAM Capture Done."));
    total_time = millis() - total_time;
    Serial.print(F("capture total_time used (in miliseconds):"));
    Serial.println(total_time, DEC);
    total_time = millis();
    read_fifo_burst(myCAM);
    total_time = millis() - total_time;
    Serial.print(F("save capture total_time used (in miliseconds):"));
    Serial.println(total_time, DEC);
    //Clear the capture done flag
    myCAM.clear_fifo_flag();
    
    Serial.println();
    //Line for organization
    Serial.println("------------------------------------------------------------------------");
    delay(5000);
    }
    uint8_t read_fifo_burst(ArduCAM myCAM)
    {
    uint8_t temp = 0, temp_last = 0;
    uint32_t length = 0;
    static int i = 0;
    static int k = 0;
    char str[8];
    File outFile;
    byte buf[256]; 
    length = myCAM.read_fifo_length();
    Serial.print(F("The fifo length is :"));
    Serial.println(length, DEC);
    if (length >= MAX_FIFO_SIZE) //8M
    {
      Serial.println("Over size.");
      return 0;
    }
    if (length == 0 ) //0 kb
    {
      Serial.println(F("Size is 0."));
      return 0;
    } 
    myCAM.CS_LOW();
    myCAM.set_fifo_burst();//Set fifo burst mode
    i = 0;
    while ( length-- )
    {
      temp_last = temp;
      temp =  SPI.transfer(0x00);
      //Read JPEG data from FIFO
      if ( (temp == 0xD9) && (temp_last == 0xFF) ) //If find the end ,break while,
      {
        buf[i++] = temp;  //save the last  0XD9     
        //Write the remain bytes in the buffer
        myCAM.CS_HIGH();
        outFile.write(buf, i);    
        //Close the file
        outFile.close();
        Serial.println(F("OK"));
        is_header = false;
        myCAM.CS_LOW();
        myCAM.set_fifo_burst();
        i = 0;
      }  
      if (is_header == true)
      { 
        //Write image data to buffer if not full
        if (i < 256)
         buf[i++] = temp;
        else
        {
          //Write 256 bytes image data to file
          myCAM.CS_HIGH();
          outFile.write(buf, 256);
          i = 0;
          buf[i++] = temp;
          myCAM.CS_LOW();
          myCAM.set_fifo_burst();
        }        
      }
      else if ((temp == 0xD8) & (temp_last == 0xFF))
      {
        is_header = true;
        myCAM.CS_HIGH();
        //Create a avi file
        k = k + 1;
        itoa(k, str, 10);
        strcat(str, ".jpg");
        //Open the new file
        outFile = SD.open(str, O_WRITE | O_CREAT | O_TRUNC);
        if (! outFile)
        {
          Serial.println(F("File open failed"));
          while (1);
        }
        myCAM.CS_LOW();
        myCAM.set_fifo_burst();   
        buf[i++] = temp_last;
        buf[i++] = temp;   
      }
    }
      myCAM.CS_HIGH();
      return 1;
    }

       

     

     

     


     

    모두의 아두이노 환경 센서 책

    [모두의 아두이노 환경 센서] 책은 예스24, 인터넷 교보문고, 알라딘, 인터파크도서, 영풍문고, 반디앤루니스 , 도서11번가 등에서 구입할 수 있다. 이 책에서는 PMS7003, GP2Y1010AU0F, PPD42NS, SDS011 미세먼지 센서, DHT22 온습도 센서, MH-Z19B 이산화탄소 센서, ZE08-CH2O 포름알데히드 센서, CCS811 총휘발성유기화합물 TVOC, GDK101 방사선(감마선) 센서, MQ-131 오존(O3) 센서, MQ-7 일산화탄소, MICS-4514 이산화질소 센서, MICS-6814 암모니아 센서, DGS-SO2 아황산가스(SO2) 센서, BME280 기압 센서, GUVA-S12SD 자외선(UV) 센서, MD0550 기류 센서, QS-FS01 풍속 센서(Wind speed) 를 사용한다.  

     

    모두의 아두이노 환경 센서

    아두이노와 센서로 내 건강을 지킬 수 있다!다양한 환경 센서를 실생활 프로젝트에 응용해보자!시중에 판매되고 있는 간이측정기도 센서로 값을 측정합니다. 똑같은 센서를 아두이노에 연결하

    book.naver.com

     

     

     

     



    댓글