Ż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:
<script type="text/javascript"> var angle = 3.14/5; var proportion = 0.67; var canvasWidth = 500; var canvasHeight = 500; function setup() { var canvas = createCanvas(canvasWidth, canvasHeight); canvas.parent('drzewo'); 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); } } </script>
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); } } }
Rejestr szeregowy wejść 74HC165 i Arduino + NES + SNES
Poniżej przykładowy kod do Arduino obsługujący rejestr szeregowy 74HC165. Jest to rejestr typu paraller In – serial Out – umożliwia odczyt stanów 8 wejść cyfrowych poprzez protokół SPI. Po drobnej modyfikacji kod może posłużyć do komunikacji z kontrolerami do gier Nintendo NES oraz SNES. Są one oparte o podobny układ CMOS 4021. Kontroler NES zawiera jeden rejestr, natomiast SNES – 2, co daje 16 bitów (nie wszystkie są wykorzystane). Ponieważ przyciski zwierają wejścia typu pull-up do masy, kontroler bez wciśniętych przycisków wysyła same jedynki. Jeżeli w naszym układzie wejście DATA złącza połączymy przez rezystor np. 1MΩ do masy, pozwoli to na wykrycie czy kontroler jest podpięty – niepodłączenie prześle same zera.
//Connect IC to the Arduino: #define HC165CLK 3 //Pin 2 of 74HC165, CLK #define HC165LD 4 //Pin 1 of 74HC165, SH/~LD #define HC165D 5 //Pin 9 if 74HC165, Qh void setup() { Serial.begin(9600); pinMode(HC165CLK, OUTPUT); pinMode(HC165LD, OUTPUT); pinMode(HC165D, INPUT); } void loop() { Serial.println(hc165ReadByte(),2); //Print readout in binary format delay(100); } byte hc165ReadByte(void){ byte data=0; digitalWrite(HC165LD, LOW); //delay(1); digitalWrite(HC165LD, HIGH); for(byte i=0; i<8;i++){ data = (data <<1) | (digitalRead(HC165D) & 1); digitalWrite(HC165CLK, HIGH); //delay(1); digitalWrite(HC165CLK, LOW); } return data; } byte NESReadByte(void){ /* * Bit order (from LSB to MSB): * 0: A * 1: B * 2: Select * 3: Start * 4: Up * 5: Down * 6: Left * 7: Right */ byte data=0; digitalWrite(HC165LD, HIGH); //delay(1); digitalWrite(HC165LD, LOW); for(byte i=0; i<8;i++){ data = (data <<1) | (digitalRead(HC165D) & 1); digitalWrite(HC165CLK, HIGH); //delay(1); digitalWrite(HC165CLK, LOW); } return data; } uint16_t SNESReadByte(void){ /* * Bit order (from LSB to MSB): * 0: B * 1: Y * 2: Select * 3: Start * 4: UP * 5: DOWN * 6: LEFT * 7: RIGHT * 8: A * 9: X * 10: L trigger * 11: R trigger * 12: ? * 13: ? * 14: ? * 15: ? */ uint16_t data=0; digitalWrite(HC165LD, HIGH); //delay(1); digitalWrite(HC165LD, LOW); for(byte i=0; i<16;i++){ data = (data <<1) | (digitalRead(HC165D) & 1); digitalWrite(HC165CLK, HIGH); //delay(1); digitalWrite(HC165CLK, LOW); } return data; }
WordPress NextGEN Gallery nie działa z niektórymi motywami – obejście problemu
Objawy:
- Edytor wizualny w zapleczu nie działa;
- Opcje wtyczki NextGen nie pokazują się;
- Wszystko zaczyna działać po przełączeniu motywu na jeden z domyślnych, np. „tweenty-eleven”;
- W kodzie źródłowym strony możesz odnaleźć błędne linki do plików CSS i JS ze zduplikowaną nazwą domeny;
Wersjes: WordPress 4.7.3; NextGen: 2.2.1
Rozwiązanie:
Zakomentuj linię numer ok. 191 w pliku „wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/mvc/package.module.mvc.php”:
$retval = '/' . $retval;
Właściwe rozwiązanie:
Autor motywu powinien poprawnie ustawić:
current_theme_supports('soil-relative-urls') || current_theme_supports('root-relative-urls')
.
STM32 pierwsze kroki
Najtańsza płytka: stm32f103c8t6 (72MHz, USB device, 2 kwarce 8MHz i 32KHz, 64KB Flash, 20KB RAM, 2xADC; nie ma: DAC, FPU, EEPROM, )
Programator : ST-Link V2
Wyświetlanie Float przez printf:
Bug w STM32CubeMX w wersji 4.20.0, przy ustawieniu HSE – zewnętrznego kwarcu
W pliku main.c jest:
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI |RCC_OSCILLATORTYPE_HSE |RCC_OSCILLATORTYPE_LSE;
Powinno być:
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE |RCC_OSCILLATORTYPE_LSE;
źródło: https://community.st.com/thread/39340-bug-cubemx-v420-rcc-initialization-fail-with-hse-selected