[开源硬件] 【Lemaker Guitar】GPIO点亮LED灯管+WEB控制,最详细教程

[复制链接]
 楼主| 312976625 发表于 2016-5-13 22:41 | 显示全部楼层 |阅读模式
写在前面:为什么说是最详细的教程呢,首先说明我并不是电子技术专业的,所以我会站在最小白的角度去讲解实现方法,既然是小白方式,肯定有不专业的地方,欢迎指正!
但我做的例子肯定是经过我测试通过的。

录了一段视频放上来


通过网页远程控制,视频 http://v.youku.com/v_show/id_XMTU2OTA5NzIxMg==.html

一共分为四个方面操作:
1,在Guitar开发板上搭建软件环境,安装Git和WiringLMK
2,设计硬件电路
3,用C语言写一个程序,驱动LED的亮和灭
4,通过PHP实现在网页上控制LED灯(非必须)

做实验所需准备的材料:
1,Lemaker Guitar 开发板一块
2,面包板一块
3,1K欧电阻一个
4,LED灯管 5mm 一个
5,杜邦线,公对母2根,公对公1根


以下所有的操作,除电路设计外,软件安装和配置都是在Lemaker Guitar开发板上的Linux系统上进行

【软件安装】
Git
  1. sudo apt-get install git
WiringLMK
  1. git clone https: //github.com/LeMaker/WiringLMK.git
  2. cd WiringLMK
  3. chmod +x ./build
  4. sudo ./build
注意请把 git clone https: //github.com/LeMaker/WiringLMK.git这句中的http:后边的一个空格去掉,因为我当前的权限不能发URL,太不方便了,@小喇叭

【设计硬件电路】

面包板用法:面包板旁边竖着的两排接vcc和gnd是竖向导通,中间的横排插口是横向导通的。





LED灯管的正负极识别


串联一个1K欧的电阻,和LED的正极引脚相连


将LED的负极引脚接地


开发板上电后


再来一张GPIO的引脚图,我标记了我接线的IO口

到这里我们的电路就接好了,接下来就是写程序驱动11号IO口高低电平的切换输出。



【程序开发】
新建并编辑gpio.c文件,写入下面的程序源码到gpio.c文件中。
  1. #include <stdio.h>
  2. #include <wiringPi.h>

  3. //程序默认操作引脚编号为11号的IO口的电平
  4. #define PIN 11

  5. int main(int argc,char *argv[])
  6. {
  7.         int pin;

  8.         //如果用户没有输入参数
  9.         if(argc == 1)
  10.         {
  11.                 //选用默认的PIN脚
  12.                 pin = PIN;
  13.         }
  14.         else
  15.         {
  16.                 //选用用户指定的PIN脚
  17.                 pin = atoi(argv[1]);
  18.         }

  19.         
  20.         /**
  21.            初始化WiringLMK库,官方提供了4种初始化的方式,每种方式对引脚的定义不同
  22.            本例为了简单,选用了按引脚的物理排列顺序访问的方式进行初始化
  23.            int wiringPiSetup (void) ;
  24.            int wiringPiSetupGpio (void) ;
  25.            int wiringPiSetupPhys (void) ; 与物理管脚号一致
  26.            int wiringPiSetupSys (void) ;
  27.            其他初始化方式的说明请查看wiki文档,这里不在说明
  28.         */
  29.         if(wiringPiSetupPhys() == -1)
  30.         {
  31.                 puts("wiringPi setup error");
  32.                 return -1;
  33.         }
  34.         puts("wiringPi setup ok");
  35.         

  36.         //读取pin脚的电平状态
  37.         int pinState = digitalRead(pin);
  38.         if(pinState)
  39.         {
  40.                 //如果当前状态是高电平
  41.                 //将pin脚设置为低电平
  42.                 pinMode(pin,OUTPUT);
  43.                 digitalWrite(pin,LOW);
  44.                 printf("PIN %d LOW\n",pin);
  45.         }
  46.         else
  47.         {
  48.                 //如果当前状态是低电平
  49.                 //将pin脚设置未低电平
  50.                 pinMode(pin,OUTPUT);
  51.                 digitalWrite(pin,HIGH);
  52.                 printf("PIN %d HIGH",pin);
  53.         }
  54.         return 0;
  55. }
