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:

  1. Szybkozłączka rozgałęźna BM 00110
  2. Tulejka połączeniowa samolutująca ST-ASS-HST3-1/2
  3. Tulejka zaciskowa izolowana BM00162
  4. Szybkozłączka Wago 221-412
Układ testowy

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:

  1. 16 mV
  2. 6 mV
  3. 7 mV
  4. 8 mV

Co daje oporności odpowiednio:

  1. 5,3 mΩ
  2. 2,0 mΩ
  3. 2,3 mΩ
  4. 2,7 mΩ

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);
};
			

Program obliczający wartość pierwiastka kwadratowego metodą babilońską


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 &gt; 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

  1. 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Ω.

1MHz:

3MHz:

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);
    }
  }
  
}