Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2026:atoader:theodor.mitrofan [2026/05/09 16:21]
theodor.mitrofan [Hardware Design]
pm:prj2026:atoader:theodor.mitrofan [2026/05/25 12:03] (current)
theodor.mitrofan [Introducere]
Line 9: Line 9:
  
 Pentru mine, utilitatea este didactica si practica: invat sa stapanesc interactiunea dintre senzori asincroni (RFID, Ultrasonic) si actuatoare (Servomotor) folosind o arhitectura de tip Finite State Machine (FSM), eliminand total functiile blocante de tip delay(). Pentru un utilizator real, sistemul ofera un feedback clar (pe ecranul LCD) si un acces fluid. Pentru mine, utilitatea este didactica si practica: invat sa stapanesc interactiunea dintre senzori asincroni (RFID, Ultrasonic) si actuatoare (Servomotor) folosind o arhitectura de tip Finite State Machine (FSM), eliminand total functiile blocante de tip delay(). Pentru un utilizator real, sistemul ofera un feedback clar (pe ecranul LCD) si un acces fluid.
 +
 +Laboratoarele folosite au fost 3-timere, PWM, 5-spi si 6-i2c
  
 ===== Descriere generala ===== ===== Descriere generala =====
  
-Sistemul ​este centralizat in jurul microcontrolerului ATmega328P. La momentul scanarii ​unui card, microcontrolerul ​interogheaza senzorul RFID prin protocolul SPIDaca UID-ul cardului ​este validat si exista locuri disponibilesistemul trimite date prin I2C catre ecranul LCD pentru actualizarea interfetei si genereaza ​un semnal PWM pentru a ridica servomotorul (bariera)+Arhitectura software a sistemului ​este concepută sub forma unui automat cu stări finite (Finite State Machine)implementat în limbaj C la nivel de regiștri pe microcontrolerul ​ATmega328PSistemul ​este construit în jurul unei bucle principale non-blockingcare orchestrează comunicația cu perifericele,​ asigurând ​un management fluid al accesului auto și al resurselor parcării
  
-Ulterior, controlul ​este preluat de senzorul ultrasonic. Folosind functiile de temporizare (Timere hardware), microcontrolerul masoara timpul de raspuns al ecoului pentru a determina cand masina a eliberat complet zona de tranzit. Odata confirmata trecerea, bariera coboara, iar contorul locurilor de parcare este decrementat.+Fluxul operațional ​este împărțit în patru module logice principale:
  
 +**1. Autentificare și Gestiunea Accesului (Comunicație SPI)**
 +Sistemul interoghează continuu senzorul RFID RC522 prin intermediul protocolului de comunicație de mare viteză SPI (Serial Peripheral Interface). ​
 +  * **Validarea Identității:​** La detectarea unui tag RFID (card sau breloc), microcontrolerul extrage identificatorul unic (UID) pe 4 octeți. Acest UID este comparat cu o structură de date internă ce conține utilizatorii autorizați.
 +  * **Logica de Capacitate:​** Chiar dacă un card este recunoscut ca fiind valid, accesul este condiționat de variabila globală a locurilor de parcare. Sistemul verifică preventiv dacă există locuri disponibile,​ refuzând accesul (și afișând un mesaj corespunzător pe ecran) în cazul în care parcarea este la capacitate maximă.
 +
 +**2. Interfață și Feedback Vizual (Comunicație I2C)**
 +Feedback-ul către utilizator este asigurat de un ecran LCD 1602, controlat eficient prin protocolul I2C pentru a minimiza numărul de pini utilizați (se folosesc doar SDA și SCL).
 +  * **Actualizare Dinamică:​** Microcontrolerul actualizează interfața grafică în timp real, gestionând tranzițiile de stare: de la mesajul implicit de așteptare (,,Locuri Libere: X''​),​ la mesaje de validare (,,Acces Permis''​),​ sau mesaje de eroare (,,Card Invalid''​ / ,,Parcare Ocupată''​).
 +
 +**3. Controlul Mecanic al Barierei (Timer Hardware și PWM)**
 +Pentru acționarea fizică a barierei (Servomotorul SG90), sistemul evită funcțiile de blocare a codului (precum funcțiile de delay), bazându-se pe resursele hardware interne ale microcontrolerului.
 +  * **Generare Semnal Precis:** Este utilizat Timer-ul 1 pe 16-biți în modul Fast PWM. Prin setarea regiștrilor (ex: ICR1 și OCR1A), microcontrolerul generează un semnal PWM cu o frecvență fixă de 50Hz, modificând doar factorul de umplere (Duty Cycle) pentru a ridica bariera (poziția de 90 grade) la momentul validării accesului.
 +
 +**4. Telemetrie și Siguranța Tranzitului (Senzor Ultrasonic)**
 +Odată bariera ridicată, controlul logic este delegat modulului de siguranță gestionat de senzorul ultrasonic HC-SR04, pentru a preveni coborârea accidentală a brațului peste autovehicul.
 +  * **Măsurarea Timpului de Zbor (ToF):** Microcontrolerul trimite un impuls scurt (Trigger) de 10 microsecunde și utilizează funcții de temporizare pentru a măsura durata impulsului de întoarcere (Echo).
 +  * **Conversie și Decizie:** Distanța este calculată matematic pe baza vitezei sunetului în aer.
 +  * **Logica de Tranzit:** Sistemul monitorizează continuu distanța. Când distanța scade sub un anumit prag, sistemul detectează mașina sub barieră. Doar în momentul în care distanța revine la valoarea inițială (confirmând că mașina a eliberat complet zona de tranzit), microcontrolerul comandă închiderea barierei și decrementează contorul locurilor de parcare, actualizând simultan afișajul LCD.
 {{pm:​prj2026:​atoader:​mitrofan_theodor.png?​670}} {{pm:​prj2026:​atoader:​mitrofan_theodor.png?​670}}
 +
 ===== Hardware Design ===== ===== Hardware Design =====
  
