1-Riadková kamera TSLR1401: Rozdiel medzi revíziami
Z SensorWiki
(33 medziľahlých úprav od jedného ďalšieho používateľa nie je zobrazených) | |||
Riadok 8: | Riadok 8: | ||
=== Zadanie úlohy === | === Zadanie úlohy === | ||
− | |||
− | + | Pripojte riadkový senzor TSLR1410_DB k mikroprocesoru, zmerajte výstupný | |
+ | signál, preneste ho do PC a zobrazte. Z PC je možnosť meniť expozičnú dobu senzora. | ||
+ | |||
+ | '''Literatúra:''' | ||
+ | * [http://www.eureca.de/pdf/optoelectronic/taos/TSL1401R_LF_E4.pdf Datasheet] | ||
+ | * [http://content.solarbotics.com/archive/documentation/tsl1401-db_manual.pdf Ako to funguje] | ||
+ | |||
=== Popis riadkovej kamery === | === Popis riadkovej kamery === | ||
− | |||
TSL1401_DB je lineárna kamera, ktorá sa skladá z poľa fotodiód 128 x 1. Vnútorná riadiaca logika kamery si vyžaduje pre správnu funkčnosť zapojenie sériového vstupu SI a hodinového signálu CLK. | TSL1401_DB je lineárna kamera, ktorá sa skladá z poľa fotodiód 128 x 1. Vnútorná riadiaca logika kamery si vyžaduje pre správnu funkčnosť zapojenie sériového vstupu SI a hodinového signálu CLK. | ||
Riadok 22: | Riadok 26: | ||
---- | ---- | ||
− | Na nasledujúcom obrázku je schéma | + | Na nasledujúcom obrázku je schéma vnútornej štruktúry lineárnej kamery a označenie jednotlivých pinov. |
[[Súbor:funkcna_blokova_schema.jpg|800px|center]] | [[Súbor:funkcna_blokova_schema.jpg|800px|center]] | ||
− | <center>'''Obr. 2.''' | + | <center>'''Obr. 2.''' Vnútorná štruktúra a zapojenie kamery TSL1410_DB</center> |
+ | |||
+ | ---- | ||
+ | |||
+ | Označenie jednotlivých pinov a popis: | ||
+ | |||
+ | #PIN A0_3 - analógový výstup | ||
+ | #PIN CLK_2 - hodiny, riadia prenos, pixelový výstup a reset | ||
+ | #PIN GND_6,7 - zem | ||
+ | #PIN SI_1 - sériový vstup, definuje počiatok vysielania dát | ||
+ | #PIN VDD_4 - napájacie napätie pre analógové aj digitálne obvody | ||
+ | |||
+ | ---- | ||
+ | |||
+ | Popis činnosti: | ||
+ | |||
+ | Kamera sa skladá zo 128 fotodiód usporiadaných v lineárnom poli. Svetelná energia, ktorá dopadá na každú jednu fotodiódu(jeden pixel) vytvára na každej tejto fotodióde prúd. Počas integračného času sa kondenzátor pripojí k výstupu integrátora prostredníctvom analógového prepínača. Náboj nahromadený na každom pixeli(fotodióde) je priamoúmerný intenzite osvetlenia a integračného času. Výstup a Reset integrátorov je riadený 128-bitovým posuvným registrom. Výstupný cyklus(posielanie dát)je inicializovaný, ak je na pine SI logická 1. Počas prvých 18 hodinových cyklov neprebieha integrácia. Integrácia a prenos dát začína až po uplynutí 18 hodinových cyklov. Rozsah napájania lineárnej kamery je VDD = 3 - 5,5V. | ||
+ | |||
+ | [[Súbor:Casove_priebehy.jpg|600px|center]] | ||
+ | <center>'''Obr. 3.''' Časové priebehy kamery TSL1410_DB</center> | ||
+ | |||
+ | [[Súbor:Prevadzkove_priebehy.jpg|600px|center]] | ||
+ | <center>'''Obr. 4.''' Prevádzkové priebehy kamery TSL1410_DB</center> | ||
+ | |||
+ | ---- | ||
+ | === Vypracovanie === | ||
+ | Pripojenie kamery k Acrob doske a definovanie pinov je v hlavičkovom súbore "kamera.h". Rýchlosť sériového portu je nastavená na 19200 Baud/rate. Na začiatku sa vyšlú konfiguračné príkazy do Stampplotu, stačí zaškrtnúť "plot data" a potom "connect". Pred spustením treba držať reset na doske, aby sa začali vysielať dáta až po pripojení. Nastavenie integračného času je vyriešené tak, že po prijatí 1 znaku sa jeho hodnota 0 až 255 nastaví ako integračný čas v milisekundách (strop je obmedzený na 100),dá sa pozmeniť v zdrojovom kóde. | ||
+ | Schéma zapojenia kamery: | ||
+ | [[Súbor:Schema_zapojenia_TSL1410_DB.jpg|700px|center]] | ||
+ | <center>'''Obr. 5.''' Schéma zapojenia kamery TSL1410_DB</center> | ||
+ | Nami definovaná knižnica: | ||
+ | <source lang="c"> | ||
+ | #ifndef KAMERA_H_ | ||
+ | #define KAMERA_H_ | ||
+ | #define CLK_PORT B | ||
+ | #define CLK_PIN 5 | ||
+ | #define SI_PORT B | ||
+ | #define SI_PIN 4 | ||
+ | #define A0_PORT C | ||
+ | #define A0_PIN 0 | ||
+ | #endif /* KAMERA_H_ */ | ||
+ | </source> | ||
+ | Zdrojový kód v jazyku C: | ||
+ | <source lang="c"> | ||
+ | #include <stdio.h> | ||
+ | #include <avr/io.h> | ||
+ | #include <avr/interrupt.h> | ||
+ | #include <util/delay.h> | ||
+ | #include "kamera.h" | ||
+ | /* Global macros */ | ||
+ | #define sbit(var, bit) var |= (1 << bit); | ||
+ | #define cbit(var, bit) var &= ~(1 << bit); | ||
+ | #define rbit(var, bit) ((var & (1 << bit)) != 0) | ||
+ | #define CONCAT(a, b) a ## b | ||
+ | #define DDR(port) CONCAT(DDR, port) | ||
+ | #define INPORT(port) CONCAT(PIN, port) | ||
+ | #define OUTPORT(port) CONCAT(PORT, port) | ||
+ | |||
+ | |||
+ | /* Program-specific macros */ | ||
+ | #define cam_clk_high() sbit(OUTPORT(CLK_PORT), CLK_PIN) | ||
+ | #define cam_clk_low() cbit(OUTPORT(CLK_PORT), CLK_PIN) | ||
+ | #define cam_si_high() sbit(OUTPORT(SI_PORT), SI_PIN) | ||
+ | #define cam_si_low() cbit(OUTPORT(SI_PORT), SI_PIN) | ||
+ | |||
+ | static int usart_putchar(char c, FILE *stream); | ||
+ | static FILE mystdout = FDEV_SETUP_STREAM(usart_putchar, NULL, _FDEV_SETUP_WRITE); | ||
+ | |||
+ | /* Global variables */ | ||
+ | volatile unsigned char _integrationTime = 10; // in milliseconds | ||
+ | unsigned char _data[128]; | ||
+ | |||
+ | // Send char over USART | ||
+ | static int usart_putchar(char c, FILE *stream) { | ||
+ | // add '\r' before '\n' | ||
+ | //if (c == '\n') usart_putchar('\r', stream); | ||
+ | // wait for empty transmit buffer | ||
+ | while ( !(UCSR0A & (1 << UDRE0)) ); | ||
+ | // send char | ||
+ | UDR0 = c; | ||
+ | return 0; | ||
+ | } | ||
+ | |||
+ | |||
+ | // Send char over USART | ||
+ | void usart_send_char(unsigned char ch) { | ||
+ | // wait for empty transmit buffer | ||
+ | while ( !(UCSR0A & (1 << UDRE0)) ); | ||
+ | // send char | ||
+ | UDR0 = ch; | ||
+ | } | ||
+ | |||
+ | // Read the 8 most significant bits | ||
+ | // of the AD conversion result | ||
+ | unsigned char read_adc() { | ||
+ | // Start the AD conversion | ||
+ | ADCSRA |= (1 << ADSC); | ||
+ | // Wait for the AD conversion to complete | ||
+ | while ((ADCSRA & (1 << ADIF)) == 0); | ||
+ | // Clear flag | ||
+ | ADCSRA |= (1 << ADIF); | ||
+ | return ADCH; | ||
+ | } | ||
+ | |||
+ | // RX Complete handler | ||
+ | ISR (USART_RX_vect) { | ||
+ | |||
+ | // received character is set as integration time in [ms], max 100 | ||
+ | unsigned char ch; | ||
+ | ch = UDR0; | ||
+ | if (ch > 100) ch = 100; | ||
+ | |||
+ | _integrationTime = ch; | ||
+ | } | ||
+ | |||
+ | |||
+ | // Main loop | ||
+ | int main(void) | ||
+ | { | ||
+ | // Pin config | ||
+ | sbit(DDR(CLK_PORT), CLK_PIN); // CLK out | ||
+ | sbit(DDR(SI_PORT), SI_PIN); // SI out | ||
+ | cbit(DDR(A0_PORT), A0_PIN); // analog in | ||
+ | |||
+ | |||
+ | // Configure UART | ||
+ | // - parameters: 8 Data, 1 Stop, No Parity | ||
+ | // - baud rate: 19200 | ||
+ | UCSR0B = (1 << RXCIE0) | (1 << RXEN0) | (1 << TXEN0); | ||
+ | UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); | ||
+ | UBRR0 = 51; // @16MHz, 0.2% error | ||
+ | |||
+ | |||
+ | // ADC initialization | ||
+ | // - ADC clock frequency: F_CPU / 128 (125kHz @ 16MHz) | ||
+ | // - reference: AVcc with external cap | ||
+ | // - channel: as defined in A0_PIN | ||
+ | // - result left adjusted! | ||
+ | ADMUX = (1 << REFS0) | (1 << ADLAR) | A0_PIN; | ||
+ | ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); | ||
+ | |||
+ | // Redirect STDOUT to USART | ||
+ | stdout = &mystdout; | ||
+ | |||
+ | // Interrupt global enable | ||
+ | sei(); | ||
+ | |||
+ | // Init StampPlot | ||
+ | printf("!PNTS 128\r"); | ||
+ | printf("!PLOT ON\r"); | ||
+ | printf("!MAXR\r"); | ||
+ | printf("!AMAX 255\r"); | ||
+ | printf("!TMAX 1\r"); | ||
+ | printf("!RSET\r"); | ||
+ | |||
+ | // some delay for PC port buffers to clear | ||
+ | _delay_ms(500); | ||
+ | |||
+ | // time to send | ||
+ | unsigned char tts = 0; | ||
+ | while(1) | ||
+ | { | ||
+ | cam_si_high(); | ||
+ | cam_clk_high(); | ||
+ | cam_si_low(); | ||
+ | |||
+ | unsigned char i; | ||
+ | for (i = 0; i < 128; i++) | ||
+ | { | ||
+ | cam_clk_low(); | ||
+ | unsigned char val = read_adc(); | ||
+ | _data[i] = val; | ||
+ | cam_clk_high(); | ||
+ | } | ||
+ | cam_clk_low(); | ||
+ | |||
+ | // delay for integration time | ||
+ | for (i = 0; i < _integrationTime; i++) _delay_ms(1); | ||
+ | |||
+ | // send data | ||
+ | if (tts++ == 10) | ||
+ | { | ||
+ | tts = 0; | ||
+ | // data send lasts ~150ms | ||
+ | for (i = 0; i < 128; i++) printf("%d\r", _data[i]); | ||
+ | } | ||
+ | |||
+ | } | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | ---- | ||
+ | |||
+ | === Snímaný obrázok a výsledky === | ||
+ | |||
+ | Pomocou riadkovej kamery TSL1410_DB sme skúšali snímať rôzne predmety a zobrazovať ich pomocou Stampplotu. Stampplot nám, ale neposkytoval požadovane dobrý priebeh, tak sme sa rozhodli zobraziť výstupný priebeh z pinu A0 pomocou osciloskopu. Nameraný výstupný signál A0 pri snímaní je zobrazený na nasledujúcom obrázku. | ||
+ | |||
+ | [[Súbor:Untitled-2.jpg|300px|center]] | ||
+ | <center>'''Obr. 6.''' Zaznamenaný priebeh signálu A0 pomocou kamery TSL1410_DB</center> | ||
+ | |||
+ | Pomocou Stampplotu sme si zobrazený výstupný signál uložili do .txt súboru, a uložené dáta sme vykreslili pomocou Matlabu. | ||
+ | |||
+ | [[Súbor:Capture.jpg|500px|center]] | ||
+ | <center>'''Obr. 7.''' Priebeh výstupného signálu vykreslený pomocou Matlabu</center> | ||
+ | |||
+ | === Záver === | ||
+ | ---- | ||
+ | Pri programovaní a riešení celého projektu nám robil najväčší problém Stampplot, jeho nastavenie a zobrazenie priebehu. Pre zobrazenie výstupného signálu A0 sme sa rozhodli použiť osciloskop a pomocou Stampplotu sme si uložili dáta zobrazeného výstupného priebehu a vykreslili sme ich pomocou Matlabu. Výstupné priebehy z Matlabu sme porovnali s priebehom zobrazeným pomocou osciloskopu. Porovnávané priebehy z osciloskopu a z Matlabu sa zhodovali s malými odchýlkami. V zdrojovom kóde je možnosť meniť veľkosť integračného času. | ||
[[Category:AVR]] [[Category:DVPS]] | [[Category:AVR]] [[Category:DVPS]] |
Aktuálna revízia z 14:05, 18. november 2013
- Vypracovali:
- Bc. Peter Lovaš
- Bc. Tomáš Oravec
- Bc. Ján Mazúch
- Študijný odbor: Aplikovaná mechatronika
- Ročník: 2. Ing.
Zadanie úlohy
Pripojte riadkový senzor TSLR1410_DB k mikroprocesoru, zmerajte výstupný signál, preneste ho do PC a zobrazte. Z PC je možnosť meniť expozičnú dobu senzora.
Literatúra:
Popis riadkovej kamery
TSL1401_DB je lineárna kamera, ktorá sa skladá z poľa fotodiód 128 x 1. Vnútorná riadiaca logika kamery si vyžaduje pre správnu funkčnosť zapojenie sériového vstupu SI a hodinového signálu CLK.
Na nasledujúcom obrázku je schéma vnútornej štruktúry lineárnej kamery a označenie jednotlivých pinov.
Označenie jednotlivých pinov a popis:
- PIN A0_3 - analógový výstup
- PIN CLK_2 - hodiny, riadia prenos, pixelový výstup a reset
- PIN GND_6,7 - zem
- PIN SI_1 - sériový vstup, definuje počiatok vysielania dát
- PIN VDD_4 - napájacie napätie pre analógové aj digitálne obvody
Popis činnosti:
Kamera sa skladá zo 128 fotodiód usporiadaných v lineárnom poli. Svetelná energia, ktorá dopadá na každú jednu fotodiódu(jeden pixel) vytvára na každej tejto fotodióde prúd. Počas integračného času sa kondenzátor pripojí k výstupu integrátora prostredníctvom analógového prepínača. Náboj nahromadený na každom pixeli(fotodióde) je priamoúmerný intenzite osvetlenia a integračného času. Výstup a Reset integrátorov je riadený 128-bitovým posuvným registrom. Výstupný cyklus(posielanie dát)je inicializovaný, ak je na pine SI logická 1. Počas prvých 18 hodinových cyklov neprebieha integrácia. Integrácia a prenos dát začína až po uplynutí 18 hodinových cyklov. Rozsah napájania lineárnej kamery je VDD = 3 - 5,5V.
Vypracovanie
Pripojenie kamery k Acrob doske a definovanie pinov je v hlavičkovom súbore "kamera.h". Rýchlosť sériového portu je nastavená na 19200 Baud/rate. Na začiatku sa vyšlú konfiguračné príkazy do Stampplotu, stačí zaškrtnúť "plot data" a potom "connect". Pred spustením treba držať reset na doske, aby sa začali vysielať dáta až po pripojení. Nastavenie integračného času je vyriešené tak, že po prijatí 1 znaku sa jeho hodnota 0 až 255 nastaví ako integračný čas v milisekundách (strop je obmedzený na 100),dá sa pozmeniť v zdrojovom kóde.
Schéma zapojenia kamery:
Nami definovaná knižnica:
#ifndef KAMERA_H_
#define KAMERA_H_
#define CLK_PORT B
#define CLK_PIN 5
#define SI_PORT B
#define SI_PIN 4
#define A0_PORT C
#define A0_PIN 0
#endif /* KAMERA_H_ */
Zdrojový kód v jazyku C:
#include <stdio.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "kamera.h"
/* Global macros */
#define sbit(var, bit) var |= (1 << bit);
#define cbit(var, bit) var &= ~(1 << bit);
#define rbit(var, bit) ((var & (1 << bit)) != 0)
#define CONCAT(a, b) a ## b
#define DDR(port) CONCAT(DDR, port)
#define INPORT(port) CONCAT(PIN, port)
#define OUTPORT(port) CONCAT(PORT, port)
/* Program-specific macros */
#define cam_clk_high() sbit(OUTPORT(CLK_PORT), CLK_PIN)
#define cam_clk_low() cbit(OUTPORT(CLK_PORT), CLK_PIN)
#define cam_si_high() sbit(OUTPORT(SI_PORT), SI_PIN)
#define cam_si_low() cbit(OUTPORT(SI_PORT), SI_PIN)
static int usart_putchar(char c, FILE *stream);
static FILE mystdout = FDEV_SETUP_STREAM(usart_putchar, NULL, _FDEV_SETUP_WRITE);
/* Global variables */
volatile unsigned char _integrationTime = 10; // in milliseconds
unsigned char _data[128];
// Send char over USART
static int usart_putchar(char c, FILE *stream) {
// add '\r' before '\n'
//if (c == '\n') usart_putchar('\r', stream);
// wait for empty transmit buffer
while ( !(UCSR0A & (1 << UDRE0)) );
// send char
UDR0 = c;
return 0;
}
// Send char over USART
void usart_send_char(unsigned char ch) {
// wait for empty transmit buffer
while ( !(UCSR0A & (1 << UDRE0)) );
// send char
UDR0 = ch;
}
// Read the 8 most significant bits
// of the AD conversion result
unsigned char read_adc() {
// Start the AD conversion
ADCSRA |= (1 << ADSC);
// Wait for the AD conversion to complete
while ((ADCSRA & (1 << ADIF)) == 0);
// Clear flag
ADCSRA |= (1 << ADIF);
return ADCH;
}
// RX Complete handler
ISR (USART_RX_vect) {
// received character is set as integration time in [ms], max 100
unsigned char ch;
ch = UDR0;
if (ch > 100) ch = 100;
_integrationTime = ch;
}
// Main loop
int main(void)
{
// Pin config
sbit(DDR(CLK_PORT), CLK_PIN); // CLK out
sbit(DDR(SI_PORT), SI_PIN); // SI out
cbit(DDR(A0_PORT), A0_PIN); // analog in
// Configure UART
// - parameters: 8 Data, 1 Stop, No Parity
// - baud rate: 19200
UCSR0B = (1 << RXCIE0) | (1 << RXEN0) | (1 << TXEN0);
UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);
UBRR0 = 51; // @16MHz, 0.2% error
// ADC initialization
// - ADC clock frequency: F_CPU / 128 (125kHz @ 16MHz)
// - reference: AVcc with external cap
// - channel: as defined in A0_PIN
// - result left adjusted!
ADMUX = (1 << REFS0) | (1 << ADLAR) | A0_PIN;
ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
// Redirect STDOUT to USART
stdout = &mystdout;
// Interrupt global enable
sei();
// Init StampPlot
printf("!PNTS 128\r");
printf("!PLOT ON\r");
printf("!MAXR\r");
printf("!AMAX 255\r");
printf("!TMAX 1\r");
printf("!RSET\r");
// some delay for PC port buffers to clear
_delay_ms(500);
// time to send
unsigned char tts = 0;
while(1)
{
cam_si_high();
cam_clk_high();
cam_si_low();
unsigned char i;
for (i = 0; i < 128; i++)
{
cam_clk_low();
unsigned char val = read_adc();
_data[i] = val;
cam_clk_high();
}
cam_clk_low();
// delay for integration time
for (i = 0; i < _integrationTime; i++) _delay_ms(1);
// send data
if (tts++ == 10)
{
tts = 0;
// data send lasts ~150ms
for (i = 0; i < 128; i++) printf("%d\r", _data[i]);
}
}
}
Snímaný obrázok a výsledky
Pomocou riadkovej kamery TSL1410_DB sme skúšali snímať rôzne predmety a zobrazovať ich pomocou Stampplotu. Stampplot nám, ale neposkytoval požadovane dobrý priebeh, tak sme sa rozhodli zobraziť výstupný priebeh z pinu A0 pomocou osciloskopu. Nameraný výstupný signál A0 pri snímaní je zobrazený na nasledujúcom obrázku.
Pomocou Stampplotu sme si zobrazený výstupný signál uložili do .txt súboru, a uložené dáta sme vykreslili pomocou Matlabu.
Záver
Pri programovaní a riešení celého projektu nám robil najväčší problém Stampplot, jeho nastavenie a zobrazenie priebehu. Pre zobrazenie výstupného signálu A0 sme sa rozhodli použiť osciloskop a pomocou Stampplotu sme si uložili dáta zobrazeného výstupného priebehu a vykreslili sme ich pomocou Matlabu. Výstupné priebehy z Matlabu sme porovnali s priebehom zobrazeným pomocou osciloskopu. Porovnávané priebehy z osciloskopu a z Matlabu sa zhodovali s malými odchýlkami. V zdrojovom kóde je možnosť meniť veľkosť integračného času.