Introduction: Cubesat

CubeSats provide a cost effective platform for science investigations, new technology demonstrations and advanced mission concepts using constellations.The standard CubeSat size uses a "one unit" or "1U" measuring of 10x10x10 cms.

In physics, we have been building a model CubeSat that will travel to Mars and collect data on the climate. We have programmed and wired an Arduino, designed and built a CubeSat, and used the principles of circular and gravitational motion. Our class goal is to learn how to design, build and program a model of a Mars Orbiter, that will collect data & inform us on specific aspects of the planet.

Some of the criteria we were faced with are: the Cubesat with Arduino to weigh less than 1.3Kg, have a 10X10X10 cm Cubesat, protect Arduino, sturdy structure, collect data. The constraints we were faced with were cost, supplies, size & weight and unpredictability of the Arduino collecting data and the Cubesat staying in tack during a shake test.

My group, the CUTEsats, programmed our Arduino to measure the climate specifically the temperature of Mars atmosphere. This will allow us to analysis the temperatures to see if its suitable for human life in the future.

Step 1: Materials

List of parts used for Arduino:

List of parts used for Cubesat:

  • 3D printing filament
  • Zipties
  • Program for Cubesat design

Step 2: Tools & Safety Practices


  • File
  • Wire cutters
  • 3D printer
  • Zipties
  • Velcro
  • Exacto knife

Safety Practices:

  • Googles
  • Cutting mat
  • Working at a clean space
  • Being careful
  • Supervision by teacher

Step 3: How to Build a Cubesat & Wire an Arduino

Step by step instructions:


  1. Find a 3D file of Cubesat that would be printed
  2. Connect the computer to printer & get it started
  3. Cut out supports and put together


  1. Download Arduino IDE
  2. Wire up breadboard accordingly
  3. Copy sketch to IDE and upload to Arduino
  4. Make sure the Arduino, breadboard, and battery fit in Cubesat.

Step 4: Code for Arduino

<p>// which analog pin to connect<br>#define THERMISTORPIN A0         
// resistance at 25 degrees C
#define THERMISTORNOMINAL 10000      
// temp. for nominal resistance (almost always 25 C)
// how many samples to take and average, more takes longer
// but is more 'smooth'
#define NUMSAMPLES 5
// The beta coefficient of the thermistor (usually 3000-4000)
#define BCOEFFICIENT 3950
// the value of the 'other' resistor
#define SERIESRESISTOR 10000    </p><p>int redPin = 11;  // Red Leg of LED,  connected to digital pin 11  
 int grnPin = 10; // Green Leg of LED, connected to digital pin 10  
 int bluPin = 9; // Blue Leg of LED, connected to digital pin 9  
uint16_t samples[NUMSAMPLES];
void setup(void) {
  analogReference(EXTERNAL);</p><p>  pinMode(redPin, OUTPUT);  // Sets the LED pins as outputs  
  pinMode(grnPin, OUTPUT);  
  pinMode(bluPin, OUTPUT); 
void loop(void) {
  uint8_t i;
  float average;
  // take N samples in a row, with a slight delay
  for (i=0; i< NUMSAMPLES; i++) {
   samples[i] = analogRead(THERMISTORPIN);
  // average all the samples out
  average = 0;
  for (i=0; i< NUMSAMPLES; i++) {
     average += samples[i];
  average /= NUMSAMPLES;
  Serial.print("Average analog reading "); 
  // convert the value to resistance
  average = 1023 / average - 1;
  average = SERIESRESISTOR / average;
  Serial.print("Thermistor resistance "); 
  float steinhart;
  steinhart = average / THERMISTORNOMINAL;     // (R/Ro)
  steinhart = log(steinhart);                  // ln(R/Ro)
  steinhart /= BCOEFFICIENT;                   // 1/B * ln(R/Ro)
  steinhart += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To)
  steinhart = 1.0 / steinhart;                 // Invert
  steinhart -= 273.15;                         // convert to C
  Serial.print("Temperature "); 
  Serial.println(" *C");
  delay(1000);</p><p>  if((steinhart) >= 26.2)  
   digitalWrite(redPin, HIGH);  // red  
   digitalWrite(grnPin, LOW);  
   digitalWrite(bluPin, LOW);  
 if(((steinhart) < 26) && (steinhart)>= 23.2)  
   digitalWrite(redPin, HIGH);  // yellow  
   digitalWrite(grnPin, HIGH);  
   digitalWrite(bluPin, LOW);  
  if(((steinhart) < 23) && (steinhart) > 20.2)
   digitalWrite(grnPin, HIGH);  // green  
   digitalWrite(redPin, LOW);  
   digitalWrite(bluPin, LOW);  
 if(((steinhart) < 20) && ((steinhart) > 17.2))
   digitalWrite(grnPin, HIGH);  // aqua  
   digitalWrite(bluPin, HIGH);  
   digitalWrite(redPin, LOW);  
  if((steinhart) <= 17)  
   digitalWrite(bluPin, HIGH);  // blue  
   digitalWrite(grnPin, LOW);  
   digitalWrite(redPin, LOW);  

Step 5: Lessons Learned

Physics applied & used:

  • Circular motion and gravitational forces

Issues/problems encountered and troubleshooting:

  • Finding the right code and wiring for the Arduino
  • Finding a good 3D design to fit and protect the Arduino
  • Adjusting code to make sure the color displayed the right temperature

Advice for others who wish to do this project:

  • 3D print it so that the measurements will be right
  • Don't procrastinate on the building and programming

Step 6: Preliminary Tests

Flight Test:

  • had to withstand orbiting Mars for 30 seconds, this stimulated a Cubesat in space

Vibration Test:

  • had to withstand 25 volts of force for 30 seconds, this stimulated a Cubesat in a rocket launching into space

Step 7: Results

  • First picture is the color scale for our LED, to show changes in temperature
  • Second is the graph of date from the final flight of the CubeSat. The heat source in Mars didn't effect the temperature very much. The thermistor did not pick up the heat from Mars, so the atmosphere temperature seems suitable for human life so far.

Arduino Contest 2019

Participated in the
Arduino Contest 2019