-**Lista de piese:** +^ Piesa ^ Link ^ Tip Utilizare ^ 
-  * Placa de dezvoltare **ATmega328P-Xplained Mini** (Microcontroler central si interfata de debugging mEDBG)+ATmega328P-Xplained Mini | [[https://​www.microchip.com/​en-us/​development-tool/​atmega328p-xmini|ATmega328P-Xplained Mini]] | Baza dezvoltare | 
-  ​* ​Modul **RFID RC522** (13.56 MHz) Alimentat la 3.3V, conectat la pinii SPI (MOSI, MISO, SCK, SS). +Modul RFID RC522 | [[https://​www.bitmi.ro/​modul-rfid-rc522-13-59mhz-cu-card-si-tag-10468.html?​gad_source=1&​gad_campaignid=22991722025&​gbraid=0AAAAADLag-nnaAD2-KamZ6qMPeX9EODW5&​gclid=CjwKCAjw5ZXQBhBdEiwAI5XVWWYh4P4q0otfQLW_UaE-AMkAOe1yxy4PVNM3kBF_5TlyA5kxobgOlhoC0qEQAvD_BwE|Modul RFID RC522]] | SPI | 
-  * **Display LCD 1602** retroiluminat ​cu modul **I2C PCF8574** lipit pe spate Alimentat la 5V, conectat la pinii SDA (PC4) si SCL (PC5)+Display LCD 1602 cu convertor ​I2C | [[https://​www.bitmi.ro/​electronica/​modul-interfata-i2c-pentru-lcd1602-10456.html|Modul interfață I2C pentru LCD]] | I2C | 
-  * **Servomotor SG90** Alimentat la 5V, semnal de control conectat la un pin capabil de PWM (Timer1). +Servomotor SG90 | [[https://​www.bitmi.ro/​servomotor-sg90-180-grade-9g-10496.html?​gad_source=1&​gad_campaignid=22991722025&​gbraid=0AAAAADLag-nnaAD2-KamZ6qMPeX9EODW5&​gclid=CjwKCAjw5ZXQBhBdEiwAI5XVWQXZa27TW67QwGFsDZUVFMhMdv7029RM0G-rRfPgTVxxRnwx-d1RfRoCtfkQAvD_BwE|Servomotor SG90]] | PWM (Timer1) ​| 
-  * **Senzor Ultrasonic HC-SR04** Alimentat la 5V, conectat la pini GPIO/Input Capture ​pentru masurarea impulsului de ecou. +Senzor Ultrasonic HC-SR04 ​| [[https://​sigmanortec.ro/​Senzor-ultrasunete-HC-SR04-p125423514?​SubmitCurrency=1&​id_currency=2&​srsltid=AfmBOorCJkTIpRGAV4zxJQd6-_3oJh7cRBnG1qOWIAHL12xkTYJTcHGaZik|Senzor Ultrasonic HC-SR04]] | GPIOInput Capture ​| 
-  ​* ​Breadboard si fire de conexiune ​DuPont ​(Tata-Tata, Mama-Tata).+Breadboard si fire DuPont ​| [[https://​www.bitmi.ro/​breadboard-400-puncte-pentru-montaje-electronice-rapide-10633.html?​gad_source=1&​gad_campaignid=22991722025&​gbraid=0AAAAADLag-nnaAD2-KamZ6qMPeX9EODW5&​gclid=CjwKCAjw5ZXQBhBdEiwAI5XVWeDqc7DeK0XeCdZCfTkPi31TB3drat6GdZFtWn-J7no54kN9QCawohoCJsMQAvD_BwE|Breadboard si fire DuPont]] | Conexiuni hardware |
  
 +{{pm:​prj2026:​atoader:​circuit_electric_mitrofan_theodor.jpeg?​670}}
  
 +^ Componentă ^ Pin componentă ^ Pin ATmega328P Xplained Mini ^ Explicație ^
 +| **HC-SR04** | VCC | 5V | Modulul ultrasonic este alimentat la 5V de la placă. |
 +| **HC-SR04** | GND | GND | Toate componentele trebuie să aibă masă comună. |
 +| **HC-SR04** | Trig (Trigger) | PD2 | Pin digital configurat ca ieșire pentru generarea impulsului de declanșare (10µs). |
 +| **HC-SR04** | Echo | PD3 | Pin digital configurat ca intrare pentru citirea ecoului (durata sa reprezintă distanța). |
 +| **Servomotor SG90** | VCC (Roșu) | 5V | Alimentarea motorului (se recomandă condensator tampon pe breadboard dacă există fluctuații). |
 +| **Servomotor SG90** | GND (Maro/​Negru)| GND | Masa comună. |
 +| **Servomotor SG90** | Semnal (Portocaliu) | PB1 / OC1A | Pin cu capabilitate hardware PWM (Timer 1) pentru controlul unghiului brațului barierei. |
 +| **LCD 1602 I2C** | VCC | 5V | Display-ul și modulul convertor sunt alimentate la 5V de la placă. |
 +| **LCD 1602 I2C** | GND | GND | Masa comună. |
 +| **LCD 1602 I2C** | SDA | PC4 / SDA | Pinul hardware standard pentru linia de date a magistralei I2C. |
 +| **LCD 1602 I2C** | SCL | PC5 / SCL | Pinul hardware standard pentru linia de ceas (clock) a magistralei I2C. |
 +| **RFID RC522** | VCC | 3.3V | **Atenție:​** Modulul funcționează STRICT la 3.3V. Alimentarea la 5V îl poate deteriora ireversibil. |
 +| **RFID RC522** | GND | GND | Masa comună. |
 +| **RFID RC522** | RST | PD4 | Pin digital configurat ca ieșire pentru a controla resetarea hard a modulului. |
 +| **RFID RC522** | MISO | PB4 / MISO | Pinul standard hardware SPI pentru recepția datelor (Master In Slave Out). |
 +| **RFID RC522** | MOSI | PB3 / MOSI | Pinul standard hardware SPI pentru transmisia datelor (Master Out Slave In). |
 +| **RFID RC522** | SCK | PB5 / SCK | Pinul standard hardware SPI pentru generarea semnalului de ceas (Serial Clock). |
 +| **RFID RC522** | SS (SDA) | PB2 / SS | Pin configurat ca ieșire pentru a selecta modulul pe magistrala SPI (Slave Select). |
 +| **RFID RC522** | IRQ | Neconectat | Pin opțional pentru întreruperi,​ lăsat liber deoarece sistemul interoghează modulul direct din cod (polling). |
 ===== Software Design ===== ===== Software Design =====
  
-Dezvoltarea ​software este bazata pe o masina de stari finita (FSM) care dicteaza comportamentul ​sistemului, eliminand complet functiile blocante.+In stadiul actual, partea ​software ​a proiectului ​este functionala si integreaza toate componentele principale ale sistemului.
  
-**Stari ​implementate:​** +Functionalitatile ​implementate ​pana acum sunt: 
-  * **Starea IDLE:** Sistemul asteapta scanarea unui card RFID. LCD-ul ​afiseaza numarul actualizat "​Locuri libereX". +  ​citirea UID-ului de pe cardurile RFID prin modulul RC522                  
-  * **Starea VALIDARE:** Se verifica UID-ul ​cardului scanat. Daca cardul ​este recunoscut ​si exista locuri ​disponibile (contor > 0)se trece la deblocare; ​daca nu, se afiseaza "Acces Respins" sau "​Parcare Plina"+  ​autorizarea cardurilor pe baza unei liste de UID-uri cunoscute, salvate in firmware 
-  * **Starea DESCHIDERE:** Servomotorul se roteste la 90 de grade prin intermediul unui semnal ​PWM pentru a ridica bariera+  * controlul barierei (servomotor) prin semnal PWM generat pe Timer1 
-  * **Starea TRANZIT:** Sistemul citeste constant datele ​de la senzorul ​HC-SR04. ​Atata timp cat distanta masurata este mica, masina ​se afla sub bariera. ​Sistemul asteapta ​ca distanta sa revina ​la normal ​(confirmarea trecerii). +  ​detectarea trecerii masinii prin senzorul ultrasonic HC-SR04 
-  * **Starea INCHIDERE:​** Dupa eliberarea zonei, ​bariera ​coboara (PWM la 0 grade)contorul ​de locuri libere este decrementatiar sistemul ​revine ​in starea IDLE.+  ​afisarea starii sistemului pe display-ul LCD 16x2 prin I2C (expander PCF8574) 
 +  ​numararea locurilor libere si actualizarea automata dupa fiecare intrare confirmata 
 +  ​tratarea cazului in care parcarea este plina, fara a ridica bariera 
 +  * tratarea cazului de timeout, in care cardul a fost scanat dar masina nu a trecut 
 +  * trimiterea de mesaje de debug prin UART pentru fiecare eveniment 
 + 
 +La pornire, sistemul initializeaza toate perifericele si afiseaza pe LCD numarul de locuri libere din totalul de 10. Sistemul ​intra apoi intr-o bucla in care asteapta scanarea unui card. Dupa ce un card este detectat si validat, bariera se ridica, iar sistemul incepe sa monitorizeze senzorul ultrasonic pentru a confirma trecerea masinii inainte de a inchide bariera la loc si a decrementa contorul. 
 + 
 +==== Structura codului ==== 
 + 
 +Codul este impartit in module clare, fiecare cu rol bine definit: 
 +  * initializare periferice: UART, I2C, SPI, RC522, servo (Timer1), HC-SR04, LCD 
 +  * modul SPI: configurare master, transfer pe 8 biti, control SS si RST pentru RC522 
 +  * modul RC522: scriere/​citire registri, control antena, REQUEST, anticolizie si citire UID dubla pentru validare 
 +  * modul I2C: TWI master la ~100 kHz, doar operatii de scriere (LCD-ul ​nu necesita citire) 
 +  * modul LCDdriver HD44780 in mod 4-bit prin expander PCF8574, functii pentru clear, set_cursor, write_char/​string/​num 
 +  * modul display: functii de nivel inalt pentru ecranele recurente (idle si parcare plina) 
 +  ​modul servo: PWM pe Timer1 (Fast PWM, ICR1 ca TOP), control pozitie inchis/​deschis cu pre-pas pentru a forta miscarea 
 +  ​modul sonartrigger pe PD2, masurare durata ecou pe PD3, conversie in cm prin impartire la 58 
 +  ​modul cards: lista statica de UID-uri autorizate si functia card_authorized() bazata pe memcmp 
 +  ​modul UART: configurare 9600 baud 8N1 si functii pentru text, numere zecimale, hex si UID 
 +  * logica principala: main.cpp orchestreaza toate modulele intr-o masina de stari implicita 
 + 
 +==== Interactiunea dintre functionalitati ==== 
 + 
 +Fluxul principal al aplicatiei este urmatorul:​ 
 +  * utilizatorul porneste sistemul 
 +  * perifericele sunt initializate si pe LCD apare mesajul "​Scanati cartela"​ impreuna cu numarul de locuri libere 
 +  * bariera este coborata in pozitia inchisa 
 +  * sistemul intra in bucla principala si asteapta un card RFID 
 +  * cand un card este detectat, RC522 returneaza UID-ul prin SPI 
 +  * sistemul ​verifica ​daca UID-ul este in lista de carduri autorizate 
 +  * daca UID-ul nu este autorizat, LCD afiseaza "Card respins"​ si revine la idle 
 +  * daca UID-ul este autorizat dar parcarea este plina, LCD afiseaza "​PARCARE PLINA" si revine la idle 
 +  * daca UID-ul este autorizat ​si exista locuri ​libereservoul ridica bariera 
 +  * sistemul monitorizeaza HC-SR04 pentru a detecta trecerea masinii 
 +  * dupa ce masina ​trece, bariera coboara, contorul de locuri libere este decrementat,​ iar LCD-ul afiseaza "Loc ocupat"​ 
 +  * daca masina ​nu este detectata in intervalul de timp permisbariera coboara fara a decrementa contorul, iar LCD-ul ​afiseaza "Timeout!" 
 +  * sistemul revine la starea idle si asteapta urmatorul card 
 + 
 +Prin aceasta logica, sistemul evita sa scada locurile libere daca masina nu trece efectiv prin dreptul senzorului, si nu ridica bariera in fata cardurilor neautorizate ​sau cand parcarea este deja plina. 
 + 
 +==== Detectia trecerii masinii ==== 
 + 
 +Pentru a confirma ca masina a trecut efectiv prin dreptul barierei am folosit senzorul ultrasonic HC-SR04. Algoritmul nu se bazeaza pe o singura citire, ci pe doua etape consecutive de filtrare: 
 +  * etapa 1 - detectia prezentei: sistemul polleaza senzorul la fiecare 100 ms; daca 3 citiri consecutive returneaza o distanta mai mica de 30 cm, se considera ca masina este sub senzor 
 +  ​etapa 2 - detectia plecarii: dupa ce masina a fost detectata, sistemul continua sa polleze; daca 5 citiri consecutive returneaza o distanta mai mare sau egala cu 30 cm, se considera ca masina a parasit zona 
 + 
 +Numarul de citiri consecutive necesare are rol de debounce si elimina citirile false cauzate de zgomotul ultrasonic sau de obstacole tranzitorii. Daca etapa 1 nu se incheie in 300 de cicluri (~30 secunde), tranzactia este considerata timeout si contorul nu este decrementat. 
 + 
 +==== Controlul barierei ==== 
 + 
 +Bariera este actionata de un servomotor cu rotatie continua (CR), controlat prin PWM la 50 Hz generat de Timer1 in mod Fast PWM cu ICR1 = 40000 (TOP) si prescaler /8. Pentru acest tip de servomotor, latimea pulsului setata prin OCR1A nu dicteaza o pozitie fixa a bratului, ci directia si viteza de rotatie a motorului:​ 
 +  ​stare de STOP (rotor oprit)OCR1A = 3000 (~1.5 ms) 
 +  ​miscare sens deschidere: OCR1A = 2400 (~1.2 ms) 
 +  ​miscare sens inchidere: OCR1A = 3600 (~1.8 ms) 
 + 
 +Pentru a asigura o cursa corecta a barierei, functia servo_set_position() activeaza miscarea in directia dorita (deschis sau inchis) pentru un timp prestabilit (ROT_TIME_MS,​ calibrat pentru unghiul de ~90 de grade). Dupa expirarea acestui delay generat de _delay_ms(),​ semnalul ​PWM revine automat la valoarea de STOP (3000) ​pentru a frana si opri rotorul in noua pozitieAceasta calibrare inlocuieste controlul clasic in bucla inchisa al servomotoarelor standard. 
 +==== Validarea functionalitatilor ==== 
 + 
 +Am testat fiecare componenta separat inainte de integrarea finala: 
 +  * RC522 a fost testat citind registrul de versiune (0x37) la pornire si trimitand valoarea prin UART pentru a confirma comunicarea SPI 
 +  ​LCD-ul a fost testat initial cu un mesaj fix ("​Sistem parcare / Initializare..."​),​ apoi cu cifre si stringuri dinamice (contorul de locuri) 
 +  ​servomotorul a fost testat separat alternand pozitiile SERVO_INCHIS si SERVO_DESCHIS pentru a regla valorile OCR1A 
 +  ​HC-SR04 a fost testat trimitand distanta masurata prin UART si trecand obiecte prin fata senzorului 
 +  ​algoritmul ​de autorizare a fost testat cu carduri din lista (UID 0x85 0x64 0xF3 0x06 si 0xE6 0xD7 0x10 0x06) si cu carduri necunoscute,​ pentru a verifica ambele ramuri (acces permis / acces respins) 
 +  * fluxul complet a fost testat scanand card, ridicand bariera, simuland trecerea unei masini (mana in fata senzorului) si verificand decrementarea contorului 
 + 
 +Pentru debug am folosit UART la 9600 baud, unde se afiseaza fiecare eveniment important: UID-ul citit, statusul autorizarii,​ momentul ridicarii barierei, detectia masinii, timeout-urile si starea contorului dupa fiecare tranzactie. 
 + 
 +==== Optimizari realizate ==== 
 + 
 +O prima optimizare a fost dubla citire a UID-ului in rc522_read_card(). Prima citire se face, apoi dupa 50 ms se face a doua citire si se compara cu prima. UID-ul este acceptat doar daca cele doua citiri sunt identice. Aceasta optimizare elimina UID-urile gresite cauzate de coliziuni partiale sau de carduri scoase din campul antenei in timpul citirii. 
 + 
 +A doua optimizare a fost filtrarea UID-urilor invalide (toate octetii 0x00 sau toti 0xFF). Aceste valori apar uneori cand antena RC522 detecteaza zgomot electromagnetic,​ dar nu corespund unui card real, si rejectandu-le se evita interpretarea zgomotului ca un card neautorizat. 
 + 
 +A treia optimizare a fost resetarea campului antenei dupa fiecare tranzactie prin rc522_reset_field(). Aceasta opreste antena pentru 100 ms si o porneste din nou, ceea ce forteaza cardul aflat in apropiere sa fie recitit ca o tranzactie noua, in loc sa fie tratat ca o citire repetata. 
 + 
 +A patra optimizare a fost folosirea detectiei in doua etape la HC-SR04 ​(prezenta + plecare, fiecare cu praguri de citiri consecutive)Aceasta abordare evita atat alarmele false (un obiect care apare o singura citire)cat si decrementarea prematura a contorului (in care masina ​inca este sub senzor cand bariera ​se inchide). 
 + 
 +==== Element de noutate ==== 
 + 
 +Elementul de noutate al proiectului este faptul ​ca sistemul nu se limiteaza ​la a ridica bariera la scanarea unui card, ci confirma fizic trecerea masinii inainte de a marca locul ca fiind ocupat. Sistemul diferentiaza intre trei situatii: 
 +  * cardul a fost scanat dar masina nu a trecut ​(timeout- bariera se inchide fara a decrementa contorul 
 +  * cardul a fost scanat si masina a trecut - bariera se inchide si contorul scade cu 1 
 +  ​cardul a fost scanat dar parcarea este plina - bariera ​nu se ridica deloc 
 + 
 +In plusprin combinatia dintre verificarea dubla a UID-ului si filtrarea citirilor ​de zgomot pe antena RC522, sistemul ​evita sa accepte sau sa respinga ​in mod fals un card pe baza unei singure citiri instabile. Astfel, sistemul ofera o sincronizare reala intre evenimentul de autorizare si miscarea fizica a masinii, lucru care nu ar fi posibil cu un simplu cititor RFID conectat direct la actuator.
 ===== Rezultate Obtinute ===== ===== Rezultate Obtinute =====
  
-===== Concluzii ===== +[[https://​github.com/​TheodorMitrofan/​Smart-parking-system|Link github]] 
-===== Download =====+ 
 +[[https://​youtube.com/​shorts/​nlaD8SWR9kA?​feature=share|Link video demo]]
  
-===== Jurnal ===== 
  
 ===== Bibliografie/​Resurse ===== ===== Bibliografie/​Resurse =====
pm/prj2026/atoader/theodor.mitrofan.1778332881.txt.gz · Last modified: 2026/05/09 16:21 by theodor.mitrofan
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0