1
0
Fork 0

Compare commits

...

10 Commits

Author SHA1 Message Date
radex cd4aa9ba09
playlist support 2024-05-25 13:46:04 +02:00
radex 480068fabb
convert video 2024-05-25 12:45:54 +02:00
radex 1fc98118de
audio AND video? no way! 2024-05-25 12:06:50 +02:00
radex 43849b1a98
diagnostics 2024-05-25 00:04:18 +02:00
radex cffe7eefbf
more bits 2024-05-25 00:04:14 +02:00
radex fe46fc625d
fixes 2024-05-24 21:01:34 +02:00
radex 9307c59b3e
pio faster 2024-05-24 20:35:56 +02:00
radex f2a2b931f8
pio poc 2024-05-24 18:01:23 +02:00
radex 76eef53dd0
some pcb review 2024-05-24 17:46:36 +02:00
radex 9182e57b95
MainBoard: fixes, simplify, BOM optimize, DRC fixes, ERC fixes 2024-05-23 11:56:08 +02:00
28 changed files with 11218 additions and 8853 deletions

2
.gitignore vendored
View File

@ -1 +1 @@
badapple.webm
video/

2
firmware/.gitignore vendored
View File

@ -6,5 +6,5 @@
src/gfx_png.h
src/audio_sample.h
gfx/
gfx_output/
video_output/
audio/

View File

