Guide - Styra GPIO via webläsaren (LAMP, Python)

Permalänk
Medlem

Du kan även prova att sätta lite generösare rättigheter på katalogen som du försöker skicka filerna till
sudo chmod -R 777 katalognamn

Det sätter att alla har rätt att skriva och lästa i katalogen samt alla kataloger under.
/z

Visa signatur

C2D E6300 @ 3.2HGz 1.2V | Thermalright 120 Extr. | Gainward 8800 GT Golden Sample |Samsung 2x500Gb | Corsair VX 550V | Antec P182 [img]http://valid.x86-secret.com/cache/banner/421648.png[/img]

Permalänk
Medlem

tack för hjälpen
fick logga in som root så funka det

Permalänk
Medlem

Hej
Är nybörjare på detta och skulle vilja få igång detta och utvekla det från den grunden och lära mig mer.
Har gjort precis efter guiden och kopplat in det rätt men dioderna lyser hela tiden när jag kopplar in på gpio utgången.Sen när jag trycker på on så ändrar det sig inte till OFF. Måste vara någon åter koppling som inte funkar.

Permalänk
Medlem
Skrivet av gurk_82:

Hej
Är nybörjare på detta och skulle vilja få igång detta och utvekla det från den grunden och lära mig mer.
Har gjort precis efter guiden och kopplat in det rätt men dioderna lyser hela tiden när jag kopplar in på gpio utgången.Sen när jag trycker på on så ändrar det sig inte till OFF. Måste vara någon åter koppling som inte funkar.

Jag stötte på samma när jag labbade.. transistorn som pajjade för mig...

Skickades från m.sweclockers.com

Permalänk
Medlem

Sättet du kontrollerar GPIO pinnarna på känns otroligt dumt, och en textfil som sparar värdet på pinnen? Kolla på wiringpi, då blir det mesta mycket lättare. Du kan exportera GPIO pinnar så att de kan kontrolleras av andra program utan att vara root.

http://elinux.org/RPi_Low-level_peripherals#Shell_script_-_ta...

i php kan du då köra

shell_exec("gpio -g write 17 1"); //Sätter GPIO pinne 17 till 3.3V $value = shell_exec("gpio -g read 17"); //Läser värdet på pinne 17

Inte testat med PHP just nu men med python går det utmärkt.

Permalänk
Medlem

Jag vill ha en knapp i webbläsaren som sätter pin x och y till "hög" i z millisekunder och sen stänger x och y. (en ett antal knappar till som sätter andra pins men har jag det för en knapp så är det ju bara att duplicera.) Några tips på hur jag gör det lättast?

Permalänk
Medlem

Jag har gjort detta på lite olika sätt. Kör du webservern på Pi eller på en annan server?

/z

Visa signatur

C2D E6300 @ 3.2HGz 1.2V | Thermalright 120 Extr. | Gainward 8800 GT Golden Sample |Samsung 2x500Gb | Corsair VX 550V | Antec P182 [img]http://valid.x86-secret.com/cache/banner/421648.png[/img]

Permalänk
Medlem

På Pi:n

Permalänk
Medlem

Jag löste det genom att köra ett Pythonprogram ifrån en php-hemsida. Det fungerar mycket bra hittills för mig.
Då kan Python skicka tillbaka status information och uppdatera hemsidan efter utfallet (om operationen fungerade, avläst temp. etc )

Koden är på min Pi hemma och jag kan försöka skicka den ikväll när jag kommer hem.
/z

Visa signatur

C2D E6300 @ 3.2HGz 1.2V | Thermalright 120 Extr. | Gainward 8800 GT Golden Sample |Samsung 2x500Gb | Corsair VX 550V | Antec P182 [img]http://valid.x86-secret.com/cache/banner/421648.png[/img]

Permalänk
Medlem

Hej
satt och greja lite igår och jag får inga 3,3V ur pinnarna. Måste ju vara någon kod som inte funkar.

Permalänk
Medlem
Skrivet av gurk_82:

Hej
satt och greja lite igår och jag får inga 3,3V ur pinnarna. Måste ju vara någon kod som inte funkar.

OM du lägger koden här så kanske det går att se vad som är fel.
/z

Visa signatur

C2D E6300 @ 3.2HGz 1.2V | Thermalright 120 Extr. | Gainward 8800 GT Golden Sample |Samsung 2x500Gb | Corsair VX 550V | Antec P182 [img]http://valid.x86-secret.com/cache/banner/421648.png[/img]

Permalänk
Medlem
Skrivet av CTH:

