Added PAA secret sauce

This commit is contained in:
ZodiusInfuser 2021-06-15 16:30:37 +01:00
parent f86e72ea70
commit a778a1f6e9
9 changed files with 298 additions and 4 deletions

View File

@ -313,7 +313,7 @@ namespace pimoroni {
if(c1 > 28)
c1 += 11;
c1 = std::max((uint8_t)0, std::min((uint8_t)0x3F, c1));
c2 = (c2 * 45); // 100
c2 = (c2 * 45) / 100;
uint8_t buf3[] = {
0x7f, 0x00,
@ -423,4 +423,165 @@ namespace pimoroni {
uint32_t PMW3901::millis() {
return to_ms_since_boot(get_absolute_time());
}
void PAA5100::secret_sauce() {
uint8_t buf[] = {
0x7f, 0x00,
0x55, 0x01,
0x50, 0x07,
0x7f, 0x0e,
0x43, 0x10
};
write_buffer(buf, sizeof(buf));
if(read_register(0x67) & 0b10000000)
write_register(0x48, 0x04);
else
write_register(0x48, 0x02);
uint8_t buf2[] = {
0x7f, 0x00,
0x51, 0x7b,
0x50, 0x00,
0x55, 0x00,
0x7f, 0x0E
};
write_buffer(buf2, sizeof(buf2));
if(read_register(0x73) == 0x00) {
uint8_t c1 = read_register(0x70);
uint8_t c2 = read_register(0x71);
if(c1 <= 28)
c1 += 14;
if(c1 > 28)
c1 += 11;
c1 = std::max((uint8_t)0, std::min((uint8_t)0x3F, c1));
c2 = (c2 * 45) / 100;
uint8_t buf3[] = {
0x7f, 0x00,
0x61, 0xad,
0x51, 0x70,
0x7f, 0x0e
};
write_buffer(buf3, sizeof(buf3));
write_register(0x70, c1);
write_register(0x71, c2);
}
uint8_t buf4[] = {
0x7f, 0x00,
0x61, 0xad,
0x7f, 0x03,
0x40, 0x00,
0x7f, 0x05,
0x41, 0xb3,
0x43, 0xf1,
0x45, 0x14,
0x5f, 0x34,
0x7b, 0x08,
0x5e, 0x34,
0x5b, 0x11,
0x6d, 0x11,
0x45, 0x17,
0x70, 0xe5,
0x71, 0xe5,
0x7f, 0x06,
0x44, 0x1b,
0x40, 0xbf,
0x4e, 0x3f,
0x7f, 0x08,
0x66, 0x44,
0x65, 0x20,
0x6a, 0x3a,
0x61, 0x05,
0x62, 0x05,
0x7f, 0x09,
0x4f, 0xaf,
0x5f, 0x40,
0x48, 0x80,
0x49, 0x80,
0x57, 0x77,
0x60, 0x78,
0x61, 0x78,
0x62, 0x08,
0x63, 0x50,
0x7f, 0x0a,
0x45, 0x60,
0x7f, 0x00,
0x4d, 0x11,
0x55, 0x80,
0x74, 0x21,
0x75, 0x1f,
0x4a, 0x78,
0x4b, 0x78,
0x44, 0x08,
0x45, 0x50,
0x64, 0xff,
0x65, 0x1f,
0x7f, 0x14,
0x65, 0x67,
0x66, 0x08,
0x63, 0x70,
0x6f, 0x1c,
0x7f, 0x15,
0x48, 0x48,
0x7f, 0x07,
0x41, 0x0d,
0x43, 0x14,
0x4b, 0x0e,
0x45, 0x0f,
0x44, 0x42,
0x4c, 0x80,
0x7f, 0x10,
0x5b, 0x02,
0x7f, 0x07,
0x40, 0x41,
WAIT, 0x0a, // Sleep for 10ms
0x7f, 0x00,
0x32, 0x00,
0x7f, 0x07,
0x40, 0x40,
0x7f, 0x06,
0x68, 0xf0,
0x69, 0x00,
0x7f, 0x0d,
0x48, 0xc0,
0x6f, 0xd5,
0x7f, 0x00,
0x5b, 0xa0,
0x4e, 0xa8,
0x5a, 0x90,
0x40, 0x80,
0x73, 0x1f,
WAIT, 0x0a, // Sleep for 10ms
0x73, 0x00
};
write_buffer(buf4, sizeof(buf4));
}
}

View File

@ -15,7 +15,7 @@ namespace pimoroni {
public:
static const uint8_t FRAME_SIZE = 35;
static const uint16_t RAW_DATA_LEN = 1225;
private:
protected:
static const uint8_t WAIT = -1;
//--------------------------------------------------
@ -93,7 +93,6 @@ namespace pimoroni {
protected:
virtual void secret_sauce();
private:
void cs_select();
void cs_deselect();
void write_register(uint8_t reg, uint8_t data);
@ -103,4 +102,8 @@ namespace pimoroni {
uint32_t millis();
};
class PAA5100 : public PMW3901 {
protected:
virtual void secret_sauce();
};
}

View File

@ -7,6 +7,7 @@ add_subdirectory(breakout_roundlcd)
add_subdirectory(breakout_rgbmatrix5x5)
add_subdirectory(breakout_matrix11x7)
add_subdirectory(breakout_mics6814)
add_subdirectory(breakout_paa5100)
add_subdirectory(breakout_pmw3901)
add_subdirectory(breakout_potentiometer)
add_subdirectory(breakout_rtc)

View File

@ -0,0 +1,2 @@
add_subdirectory(motion)
add_subdirectory(frame_capture)

View File

@ -0,0 +1,16 @@
set(OUTPUT_NAME paa5100_framecapture)
add_executable(
${OUTPUT_NAME}
frame_capture.cpp
)
# enable usb output, disable uart output
pico_enable_stdio_usb(${OUTPUT_NAME} 1)
pico_enable_stdio_uart(${OUTPUT_NAME} 1)
# Pull in pico libraries that we need
target_link_libraries(${OUTPUT_NAME} pico_stdlib breakout_paa5100)
# create map/bin/hex file etc.
pico_add_extra_outputs(${OUTPUT_NAME})

View File

@ -0,0 +1,70 @@
#include <stdio.h>
#include "pico/stdlib.h"
#include <string>
#include "breakout_paa5100.hpp"
using namespace pimoroni;
BreakoutPAA5100 flo(BG_SPI_FRONT);
BreakoutPAA5100::Degrees rotation = BreakoutPAA5100::DEGREES_0;
const uint8_t SIZE = BreakoutPAA5100::FRAME_SIZE;
uint8_t data[BreakoutPAA5100::RAW_DATA_LEN];
std::string value_to_char(uint8_t value) {
const std::string charmap = " .:-=+*#%@";
float val = (float)value / 255.0f;
val *= charmap.length() - 1;
value = (uint8_t)val;
std::string chosen_char = charmap.substr(val, 1);
return chosen_char.append(chosen_char); // Double chars to - sort of - correct aspect ratio
}
int main() {
stdio_init_all();
flo.init();
flo.set_rotation(rotation);
uint8_t offset = 0;
uint8_t value = 0;
while(true) {
printf("Capturing...\n");
uint16_t data_size = 0;
if(flo.frame_capture(data, data_size)) {
for(uint8_t y = 0; y < SIZE; y++) {
if(rotation == BreakoutPAA5100::DEGREES_180 || rotation == BreakoutPAA5100::DEGREES_270)
y = SIZE - y - 1;
for(uint8_t x = 0; x < SIZE; x++) {
if(rotation == BreakoutPAA5100::DEGREES_180 || rotation == BreakoutPAA5100::DEGREES_90)
x = SIZE - x - 1;
if(rotation == BreakoutPAA5100::DEGREES_90 || rotation == BreakoutPAA5100::DEGREES_270)
offset = (x * 35) + y;
else
offset = (y * 35) + x;
value = data[offset];
printf("%s", value_to_char(value).c_str());
}
printf("\n");
}
}
else {
printf("Capture failed. %d bytes received, of %d. Recapturing in ", data_size, BreakoutPAA5100::RAW_DATA_LEN);
}
printf("5...\n");
sleep_ms(1000);
printf("4...\n");
sleep_ms(1000);
printf("3...\n");
sleep_ms(1000);
printf("2...\n");
sleep_ms(1000);
printf("Get Ready!\n");
sleep_ms(1000);
};
return 0;
}

View File

@ -0,0 +1,16 @@
set(OUTPUT_NAME paa5100_motion)
add_executable(
${OUTPUT_NAME}
motion.cpp
)
# enable usb output, disable uart output
pico_enable_stdio_usb(${OUTPUT_NAME} 1)
pico_enable_stdio_uart(${OUTPUT_NAME} 1)
# Pull in pico libraries that we need
target_link_libraries(${OUTPUT_NAME} pico_stdlib breakout_paa5100)
# create map/bin/hex file etc.
pico_add_extra_outputs(${OUTPUT_NAME})

View File

@ -0,0 +1,26 @@
#include <stdio.h>
#include "pico/stdlib.h"
#include "breakout_paa5100.hpp"
using namespace pimoroni;
BreakoutPAA5100 flo(BG_SPI_FRONT);
int main() {
stdio_init_all();
flo.init();
flo.set_rotation(BreakoutPAA5100::DEGREES_0);
int16_t tx = 0, ty = 0;
int16_t x = 0, y = 0;
while(true) {
if(flo.get_motion(x, y)) {
tx += x;
ty += y;
printf("Relative: x %6d, y %6d | Absolute: tx %6d, ty %6d\n", x, y, tx, ty);
}
sleep_ms(10);
};
return 0;
}

View File

@ -1,6 +1,5 @@
#include <stdio.h>
#include "pico/stdlib.h"
#include <wchar.h>
#include <string>
#include "breakout_pmw3901.hpp"