TSL1401 Line Sensor: Rozdiel medzi revíziami
Z SensorWiki
(7 medziľahlých úprav od rovnakého používateľa nie je zobrazených.) | |||
Riadok 9: | Riadok 9: | ||
Dokumenty: | Dokumenty: | ||
− | * [ | + | * [https://ams.com/documents/20143/36005/TSL1401CL_DS000136_3-00.pdf Datasheet] |
+ | |||
+ | |||
+ | Pripojenie k mikropočítaču Acrob/Arduino: | ||
+ | Napájanie kamery: +5V - Vdd a Zem - GND | ||
+ | |||
+ | Signály: AO (Analog output) - A0 , SI (Start Integration) - D3 a CLK (Clock) - D2 | ||
Riadok 15: | Riadok 21: | ||
== Úlohy == | == Úlohy == | ||
+ | # Vypočítajte zosilnenie zosilňovača signálu kamery podľa schémy. | ||
# Určte ohniskovú vzdialenosť objektívu | # Určte ohniskovú vzdialenosť objektívu | ||
# Určte vzdialenosť kamery od 3cm pásiku, aby sa premietol na celý čip. | # Určte vzdialenosť kamery od 3cm pásiku, aby sa premietol na celý čip. | ||
Riadok 27: | Riadok 34: | ||
[[Súbor:TSL1401chip.jpg]] | [[Súbor:TSL1401chip.jpg]] | ||
+ | |||
+ | More info: | ||
+ | * http://arduining.com/2014/03/26/using-the-linear-sensor-array-tsl201r-with-arduino/ | ||
<source lang=c> | <source lang=c> | ||
Riadok 231: | Riadok 241: | ||
} | } | ||
</source> | </source> | ||
+ | |||
+ | |||
+ | Nová verzia pre Processing 3+ | ||
+ | |||
+ | <source lang="c++"> | ||
+ | /* LineViewer --- display for Arduino image sensor 2019-03-13 */ | ||
+ | |||
+ | import processing.serial.*; | ||
+ | |||
+ | final int LINELEN = 128; | ||
+ | final int SCROLLHT = 128; | ||
+ | PImage img; | ||
+ | Serial duino; | ||
+ | boolean Synced = false; | ||
+ | |||
+ | void settings() | ||
+ | { | ||
+ | // Window is same width as sensor, but long enough to scroll | ||
+ | size (LINELEN, SCROLLHT); | ||
+ | } | ||
+ | void setup () | ||
+ | { | ||
+ | println ("<START>"); | ||
+ | println (Serial.list()); | ||
+ | println ("<END>"); | ||
+ | |||
+ | // Open serial port to Arduino at 115200 baud | ||
+ | duino = new Serial (this, Serial.list()[1], 115200); | ||
+ | |||
+ | // Image is same size as window | ||
+ | img = createImage (LINELEN, SCROLLHT, RGB); | ||
+ | |||
+ | // Initialise image to a shade of blue | ||
+ | img.loadPixels (); | ||
+ | |||
+ | for (int i = 0; i < img.pixels.length; i++) { | ||
+ | img.pixels[i] = color (0, 90, 102); | ||
+ | } | ||
+ | |||
+ | img.updatePixels (); | ||
+ | |||
+ | // Choose image update rate | ||
+ | frameRate (30); | ||
+ | } | ||
+ | |||
+ | void draw () | ||
+ | { | ||
+ | int i; | ||
+ | int ch; | ||
+ | int nbufs; | ||
+ | int b; | ||
+ | int maxi; | ||
+ | int maxpx; | ||
+ | int mini; | ||
+ | int minpx; | ||
+ | byte[] inbuf = new byte[LINELEN + 1]; | ||
+ | |||
+ | // Synchronise | ||
+ | if (Synced) { | ||
+ | nbufs = duino.available () / (LINELEN + 1); | ||
+ | print("s"); | ||
+ | } | ||
+ | else { | ||
+ | print("u"); | ||
+ | do { | ||
+ | while (duino.available () == 0) | ||
+ | ; | ||
+ | |||
+ | ch = duino.read (); | ||
+ | |||
+ | } while (ch != 0); | ||
+ | nbufs = 0; | ||
+ | Synced = true; | ||
+ | } | ||
+ | |||
+ | // Load the image pixels in preparation for next row(s) | ||
+ | img.loadPixels (); | ||
+ | |||
+ | for (b = 0; b < nbufs; b++) { | ||
+ | // Scroll the old image data down the window | ||
+ | for (i = img.pixels.length - LINELEN - 1; i >= 0; i--) { | ||
+ | img.pixels[i + LINELEN] = img.pixels[i]; | ||
+ | } | ||
+ | |||
+ | // Read 128 pixels from image sensor, via Arduino | ||
+ | duino.readBytes (inbuf); | ||
+ | print("."); | ||
+ | |||
+ | // Check we're still in sync | ||
+ | if (inbuf[128] != 0) { | ||
+ | print ("UNSYNC "); | ||
+ | Synced = false; | ||
+ | } | ||
+ | |||
+ | maxi = 0; | ||
+ | maxpx = 0; | ||
+ | |||
+ | mini = 0; | ||
+ | minpx = 255; | ||
+ | |||
+ | // Transfer incoming pixels to image | ||
+ | for (i = 0; i < LINELEN; i++) { | ||
+ | ch = inbuf[i]; | ||
+ | if (ch < 0) | ||
+ | ch += 256; | ||
+ | |||
+ | if (ch > maxpx) { // Look for brightest pixel | ||
+ | maxi = i; | ||
+ | maxpx = ch; | ||
+ | } | ||
+ | |||
+ | if (ch < minpx) { // Look for brightest pixel | ||
+ | mini = i; | ||
+ | minpx = ch; | ||
+ | } | ||
+ | |||
+ | img.pixels[i] = color (ch, ch, ch); | ||
+ | } | ||
+ | |||
+ | img.pixels[maxi] = color (0, 255, 0); // Mark brightest in green | ||
+ | img.pixels[mini] = color (255, 0, 0); // Mark darkest in red | ||
+ | } | ||
+ | |||
+ | // We're done updating the image, so re-display it | ||
+ | img.updatePixels (); | ||
+ | print("."); | ||
+ | image (img, 0, 0); | ||
+ | } | ||
+ | |||
+ | </source> | ||
+ | |||
+ | |||
+ | [[MEMS inteligentné senzory a aktuátory#Cvi.C4.8Denia|Návrat na zoznam cvičení...]] | ||
+ | |||
+ | [[Category:MEMS]] |
Aktuálna revízia z 09:41, 22. marec 2020
Základom kamery je lineárne senzorové pole 128x1 doplnené o vzorkovací obvod. Funkcia je popísaná v datasheete. Kamera okrem toho obsahuje oddelovací zosilňovač, ktorého schéma zapojenia je tu:
Dokumenty:
Pripojenie k mikropočítaču Acrob/Arduino:
Napájanie kamery: +5V - Vdd a Zem - GND
Signály: AO (Analog output) - A0 , SI (Start Integration) - D3 a CLK (Clock) - D2
Úlohy
- Vypočítajte zosilnenie zosilňovača signálu kamery podľa schémy.
- Určte ohniskovú vzdialenosť objektívu
- Určte vzdialenosť kamery od 3cm pásiku, aby sa premietol na celý čip.
- Pomocou osciloskopu a čierneho pásiku zaostrite kameru
- Zistite vplyv osvetlenia zadnej steny čipu na kvalitu obrazu
- Pripojte kameru k PC a pomocou demonštračného programu zosnímajte jednoduchý čiarový kód
- Pozrite si zároveň aj signál na osciloskope (uložte na USB klúč)
- Zistite vplyv zmeny expozičnej doby na kvalitu snímky
- Zosnímajte predložený čiarový kód.
- Záznam z každej úlohy vypracujte vo forme technickej správy.
More info:
/* ************************************************************ */
/* Cvicenie so snimacom TSL1401 -- riadkovy CMOS snimac 128px */
/* */
/* ************************************************************ */
// Sensor interface:
#define AOpin 0 // Analog output - yellow
#define SIpin 3 // Start Integration - orange
#define CLKpin 2 // Clock - red
// Vcc - brown
// GND - black
#define NPIXELS 128 // No. of pixels in array
byte Pixel[NPIXELS]; // Field for measured values <0-255>
#define FASTADC 1
// defines for setting and clearing register bits
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
void setup(void)
{
pinMode(SIpin, OUTPUT);
pinMode(CLKpin, OUTPUT);
//pinMode (AOpin, INPUT);
digitalWrite(SIpin, LOW); // IDLE state
digitalWrite(CLKpin, LOW); // IDLE state
#if FASTADC
// set prescale to 16
sbi(ADCSRA,ADPS2);
cbi(ADCSRA,ADPS1);
cbi(ADCSRA,ADPS0);
#endif
Serial.begin (115200);
}
void loop (void)
{
int i;
int expTime;
delayMicroseconds (1); /* Integration time in microseconds */
delay(10); /* Integration time in miliseconds */
digitalWrite (CLKpin, LOW);
digitalWrite (SIpin, HIGH);
digitalWrite (CLKpin, HIGH);
digitalWrite (SIpin, LOW);
delayMicroseconds (1);
/* and now read the real image */
for (i = 0; i < NPIXELS; i++) {
Pixel[i] = analogRead (AOpin)/4 ; // 8-bit is enough
digitalWrite (CLKpin, LOW);
delayMicroseconds (1);
digitalWrite (CLKpin, HIGH);
}
Serial.write ((byte)0); // sync byte = 0
for (i = 0; i < NPIXELS; i++) {
Serial.write ((byte)Pixel[i]+1);
}
}
Posledný zdroják je vizualizačný program pre Processing.org
/* LineViewer --- display for Arduino image sensor 2010-08-01 */
import processing.serial.*;
final int LINELEN = 128;
final int SCROLLHT = 128;
PImage img;
Serial duino;
boolean Synced = false;
void setup ()
{
println ("<START>");
println (Serial.list());
println ("<END>");
// Open serial port to Arduino at 115200 baud
duino = new Serial (this, Serial.list()[3], 115200);
// Window is same width as sensor, but long enough to scroll
size (LINELEN, SCROLLHT);
// Image is same size as window
img = createImage (LINELEN, SCROLLHT, RGB);
// Initialise image to a shade of blue
img.loadPixels ();
for (int i = 0; i < img.pixels.length; i++) {
img.pixels[i] = color (0, 90, 102);
}
img.updatePixels ();
// Choose image update rate
frameRate (30);
}
void draw ()
{
int i;
int ch;
int nbufs;
int b;
int maxi;
int maxpx;
int mini;
int minpx;
byte[] inbuf = new byte[LINELEN + 1];
// Synchronise
if (Synced) {
nbufs = duino.available () / (LINELEN + 1);
}
else {
do {
while (duino.available () == 0)
;
ch = duino.read ();
} while (ch != 0);
nbufs = 0;
Synced = true;
}
// Load the image pixels in preparation for next row(s)
img.loadPixels ();
for (b = 0; b < nbufs; b++) {
// Scroll the old image data down the window
for (i = img.pixels.length - LINELEN - 1; i >= 0; i--) {
img.pixels[i + LINELEN] = img.pixels[i];
}
// Read 128 pixels from image sensor, via Arduino
duino.readBytes (inbuf);
// Check we're still in sync
if (inbuf[128] != 0) {
print ("UNSYNC ");
Synced = false;
}
maxi = 0;
maxpx = 0;
mini = 0;
minpx = 255;
// Transfer incoming pixels to image
for (i = 0; i < LINELEN; i++) {
ch = inbuf[i];
if (ch < 0)
ch += 256;
if (ch > maxpx) { // Look for brightest pixel
maxi = i;
maxpx = ch;
}
if (ch < minpx) { // Look for brightest pixel
mini = i;
minpx = ch;
}
img.pixels[i] = color (ch, ch, ch);
}
img.pixels[maxi] = color (0, 255, 0); // Mark brightest in green
img.pixels[mini] = color (255, 0, 0); // Mark darkest in red
}
// We're done updating the image, so re-display it
img.updatePixels ();
image (img, 0, 0);
}
Nová verzia pre Processing 3+
/* LineViewer --- display for Arduino image sensor 2019-03-13 */
import processing.serial.*;
final int LINELEN = 128;
final int SCROLLHT = 128;
PImage img;
Serial duino;
boolean Synced = false;
void settings()
{
// Window is same width as sensor, but long enough to scroll
size (LINELEN, SCROLLHT);
}
void setup ()
{
println ("<START>");
println (Serial.list());
println ("<END>");
// Open serial port to Arduino at 115200 baud
duino = new Serial (this, Serial.list()[1], 115200);
// Image is same size as window
img = createImage (LINELEN, SCROLLHT, RGB);
// Initialise image to a shade of blue
img.loadPixels ();
for (int i = 0; i < img.pixels.length; i++) {
img.pixels[i] = color (0, 90, 102);
}
img.updatePixels ();
// Choose image update rate
frameRate (30);
}
void draw ()
{
int i;
int ch;
int nbufs;
int b;
int maxi;
int maxpx;
int mini;
int minpx;
byte[] inbuf = new byte[LINELEN + 1];
// Synchronise
if (Synced) {
nbufs = duino.available () / (LINELEN + 1);
print("s");
}
else {
print("u");
do {
while (duino.available () == 0)
;
ch = duino.read ();
} while (ch != 0);
nbufs = 0;
Synced = true;
}
// Load the image pixels in preparation for next row(s)
img.loadPixels ();
for (b = 0; b < nbufs; b++) {
// Scroll the old image data down the window
for (i = img.pixels.length - LINELEN - 1; i >= 0; i--) {
img.pixels[i + LINELEN] = img.pixels[i];
}
// Read 128 pixels from image sensor, via Arduino
duino.readBytes (inbuf);
print(".");
// Check we're still in sync
if (inbuf[128] != 0) {
print ("UNSYNC ");
Synced = false;
}
maxi = 0;
maxpx = 0;
mini = 0;
minpx = 255;
// Transfer incoming pixels to image
for (i = 0; i < LINELEN; i++) {
ch = inbuf[i];
if (ch < 0)
ch += 256;
if (ch > maxpx) { // Look for brightest pixel
maxi = i;
maxpx = ch;
}
if (ch < minpx) { // Look for brightest pixel
mini = i;
minpx = ch;
}
img.pixels[i] = color (ch, ch, ch);
}
img.pixels[maxi] = color (0, 255, 0); // Mark brightest in green
img.pixels[mini] = color (255, 0, 0); // Mark darkest in red
}
// We're done updating the image, so re-display it
img.updatePixels ();
print(".");
image (img, 0, 0);
}