Roboteală

Una din ocupațiile mele de la facultate este să robotesc. Adică să construiesc roboți, în special autonomi (mai multe informații despre grupul nostru de robotiști aici). Ultimele 3 săptămâni m-am luptat cu fel și fel de probleme la unul din roboții pe care îi avem la laborator, și, deși încă nu am reușit să rezolv toate problemele, am învățat o grămadă de lucruri în proces. Eu n-am reușit niciodata în cele 5 – 6 materii cu și despre electronică din facultate să înțeleg cum funcționează trăznăile alea de pe-acolo, dar acum, cu ajutorul domnului profesor Vârbănescu (aka profu’) și cu „ajutorul” problemelor cu robotul cu care lucrez, am înțeles și eu în sfârșit ce-i aia o punte H, cum merge un tranzistor (în mare), cum funcționează MOSFET-urile, să mă joc cu osciloscopul, faptul că trebuie o masă comună între diferite alimentări (care e destul de LMCu, dar dacă-l uiți îi bai)…

Robotul ăsta, care n-are încă un nume (altul decât robotu’ mare) este o mașinuță cu 4 roți și cu control al direcției ca la mașină (cu diferențial și direcție pe față), și are două motoare, unul care angrenează toate 4 roțile și unul care comandă unghiul la care se întorc roțile. Partea de control este făcută cu o placă destul de deșteaptă, pe nume PMS5005 de la Dr. Robot, care printre alte drăcovenii are un adaptor serial to 802.11 (wireless) ceea ce înseamnă că poate comunica pe WiFi cu un calculator. De fapt, placa e gândită să aibă logica separat (pe un computer) și ea se ocupă strict cu controlul și cu primirea feedback-ului de la senzori (nu e programabilă).

Până acum, etapele pe care le-am isprăvit au fost:

  • determinat cum funcționează modulul serial to 802.11
  • configurat 802.11 pentru ad-hoc cu laptop-ul meu
  • determinat că softul de la placă nu funcționează la mine pe comp nici după update de firmware
  • sniffuit pachete, determinat că de fapt placa funcționează corect, softu nu
  • cerut și primit documentație despre protocolul de comunicație al plăcii de la Dr. Robot
  • implementat protocolul în Java într-o formă barbară
  • testat servo motorul pentru direcție
  • ars servo motorul pentru direcție
  • comandat servo nou pentru direcție
  • stabilit că servo s-a ars din lipsa de masă comună
  • instalat servo nou, testat că funcționează
  • reparat servo vechi (aici eu am avut contribuție minimă :)
  • refactorizat și rearanjat implementarea protocolului, mutat partea de conexiune într-un layer inferior, implementat pentru serial și pentru wifi
  • încercat conexiune prin rfcomm0 (bluetooth), stricat placa mea veche pentru bluetooth
  • configurat 802.11 pentru infrastructure (finally!)
  • testat modul control motor mare
  • ars sursă de calculator (prea puțin curent)
  • multe teste și demontări pentru stabilirea curentului necesar motorului mare
  • reușit comandă PWM motor mare
  • determinat că controllerul de motor are un maxim de 5A (peak)
  • determinat că controllerul de motor fierbe și sub 5A
  • renunțat la ideea de a folosi controllerul de motor
  • petrecut o săptămână citind despre punte H, învățat mult despre tranzistori
  • realizat sursă comună de alimentare pentru toate intrările plăcii de control (6V, 5V, 9/12V)
  • implementat soluție poartă H varianta profu (darlington + relee, 8A max), încercarea 1 (merge)
  • decis că încercarea 1 e prea mare ca și suprafață, implementat încercarea 2, cu sursa comună de alimentare ȘI punte H pe aceeași placă
  • determinat că sub sarcină sursa de 6V fierbe
  • ars un tranzistor
  • ars un releu
  • ars alt releu
  • învățat că rating-urile maxime de curent din documentație sunt pentru răcire eficientă (nu ce făceam eu)
  • făcut radiatoare din aluminiu (bonfaier + bormașină, mersi Adi)
  • făcut cabluri de conectare (ATMega către puntea H, PMS5005 către ATMega)
  • testat super placă pe robot, determinat că nu primește suficient curent și merge bleg
  • consulare de ora 12 cu dl. profesor, micit rezistența dintre +Vbatt și baza Darlingtonului la jumate, adăugat radiator barbar pe Darlington (regulă empirică – dacă are carcasă TO220 – de-aia cu șurub – o să-i trebuiască radiator)
  • testat super placă modificată pe robot, determinată ca merge mai bine, dar tot prea bleg