编译源代码,生成二进制程序
cd到gpio.c源文件所在的目录
gcc -o gpio -lwiringPi gpio.c
解释:
-o 指定编译后生成的可执行程序的文件路径,只写文件名就生成在当前目录下
-lwiringPi 因为程序使用了wiringPi的库,这个参数是指定连接程序的时候和wiringPi库进行连接,(WiringLMK本身就是在wiringPi的基础上实现的)
gpio.c  要参与编译的源文件
编译后生成gpio可执行程序,这个时候就可以运行该程序看看LED是否亮起来。

需要使用系统最高权限执行
  1. sudo ./gpio
或者可以在程序后面给参数,指定要操作的IO口(注意不要选接地(GND)和VCC的引脚编号)
  1. sudo ./gpio 11

当11号IO口为高电平时,LED灯管是发光状态。(前面的图是提前拍的白色的LED,这张图是一个蓝色的LED,都是一样的)


到目前为止LED已经能够驱动了,下面通过PHP程序调用我们刚刚写好的程序,实现在网页上控制。


【PHP网页控制】


安装Apache2
  1. sudo apt-get install apache2
安装PHP5
  1. sudo apt-get install php5

在/var/www/html目录下创建test.php
  1. cd /var/www/html
  2. sudo vim test.php
test.php为测试php环境的文件,输入以下内容
  1. <?php
  2. phpinfo();
  3. ?>
打开浏览器 输入http: // 192.168.0.102 / test.php(注意去空格)(192.168.0.102是我开发板的IP
如果看到下图表示php的环境已经搭建好,再继续下面的步骤(注意,下图是我在公司截的是php7.0的环境,咱们安装的是php5.x,只要能看见这个信息页面就已经表示php已经和apache集成好了)


需要的程序:gpio(编译好的c程序) gpio.php(php代码)
复制gpio可执行程序和gpio.php都复制到站点根目录
编辑gpio.php,输入以下代码
  1. <?php

  2. /**
  3. * 判断客户端的请求是否是POST方式
  4. */
  5. function isPost(){
  6.     return $_SERVER['REQUEST_METHOD'] == 'POST';
  7. }


  8. if(isPost()){
  9.     $pin = array_key_exists('pin',$_POST) && !empty($_POST['pin']) ? $_POST['pin'] : '';
  10.     $pin = (int)$pin;
  11.     if($pin == 0){
  12.         die('pin must be a number');
  13.     }
  14.    //这一行需要编辑 /etc/sudoers 配置文件,下面有说明,visudo命令就是直接编辑该文件的
  15.    $output = shell_exec('sudo ./gpio');
  16. }


  17. ?>

  18. <!DOCTYPE html>
  19. <html>
  20. <head lang="en">
  21.     <meta charset="UTF-8">
  22.     <title>GPIO Control</title>
  23.     <meta http-equiv="pragma" content="no-cache">
  24.     <meta http-equiv="cache-control" content="no-cache">
  25.     <meta http-equiv="expires" content="0">
  26.     <meta name="viewport" content="initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=0">
  27.     <!-- Bootstrap -->
  28.     <link rel="stylesheet" href="http: //cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css">
  29. </head>
  30. <body>
  31. <div class="container">
  32.     <div style="padding:10px;">
  33.         <form action="gpio.php" class="form-inline" method="post">
  34.             <div class="form-group">
  35.                 <div class="input-group">
  36.                     <div class="input-group-addon">PIN</div>
  37.                     <input type="text" class="form-control" id="pin" name="pin" placeholder="请输入有效的PIN引脚号" value="<?=isset($pin) ? $pin : '' ?>">
  38.                 </div>
  39.             </div>
  40.             <button type="submit" class="btn btn-primary">提交</button>
  41.         </form>
  42.     </div>
  43.     <?php if(isset($output)){ ?>
  44.     <div class="alert alert-success" role="alert">
  45.         <strong>程序输出结果:</strong>
  46.         <br/>
  47.         <?=$output ?>
  48.     </div>
  49.     <?php } ?>
  50. </div>
  51. </body>
  52. </html>
注意 http: //cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css,老规矩,去掉http:后面的一个空格

重要的一步

因为wiringPi的程序需要用sudo或者root用户去运行,但是当前PHP的web服务器是用www-data用户运行的,当我们在调用shell_exec('sudo ./gpio')函数时,是没有任何反应的。解决办法:
输入命令
  1. sudo -s
  2. visudo
