commit e0bb4b3ae808d1c654b54c2accee620231ec0439 Author: Ulysse Cura Date: Thu May 8 18:31:20 2025 +0200 Initial Commit diff --git a/Code/.vscode/c_cpp_properties.json b/Code/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..1a9e4a1 --- /dev/null +++ b/Code/.vscode/c_cpp_properties.json @@ -0,0 +1,31 @@ +{ + "env": { + "myDefaultIncludePath": [ + "${env:PICO_SDK_PATH}/src/**/include/", + "${workspaceFolder}/build/generated/pico_base/" + ], + "myCompilerPath": "/usr/bin/arm-none-eabi-gcc" + }, + + "configurations": [ + { + "name": "Linux", + "intelliSenseMode": "linux-gcc-arm", + "includePath": [ + "${myDefaultIncludePath}" + ], + "compilerPath": "/usr/bin/arm-none-eabi-gcc", + "cStandard": "c11", + "cppStandard": "c++17", + "browse": { + "path": [ + "${workspaceFolder}" + ], + "limitSymbolsToIncludedHeaders": true, + "databaseFilename": "" + }, + "configurationProvider": "ms-vscode.cmake-tools" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/Code/.vscode/settings.json b/Code/.vscode/settings.json new file mode 100644 index 0000000..8c27341 --- /dev/null +++ b/Code/.vscode/settings.json @@ -0,0 +1,12 @@ +{ + "files.associations": { + "*.md": "markdown", + "binary_info.h": "c", + "i2c.h": "c", + "stdlib.h": "c", + "stdint.h": "c", + "gyro.h": "c", + "motors.h": "c", + "motion_control.h": "c" + } +} \ No newline at end of file diff --git a/Code/.vscode/tasks.json b/Code/.vscode/tasks.json new file mode 100644 index 0000000..c98bf9b --- /dev/null +++ b/Code/.vscode/tasks.json @@ -0,0 +1,25 @@ +{ + "tasks": [ + { + "type": "shell", + "command": "cd build; cmake ../; make", + "label": "CMake in build/", + "problemMatcher": [], + "group": { + "kind": "build", + "isDefault": false + } + }, + { + "type": "shell", + "command": "cd build; cmake ../; make Flash", + "label": "CMake & Make & Flash", + "problemMatcher": [], + "group": { + "kind": "build", + "isDefault": true + } + } + ], + "version": "2.0.0" +} \ No newline at end of file diff --git a/Code/CMakeLists.txt b/Code/CMakeLists.txt new file mode 100644 index 0000000..bcce13b --- /dev/null +++ b/Code/CMakeLists.txt @@ -0,0 +1,39 @@ +cmake_minimum_required(VERSION 3.13) + +include(pico_sdk_import.cmake) + +project(motion_controller C CXX ASM) +set(CMAKE_C_STNDARD 11) +set(CMAKE_CXX_STANDARD 17) + +set(PICO_EXAMPLES_PATH ${PROJECT_SOURCE_DIR}) + +pico_sdk_init() + +add_executable(motion_controller + src/main.c + src/robot.c + src/motors.c + src/gyro.c + src/motion_control.c + src/i2c_master.c + src/udp_client.c + src/udp_buffer.c +) + +target_link_libraries(motion_controller + hardware_i2c + hardware_pwm + hardware_uart + pico_stdlib +) + +pico_enable_stdio_usb(motion_controller 1) +pico_enable_stdio_uart(motion_controller 1) + +pico_add_extra_outputs(motion_controller) + +add_custom_target(Flash + DEPENDS motion_controller + COMMAND sudo picotool load -f ${PROJECT_BINARY_DIR}/motion_controller.uf2 +) diff --git a/Code/README.md b/Code/README.md new file mode 100644 index 0000000..e69de29 diff --git a/Code/pico_sdk_import.cmake b/Code/pico_sdk_import.cmake new file mode 100644 index 0000000..28efe9e --- /dev/null +++ b/Code/pico_sdk_import.cmake @@ -0,0 +1,62 @@ +# This is a copy of /external/pico_sdk_import.cmake + +# This can be dropped into an external project to help locate this SDK +# It should be include()ed prior to project() + +if (DEFINED ENV{PICO_SDK_PATH} AND (NOT PICO_SDK_PATH)) + set(PICO_SDK_PATH $ENV{PICO_SDK_PATH}) + message("Using PICO_SDK_PATH from environment ('${PICO_SDK_PATH}')") +endif () + +if (DEFINED ENV{PICO_SDK_FETCH_FROM_GIT} AND (NOT PICO_SDK_FETCH_FROM_GIT)) + set(PICO_SDK_FETCH_FROM_GIT $ENV{PICO_SDK_FETCH_FROM_GIT}) + message("Using PICO_SDK_FETCH_FROM_GIT from environment ('${PICO_SDK_FETCH_FROM_GIT}')") +endif () + +if (DEFINED ENV{PICO_SDK_FETCH_FROM_GIT_PATH} AND (NOT PICO_SDK_FETCH_FROM_GIT_PATH)) + set(PICO_SDK_FETCH_FROM_GIT_PATH $ENV{PICO_SDK_FETCH_FROM_GIT_PATH}) + message("Using PICO_SDK_FETCH_FROM_GIT_PATH from environment ('${PICO_SDK_FETCH_FROM_GIT_PATH}')") +endif () + +set(PICO_SDK_PATH "${PICO_SDK_PATH}" CACHE PATH "Path to the Raspberry Pi Pico SDK") +set(PICO_SDK_FETCH_FROM_GIT "${PICO_SDK_FETCH_FROM_GIT}" CACHE BOOL "Set to ON to fetch copy of SDK from git if not otherwise locatable") +set(PICO_SDK_FETCH_FROM_GIT_PATH "${PICO_SDK_FETCH_FROM_GIT_PATH}" CACHE FILEPATH "location to download SDK") + +if (NOT PICO_SDK_PATH) + if (PICO_SDK_FETCH_FROM_GIT) + include(FetchContent) + set(FETCHCONTENT_BASE_DIR_SAVE ${FETCHCONTENT_BASE_DIR}) + if (PICO_SDK_FETCH_FROM_GIT_PATH) + get_filename_component(FETCHCONTENT_BASE_DIR "${PICO_SDK_FETCH_FROM_GIT_PATH}" REALPATH BASE_DIR "${CMAKE_SOURCE_DIR}") + endif () + FetchContent_Declare( + pico_sdk + GIT_REPOSITORY https://github.com/raspberrypi/pico-sdk + GIT_TAG master + ) + if (NOT pico_sdk) + message("Downloading Raspberry Pi Pico SDK") + FetchContent_Populate(pico_sdk) + set(PICO_SDK_PATH ${pico_sdk_SOURCE_DIR}) + endif () + set(FETCHCONTENT_BASE_DIR ${FETCHCONTENT_BASE_DIR_SAVE}) + else () + message(FATAL_ERROR + "SDK location was not specified. Please set PICO_SDK_PATH or set PICO_SDK_FETCH_FROM_GIT to on to fetch from git." + ) + endif () +endif () + +get_filename_component(PICO_SDK_PATH "${PICO_SDK_PATH}" REALPATH BASE_DIR "${CMAKE_BINARY_DIR}") +if (NOT EXISTS ${PICO_SDK_PATH}) + message(FATAL_ERROR "Directory '${PICO_SDK_PATH}' not found") +endif () + +set(PICO_SDK_INIT_CMAKE_FILE ${PICO_SDK_PATH}/pico_sdk_init.cmake) +if (NOT EXISTS ${PICO_SDK_INIT_CMAKE_FILE}) + message(FATAL_ERROR "Directory '${PICO_SDK_PATH}' does not appear to contain the Raspberry Pi Pico SDK") +endif () + +set(PICO_SDK_PATH ${PICO_SDK_PATH} CACHE PATH "Path to the Raspberry Pi Pico SDK" FORCE) + +include(${PICO_SDK_INIT_CMAKE_FILE}) diff --git a/Code/src/main.c b/Code/src/main.c new file mode 100644 index 0000000..e69de29 diff --git a/CodeCell/Main/IO.hpp b/CodeCell/Main/IO.hpp new file mode 100644 index 0000000..5c80810 --- /dev/null +++ b/CodeCell/Main/IO.hpp @@ -0,0 +1,350 @@ +/* *\ +* Copyright 2025 * +* Thibaut Ferrand / Ulysse Cura * +\* */ + +#include +#include +#include +#include +#include "Ressources.hpp" + +#define PIN_TIRETTE 5 +#define PIN_BUTTON_COLOR 6 +#define PIN_MOTOR1 1 +#define PIN_MOTOR2 2 +#define PIN_SERVO 7 + +#define DANCING_ACTION_DELTA_ANGLE 2 + +#define GAIN_KD 50 +#define ANGULAR_SPEED 120 // °/s + +using std::abs, std::signbit; + +enum class Axes { + X, + Y, + Z +}; + +class Motor { + public: + int init(int pin, int channel) + { + m_pin = pin; + m_channel = channel; + + pinMode(m_pin, OUTPUT); + + ledcAttachChannel(m_pin, 5000, 12, m_channel); + ledcWriteChannel(m_channel, 0); + + return 0; + } + + void setSpeed(int speed) + { + if(speed > 4095) speed = 4095; + + ledcWriteChannel(m_channel, speed); + } + + private: + int m_pin; + int m_channel; +}; + +class IO { + public: + IO(CodeCell *code_cell) : m_code_cell(code_cell) + {} + + int init() + { + int nb_errors {0}; + + pinMode(PIN_TIRETTE, INPUT_PULLUP); + pinMode(PIN_BUTTON_COLOR, INPUT_PULLUP); + + initGyroscope(); + + m_initMotors(); + m_initServo(); + + nb_errors += m_initScreen(); + + if(!nb_errors) + { + m_screen.setTextSize(1); + m_screen.setTextColor(WHITE, BLACK); + m_screen.setFont(&Res::Fonts::Freshman12pt7b); + } + + return nb_errors; + } + + void initGyroscope() + { + m_code_cell->Motion_RotationRead(m_init_x, m_init_y, m_init_z); + } + + int update() + { + static unsigned long last_color_change_time {0}; + static bool has_color_changed {true}; + static bool is_color_blue {true}; + + if(m_is_color_blue != is_color_blue) + { + m_screen.clearDisplay(); + m_screen.setCursor(0, 20); + + if(is_color_blue) + { + m_screen.print("Blue\nTeam"); + } + else + { + m_screen.print("Yellow\nTeam"); + } + + last_color_change_time = millis(); + + has_color_changed = true; + } + + if(millis() - last_color_change_time > 1000 && has_color_changed) + { + m_screen.clearDisplay(); + m_screen.drawBitmap(38, 0, Res::Imgs::riombotique, 52, 64, WHITE); + //m_screen.drawBitmap(75, 0, Imgs::poivron_robotique, 52, 64, WHITE); + //m_screen.drawBitmap(27, 0, Res::Imgs::diable_gaga, 75, 64, WHITE); + + has_color_changed = false; + } + + m_is_tirette_pulled = (digitalRead(PIN_TIRETTE) == HIGH); + m_is_color_blue = is_color_blue; + + is_color_blue = (digitalRead(PIN_BUTTON_COLOR) == LOW); + + if(m_is_motor_control_activated) + { + m_updateMotorsControl(); + } + + if(m_is_dancing) + { + m_updateDancingAction(); + } + + m_updateScreen(); + + return 0; + } + + bool isTirettePulled() + { + return m_is_tirette_pulled; + } + + bool isSelectedColorBlue() + { + return m_is_color_blue; + } + + void motorControlOn() + { + m_is_motor_control_activated = true; + } + + void motorControlOff() + { + m_is_motor_control_activated = false; + + m_motors[0].setSpeed(0); + m_motors[1].setSpeed(0); + } + + void setDirWithAngularSpeed(float dir, float angular_speed = ANGULAR_SPEED) + { + static unsigned long prev_time {millis()}; + float err_dir = dir - m_dir; + float angular_displacement = angular_speed * static_cast(millis() - prev_time) / 1000.0f; + + if(abs(err_dir) < abs(angular_displacement)) + { + m_dir = dir; + } + else + { + m_dir += angular_displacement * ((!signbit(err_dir)) * 2 - 1); + } + + prev_time = millis(); + } + + void setDir(float dir) + { + m_dir = dir; + } + + void setSpeed(float speed) + { + m_speed = speed; + } + + float getAngle(Axes axis) + { + float x, y, z; + float angle; + + m_code_cell->Motion_RotationRead(x, y, z); + + switch(axis) + { + case Axes::X: + angle = x - m_init_x; + if(angle < -180) angle += 360; + if(angle > 180) angle -= 360; + return angle; + + case Axes::Y: + angle = y - m_init_y; + if(angle < -180) angle += 360; + if(angle > 180) angle -= 360; + return angle; + + default: + angle = z - m_init_z; + if(angle < -180) angle += 360; + if(angle > 180) angle -= 360; + return angle; + } + } + + void startDancingAction(int dancing_action_delta_angle = DANCING_ACTION_DELTA_ANGLE) + { + m_dancing_action_delta_angle = dancing_action_delta_angle; + m_is_dancing = true; + } + + Adafruit_SSD1306 *getScreen() + { + return &m_screen; + } + + Motor *getMotor(int motor) + { + return &(m_motors[motor]); + } + + private: + // Init Motors + void m_initMotors() + { + m_motors[0].init(PIN_MOTOR1, 0); + m_motors[1].init(PIN_MOTOR2, 1); + } + + // Init Servo + void m_initServo() + { + m_servo.setPeriodHertz(50); + m_servo.attach(PIN_SERVO, 500, 2400); + + m_servo.write(87); + } + + // Init Screen + int m_initScreen() + { + if(!m_screen.begin(SSD1306_SWITCHCAPVCC, 0x3C)) + { + Serial.println("SSD1306 allocation failed."); + return -1; + } + + m_screen.fillScreen(SSD1306_BLACK); + + return 0; + } + + void m_updateDancingAction() + { + static unsigned long prev_time {millis()}; + static unsigned long delta_time {0}; + static int actual_angle {87}; + static int8_t actual_dir {-1}; + + delta_time += millis() - prev_time; + + if(delta_time >= 10) + { + delta_time = 0; + + actual_angle += actual_dir * m_dancing_action_delta_angle; + } + + if(actual_angle <= 43) + { + actual_dir = 1; + } + else if(actual_angle >= 130) + { + actual_dir = -1; + } + + m_servo.write(actual_angle); + + prev_time = millis(); + } + + void m_updateMotorsControl() + { + float actual_angle = getAngle(Axes::Z); + float error = m_dir - actual_angle; + + float correction = error * GAIN_KD; + + int m1_speed = static_cast(m_speed + correction); + int m2_speed = static_cast(m_speed - correction); + + if(m1_speed < 0) + { + m1_speed = 0; + //m2_speed = static_cast(m_speed - 2 * correction); + } + else if(m2_speed < 0) + { + m2_speed = 0; + //m1_speed = static_cast(m_speed + 2 * correction); + } + + m_motors[0].setSpeed(m1_speed); + m_motors[1].setSpeed(m2_speed); + } + + void m_updateScreen() + { + m_screen.display(); + } + + bool m_is_motor_control_activated {false}; + bool m_is_tirette_pulled {false}; + bool m_is_color_blue {false}; + bool m_is_dancing {false}; + + Motor m_motors[2]; + Servo m_servo; + + Adafruit_SSD1306 m_screen {128, 64, &Wire, -1}; + + CodeCell *m_code_cell; + + float m_init_x, m_init_y, m_init_z; + float m_dir {0}; + float m_speed {0}; + int m_dancing_action_delta_angle {DANCING_ACTION_DELTA_ANGLE}; +}; \ No newline at end of file diff --git a/CodeCell/Main/Main.ino b/CodeCell/Main/Main.ino new file mode 100644 index 0000000..73f654a --- /dev/null +++ b/CodeCell/Main/Main.ino @@ -0,0 +1,200 @@ +/* *\ +* Copyright 2025 * +* Thibaut Ferrand / Ulysse Cura * +\* */ + +#include "IO.hpp" + +#define NORMAL_SPEED 2048.0f +#define TURNING_SPEED 1500.0f +#define ON_STAGE_SPEED 1120.0f + +#define RAMPE_ANGLE -7.82907651006f +#define RAMPE_ANGLE_OFFSET 1.0f +#define RAMPE_START_ANGLE RAMPE_ANGLE / 2 - RAMPE_ANGLE_OFFSET +#define RAMPE_END_ANGLE RAMPE_ANGLE / 2 + RAMPE_ANGLE_OFFSET + +// Unit tests activation +//#define UNIT_TESTS + +/* + Etapes : + - 1ere etape : avancer jusqu'a la montée / condition : si montée detecté : etape suivante + - 2eme etape : avancer j'usqua la fin de la montée / condition : si fin de montée detecté : etape suivante + - 3eme etape : tourner de 90* / condition : si action terminé : etape suivante + - 4eme etape : avancer jusqu'au bors du plateau / condition : si choc de fin detecté : etape suivante + - 5eme etape : faire tourner actionneurs pour figurine +*/ + +/* + Modules necessaires : + - angle // Asservissement et control du robot + - choc // Controle du robot (fin !) +(?)- accelerometre // Asservissement + */ + +// Movement states +enum class State { + WaitingForTirette, + WaitingTimer, + ForwardToRamp, + ForwardToScene, + Turn90Blue, // If blue team + Turn90Yellow, // If yellow team => this is the only action where you have to do something different depending on your team + ForwardToSceneEdge, + Dancing +}; + +// CodeCell implementation +CodeCell code_cell; +IO my_IO {&code_cell}; + +void setup() +{ + // Initialise serial + Serial.begin(115200); + + Serial.println("Starting Initialisation"); + + // Initialise the CodeCell for angle and tap detectIOn + code_cell.Init(MOTION_ROTATION); + + // Initialise IO + int nb_errors = my_IO.init(); + + if(nb_errors) + { + Serial.printf("%d errors occured during IO init.", nb_errors); + while(true); + } + + Serial.println("Initalisation Finished"); + + my_IO.motorControlOn(); + + my_IO.setDir(0); + my_IO.setSpeed(0.0f); + //my_IO.startDancingAction(15); + +#ifdef UNIT_TESTS + Serial.println("UNIT_TESTS"); +#endif + + Serial.println(RAMPE_ANGLE); + Serial.println(RAMPE_ANGLE_OFFSET); + Serial.println(RAMPE_START_ANGLE); + Serial.println(RAMPE_END_ANGLE); +} + +#ifdef UNIT_TESTS + +void loop() +{ + code_cell.Run(100); + my_IO.update(); + + Serial.print("Angle axe X: "); + Serial.println(my_IO.getAngle(Axes::X)); + Serial.print("Angle axe Y: "); + Serial.println(my_IO.getAngle(Axes::Y)); + Serial.print("Angle axe Z: "); + Serial.println(my_IO.getAngle(Axes::Z)); + + //Serial.printf("Is Color Blue Selected : %d\n", my_IO.isSelectedColorBlue()); + //Serial.printf("Is Tirette Pulled : %d\n", my_IO.isTirettePulled()); + + //my_IO.startDancingAction(); + + my_IO.motorControlOff(); + //my_IO.setSpeed(2048); + //my_IO.setDirWithAngularSpeed(90); +} + +#else + +void loop() +{ + static State actual_state {State::WaitingForTirette}; + + Serial.print("Angle : "); + Serial.println(my_IO.getAngle(Axes::Z)); + + code_cell.Run(10); + my_IO.update(); + + switch(actual_state) + { + case State::WaitingForTirette: + if(my_IO.isTirettePulled()) + { + actual_state = State::WaitingTimer; + } + break; + + case State::WaitingTimer: + static unsigned long initial_time = millis(); + + //if(millis() - initial_time >= 87000) + if(millis() - initial_time >= 2000) + { + my_IO.initGyroscope(); + actual_state = State::ForwardToRamp; + } + break; + + case State::ForwardToRamp: + my_IO.motorControlOn(); + my_IO.setSpeed(2000.0f); + + if(my_IO.getAngle(Axes::Y) < RAMPE_START_ANGLE) + { + actual_state = State::ForwardToScene; + } + break; + + case State::ForwardToScene: + my_IO.setSpeed(2000.0f); + if(my_IO.getAngle(Axes::Y) > RAMPE_END_ANGLE) + { + my_IO.setSpeed(1300.0f); + actual_state = my_IO.isSelectedColorBlue() ? State::Turn90Blue : State::Turn90Yellow; + //actual_state = State::Dancing; + } + break; + + case State::Turn90Blue: + my_IO.setDirWithAngularSpeed(90.0f); + + if(my_IO.getAngle(Axes::Z) >= 80.0f) + { + actual_state = State::ForwardToSceneEdge; + } + break; + + case State::Turn90Yellow: + my_IO.setDirWithAngularSpeed(-90.0f); + + if(my_IO.getAngle(Axes::Z) <= -80.0f) + { + actual_state = State::ForwardToSceneEdge; + } + break; + + case State::ForwardToSceneEdge: + my_IO.setSpeed(1100.0f); + + if(my_IO.getAngle(Axes::Y) > 3.0f) + { + actual_state = State::Dancing; + } + break; + + case State::Dancing: + my_IO.motorControlOff(); + my_IO.setSpeed(0.0f); + my_IO.startDancingAction(); + break; + } +} + +#endif diff --git a/CodeCell/Main/README.md b/CodeCell/Main/README.md new file mode 100644 index 0000000..84e8b34 --- /dev/null +++ b/CodeCell/Main/README.md @@ -0,0 +1,7 @@ +# Requirements : +(you should take the exact versions) + +Library `CodeCell` Version 1.2.4 +Library `ESP32Servo` Version 3.0.6 +Library `Adafruit SSD1306` Version 2.5.13 +Library `Adafruit BusIO` Version 1.17.0 diff --git a/CodeCell/Main/Ressources.hpp b/CodeCell/Main/Ressources.hpp new file mode 100644 index 0000000..d520d04 --- /dev/null +++ b/CodeCell/Main/Ressources.hpp @@ -0,0 +1,494 @@ +/* *\ +* Copyright 2025 * +* Thibaut Ferrand / Ulysse Cura * +\* */ + +namespace Res +{ + namespace Imgs + { + constexpr const unsigned char riombotique [] PROGMEM = { + 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x03, 0xe0, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x00, 0x38, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x07, 0x86, 0x00, 0x00, 0x00, 0x04, 0x06, + 0x0f, 0xc2, 0x00, 0x00, 0x00, 0x04, 0x19, 0x98, 0x62, 0x00, 0x00, 0x00, 0x04, 0x20, 0x50, 0x22, + 0x00, 0x00, 0x00, 0x14, 0x20, 0x50, 0x22, 0xc0, 0x00, 0x00, 0x34, 0x20, 0x50, 0x22, 0xe0, 0x00, + 0x00, 0x74, 0x20, 0x58, 0x62, 0xa0, 0x00, 0x00, 0xf4, 0x10, 0x8f, 0xc2, 0xb0, 0x00, 0x00, 0xf4, + 0x0f, 0x07, 0x82, 0xb0, 0x00, 0x00, 0x74, 0x00, 0x00, 0x02, 0xa0, 0x00, 0x00, 0x34, 0x00, 0x00, + 0x02, 0xc0, 0x00, 0x00, 0x14, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x03, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x08, 0x07, 0xff, 0x00, 0x80, 0x00, 0x00, 0x18, 0x07, 0xff, 0x00, 0x80, 0x00, + 0x01, 0x98, 0x07, 0xff, 0x00, 0xc0, 0x00, 0x03, 0xd8, 0x00, 0x00, 0x00, 0xc4, 0x00, 0x03, 0x58, + 0x00, 0x00, 0x00, 0xde, 0x00, 0x02, 0x38, 0x00, 0x00, 0x00, 0xfa, 0x00, 0x02, 0x38, 0x00, 0x00, + 0x00, 0xe2, 0x00, 0x06, 0x78, 0x00, 0x00, 0x00, 0xe1, 0x00, 0x04, 0x78, 0x00, 0x00, 0x00, 0xe1, + 0x00, 0x04, 0x78, 0x00, 0x00, 0x00, 0xe1, 0x00, 0x0c, 0x78, 0x00, 0x00, 0x00, 0xe1, 0x00, 0x08, + 0xf8, 0x00, 0x00, 0x00, 0xf0, 0x80, 0x08, 0xf8, 0x00, 0x00, 0x00, 0xf0, 0x80, 0x08, 0x98, 0x00, + 0x00, 0x00, 0xf0, 0x80, 0x11, 0x98, 0x00, 0x00, 0x00, 0xf0, 0x40, 0x19, 0x88, 0x00, 0x00, 0x00, + 0x98, 0x40, 0x3f, 0x0c, 0x00, 0x00, 0x01, 0x0c, 0xc0, 0x36, 0x04, 0x00, 0x00, 0x01, 0x07, 0xe0, + 0x22, 0x04, 0x00, 0x00, 0x01, 0x07, 0x20, 0x22, 0x06, 0x00, 0x00, 0x02, 0x04, 0x20, 0x62, 0x02, + 0x00, 0x00, 0x02, 0x04, 0x20, 0x44, 0x02, 0x00, 0x00, 0x06, 0x02, 0x30, 0x44, 0x03, 0x00, 0x00, + 0x04, 0x02, 0x10, 0x44, 0x01, 0x00, 0x60, 0x04, 0x02, 0x30, 0xc4, 0x01, 0x80, 0x60, 0x08, 0x03, + 0xf0, 0xc8, 0x01, 0x80, 0x00, 0x18, 0x03, 0xb0, 0xf8, 0x00, 0xff, 0xff, 0xf0, 0x01, 0x20, 0x98, + 0x00, 0x7f, 0xff, 0xe0, 0x01, 0xe0, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xfc, 0x00, 0x00 + }; + + constexpr const unsigned char poivron_robotique [] PROGMEM = { + 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x60, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x00, 0x21, 0x00, 0x00, 0x00, 0x06, 0x19, + 0x80, 0x21, 0x00, 0x00, 0x00, 0x08, 0x06, 0x60, 0x42, 0x00, 0x00, 0x00, 0x10, 0x01, 0x10, 0x42, + 0x00, 0x00, 0x00, 0x20, 0x00, 0x88, 0x42, 0x00, 0x00, 0x00, 0x20, 0x00, 0x44, 0x82, 0x00, 0x00, + 0x00, 0x40, 0x00, 0x42, 0x84, 0x00, 0x00, 0x00, 0x80, 0x01, 0xfb, 0x04, 0x00, 0x00, 0x00, 0x80, + 0x02, 0x06, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x86, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x49, 0x80, 0x00, 0x02, 0x00, 0x00, 0x00, 0x28, 0x60, 0x00, 0x02, 0x00, 0x00, 0x00, 0x18, 0x10, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x07, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x04, + 0x00, 0x80, 0x00, 0x00, 0x24, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x13, 0x00, 0x08, 0x01, 0x00, + 0x00, 0x00, 0x08, 0xc0, 0x10, 0x02, 0x00, 0x00, 0x00, 0x08, 0x20, 0x10, 0x02, 0x00, 0x00, 0x10, + 0x04, 0x20, 0x10, 0x04, 0x00, 0x00, 0x10, 0x04, 0x10, 0x20, 0x04, 0x00, 0x00, 0x10, 0x00, 0x10, + 0x20, 0x08, 0x00, 0x00, 0x20, 0x00, 0x10, 0x20, 0x08, 0x00, 0x00, 0x20, 0x00, 0x10, 0x20, 0x08, + 0x00, 0x00, 0x40, 0x00, 0x10, 0x40, 0x10, 0x00, 0x00, 0x48, 0x00, 0x10, 0x40, 0x10, 0x00, 0x00, + 0x8c, 0x00, 0x10, 0x40, 0x10, 0x00, 0x00, 0x9e, 0x01, 0x20, 0x40, 0x20, 0x00, 0x01, 0x1e, 0x03, + 0x20, 0x40, 0x20, 0x00, 0x01, 0x1f, 0x07, 0x40, 0x80, 0x20, 0x00, 0x02, 0x0c, 0x0e, 0x40, 0x80, + 0x40, 0x00, 0x02, 0x00, 0x00, 0x80, 0x80, 0x40, 0x00, 0x04, 0x00, 0x01, 0x00, 0x80, 0x40, 0x00, + 0x04, 0x00, 0x01, 0x00, 0x80, 0x80, 0x00, 0x08, 0x00, 0x02, 0x00, 0x80, 0x80, 0x00, 0x08, 0x3f, + 0x84, 0x00, 0x80, 0x80, 0x00, 0x10, 0xdf, 0xc4, 0x00, 0x80, 0x80, 0x00, 0x11, 0xdf, 0xe8, 0x00, + 0x81, 0x00, 0x00, 0x27, 0xff, 0xb0, 0x00, 0x81, 0x00, 0x00, 0x2f, 0xff, 0xb0, 0x00, 0x81, 0x00, + 0x00, 0x5f, 0xff, 0xe0, 0x00, 0x42, 0x00, 0x00, 0x5f, 0xff, 0xc0, 0x00, 0x42, 0x00, 0x00, 0xbf, + 0xff, 0xc0, 0x00, 0x42, 0x00, 0x00, 0xbf, 0xff, 0x80, 0x00, 0x22, 0x00, 0x01, 0x3f, 0xff, 0x00, + 0x00, 0x12, 0x00, 0x01, 0x3f, 0xfe, 0x00, 0x00, 0x0e, 0x00, 0x02, 0x1f, 0xfc, 0x00, 0x00, 0x02, + 0x00, 0x04, 0x1f, 0xf8, 0x00, 0x00, 0x01, 0x00, 0x08, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x80, 0x10, + 0x01, 0xe0, 0x00, 0x00, 0x00, 0x40, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, 0x3f, 0xc0, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0x00 + }; + + const unsigned char diable_gaga [] PROGMEM = { + 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x81, 0xfe, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x87, 0x03, 0x81, 0x80, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x9c, 0x00, 0xe1, 0x40, 0x18, 0x00, 0x00, 0x00, 0x00, 0x04, 0xb0, 0x00, 0x32, 0x40, + 0x28, 0x80, 0x00, 0x00, 0x00, 0x04, 0xe0, 0x00, 0x1a, 0x40, 0x28, 0x80, 0x00, 0x00, 0x00, 0x04, + 0x60, 0x00, 0x0e, 0x40, 0x49, 0x80, 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x51, 0x80, + 0x00, 0x00, 0x00, 0x06, 0x80, 0x00, 0x02, 0xc1, 0x53, 0x80, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x03, 0x83, 0x52, 0x80, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x07, 0x54, 0x80, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x01, 0x8d, 0x54, 0x80, 0x00, 0x00, 0x00, 0x02, 0x38, 0x00, 0x38, 0x8d, + 0x55, 0x80, 0x00, 0x00, 0x00, 0x02, 0x78, 0x00, 0x7c, 0x99, 0x55, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x6c, 0x00, 0xe4, 0x8a, 0x55, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x44, 0x01, 0xc4, 0xea, 0xa5, 0x00, + 0x00, 0x00, 0x01, 0xcb, 0x06, 0x01, 0x81, 0x2a, 0xaa, 0x00, 0x00, 0x00, 0x03, 0xe9, 0x0e, 0x01, + 0xc1, 0x2a, 0xaa, 0x00, 0x00, 0x00, 0x06, 0x29, 0x89, 0x02, 0x63, 0x54, 0xaa, 0x00, 0x00, 0x00, + 0x04, 0x24, 0x9a, 0x85, 0x22, 0x54, 0xb6, 0x00, 0x00, 0x00, 0x04, 0x24, 0x93, 0x5b, 0x22, 0xd7, + 0xdc, 0x00, 0x00, 0x00, 0x0c, 0x26, 0x90, 0x78, 0x22, 0x50, 0x78, 0x00, 0x00, 0x00, 0x08, 0x24, + 0x88, 0x8c, 0x42, 0xdf, 0x40, 0x00, 0x00, 0x01, 0xe8, 0x27, 0x87, 0x6b, 0x83, 0x81, 0x40, 0x00, + 0x00, 0x03, 0x38, 0x23, 0x00, 0x38, 0x01, 0x81, 0x40, 0x00, 0x00, 0x02, 0x28, 0x43, 0x04, 0x00, + 0x81, 0x81, 0x40, 0x00, 0x00, 0x02, 0x28, 0x43, 0x06, 0x01, 0x80, 0x82, 0x80, 0x00, 0x00, 0x01, + 0xe8, 0xf9, 0x03, 0xff, 0x00, 0x82, 0x80, 0x00, 0x00, 0x00, 0xc8, 0xcd, 0xc0, 0x00, 0x01, 0x82, + 0x80, 0x00, 0x00, 0x00, 0x88, 0x84, 0x78, 0x00, 0x7f, 0x02, 0x80, 0x00, 0x00, 0x00, 0x88, 0x86, + 0x1f, 0xff, 0xf8, 0x02, 0x80, 0x00, 0x00, 0x01, 0x01, 0x07, 0xcf, 0xff, 0x00, 0x05, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x07, 0xf8, 0x02, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x80, 0x0c, 0x00, 0x01, + 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, 0x10, 0x00, 0x80, 0x05, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0x04, 0x30, 0x11, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x24, 0x04, 0x60, 0x11, 0x40, 0x6f, + 0x00, 0x00, 0x00, 0x00, 0x3e, 0x0f, 0xc0, 0x09, 0xe0, 0xff, 0x80, 0x00, 0x00, 0x0f, 0x0f, 0xf8, + 0x80, 0x08, 0xb9, 0x98, 0x80, 0x00, 0x00, 0x3f, 0xc1, 0xe1, 0x80, 0x10, 0xdf, 0x08, 0x80, 0x00, + 0x00, 0x30, 0x70, 0x02, 0x80, 0x00, 0xc3, 0x8f, 0x80, 0x00, 0x00, 0x21, 0x18, 0x04, 0xc0, 0x40, + 0x41, 0xd1, 0x80, 0x00, 0x00, 0x23, 0xc4, 0x02, 0x60, 0x40, 0x60, 0xb1, 0x80, 0x00, 0x00, 0x23, + 0x63, 0x04, 0x30, 0x00, 0x58, 0xdf, 0x00, 0x00, 0x00, 0x19, 0x99, 0xf8, 0x0e, 0x03, 0x8f, 0x91, + 0x00, 0x00, 0x00, 0x0c, 0xcc, 0x3e, 0x03, 0xfc, 0x30, 0xff, 0x00, 0x00, 0x00, 0x06, 0x67, 0x0f, + 0x00, 0x80, 0x10, 0x7e, 0x00, 0x00, 0x00, 0x01, 0x31, 0xf8, 0x80, 0x80, 0x38, 0x28, 0x00, 0x00, + 0x00, 0x00, 0x90, 0x18, 0x40, 0x00, 0x8c, 0x28, 0x00, 0x00, 0x00, 0x00, 0x50, 0x10, 0x20, 0x01, + 0x06, 0x28, 0x00, 0x00, 0x00, 0x60, 0x58, 0x10, 0x30, 0x02, 0x02, 0x28, 0x00, 0x00, 0x01, 0xa0, + 0x58, 0x10, 0x78, 0x07, 0x02, 0x28, 0x00, 0x00, 0x07, 0x60, 0xd0, 0x10, 0xc7, 0xf9, 0x86, 0x68, + 0x00, 0x00, 0x0c, 0xc3, 0xb0, 0x10, 0x80, 0x00, 0x84, 0x48, 0x00, 0x00, 0x38, 0xfe, 0x60, 0x18, + 0x40, 0x01, 0x0c, 0x48, 0x00, 0x00, 0xc0, 0x01, 0xc0, 0x7c, 0x70, 0x03, 0x08, 0x48, 0x00, 0x00, + 0xf0, 0xff, 0x01, 0x80, 0x10, 0x04, 0x1e, 0x48, 0x00, 0x00, 0x3c, 0xc0, 0x01, 0x00, 0xf0, 0x04, + 0x33, 0x48, 0x00, 0x00, 0x07, 0x60, 0x01, 0x41, 0xe0, 0x04, 0x00, 0xc8, 0x00, 0x00, 0x01, 0xe0, + 0x01, 0xa1, 0x80, 0x03, 0xc1, 0xf8, 0x00, 0x00, 0x00, 0x60, 0x00, 0xdf, 0x00, 0x00, 0x42, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00 + }; + } + + namespace Fonts + { + const uint8_t Freshman12pt7bBitmaps[] PROGMEM = { + 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, + 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x0F, 0x3C, 0x03, 0xCF, 0x00, + 0xF3, 0xC3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x3C, + 0xF0, 0x0F, 0x3C, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xC3, 0xCF, 0x00, 0xF3, 0xC0, 0x3C, 0xF0, 0x07, 0xC0, 0x0F, 0x80, 0x7F, + 0xC1, 0xFF, 0xC7, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFE, 0x00, 0xFF, 0xF0, + 0xFF, 0xF0, 0xFF, 0xF0, 0xFF, 0xF0, 0x03, 0xFF, 0x87, 0xFF, 0x0F, 0xFF, + 0xFF, 0x7F, 0xFC, 0x7F, 0xF0, 0x7F, 0xC0, 0x3E, 0x00, 0xFF, 0xFF, 0xC0, + 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x06, 0x00, 0x03, + 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, + 0x0C, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, + 0x00, 0x3F, 0xFF, 0xF0, 0x07, 0x80, 0x7F, 0x83, 0xFF, 0x1F, 0xFE, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x1F, 0xF8, 0x03, 0xFC, 0x07, 0xF0, 0x3F, + 0xC0, 0xFF, 0x03, 0xE1, 0xFF, 0x87, 0xFF, 0xFF, 0x7F, 0xF8, 0xFF, 0xC1, + 0xFE, 0x01, 0xE0, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xC0, 0x00, 0x60, 0x00, + 0x30, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, + 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x06, + 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x3F, 0xFF, + 0xF0, 0xFF, 0xFF, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0C, + 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, + 0x30, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, + 0x00, 0xC0, 0x00, 0x60, 0x00, 0x3F, 0xFF, 0xF0, 0xFF, 0xFF, 0xC0, 0x00, + 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x06, 0x00, 0x03, 0x00, + 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0C, + 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, + 0x3F, 0xFF, 0xF0, 0xFF, 0xFF, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, + 0x00, 0x0C, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, + 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x06, 0x00, 0x03, 0x00, + 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x3F, 0xFF, 0xF0, 0xFF, 0xFF, + 0xF3, 0x10, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x80, 0x00, 0x7E, 0x00, 0xF8, 0x01, 0xF0, 0x07, 0xC0, 0x0F, 0x80, 0x3E, + 0x00, 0x7C, 0x01, 0xF0, 0x03, 0xE0, 0x0F, 0x80, 0x1F, 0x00, 0x7E, 0x00, + 0xF8, 0x03, 0xF0, 0x07, 0xC0, 0x1F, 0x80, 0x3E, 0x00, 0xFC, 0x01, 0xF0, + 0x07, 0xE0, 0x00, 0x1F, 0xF0, 0x7F, 0xF1, 0xFF, 0xF7, 0xFF, 0xFF, 0x87, + 0xFF, 0x0F, 0xFE, 0x1F, 0xFC, 0x3F, 0xF8, 0x7F, 0xF0, 0xFF, 0xE1, 0xFF, + 0xC3, 0xFF, 0x87, 0xFF, 0x0F, 0xFE, 0x1F, 0xFC, 0x3F, 0xFF, 0xFE, 0xFF, + 0xF8, 0xFF, 0xE0, 0xFF, 0x80, 0x1F, 0x0F, 0xC7, 0xF3, 0xFC, 0xFF, 0x3F, + 0xCF, 0xF0, 0xFC, 0x3F, 0x0F, 0xC3, 0xF0, 0xFC, 0x3F, 0x0F, 0xC3, 0xF0, + 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xE1, 0xFF, 0xCF, 0xFF, 0xBF, + 0xFF, 0xF8, 0xFF, 0xE3, 0xFF, 0x8F, 0xC0, 0x7F, 0x03, 0xFC, 0x1F, 0xE0, + 0xFF, 0x07, 0xF8, 0x3F, 0xC1, 0xFE, 0x07, 0xF0, 0x3F, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xF0, 0xFF, 0xF3, 0xFF, 0xF7, 0xFF, + 0xFF, 0x87, 0xFF, 0x0F, 0xC0, 0x1F, 0x80, 0x3F, 0x00, 0x7E, 0x07, 0xFC, + 0x0F, 0xF0, 0x1F, 0xF0, 0x3F, 0xE0, 0x0F, 0xFE, 0x1F, 0xFC, 0x3F, 0xFF, + 0xFF, 0xFF, 0xF9, 0xFF, 0xE0, 0xFF, 0x80, 0x01, 0xF8, 0x07, 0xF0, 0x0F, + 0xE0, 0x3F, 0xC0, 0xFF, 0x83, 0xFF, 0x0F, 0xFE, 0x3F, 0xFC, 0xFD, 0xF9, + 0xF3, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x3E, 0x00, + 0x7C, 0x03, 0xFC, 0x07, 0xF8, 0x0F, 0xF0, 0x1F, 0xE0, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x1F, 0x00, 0x3E, 0x00, 0x7F, 0xF8, + 0x7F, 0xF8, 0x7F, 0xF8, 0xFF, 0xF8, 0x03, 0xF0, 0x07, 0xFF, 0x0F, 0xFE, + 0x1F, 0xFC, 0x3F, 0xFF, 0xFE, 0xFF, 0xF8, 0xFF, 0xE0, 0xFF, 0x80, 0x1F, + 0xF0, 0x7F, 0xF1, 0xFF, 0xF7, 0xFF, 0xFF, 0x87, 0xFF, 0x0F, 0xFE, 0x1F, + 0xFC, 0x00, 0xF8, 0x01, 0xFF, 0xE3, 0xFF, 0xE7, 0xFF, 0xEF, 0xFF, 0xFF, + 0x0F, 0xFE, 0x1F, 0xFC, 0x3F, 0xFF, 0xFE, 0xFF, 0xF8, 0xFF, 0xE0, 0xFF, + 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xC3, 0xF0, + 0x0F, 0xC0, 0x7E, 0x01, 0xF8, 0x07, 0xC0, 0x3F, 0x00, 0xFC, 0x03, 0xE0, + 0x1F, 0x80, 0x7E, 0x01, 0xF0, 0x0F, 0xC0, 0x3F, 0x01, 0xF8, 0x07, 0xE0, + 0x1F, 0xF0, 0x7F, 0xF1, 0xFF, 0xF7, 0xFF, 0xFF, 0xC3, 0xFF, 0x87, 0xFF, + 0x0F, 0xFE, 0x1F, 0xFC, 0x3E, 0xFF, 0xFD, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, + 0xFF, 0x87, 0xFF, 0x0F, 0xFE, 0x1F, 0xFF, 0xFE, 0xFF, 0xFC, 0xFF, 0xF0, + 0xFF, 0xC0, 0x1F, 0xF8, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0x83, 0xFF, + 0x07, 0xFE, 0x0F, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFC, 0x7F, 0xF8, 0x01, + 0xF0, 0x03, 0xFF, 0x07, 0xFE, 0x0F, 0xFC, 0x1F, 0xFF, 0xFE, 0xFF, 0xFC, + 0xFF, 0xF0, 0xFF, 0xC0, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x0F, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, + 0x31, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, + 0x0C, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, + 0x00, 0x30, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, + 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x3F, 0xFF, 0xF0, 0xFF, 0xFF, 0xC0, + 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x06, 0x00, 0x03, + 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, + 0x0C, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, + 0x00, 0x3F, 0xFF, 0xF0, 0xFF, 0xFF, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, + 0x18, 0x00, 0x0C, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0xC0, + 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x06, 0x00, 0x03, + 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x3F, 0xFF, 0xF0, 0x1F, + 0xE1, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x7F, 0xE3, 0xE0, 0x3F, + 0x03, 0xF8, 0x3F, 0x83, 0xF8, 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0x00, 0x00, + 0x00, 0x0F, 0xC0, 0x7E, 0x03, 0xF0, 0x1F, 0x80, 0xFF, 0xFF, 0xC0, 0x00, + 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x06, 0x00, 0x03, 0x00, + 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0C, + 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, + 0x3F, 0xFF, 0xF0, 0x07, 0xFE, 0x00, 0x7F, 0xE0, 0x07, 0xFE, 0x00, 0x7F, + 0xE0, 0x07, 0xFC, 0x00, 0x7F, 0xE0, 0x07, 0xFE, 0x00, 0xFF, 0xE0, 0x0F, + 0xFF, 0x01, 0xFF, 0xF0, 0x1F, 0x9F, 0x01, 0xFF, 0xF8, 0x3F, 0xFF, 0x83, + 0xFF, 0xF8, 0x3F, 0xFF, 0xC7, 0xE0, 0xFC, 0xFF, 0x07, 0xFF, 0xF0, 0x7F, + 0xFF, 0x07, 0xFF, 0xF0, 0x7F, 0xFF, 0xF9, 0xFF, 0xF3, 0xFF, 0xF7, 0xFF, + 0xF7, 0xE3, 0xEF, 0xC7, 0xDF, 0x8F, 0xBF, 0x1F, 0x7F, 0xFE, 0xFF, 0xF9, + 0xFF, 0xF3, 0xFF, 0xF7, 0xE3, 0xEF, 0xC7, 0xDF, 0x8F, 0xBF, 0x1F, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xC0, 0x1F, 0xF0, 0x7F, 0xF1, 0xFF, + 0xF7, 0xFF, 0xFF, 0x87, 0xFF, 0x0F, 0xFE, 0x1F, 0xFC, 0x3F, 0xF8, 0x01, + 0xF0, 0x03, 0xE0, 0x07, 0xC0, 0x0F, 0x80, 0x1F, 0x0F, 0xFE, 0x1F, 0xFC, + 0x3F, 0xFF, 0xFE, 0xFF, 0xF8, 0xFF, 0xE0, 0xFF, 0x80, 0xFF, 0xF9, 0xFF, + 0xFB, 0xFF, 0xFF, 0xFF, 0xF7, 0xE3, 0xEF, 0xC7, 0xDF, 0x8F, 0xBF, 0x1F, + 0x7E, 0x3E, 0xFC, 0x7D, 0xF8, 0xFB, 0xF1, 0xF7, 0xE3, 0xEF, 0xC7, 0xDF, + 0x8F, 0xBF, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xC0, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x3D, 0xF8, 0xF7, 0xE0, 0x1F, + 0x80, 0x7E, 0xF1, 0xFF, 0xC7, 0xFF, 0x1F, 0xFC, 0x7F, 0xF1, 0xF8, 0x07, + 0xE0, 0x1F, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x3D, 0xF8, 0xF7, 0xE0, 0x1F, 0x80, + 0x7E, 0xF1, 0xFF, 0xC7, 0xFF, 0x1F, 0xFC, 0x7F, 0xF1, 0xFB, 0xC7, 0xE0, + 0x1F, 0x80, 0xFF, 0x83, 0xFE, 0x0F, 0xF8, 0x3F, 0xE0, 0x1F, 0xF0, 0x7F, + 0xF1, 0xFF, 0xF7, 0xFF, 0xFF, 0x87, 0xFF, 0x0F, 0xFE, 0x1F, 0xFC, 0x3F, + 0xF8, 0x01, 0xF1, 0xFF, 0xE3, 0xFF, 0xC7, 0xFF, 0x8F, 0xFF, 0x0F, 0xFE, + 0x1F, 0xFC, 0x3F, 0xFF, 0xFE, 0xFF, 0xF8, 0xFF, 0xE0, 0xFF, 0x80, 0xFF, + 0x7F, 0xFF, 0xBF, 0xFF, 0xDF, 0xFF, 0xEF, 0xF7, 0xC3, 0xF3, 0xE1, 0xF9, + 0xF0, 0xFC, 0xFF, 0xFE, 0x7F, 0xFF, 0x3F, 0xFF, 0x9F, 0xFF, 0xCF, 0xFF, + 0xE7, 0xFF, 0xF3, 0xE1, 0xF9, 0xF0, 0xFC, 0xF8, 0x7E, 0xFF, 0x7F, 0xFF, + 0xBF, 0xFF, 0xDF, 0xFF, 0xEF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x7E, + 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0xFF, 0xFF, + 0xFF, 0xFF, 0x03, 0xFE, 0x07, 0xFC, 0x0F, 0xF8, 0x1F, 0xF0, 0x0F, 0x80, + 0x1F, 0x00, 0x3E, 0x00, 0x7C, 0x00, 0xF8, 0x01, 0xF0, 0x03, 0xE0, 0x07, + 0xC0, 0x0F, 0x9F, 0x1F, 0x3E, 0x3E, 0x7C, 0x7C, 0xFF, 0xF9, 0xFF, 0xF1, + 0xFF, 0xC0, 0xFF, 0x00, 0xFF, 0x7F, 0xFF, 0xDF, 0xFF, 0xF7, 0xFF, 0xFD, + 0xFF, 0x7E, 0x7F, 0x1F, 0xBF, 0x87, 0xFF, 0xC1, 0xFF, 0xE0, 0x7F, 0xF0, + 0x1F, 0xFC, 0x07, 0xFF, 0x01, 0xFF, 0xE0, 0x7F, 0xF8, 0x1F, 0xFF, 0x07, + 0xEF, 0xE1, 0xF9, 0xFC, 0xFF, 0x7F, 0xFF, 0xDF, 0xFF, 0xF7, 0xFF, 0xFD, + 0xFF, 0xFF, 0x03, 0xFC, 0x0F, 0xF0, 0x3F, 0xC0, 0x7C, 0x01, 0xF0, 0x07, + 0xC0, 0x1F, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, 0x00, 0x7C, 0x01, + 0xF0, 0x07, 0xC0, 0x1F, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFE, 0x01, 0xFF, 0xF8, 0x0F, 0xFF, 0xF0, 0x3F, 0xFF, 0xC1, 0xFF, 0x7F, + 0x87, 0xF1, 0xFE, 0x3F, 0xC7, 0xFC, 0xFF, 0x1F, 0xFF, 0xFC, 0x7F, 0xFF, + 0xF1, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0x1F, 0xFF, 0xFC, 0x7F, 0xFD, 0xF1, + 0xFB, 0xF7, 0xC7, 0xE7, 0x9F, 0x1F, 0x9C, 0x7C, 0xFF, 0x33, 0xFF, 0xFC, + 0x8F, 0xFF, 0xF0, 0x3F, 0xFF, 0xC0, 0xFF, 0xFE, 0x1F, 0xFF, 0x87, 0xFF, + 0xF1, 0xFF, 0xFC, 0x7F, 0x7F, 0x8F, 0x9F, 0xF3, 0xE7, 0xFC, 0xF9, 0xFF, + 0xBE, 0x7F, 0xEF, 0x9F, 0xFF, 0xE7, 0xFF, 0xF9, 0xFF, 0xFE, 0x7F, 0xFF, + 0x9F, 0xBF, 0xE7, 0xEF, 0xF9, 0xF9, 0xFE, 0xFF, 0x7F, 0xFF, 0xCF, 0xFF, + 0xF1, 0xFF, 0xFC, 0x7F, 0x1F, 0xF0, 0x7F, 0xF1, 0xFF, 0xF7, 0xFF, 0xFF, + 0x87, 0xFF, 0x0F, 0xFE, 0x1F, 0xFC, 0x3F, 0xF8, 0x7F, 0xF0, 0xFF, 0xE1, + 0xFF, 0xC3, 0xFF, 0x87, 0xFF, 0x0F, 0xFE, 0x1F, 0xFC, 0x3F, 0xFF, 0xFE, + 0xFF, 0xF8, 0xFF, 0xE0, 0xFF, 0x80, 0xFF, 0xF9, 0xFF, 0xF3, 0xFF, 0xF7, + 0xFF, 0xF7, 0xE3, 0xEF, 0xC7, 0xDF, 0x8F, 0xBF, 0x1F, 0x7E, 0x3E, 0xFF, + 0xFD, 0xFF, 0xF3, 0xFF, 0xE7, 0xFF, 0x8F, 0xC0, 0x1F, 0x80, 0x3F, 0x00, + 0xFF, 0x01, 0xFE, 0x03, 0xFC, 0x07, 0xF8, 0x00, 0x1F, 0xF0, 0x1F, 0xFC, + 0x1F, 0xFF, 0x1F, 0xFF, 0xCF, 0x87, 0xE7, 0xC3, 0xF3, 0xE1, 0xF9, 0xF0, + 0xFC, 0xF8, 0x7E, 0x7C, 0x7F, 0x3E, 0x7F, 0x9F, 0x7F, 0xCF, 0x9F, 0xE7, + 0xCF, 0xF3, 0xE3, 0xF9, 0xF0, 0xFE, 0xFF, 0xFF, 0xBF, 0xFF, 0x8F, 0xFF, + 0x83, 0xFE, 0x00, 0xFF, 0xF8, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFE, 0x7E, + 0x3E, 0x7E, 0x3E, 0x7E, 0x3E, 0x7E, 0x3E, 0x7F, 0xFE, 0x7F, 0xFC, 0x7F, + 0xFC, 0x7F, 0xFE, 0x7E, 0x3E, 0x7E, 0x3E, 0x7E, 0x3E, 0x7E, 0x3E, 0xFF, + 0x3F, 0xFF, 0x3F, 0xFF, 0x3F, 0xFF, 0x3F, 0x1F, 0xF0, 0x7F, 0xF1, 0xFF, + 0xF7, 0xFF, 0xFF, 0x87, 0xFF, 0x0F, 0xFE, 0x1F, 0xFC, 0x3F, 0xF8, 0x01, + 0xFF, 0xE1, 0xFF, 0xE1, 0xFF, 0xE3, 0xFF, 0xE0, 0x0F, 0xFE, 0x1F, 0xFC, + 0x3F, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xE1, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x7F, 0xBF, 0xBC, 0x1F, 0xC0, + 0x0F, 0xE0, 0x07, 0xF0, 0x03, 0xF8, 0x01, 0xFC, 0x00, 0xFE, 0x00, 0x7F, + 0x00, 0x3F, 0x80, 0x1F, 0xC0, 0x0F, 0xE0, 0x0F, 0xF0, 0x07, 0xF8, 0x03, + 0xFC, 0x01, 0xFE, 0x00, 0xFF, 0x3F, 0xFF, 0x9F, 0xFF, 0xCF, 0xFF, 0xE7, + 0xF7, 0xE1, 0xF3, 0xF0, 0xF9, 0xF8, 0x7C, 0xFC, 0x3E, 0x7E, 0x1F, 0x3F, + 0x0F, 0x9F, 0x87, 0xCF, 0xC3, 0xE7, 0xE1, 0xF3, 0xF0, 0xF9, 0xF8, 0x7C, + 0xFC, 0x3E, 0x7F, 0xFF, 0x1F, 0xFF, 0x07, 0xFF, 0x01, 0xFF, 0x00, 0xFF, + 0x1F, 0xFF, 0xE3, 0xFF, 0xFC, 0x7F, 0xFF, 0x8F, 0xF3, 0xE1, 0xF8, 0x7C, + 0x3F, 0x0F, 0xCF, 0xE0, 0xF9, 0xF8, 0x1F, 0x3F, 0x03, 0xFF, 0xE0, 0x7F, + 0xF8, 0x07, 0xFF, 0x00, 0xFF, 0xE0, 0x1F, 0xF8, 0x01, 0xFF, 0x00, 0x3F, + 0xE0, 0x0F, 0xFE, 0x01, 0xFF, 0xC0, 0x3F, 0xF8, 0x07, 0xFF, 0x00, 0xFF, + 0x1F, 0xF1, 0xFF, 0xFE, 0x3F, 0xE3, 0xFF, 0xFC, 0x7F, 0xC7, 0xFF, 0xF8, + 0xFF, 0x8F, 0xF3, 0xE1, 0xFF, 0x0F, 0x87, 0xC3, 0xFE, 0x1F, 0x0F, 0xCF, + 0xFE, 0x7E, 0x0F, 0x9F, 0xFC, 0xF8, 0x1F, 0x3F, 0xF9, 0xF0, 0x3F, 0xFF, + 0xFF, 0xE0, 0x7F, 0xFF, 0xFF, 0x80, 0x7F, 0xF7, 0xFF, 0x00, 0xFF, 0xEF, + 0xFE, 0x01, 0xFF, 0xDF, 0xFC, 0x01, 0xFF, 0x9F, 0xF0, 0x03, 0xFE, 0x3F, + 0xE0, 0x07, 0xFC, 0xFF, 0xC0, 0x0F, 0xF9, 0xFF, 0x80, 0x1F, 0xF3, 0xFF, + 0x00, 0x3F, 0xE7, 0xFE, 0x00, 0xFF, 0x8F, 0xFF, 0xFC, 0x7F, 0xFF, 0xE3, + 0xFF, 0xFF, 0x1F, 0xF3, 0xF8, 0x7E, 0x0F, 0xE7, 0xF0, 0x3F, 0xFF, 0x00, + 0xFF, 0xF0, 0x03, 0xFF, 0x00, 0x0F, 0xF0, 0x00, 0x7F, 0x80, 0x07, 0xFE, + 0x00, 0x7F, 0xF8, 0x07, 0xFF, 0xE0, 0x7F, 0x3F, 0x87, 0xF0, 0xFC, 0xFF, + 0x8F, 0xFF, 0xFC, 0x7F, 0xFF, 0xE3, 0xFF, 0xFF, 0x1F, 0xF0, 0xFF, 0x8F, + 0xFF, 0xFC, 0x7F, 0xFF, 0xE3, 0xFF, 0xFF, 0x1F, 0xF3, 0xF8, 0xFE, 0x0F, + 0xEF, 0xF0, 0x3F, 0xFF, 0x00, 0xFF, 0xF0, 0x03, 0xFF, 0x00, 0x0F, 0xF0, + 0x00, 0x3F, 0x00, 0x01, 0xF8, 0x00, 0x0F, 0xC0, 0x00, 0x7E, 0x00, 0x03, + 0xF0, 0x00, 0x1F, 0x80, 0x01, 0xFE, 0x00, 0x0F, 0xF0, 0x00, 0x7F, 0x80, + 0x03, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, + 0xFE, 0x3F, 0x80, 0xFE, 0x03, 0xFC, 0x07, 0xF0, 0x1F, 0xC0, 0x3F, 0x80, + 0xFE, 0x03, 0xF8, 0x07, 0xF0, 0x1F, 0xC0, 0x7F, 0x0F, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xC0, 0x00, 0x60, 0x00, 0x30, + 0x00, 0x18, 0x00, 0x0C, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, + 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x06, 0x00, + 0x03, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x3F, 0xFF, 0xF0, + 0xFF, 0xFF, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0C, 0x00, + 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, + 0x00, 0x18, 0x00, 0x0C, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, + 0xC0, 0x00, 0x60, 0x00, 0x3F, 0xFF, 0xF0, 0xFF, 0xFF, 0xC0, 0x00, 0x60, + 0x00, 0x30, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, + 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0C, 0x00, + 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x3F, + 0xFF, 0xF0, 0xFF, 0xFF, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, + 0x0C, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, + 0x00, 0x30, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, + 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x3F, 0xFF, 0xF0, 0xFF, 0xFF, 0xC0, + 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x06, 0x00, 0x03, + 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, + 0x0C, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, + 0x00, 0x3F, 0xFF, 0xF0, 0xFF, 0xFF, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, + 0x18, 0x00, 0x0C, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0xC0, + 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x06, 0x00, 0x03, + 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x3F, 0xFF, 0xF0, 0x0F, + 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xE0, 0x0F, 0xF0, 0x1F, + 0xF0, 0x1E, 0x78, 0x3F, 0xF8, 0x3F, 0xFC, 0x3F, 0xFC, 0x7F, 0xFC, 0xFC, + 0x3F, 0xFC, 0x3F, 0xFC, 0x3F, 0xFC, 0x3F, 0xFF, 0xCF, 0xFE, 0xFF, 0xFF, + 0xFF, 0x78, 0xF7, 0x8F, 0x7F, 0xF7, 0xFE, 0x7F, 0xF7, 0xFF, 0x78, 0xF7, + 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFC, 0x3F, 0xC7, 0xFE, 0xFF, 0xFF, + 0xFF, 0xF0, 0xFF, 0x0F, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0xFF, + 0x0F, 0xFF, 0xFF, 0xFF, 0x7F, 0xE3, 0xFC, 0xFF, 0xCF, 0xFE, 0xFF, 0xFF, + 0xFF, 0x78, 0xF7, 0x8F, 0x78, 0xF7, 0x8F, 0x78, 0xF7, 0x8F, 0x78, 0xF7, + 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x78, 0x07, 0xF8, 0x7F, 0x87, 0xF8, 0x7F, 0x87, 0xF8, 0x7F, 0x87, + 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x78, 0x07, 0xF8, 0x7F, 0x87, 0xF8, 0x7F, 0x87, 0xF8, 0x78, 0x07, + 0x80, 0xFE, 0x0F, 0xE0, 0xFE, 0x0F, 0xE0, 0x3F, 0xC7, 0xFE, 0xFF, 0xFF, + 0xFF, 0xF0, 0xFF, 0x0F, 0xF3, 0xFF, 0x3F, 0xF3, 0xFF, 0x3F, 0xF0, 0xFF, + 0x0F, 0xFF, 0xFF, 0xFF, 0x7F, 0xE3, 0xFC, 0xFC, 0xFF, 0xF3, 0xFF, 0xCF, + 0xFF, 0x3F, 0x78, 0x79, 0xE1, 0xE7, 0xFF, 0x9F, 0xFE, 0x7F, 0xF9, 0xFF, + 0xE7, 0x87, 0x9E, 0x1E, 0xFC, 0xFF, 0xF3, 0xFF, 0xCF, 0xFF, 0x3F, 0xFF, + 0xFF, 0xFF, 0x79, 0xE7, 0x9E, 0x79, 0xE7, 0x9E, 0xFF, 0xFF, 0xFF, 0x03, + 0xF0, 0x3F, 0x03, 0xF0, 0x3F, 0x01, 0xE0, 0x1E, 0x01, 0xE0, 0x1E, 0x01, + 0xEF, 0x1E, 0xF1, 0xEF, 0x1E, 0xFF, 0xEF, 0xFE, 0x7F, 0xC3, 0xF8, 0xFD, + 0xFF, 0xFB, 0xFF, 0xF7, 0xFF, 0xEF, 0xF7, 0x9F, 0x8F, 0x7E, 0x1F, 0xF8, + 0x3F, 0xC0, 0x7F, 0xC0, 0xFF, 0xC1, 0xEF, 0xC3, 0xCF, 0xCF, 0xDF, 0xFF, + 0xBF, 0xFF, 0x7F, 0xFE, 0xFF, 0xFC, 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0x78, + 0x07, 0x80, 0x78, 0x07, 0x80, 0x78, 0x07, 0x80, 0x78, 0x07, 0x80, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x0F, 0xFE, 0x0F, 0xFF, 0x07, 0xFF, + 0xC7, 0xF7, 0xF7, 0xF3, 0xFB, 0xF9, 0xFF, 0xFC, 0xFF, 0xFE, 0x7F, 0xFF, + 0x3D, 0xF7, 0x9E, 0xFB, 0xCF, 0x39, 0xEF, 0xC9, 0xFF, 0xE4, 0xFF, 0xF0, + 0x7F, 0xF8, 0x3F, 0xFC, 0x7F, 0xF8, 0xFF, 0xF9, 0xFF, 0xF3, 0xF7, 0xF3, + 0xCF, 0xF7, 0x9F, 0xEF, 0x3F, 0xFE, 0x7F, 0xFC, 0xFF, 0xF9, 0xEF, 0xF3, + 0xCF, 0xEF, 0xDF, 0xFF, 0x9F, 0xFF, 0x1F, 0xFE, 0x3F, 0x3F, 0xC7, 0xFE, + 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, 0xF0, 0xFF, 0x0F, + 0xF0, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0x7F, 0xE3, 0xFC, 0xFF, 0xCF, 0xFE, + 0xFF, 0xFF, 0xFF, 0x78, 0xF7, 0x8F, 0x7F, 0xF7, 0xFF, 0x7F, 0xE7, 0xFC, + 0x78, 0x07, 0x80, 0xFC, 0x0F, 0xC0, 0xFC, 0x0F, 0xC0, 0x3F, 0xC1, 0xFF, + 0x8F, 0xFF, 0x3F, 0xFC, 0xF0, 0xF3, 0xC3, 0xCF, 0x0F, 0x3C, 0x7C, 0xF3, + 0xF3, 0xDF, 0xCF, 0x1F, 0x3C, 0x3C, 0xFF, 0xFB, 0xFF, 0xE7, 0xFF, 0x0F, + 0xF0, 0xFF, 0xC7, 0xFF, 0x3F, 0xFD, 0xFF, 0xE7, 0x8F, 0x3C, 0x79, 0xFF, + 0xCF, 0xFC, 0x7F, 0xF3, 0xFF, 0x9E, 0x3C, 0xF1, 0xEF, 0xCF, 0xFE, 0x7F, + 0xF3, 0xFF, 0x9F, 0x3F, 0xC7, 0xFE, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0x00, + 0xFF, 0xCF, 0xFE, 0x7F, 0xF3, 0xFF, 0x00, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, + 0x7F, 0xE3, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0xF0, + 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0xF0, 0x1F, 0x81, 0xF8, + 0x1F, 0x81, 0xF8, 0xFC, 0xFF, 0xF3, 0xFF, 0xCF, 0xFF, 0x3F, 0x78, 0x79, + 0xE1, 0xE7, 0x87, 0x9E, 0x1E, 0x78, 0x79, 0xE1, 0xE7, 0x87, 0x9E, 0x1E, + 0x7F, 0xF9, 0xFF, 0xE3, 0xFF, 0x07, 0xF8, 0xFC, 0xFF, 0xF9, 0xFF, 0xF3, + 0xFF, 0xE7, 0xF7, 0xC7, 0xC7, 0x8F, 0x0F, 0xBE, 0x1F, 0x7C, 0x1E, 0xF0, + 0x3F, 0xE0, 0x3F, 0xC0, 0x7F, 0x01, 0xFF, 0x03, 0xFE, 0x07, 0xFC, 0x0F, + 0xF8, 0xFE, 0x7F, 0x3F, 0xFF, 0x3F, 0x9F, 0xFF, 0x9F, 0xCF, 0xFF, 0xCF, + 0xE7, 0xF7, 0xC7, 0xF1, 0xE1, 0xE3, 0xF8, 0xF0, 0xFB, 0xFE, 0xF8, 0x7D, + 0xFF, 0x78, 0x1E, 0xFF, 0xBC, 0x0F, 0xFF, 0xFE, 0x03, 0xFC, 0xFE, 0x01, + 0xFE, 0x7F, 0x00, 0xFF, 0x7F, 0x80, 0x7F, 0xBF, 0xC0, 0x3F, 0xDF, 0xE0, + 0x1F, 0xEF, 0xF0, 0xFE, 0x3F, 0xFF, 0x1F, 0xFF, 0x8F, 0xFF, 0xC7, 0xF3, + 0xE3, 0xF0, 0xFF, 0xE0, 0x3F, 0xE0, 0x0F, 0xE0, 0x07, 0xF0, 0x07, 0xFC, + 0x07, 0xFF, 0x07, 0xE7, 0xEF, 0xE3, 0xFF, 0xF1, 0xFF, 0xF8, 0xFF, 0xFC, + 0x7F, 0xFF, 0x3F, 0xFF, 0x9F, 0xFF, 0xCF, 0xFF, 0xE7, 0xF3, 0xE3, 0xE0, + 0xFB, 0xE0, 0x3F, 0xE0, 0x07, 0xE0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x78, + 0x00, 0x3C, 0x00, 0x3F, 0x00, 0x1F, 0x80, 0x0F, 0xC0, 0x07, 0xE0, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xE0, 0x7C, 0x0F, 0xC0, 0xF8, 0x1F, + 0x03, 0xE0, 0x3E, 0x07, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x06, + 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, + 0x18, 0x00, 0x0C, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0xC0, + 0x00, 0x60, 0x00, 0x3F, 0xFF, 0xF0, 0xFF, 0xFF, 0xC0, 0x00, 0x60, 0x00, + 0x30, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, + 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x06, + 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x3F, 0xFF, + 0xF0, 0xFF, 0xFF, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0C, + 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, + 0x30, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, + 0x00, 0xC0, 0x00, 0x60, 0x00, 0x3F, 0xFF, 0xF0, 0xFF, 0xFF, 0xC0, 0x00, + 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x06, 0x00, 0x03, 0x00, + 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0C, + 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x00, 0x60, 0x00, + 0x3F, 0xFF, 0xF0 }; + + const GFXglyph Freshman12pt7bGlyphs[] PROGMEM = { + { 0, 1, 1, 7, 0, 0 }, // 0x20 ' ' + { 1, 5, 20, 7, 0, -19 }, // 0x21 '!' + { 14, 7, 5, 8, 0, -19 }, // 0x22 '"' + { 19, 18, 16, 19, 0, -19 }, // 0x23 '#' + { 55, 15, 20, 17, 0, -19 }, // 0x24 '$' + { 93, 17, 20, 20, 1, -19 }, // 0x25 '%' + { 136, 14, 20, 17, 0, -19 }, // 0x26 '&' + { 171, 4, 5, 4, 0, -19 }, // 0x27 ''' + { 174, 17, 20, 20, 1, -19 }, // 0x28 '(' + { 217, 17, 20, 20, 1, -19 }, // 0x29 ')' + { 260, 17, 20, 20, 1, -19 }, // 0x2A '*' + { 303, 17, 20, 20, 1, -19 }, // 0x2B '+' + { 346, 5, 7, 7, 0, -3 }, // 0x2C ',' + { 351, 8, 6, 9, 0, -12 }, // 0x2D '-' + { 357, 5, 5, 7, 0, -4 }, // 0x2E '.' + { 361, 15, 20, 16, 0, -19 }, // 0x2F '/' + { 399, 15, 20, 17, 0, -19 }, // 0x30 '0' + { 437, 10, 20, 11, 0, -19 }, // 0x31 '1' + { 462, 14, 20, 16, 0, -19 }, // 0x32 '2' + { 497, 15, 20, 17, 0, -19 }, // 0x33 '3' + { 535, 15, 20, 16, 0, -19 }, // 0x34 '4' + { 573, 15, 20, 17, 0, -19 }, // 0x35 '5' + { 611, 15, 20, 17, 0, -19 }, // 0x36 '6' + { 649, 14, 20, 16, 0, -19 }, // 0x37 '7' + { 684, 15, 20, 17, 0, -19 }, // 0x38 '8' + { 722, 15, 20, 17, 0, -19 }, // 0x39 '9' + { 760, 5, 16, 7, 0, -15 }, // 0x3A ':' + { 770, 5, 19, 7, 0, -15 }, // 0x3B ';' + { 782, 17, 20, 20, 1, -19 }, // 0x3C '<' + { 825, 17, 20, 20, 1, -19 }, // 0x3D '=' + { 868, 17, 20, 20, 1, -19 }, // 0x3E '>' + { 911, 13, 20, 15, 0, -19 }, // 0x3F '?' + { 944, 17, 20, 20, 1, -19 }, // 0x40 '@' + { 987, 20, 20, 21, 0, -19 }, // 0x41 'A' + { 1037, 15, 20, 17, 0, -19 }, // 0x42 'B' + { 1075, 15, 20, 17, 0, -19 }, // 0x43 'C' + { 1113, 15, 20, 17, 0, -19 }, // 0x44 'D' + { 1151, 14, 20, 16, 0, -19 }, // 0x45 'E' + { 1186, 14, 20, 16, 0, -19 }, // 0x46 'F' + { 1221, 15, 20, 17, 0, -19 }, // 0x47 'G' + { 1259, 17, 20, 19, 0, -19 }, // 0x48 'H' + { 1302, 8, 20, 9, 0, -19 }, // 0x49 'I' + { 1322, 15, 20, 16, 0, -19 }, // 0x4A 'J' + { 1360, 18, 20, 19, 0, -19 }, // 0x4B 'K' + { 1405, 14, 20, 16, 0, -19 }, // 0x4C 'L' + { 1440, 22, 20, 23, 0, -19 }, // 0x4D 'M' + { 1495, 18, 20, 20, 0, -19 }, // 0x4E 'N' + { 1540, 15, 20, 17, 0, -19 }, // 0x4F 'O' + { 1578, 15, 20, 17, 0, -19 }, // 0x50 'P' + { 1616, 17, 20, 17, 0, -19 }, // 0x51 'Q' + { 1659, 16, 20, 18, 0, -19 }, // 0x52 'R' + { 1699, 15, 20, 17, 0, -19 }, // 0x53 'S' + { 1737, 17, 20, 18, 0, -19 }, // 0x54 'T' + { 1780, 17, 20, 19, 0, -19 }, // 0x55 'U' + { 1823, 19, 20, 20, 0, -19 }, // 0x56 'V' + { 1871, 31, 20, 33, 0, -19 }, // 0x57 'W' + { 1949, 21, 20, 23, 0, -19 }, // 0x58 'X' + { 2002, 21, 20, 23, 0, -19 }, // 0x59 'Y' + { 2055, 15, 20, 16, 0, -19 }, // 0x5A 'Z' + { 2093, 17, 20, 20, 1, -19 }, // 0x5B '[' + { 2136, 17, 20, 20, 1, -19 }, // 0x5C '\' + { 2179, 17, 20, 20, 1, -19 }, // 0x5D ']' + { 2222, 17, 20, 20, 1, -19 }, // 0x5E '^' + { 2265, 17, 20, 20, 1, -19 }, // 0x5F '_' + { 2308, 17, 20, 20, 1, -19 }, // 0x60 '`' + { 2351, 16, 16, 17, 0, -15 }, // 0x61 'a' + { 2383, 12, 16, 14, 0, -15 }, // 0x62 'b' + { 2407, 12, 16, 13, 0, -15 }, // 0x63 'c' + { 2431, 12, 16, 14, 0, -15 }, // 0x64 'd' + { 2455, 12, 16, 13, 0, -15 }, // 0x65 'e' + { 2479, 12, 16, 13, 0, -15 }, // 0x66 'f' + { 2503, 12, 16, 14, 0, -15 }, // 0x67 'g' + { 2527, 14, 16, 15, 0, -15 }, // 0x68 'h' + { 2555, 6, 16, 8, 0, -15 }, // 0x69 'i' + { 2567, 12, 16, 13, 0, -15 }, // 0x6A 'j' + { 2591, 15, 16, 16, 0, -15 }, // 0x6B 'k' + { 2621, 12, 16, 13, 0, -15 }, // 0x6C 'l' + { 2645, 17, 16, 19, 0, -15 }, // 0x6D 'm' + { 2679, 15, 16, 16, 0, -15 }, // 0x6E 'n' + { 2709, 12, 16, 14, 0, -15 }, // 0x6F 'o' + { 2733, 12, 16, 14, 0, -15 }, // 0x70 'p' + { 2757, 14, 16, 14, 0, -15 }, // 0x71 'q' + { 2785, 13, 16, 15, 0, -15 }, // 0x72 'r' + { 2811, 12, 16, 14, 0, -15 }, // 0x73 's' + { 2835, 12, 16, 14, 0, -15 }, // 0x74 't' + { 2859, 14, 16, 15, 0, -15 }, // 0x75 'u' + { 2887, 15, 16, 17, 0, -15 }, // 0x76 'v' + { 2917, 25, 16, 26, 0, -15 }, // 0x77 'w' + { 2967, 17, 16, 19, 0, -15 }, // 0x78 'x' + { 3001, 17, 16, 19, 0, -15 }, // 0x79 'y' + { 3035, 12, 16, 13, 0, -15 }, // 0x7A 'z' + { 3059, 17, 20, 20, 1, -19 }, // 0x7B '{' + { 3102, 17, 20, 20, 1, -19 }, // 0x7C '|' + { 3145, 17, 20, 20, 1, -19 }, // 0x7D '}' + { 3188, 17, 20, 20, 1, -19 } // 0x7E '~' + }; + + const GFXfont Freshman12pt7b PROGMEM = { + (uint8_t *)Freshman12pt7bBitmaps, + (GFXglyph *)Freshman12pt7bGlyphs, + 0x20, 0x7E, 24 + }; + } +} \ No newline at end of file diff --git a/CodeCell/OLED_Screen/3D_Object.hpp b/CodeCell/OLED_Screen/3D_Object.hpp new file mode 100644 index 0000000..9194c47 --- /dev/null +++ b/CodeCell/OLED_Screen/3D_Object.hpp @@ -0,0 +1,43 @@ +#include +#include + +#include "Vector3D.hpp" + +using std::vector, std::array, std::initializer_list; + +namespace _3D +{ + enum class Axes { + X, + Y, + Z + }; + + struct Triangle { + Triangle(initializer_list> pointsInit) + { + auto it = pointsInit.begin(); + + points[0] = Vector3D(*it++); + points[1] = Vector3D(*it++); + points[2] = Vector3D(*it); + } + + array, 3> points; + + bool infill {false}; + bool outline {true}; + }; + + struct Object { + Object(initializer_list>> trianglesInit) + { + for(const auto &triangleInit : trianglesInit) + { + triangles.push_back(Triangle(triangleInit)); + } + } + + vector triangles; + }; +} \ No newline at end of file diff --git a/CodeCell/OLED_Screen/OLED_Screen.ino b/CodeCell/OLED_Screen/OLED_Screen.ino new file mode 100644 index 0000000..39ae3ff --- /dev/null +++ b/CodeCell/OLED_Screen/OLED_Screen.ino @@ -0,0 +1,85 @@ +#include +#include + +#include "3D_Object.hpp" + +#define SCREEN_WIDTH 128 +#define SCREEN_HEIGHT 64 + +#define SCREEN_I2C_ADDR 0x3C + +#define FOCAL 100 + +CodeCell codeCell; +Adafruit_SSD1306 screen(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); + +_3D::Object cube {{ + {{20, 20, 20}, {20, 20, -20}, {20, -20, -20}}, + {{20, 20, 20}, {20, -20, 20}, {20, -20, -20}}, + {{-20, 20, 20}, {-20, 20, -20}, {-20, -20, -20}}, + {{-20, 20, 20}, {-20, -20, 20}, {-20, -20, -20}}, + {{20, 20, 20}, {-20, 20, 20}, {-20, -20, 20}}, + {{20, 20, 20}, {-20, -20, 20}, {20, -20, 20}}, + {{20, 20, -20}, {-20, 20, -20}, {-20, -20, -20}}, + {{20, 20, -20}, {20, -20, -20}, {-20, -20, -20}}, +}}; + +const size_t NB_TRIANGLES {cube.triangles.size()}; + +void setup() +{ + // Init CodeCell + codeCell.Init(LIGHT); + + // Init screen + screen.begin(SSD1306_SWITCHCAPVCC, SCREEN_I2C_ADDR); + + // Set text parameters + screen.setTextSize(1); + screen.setTextColor(WHITE); +} + +void loop() +{ + if(codeCell.Run()) + { + // Get tima at frame start + unsigned long frame_start = millis(); + + // Clear screen + screen.clearDisplay(); + + array calculatedXPoints; + array calculatedYPoints; + + // Rendering triangles + for(const _3D::Triangle &triangle : cube.triangles) + { + for(uint8_t pointIndex {0}; pointIndex < 3; pointIndex++) + { + const _3D::Vector3D &point = triangle.points.at(pointIndex); + + calculatedXPoints.at(pointIndex) = (point.x * FOCAL) / (point.z + FOCAL) + SCREEN_WIDTH / 2; + calculatedYPoints.at(pointIndex) = (point.y * FOCAL) / (point.z + FOCAL) + SCREEN_HEIGHT / 2; + + screen.fillCircle(calculatedXPoints.at(pointIndex), calculatedYPoints.at(pointIndex), 3, SSD1306_WHITE); + } + + screen.drawTriangle(calculatedXPoints.at(0), calculatedYPoints.at(0), + calculatedXPoints.at(1), calculatedYPoints.at(1), + calculatedXPoints.at(2), calculatedYPoints.at(2), WHITE); + } + + // Get time at frame end + unsigned long frame_end = millis(); + // Get frame time + unsigned long frame_time = frame_end - frame_start; + + // Print on screen frame time + screen.setCursor(0, 0); + screen.print(frame_time); + + // Upcate screen + screen.display(); + } +} diff --git a/CodeCell/OLED_Screen/Vector3D.hpp b/CodeCell/OLED_Screen/Vector3D.hpp new file mode 100644 index 0000000..14bf273 --- /dev/null +++ b/CodeCell/OLED_Screen/Vector3D.hpp @@ -0,0 +1,100 @@ +#include + +using std::initializer_list; + +namespace _3D +{ + template + struct Vector3D { + T x, y, z; + + Vector3D() + { + this->zero(); + } + Vector3D(T xInit, T yInit, T zInit) : x(xInit), y(yInit), z(zInit) + {} + Vector3D(initializer_list coordinates) + { + auto it = coordinates.begin(); + + x = *(it++); + y = *(it++); + z = *it; + } + template + Vector3D(const Vector3D& vec) : x(static_cast(vec.x)), y(static_cast(vec.y)), z(static_cast(vec.z)) + {} + + Vector3D &operator+=(const Vector3D &vec) noexcept + { + x += vec.x; + y += vec.y; + z += vec.z; + + return *this; + } + Vector3D &operator-=(const Vector3D &vec) noexcept + { + x -= vec.x; + y -= vec.y; + z -= vec.z; + + return *this; + } + Vector3D &operator*=(const Vector3D &vec) noexcept + { + x *= vec.x; + y *= vec.y; + z *= vec.z; + + return *this; + } + Vector3D &operator/=(const Vector3D &vec) noexcept + { + x /= vec.x; + y /= vec.y; + z /= vec.z; + + return *this; + } + + Vector3D operator*(const T &i) noexcept + { + return Vector2D(x * i, y * i, z * i); + } + Vector3D operator/(const T &i) noexcept + { + return Vector2D(x / i, y / i, z / i); + } + Vector3D &zero() noexcept + { + x = static_cast(0); + y = static_cast(0); + z = static_cast(0); + + return *this; + } + }; + + template + Vector3D operator+(const Vector3D &v1, const Vector3D &v2) + { + return Vector3D(v1.x + v2.x, v1.y + v2.y, v1.z + v2.z); + } + template + Vector3D operator-(const Vector3D &v1, const Vector3D &v2) + { + return Vector3D(v1.x - v2.x, v1.y - v2.y, v1.z - v2.z); + } + template + Vector3D operator*(const Vector3D &v1, const Vector3D &v2) + { + return Vector3D(v1.x * v2.x, v1.y * v2.y, v1.z * v2.z); + } + template + Vector3D operator/(const Vector3D &v1, const Vector3D &v2) + { + return Vector3D(v1.x / v2.x, v1.y / v2.y, v1.z / v2.z); + } +} \ No newline at end of file diff --git a/CodeCell/UnitTests/UnitTests.ino b/CodeCell/UnitTests/UnitTests.ino new file mode 100644 index 0000000..95c2b6e --- /dev/null +++ b/CodeCell/UnitTests/UnitTests.ino @@ -0,0 +1,9 @@ +void setup() { + // put your setup code here, to run once: + +} + +void loop() { + // put your main code here, to run repeatedly: + +} diff --git a/Shema/Shema super star/Shema super star.kicad_pcb b/Shema/Shema super star/Shema super star.kicad_pcb new file mode 100644 index 0000000..28b47a1 --- /dev/null +++ b/Shema/Shema super star/Shema super star.kicad_pcb @@ -0,0 +1,2 @@ +(kicad_pcb (version 20211014) (generator pcbnew) +) \ No newline at end of file diff --git a/Shema/Shema super star/Shema super star.kicad_prl b/Shema/Shema super star/Shema super star.kicad_prl new file mode 100644 index 0000000..0f53d83 --- /dev/null +++ b/Shema/Shema super star/Shema super star.kicad_prl @@ -0,0 +1,75 @@ +{ + "board": { + "active_layer": 0, + "active_layer_preset": "", + "auto_track_width": true, + "hidden_nets": [], + "high_contrast_mode": 0, + "net_color_mode": 1, + "opacity": { + "pads": 1.0, + "tracks": 1.0, + "vias": 1.0, + "zones": 0.6 + }, + "ratsnest_display_mode": 0, + "selection_filter": { + "dimensions": true, + "footprints": true, + "graphics": true, + "keepouts": true, + "lockedItems": true, + "otherItems": true, + "pads": true, + "text": true, + "tracks": true, + "vias": true, + "zones": true + }, + "visible_items": [ + 0, + 1, + 2, + 3, + 4, + 5, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 32, + 33, + 34, + 35, + 36 + ], + "visible_layers": "fffffff_ffffffff", + "zone_display_mode": 0 + }, + "meta": { + "filename": "Shema super star.kicad_prl", + "version": 3 + }, + "project": { + "files": [] + } +} diff --git a/Shema/Shema super star/Shema super star.kicad_pro b/Shema/Shema super star/Shema super star.kicad_pro new file mode 100644 index 0000000..5031541 --- /dev/null +++ b/Shema/Shema super star/Shema super star.kicad_pro @@ -0,0 +1,326 @@ +{ + "board": { + "design_settings": { + "defaults": { + "board_outline_line_width": 0.1, + "copper_line_width": 0.2, + "copper_text_size_h": 1.5, + "copper_text_size_v": 1.5, + "copper_text_thickness": 0.3, + "other_line_width": 0.15, + "silk_line_width": 0.15, + "silk_text_size_h": 1.0, + "silk_text_size_v": 1.0, + "silk_text_thickness": 0.15 + }, + "diff_pair_dimensions": [], + "drc_exclusions": [], + "rules": { + "min_copper_edge_clearance": 0.0, + "solder_mask_clearance": 0.0, + "solder_mask_min_width": 0.0 + }, + "track_widths": [], + "via_dimensions": [] + }, + "layer_presets": [] + }, + "boards": [], + "cvpcb": { + "equivalence_files": [] + }, + "erc": { + "erc_exclusions": [], + "meta": { + "version": 0 + }, + "pin_map": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 2 + ], + [ + 0, + 2, + 0, + 1, + 0, + 0, + 1, + 0, + 2, + 2, + 2, + 2 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 2 + ], + [ + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 1, + 1, + 2 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 2 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2 + ], + [ + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 2 + ], + [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 2 + ], + [ + 0, + 2, + 1, + 2, + 0, + 0, + 1, + 0, + 2, + 2, + 2, + 2 + ], + [ + 0, + 2, + 0, + 1, + 0, + 0, + 1, + 0, + 2, + 0, + 0, + 2 + ], + [ + 0, + 2, + 1, + 1, + 0, + 0, + 1, + 0, + 2, + 0, + 0, + 2 + ], + [ + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2 + ] + ], + "rule_severities": { + "bus_definition_conflict": "error", + "bus_entry_needed": "error", + "bus_label_syntax": "error", + "bus_to_bus_conflict": "error", + "bus_to_net_conflict": "error", + "different_unit_footprint": "error", + "different_unit_net": "error", + "duplicate_reference": "error", + "duplicate_sheet_names": "error", + "extra_units": "error", + "global_label_dangling": "warning", + "hier_label_mismatch": "error", + "label_dangling": "error", + "lib_symbol_issues": "warning", + "multiple_net_names": "warning", + "net_not_bus_member": "warning", + "no_connect_connected": "warning", + "no_connect_dangling": "warning", + "pin_not_connected": "error", + "pin_not_driven": "error", + "pin_to_pin": "warning", + "power_pin_not_driven": "error", + "similar_labels": "warning", + "unannotated": "error", + "unit_value_mismatch": "error", + "unresolved_variable": "error", + "wire_dangling": "error" + } + }, + "libraries": { + "pinned_footprint_libs": [], + "pinned_symbol_libs": [] + }, + "meta": { + "filename": "Shema super star.kicad_pro", + "version": 1 + }, + "net_settings": { + "classes": [ + { + "bus_width": 12.0, + "clearance": 0.2, + "diff_pair_gap": 0.25, + "diff_pair_via_gap": 0.25, + "diff_pair_width": 0.2, + "line_style": 0, + "microvia_diameter": 0.3, + "microvia_drill": 0.1, + "name": "Default", + "pcb_color": "rgba(0, 0, 0, 0.000)", + "schematic_color": "rgba(0, 0, 0, 0.000)", + "track_width": 0.25, + "via_diameter": 0.8, + "via_drill": 0.4, + "wire_width": 6.0 + } + ], + "meta": { + "version": 2 + }, + "net_colors": null + }, + "pcbnew": { + "last_paths": { + "gencad": "", + "idf": "", + "netlist": "", + "specctra_dsn": "", + "step": "", + "vrml": "" + }, + "page_layout_descr_file": "" + }, + "schematic": { + "annotate_start_num": 0, + "drawing": { + "default_line_thickness": 6.0, + "default_text_size": 50.0, + "field_names": [], + "intersheets_ref_own_page": false, + "intersheets_ref_prefix": "", + "intersheets_ref_short": false, + "intersheets_ref_show": false, + "intersheets_ref_suffix": "", + "junction_size_choice": 3, + "label_size_ratio": 0.375, + "pin_symbol_size": 25.0, + "text_offset_ratio": 0.15 + }, + "legacy_lib_dir": "", + "legacy_lib_list": [], + "meta": { + "version": 1 + }, + "net_format_name": "", + "ngspice": { + "fix_include_paths": true, + "fix_passive_vals": false, + "meta": { + "version": 0 + }, + "model_mode": 0, + "workbook_filename": "" + }, + "page_layout_descr_file": "", + "plot_directory": "", + "spice_adjust_passive_values": false, + "spice_external_command": "spice \"%I\"", + "subpart_first_id": 65, + "subpart_id_separator": 0 + }, + "sheets": [ + [ + "1e1562d7-11ab-44be-85c8-801813be4d97", + "" + ] + ], + "text_variables": {} +} diff --git a/Shema/Shema super star/Shema super star.kicad_sch b/Shema/Shema super star/Shema super star.kicad_sch new file mode 100644 index 0000000..0dec91e --- /dev/null +++ b/Shema/Shema super star/Shema super star.kicad_sch @@ -0,0 +1,1235 @@ +(kicad_sch (version 20211123) (generator eeschema) + + (uuid 1e1562d7-11ab-44be-85c8-801813be4d97) + + (paper "A4") + + (lib_symbols + (symbol "CodeCell:CodeCell" (in_bom yes) (on_board yes) + (property "Reference" "U" (id 0) (at 0 12.7 0) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "CodeCell" (id 1) (at 0 10.16 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (id 2) (at 0 6.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (id 3) (at 0 6.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "CodeCell_0_1" + (rectangle (start -10.16 8.89) (end 10.16 -11.43) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type background)) + ) + ) + (symbol "CodeCell_1_1" + (pin input line (at 12.7 7.62 180) (length 2.54) + (name "GND" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + (pin output line (at 12.7 -5.08 180) (length 2.54) + (name "3V3_OUT" (effects (font (size 1.27 1.27)))) + (number "10" (effects (font (size 1.27 1.27)))) + ) + (pin input line (at 12.7 2.54 180) (length 2.54) + (name "GND" (effects (font (size 1.27 1.27)))) + (number "11" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -12.7 0 0) (length 2.54) + (name "GPIO5" (effects (font (size 1.27 1.27)))) + (number "12" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -12.7 -2.54 0) (length 2.54) + (name "GPIO6" (effects (font (size 1.27 1.27)))) + (number "13" (effects (font (size 1.27 1.27)))) + ) + (pin output line (at 12.7 -2.54 180) (length 2.54) + (name "VCC_OUT" (effects (font (size 1.27 1.27)))) + (number "14" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -12.7 -5.08 0) (length 2.54) + (name "GPIO7" (effects (font (size 1.27 1.27)))) + (number "15" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -12.7 5.08 0) (length 2.54) + (name "GPIO2/ADC" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -12.7 2.54 0) (length 2.54) + (name "GPIO3/ADC" (effects (font (size 1.27 1.27)))) + (number "3" (effects (font (size 1.27 1.27)))) + ) + (pin output line (at 12.7 0 180) (length 2.54) + (name "VCC_OUT" (effects (font (size 1.27 1.27)))) + (number "4" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -12.7 7.62 0) (length 2.54) + (name "GPIO1/ADC" (effects (font (size 1.27 1.27)))) + (number "5" (effects (font (size 1.27 1.27)))) + ) + (pin input line (at 12.7 -7.62 180) (length 2.54) + (name "VCC_IN" (effects (font (size 1.27 1.27)))) + (number "6" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -12.7 -7.62 0) (length 2.54) + (name "GPIO8/SDA" (effects (font (size 1.27 1.27)))) + (number "7" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at -12.7 -10.16 0) (length 2.54) + (name "GPIO9/SCL/BOOT" (effects (font (size 1.27 1.27)))) + (number "8" (effects (font (size 1.27 1.27)))) + ) + (pin input line (at 12.7 5.08 180) (length 2.54) + (name "GND" (effects (font (size 1.27 1.27)))) + (number "9" (effects (font (size 1.27 1.27)))) + ) + ) + ) + (symbol "Connector_Generic:Conn_01x02" (pin_names (offset 1.016) hide) (in_bom yes) (on_board yes) + (property "Reference" "J" (id 0) (at 0 2.54 0) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "Conn_01x02" (id 1) (at 0 -5.08 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (id 2) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_keywords" "connector" (id 4) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "Generic connector, single row, 01x02, script generated (kicad-library-utils/schlib/autogen/connector/)" (id 5) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_fp_filters" "Connector*:*_1x??_*" (id 6) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "Conn_01x02_1_1" + (rectangle (start -1.27 -2.413) (end 0 -2.667) + (stroke (width 0.1524) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (rectangle (start -1.27 0.127) (end 0 -0.127) + (stroke (width 0.1524) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (rectangle (start -1.27 1.27) (end 1.27 -3.81) + (stroke (width 0.254) (type default) (color 0 0 0 0)) + (fill (type background)) + ) + (pin passive line (at -5.08 0 0) (length 3.81) + (name "Pin_1" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at -5.08 -2.54 0) (length 3.81) + (name "Pin_2" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))) + ) + ) + ) + (symbol "Device:R" (pin_numbers hide) (pin_names (offset 0)) (in_bom yes) (on_board yes) + (property "Reference" "R" (id 0) (at 2.032 0 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "R" (id 1) (at 0 0 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (id 2) (at -1.778 0 90) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_keywords" "R res resistor" (id 4) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "Resistor" (id 5) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_fp_filters" "R_*" (id 6) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "R_0_1" + (rectangle (start -1.016 -2.54) (end 1.016 2.54) + (stroke (width 0.254) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + ) + (symbol "R_1_1" + (pin passive line (at 0 3.81 270) (length 1.27) + (name "~" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 0 -3.81 90) (length 1.27) + (name "~" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))) + ) + ) + ) + (symbol "Oled Screen:OLED_Screen_128x64px" (in_bom yes) (on_board yes) + (property "Reference" "U" (id 0) (at 0 6.35 0) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "OLED_Screen_128x64px" (id 1) (at 0 5.08 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (id 2) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (id 3) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "OLED_Screen_128x64px_0_1" + (rectangle (start -7.62 2.54) (end 7.62 -11.43) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type background)) + ) + (rectangle (start -6.35 1.27) (end 6.35 -6.35) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type outline)) + ) + ) + (symbol "OLED_Screen_128x64px_1_1" + (pin output line (at -3.81 -13.97 90) (length 2.54) + (name "GND" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + (pin input line (at -1.27 -13.97 90) (length 2.54) + (name "VDD" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))) + ) + (pin input line (at 1.27 -13.97 90) (length 2.54) + (name "SCK" (effects (font (size 1.27 1.27)))) + (number "3" (effects (font (size 1.27 1.27)))) + ) + (pin bidirectional line (at 3.81 -13.97 90) (length 2.54) + (name "SDA" (effects (font (size 1.27 1.27)))) + (number "4" (effects (font (size 1.27 1.27)))) + ) + ) + ) + (symbol "Regulator_Linear:L7805" (pin_names (offset 0.254)) (in_bom yes) (on_board yes) + (property "Reference" "U" (id 0) (at -3.81 3.175 0) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "L7805" (id 1) (at 0 3.175 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "" (id 2) (at 0.635 -3.81 0) + (effects (font (size 1.27 1.27) italic) (justify left) hide) + ) + (property "Datasheet" "http://www.st.com/content/ccc/resource/technical/document/datasheet/41/4f/b3/b0/12/d4/47/88/CD00000444.pdf/files/CD00000444.pdf/jcr:content/translations/en.CD00000444.pdf" (id 3) (at 0 -1.27 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_keywords" "Voltage Regulator 1.5A Positive" (id 4) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "Positive 1.5A 35V Linear Regulator, Fixed Output 5V, TO-220/TO-263/TO-252" (id 5) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_fp_filters" "TO?252* TO?263* TO?220*" (id 6) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "L7805_0_1" + (rectangle (start -5.08 1.905) (end 5.08 -5.08) + (stroke (width 0.254) (type default) (color 0 0 0 0)) + (fill (type background)) + ) + ) + (symbol "L7805_1_1" + (pin power_in line (at -7.62 0 0) (length 2.54) + (name "IN" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + (pin power_in line (at 0 -7.62 90) (length 2.54) + (name "GND" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))) + ) + (pin power_out line (at 7.62 0 180) (length 2.54) + (name "OUT" (effects (font (size 1.27 1.27)))) + (number "3" (effects (font (size 1.27 1.27)))) + ) + ) + ) + (symbol "Transistor_BJT:PN2222A" (pin_names (offset 0) hide) (in_bom yes) (on_board yes) + (property "Reference" "Q" (id 0) (at 5.08 1.905 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "PN2222A" (id 1) (at 5.08 0 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-92_Inline" (id 2) (at 5.08 -1.905 0) + (effects (font (size 1.27 1.27) italic) (justify left) hide) + ) + (property "Datasheet" "https://www.onsemi.com/pub/Collateral/PN2222-D.PDF" (id 3) (at 0 0 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "ki_keywords" "NPN Transistor" (id 4) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "1A Ic, 40V Vce, NPN Transistor, General Purpose Transistor, TO-92" (id 5) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_fp_filters" "TO?92*" (id 6) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "PN2222A_0_1" + (polyline + (pts + (xy 0 0) + (xy 0.635 0) + ) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy 2.54 -2.54) + (xy 0.635 -0.635) + ) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy 2.54 2.54) + (xy 0.635 0.635) + ) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy 0.635 1.905) + (xy 0.635 -1.905) + (xy 0.635 -1.905) + ) + (stroke (width 0.508) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy 2.413 -2.413) + (xy 1.905 -1.905) + (xy 1.905 -1.905) + ) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy 1.143 -1.651) + (xy 1.651 -1.143) + (xy 2.159 -2.159) + (xy 1.143 -1.651) + (xy 1.143 -1.651) + ) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type outline)) + ) + (circle (center 1.27 0) (radius 2.8194) + (stroke (width 0.254) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + ) + (symbol "PN2222A_1_1" + (pin passive line (at 2.54 -5.08 90) (length 2.54) + (name "E" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + (pin input line (at -5.08 0 0) (length 5.08) + (name "B" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 2.54 5.08 270) (length 2.54) + (name "C" (effects (font (size 1.27 1.27)))) + (number "3" (effects (font (size 1.27 1.27)))) + ) + ) + ) + (symbol "power:+9V" (power) (pin_names (offset 0)) (in_bom yes) (on_board yes) + (property "Reference" "#PWR" (id 0) (at 0 -3.81 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "+9V" (id 1) (at 0 3.556 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (id 2) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (id 3) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_keywords" "global power" (id 4) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "Power symbol creates a global label with name \"+9V\"" (id 5) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "+9V_0_1" + (polyline + (pts + (xy -0.762 1.27) + (xy 0 2.54) + ) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy 0 0) + (xy 0 2.54) + ) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy 0 2.54) + (xy 0.762 1.27) + ) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + ) + (symbol "+9V_1_1" + (pin power_in line (at 0 0 90) (length 0) hide + (name "+9V" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + ) + ) + (symbol "power:GNDPWR" (power) (pin_names (offset 0)) (in_bom yes) (on_board yes) + (property "Reference" "#PWR" (id 0) (at 0 -5.08 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GNDPWR" (id 1) (at 0 -3.302 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (id 2) (at 0 -1.27 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (id 3) (at 0 -1.27 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_keywords" "global ground" (id 4) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "Power symbol creates a global label with name \"GNDPWR\" , global ground" (id 5) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "GNDPWR_0_1" + (polyline + (pts + (xy 0 -1.27) + (xy 0 0) + ) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy -1.016 -1.27) + (xy -1.27 -2.032) + (xy -1.27 -2.032) + ) + (stroke (width 0.2032) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy -0.508 -1.27) + (xy -0.762 -2.032) + (xy -0.762 -2.032) + ) + (stroke (width 0.2032) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy 0 -1.27) + (xy -0.254 -2.032) + (xy -0.254 -2.032) + ) + (stroke (width 0.2032) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy 0.508 -1.27) + (xy 0.254 -2.032) + (xy 0.254 -2.032) + ) + (stroke (width 0.2032) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy 1.016 -1.27) + (xy -1.016 -1.27) + (xy -1.016 -1.27) + ) + (stroke (width 0.2032) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy 1.016 -1.27) + (xy 0.762 -2.032) + (xy 0.762 -2.032) + (xy 0.762 -2.032) + ) + (stroke (width 0.2032) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + ) + (symbol "GNDPWR_1_1" + (pin power_in line (at 0 0 270) (length 0) hide + (name "GNDPWR" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + ) + ) + ) + + + (wire (pts (xy 105.41 57.15) (xy 106.68 57.15)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 0ace8bbc-e417-44a7-9d30-aaa2f3289b80) + ) + (wire (pts (xy 186.69 60.96) (xy 186.69 63.5)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 1dcaefc9-ec22-4634-bb6c-b15c8fa21503) + ) + (wire (pts (xy 156.21 52.07) (xy 158.75 52.07)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 20222d9c-44be-4ea7-bce0-e703c67f5740) + ) + (wire (pts (xy 191.77 63.5) (xy 191.77 60.96)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 24cb4f63-b7ef-4bbe-8dbf-d6398caa7736) + ) + (wire (pts (xy 213.36 44.45) (xy 215.9 44.45)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 24d8abb6-013c-496c-bebc-056fd7b20eb5) + ) + (wire (pts (xy 111.76 72.39) (xy 109.22 72.39)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 256258f3-dc82-4af6-bb1c-efd50be9de8d) + ) + (wire (pts (xy 111.76 74.93) (xy 109.22 74.93)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 264a9b80-bc82-4716-b2cc-9f584ff073bb) + ) + (wire (pts (xy 200.66 72.39) (xy 208.28 72.39)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 27844279-010c-4ddd-936c-25e7cea102e0) + ) + (wire (pts (xy 162.56 80.01) (xy 193.04 80.01)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 283fd803-e91a-41d0-9a32-150ea3233ee4) + ) + (wire (pts (xy 134.62 82.55) (xy 137.16 82.55)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 288fe6ce-8684-4ca4-a8df-a2489791a0ef) + ) + (wire (pts (xy 162.56 72.39) (xy 165.1 72.39)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 32412e92-3544-422b-9ed0-1bd18035438b) + ) + (wire (pts (xy 121.92 57.15) (xy 124.46 57.15)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 38653bab-f91c-435e-abc7-63e8d4747229) + ) + (wire (pts (xy 134.62 77.47) (xy 137.16 77.47)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 4548f80a-2436-49f0-b402-6132ee85b8cd) + ) + (wire (pts (xy 137.16 57.15) (xy 134.62 57.15)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 46b8108c-2ac9-409a-b2c3-2b1369b4916a) + ) + (wire (pts (xy 111.76 67.31) (xy 111.76 64.77)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 47011421-069d-41d8-a835-a3b64b57bb2c) + ) + (wire (pts (xy 219.71 80.01) (xy 208.28 80.01)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 4e25e89b-46b9-478b-8827-77ad97ab9cad) + ) + (wire (pts (xy 184.15 60.96) (xy 184.15 63.5)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 5ff0c543-7832-470c-bf76-11c95d806655) + ) + (wire (pts (xy 129.54 67.31) (xy 111.76 67.31)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 7bd6c545-82ac-420a-8eea-ccf7ad831af3) + ) + (wire (pts (xy 156.21 44.45) (xy 158.75 44.45)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 7ff2c679-56d1-4aee-ac8f-c391fc08a29a) + ) + (wire (pts (xy 156.21 46.99) (xy 158.75 46.99)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 874f7224-5349-4168-8a1b-aed8997cfc48) + ) + (wire (pts (xy 162.56 67.31) (xy 165.1 67.31)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid a83f580e-8259-40c4-8963-624bce5f168b) + ) + (wire (pts (xy 121.92 55.88) (xy 121.92 57.15)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid b6cd3d61-dcd1-44d4-8603-496aa8fa1214) + ) + (wire (pts (xy 213.36 46.99) (xy 215.9 46.99)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid be8623a8-05e4-4d0e-900b-aaea6594e4af) + ) + (wire (pts (xy 134.62 80.01) (xy 137.16 80.01)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid c2b2e332-7736-45bb-a470-64ce78b34254) + ) + (wire (pts (xy 213.36 63.5) (xy 215.9 63.5)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid c59883b3-499f-46cb-aece-0915668a9ef7) + ) + (wire (pts (xy 119.38 57.15) (xy 116.84 57.15)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid ca396f45-4e1a-4767-91d0-73c3d0abce0f) + ) + (wire (pts (xy 213.36 60.96) (xy 215.9 60.96)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid da133450-b195-4846-86cb-46435843107c) + ) + (wire (pts (xy 189.23 60.96) (xy 189.23 63.5)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid de01f2c4-834a-460b-9ab2-eb7633cb6982) + ) + (wire (pts (xy 224.79 80.01) (xy 222.25 80.01)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid e591abd2-81ad-4cc0-8a31-c7c2f5cbf6bc) + ) + (wire (pts (xy 105.41 55.88) (xy 105.41 57.15)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid e97a92b9-3d0b-4c6e-98a5-722ddbfd0330) + ) + (wire (pts (xy 156.21 54.61) (xy 158.75 54.61)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid f8e79dcf-58b1-4907-af7c-4d3d1b8ecc9f) + ) + (wire (pts (xy 134.62 74.93) (xy 137.16 74.93)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid fadf1952-b26c-4a50-8830-45b7f1eeb90a) + ) + + (global_label "GND Screen" (shape input) (at 165.1 67.31 0) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify left)) + (uuid 02439648-3cb5-4c70-96da-f02314e71382) + (property "Références Inter-Feuilles" "${INTERSHEET_REFS}" (id 0) (at 178.7617 67.3894 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + ) + (global_label "Couleur" (shape input) (at 134.62 74.93 180) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right)) + (uuid 1123c0e3-6268-4ef0-85b5-b4c9f532b67e) + (property "Références Inter-Feuilles" "${INTERSHEET_REFS}" (id 0) (at 124.9498 75.0094 0) + (effects (font (size 1.27 1.27)) (justify right) hide) + ) + ) + (global_label "VDD Screen" (shape output) (at 165.1 72.39 0) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify left)) + (uuid 3fbc7dfa-f718-4c2e-800e-e72d9f8330ae) + (property "Références Inter-Feuilles" "${INTERSHEET_REFS}" (id 0) (at 178.5198 72.3106 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + ) + (global_label "OUT Motor 2" (shape output) (at 156.21 54.61 180) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right)) + (uuid 53694e16-9033-4a5e-ba9a-2184a209132d) + (property "Références Inter-Feuilles" "${INTERSHEET_REFS}" (id 0) (at 141.7621 54.5306 0) + (effects (font (size 1.27 1.27)) (justify right) hide) + ) + ) + (global_label "Tirette" (shape input) (at 213.36 44.45 180) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right)) + (uuid 6b38e5bd-ae65-4390-93ff-09ca4b15c821) + (property "Références Inter-Feuilles" "${INTERSHEET_REFS}" (id 0) (at 204.9598 44.3706 0) + (effects (font (size 1.27 1.27)) (justify right) hide) + ) + ) + (global_label "GND Screen" (shape output) (at 184.15 63.5 270) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right)) + (uuid 71993a01-5262-4ec3-98b7-b54fe0379b91) + (property "Références Inter-Feuilles" "${INTERSHEET_REFS}" (id 0) (at 184.0706 77.1617 90) + (effects (font (size 1.27 1.27)) (justify right) hide) + ) + ) + (global_label "OUT Motor 2" (shape input) (at 121.92 55.88 90) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify left)) + (uuid 809c7b99-a7ea-4654-94ec-4b35a37adb09) + (property "Références Inter-Feuilles" "${INTERSHEET_REFS}" (id 0) (at 121.8406 41.4321 90) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + ) + (global_label "SDA Screen" (shape bidirectional) (at 134.62 80.01 180) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right)) + (uuid 8e0c40ca-1cf1-4a37-9432-4093ae1e7f6e) + (property "Références Inter-Feuilles" "${INTERSHEET_REFS}" (id 0) (at 121.2607 79.9306 0) + (effects (font (size 1.27 1.27)) (justify right) hide) + ) + ) + (global_label "OUT Motor 1" (shape output) (at 156.21 46.99 180) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right)) + (uuid 993024b1-94d4-4e1c-b6d1-c631ab89453b) + (property "Références Inter-Feuilles" "${INTERSHEET_REFS}" (id 0) (at 141.7621 46.9106 0) + (effects (font (size 1.27 1.27)) (justify right) hide) + ) + ) + (global_label "SCK Screen" (shape input) (at 189.23 63.5 270) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right)) + (uuid a962eb86-6cb4-4836-a10d-650b379daa08) + (property "Références Inter-Feuilles" "${INTERSHEET_REFS}" (id 0) (at 189.1506 77.0407 90) + (effects (font (size 1.27 1.27)) (justify right) hide) + ) + ) + (global_label "Couleur" (shape input) (at 111.76 72.39 0) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify left)) + (uuid bbcc5d3c-a382-49c5-a23f-c9fde068126a) + (property "Références Inter-Feuilles" "${INTERSHEET_REFS}" (id 0) (at 121.4302 72.3106 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + ) + (global_label "SDA Screen" (shape bidirectional) (at 191.77 63.5 270) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right)) + (uuid c46431b7-506d-4698-b340-cd6811619a7e) + (property "Références Inter-Feuilles" "${INTERSHEET_REFS}" (id 0) (at 191.6906 76.8593 90) + (effects (font (size 1.27 1.27)) (justify right) hide) + ) + ) + (global_label "Tirette" (shape input) (at 134.62 77.47 180) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right)) + (uuid e0c31a07-55d2-40b9-a30e-1671f8ab89e7) + (property "Références Inter-Feuilles" "${INTERSHEET_REFS}" (id 0) (at 126.2198 77.3906 0) + (effects (font (size 1.27 1.27)) (justify right) hide) + ) + ) + (global_label "VDD Screen" (shape input) (at 186.69 63.5 270) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right)) + (uuid e63c5142-c324-43ae-b1a1-d17feb1145b4) + (property "Références Inter-Feuilles" "${INTERSHEET_REFS}" (id 0) (at 186.6106 76.9198 90) + (effects (font (size 1.27 1.27)) (justify right) hide) + ) + ) + (global_label "SCK Screen" (shape output) (at 134.62 82.55 180) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify right)) + (uuid ec4c16a8-9153-4fd7-8834-2912e3b3f869) + (property "Références Inter-Feuilles" "${INTERSHEET_REFS}" (id 0) (at 121.0793 82.4706 0) + (effects (font (size 1.27 1.27)) (justify right) hide) + ) + ) + (global_label "OUT Motor 1" (shape input) (at 105.41 55.88 90) (fields_autoplaced) + (effects (font (size 1.27 1.27)) (justify left)) + (uuid ed005206-ce92-4820-9074-879e9b7e4c5b) + (property "Références Inter-Feuilles" "${INTERSHEET_REFS}" (id 0) (at 105.3306 41.4321 90) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + ) + + (symbol (lib_id "power:+9V") (at 213.36 60.96 90) (unit 1) + (in_bom yes) (on_board yes) (fields_autoplaced) + (uuid 00ce3151-4dbf-4f1a-ae30-72aedcec88e3) + (property "Reference" "#PWR?" (id 0) (at 217.17 60.96 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "+9V" (id 1) (at 209.55 60.9599 90) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "" (id 2) (at 213.36 60.96 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (id 3) (at 213.36 60.96 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid aaf8e0df-161b-4e80-bb16-9c95044ce28d)) + ) + + (symbol (lib_id "Connector_Generic:Conn_01x02") (at 220.98 60.96 0) (unit 1) + (in_bom yes) (on_board yes) (fields_autoplaced) + (uuid 031b8431-1a7b-4ac6-a6f8-63770040077c) + (property "Reference" "J4" (id 0) (at 223.52 60.9599 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "Conn PWR" (id 1) (at 223.52 63.4999 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "" (id 2) (at 220.98 60.96 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 220.98 60.96 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 2794731a-5a5b-4b8b-a76b-6cf043957d73)) + (pin "2" (uuid c2ad8cd1-8ffb-4257-9ba7-94e13e45714b)) + ) + + (symbol (lib_id "power:+9V") (at 224.79 80.01 270) (unit 1) + (in_bom yes) (on_board yes) (fields_autoplaced) + (uuid 094cb383-3f7b-4ad1-a730-143c4b40bb42) + (property "Reference" "#PWR?" (id 0) (at 220.98 80.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "+9V" (id 1) (at 228.6 80.0099 90) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "" (id 2) (at 224.79 80.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (id 3) (at 224.79 80.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid c6eceb03-53d1-4f3e-b389-542b31348fdb)) + ) + + (symbol (lib_id "CodeCell:CodeCell") (at 149.86 72.39 0) (unit 1) + (in_bom yes) (on_board yes) (fields_autoplaced) + (uuid 108312e7-8790-43ac-b095-09831d968924) + (property "Reference" "U1" (id 0) (at 149.86 58.42 0)) + (property "Value" "CodeCell" (id 1) (at 149.86 60.96 0)) + (property "Footprint" "" (id 2) (at 149.86 66.04 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (id 3) (at 149.86 66.04 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid b7326ce5-8016-4c2d-81cf-98724e14179f)) + (pin "10" (uuid 435919c4-ead3-436d-b4de-2edb6be4e1ca)) + (pin "11" (uuid f5ab3c2a-f3c9-41d9-b485-f2be48d41ff4)) + (pin "12" (uuid 95b1f4f3-baad-4148-b717-62f3ffb8f668)) + (pin "13" (uuid 28ffaeb5-804c-448e-a308-2007c92109c4)) + (pin "14" (uuid fce74d55-9e14-449b-8271-16d871743494)) + (pin "15" (uuid 9e3356cb-96e2-4aaa-94ed-72a6e16a8f55)) + (pin "2" (uuid a37328ed-3a18-4567-b5b8-ee2cf688c603)) + (pin "3" (uuid 39cfcc0d-4339-48a1-a9e0-2f4654271b2a)) + (pin "4" (uuid 42649552-beaf-4448-a708-65612bcafd5a)) + (pin "5" (uuid a471712d-4bb3-4ec7-a402-8e7e244a1bd0)) + (pin "6" (uuid e3a78563-0bb6-4a3f-b3fc-32fd1193bd96)) + (pin "7" (uuid 7ecf7808-8f33-494b-811e-ec46106019ab)) + (pin "8" (uuid e0b41ff7-c4fb-47cb-9f91-29a9cf442c0b)) + (pin "9" (uuid 67bb5156-dd57-4b58-b15a-723224cf6e5c)) + ) + + (symbol (lib_id "power:GNDPWR") (at 208.28 72.39 0) (unit 1) + (in_bom yes) (on_board yes) (fields_autoplaced) + (uuid 3057e109-2478-4176-8524-5270b0084a16) + (property "Reference" "#PWR?" (id 0) (at 208.28 77.47 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GNDPWR" (id 1) (at 208.153 77.47 0) + (effects (font (size 1.27 1.27)) (justify left bottom)) + ) + (property "Footprint" "" (id 2) (at 208.28 73.66 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (id 3) (at 208.28 73.66 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 2c002ae0-d018-4e26-a547-14aa896a8e3b)) + ) + + (symbol (lib_id "power:GNDPWR") (at 111.76 74.93 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) + (uuid 31ba082d-2505-49ad-93a4-0ffbb220075a) + (property "Reference" "#PWR?" (id 0) (at 111.76 80.01 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GNDPWR" (id 1) (at 111.887 80.01 0) + (effects (font (size 1.27 1.27)) (justify bottom)) + ) + (property "Footprint" "" (id 2) (at 111.76 76.2 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (id 3) (at 111.76 76.2 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 9792e3c2-aa6c-4751-8e85-48c0884258b4)) + ) + + (symbol (lib_id "Transistor_BJT:PN2222A") (at 111.76 59.69 90) (unit 1) + (in_bom yes) (on_board yes) (fields_autoplaced) + (uuid 39a76579-8291-41ea-b218-79cb2336f612) + (property "Reference" "Q2" (id 0) (at 111.76 50.8 90)) + (property "Value" "2N2222" (id 1) (at 111.76 53.34 90)) + (property "Footprint" "Package_TO_SOT_THT:TO-92_Inline" (id 2) (at 113.665 54.61 0) + (effects (font (size 1.27 1.27) italic) (justify left) hide) + ) + (property "Datasheet" "https://www.onsemi.com/pub/Collateral/PN2222-D.PDF" (id 3) (at 111.76 59.69 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (pin "1" (uuid 62627f73-2fd1-4cb1-a699-f9e7c45a73ed)) + (pin "2" (uuid 3cb115d3-dfc6-48d7-bfe1-bf659f37130b)) + (pin "3" (uuid 80d8d2bf-a5aa-42d3-af88-19cbd5150e70)) + ) + + (symbol (lib_id "Connector_Generic:Conn_01x02") (at 220.98 44.45 0) (unit 1) + (in_bom yes) (on_board yes) (fields_autoplaced) + (uuid 3a1b8ec5-891e-47d8-a389-13f16a5b9c4e) + (property "Reference" "J5" (id 0) (at 223.52 44.4499 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "Conn Tirette" (id 1) (at 223.52 46.9899 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "" (id 2) (at 220.98 44.45 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 220.98 44.45 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid d83de6c9-ef03-4745-a074-c49a3e7ae149)) + (pin "2" (uuid bb9b54c8-8ec2-4c9b-9e4b-6dc4af25c043)) + ) + + (symbol (lib_id "Oled Screen:OLED_Screen_128x64px") (at 187.96 46.99 0) (unit 1) + (in_bom yes) (on_board yes) (fields_autoplaced) + (uuid 3a972af3-391d-486e-b1fe-425bf5f46fc0) + (property "Reference" "U2" (id 0) (at 196.85 50.1649 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "OLED_Screen_128x64px" (id 1) (at 196.85 52.7049 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "" (id 2) (at 187.96 46.99 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (id 3) (at 187.96 46.99 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid a74981ac-45c7-48dd-9d41-17306ce8cfac)) + (pin "2" (uuid cae3213b-067c-4a21-a138-95fbfc3c2567)) + (pin "3" (uuid 2278b166-0c4d-412c-b31c-8d2c94c60cb0)) + (pin "4" (uuid 66a820f7-84b6-43d3-9c4f-6e00786b3449)) + ) + + (symbol (lib_id "Device:R") (at 133.35 67.31 90) (unit 1) + (in_bom yes) (on_board yes) + (uuid 3e82de2a-9133-4636-8dc0-b0a211bb6749) + (property "Reference" "R2" (id 0) (at 133.35 69.85 90)) + (property "Value" "150" (id 1) (at 133.35 67.31 90)) + (property "Footprint" "" (id 2) (at 133.35 69.088 90) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 133.35 67.31 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 026a193d-ef35-4bd1-acdf-82b20465ade1)) + (pin "2" (uuid c1703da3-d4e1-4001-b71d-284290b7479c)) + ) + + (symbol (lib_id "Transistor_BJT:PN2222A") (at 129.54 59.69 90) (unit 1) + (in_bom yes) (on_board yes) (fields_autoplaced) + (uuid 4395efcf-edb3-4f1d-bc11-daf7357e48ac) + (property "Reference" "Q1" (id 0) (at 129.54 50.8 90)) + (property "Value" "2N2222" (id 1) (at 129.54 53.34 90)) + (property "Footprint" "Package_TO_SOT_THT:TO-92_Inline" (id 2) (at 131.445 54.61 0) + (effects (font (size 1.27 1.27) italic) (justify left) hide) + ) + (property "Datasheet" "https://www.onsemi.com/pub/Collateral/PN2222-D.PDF" (id 3) (at 129.54 59.69 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (pin "1" (uuid 424fcb24-bcee-4717-b381-4fe814a6ab19)) + (pin "2" (uuid 1a6f6892-bdd4-4459-a353-42c3d47acc6c)) + (pin "3" (uuid b8812259-6996-49de-9325-01358addd403)) + ) + + (symbol (lib_id "Connector_Generic:Conn_01x02") (at 163.83 44.45 0) (unit 1) + (in_bom yes) (on_board yes) (fields_autoplaced) + (uuid 44127ed1-1385-446c-835e-6cc42c22a979) + (property "Reference" "J1" (id 0) (at 166.37 44.4499 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "Conn Motor 1" (id 1) (at 166.37 46.9899 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "" (id 2) (at 163.83 44.45 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 163.83 44.45 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 80581236-b852-4b1e-b342-57f85118bed8)) + (pin "2" (uuid d7a81e71-26c7-47ac-92a6-8a201781f85f)) + ) + + (symbol (lib_id "power:+9V") (at 156.21 52.07 90) (unit 1) + (in_bom yes) (on_board yes) (fields_autoplaced) + (uuid 4451cfd5-8928-4ebc-9687-0ca53d46f2f8) + (property "Reference" "#PWR?" (id 0) (at 160.02 52.07 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "+9V" (id 1) (at 152.4 52.0699 90) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "" (id 2) (at 156.21 52.07 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (id 3) (at 156.21 52.07 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 470e5ebb-2f7f-4490-af0a-0682bc4eb6a1)) + ) + + (symbol (lib_id "power:GNDPWR") (at 137.16 57.15 0) (unit 1) + (in_bom yes) (on_board yes) (fields_autoplaced) + (uuid 4a52ac33-08ab-4868-aa63-2bdddd8d7440) + (property "Reference" "#PWR?" (id 0) (at 137.16 62.23 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GNDPWR" (id 1) (at 137.033 62.23 0) + (effects (font (size 1.27 1.27)) (justify left bottom)) + ) + (property "Footprint" "" (id 2) (at 137.16 58.42 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (id 3) (at 137.16 58.42 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid e91c4761-e243-4029-8a22-c79ec4727cd1)) + ) + + (symbol (lib_id "Connector_Generic:Conn_01x02") (at 163.83 52.07 0) (unit 1) + (in_bom yes) (on_board yes) (fields_autoplaced) + (uuid 538612bd-3778-4aee-862c-6c9592a449d9) + (property "Reference" "J2" (id 0) (at 166.37 52.0699 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "Conn Motor 2" (id 1) (at 166.37 54.6099 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "" (id 2) (at 163.83 52.07 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 163.83 52.07 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 062d634e-fb51-429a-9b58-96bb6896aef1)) + (pin "2" (uuid db4015d3-54a8-4e5c-a817-b4932ced144a)) + ) + + (symbol (lib_id "power:+9V") (at 156.21 44.45 90) (unit 1) + (in_bom yes) (on_board yes) (fields_autoplaced) + (uuid 5773b813-ef07-47af-a30c-b71064b4b2ef) + (property "Reference" "#PWR?" (id 0) (at 160.02 44.45 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "+9V" (id 1) (at 152.4 44.4499 90) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "" (id 2) (at 156.21 44.45 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (id 3) (at 156.21 44.45 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid f7055f03-58b4-480e-a2de-55c0bf66fc8b)) + ) + + (symbol (lib_id "Connector_Generic:Conn_01x02") (at 219.71 74.93 90) (unit 1) + (in_bom yes) (on_board yes) (fields_autoplaced) + (uuid 699f574e-ffca-45e7-b94a-d3e98407c4ed) + (property "Reference" "J3" (id 0) (at 224.79 73.6599 90) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Value" "Conn BAU" (id 1) (at 224.79 76.1999 90) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Footprint" "" (id 2) (at 219.71 74.93 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 219.71 74.93 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 3267ab19-bfa3-4190-bda4-ab89aa027c52)) + (pin "2" (uuid 5248aeb9-89d3-49b1-9456-c6113a7c60a8)) + ) + + (symbol (lib_id "Device:R") (at 133.35 64.77 270) (unit 1) + (in_bom yes) (on_board yes) + (uuid 856905bf-e689-4f51-90e0-cb3befb384fc) + (property "Reference" "R1" (id 0) (at 133.35 62.23 90)) + (property "Value" "150" (id 1) (at 133.35 64.77 90)) + (property "Footprint" "" (id 2) (at 133.35 62.992 90) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 133.35 64.77 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 6a65c801-4c59-45f3-97d4-aeb0b0e6b9eb)) + (pin "2" (uuid 627c1fac-b797-42e3-9034-8f0022acc277)) + ) + + (symbol (lib_id "Connector_Generic:Conn_01x02") (at 104.14 72.39 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) (fields_autoplaced) + (uuid b04f9159-83ae-49de-a052-c4245b100256) + (property "Reference" "J6" (id 0) (at 104.14 66.04 0)) + (property "Value" "Conn Couleur" (id 1) (at 104.14 68.58 0)) + (property "Footprint" "" (id 2) (at 104.14 72.39 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 104.14 72.39 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 82e7749b-7643-4f84-8c6f-c6d75fb34f90)) + (pin "2" (uuid d8d61eea-182a-4241-b297-47fabff5567a)) + ) + + (symbol (lib_id "power:GNDPWR") (at 213.36 63.5 0) (unit 1) + (in_bom yes) (on_board yes) + (uuid cc3f8121-548f-4c46-8a65-1bcd06fd23b0) + (property "Reference" "#PWR?" (id 0) (at 213.36 68.58 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GNDPWR" (id 1) (at 213.233 68.58 0) + (effects (font (size 1.27 1.27)) (justify bottom)) + ) + (property "Footprint" "" (id 2) (at 213.36 64.77 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (id 3) (at 213.36 64.77 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 2dae85d5-b494-4aae-9ce1-c3e3865799cb)) + ) + + (symbol (lib_id "power:GNDPWR") (at 119.38 57.15 0) (unit 1) + (in_bom yes) (on_board yes) (fields_autoplaced) + (uuid dbe52150-0674-4fef-9589-606f9bc0343f) + (property "Reference" "#PWR?" (id 0) (at 119.38 62.23 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GNDPWR" (id 1) (at 119.253 62.23 0) + (effects (font (size 1.27 1.27)) (justify bottom)) + ) + (property "Footprint" "" (id 2) (at 119.38 58.42 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (id 3) (at 119.38 58.42 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 349a113d-8d6f-40b6-8405-5026890f9f55)) + ) + + (symbol (lib_id "power:GNDPWR") (at 213.36 46.99 0) (unit 1) + (in_bom yes) (on_board yes) + (uuid dcd49c6b-a69f-4f05-ae1f-a9ee1c5f7cd2) + (property "Reference" "#PWR?" (id 0) (at 213.36 52.07 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GNDPWR" (id 1) (at 213.233 52.07 0) + (effects (font (size 1.27 1.27)) (justify bottom)) + ) + (property "Footprint" "" (id 2) (at 213.36 48.26 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (id 3) (at 213.36 48.26 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 368745cf-7644-4134-ad84-be30af930efc)) + ) + + (symbol (lib_id "Regulator_Linear:L7805") (at 200.66 80.01 180) (unit 1) + (in_bom yes) (on_board yes) (fields_autoplaced) + (uuid fe5625cf-f295-41a6-8bd8-b0f0d0b6cf90) + (property "Reference" "U3" (id 0) (at 200.66 85.09 0)) + (property "Value" "L7805" (id 1) (at 200.66 87.63 0)) + (property "Footprint" "" (id 2) (at 200.025 76.2 0) + (effects (font (size 1.27 1.27) italic) (justify left) hide) + ) + (property "Datasheet" "http://www.st.com/content/ccc/resource/technical/document/datasheet/41/4f/b3/b0/12/d4/47/88/CD00000444.pdf/files/CD00000444.pdf/jcr:content/translations/en.CD00000444.pdf" (id 3) (at 200.66 78.74 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 70b57f86-2fe3-41fc-b2e4-197f54015f93)) + (pin "2" (uuid a079e108-fbb1-44aa-a512-88d82954979f)) + (pin "3" (uuid 92aa6b96-80a6-48ec-93d8-72882ee21947)) + ) + + (sheet_instances + (path "/" (page "1")) + ) + + (symbol_instances + (path "/00ce3151-4dbf-4f1a-ae30-72aedcec88e3" + (reference "#PWR?") (unit 1) (value "+9V") (footprint "") + ) + (path "/094cb383-3f7b-4ad1-a730-143c4b40bb42" + (reference "#PWR?") (unit 1) (value "+9V") (footprint "") + ) + (path "/3057e109-2478-4176-8524-5270b0084a16" + (reference "#PWR?") (unit 1) (value "GNDPWR") (footprint "") + ) + (path "/31ba082d-2505-49ad-93a4-0ffbb220075a" + (reference "#PWR?") (unit 1) (value "GNDPWR") (footprint "") + ) + (path "/4451cfd5-8928-4ebc-9687-0ca53d46f2f8" + (reference "#PWR?") (unit 1) (value "+9V") (footprint "") + ) + (path "/4a52ac33-08ab-4868-aa63-2bdddd8d7440" + (reference "#PWR?") (unit 1) (value "GNDPWR") (footprint "") + ) + (path "/5773b813-ef07-47af-a30c-b71064b4b2ef" + (reference "#PWR?") (unit 1) (value "+9V") (footprint "") + ) + (path "/cc3f8121-548f-4c46-8a65-1bcd06fd23b0" + (reference "#PWR?") (unit 1) (value "GNDPWR") (footprint "") + ) + (path "/dbe52150-0674-4fef-9589-606f9bc0343f" + (reference "#PWR?") (unit 1) (value "GNDPWR") (footprint "") + ) + (path "/dcd49c6b-a69f-4f05-ae1f-a9ee1c5f7cd2" + (reference "#PWR?") (unit 1) (value "GNDPWR") (footprint "") + ) + (path "/44127ed1-1385-446c-835e-6cc42c22a979" + (reference "J1") (unit 1) (value "Conn Motor 1") (footprint "") + ) + (path "/538612bd-3778-4aee-862c-6c9592a449d9" + (reference "J2") (unit 1) (value "Conn Motor 2") (footprint "") + ) + (path "/699f574e-ffca-45e7-b94a-d3e98407c4ed" + (reference "J3") (unit 1) (value "Conn BAU") (footprint "") + ) + (path "/031b8431-1a7b-4ac6-a6f8-63770040077c" + (reference "J4") (unit 1) (value "Conn PWR") (footprint "") + ) + (path "/3a1b8ec5-891e-47d8-a389-13f16a5b9c4e" + (reference "J5") (unit 1) (value "Conn Tirette") (footprint "") + ) + (path "/b04f9159-83ae-49de-a052-c4245b100256" + (reference "J6") (unit 1) (value "Conn Couleur") (footprint "") + ) + (path "/4395efcf-edb3-4f1d-bc11-daf7357e48ac" + (reference "Q1") (unit 1) (value "2N2222") (footprint "Package_TO_SOT_THT:TO-92_Inline") + ) + (path "/39a76579-8291-41ea-b218-79cb2336f612" + (reference "Q2") (unit 1) (value "2N2222") (footprint "Package_TO_SOT_THT:TO-92_Inline") + ) + (path "/856905bf-e689-4f51-90e0-cb3befb384fc" + (reference "R1") (unit 1) (value "150") (footprint "") + ) + (path "/3e82de2a-9133-4636-8dc0-b0a211bb6749" + (reference "R2") (unit 1) (value "150") (footprint "") + ) + (path "/108312e7-8790-43ac-b095-09831d968924" + (reference "U1") (unit 1) (value "CodeCell") (footprint "") + ) + (path "/3a972af3-391d-486e-b1fe-425bf5f46fc0" + (reference "U2") (unit 1) (value "OLED_Screen_128x64px") (footprint "") + ) + (path "/fe5625cf-f295-41a6-8bd8-b0f0d0b6cf90" + (reference "U3") (unit 1) (value "L7805") (footprint "") + ) + ) +) diff --git a/plan etapes.jpg b/plan etapes.jpg new file mode 100644 index 0000000..4e4abeb Binary files /dev/null and b/plan etapes.jpg differ