De fapt, robotul ăsta trebuie să poată să recunoască și să ocolească obstacole, să iasă dintr-un labirint, să nu se bage în pereți și, eventual, la un moment dat să devină ceva mai interesant cum ar fi proiectul meu de diplomă. Mai avem până acolo :)

Azi am făcut și câteva poze bestiei:

Poză ca la mașini :)
Poză ca la mașini :)
Drept dintre ochi
Drept dintre ochi
Punte H + surse de alimentare (check out radiatoarele de pe o placă de bază :P)
Punte H + surse de alimentare (check out radiatoarele de pe o placă de bază :P)
Un ATMega32 lipit cu scotch :P
Un ATMega32 lipit cu scotch :P

yeti vs. cartelă acces cămin

Ieri s-a decis (de cine, nu știu) să se repună în folosire interfonul de la intrarea în cămin (ceea ce evident pune problema „cine, când și de ce s-a decis să se SCOATĂ din folosire intrfonul?”). Pentru că eu sunt nou aici, în P16, nu am cartelă, și la cazare nu s-a pus de nici un fel problema de a primi o cartelă.

Am decis să dau o tură pe la admină (care este o femeie deosebită, cea mai pro-studenți admină din cele 4 pe care le-am „testat” de-a lungul celor câțiva ani prin cămine) să o rog să mă ajute să fac rost de o cartelă. Conversația a mers cam așa:

– Sărumâna, eu n-am cartelă, și am văzut că ați dat drumu la interfon …

– Nici eu n-am …

– A, deci nu mai aveți cartele de dat la studenți

– Nu, nu am cartelă nici EU!

Mi-a mai explicat că o comandă pe care ar face-o acuma pentru cartele, ar fi onorată undeva în iulie, deci mai bine nu ne blochează banii. Eu sunt un pic dumbstruck aici, cum adică durează așa mult o comandă, ce puii mei fac ăștia, fac RFID-urile din cartele din blană de crocodil?

Mă rog, ideea e că am rămas fără cartelă de acces în cămin, așa că acum de câte ori vin acasă, trebuie fie să sun și să sper că e cineva acasă, fie să aștept să treacă cineva și să-mi deschidă, ca un homeless sau un infractor. Trist! Și și neplăcut!

Am hotărât azi să revin un pic asupra unei idei mai vechi ce o aveam, dar care din lipsă de necesitate nu s-a concretizat, și anume hackuiala postului de interfon. Și când spun hackuială mă refer la ceva de genul: formez numărul camerei mele, și ușa mi se deschide automat (varianta basic) sau sun la un număr / dau comandă pe un IP pentru deschiderea ușii, sau formez un cod în plus după codul camerei (astea-s variante extra, sunt lucrari de diplomă mai praf ca astea :P).

Anyway, o sa revin aici cu informații despre această nouă provocare care mi-a fost scoasă în față.

UPDATE: mda, a durat exact două zile treaba cu interfonul. Cineva a avut o idee mai puțin elegantă dar mai eficientă decât mine și a deșurubat și subtilizat zăvorul de la interfon. De data asta, se pare că forța, nu inteligența, a rezolvat problema.

sampling teaching

Acum ceva mai bine de o săptămână m-a sunat unul dintre profesorii mei de la facultate, cu care am mai colaborat pe diferite chestii, să mă întrebe dacă nu sunt interesat să țin câteva laboratoare la o materie numită Programare Web. Nu m-am gândit prea mult atunci, dar am acceptat. În consecință, acum sunt asistent la Programare Web, o materie de anul 4, specializarea C5, la dl. prof. Florin Rădulescu și la Ciprian Dobre.

Am de ținut 3 laboratoare, celălalte 7 sunt susținute de colegul meu (mai experimentat), Matei Popovici. Pentru că nu am mai făcut niciodata așa ceva, să fiu sincer, am fost cam morcovit pentru prima „reprezentație”:), dar totul a decurs ok și toți cei  ~50 de studenți (! – deh, luni or tras chiulu de la tot oricum :P) de la primul laborator de marți au supraviețuit :P