Jag vill ha en knapp i webbläsaren som sätter pin x och y till "hög" i z millisekunder och sen stänger x och y. (en ett antal knappar till som sätter andra pins men har jag det för en knapp så är det ju bara att duplicera.) Några tips på hur jag gör det lättast?

Så nu har jag fixat lite kod som jag hoppas löser ditt problem:

Om jag fått det hela rätt är det lite besvärligt att köra GPIO via php på en hemsida pga att man behöver root rättigheter.

Lösningen är att använda en python-server som styr GPIO.

Du startar python-servern på pi först med kommandot sudo python netGPIO.py

Den lyssnar på port 5555 efter anslutningar från din php-sida.

Provkört på min Raspberry pi och det fungerar perfekt!

Python server kod: netGPIO.py

#!/usr/bin/python # Import required modules from time import sleep import RPi.GPIO as GPIO import socket,sys class netGPIO(): def __init__(self,port=5555): # Tell GPIO library to use GPIO references GPIO.setmode(GPIO.BCM) # Create output pin reference and set to outputs self.PIN_x=4 self.PIN_y=22 GPIO.setup(self.PIN_x, GPIO.OUT) GPIO.setup(self.PIN_y, GPIO.OUT) # Create a TCP/IP socket self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Bind the socket to the port server_address = ('', port) print >>sys.stderr, 'starting up on %s port %s' % server_address self.sock.bind(server_address) # Listen for incoming connections self.sock.listen(1) def __msDelay__(self,ms): sleep(ms*1e-3) def switch_1(self,delay=1000): # Set pins High GPIO.output(self.PIN_x, True) GPIO.output(self.PIN_y, True) # Call delay function self.__msDelay__(delay) # Set pins Low GPIO.output(self.PIN_x, False) GPIO.output(self.PIN_y, False) def waitForConnection(self): # Wait for a connection connection, client_address = self.sock.accept() try: print >>sys.stderr, 'connection from', client_address # Receive the command, only accept ONE message of 1024 bytes data = connection.recv(1024) print >>sys.stderr, 'received "%s"' % data # Check what was recieved if data.startswith('switch_1'): try: delay=int(data.split(',')[-1]) # Assumes connection of format "switch_1,340" for switch 1 and 340ms delay connection.sendall('Switch 1, Starting with delay %ims' %delay) self.switch_1(delay=delay) except: # If the argument could not be evaluated, use default connection.sendall('Switch 1, Starting with default delay') self.switch_1() elif data: print >>sys.stderr, 'sending data back to the client' response='Unkown command: %s' %data connection.sendall(response) except: print >>sys.stderr, 'An error occured in waitForConnectin function' raise finally: # Clean up the connection connection.close() if __name__ == '__main__': try: ng=netGPIO() while True: ng.waitForConnection() except KeyboardInterrupt: print " You pressed Ctrl-C, Exiting!" except: print "ERROR: An error occured" raise #Used to print out the original error message finally: # Reset GPIO settings GPIO.cleanup()

Dold text

Php server kod: Skapar filen - index.php

<?php // Set date format date_default_timezone_set('UTC'); $remoteIP='192.168.10.11'; $remotePort=5555; // Check for safe mode if( ini_get('safe_mode') ){ // Do it the safe mode way echo "Server runs in safe mode, Script will not be executed"; }else{ // Do it the regular way } function sendCommand($message,$remoteIP,$remotePort) { // Socket error handeling if(!($sock = socket_create(AF_INET, SOCK_STREAM, 0))) { $errorcode = socket_last_error(); $errormsg = socket_strerror($errorcode); die("Couldn't create socket: [$errorcode] $errormsg \n"); } // Establish a connection if(!socket_connect($sock , $remoteIP , $remotePort)) { $errorcode = socket_last_error(); $errormsg = socket_strerror($errorcode); die("Could not connect: [$errorcode] $errormsg \n"); } //Send the message to the server if( ! socket_send ( $sock , $message , strlen($message) , 0)) { $errorcode = socket_last_error(); $errormsg = socket_strerror($errorcode); die("Could not send data: [$errorcode] $errormsg \n"); } //Now receive reply from server if(socket_recv ( $sock , $buf , 2045 , MSG_WAITALL ) === FALSE) { $errorcode = socket_last_error(); $errormsg = socket_strerror($errorcode); die("Could not receive data: [$errorcode] $errormsg \n"); } return $buf; } //POST SWITCH switch ($_GET['action']) { case "switch_1": $message='switch_1,40'; $response = sendCommand($message,$remoteIP,$remotePort); //print the received message echo "Recieved message: $response <br>"; break; } // Switch_1 $switch_1 = "<input type='submit' class='button_one' value='Switch 1' name='Send Switch 1 Command'>"; ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd" lang="en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <link rel="stylesheet" href="style.css" type="text/css" /> <title>RaspberryPI</title> </head> <body> <table border='0' cellspacing='10' cellpadding='0' height='400' width='600' align="center"> <tr height='10'> <td colspan="1"> <font size="+3" face="Verdana, Arial, Helvetica, sans-serif">Welcome to PI control page</font> </td> </tr> <tr height='10'> <td> <div valign='center' align='center'> <form action='index.php?action=switch_1' method='post'> <?php echo $switch_1; ?> </form> <br> </div> </td> </tr> </table> </body> </html>

