Autor Téma: Lazarus na Raspberry ovladani expanderu MCP23017  (Přečteno 5677 krát)

Mi.Ko

  • Host
Lazarus na Raspberry ovladani expanderu MCP23017
« kdy: 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.


Mi.Ko

  • Host
Re:Lazarus na Raspberry ovladani expanderu MCP23017
« Odpověď #1 kdy: 13-01-2015, 07:20:13 »
Tak jsem trochu hledal na netu.
http://wiki.freepascal.org/Executing_External_Programs

Mělo by to jít přes Process, ne?

Offline leonell

  • Plnoletý
  • ***
  • Příspěvků: 104
  • Karma: 3
Re:Lazarus na Raspberry ovladani expanderu MCP23017
« Odpověď #2 kdy: 14-01-2015, 16:26:49 »
Asi tohle:
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").
« Poslední změna: 14-01-2015, 16:47:44 od leonell »

Mi.Ko

  • Host
Re:Lazarus na Raspberry ovladani expanderu MCP23017
« Odpověď #3 kdy: 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



Mi.Ko

  • Host
Re:Lazarus na Raspberry ovladani expanderu MCP23017
« Odpověď #4 kdy: 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.


Mi.Ko

  • Host
Re:Lazarus na Raspberry ovladani expanderu MCP23017
« Odpověď #5 kdy: 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?

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2698
  • Karma: 104
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Embarcadero MVP - Czech republic

Mi.Ko

  • Host
Re:Lazarus na Raspberry ovladani expanderu MCP23017
« Odpověď #7 kdy: 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




Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2698
  • Karma: 104
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Lazarus na Raspberry ovladani expanderu MCP23017
« Odpověď #8 kdy: 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
Embarcadero MVP - Czech republic

Mi.Ko

  • Host
Re:Lazarus na Raspberry ovladani expanderu MCP23017
« Odpověď #9 kdy: 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 "


Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2698
  • Karma: 104
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Lazarus na Raspberry ovladani expanderu MCP23017
« Odpověď #10 kdy: 21-01-2015, 09:01:23 »
tipuji, nepomuze uses baseunix ?
Embarcadero MVP - Czech republic

Mi.Ko

  • Host
Re:Lazarus na Raspberry ovladani expanderu MCP23017
« Odpověď #11 kdy: 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

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2698
  • Karma: 104
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Lazarus na Raspberry ovladani expanderu MCP23017
« Odpověď #12 kdy: 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.
Embarcadero MVP - Czech republic