Sunt câteva lucruri pe care le văd pozitive în treaba asta cu laboratoarele, și anume că ăsta fiind primul an în care se ține Programare Web, am oportunitatea să mă implic activ în dezvoltarea unor laboratoare interesante despre ceva cu care lucrez zilnic și despre care am strâns destul de multe informații utile și practice de-a lungul anilor. O să încerc să postez aici despre dificultățile care apar când lucrezi la o tematică (ce cuvânt de „lemn”!) de laborator de la 0, și despre reușitele noastre în domeniu :).

Îi invit, de asemenea, pe acei prieteni care citesc pe-aici și lucrează în bresle conexe aplicațiilor web, să vină cu idei și propuneri de ce cred ei că ar trebui ca tinerii absolvenți de facultate ar trebui să știe despre aplicații web. În principiu, ce ne-am propus până acum este să încercăm să încurajăm niște bune practici pentru dezvoltarea unor aplicații web scalabile, secure și robuste. Aplicațiile de laborator o să le facem în PHP (deja aud criticile :P), și ne-am propus să discutăm și despre interfețe, și despre funcționalitate javascript, și despre arhitectura aplicațiilor web în general. În plus, o să dedicăm două laboratoare securizării.

Ce mi se pare mie mișto este că oamenii au de făcut un soi de proiect, constituit din 4 teme care se construiesc una peste cealaltă, și la laborator învață chestii utile pentru temele respective. Pașii sunt aceeași, dar fiecare lucrează pe tema de proiect ce și-o ales-o, și la sfârșit ar trebui să aibă o aplicație web completă și funcțională.

Later edit: se pare că popularitatea mea e în scădere, vineri am avut doar doi studenți la laborator :P

AVR plugin pentru Eclipse

De când am făcut marea trecere pe linux, găsesc tot mai multe tooluri la îndemână pentru lumea noastră, a geek-șilor, și tot mai puține pentru lumea ailaltă, știți voi, aia reală. Totuși, nu pot decât să mă bucur când găsesc ceva să-mi simplifice task-urile … creative.

Acum un an am avut o materie numită Proiectarea cu Microcontrollere (sau așa ceva, ideea e că numele de cod este PM), unde, pentru prima oară în 4 ani (atunci) de școala trebuia să construim noi un dispozitiv. Ideea e că am fost puși față în față cu seria ATMega de la Atmel, și ni s-au dat pași concreți spre realizarea unei chestiuțe care să chiar MEARGĂ. De atunci, toate planurile de world domination includ cel puțin un ATMega :).

Anyway, post-ul ăsta există pentru că am găsit ceva util. Procesoarele AVR au mai multe feluri de programatoare (și chiar de Debuggere real-time), există plăci de dezvoltare and stuff like that. (AVRFreaks este site-ul recunoscut ca cea mai bună sursă de informații :P). Îs enșpe mii de variante de procesoare, care se folosesc destul de larg în orice „home brewed” device. Anul trecut, ca să le programăm, sub Windows, trebuia să scriem sursa cumva, să facem un Makefile (care era oarecum complicat, din ce țin eu minte) și să folosim un soft (PonyProg) ca să încărcăm proiectul pe procesor.

Există destul de multe tool-uri pentru lucrul cu AVRuri (WinAVR are și un IDE integrat, am înțeles că există ceva numit CodeVision, mai sunt), dar eu n-am reușit să le fac să-mi meargă pe Windows (parțial pentru că nu există suport pentru programatorul neavansat pe care îl folosim noi, parțial pentru că eram prea tăntălău). Tool-ul general preferat de mine, din anul II, de la tema cu bridge-ul (prietenii știu de ce) este Eclipse, care e extrem de configurabil și sunt sigur că măcar compilarea se putea rezolva de „mână” și înainte.

Dar acum nu mai e nevoie. Există plugin-ul ăsta super, care este construit peste pluginul CDT (partea de C/C++ a Eclipse) și are niște unelte de compilat automat, uploadat pe device direct cu avrdude. Am vazut că avrdude există și pe Windows, deci nu văd de ce tool-ul ăsta n-ar merge la fel de beton cum îmi merge și mie pe linux. Am avut plugin-ul instalat și pe Windows, da nu m-am simțit împins nicicum să-l fac să meargă.

