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

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&lt;8;i++){
data = (data &lt;&lt;1) | (digitalRead(HC165D) &amp; 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&lt;8;i++){
data = (data &lt;&lt;1) | (digitalRead(HC165D) &amp; 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&lt;16;i++){
data = (data &lt;&lt;1) | (digitalRead(HC165D) &amp; 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')

.

 

Windows 7 – Nie aktualizuje się po reinstalacji

  1. Aktywuj system, lub upewnij się że jest aktywowany
  2. Wykonaj „Clean Boot”: msconfig.exe, selektywne uruchomienie, tylko usługi Windows
  3. Zainstaluj https://support.microsoft.com/en-us/kb/3020369
  4. Zainstaluj https://support.microsoft.com/en-us/kb/3172605
  5. Restart

Źródło: http://superuser.com/questions/951960/windows-7-sp1-windows-update-stuck-checking-for-updates

RS232, UART – Timing. Jak na oscyloskopie określić baudrate.

Załóżmy, że na oscyloskopie zobaczyliśmy coś takiego jak powyżej. Jest to 1 paczka danych z UART badanego urządzenia.
uart_timing

Bit STOP ma wartość 1 i jest niewidoczny, jeżeli odbieramy tylko jeden bajt na raz, ponieważ „zlewa się” ze stanem wysokim linii, który występuje w stanie spoczynku.

Dla transmisji 8N1 (8 bitów danych, bez bitu parzystości, 1 bit stopu), zależności czasowe wyglądają tak:

Baudrate – Długość ramki z rysunku – Długość jednego bitu:

  • 1200 – 7,480ms – 831,11μs
  • 2400 – 3,740ms – 415,56μs
  • 4800 – 1,870ms – 207,78μs
  • 9600 – 936,0μs – 104.167μs

(Wyniki uzyskane eksperymentalnie) Jak widać, jeżeli czas trwania jednego bitu jest okresem, to Baudrate jest częstotliwością. Np. 1/9600 [Baud] = 104,16(6)μs

Ponieważ na jedną ramkę przypada 10 bitów razem z bitem STOP, to przy Baudrate=9600 można przesłać 960B/s użytecznych danych.