@ -1,4 +1,10 @@
convert video
## convert video
```sh
scripts/convert.sh ../badapple.webm
```
or manually:
```
ffmpeg -i ../badapple.webm -vf "fps=30,scale=40:40:force_original_aspect_ratio=increase,crop=40:40,format=gray" gfx/frame_%04d.png

View File

@ -16,7 +16,7 @@ if len(data_in.shape)>1:
print("resampling...")
converter = 'sinc_best' # or 'sinc_fastest', ...
desired_sample_rate = 44000.0
desired_sample_rate = 22000.0
ratio = desired_sample_rate/datasamplerate
data_out = samplerate.resample(data_in, ratio, converter)
@ -58,7 +58,9 @@ normalized = [int((v-minValue)/vrange*255) for v in data_out]
print("writing blob...")
with open("audio/audio.bin", "wb") as f:
os.makedirs("video_output", exist_ok=True)
with open("video_output/audio.bin", "wb") as f:
f.write(bytes(normalized))
print("done!")

15
firmware/scripts/convert.sh Executable file
View File

@ -0,0 +1,15 @@
#!/usr/bin/env bash
set -e
set -x
echo "converting $1"
rm -fr gfx
rm -fr video_output
rm -fr audio
mkdir gfx
ffmpeg -i "$1" -vf "fps=30,scale=40:40:force_original_aspect_ratio=increase,crop=40:40,format=gray" gfx/frame_%04d.png
python3 scripts/gfx_to_blob.py
mkdir audio
ffmpeg -i "$1" -ar 44000 audio/output.wav
python3 scripts/audio_convert.py
open video_output

View File

@ -26,10 +26,10 @@ for (name, path) in gfx_files:
lengths += size.to_bytes(2, byteorder="little")
# create the output directory if it doesn't exist
os.makedirs("gfx_output", exist_ok=True)
os.makedirs("video_output", exist_ok=True)
with open("gfx_output/gfx.bin", "wb") as f:
with open("video_output/gfx.bin", "wb") as f:
f.write(blob)
with open("gfx_output/gfx_len.bin", "wb") as f:
with open("video_output/gfx_len.bin", "wb") as f:
f.write(lengths)

View File

@ -5,8 +5,8 @@
#define AUDIO_PIN 2
#define AUDIO_RATE 44000.0f
#define BUFFER_LEN 512*32
#define AUDIO_RATE 22000.0f
#define BUFFER_LEN 512*2
#define BUFFER_LEN_MS (BUFFER_LEN / AUDIO_RATE) * 1000.0f
extern uint8_t wav_buffer_0[BUFFER_LEN];

View File

@ -3,10 +3,10 @@
#include "lodepng.h"
#include "leds.h"
uint16_t gfxFrameLengthsBuffer[12000] = {0};
uint16_t gfxFrameLengthsBuffer[24000] = {0};
uint16_t frameCount = 0;
uint8_t gfxFrameBuffer[2048] = {0};
uint8_t gfxFrameBuffer[6400] = {0};
bool gfx_decoder_loadNextFrame() {
// load frame from SD card

View File

@ -4,9 +4,9 @@
#include <Arduino.h>
extern uint16_t gfxFrameLengthsBuffer[12000];
extern uint16_t gfxFrameLengthsBuffer[24000];
extern uint16_t frameCount;
extern uint8_t gfxFrameBuffer[2048];
extern uint8_t gfxFrameBuffer[6400];
bool gfx_decoder_loadNextFrame();
bool gfx_decoder_handleLoop();

View File

@ -2,11 +2,22 @@
#include "hardware/gpio.h"
#include "mbed_wait_api.h"
#include "pico/multicore.h"
#include "hardware/pio.h"
#include "leds.h"
#include "leds.pio.h"
PIO pusher_pio = pio0;
uint pusher_sm = 255; // invalid
// NOTE: RCLK, SRCLK capture on *rising* edge
inline void pulsePin(uint8_t pin) {
gpio_put(pin, HIGH);
// there are glitches without this (maybe just due to breadboard...)
_NOP();
_NOP();
_NOP();
// busy_wait_us_32(50);
gpio_put(pin, LOW);
}
@ -20,12 +31,13 @@ inline void outputEnable(uint8_t pin, bool enable) {
gpio_put(pin, !enable);
}
// we have 4-bit color depth, so 16 levels of brightness
// we go from phase 0 to phase 3
// we have COLOR_BITS-bit color depth, so 2^COLOR_BITS levels of brightness
// we go from phase 0 to phase (COLOR_BITS-1)
uint8_t brightnessPhase = 0;
uint8_t brightnessPhaseDelays[] = {1, 10, 30, 100};
uint8_t brightnessPhaseDelays[COLOR_BITS] = {0, 1, 6, 20, 60};
uint8_t framebuffer[ROW_COUNT * COL_COUNT] = {0};
// NOTE: Alignment required to allow 4-byte reads
uint8_t framebuffer[ROW_COUNT * COL_COUNT] __attribute__((aligned(32))) = {0};
void leds_init() {
memset(framebuffer, 0, sizeof(framebuffer));
@ -37,6 +49,7 @@ void leds_init() {
// set up col pins
pinMode(COL_SER, OUTPUT);
pinMode(COL_OE, OUTPUT);
outputEnable(ROW_OE, false);
pinMode(COL_RCLK, OUTPUT);
pinMode(COL_SRCLK, OUTPUT);
pinMode(COL_SRCLR, OUTPUT);
@ -44,6 +57,7 @@ void leds_init() {
// set up row pins
pinMode(ROW_SER, OUTPUT);
pinMode(ROW_OE, OUTPUT);
outputEnable(ROW_OE, false);
pinMode(ROW_RCLK, OUTPUT);
pinMode(ROW_SRCLK, OUTPUT);
pinMode(ROW_SRCLR, OUTPUT);
@ -70,10 +84,10 @@ void main2() {
}
}
void leds_initPusher();
void leds_initRenderer() {
// launch core1
// NOTE: For some reason, without delay, core1 doesn't start?
// delay(500);
leds_initPusher();
multicore_reset_core1();
multicore_launch_core1(main2);
}
@ -86,7 +100,7 @@ void leds_render() {
clearShiftReg(ROW_SRCLK, ROW_SRCLR);
// start selecting rows
digitalWrite(ROW_SER, HIGH);
gpio_put(ROW_SER, HIGH);
for (int yCount = 0; yCount < ROW_COUNT; yCount++) {
int y = ROW_COUNT - 1 - yCount;
@ -94,12 +108,12 @@ void leds_render() {
// we want to keep the matrix on during update (except during latch). At low brightness phases,
// we want it off to actually be dim
bool brightPhase = brightnessPhase >= 2;
// digitalWrite(ROW_OE, !brightPhase);
outputEnable(ROW_OE, brightPhase);
// next row
pulsePin(ROW_SRCLK);
// only one row
digitalWrite(ROW_SER, LOW);
gpio_put(ROW_SER, LOW);
// we use 7/8 stages on shift registers + 1 is unused
int moduleY = yCount % 20;
@ -111,31 +125,54 @@ void leds_render() {
pulsePin(ROW_SRCLK);
}
// clear columns
clearShiftReg(COL_SRCLK, COL_SRCLR);
// set row data
for (int x = 0; x < COL_COUNT; x++) {
// get value
// NOTE: values are loaded right-left
uint8_t pxValue = framebuffer[y * ROW_COUNT + x];
// apply brightness
bool gotLight = (pxValue >> (4 + brightnessPhase)) & 1;
// set value (note: inverted logic)
gpio_put(COL_SER, !gotLight);
// push value
pulsePin(COL_SRCLK);
// NOTE: values are loaded right-left
// Optimized implementation: use PIO, avoid division, modulo, etc...
// we use 7/8 stages of each shift register + 1 is unused so we need to do
// silly shit
// TODO: Some ideas for future optimization:
// - see if we can disable px pusher delays on improved electric interface
// - use a profiler to see how the inner loop can be improved
// - do the shift register bullshit once per frame, so that data can be loaded into
// registers with aligned access, DMA, etc.
// - improve outer loop which adds 2us of processing on each loop
// - change busy wait into some kind of interrupt-based thing so that processing can continue
// - latch row and clock simultaneously, avoid disabling output
uint8_t *buffer = framebuffer + (y * COL_COUNT);
for (int xModule = 0; xModule < COL_MODULES; xModule++) {
uint32_t pxValues;
// we use 7/8 stages on shift registers + 1 is unused
int moduleX = x % 20;
if (moduleX == 0) {
pulsePin(COL_SRCLK);
}
if (moduleX == 6 || moduleX == 13 || moduleX == 19) {
pulsePin(COL_SRCLK);
}
// placeholder at 0; pixels 0, 1, 2
pxValues = *(reinterpret_cast<uint32_t *>(buffer));
pxValues = pxValues << 8;
pio_sm_put_blocking(pusher_pio, pusher_sm, pxValues >> brightnessPhase);
// pixels 3, 4, 5, placeholder at 6
pxValues = *(reinterpret_cast<uint32_t *>(buffer + 3));
pio_sm_put_blocking(pusher_pio, pusher_sm, pxValues >> brightnessPhase);
// pixels 6, 7, 8, 9
pxValues = *(reinterpret_cast<uint32_t *>(buffer + 6));
pio_sm_put_blocking(pusher_pio, pusher_sm, pxValues >> brightnessPhase);
// pixels 10, 11, 12, placeholder at 13
pxValues = *(reinterpret_cast<uint32_t *>(buffer + 10));
pio_sm_put_blocking(pusher_pio, pusher_sm, pxValues >> brightnessPhase);
// pixels 13, 14, 15, 16
pxValues = *(reinterpret_cast<uint32_t *>(buffer + 13));
pio_sm_put_blocking(pusher_pio, pusher_sm, pxValues >> brightnessPhase);
// pixels 17, 18, 19, placeholder
pxValues = *(reinterpret_cast<uint32_t *>(buffer + 17));
pio_sm_put_blocking(pusher_pio, pusher_sm, pxValues >> brightnessPhase);
buffer += 20;
}
// wait for all data to be shifted out
pio_sm_drain_tx_fifo(pusher_pio, pusher_sm);
// disable columns before latch
outputEnable(ROW_OE, false);
@ -150,5 +187,39 @@ void leds_render() {
}
// next brightness phase
brightnessPhase = (brightnessPhase + 1) % 4;
brightnessPhase = (brightnessPhase + 1) % COLOR_BITS;
}
void leds_initPusher() {
PIO pio = pusher_pio;
uint sm = pio_claim_unused_sm(pio, true);
pusher_sm = sm;
uint offset = pio_add_program(pio, &leds_px_pusher_program);
uint dataPin = COL_SER;
uint latchPin = COL_SRCLK;
pio_sm_config config = leds_px_pusher_program_get_default_config(offset);
sm_config_set_clkdiv_int_frac(&config, 2, 0);
// Shift OSR to the right, autopull
sm_config_set_out_shift(&config, true, true, 32);
// Set OUT (data) pin, connect to pad, set as output
sm_config_set_out_pins(&config, dataPin, 1);
pio_gpio_init(pio, dataPin);
pio_sm_set_consecutive_pindirs(pio, sm, dataPin, 1, true);
// data is inverted
gpio_set_outover(dataPin, GPIO_OVERRIDE_INVERT);
// Set SET (latch) pin, connect to pad, set as output
sm_config_set_sideset_pins(&config, latchPin);
pio_gpio_init(pio, latchPin);
pio_sm_set_consecutive_pindirs(pio, sm, latchPin, 1, true);
// Load our configuration, and jump to the start of the program
pio_sm_init(pio, sm, offset, &config);
pio_sm_set_enabled(pio, sm, true);
}

View File

@ -17,8 +17,10 @@
#define ROW_SRCLR 10
#define ROW_COUNT 40
#define COL_COUNT 40
#define COL_MODULES 2
#define COL_COUNT COL_MODULES * 20
#define COLOR_BITS 5
#define FPS 30
#define MS_PER_FRAME 1000 / FPS

9
firmware/src/leds.pio Normal file
View File

@ -0,0 +1,9 @@
.program leds_px_pusher
.side_set 1 opt
.wrap_target
public entry_point:
out null, 3 side 0 [0] ; ignore least significant digits
out pins, 1 ; set bit (shifted for brightness phase by C code)
out null, 4 side 1 [1] ; ignore remaining bits, latch data, allow time for latching
nop side 0 ; return to 0 (weird glitches happen otherwise)
.wrap

43
firmware/src/leds.pio.h Normal file
View File

@ -0,0 +1,43 @@
// -------------------------------------------------- //
// This file is autogenerated by pioasm; do not edit! //
// -------------------------------------------------- //
#pragma once
#if !PICO_NO_HARDWARE
#include "hardware/pio.h"
#endif
// -------------- //
// leds_px_pusher //
// -------------- //
#define leds_px_pusher_wrap_target 0
#define leds_px_pusher_wrap 3
#define leds_px_pusher_offset_entry_point 0u
static const uint16_t leds_px_pusher_program_instructions[] = {
// .wrap_target
0x7063, // 0: out null, 3 side 0
0x6001, // 1: out pins, 1
0x7964, // 2: out null, 4 side 1 [1]
0xb042, // 3: nop side 0
// .wrap
};
#if !PICO_NO_HARDWARE
static const struct pio_program leds_px_pusher_program = {
.instructions = leds_px_pusher_program_instructions,
.length = 4,
.origin = -1,
};
static inline pio_sm_config leds_px_pusher_program_get_default_config(uint offset) {
pio_sm_config c = pio_get_default_sm_config();
sm_config_set_wrap(&c, offset + leds_px_pusher_wrap_target, offset + leds_px_pusher_wrap);
sm_config_set_sideset(&c, 2, true, false);
return c;
}
#endif

View File

@ -5,16 +5,19 @@
#include "leds.h"
#include "gfx_decoder.h"
void loadVideo(size_t index);
void setup() {
leds_init();
setupSDPins();
pinMode(6, INPUT_PULLUP);
pinMode(4, INPUT_PULLUP);
delay(2000);
Serial.begin(115200);
Serial.println("Hello worldd!");
init_audio();
leds_initRenderer();
// while (!isSDCardInserted()) {
// Serial.println("SD card not connected, waiting...");
@ -23,25 +26,37 @@ void setup() {
// delay(100);
setupSD();
sd_loadPlaylist();
sd_loadAudio();
loadVideo(0);
}
if (!sd_loadGfxFrameLengths()) {
size_t currentVideoIndex = 0;
bool isLoaded = false;
void loadVideo(size_t index) {
audio_stop();
sd_loadAudio(index);
if (!sd_loadGfxFrameLengths(index)) {
Serial.println("Failed to load gfx frame lengths");
while (true) {}
}
if (!sd_loadGfxBlob()) {
if (!sd_loadGfxBlob(index)) {
Serial.println("Failed to load gfx blob");
while (true) {}
}
leds_initRenderer();
isLoaded = true;
}
void loop() {
if (digitalRead(6) == LOW) {
sd_loadNextAudio();
if (digitalRead(4) == LOW) {
Serial.println("Next song!");
currentVideoIndex = (currentVideoIndex + 1) % playlistSize;
loadVideo(currentVideoIndex);
}
// if (Serial.available() > 0) {
@ -57,7 +72,11 @@ void loop() {
// }
// }
if (!gfx_decoder_handleLoop()) {
Serial.println("Failed to load frame...");
if (isLoaded) {
sd_loadNextAudio();
if (!gfx_decoder_handleLoop()) {
Serial.println("Failed to load frame...");
}
}
}

View File

@ -44,7 +44,7 @@ void setupSD() {
// printSDConfig();
if (!SD.begin(5000000, PIN_SPI_SS)) {
if (!SD.begin(20000000, PIN_SPI_SS)) {
Serial.println("SD Initialization failed!");
// Serial.print("Error code: ");
// Serial.println(SD.card.errorCode(), HEX);
@ -156,10 +156,83 @@ void printSDStats(RP2040_SdVolume volume) {
Serial.println((float)volumesize / 1024.0);
}
String playlist[128] = {};
size_t playlistSize = 0;
void sd_loadPlaylist() {
auto path = "video/playlist.txt";
if (!SD.exists(path)) {
Serial.println("Could not find playlist for videos :(");
return;
}
auto playlistFile = SD.open(path, FILE_READ);
Serial.println("Playlist file opened");
char playlist_buffer[512];
auto fileSize = playlistFile.size();
if (fileSize > sizeof(playlist_buffer)) {
Serial.print("Playlist file too large, max: ");
Serial.println(sizeof(playlist_buffer));
return;
}
if (playlistFile.read(&playlist_buffer, sizeof(playlist_buffer)) != fileSize) {
Serial.println("Could not read playlist file");
return;
}
playlistFile.close();
Serial.println("Parsing playlist...");
// parse playlist
auto playlistStr = String(playlist_buffer, fileSize);
Serial.println(playlistStr);
auto idx = 0;
while (true) {
auto nextIdx = playlistStr.indexOf('\n', idx);
if (nextIdx == -1) {
break;
}
auto line = playlistStr.substring(idx, nextIdx);
if (line.length() == 0) {
break;
}
if (line.length() > 8) {
Serial.print("Video name too long, size: ");
Serial.print(line.length());
Serial.println(", max 8");
break;
}
playlist[playlistSize++] = line;
idx = nextIdx + 1;
}
Serial.println("Playlist loaded");
for (size_t i = 0; i < playlistSize; i++) {
Serial.print(i);
Serial.print(": ");
Serial.println(playlist[i]);
}
}
File audioFile;
void sd_loadAudio() {
if (!SD.exists("/badapple/audio.bin")) {
void sd_loadAudio(size_t index) {
if (index >= playlistSize) {
Serial.println("Index out of range");
return;
}
auto path = "video/" + playlist[index] + "/audio.bin";
if (!SD.exists(path)) {
Serial.println("Audio not found :(");
return;
}
@ -168,7 +241,7 @@ void sd_loadAudio() {
audioFile.close();
}
audioFile = SD.open("/badapple/audio.bin", FILE_READ);
audioFile = SD.open(path, FILE_READ);
Serial.println("Audio file opened");
audio_stop();
@ -201,16 +274,23 @@ void sd_loadNextAudio() {
Serial.println("End of audio file, rewinding...");
audioFile.seek(0);
} else {
/*
Serial.print("Read ");
Serial.print(bytesRead);
Serial.print(" bytes from audio file in ");
Serial.print(millis() - b4);
Serial.println("ms");
*/
}
}
bool sd_loadGfxFrameLengths() {
auto path = "badapple/gfx_len.bin";
bool sd_loadGfxFrameLengths(size_t index) {
if (index >= playlistSize) {
Serial.println("Index out of range");
return false;
}
auto path = "video/" + playlist[index] + "/gfx_len.bin";
if (!SD.exists(path)) {
Serial.println("Frame lengths file not found :(");
@ -241,8 +321,13 @@ File gfxFile;
uint16_t frameIdx = 0;
bool sd_loadGfxBlob() {
auto path = "badapple/gfx.bin";
bool sd_loadGfxBlob(size_t index) {
if (index >= playlistSize) {
Serial.println("Index out of range");
return false;
}
auto path = "video/" + playlist[index] + "/gfx.bin";
if (!SD.exists(path)) {
Serial.println("Gfx blob file not found :(");
@ -252,11 +337,16 @@ bool sd_loadGfxBlob() {
gfxFile = SD.open(path, FILE_READ);
Serial.println("Opened video frames");
frameIdx = 0;
return true;
}
// Returns size of frame read or -1 if error
int32_t sd_loadNextFrame() {
if (frameIdx > 0) {
// return -1;
}
if (!gfxFile || !gfxFile.available()) {
Serial.println("Gfx file not available");
return -1;
@ -270,7 +360,8 @@ int32_t sd_loadNextFrame() {
// get size of frame png
auto frameSize = gfxFrameLengthsBuffer[frameIdx];
if (frameSize > sizeof(gfxFrameBuffer)) {
Serial.println("Frame too large");
Serial.print("Frame too large: ");
Serial.println(frameSize);
return -1;
}

View File

@ -5,8 +5,11 @@ void setupSD();
bool isSDCardInserted();
void sd_loadAudio();
extern size_t playlistSize;
void sd_loadPlaylist();
void sd_loadAudio(size_t index);
void sd_loadNextAudio();
bool sd_loadGfxFrameLengths();
bool sd_loadGfxBlob();
bool sd_loadGfxFrameLengths(size_t index);
bool sd_loadGfxBlob(size_t index);
int32_t sd_loadNextFrame();

View File

@ -8,3 +8,5 @@ DET MISO CLK MOSI DAT2
D2 D3/CS CMD/MOSI VSS1 VDD CLK VSS2 D0/MISO D1
x 17 19 x x 18 x 16 x

File diff suppressed because it is too large Load Diff

View File

@ -38,8 +38,8 @@
"other_text_upright": false,
"pads": {
"drill": 0.0,
"height": 1.0,
"width": 1.525
"height": 2.5,
"width": 4.4
},
"silk_line_width": 0.09999999999999999,
"silk_text_italic": false,
@ -48,7 +48,7 @@
"silk_text_thickness": 0.09999999999999999,
"silk_text_upright": false,
"zones": {
"min_clearance": 0.25
"min_clearance": 0.3
}
},
"diff_pair_dimensions": [
@ -130,7 +130,7 @@
"min_track_width": 0.125,
"min_via_annular_width": 0.049999999999999996,
"min_via_diameter": 0.6,
"solder_mask_to_copper_clearance": 0.0,
"solder_mask_to_copper_clearance": 0.005,
"use_height_for_length_calcs": true
},
"teardrop_options": [
@ -702,23 +702,29 @@
"show": false
},
{
"group_by": false,
"group_by": true,
"label": "LCSC",
"name": "LCSC",
"show": false
"show": true
},
{
"group_by": false,
"label": "Description",
"name": "Description",
"show": false
},
{
"group_by": false,
"label": "EXCLUDE_FROM_BOM",
"name": "${EXCLUDE_FROM_BOM}",
"show": true
}
],
"filter_string": "",
"group_symbols": true,
"name": "",
"sort_asc": true,
"sort_field": "Reference"
"sort_field": "Value"
},
"connection_grid_size": 50.0,
"drawing": {
@ -749,7 +755,7 @@
},
"net_format_name": "",
"page_layout_descr_file": "",
"plot_directory": "",
"plot_directory": "/Users/radex/Downloads/",
"spice_current_sheet_as_root": false,
"spice_external_command": "spice \"%I\"",
"spice_model_current_sheet_as_root": true,

File diff suppressed because it is too large Load Diff

View File

@ -923,7 +923,7 @@
(at 140.97 49.53 180)
(unit 1)
(exclude_from_sim no)
(in_bom yes)
(in_bom no)
(on_board yes)
(dnp no)
(uuid "21ebb72f-9bad-4d6e-b046-8bb788495541")
@ -1267,7 +1267,7 @@
(hide yes)
)
)
(property "LCSC" "C307331"
(property "LCSC" "C1525"
(at 69.85 54.61 0)
(effects
(font

View File

@ -1922,7 +1922,7 @@
(hide yes)
)
)
(property "LCSC" "C307331"
(property "LCSC" "C1525"
(at 148.59 58.42 0)
(effects
(font

View File

@ -1129,13 +1129,13 @@
)
(wire
(pts
(xy 52.07 62.23) (xy 101.6 62.23)
(xy 52.07 69.85) (xy 82.55 69.85)
)
(stroke
(width 0)
(type default)
)
(uuid "437eac0c-7510-4dbd-bc44-8d54a0f87458")
(uuid "47768312-1e06-444e-a205-60ca70975c44")
)
(wire
(pts
@ -1167,6 +1167,16 @@
)
(uuid "56b27960-7c4c-4441-8725-b46d5b62efd2")
)
(wire
(pts
(xy 52.07 64.77) (xy 91.44 64.77)
)
(stroke
(width 0)
(type default)
)
(uuid "58d4c71f-4f85-4b21-972d-17afca94db00")
)
(wire
(pts
(xy 152.4 92.71) (xy 153.67 92.71)
@ -1189,13 +1199,13 @@
)
(wire
(pts
(xy 52.07 64.77) (xy 91.44 64.77)
(xy 52.07 62.23) (xy 101.6 62.23)
)
(stroke
(width 0)
(type default)
)
(uuid "5f401f97-217c-4ae4-b27a-271dcdd4ea21")
(uuid "60f14a36-0c94-4bb4-83b2-59f788ff8525")
)
(wire
(pts
@ -1277,16 +1287,6 @@
)
(uuid "857df60f-a77e-4248-87a5-094a84616c50")
)
(wire
(pts
(xy 52.07 69.85) (xy 82.55 69.85)
)
(stroke
(width 0)
(type default)
)
(uuid "87dc611b-d857-4b03-a783-71eac35ab9f9")
)
(wire
(pts
(xy 44.45 74.93) (xy 43.18 74.93)
@ -1655,7 +1655,7 @@
(uuid "1887344f-ff5e-43a1-9a9d-f5e24e43518b")
)
(label "SD_CLK"
(at 59.69 69.85 0)
(at 60.96 69.85 0)
(fields_autoplaced yes)
(effects
(font
@ -1666,7 +1666,7 @@
(uuid "25487422-3555-45ec-b5ef-336143b4a444")
)
(label "SD_CS_DAT3"
(at 59.69 62.23 0)
(at 60.96 62.23 0)
(fields_autoplaced yes)
(effects
(font
@ -1688,7 +1688,7 @@
(uuid "88d4e665-6450-45d8-b61e-ee0ef714a380")
)
(label "SD_MOSI_CMD"
(at 59.69 64.77 0)
(at 60.96 64.77 0)
(fields_autoplaced yes)
(effects
(font
@ -1699,7 +1699,7 @@
(uuid "bb4d3927-b49a-42cb-b88c-8342c70f3acb")
)
(label "SD_MISO_DAT0"
(at 59.69 74.93 0)
(at 60.96 74.93 0)
(fields_autoplaced yes)
(effects
(font
@ -1956,7 +1956,7 @@
(hide yes)
)
)
(property "LCSC" ""
(property "LCSC" "C25819"
(at 91.44 101.6 0)
(effects
(font
@ -2114,7 +2114,7 @@
(hide yes)
)
)
(property "LCSC" ""
(property "LCSC" "C25819"
(at 110.49 54.61 0)
(effects
(font
@ -2325,7 +2325,7 @@
(hide yes)
)
)
(property "LCSC" ""
(property "LCSC" "C25819"
(at 73.66 54.61 0)
(effects
(font
@ -2404,7 +2404,7 @@
(hide yes)
)
)
(property "LCSC" ""
(property "LCSC" "C25819"
(at 73.66 101.6 0)
(effects
(font
@ -2549,7 +2549,7 @@
(hide yes)
)
)
(property "LCSC" ""
(property "LCSC" "C25819"
(at 110.49 101.6 0)
(effects
(font
@ -2628,7 +2628,7 @@
(hide yes)
)
)
(property "LCSC" ""
(property "LCSC" "C25819"
(at 64.77 54.61 0)
(effects
(font
@ -2915,7 +2915,7 @@
(hide yes)
)
)
(property "LCSC" ""
(property "LCSC" "C25819"
(at 91.44 54.61 0)
(effects
(font
@ -3086,7 +3086,7 @@
(at 140.97 50.8 0)
(unit 1)
(exclude_from_sim no)
(in_bom yes)
(in_bom no)
(on_board yes)
(dnp no)
(fields_autoplaced yes)
@ -3248,7 +3248,7 @@
(hide yes)
)
)
(property "LCSC" ""
(property "LCSC" "C25819"
(at 101.6 54.61 0)
(effects
(font
@ -3393,7 +3393,7 @@
(hide yes)
)
)
(property "LCSC" ""
(property "LCSC" "C25819"
(at 82.55 101.6 0)
(effects
(font
@ -3472,7 +3472,7 @@
(hide yes)
)
)
(property "LCSC" "C307331"
(property "LCSC" "C1525"
(at 124.46 40.64 0)
(effects
(font
@ -3627,7 +3627,7 @@
(hide yes)
)
)
(property "LCSC" ""
(property "LCSC" "C25819"
(at 64.77 101.6 0)
(effects
(font
@ -3772,7 +3772,7 @@
(hide yes)
)
)
(property "LCSC" ""
(property "LCSC" "C25819"
(at 101.6 101.6 0)
(effects
(font
@ -4115,7 +4115,7 @@
(hide yes)
)
)
(property "LCSC" ""
(property "LCSC" "C25819"
(at 82.55 54.61 0)
(effects
(font

View File

@ -4540,7 +4540,7 @@
(at 199.39 109.22 90)
(unit 1)
(exclude_from_sim no)
(in_bom yes)
(in_bom no)
(on_board yes)
(dnp no)
(uuid "0f83fadf-1e51-432c-a89b-ce291955ebd0")
@ -4807,7 +4807,7 @@
(justify left)
)
)
(property "Value" "4k7"
(property "Value" "5k1"
(at 91.44 96.5199 0)
(effects
(font
@ -4843,7 +4843,7 @@
(hide yes)
)
)
(property "LCSC" "C25900"
(property "LCSC" "C25905"
(at 93.98 95.25 0)
(effects
(font
@ -4872,7 +4872,7 @@
(at 194.31 26.67 0)
(unit 1)
(exclude_from_sim no)
(in_bom yes)
(in_bom no)
(on_board yes)
(dnp no)
(uuid "151afb0f-6dfe-4eaf-b194-7185e00b56e0")
@ -5022,7 +5022,7 @@
(mirror y)
(unit 1)
(exclude_from_sim no)
(in_bom yes)
(in_bom no)
(on_board yes)
(dnp no)
(uuid "1ad26535-4c52-4c91-a735-6617cbeb855e")
@ -5166,7 +5166,7 @@
(mirror x)
(unit 1)
(exclude_from_sim no)
(in_bom yes)
(in_bom no)
(on_board yes)
(dnp no)
(uuid "1b7ea449-5e4e-44a5-bc59-da7c6c6e6adc")
@ -5374,7 +5374,7 @@
(mirror y)
(unit 1)
(exclude_from_sim no)
(in_bom yes)
(in_bom no)
(on_board yes)
(dnp no)
(uuid "2620afc3-0c77-4853-8a77-28935611e02d")
@ -5453,7 +5453,7 @@
(justify left)
)
)
(property "Value" "4k7"
(property "Value" "5k1"
(at 161.29 88.8999 0)
(effects
(font
@ -5489,7 +5489,7 @@
(hide yes)
)
)
(property "LCSC" "C25900"
(property "LCSC" "C25905"
(at 163.83 87.63 0)
(effects
(font
@ -5963,7 +5963,7 @@
(mirror y)
(unit 1)
(exclude_from_sim no)
(in_bom yes)
(in_bom no)
(on_board yes)
(dnp no)
(uuid "3cd7d842-911c-4ebf-828e-8f8336e0d79e")
@ -6029,7 +6029,7 @@
(mirror y)
(unit 1)
(exclude_from_sim no)
(in_bom yes)
(in_bom no)
(on_board yes)
(dnp no)
(uuid "3e4542d1-2402-4a8e-ae13-06c9f2a7381f")
@ -6617,7 +6617,7 @@
(at 102.87 107.95 90)
(unit 1)
(exclude_from_sim no)
(in_bom yes)
(in_bom no)
(on_board yes)
(dnp no)
(uuid "4309b47b-37c9-48cc-9038-fb71ef7c9750")
@ -6925,7 +6925,7 @@
(mirror y)
(unit 1)
(exclude_from_sim no)
(in_bom yes)
(in_bom no)
(on_board yes)
(dnp no)
(uuid "4ce6fc1e-dcdd-401e-8980-6b45ba729b80")
@ -7436,7 +7436,7 @@
(mirror x)
(unit 1)
(exclude_from_sim no)
(in_bom yes)
(in_bom no)
(on_board yes)
(dnp no)
(uuid "61ee6ce8-de51-4d18-ad41-4ceb81f80cd6")
@ -7515,7 +7515,7 @@
(justify left)
)
)
(property "Value" "4k7"
(property "Value" "5k1"
(at 161.29 132.0799 0)
(effects
(font
@ -7551,7 +7551,7 @@
(hide yes)
)
)
(property "LCSC" "C25900"
(property "LCSC" "C25905"
(at 163.83 130.81 0)
(effects
(font
@ -7660,7 +7660,7 @@
(mirror x)
(unit 1)
(exclude_from_sim no)
(in_bom yes)
(in_bom no)
(on_board yes)
(dnp no)
(uuid "65b9f56a-6cb1-4895-b6fe-5da284540dad")
@ -7791,7 +7791,7 @@
(at 102.87 182.88 90)
(unit 1)
(exclude_from_sim no)
(in_bom yes)
(in_bom no)
(on_board yes)
(dnp no)
(uuid "68ec9784-9f89-4f2f-977f-ad694de9f355")
@ -7995,7 +7995,7 @@
(mirror x)
(unit 1)
(exclude_from_sim no)
(in_bom yes)
(in_bom no)
(on_board yes)
(dnp no)
(uuid "72279322-259c-4d78-99e5-35a8475cab70")
@ -8061,7 +8061,7 @@
(mirror y)
(unit 1)
(exclude_from_sim no)
(in_bom yes)
(in_bom no)
(on_board yes)
(dnp no)
(uuid "740c4531-a711-4de7-957e-10229cc7283b")
@ -8259,7 +8259,7 @@
(mirror y)
(unit 1)
(exclude_from_sim no)
(in_bom yes)
(in_bom no)
(on_board yes)
(dnp no)
(uuid "798258a5-3873-4feb-82a7-dbfa9088b285")
@ -8403,7 +8403,7 @@
(mirror x)
(unit 1)
(exclude_from_sim no)
(in_bom yes)
(in_bom no)
(on_board yes)
(dnp no)
(uuid "7f9bb2fa-9c55-4fb7-a430-4543cac3181f")
@ -8468,7 +8468,7 @@
(at 199.39 152.4 90)
(unit 1)
(exclude_from_sim no)
(in_bom yes)
(in_bom no)
(on_board yes)
(dnp no)
(uuid "80362fd0-55e4-4895-b629-df6bc6564595")
@ -8777,7 +8777,7 @@
(justify left)
)
)
(property "Value" "4k7"
(property "Value" "5k1"
(at 180.34 109.2199 0)
(effects
(font
@ -8813,7 +8813,7 @@
(hide yes)
)
)
(property "LCSC" "C25900"
(property "LCSC" "C25905"
(at 182.88 107.95 0)
(effects
(font
@ -8843,7 +8843,7 @@
(mirror x)
(unit 1)
(exclude_from_sim no)
(in_bom yes)
(in_bom no)
(on_board yes)
(dnp no)
(uuid "92167c05-714c-40c4-8dcf-4b7c7b4fedcd")
@ -8922,7 +8922,7 @@
(justify left)
)
)
(property "Value" "4k7"
(property "Value" "5k1"
(at 180.34 152.3999 0)
(effects
(font
@ -8958,7 +8958,7 @@
(hide yes)
)
)
(property "LCSC" "C25900"
(property "LCSC" "C25905"
(at 182.88 151.13 0)
(effects
(font
@ -9055,7 +9055,7 @@
(mirror y)
(unit 1)
(exclude_from_sim no)
(in_bom yes)
(in_bom no)
(on_board yes)
(dnp no)
(uuid "98315fca-dfd5-4db8-b52e-38c99d6cb06f")
@ -9134,7 +9134,7 @@
(justify left)
)
)
(property "Value" "4k7"
(property "Value" "5k1"
(at 91.44 171.4499 0)
(effects
(font
@ -9170,7 +9170,7 @@
(hide yes)
)
)
(property "LCSC" "C25900"
(property "LCSC" "C25905"
(at 93.98 170.18 0)
(effects
(font
@ -9199,7 +9199,7 @@
(at 199.39 143.51 0)
(unit 1)
(exclude_from_sim no)
(in_bom yes)
(in_bom no)
(on_board yes)
(dnp no)
(uuid "9bcc504d-56e7-4f80-8fa0-b31d6126a24a")
@ -9350,7 +9350,7 @@
(mirror x)
(unit 1)
(exclude_from_sim no)
(in_bom yes)
(in_bom no)
(on_board yes)
(dnp no)
(uuid "a0360854-89e8-470a-a0ff-828765fcfd5e")
@ -9664,7 +9664,7 @@
(justify left)
)
)
(property "Value" "4k7"
(property "Value" "5k1"
(at 91.44 134.6199 0)
(effects
(font
@ -9700,7 +9700,7 @@
(hide yes)
)
)
(property "LCSC" "C25900"
(property "LCSC" "C25905"
(at 93.98 133.35 0)
(effects
(font
@ -9863,7 +9863,7 @@
(mirror y)
(unit 1)
(exclude_from_sim no)
(in_bom yes)
(in_bom no)
(on_board yes)
(dnp no)
(uuid "c2336358-357b-4d18-ba02-f5188911a579")
@ -10348,7 +10348,7 @@
(at 58.42 49.53 0)
(unit 1)
(exclude_from_sim no)
(in_bom yes)
(in_bom no)
(on_board yes)
(dnp no)
(uuid "cb9469c7-49ac-4ac3-9c9d-70a8430c8f4b")
@ -10487,7 +10487,7 @@
(mirror x)
(unit 1)
(exclude_from_sim no)
(in_bom yes)
(in_bom no)
(on_board yes)
(dnp no)
(uuid "d1fe5164-6ef9-4d1e-a148-00c82e5f39b0")
@ -10912,7 +10912,7 @@
(mirror y)
(unit 1)
(exclude_from_sim no)
(in_bom yes)
(in_bom no)
(on_board yes)
(dnp no)
(uuid "dfc2795d-9380-4759-b5a0-b2efcdda606c")
@ -11396,7 +11396,7 @@
(at 199.39 100.33 0)
(unit 1)
(exclude_from_sim no)
(in_bom yes)
(in_bom no)
(on_board yes)
(dnp no)
(uuid "f014e65a-fe42-4ab5-9f00-5c9ad2827d0a")
@ -11810,7 +11810,7 @@
(mirror x)
(unit 1)
(exclude_from_sim no)
(in_bom yes)
(in_bom no)
(on_board yes)
(dnp no)
(uuid "f7fea151-c1a5-4464-837b-c27b85ace62d")
@ -11875,7 +11875,7 @@
(at 102.87 146.05 90)
(unit 1)
(exclude_from_sim no)
(in_bom yes)
(in_bom no)
(on_board yes)
(dnp no)
(uuid "f87cb37e-4555-48f2-ae56-bc76d5fa3a11")
@ -12025,7 +12025,7 @@
(mirror x)
(unit 1)
(exclude_from_sim no)
(in_bom yes)
(in_bom no)
(on_board yes)
(dnp no)
(uuid "fade1ce4-f6a0-4812-854f-bea36424ff1f")

File diff suppressed because it is too large Load Diff

View File

@ -956,25 +956,23 @@
(exclude_from_sim no)
(in_bom yes)
(on_board yes)
(property "Reference" "U"
(at 21.844 51.054 0)
(property "Reference" "U401"
(at 24.638 -37.846 0)
(effects
(font
(size 1.27 1.27)
)
(justify left bottom)
)
)
(property "Value" "RP2040"
(at 21.844 48.514 0)
(at 24.638 -40.386 0)
(effects
(font
(size 1.27 1.27)
)
(justify left bottom)
)
)
(property "Footprint" "RadPie2040:RP2040-QFN-56"
(property "Footprint" "led-matrix:RP2040-QFN-56"
(at -20.32 62.23 0)
(effects
(font
@ -1003,6 +1001,15 @@
(hide yes)
)
)
(property "LCSC" "C2040"
(at 0 0 0)
(effects
(font
(size 1.27 1.27)
)
(hide yes)
)
)
(property "ki_keywords" "raspberry pi 2040"
(at 0 0 0)
(effects
@ -2034,7 +2041,7 @@
)
)
)
(pin input line
(pin bidirectional line
(at 31.75 25.4 180)
(length 2.54)
(name "GPIO7"
@ -2581,6 +2588,16 @@
)
(uuid "134875fd-cbbf-4a93-bddf-ff91636ccab7")
)
(wire
(pts
(xy 119.38 68.58) (xy 124.46 68.58)
)
(stroke
(width 0)
(type default)
)
(uuid "144f2eba-d364-4da6-9a51-ead7c6ab389e")
)
(wire
(pts
(xy 86.36 40.64) (xy 87.63 40.64)
@ -3421,16 +3438,6 @@
)
(uuid "9c790027-6407-4beb-8582-66399703cae5")
)
(wire
(pts
(xy 119.38 68.58) (xy 124.46 68.58)
)
(stroke
(width 0)
(type default)
)
(uuid "9d3342ef-dc9d-48c4-93ec-04efae6c26da")
)
(wire
(pts
(xy 119.38 86.36) (xy 124.46 86.36)
@ -4867,7 +4874,7 @@
(justify left)
)
)
(property "Value" "100nF"
(property "Value" "100n"
(at 68.58 27.9399 0)
(effects
(font
@ -5214,7 +5221,7 @@
(justify left)
)
)
(property "Value" "100nF"
(property "Value" "100n"
(at 41.91 27.9399 0)
(effects
(font
@ -5361,7 +5368,7 @@
(justify right)
)
)
(property "Value" "100nF"
(property "Value" "100n"
(at 67.31 162.5535 0)
(effects
(font
@ -5640,7 +5647,7 @@
(justify left)
)
)
(property "Value" "22uF"
(property "Value" "22u"
(at 161.29 30.4799 0)
(effects
(font
@ -5649,7 +5656,7 @@
(justify left)
)
)
(property "Footprint" "Capacitor_SMD:C_1206_3216Metric"
(property "Footprint" "Capacitor_SMD:C_0805_2012Metric"
(at 158.4452 33.02 0)
(effects
(font
@ -5676,7 +5683,7 @@
(hide yes)
)
)
(property "LCSC" "C12891"
(property "LCSC" "C45783"
(at 157.48 29.21 0)
(effects
(font
@ -5796,7 +5803,7 @@
)
)
)
(property "Value" "33pF"
(property "Value" "33p"
(at 33.02 81.28 90)
(effects
(font
@ -5873,7 +5880,7 @@
(justify left)
)
)
(property "Value" "1uF"
(property "Value" "1u"
(at 68.326 37.084 0)
(effects
(font
@ -5951,7 +5958,7 @@
(justify left)
)
)
(property "Value" "100nF"
(property "Value" "100n"
(at 50.8 27.9399 0)
(effects
(font
@ -6029,7 +6036,7 @@
(justify left)
)
)
(property "Value" "100nF"
(property "Value" "100n"
(at 59.69 27.9399 0)
(effects
(font
@ -6094,7 +6101,7 @@
(at 87.63 93.98 0)
(unit 1)
(exclude_from_sim no)
(in_bom yes)
(in_bom no)
(on_board yes)
(dnp no)
(uuid "5be3e4d7-906b-4b09-ac25-5acb7552cad5")
@ -6626,7 +6633,7 @@
(justify left)
)
)
(property "Value" "1uF"
(property "Value" "1u"
(at 40.132 60.452 0)
(effects
(font
@ -6999,7 +7006,7 @@
)
)
)
(property "Value" "33pF"
(property "Value" "33p"
(at 33.02 87.63 90)
(effects
(font
@ -7077,7 +7084,7 @@
(justify left)
)
)
(property "Value" "1uF"
(property "Value" "1u"
(at 124.46 35.5601 0)
(effects
(font
@ -7156,7 +7163,7 @@
(justify left)
)
)
(property "Value" "100nF"
(property "Value" "100n"
(at 133.35 30.4799 0)
(effects
(font
@ -7386,7 +7393,7 @@
(justify left)
)
)
(property "Value" "100nF"
(property "Value" "100n"
(at 33.02 27.9399 0)
(effects
(font
@ -7755,7 +7762,7 @@
(justify left)
)
)
(property "Value" "100nF"
(property "Value" "100n"
(at 24.13 27.9399 0)
(effects
(font
@ -7833,7 +7840,7 @@
(justify left)
)
)
(property "Value" "100nF"
(property "Value" "100n"
(at 77.47 27.9399 0)
(effects
(font
@ -7911,7 +7918,7 @@
(justify left)
)
)
(property "Value" "100nF"
(property "Value" "100n"
(at 102.87 27.9399 0)
(effects
(font
@ -8058,7 +8065,7 @@
(justify left)
)
)
(property "Value" "100nF"
(property "Value" "100n"
(at 124.46 30.4799 0)
(effects
(font

View File

@ -2141,7 +2141,7 @@
(at 27.94 45.72 0)
(unit 1)
(exclude_from_sim no)
(in_bom yes)
(in_bom no)
(on_board yes)
(dnp no)
(uuid "63e09765-1daf-4b3d-9b73-b05d09450a1f")

BIN
text.pxm

Binary file not shown.