From 50de931e8ae5f34a0b7a5ba5de5e2e2f39a8dc74 Mon Sep 17 00:00:00 2001 From: Felix Pankratz Date: Sat, 7 Dec 2024 16:09:15 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=98=9B=20quadratic=20bezier=20curve?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- organism/Makefile | 21 ++++++++ organism/platformio.ini | 22 +++++++++ organism/src/main.cpp | 105 ++++++++++++++++++++++++++++++++++++++++ organism/src/main.h | 10 ++++ 4 files changed, 158 insertions(+) create mode 100644 organism/Makefile create mode 100644 organism/platformio.ini create mode 100644 organism/src/main.cpp create mode 100644 organism/src/main.h diff --git a/organism/Makefile b/organism/Makefile new file mode 100644 index 0000000..c5e3ab2 --- /dev/null +++ b/organism/Makefile @@ -0,0 +1,21 @@ +# Uncomment lines below if you have problems with $PATH +#SHELL := /bin/bash +#PATH := /usr/local/bin:$(PATH) + +all: + pio.exe -f -c vim run + +upload: + pio.exe -f -c vim run --target upload + +clean: + pio.exe -f -c vim run --target clean + +program: + pio.exe -f -c vim run --target program + +uploadfs: + pio.exe -f -c vim run --target uploadfs + +update: + pio.exe -f -c vim update diff --git a/organism/platformio.ini b/organism/platformio.ini new file mode 100644 index 0000000..0e62411 --- /dev/null +++ b/organism/platformio.ini @@ -0,0 +1,22 @@ +; PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + +[env:adafruit_matrixportal_esp32s3] +platform = espressif32 +board = adafruit_matrixportal_esp32s3 +framework = arduino +monitor_speed = 115200 + +lib_deps = + adafruit/Adafruit GFX Library + adafruit/Adafruit BusIO + Wire + fastled/FastLED + https://github.com/mrfaptastic/ESP32-HUB75-MatrixPanel-I2S-DMA.git diff --git a/organism/src/main.cpp b/organism/src/main.cpp new file mode 100644 index 0000000..c14dad6 --- /dev/null +++ b/organism/src/main.cpp @@ -0,0 +1,105 @@ +#include +#include "xtensa/core-macros.h" +#include + +#include "main.h" + +#define R1 42 +#define G1 40 +#define BL1 41 +#define R2 38 +#define G2 37 +#define BL2 39 +#define CH_A 45 +#define CH_B 36 +#define CH_C 48 +#define CH_D 35 +#define CH_E 21 +#define CLK 2 +#define LAT 47 +#define OE 14 + +#define PIN_E 21 +#define PANEL_WIDTH 64 +#define PANEL_HEIGHT 32 // Panel height of 64 will required PIN_E to be defined. + +#define PANELS_NUMBER 1 + +#define PANE_WIDTH PANEL_WIDTH * PANELS_NUMBER +#define PANE_HEIGHT PANEL_HEIGHT +#define NUM_LEDS PANE_WIDTH*PANE_HEIGHT + +#define ONBOARD_LED 13 + +MatrixPanel_I2S_DMA *matrix = nullptr; + +int start_x = 5; +int start_y = 5; +int end_x = 59; +int end_y = 27; + +int anchor_x = 16; +int anchor_y = 24; + +void setup(){ + Serial.begin(BAUD_RATE); + pinMode(ONBOARD_LED, OUTPUT); + + // redefine pins if required + HUB75_I2S_CFG::i2s_pins _pins={R1, G1, BL1, R2, G2, BL2, CH_A, CH_B, CH_C, CH_D, CH_E, LAT, OE, CLK}; + HUB75_I2S_CFG mxconfig(PANEL_WIDTH, PANEL_HEIGHT, PANELS_NUMBER, _pins); + + mxconfig.gpio.e = PIN_E; + mxconfig.driver = HUB75_I2S_CFG::FM6126A; // for panels using FM6126A chips + + mxconfig.latch_blanking = 4; + mxconfig.i2sspeed = HUB75_I2S_CFG::HZ_10M; + mxconfig.clkphase = false; + + //mxconfig.double_buff = true; + + matrix = new MatrixPanel_I2S_DMA(mxconfig); + matrix->begin(); + matrix->setBrightness8(64); + matrix->fillScreenRGB888(0, 0, 0); +} + +int interpolate(int from, int to, float percent) { + int difference = to - from; + return from + ( difference * percent ); +} + +void draw_bezier(int x1, int y1, int x2, int y2, int x3, int y3, float percent) { + // draw lines to p2 + matrix->drawLine(x1, y1, x2, y2, matrix->color565(16, 16, 16)); + matrix->drawLine(x2, y2, x3, y3, matrix->color565(16, 16, 16)); + + int xa = interpolate(x1, x2, percent); + int ya = interpolate(y1, y2, percent); + int xb = interpolate(x2, x3, percent); + int yb = interpolate(y2, y3, percent); + //matrix->drawLine(xa, ya, xb, yb, matrix->color565(0, 128, 0)); + + int x = interpolate(xa, xb, percent); + int y = interpolate(ya, yb, percent); + + matrix->drawPixel(x, y, matrix->color565(255, 255, 255)); +} + +void loop() { + // matrix ->flipDMABuffer(); + matrix->clearScreen(); + // delay(25); + anchor_y += 1; + if (anchor_y >= 32) { + anchor_y = 0; + } + for (float i = 0; i < 1; i += 0.02) { + draw_bezier(start_x, start_y, anchor_x, anchor_y, end_x, end_y, i); + } + matrix->drawPixel(start_x, start_y, matrix->color565(255, 0, 0)); + matrix->drawPixel(end_x, end_y, matrix->color565(255, 0, 0)); + matrix->drawPixel(anchor_x, anchor_y, matrix->color565(255, 0, 255)); + delay(100); +} + diff --git a/organism/src/main.h b/organism/src/main.h new file mode 100644 index 0000000..e4e784a --- /dev/null +++ b/organism/src/main.h @@ -0,0 +1,10 @@ +#include + +#define BAUD_RATE 115200 // serial debug port baud rate + +void buffclear(CRGB *buf); +uint16_t XY16( uint16_t x, uint16_t y); +void mxfill(CRGB *leds); +uint16_t colorWheel(uint8_t pos); +void drawText(int colorWheelOffset); +