diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..89cc49cbd652508924b868ea609fa8f6b758ec56
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,5 @@
+.pio
+.vscode/.browse.c_cpp.db*
+.vscode/c_cpp_properties.json
+.vscode/launch.json
+.vscode/ipch
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
new file mode 100644
index 0000000000000000000000000000000000000000..080e70d08b9811fa743afe5094658dba0ed6b7c2
--- /dev/null
+++ b/.vscode/extensions.json
@@ -0,0 +1,10 @@
+{
+    // See http://go.microsoft.com/fwlink/?LinkId=827846
+    // for the documentation about the extensions.json format
+    "recommendations": [
+        "platformio.platformio-ide"
+    ],
+    "unwantedRecommendations": [
+        "ms-vscode.cpptools-extension-pack"
+    ]
+}
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000000000000000000000000000000000000..dc21fb8fd05fcdae6b30dbb054561d3409cc93b7
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,13 @@
+{
+    "files.associations": {
+        "optional": "cpp",
+        "istream": "cpp",
+        "ostream": "cpp",
+        "system_error": "cpp",
+        "array": "cpp",
+        "functional": "cpp",
+        "tuple": "cpp",
+        "type_traits": "cpp",
+        "utility": "cpp"
+    }
+}
\ No newline at end of file
diff --git a/include/README b/include/README
new file mode 100644
index 0000000000000000000000000000000000000000..194dcd43252dcbeb2044ee38510415041a0e7b47
--- /dev/null
+++ b/include/README
@@ -0,0 +1,39 @@
+
+This directory is intended for project header files.
+
+A header file is a file containing C declarations and macro definitions
+to be shared between several project source files. You request the use of a
+header file in your project source file (C, C++, etc) located in `src` folder
+by including it, with the C preprocessing directive `#include'.
+
+```src/main.c
+
+#include "header.h"
+
+int main (void)
+{
+ ...
+}
+```
+
+Including a header file produces the same results as copying the header file
+into each source file that needs it. Such copying would be time-consuming
+and error-prone. With a header file, the related declarations appear
+in only one place. If they need to be changed, they can be changed in one
+place, and programs that include the header file will automatically use the
+new version when next recompiled. The header file eliminates the labor of
+finding and changing all the copies as well as the risk that a failure to
+find one copy will result in inconsistencies within a program.
+
+In C, the usual convention is to give header files names that end with `.h'.
+It is most portable to use only letters, digits, dashes, and underscores in
+header file names, and at most one dot.
+
+Read more about using header files in official GCC documentation:
+
+* Include Syntax
+* Include Operation
+* Once-Only Headers
+* Computed Includes
+
+https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html
diff --git a/lib/README b/lib/README
new file mode 100644
index 0000000000000000000000000000000000000000..6debab1e8b4c3faa0d06f4ff44bce343ce2cdcbf
--- /dev/null
+++ b/lib/README
@@ -0,0 +1,46 @@
+
+This directory is intended for project specific (private) libraries.
+PlatformIO will compile them to static libraries and link into executable file.
+
+The source code of each library should be placed in a an own separate directory
+("lib/your_library_name/[here are source files]").
+
+For example, see a structure of the following two libraries `Foo` and `Bar`:
+
+|--lib
+|  |
+|  |--Bar
+|  |  |--docs
+|  |  |--examples
+|  |  |--src
+|  |     |- Bar.c
+|  |     |- Bar.h
+|  |  |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html
+|  |
+|  |--Foo
+|  |  |- Foo.c
+|  |  |- Foo.h
+|  |
+|  |- README --> THIS FILE
+|
+|- platformio.ini
+|--src
+   |- main.c
+
+and a contents of `src/main.c`:
+```
+#include <Foo.h>
+#include <Bar.h>
+
+int main (void)
+{
+  ...
+}
+
+```
+
+PlatformIO Library Dependency Finder will find automatically dependent
+libraries scanning project source files.
+
+More information about PlatformIO Library Dependency Finder
+- https://docs.platformio.org/page/librarymanager/ldf.html
diff --git a/platformio.ini b/platformio.ini
new file mode 100644
index 0000000000000000000000000000000000000000..70a6eff3129902c347d7a2662dc42c07887b1326
--- /dev/null
+++ b/platformio.ini
@@ -0,0 +1,22 @@
+; PlatformIO Project Configuration File
+;
+;   Build options: build flags, source filter
+;   Upload options: custom upload port, speed and extra flags
+;   Library options: dependencies, extra library storages
+;   Advanced options: extra scripting
+;
+; Please visit documentation for the other options and examples
+; https://docs.platformio.org/page/projectconf.html
+
+[env:nucleo_f401re]
+platform = ststm32
+board = nucleo_f401re
+framework = arduino
+monitor_speed = 115200
+monitor_eol = LF
+monitor_echo = yes
+
+lib_deps = 
+    Wire
+    SPI
+    https://github.com/adafruit/Adafruit_TCS34725.git
diff --git a/src/main.cpp b/src/main.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..e2df9ccaee50c7d670bdf5fa4fb61c9addb3cef9
--- /dev/null
+++ b/src/main.cpp
@@ -0,0 +1,103 @@
+#include <Arduino.h>
+#include <Wire.h>
+#include "Adafruit_TCS34725.h"
+
+#define MOTOR_PIN_1 D6
+#define MOTOR_PIN_2 D5
+#define DEBOUNCE_TIME_MS 50
+
+// mode 0(default) - break, 1 - coast
+void motorForward(int speed, bool mode = 0);
+void motorBackwards(int speed, bool mode = 0);
+
+// Color sensor
+// Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_4X);
+
+bool forward = false;
+bool prev_button_state = true; // nominal high
+int prev_button_press_time = 0;
+
+void setup() {
+  Serial.begin(115200);
+
+  pinMode(A0, INPUT_ANALOG);
+  pinMode(MOTOR_PIN_1, OUTPUT);
+  pinMode(MOTOR_PIN_2, OUTPUT);
+  pinMode(USER_BTN, INPUT);
+
+  // Color sensor setup
+  // if (tcs.begin()) {
+  //   //Serial.println("Found sensor");
+  // } else {
+  //   Serial.println("No TCS34725 found ... check your connections");
+  //   while (1); // halt!
+  // }
+}
+
+void loop() {
+  bool current_button_state = digitalRead(USER_BTN);
+  
+  // Trigger on falling edge
+  if(prev_button_state && !current_button_state && (millis() - prev_button_press_time > DEBOUNCE_TIME_MS)) {
+    forward = !forward;
+    prev_button_press_time = millis();
+    Serial.print("Pressed: ");
+    Serial.println(forward);
+  }
+  prev_button_state = current_button_state;
+
+  int motor_speed = map(analogRead(A0), 0, 1023, 0, 255);
+  // Serial.println(motor_speed);
+  if (forward) {
+    motorForward(motor_speed);
+  } else {
+    motorBackwards(motor_speed);
+  }
+
+  // Color sensor code
+  // float red, green, blue;
+  // tcs.setInterrupt(false);  // turn on LED
+  // delay(60);  // takes 50ms to read
+  // tcs.getRGB(&red, &green, &blue);
+  // tcs.setInterrupt(true);  // turn off LED
+ 
+  // Serial.print("R:"); Serial.print(int(red));
+  // Serial.print("\tG:"); Serial.print(int(green));
+  // Serial.print("\tB:"); Serial.print(int(blue));
+ 
+  // Serial.print("\n");
+}
+
+void motorForward(int speed, bool mode) {
+  if (!mode) {
+    // Break
+    analogWrite(MOTOR_PIN_2, 255);
+    analogWrite(MOTOR_PIN_1, speed);
+  } else {
+    // Coast
+    analogWrite(MOTOR_PIN_2, 0);
+    analogWrite(MOTOR_PIN_1, 255-speed);
+  }
+  
+  Serial.print("Forward: ");
+  Serial.print(speed);
+  Serial.print(" ");
+  Serial.println(mode);
+}
+
+void motorBackwards(int speed, bool mode) {
+  if (!mode) {
+    // Break
+    analogWrite(MOTOR_PIN_1, 255);
+    analogWrite(MOTOR_PIN_2, speed);
+  } else {
+    // Coast
+    analogWrite(MOTOR_PIN_1, 0);
+    analogWrite(MOTOR_PIN_2, 255-speed);
+  }
+
+  Serial.print("Backwards: ");
+  Serial.print(speed);
+  Serial.print(" ");
+  Serial.println(mode);
+}
\ No newline at end of file
diff --git a/test/README b/test/README
new file mode 100644
index 0000000000000000000000000000000000000000..9b1e87bc67c90e7f09a92a3e855444b085c655a6
--- /dev/null
+++ b/test/README
@@ -0,0 +1,11 @@
+
+This directory is intended for PlatformIO Test Runner and project tests.
+
+Unit Testing is a software testing method by which individual units of
+source code, sets of one or more MCU program modules together with associated
+control data, usage procedures, and operating procedures, are tested to
+determine whether they are fit for use. Unit testing finds problems early
+in the development cycle.
+
+More information about PlatformIO Unit Testing:
+- https://docs.platformio.org/en/latest/advanced/unit-testing/index.html