Zdjęcia struktury scalonej układu 74LS06 (6 inwerterów z wyjściem typu otwarty kolektor):
Sonitron SAS-2835-12V-W
Autopsja syrenki alarmowej.
Zasilanie: 12V DC. Syrenka wydaje zmodulowany ton. Goneracją głownego tonu zajmuje się VCO z układu scalonego 4046, a modulacja powstaje na wzmacniaczu operacyjnym LM358 pracującym w roli generatora przebiegu zbliżonego do trójkątnego – zgrubnie scałkowany przebieg prostokątny o niskiej częstotliwości.
Na wyjściu VCO anajduje się tranzystor NPN, który wysterowuje transformator o przekładni ok. 3,66:1. Indukcyjności zwojów to odpowiednio 107mH i 8mH, mierzone dla 1KHz. Transformator podwyższa napięcie, lub jak kto woli dopasowuje impedancję przetwornika piezoakustycznego.
Transformator w syrence zalany jest w obudowie czymś w rodzaju masy epoksydowej, przy wyjmowaniu się uszkodził, ale udało mi się go naprawić, po czym zagrzałem go w rurce termokurczliwej z klejem. Transformator ma 3 wyprowadzenia, jedno z nich (środkowe) jest wspólne dla obu uzwojeń. Z konstrukcyjnego punktu widzenia jest to więc cewka z odczepem.
Z ciekawości podpiąłem sam przetwornik piezoakustyczny pod tester rezonatorów kwarcowych:
Uzyskałem oscylację na częstotliwości dużo wyższej, niż się spodziewałem, bo ok. 112MHz:
Ciekawe.
Test połączeń kablowych
Testowi zostały poddane:
- Szybkozłączka rozgałęźna BM 00110
- Tulejka połączeniowa samolutująca ST-ASS-HST3-1/2
- Tulejka zaciskowa izolowana BM00162
- Szybkozłączka Wago 221-412

