http://www.abyz.co.uk/rpi/pigpio/
Example Python interface hardware raspberry pi
วันเสาร์ที่ 28 กุมภาพันธ์ พ.ศ. 2558
[CENTER]Welcome to the Internet of Things
[/CENTER]
When we first talked about the Raspberry Pi and what it is, we saw that the GPIO (General Purpose Input Output) capabilities made it into more than just a board you can run a small server or desktop from. It's an extensible and powerful controller that's fairly easy to program and a lot of fun. The Pi is your gateway to your own Internet of Things, and we're going to have a look at how you can get started.
We're going to be using several different programming languages (Python, HTML, CSS, and Javascript) but don't worry — we're starting slow and I'm going to walk you through every line of code you see. The heavy lifting is done by a pre-built framework called WebIOPi, which we'll setup to run on your Pi and serve a web app to control our project with a bit of configuration. For something to control, we'll start small and use an LED (or 5). LEDs are great because they are cheap, portable, and everyone likes blinky things. But anything that can be controlled with a 3.3v control circuit (using relays or optocouplers) will work the same way. I'm using these methods to control an auto-dosing pump for my aquarium, and this is a good basis for something like a christmas light controller.
The things you'll need:- A Raspberry Pi set up with Raspbian, connected to your local network, and running an SSH server. This will get you set up
- Read our introduction to GPIO control with Python tutorial
- At least one LED
- At least one 200 or 330 Ohm resistor
- A method to wire it together. Now would be a good time to buy a solderless bread board, a breakout cobbler and some jumpers. Adafruit or Sparkfun or even Amazon has everything you need.
- Windows users should install Notepad++ to write their Python code. Don't use Notepad, because it does not use UNIX line breaks and your program won't run.
- Mac users should install TextWrangler from the Mac app store.
- Linux users can use whatever notepad app they like.
- A copy of Filezilla or other app that will let you use SCP to copy files to and from your Pi
[CENTER][/CENTER]05-24-2014, 03:41 PM #2[CENTER]Wiring up your LED(s)
[/CENTER]
[NOTE]Make sure you're read the introduction to controlling the GPIO pins post. It's a more in-depth version with some background of how the GPIO pins work. It also has a handy chart to tell you which pins are which, and their naming conventions.[/NOTE]
In the pictures above, I've used a small solderless bread board stuck to the top of my RPi enclosure and some male to female jumpers to get the GPIO signal from the header (the pins on the board itself) to the holes in the bread board. I did it this way because I want to use a string of UV LEDs and mount it to the back of my TV to give an eerie purple glow when I'm watching Game of Thrones reruns. My Internet of Things may not be your Internet of Things, and you can use any method you like. The only thing to keep in mind is that the components have bare metal legs, and can short out easily. It's very low voltage and under a very low load, so it's likely not going to hurt you, but it can make everything go pop or potentially start a fire. If you have questions about your wiring method, ask them and we'll figure it out.
Whatever you plan to do, I recommend you start small and prototype with one LED and one circuit on your desk. Once you get that working, a little copy paste magic and some editing can extend things from there.
The remainder of this tutorial is set up for you to have one LED circuit wired to GPIO 17.
[CENTER]Circuit diagram
[/CENTER]
With the Pi turned OFF:- Connect GPIO 17 to the positive anode (the longer leg coming out of the bottom) of your LED
- Connect the negative cathode (the shorter leg) to one end of your resistor
- Connect the other end of your resistor to ground at physical pin 6 of the GPIO
Make sure you realize the difference between GPIO 17 and physical pin number 17. GPIO 17 is pin 11 on the header itself. SEE THE HANDY CHART. If you have any questions about this, ask them. We're here to help
Once you have everything wired up and connected well — you can use a continuity tester to check your connections if you're not sure — turn on your Pi. We've got some software to install!05-24-2014, 03:41 PM #3[CENTER]Software installation
[/CENTER]
We need to have our Pi set up to use Python to communicate with the GPIO pins, and free up some resources since we're running a server and not a GUI. Finally, we need to install and configure the WebIOPi framework. Let's go through each step.
Freeing RAM from the GPU
SSH into your Pi now that it's up and running. During the initial set up we talked about the Memory Split that tells the Pi how much RAM to reserve for the GPU. We're going to free some of that up to make sure we have plenty for our headless server. this step is optional, because there won't be a lot of load on our server, but it's a good practice to remember.
At the command prompt, enter this to open the configuration utility:Code:sudo raspi-config
[CENTER][/CENTER]
Set the number on the second line to 16 as shown. This allows the system to use the rest of the RAM for computation and overhead — a very good thing on any server.
Use the tab key on your keyboard choose OK. This will put you back on the configuration menu. Use the tab key to choose Finish, choose Yes to reboot. When the Pi has rebooted, SSH back in and we'll continue.
Install Python pre-requisitesCode:sudo apt-get update sudo apt-get install python-dev sudo apt-get install python-rpi.gpio
Installing the WebIOPi framework
The GPIO pins can only be accessed via Python as the root user — this is why every time you run a Python script to make them do something, you need to append sudo to it. It's another of those security things. We could edit some permissions (chwon /dev/mem for those that just have to know) and let normal users control the pins with Python, but breaking security — even on a board that only sits on your desk isolated from the outside world — is not a good thing to do.
Because we need to run things as root, a standard webserver/php/cgi setup to run scripts via the network just won't work. You could write a daemon which runs as a user which has been granted access to /dev/mem and pipe things back and forth, but that's a LOT of work. Luckily, there is a ready-made framework that handles all this and more called WebIOPi.
You won't find it in your package manager, but installing it is still pretty easy.
Make sure you're in your home folder:Code:cd ~
Code:wget http://sourceforge.net/projects/webiopi/files/WebIOPi-0.7.0.tar.gz
Code:tar -xvzf WebIOPi-0.7.0.tar.gz
Code:cd WebIOPi-0.7.0/
Code:sudo ./setup.sh
Code:sudo webiopi -d -c /etc/webiopi/config
After you've blinked your LED a few times and explored things, go back to your SSH window and quit the service with CTRL+C and you're back at your command prompt.
Now it's time to interface with the webiopi service, and build a web app.05-24-2014, 03:41 PM #4[CENTER]Building a web app interface
[/CENTER]
Here, we're going to edit the default configuration of the webiopi service, and add our own code to run when it's called. You'll be editing files on your computer and moving them over to the Pi using an SCP client. I suggest you use Filezilla, but any SCP client will work.
Copying files back and forth from your computer to your Pi
If you're using Filezilla (most FTP/SFTP/SCP clients are similar if you're using something different) setting it up is easy. Open it on your computer, and use the URL sftp://YOUR.PI.IP.ADDRESS; your Pi username and password; port 22 then press the quickconnect button.
[CENTER][/CENTER]
You'll see your computers files on the left, and the Raspberry Pi's files on the left. Click a folder to open it. Click the two dots (..) next to the folder icon at the top of the list to move up one level. Drag files from one pane to the other to transfer them. Now you can edit the code on your computer, then transfer the files to your Pi easily.
Create your project folder
Before we move any files, we have to have somewhere to move them. Let's build a project skeleton on our Pi. From the command prompt, do this to make sure you're in your home folder:Code:cd ~
Code:mkdir Projects
Code:mkdir Projects/Webio
Code:cd Projects/Webio
Code:mkdir html
Code:mkdir html/img mkdir html/scripts mkdir html/styles
[CENTER][/CENTER]
Of course your username and machine name will be different.
Let's try Filezilla and copy over the image file we use for a background in our app!- Download the LED-icon.png file attached to this post.
- Open Filezilla and log in to your Pi
- Find the LED-icon.png file you downloaded to your computer in the left pane of the window
- In the right pane, navigate to /home/username/Projects/Webio/html/img
- Drag the LED-icon.png file from the left pane to the right.
- $profit.
The javascriptCode:webiopi().ready(function() { webiopi().setFunction(17,"out"); var content, button; content = $("#content"); button = webiopi().createGPIOButton(17,"My LED"); content.append(button); });
webiopi().ready(function() — This says when the webiopi service is ready, this is the function we want to be created and started.
webiopi().setFunction(17,"out") — We want the webio service to send a command to set GPIO 17 as an output, because we'll be sending signals out to it.
var content, button — Set a variable named content, and make it a button.
content = $("#content") — The content variable is also going to be defined in our css and html files as #content. When we refer to #content in our html or css, we want the webiopi framework to create what is defined with the content variable.
button = webiopi().createGPIOButton(17,"My LED") — The button we want to create is a GPIO button (webiopi can make other kinds, for our purposes we want a GPIO interface) that controls GPIO 17 and has the label My LED.
content.append(button) — Append this code for a button to any other code for other buttons. You can make more than one button using the same variables and same definition in CSS, which is handy when you're writing out your CSS and HTML. The webiopi framework will create them in the order they are listed in this file. We're using one to keep things simple.
The brackets, parentheses, quotes and semi-colons are part of the javascript language, and tells the js interpreter in a browser where one command ends and another begins. Be sure to copy it exactly as written, including the indentation. Save the file as bacon.js so it works in our html.
When you have this file created and saved on your computer, copy it to Projects/Webio/html/scripts with Filezilla.
The CSSCode:body { background-color:#000000; background-image:url('/img/LED-icon.png'); background-repeat:no-repeat; background-position:center; background-size:cover; font: bold 18px/25px Arial, sans-serif; color:LightGray; } button { display: block; position: relative; margin: 10px; padding: 0 10px; text-align: center; text-decoration: none; width: 130px; height: 40px; font: bold 18px/25px Arial, sans-serif; color: black; text-shadow: 1px 1px 1px rgba(255,255,255, .22); -webkit-border-radius: 30px; -moz-border-radius: 30px; border-radius: 30px; -webkit-box-shadow: 1px 1px 1px rgba(0,0,0, .29), inset 1px 1px 1px rgba(255,255,255, .44); -moz-box-shadow: 1px 1px 1px rgba(0,0,0, .29), inset 1px 1px 1px rgba(255,255,255, .44); box-shadow: 1px 1px 1px rgba(0,0,0, .29), inset 1px 1px 1px rgba(255,255,255, .44); -webkit-transition: all 0.15s ease; -moz-transition: all 0.15s ease; -o-transition: all 0.15s ease; -ms-transition: all 0.15s ease; transition: all 0.15s ease; } input[type="range"] { display: block; width: 160px; height: 45px; } #gpio17.LOW { background-color: Gray; color: Black; } #gpio17.HIGH { background-color: Blue; color: LightGray; }
The body block — this tells the browser engine to draw a page that's all black, use the LED-icon.png file in the /img folder as the background (centered and stretched to cover the screen without tiling), and use a light gray 18 point bold Arial font for any words written on the page that aren't styled themselves. As a fallback if the user does not have an Arial font defined, we can use a san-serif font at 25 points.
The button block — This tells the browser engine to display a button that's 130 pixels wide and 40 pixels tall. It's a block and not inline, so each button needs to be on its own line. It also defines a little margin around the button and gives some external padding in case we position it right against something. It tells it to use the same font and style as the body block, but use black instead of light grey. It also has a few extras for text shadow and button shadow, as well as a slight transition effect so it looks pretty when we press it. Notice that these need defined separately for webkit (Chrome, Safari and new versions of Opera), Firefox, Internet Explorer and old versions of Opera. YOU NEVER KNOW WHAT BROWSER THE USER IS USING. It's telling that writing the CSS was the most complicated part of this whole tutorial. CSS is a huge PITA. But a powerful one.
The input type block — The webiopi service wants this to tell it that this button is an input to the service.
The #gpio.17 high and low blocks — The webiopi service will change the button and font color based on whether GPIO 17 is HIGH (on) or LOW (off). All we have to do define the colors, and when the state changes webiopi triggers the switch.
Indentation isn't as important in a css file, but the brackets and all the punctuation marks are. Copy this file exactly as it is written to your editor, and save it as bacon.css so it works with our html. When done, copy it to the Projects/Webio/html/styles folder on your Pi.
The htmlWhy is this a picture and not something I can copy and paste? U SUCK HILDENBRAND!!!
Security reasons keep us from uploading any and all raw html to the forums. This is what we do to keep everyone safe. You can download a plain-text version that's attached to this post as index.txt. Change the extension to .html and you're good to go.
Compared to the css, this is simple. There are some things worth talking about, so let's talk about it.
In the head section, you have a couple interesting lines:Code:meta name="mobile-web-app-capable" content="yes" meta name="viewport" content = "height = device-height, width = device-width, user-scalable = no" link rel="shortcut icon" sizes="196x196" href="/img/LED-icon.png"
The second line says that this should be displayed at the width and height of a mobile device's screen and not be resizable.
The final line tells the OS what icon to use if you make a web app shortcut.
[CENTER][/CENTER]
Or use a webview container and actually build a stand-alone app (easy and free to do on Android — I love sideloading)
[CENTER][/CENTER]
Also in the head section are the lines that tell the browser where to find assets to build the page:Code:script type="text/javascript" src="/webiopi.js" script type="text/javascript" src="/scripts/bacon.js" link rel="stylesheet" type="text/css" href="/styles/bacon.css"
The next two lines tell the browser where to look for our own javascript and the css to draw the page. If you used the same Project folder layout as i did, this works as-is. If you changed anything, you'll need to adjust the path accordingly.
The body section is super simple. All the break tags (/br) are so the button is in the position I like it in. Add or remove break tags to move it up and down on the page. You could use css to position it, but this is an easy hack. These two lines do the work:
Again, a picture. You know the drill ...
The first line here tells your browser to display the content div (we defined that in our javascript) and align it in the center of the page. This can be one button, or 100 buttons — it's all handled in the javascript.
The next line tells the browser what to print, and to also put it center justified. You can change this text if you hate bacon, and god help your soul.
Once you have this file all written up in your editor, save it as index.html. Then copy it to your Projects/Webio/html folder on your Pi. Note this is in the top level of the html folder, not in a sub folder. It should look like this:
Bonus Round
Attached to this post is a zip file named html.zip. If you peek inside, you'll find the html folder from my own project that uses 5 LEDs versus just one, as pictured at the top of the page. Notice the differences in the javascript and css, but notice the html is unchanged. To use it as it is, just wire up LEDs to GPIO 17, 18, 22, 23 and 24.
I told you that was fairly easy.05-24-2014, 03:41 PM #5[CENTER]Starting the WebIOPi service
[/CENTER]
All that's left to do is edit the default webiopi service config, and fire it up. This is all done in your SSH window, and is the easy part. I like the easy parts.
The password
The default username and password for the webiopi service is webiopi:raspberry . You have two options here — change it, or just get rid of the login altogether. I opted to remove the password completely. I've removed the default pi user account (changing the password is just as safe) and webiopi has no system-wide root permissions. Even with my little app exposed to the internet, I'm confident that nobody will try hard enough to get in, and if they do, they won't find anything important. They can just mess with my lighting behind the TV. Yes, this is the very definition of insecure, but in this one case I don't care because there is nothing on the machine worth caring about. Always consider the stored data on any server that you expose to the world, and decide from there how secure it has to be. /rant
To change the password:
The webiopi service uses an encrypted file to store login. You can't just edit it by hand, but there's an included tool to recreate it.Code:sudo webiopi-passwd
To get rid of the password requirement:Code:sudo mv /etc/webiopi/passwd /etc/webiopi/passwdOLD
Choose wisely.
Edit the default configuration
By default the webiopi service looks for the user generated code in /home/username/WebIOPi/htdocs . That whole folder is worth exploring, but for all our work to show up we need to point it in the right direction.
Edit the configuration file with nano, as root:Code:sudo nano /etc/webiopi/config
Code:[HTTP] # HTTP Server configuration enabled = true port = 8000 # File containing sha256(base64("user:password")) # Use webiopi-passwd command to generate it passwd-file = /etc/webiopi/passwd # Change login prompt message prompt = "WebIOPi" # Use doc-root to change default HTML and resource files location #doc-root = /home/pi/webiopi/examples/scripts/macros doc-root = /home/gbhil/Projects/Webio/html # Use welcome-file to change the default "Welcome" file #welcome-file = index.html #————————————————————————————————————#
Code:doc-root = /home/pi/Projects/Webio/html
You can also change the default port from 8000 if you need to. You probably don't if you're not running any other servers on your Pi.
Save and exit nano by typing CRTL+X, sat Y that you DO want to save the file, and use the location that pops up by pressing enter. You're now ready to fire this bad boy up.
Starting the service with debugging at the console
Until you know everything works, you will want to run the service with debugging enabled and logging to the console. To do this, run the following in your terminal:Code:sudo webiopi -d -c /etc/webiopi/config
Starting webiopi as a proper service
Once you have everything working the way you want it to work, you can have webiopi start as a background service. You'll still have log files written in /var/log when errors occur, but your console will be free and you'll get less verbosity while it runs. To do this:Code:sudo /etc/init.d/webiopi start
Code:sudo /etc/init.d/webiopi status
Code:sudo /etc/init.d/webiopi stop
Code:sudo /etc/init.d/webiopi restart
Code:sudo update-rc.d webiopi defaults
Code:sudo update-rc.d webiopi remove
[CENTER][/CENTER]
This isn't very fun unless you can connect to it and control things, right? RIGHT? That's the best and easiest part.
Grab a web browser. It could be on your computer, or your tablet or your phone. Crummy old BREW java browsers probably won't work, but anything "modern" should. Enter the IP address of your Pi (the same one you use for SSH) followed by the port to talk to:Code:http://192.168.1.39:8000
If you're the type of person who builds apps, use this same address in your webview container.
To put your web app out in the Internet, you only have to enable port forwarding for port 8000 to the IP address of your Pi in your router settings, and use your external IP to connect instead of your internal IP. See the documentation for your router to get this sorted.
That's it! You now have your own little Internet of Things going on. Remember, LEDs are just the beginning. Be sure to change the look and feel of the web page once you have a handle on how all this works, and by all means show us screenshots!
ref: http://forums.connectedly.com/raspberry-pi-f179/how-controlling-gpio-pins-via-internet-2884/
สมัครสมาชิก:
บทความ (Atom)