Forum Delphi.cz

FreePascal (FPC) a Lazarus => Obecné => Téma založeno: Mi.Ko 12-01-2015, 12:40:20

Název: Lazarus na Raspberry ovladani expanderu MCP23017
Přispěvatel: Mi.Ko 12-01-2015, 12:40:20
Zdravím všechny, i ty co neporadí  ;D

Zkouším přes Raspberry komunikaci s expandérem  MCP23017
Přes sh je to ok.
Přes python také.
I v PHP to funguje.

Rad bych to ještě zkusil přes Lazarus.
Moc jsem toho na netu nenašel.
Nezkoušel to někdo?

V sh se dá ovládat výstupy   sudo i2cset -y 1 0x20 0x00 0x00
V PHP   system ('sudo i2cset -y -m 0x01 1 0x20 0x12 0x00');

Jsou to systemové příkazy.
Půjdou použít i v Lazarusu pod Linuxem?

Lazarus jsem spatřil poprvé před 3 dny tak úplný začátečník.
Delphi se mně však snažili ve škole naučit 2 roky a je to dost podobne.
.
Děkují za jakekolív info.

Název: Re:Lazarus na Raspberry ovladani expanderu MCP23017
Přispěvatel: Mi.Ko 13-01-2015, 07:20:13
Tak jsem trochu hledal na netu.
http://wiki.freepascal.org/Executing_External_Programs (http://wiki.freepascal.org/Executing_External_Programs)

Mělo by to jít přes Process, ne?
Název: Re:Lazarus na Raspberry ovladani expanderu MCP23017
Přispěvatel: leonell 14-01-2015, 16:26:49
Asi tohle:
http://www.freepascal.org/docs-html/rtl/sysutils/executeprocess.html (http://www.freepascal.org/docs-html/rtl/sysutils/executeprocess.html)

Jenže...

V Raspberry PI je komunikace I2C chráněna (omezena) přístupem roota, proto je nutné onen I2CSET volat pomocí SUDO (SuperUser Do). A ono SUDO to bude chtít potvrdit (Tvým) heslem, což už Ti ten ExecuteProcess neudělá a zůstane to viset (leda bys tu tvou přeloženou aplikaci taky pouštěl přes sudo).

Co si matně vzpomínám, šlo to udělat tak, že se udělal nějaký skript, třeba "muji2cset.sh" a tomu se po právy roota přiřadila oprávnění , tj:

Kód: [Vybrat]
su  nebo sudo su podle os
chown root.root muji2cset.sh
chmod a+x muji2cset.sh
chmod a+s muji2cset.sh

Ten poslední řádek řekne, že nejen že to jde spustit, ale že ta aplikace běží jako by ji spustil root, s právy roota. Pak už to myslím heslo nechce, protože tu odpovědnost už root předal předchozím nastavením. Ale ber to s rezervou, 10 let jsem s Linuxem nic takového nedělal, tak jen lovím z hlavy.

Doplňuji:
Pozor! Na rozdíl od těch ukázek nahoře, musí dostat ExecuteProcess to "sudo" včetně cesty. Čili asi "/usr/bin/sudo" (ověř pomocí "which sudo").
Název: Re:Lazarus na Raspberry ovladani expanderu MCP23017
Přispěvatel: Mi.Ko 14-01-2015, 20:24:10
Také jsem pátral.

http://raspi.eanet.cz/?p=130
http://wiringpi.com/download-and-install/
http://www.instructables.com/id/Simple-and-intuitive-web-interface-for-your-Raspbe/step2/Installing-and-using-the-Wiring-Pi-library/

Zatím neúspěšně bojují s instal WiringPi knihovny  :-\

Všechny přiklady však jsou po C


Název: Re:Lazarus na Raspberry ovladani expanderu MCP23017
Přispěvatel: Mi.Ko 15-01-2015, 22:37:18
Kód: [Vybrat]
Asi tohle:
http://www.freepascal.org/docs-html/rtl/sysutils/executeprocess.html

Ne spiš tohle?
http://www.freepascal.org/docs-html/rtl/unix/shell.html
Toto je systémový přikaz.
sudo i2cset -y 1 0x20 0x00 0x00

Nemam jak vyzkoušet :-\, jsem 14 dní mino.
Tak zatím sbiram jen info.

Název: Re:Lazarus na Raspberry ovladani expanderu MCP23017
Přispěvatel: Mi.Ko 20-01-2015, 17:58:00
Tak se povedlo.
Můj první problém vyřešila funkce fpSystem.

Takto jsem v terminalu i ve sh skriptu zapnul 4 bit expanderu.
sudo i2cset -y -m 0x10 1 0x20 0x12 0xFF

A tak na to přes lazarus
Kód: [Vybrat]
Var S : Longint;
begin
  S := fpsystem('i2cset -y -m 0x10 1 0x20 0x12 0xFF');

A měl bych další dotaz, můj 2 problém .

Takto načtu ve skriptu sh do proměnné stav registru  portu GPB.
stavregb=`sudo i2cget -y 1 0x20 0x13`