Am găsit prin avrfreaks doua link-uri cu cum să-l aranjezi să-ți meargă (trebuie setat programatorul fizic ce se folosește, noi am folosit SI-Prog, dar am văzut că acum se face la PM o treabă pe USB care nu știu exact cum funcționește … încă!). De ce ar face cineva tutoriale pentru oameni tehnici în format video n-am înțeles, așa că pe scurt despre ce trebuie să faceți să vă programați ATMega-ul dintr-un foc (*credit-ul pentru indicații merge la baieții din link-urile de mai sus, eu doar încerc să-l fac un pic mai cursiv, pentru oameni nerabdători ca mine :P):

1. Vă trebuie compilatorul (avr-gcc), și alte câteva jucării (avrdude e downloader  / uploader, libusb trebuie dacă folosiți un device care se programează pe USB, avr-libc e biblioteca standard)

sudo apt-get install binutils-avr, avr-gcc, avr-libc, avrdude, libusb

Cred că pachetul ăsta se numea altfel mai demult (gcc-avr), dar mie cu ăsta mi-o mers

2. Vă trebuie Eclipse (recomand 3.4, dacă nu aveți motive serioase de a rămâne la 3.3) și CDT >= 4 (eu îl am pe ultimu stable de la Ganymede)

3. Instalați plug-in-ul AVR (care are site de update pentru Eclipse, just add the site to the Eclipse sources list .P)

http://avr-eclipse.sourceforge.net/updatesite/

4. Faceți un proiect C nou în Eclipse, alegeți AVR Cross Target App, Alegeți Toolchain-ul cu avr-gcc (dacă mai aveți și altele), alegeți tipul de device și frecvența (ATMega16/32 au o frecvență bazată pe un oscilator intern, la 1MHz. La PM am învățat cum să-l ducem la maximul potențialului, cu un cristal de 16MHz – trebuie setate niște fuse-uri prin el).

5. Windows > Preferences > AVR > AVRDude. Bifați chestia aia cu Log output to console dacă vreți să vedeți ce face (recomandat). Adăugați o configurație nouă, în funcție de programatorul vostru (avrdude are suport pentru o gramada de configurații, eu folosesc cea mai simplă, probabil, SI-Prog.). Poate e o idee bună să îi spuneți acolo și ce port serial folosiți în cazul în care mai programați pe serială :).

* Pașii 4 și 5 sunt independenți și interschimbabili

6. Project > Preferences > AVRDude > alegeți configurația pe care tocmai ce ați salvat-o.

7. Project > Preferences > C / C++ Build aveți o opțiune Additional Tools in Toolchain, ar trebui să aveți selectat AVRDude și Generate HEX file for Flash Memory cel puțin selectate. Eu am selectat și Print Size și Generate Extended Listing (deși nu știu exact daca nu-s numa chestii de raportare și nu de programare efectiv)

8. Tot acolo aveți posibilitatea să configurați comanda către avrdude (dacă nu îl aveți în path sau dacă aveți nevoie de drepturi de root să folosiți portul pe care vreți să-l folosiți, tipu de la care preiau chestia asta o pus un sudo avrdude acolo. Eu mi-am modificat permisiunile pentru serială)

9. (Recomandat) Setați nivelul de optimizare la AVR Compiler la -Os (size optimization)

10. La următorul build, dacă aveți legat controllerul în programator, avrdude o să descarce hex-ul în controller.

Mai sunt niște viewuri pe-acolo pe care le puteți folosi, și este un buton direct de upload pe device (care pe mine mă enervează că se pune acolo sus in bară și la alte viewuri decât ale pluginului ăstuia)

Utilizare port serial în aplicație Java pe Linux

Am nevoie să fac o conexiune pe un port serial din Java, și să comunic both ways prin el. (Eu sunt fericitul posesor al unui laptop generatie relativ noua (Dell Latitude 820) care are inca port serial – si ce bine ca are!). Am googălit puțin, și aici este o soluție, pentru arhivă (pe ubuntu 8.10 x86_64):

Se instalează pachetul oamenilor astora:

sudo apt-get install librxtx-java

Mai trebuie luat, de pe același site, RXTXComm.jar, în funcție de versiunea de rxtx care o are ubuntu vostru în repo (eu am 2.1.7.4).

Apoi, ca să-l folosiți în Eclipse, puteți să urmați ghidul de la ei de pe site. Traducere, pe scurt: adăugați JAR-u în class pathul proiectului, dați click pe el ([+] expand), setați native library location la  /usr/lib (la mine), și proiectul vostru are puteri seriale :P. Este la ei pe site exemplu de cod suficient cât să te apuci de treabă.