会出现一个编辑配置文件的页面,
在 root    ALL=(ALL:ALL) ALL 的下面,另起一行,写上 www-data ALL=(ALL:ALL) ALL (表示把www-data用户加入sudo,www-data就支持sudo命令了)
在 %sudo   ALL=(ALL:ALL) ALL 的下面,另起一行,写上 %www-data ALL=(ALL:ALL) NOPASSWD: ALL (表示www-data用户组中的所有sudo操作不需要输入密码)
Ctrl+x,提示保存,输入y,然后回车
上面的两条配置很重要
再执行一条命令
  1. sudo gpasswd -a www-data www-data
之后,www-data 这个用户在执行sudo命令的时候就不需要输入密码了。

Lemaker Guitar 的 IP地址:192.168.0.102
端口:80打开手机浏览器访问 http: // 192。168。0。102/gpio。php (惯例,请自行脑补url)即可打开程序。


















本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

打赏榜单

21ic小喇叭 打赏了 5.00 元 2016-05-17

评分

参与人数 1威望 +1 收起 理由
kqh1120 + 1 很给力!

查看全部评分

 楼主| 312976625 发表于 2016-5-13 22:49 | 显示全部楼层
自己顶一下
michael_llh 发表于 2016-5-13 23:06 | 显示全部楼层
哇,这个真心赞吖!!!感谢分享!对得起标题
 楼主| 312976625 发表于 2016-5-13 23:15 来自手机 | 显示全部楼层
michael_llh 发表于 2016-5-13 23:06
哇,这个真心赞吖!!!感谢分享!对得起标题

谢谢支持,刚刚咯好读了一遍,发现有些地方写的还不够仔细,明天再改改,先在已经躺下了
 楼主| 312976625 发表于 2016-5-14 08:12 | 显示全部楼层
今天补充上搭建 Apache+PHP 的方法吧。
2223445830 发表于 2016-5-14 09:40 | 显示全部楼层
顶!!!
michael_llh 发表于 2016-5-14 11:05 | 显示全部楼层
312976625 发表于 2016-5-13 23:15
谢谢支持,刚刚咯好读了一遍,发现有些地方写的还不够仔细,明天再改改,先在已经躺下了 ...

哈哈,很用心吖,加油加油!
kqh1120 发表于 2016-5-14 11:26 | 显示全部楼层
这个很不错啊。。收藏了
sjqlwy 发表于 2016-5-14 12:38 | 显示全部楼层
这个不错~
 楼主| 312976625 发表于 2016-5-14 14:56 | 显示全部楼层

谢谢支持
 楼主| 312976625 发表于 2016-5-14 14:58 | 显示全部楼层

谢谢支持
michael_llh 发表于 2016-5-14 19:27 | 显示全部楼层
突然想起来,这样有一个问题,只能是内网访问
 楼主| 312976625 发表于 2016-5-14 20:29 | 显示全部楼层
michael_llh 发表于 2016-5-14 19:27
突然想起来,这样有一个问题,只能是内网访问

帖子上用的是的是内网,想外网的话,搭配ngrok使用。
 楼主| 312976625 发表于 2016-5-14 20:31 | 显示全部楼层
michael_llh 发表于 2016-5-14 19:27
突然想起来,这样有一个问题,只能是内网访问

具体的步骤是:apache建立虚拟主机,绑定一个域名,该域名是指向ngrok反向端口映射的域名。详细操作你可以百度下。我成功过,也一直在用这个办法。国内ngrok网站qydev.com
michael_llh 发表于 2016-5-16 14:27 | 显示全部楼层
312976625 发表于 2016-5-14 20:31
具体的步骤是:apache建立虚拟主机,绑定一个域名,该域名是指向ngrok反向端口映射的域名。详细操作你可 ...

好的,谢谢你咯!
 楼主| 312976625 发表于 2016-5-16 15:01 | 显示全部楼层
michael_llh 发表于 2016-5-16 14:27
好的,谢谢你咯!

不客气,多提提意见。
21ic小喇叭 发表于 2016-5-17 08:46 | 显示全部楼层
很走心的测评
tdsxlw 发表于 2016-5-23 19:40 | 显示全部楼层
来学习一下。。。。。。。。。。。
 楼主| 312976625 发表于 2016-5-23 22:02 | 显示全部楼层
tdsxlw 发表于 2016-5-23 19:40
来学习一下。。。。。。。。。。。

请指教
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

49

帖子

2

粉丝
快速回复 返回顶部 返回列表