Dold text

Style sheet från mr2clean, Till filen - style.css

.button_one { -moz-box-shadow:inset 0px 1px 0px 0px #cae3fc; -webkit-box-shadow:inset 0px 1px 0px 0px #cae3fc; box-shadow:inset 0px 1px 0px 0px #cae3fc; background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #79bbff), color-stop(1, #4197ee) ); background:-moz-linear-gradient( center top, #79bbff 5%, #4197ee 100% ); filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#79bbff', endColorstr='#4197ee'); background-color:#79bbff; -webkit-border-top-left-radius:20px; -moz-border-radius-topleft:20px; border-top-left-radius:20px; -webkit-border-top-right-radius:20px; -moz-border-radius-topright:20px; border-top-right-radius:20px; -webkit-border-bottom-right-radius:20px; -moz-border-radius-bottomright:20px; border-bottom-right-radius:20px; -webkit-border-bottom-left-radius:20px; -moz-border-radius-bottomleft:20px; border-bottom-left-radius:20px; text-indent:0; border:1px solid #469df5; display:inline-block; color:#ffffff; font-family:Arial; font-size:55px; font-weight:bold; font-style:normal; height:150px; line-height:50px; width:90%; text-decoration:none; text-align:center; text-shadow:1px 1px 0px #287ace; } .button_one:hover { background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #4197ee), color-stop(1, #79bbff) ); background:-moz-linear-gradient( center top, #4197ee 5%, #79bbff 100% ); filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#4197ee', endColorstr='#79bbff'); background-color:#4197ee; }.button_one:active { position:relative; top:1px; } .button_two { -moz-box-shadow:inset 0px 1px 0px 0px #f29c93; -webkit-box-shadow:inset 0px 1px 0px 0px #f29c93; box-shadow:inset 0px 1px 0px 0px #f29c93; background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #fe1a00), color-stop(1, #ce0100) ); background:-moz-linear-gradient( center top, #fe1a00 5%, #ce0100 100% ); filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fe1a00', endColorstr='#ce0100'); background-color:#fe1a00; -webkit-border-top-left-radius:20px; -moz-border-radius-topleft:20px; border-top-left-radius:20px; -webkit-border-top-right-radius:20px; -moz-border-radius-topright:20px; border-top-right-radius:20px; -webkit-border-bottom-right-radius:20px; -moz-border-radius-bottomright:20px; border-bottom-right-radius:20px; -webkit-border-bottom-left-radius:20px; -moz-border-radius-bottomleft:20px; border-bottom-left-radius:20px; text-indent:0; border:1px solid #d83526; display:inline-block; color:#ffffff; font-family:Arial; font-size:55px; font-weight:bold; font-style:normal; height:150px; line-height:50px; width:90%; text-decoration:none; text-align:center; text-shadow:1px 1px 0px #b23e35; } .button_two:hover { background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #ce0100), color-stop(1, #fe1a00) ); background:-moz-linear-gradient( center top, #ce0100 5%, #fe1a00 100% ); filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ce0100', endColorstr='#fe1a00'); background-color:#ce0100; }.button_two:active { position:relative; top:1px; } .imglink{ border:0px solid white; }

Dold text

Edit: La in kudos till mr2clean för den eminenta css filen.
Edit 2: Städade php-filen lite

Visa signatur

C2D E6300 @ 3.2HGz 1.2V | Thermalright 120 Extr. | Gainward 8800 GT Golden Sample |Samsung 2x500Gb | Corsair VX 550V | Antec P182 [img]http://valid.x86-secret.com/cache/banner/421648.png[/img]

Permalänk
Medlem

TACK! Ska testa den så snart jag får tid!