Lepton sensor on the DISCO-F746NG board. Based on the rapberry_pi example code at https://github.com/groupgets/LeptonModule
Dependencies: mbed-src BSP_DISCO_F746NG LCD_DISCO_F746NG
main.cpp@4:15c97a3e1995, 2015-12-09 (annotated)
- Committer:
- Patrik Ryd
- Date:
- Wed Dec 09 13:49:21 2015 +0100
- Revision:
- 4:15c97a3e1995
- Parent:
- 3:3b3517e9fa11
- Child:
- 5:998916f0f3ae
Some more code...
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
pryd | 0:291e05a4e8e9 | 1 | #include "mbed.h" |
Patrik Ryd |
4:15c97a3e1995 | 2 | #include "palettes.h" |
pryd | 0:291e05a4e8e9 | 3 | |
Patrik Ryd |
4:15c97a3e1995 | 4 | #define BYTES_PER_PACKET (164) |
Patrik Ryd |
4:15c97a3e1995 | 5 | #define DATA_PER_PACKET (BYTES_PER_PACKET/2) |
Patrik Ryd |
4:15c97a3e1995 | 6 | #define PACKETS_PER_FRAME (60) |
pryd | 0:291e05a4e8e9 | 7 | |
pryd | 0:291e05a4e8e9 | 8 | Serial pc(USBTX, USBRX); |
pryd | 0:291e05a4e8e9 | 9 | SPI lepton_spi(SPI_MOSI, SPI_MISO, SPI_SCK); |
pryd | 0:291e05a4e8e9 | 10 | DigitalOut spi_cs(SPI_CS); |
pryd | 0:291e05a4e8e9 | 11 | |
Patrik Ryd |
4:15c97a3e1995 | 12 | static uint8_t lepton_buffer[BYTES_PER_PACKET * PACKETS_PER_FRAME]; |
Patrik Ryd |
4:15c97a3e1995 | 13 | static uint32_t lepton_image[80][80]; |
pryd | 0:291e05a4e8e9 | 14 | |
Patrik Ryd |
2:a0eb7bff9571 | 15 | void setup(void) |
Patrik Ryd |
2:a0eb7bff9571 | 16 | { |
Patrik Ryd |
2:a0eb7bff9571 | 17 | lepton_spi.format(8,3); |
Patrik Ryd |
2:a0eb7bff9571 | 18 | lepton_spi.frequency(20000000); |
Patrik Ryd |
2:a0eb7bff9571 | 19 | spi_cs = 1; |
Patrik Ryd |
2:a0eb7bff9571 | 20 | spi_cs = 0; |
Patrik Ryd |
2:a0eb7bff9571 | 21 | spi_cs = 1; |
Patrik Ryd |
2:a0eb7bff9571 | 22 | wait_ms(185); |
Patrik Ryd |
2:a0eb7bff9571 | 23 | } |
Patrik Ryd |
2:a0eb7bff9571 | 24 | |
Patrik Ryd |
2:a0eb7bff9571 | 25 | void get_frame(void) |
Patrik Ryd |
2:a0eb7bff9571 | 26 | { |
Patrik Ryd |
4:15c97a3e1995 | 27 | int p; |
Patrik Ryd |
4:15c97a3e1995 | 28 | int i; |
Patrik Ryd |
4:15c97a3e1995 | 29 | int packet_num; |
Patrik Ryd |
2:a0eb7bff9571 | 30 | |
Patrik Ryd |
2:a0eb7bff9571 | 31 | spi_cs = 0; |
Patrik Ryd |
4:15c97a3e1995 | 32 | |
Patrik Ryd |
4:15c97a3e1995 | 33 | // No error handling. Assume we don't loose any packets |
Patrik Ryd |
4:15c97a3e1995 | 34 | for(p=0;p<PACKETS_PER_FRAME;p++){ |
Patrik Ryd |
4:15c97a3e1995 | 35 | for(i=0;i<LEPTON_FRAME_SIZE;i++){ |
Patrik Ryd |
4:15c97a3e1995 | 36 | lepton_buffer[p*PACKETS_PER_FRAME + i] = lepton_spi.write(0x00); |
Patrik Ryd |
4:15c97a3e1995 | 37 | } |
Patrik Ryd |
4:15c97a3e1995 | 38 | packet_num = lepton_buffer[p*PACKETS_PER_FRAME + 1]; |
Patrik Ryd |
4:15c97a3e1995 | 39 | if(packet_num != p){ |
Patrik Ryd |
4:15c97a3e1995 | 40 | pc.printf("Packet problem\n"); |
Patrik Ryd |
4:15c97a3e1995 | 41 | } |
Patrik Ryd |
4:15c97a3e1995 | 42 | } |
Patrik Ryd |
4:15c97a3e1995 | 43 | |
Patrik Ryd |
2:a0eb7bff9571 | 44 | spi_cs = 1; |
Patrik Ryd |
2:a0eb7bff9571 | 45 | } |
Patrik Ryd |
2:a0eb7bff9571 | 46 | |
Patrik Ryd |
4:15c97a3e1995 | 47 | void create_image(void) |
Patrik Ryd |
4:15c97a3e1995 | 48 | { |
Patrik Ryd |
4:15c97a3e1995 | 49 | uint16_t min_val = 65535; |
Patrik Ryd |
4:15c97a3e1995 | 50 | uint16_t max_val = 0; |
Patrik Ryd |
4:15c97a3e1995 | 51 | uint16_t value; |
Patrik Ryd |
4:15c97a3e1995 | 52 | int column; |
Patrik Ryd |
4:15c97a3e1995 | 53 | int row; |
Patrik Ryd |
4:15c97a3e1995 | 54 | int i; |
Patrik Ryd |
4:15c97a3e1995 | 55 | |
Patrik Ryd |
4:15c97a3e1995 | 56 | for(i=0;i<DATA_PER_PACKET;i++){ |
Patrik Ryd |
4:15c97a3e1995 | 57 | if(i % DATA_PER_PACKET < 2){ |
Patrik Ryd |
4:15c97a3e1995 | 58 | continue; |
Patrik Ryd |
4:15c97a3e1995 | 59 | } |
Patrik Ryd |
4:15c97a3e1995 | 60 | value = lepton_buffer[i*2] < 8 + lepton_buffer[i*2+1]; |
Patrik Ryd |
4:15c97a3e1995 | 61 | if(value > max_val) { |
Patrik Ryd |
4:15c97a3e1995 | 62 | max_val = value; |
Patrik Ryd |
4:15c97a3e1995 | 63 | } |
Patrik Ryd |
4:15c97a3e1995 | 64 | if(value < min_val) { |
Patrik Ryd |
4:15c97a3e1995 | 65 | min_val = value; |
Patrik Ryd |
4:15c97a3e1995 | 66 | } |
Patrik Ryd |
4:15c97a3e1995 | 67 | } |
Patrik Ryd |
4:15c97a3e1995 | 68 | |
Patrik Ryd |
4:15c97a3e1995 | 69 | float diff = max_val - min_val; |
Patrik Ryd |
4:15c97a3e1995 | 70 | float scale = 255/diff; |
Patrik Ryd |
4:15c97a3e1995 | 71 | uint8_t r; |
Patrik Ryd |
4:15c97a3e1995 | 72 | uint8_t g; |
Patrik Ryd |
4:15c97a3e1995 | 73 | uint8_t b; |
Patrik Ryd |
4:15c97a3e1995 | 74 | |
Patrik Ryd |
4:15c97a3e1995 | 75 | for(i=0;i<DATA_PER_PACKET;i++){ |
Patrik Ryd |
4:15c97a3e1995 | 76 | if(i % DATA_PER_PACKET < 2){ |
Patrik Ryd |
4:15c97a3e1995 | 77 | continue; |
Patrik Ryd |
4:15c97a3e1995 | 78 | } |
Patrik Ryd |
4:15c97a3e1995 | 79 | value = lepton_buffer[i*2] < 8 + lepton_buffer[i*2+1]; |
Patrik Ryd |
4:15c97a3e1995 | 80 | column = (i % DATA_PER_PACKET ) - 2; |
Patrik Ryd |
4:15c97a3e1995 | 81 | row = i / DATA_PER_PACKET; |
Patrik Ryd |
4:15c97a3e1995 | 82 | |
Patrik Ryd |
4:15c97a3e1995 | 83 | value = (value - min_val) / scale; |
Patrik Ryd |
4:15c97a3e1995 | 84 | r = colormap_ironblack[3*value]; |
Patrik Ryd |
4:15c97a3e1995 | 85 | g = colormap_ironblack[3*value+1]; |
Patrik Ryd |
4:15c97a3e1995 | 86 | b = colormap_ironblack[3*value+2]; |
Patrik Ryd |
4:15c97a3e1995 | 87 | } |
Patrik Ryd |
4:15c97a3e1995 | 88 | } |
Patrik Ryd |
4:15c97a3e1995 | 89 | |
pryd | 0:291e05a4e8e9 | 90 | int main() |
pryd | 0:291e05a4e8e9 | 91 | { |
pryd | 0:291e05a4e8e9 | 92 | pc.printf("Alive\n"); |
pryd | 0:291e05a4e8e9 | 93 | |
pryd | 0:291e05a4e8e9 | 94 | } |