Jak na to přes lazarus?
Název: Re:Lazarus na Raspberry ovladani expanderu MCP23017
Přispěvatel: Radek Červinka 20-01-2015, 21:11:21
No snad stejne, jen podle
http://www.freepascal.org/docs-html/rtl/unix/fpsystem.html (http://www.freepascal.org/docs-html/rtl/unix/fpsystem.html)
musis zavolat http://www.freepascal.org/docs-html/rtl/baseunix/wexitstatus.html (http://www.freepascal.org/docs-html/rtl/baseunix/wexitstatus.html)
Název: Re:Lazarus na Raspberry ovladani expanderu MCP23017
Přispěvatel: Mi.Ko 20-01-2015, 21:25:37
Tak i na 2 problém jsem přišel.

Alespoň s 1 problémem mi pomozte.

Var S : Longint;

Vrací mi to hexadecimal ve tvaru 0xff
Rad bych s toho string v binary tvaru což je 11111111.
http://www.subnetonline.com/pages/converters/hex-t o-bin-to-dec.php

Kód: [Vybrat]
Var
  m :Longint;
  P: String;
begin
  m := fpsystem('i2cget -y 1 0x20 0x13');
  P := Longint (m);
 beep;
end;           

unit1.pas(46,19) Error: Incompatible types: got "LongInt" expected "AnsiString"
unit1.pas(52) Fatal: There were 1 errors compiling module, stopping



Název: Re:Lazarus na Raspberry ovladani expanderu MCP23017
Přispěvatel: Radek Červinka 20-01-2015, 21:48:39
Cetl jsi co jsem napsal? Ze na vysledek fpSystem musis podle vseho zavolat tu funkci wexitStatus, ktera konvertuje vysledek volani systemove funkce a vyseparuje ti vysledek?

A pak na ten vysledek zavolas funkci, ktera ti prevede int na string, neco jako

http://stackoverflow.com/questions/21361627/converting-decimal-integer-to-binary-how-and-why-it-works-the-way-it-does (http://stackoverflow.com/questions/21361627/converting-decimal-integer-to-binary-how-and-why-it-works-the-way-it-does)
Název: Re:Lazarus na Raspberry ovladani expanderu MCP23017
Přispěvatel: Mi.Ko 21-01-2015, 07:59:38
Asi se mně programátor nikdy nebude  ;)

function WEXITSTATUS(Status: longint): longint;

x := wexitstatus (m);

### TCodeToolManager.HandleException: "identifier not found: wexitstatus" at Line=49 Col=8 in "

Název: Re:Lazarus na Raspberry ovladani expanderu MCP23017
Přispěvatel: Radek Červinka 21-01-2015, 09:01:23
tipuji, nepomuze uses baseunix ?
Název: Re:Lazarus na Raspberry ovladani expanderu MCP23017
Přispěvatel: Mi.Ko 21-01-2015, 09:09:24
Mně to napadlo a hledal jsem co tam patří za unitu.
http://www.freepascal.org/docs-html/rtl/baseunix/wexitstatus.html
Je to nahoře v právo  ;D
To jsem přehled.

Normalně mi to ale funguje i bez toho

 m := fpsystem('i2cget -y 1 0x20 0x13');
 P := IntToBin(m);
 label1.Caption:= p;   

použil jsem tu 2 funkcí s te stranky

Kód: [Vybrat]
function IntToBin(Value: LongWord): string;
var
  i: Integer;
begin
  SetLength(Result, 8);
  for i := 1 to 8 do begin
    if ((Value shl (i-1)) shr 7) = 0 then begin
      Result[i] := '0'
    end else begin
      Result[i] := '1';
    end;
  end;
end;
Nevím proč ale vracelo mí to obraceně.
Místo 1 byli 0 a opačně.
Obratíl jsem v té funkcí  Result a funguje to
Název: Re:Lazarus na Raspberry ovladani expanderu MCP23017
Přispěvatel: Radek Červinka 21-01-2015, 09:40:03
...
Nevím proč ale vracelo mí to obraceně.
Místo 1 byli 0 a opačně.
Obratíl jsem v té funkcí  Result a funguje to


Nerad bych se pletl, ale to ze ti nahodou funguje neznamena, ze je to spravne. wexitstatus prevede vysledek volani systemu na vysledek behu toho programu. V tom volani systemu je zakodovana i nejak hodnota, ze se volani povedlo. V pripade ze se ti volani toho i2cget  povede, se vysledek zakoduje jinak nez kdyz se to volani nepovede (tj. selze). Tj. kdyby se nahodou nepovedlo, tak to nepoznas, jelikoz si vysledky cucas z prstu. >:(

Sorry, ale to nema vyznam, meles si svoje, pritom o tom mas nulovou predstavu.
Tohle jsem tu napsal jen proto, ze az jsem nekdo prileze z internetu, at nepouzijete primo tu tvoji sracku a aspon ma predstavu proc mu to nebude fungovat.