Šį trimestrą univiere darėm du projektus: liniją sekantį robotą ir skaitmeninį termometrą. Robotas, nors ir keistai nuskambės, buvo programinės įrangos projektas. Mes nedarėme geležies dizaino, tiesiog susilitavome duotas dalis. Pagrindinė užduotis buvo parašyti programą, kuri tą robotą valdys.
Roboto smegenys - PIC18F4450 mikrokontroleris. Linijos aptikimui naudojami 5 IR diodai ir 5 IR fotodiodai. Kūnas kažkoks kinietiškas, du ratai varomi DC motoriukų. Motorai valdomi naudojant L298 draiverį.
Robotas programuojamas per usb. Mikrokontroleryje sukasi USB HID bootloader'is iš Microchip. Kompiliavom su C18 kompaileriu, o hex kodą į mikro kėlėm su programa iš to pačio Microchip.
Iš pradžių dar bandžiau susirasti Linux programas, bet nepavyko rasti hex uploaderio. Daėjau iki to, kad skaičiau libusb dokumentaciją, bootloaderio kodą ir snifinau paketus :D Šiaip sakyčiau gan neblogai pavyko (dar neveikia), ypač kai neturėjau jokios normalios specifikacijos. Jei atiduos robotus pabandysiu gal per vasarą pratęst.
Surininktas robotas atrodo maždaug taip:
Veiksmo univiero trasoje kažkaip nenufilmavau, bet šiame video matosi kaip robotas veikia.
So here is my application for the 5Kapp competition. It is basically a catalogue for keeping track of the contents of your electronics junk box (hence the name).
History
Recently I added quite a bit of electronics to my junk box. I started wondering how people know whether they've got a component they need in their box. The obvious way was to keep track of all the components one has. At first I thought that a spreadsheet might do the job, but as a programmer I could do better. So I decided to write a simple application that would do the job.
Features
This application is written in Python 3 and uses SQLite database. It has a command line interface, where user can perform various tasks. Here is the list of commands:
add - add a new component
clear - clear the screen
dir - list available commands
exit - exit the program
find - search for a component
get - get a component by id
ls - list all components
man - read command manual
rm - remove a component
Command history and tab-completion will help to save some keystrokes.
Perskaitęs Arvydo įrašą apie komentarų prenumeravimą, pamaniau, kad tai išties naudinga funkcija, juolab, jog ją esu ne kartą naudojęs kituose bloguose. Iš karto iškilo klausimas "o kuo gi aš blogesnis?", tad ėmiausi darbo (užvakar :D) ir štai šiandien jau turime rezultatą. Tie, kuriems trūksta "spamo" pašto dėžutėse, yra kviečiami testuoti, bei įvertinti mano darbą :)
DĖMESIO! Turiu atsiprašyti žmonių, atėjusių iš paieškos svetainių, norinčių sužinoti apie programavimą Java kalba. Čia tokios informacijos nėra. Esu įsitikinęs, kad daugiausiai atklystančių žmonių yra pradedantieji programuotojai, todėl galiu jums pasiūlyti įvadą į programavimą, kuris palengvins jūsų dalią su Java ir ne tik.
Turiu draugą, studijuojantį KTU. Kadangi pas juos yra tokia taktika - mokyti tai, kas nelabai į temą, tai jam prisireikė mano pagalbos. Žmogus studijuoja humanitarinius mokslus, gyvenime su programavimu nesusidūręs, o univieras verčia jį programinti su java. Nepasakyčiau, kad geras sprendimas, juolab, kad "pradmenys" pas juos yra oop ir susiję dalykai.
Užduotis: Duotas sakinys. Surasti simbolių skaičių, tarp pirmo ir antro kablelių. Dalį kodo jam padėjo parašyti kursiokė, bet jis iki galo neveikė. Pradinis sprendimas buvo verstis eilutę į char tipo masyvą ir einant pro kiekvieną simbolį tikrinti. Na pradžiai labai daug vargom, kadangi su java sintakse nebuvau pažįstamas visiškai, bet galiausiai priėjom paprastą sprendimą:
int pirmasKablelis()
{
for (int i=0; i<mas.length;i++)
{
if ( mas[i] == ',' )
return i+1;
}
return -1;
}
int antrasKablelis()
{
boolean pirmasKablelis=false;
for (int i=0; i<mas.length;i++)
{
if ( mas[i] == ',' )
{
if (pirmasKablelis==false)
{
pirmasKablelis=true;
}
else
return i+1;
}
}
return -1;
}
Tačiau tai dar nebuvo pabaiga. Bėda atsirado main() metode, kur vėlgi kažkas nesiderino su sintakse. Draugė peržiurėjo mano pasiūlytą variantą, ir privertė jį veikti. Turbūt būtų viskas gerai, jei ne mano programuotojo charakteris. Nusprendžiau patobulinti kodą iki galo. Nežinau ar reikėjo viską talpinti į atskirą klasę, bet mano sintaksės žinios neleido to padaryti, tai tiesiog sukišau viską į main metodą. Po šiokio tokio googlinimo, ir karo su Eclipse (taip, netgi IDE instaliavau šiam darbui :D) pavyko sukurti "šedevrą":
public class pirmasLab
{
public pirmasLab()
{
}
public static void main(String[] args)
{
String t = "Ba,ndymas";
int k = t.indexOf( ',' );
int l = t.indexOf(',', k+1);
if (k==-1)
System.out.println("Kableliu nera, eilutes ilgis: " + t.length());
else
{
System.out.println("Pirmas kablelis yra " +k+ " -as");
if (l==-1)
System.out.println("Antro kablelio nera. Nuo pirmo kablelio, iki galo yra " + (t.length()-k-1) + " simboliai/-iu");
else
System.out.println("Antras kablelis yra " +l+ " -as");
}
if (k!=-1 & l!=-1)
System.out.println("Tarp pirmo kablelio ir antro kablelio yra " + (l-k-1) + " simboliai/-iu");
}
}
Išvada: svarbiausia ne kalba/sintaksė, o bendros žinios ir mąstymas (ir mokėjimas naudotis Google :D).
Šiandien programuojant nutiko toks dalykas (beje, jau ne pirmą kartą). Esmę suprasit iš citatos:
[19:51:29] Armandas-san: ar jum būna, kad kai ką nors painiai programuojat, tiesiog rašot kodą, per daug negalvodami (nors nesat įsitikinę kad jis veiks) ir kai patikrinat - veikia?
[19:51:42] XXX: daznai
[19:52:00] Armandas-san: čia kaži gerai taip?
[19:52:06] XXX: svarbu veik
Na, jei kam tai aktualu, tai atsakymas slypi Nick Halstead blog'e. Nors mano atveju būna gal tik ~20 eilučių, bet vis tiek po to negaliu ramiai tęsti darbo, neperžiūrėjęs tos kodo dalies iš naujo.