Złączki obciążyłem prądem 3A z zasilacza warsztatowego (w trybie regulacji prądu). Na przewodzie naciąłem izolację, aby móc dostać się do żyły. Użyty przewód to MXC1000HF 1,00m2.
Uzyskane wyniki z pomiaru miliwoltomierzem:
- 16 mV
- 6 mV
- 7 mV
- 8 mV
Co daje oporności odpowiednio:
- 5,3 mΩ
- 2,0 mΩ
- 2,3 mΩ
- 2,7 mΩ
Umiesz potęgować? To policz to :)
Żałosny kalkulator napisany w Java (NetBeans)
W zasadzie pierwszy program GUI napisany w Javie. Prymitywny kalkulator.
Pobierz [calc.zip]
Metoda babilońska liczenia pierwiastków
Poniższy algorytm oblicza pierwiastek kwadratowy metodą babilońską. Metoda polega na:
1. Zgadnięciu jakiejś liczby, im bliżej prawdziwej wartości pierwiastka, tym lepiej; W poniższym przykładzie brana jest liczba dwukrotnie mniejsza od pierwiastkowanej;
2. Obliczeniu wartości dzielenia pierwiastkowana/”strzał”;
3. Wyznaczeniu średniej arytmetycznej z tych liczb i użycie jej jako kolejnego „strzału”;
4. Powtarzaniu pkt. 2-3; Rozstrzał pomiędzy tymi liczbami z każdą iteracją kurczy się, a średnia przybliża się do realnej wartości pierwiastka.
W poniższym kodzie matlab użytkownik podaje ilość iteracji, jaką ma wykonać program.
% Program obliczajacy wartosc pierwiastka kwadratowego metoda babilonska % Autor: Aleksander Kaweczynski e.vt0.pl % 2017-12-17 clc; clear all; close all; format compact; a=input('Podaj liczbe, z ktorej policzyć pierwiastek: '); b=a/2; % aktualny 'strzal'; n=input('Podaj ilosc iteracji (liczba calkowita >2)'); c=0; % dzielenie a/strzal d=0; % srednia z obu for i=1:n c=a/b; d=(b+c)/2; b=d; disp(['Iteracja nr ', int2str(i), ' wynik: ', num2str(b)]); end
Zamieszczam również wersję w Javascript:
document.getElementById('calculatebabylon').onclick=function(){ var a = document.getElementById('babylonvalue').value; var b=a/2; // aktualny 'strzal'; var n=10; var c=0; // dzielenie a/strzal var d=0; // srednia z obu document.getElementById('babylonsquare').innerHTML = ''; for(var i=1;i<=n;++i) { c=a/b; d=(b+c)/2; b=d; document.getElementById('babylonsquare').innerHTML += 'Iteracja nr '+ i + ' wynik: ' + b +'<br />'; } document.getElementById('babylonsquare').innerHTML += 'Faktyczna wartosc: ' + Math.sqrt(a); };
P5.js – Drzewo
Inspiracja:
Kod źródłowy:
var angle = 3.14/5; var proportion = 0.67; var canvasWidth = 500; var canvasHeight = 500; function setup() { var canvas = createCanvas(500, 500); background(0,0,10); colorMode(HSB); frameRate(10); } function draw() { angle = PI*(abs(mouseX % canvasWidth)/canvasWidth); //proportion = 0.67; proportion = ((abs(mouseY % canvasHeight)/2)/canvasHeight+0.5)*0.75; background(0,0,10); stroke(255); translate(canvasWidth/2, canvasHeight); branch(150, 1); } function branch(len, generation) { strokeWeight(20/generation); stroke(generation*10+100, 100, 100); line(0, 0, 0, -len); translate(0, -len); if (len > 4) { push(); rotate(angle+ randomGaussian(1)/30); branch(len * proportion, generation+1); pop(); push(); rotate(-angle + randomGaussian(1)/30); branch(len * proportion, generation+1); pop(); } else { noFill(); ellipse(0,0,3); } }
Zachęcam do własnych prób.
Linki dot oscylatora Colpittsa, radia FM
http://www.rakon.com/component/docman/doc_download/234-single-transistor-crystal-oscillator-circuits
http://ue.pwr.wroc.pl/wyklad_w10/W14_Generatory.pdf
http://www.ue.pwr.wroc.pl/wyklad_I/ue1_modulatory_i_detektory.pdf
http://home.agh.edu.pl/~godek/instr_dFM.pdf
http://ep.com.pl/files/5107.pdf
http://zseii.edu.pl/archive/dydaktyka/elektronika/ue/07.html
Testy prędkości układów izolacji galwanicznej do przesyłu danych – ADuM1201ARZ-RL7 oraz HCPL2611
- ADuM1201ARZ-RL7 – spokojnie daje radę trzymać przyzwoity prostokąt przy niewielkim (o. 80ns) opóźnieniu. W praktyce daję radę przesyłać dane przez UART nawet do 921600. Wyższych prędkości transmisji nie testowałem. Poniżej pomiar z oscyloskopu. Przebieg żółty – wyjście; przebieg niebieski – wejście z generatora na układ. Zasilanie 5V z USB. Odsprzęganie zasilania 100nF. Wersji na 10Mbit nawet już nie testowałem.
2. HCPL2611 – też daje radę, z tym że nie miałem możliwości sprawdzić do deklarowanych 10MBit. Pomiary poniżej dla 1Mhz oraz 3MHz. Rezystor ograniczający prąd LED nadawczej – 330Ω, rezystor pull-up wyjścia – 220Ω.
Moje wnioski są takie, że do izolacji UART będę używał ADuM1201 – jego zastosowanie jest bardzo wygodne, i spełnia swoją rolę.
Czujnik koloru Parallax ColorPAL – obsługa w Arduino + wizualizacja koloru w Processing
Wyjście czujnika podpinamy pod pin nr 6 Arduino. Komunikacja serial: 115200. Dane są wysyłane w tej postaci:
RRRR;GGGG;BBBB;
gdzie RRRR – czterocyfrowa wartość koloru czerwonego 0-1023. itd.
Kod programu dla Arduino:
/* ColorPal Sensor Example for Arduino Author: Martin Heermance, with some assistance from Gordon McComb This program drives the Parallax ColorPAL color sensor and provides serial RGB data in a format compatible with the PC-hosted TCS230_ColorPAL_match.exe color matching program. */ #include <SoftwareSerial.h> #define sio 6 // ColorPAL connected to pin 6 #define unused 255 // Non-existant pin # for SoftwareSerial #define sioBaud 4800 // Received RGB values from ColorPAL int red; int grn; int blu; // Set up two software serials on the same pin. SoftwareSerial serin(sio, unused); SoftwareSerial serout(unused, sio); void setup() { delay(2000); Serial.begin(115200); reset(); // Send reset to ColorPal serout.begin(sioBaud); pinMode(sio, OUTPUT); serout.print("=(00 $ m)!"); // Loop print values, see ColorPAL documentation serout.end(); // Discontinue serial port for transmitting pinMode(sio, INPUT); serin.begin(sioBaud); // Set up serial port for receiving } void loop() { readData(); } // Reset ColorPAL; see ColorPAL documentation for sequence void reset() { delay(200); pinMode(sio, OUTPUT); digitalWrite(sio, LOW); pinMode(sio, INPUT); while (digitalRead(sio) != HIGH); pinMode(sio, OUTPUT); digitalWrite(sio, LOW); delay(80); pinMode(sio, INPUT); delay(200); } void readData() { char buffer[32]; if (serin.available() > 0) { // Wait for a $ character, then read three 3 digit hex numbers buffer[0] = serin.read(); if (buffer[0] == '$') { for(int i = 0; i < 9; i++) { while (serin.available() == 0); // Wait for next input character buffer[i] = serin.read(); if (buffer[i] == '$') // Return early if $ character encountered return; } parseAndPrint(buffer); delay(10); } } } // Parse the hex data into integers void parseAndPrint(char * data) { sscanf (data, "%3x%3x%3x", &red, &grn, &blu); // Pull the R, G, and B values from the data string char buffer[48]; // create a buffer sprintf(buffer, "%4.4d;%4.4d;%4.4d;", red, grn, blu); //print the values into a buffer as formatted integers Serial.println(buffer); }
Program Processing wyświetla okno z narysowanym prostokątem w kolorze takim, jak pochodzi z czujnika. Trzeba było zmienić współczynniki kolorów. Mimo to, nadal wymagana jest kalibracja, której jak na razie nie przeprowadziłem. Program próbuje nawiązać połączenie z pierwszym portem szeregowym dostępnym na komputerze. Jeżeli masz więcej portów, trzeba zmienić kod programu.
Kod dla processing:
/** * Color Variables (Homage to Albers). * * This example creates variables for colors that may be referred to * in the program by a name, rather than a number. */ import processing.serial.*; Serial myPort; // Create object from Serial class String myString = null; int lf = 10; int val, red, green, blue; // Data received from the serial port color inside = color(204, 102, 0); void setup() { size(400, 400); noStroke(); background(0, 0, 0); String portName = Serial.list()[0]; myPort = new Serial(this, portName, 115200); myPort.readStringUntil(lf); } void draw() { while (myPort.available() > 0) { myString = myPort.readStringUntil(lf); if (myString != null) { //println(myString); String[] list = split(myString, ';'); red = int(list[0])*2; green = int(list[1])*2; blue = int(list[2])/2; background(0, 0, 0); fill(255); text(" red: "+red+"\n green: "+green+"\n blue: "+blue, 10, 20); inside = color(red, green, blue); fill(inside); rect(100, 100, 200, 200); } } }