极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15807|回复: 6

RPI向小车迈进02:ocrobot motor shield 电机控制实验

[复制链接]
发表于 2014-2-18 11:36:20 | 显示全部楼层 |阅读模式
本帖最后由 wing 于 2014-2-18 21:14 编辑

本次实验的目的的是用web服务去控制电机的转速.

根据"xukai871105 "的提议,我决定加入 ajax 和 html5 这些比较潮流的前端技术来吸引你们的眼球。

也是基本这个原因,不是所有的浏览器都能支持本次实验。


以下浏览器是被测试过可以支持本次实验的:

1. IE10,然而IE系列的默认range样式都很丑陋,所以这里就不贴IE的效果图了。另外相信IE11也可以支持本次实验

2. Raspbian默认预装的Midori,这个发现令我觉得非常惊奇,想不到这种轻量级的浏览器也能提供这么好的支持


3. 安卓版的Chrome 31.0,
遗憾的是android 4.0的默认浏览器是不支持的,
传说中的国产神器 uc 8.3 也没能很好地支持本次实验所用的range类型,
迫于无奈只能装个安卓版的Chrome,视频中的控制端就是使用安卓平板的chrome

开发环境还是qtcreator,控制库还是wiringPi,
这两个东西的介绍可以参阅前面的笔记:RPI向小车迈进01:结合web服务的GPIO实验


工程文件
  1. TEMPLATE = app
  2. CONFIG += console
  3. CONFIG -= qt

  4. SOURCES += main.c

  5. LIBS += -lwiringPi -lpthread
复制代码
其中要注意的是必须在工程文件中加入 -lwiringPi -lpthread 这两个库的编译链接


主程序main.c
  1. #include<sys/socket.h>
  2. #include<errno.h>
  3. #include<netinet/in.h>
  4. #include<string.h>
  5. #include<stdio.h>
  6. #include<wiringPi.h>
  7. #include<softPwm.h>

  8. #define BUF_LEN 1028
  9. #define SERVER_PORT 8001
  10. #define pinNumber 7


  11. //200成功的头部信息
  12. const static char http_head_ok[] = "HTTP/1.1 200 OK\r\nContent-type: text/html\r\n\r\n";
  13. //控制页面 AJAX+HTML5
  14. const static char http_doc[] =
  15. "<html><head>"
  16. "<title>gpio_pwm_led</title>"
  17. "<style type="text/css">"
  18. "input.vertical { -webkit-appearance: slider-vertical; writing-mode: bt-lr; width:100px; height:400px; }"
  19. "</style>"
  20. "<script type="text/javascript">\r\n"
  21. "function myRange_on_mouseup(){\r\n"
  22. "var xmlhttp;\r\n"
  23. "xmlhttp=new XMLHttpRequest();\r\n"
  24. "xmlhttp.open("GET","http://192.168.1.21:8001/"+document.getElementById("myRange").value,true);\r\n"
  25. "xmlhttp.send();\r\n}\r\n"
  26. "</script>"
  27. "</head><body>"
  28. "<input type="range" min="0" max="100" value="50" class="vertical" ontouchend="myRange_on_mouseup()" onmouseup="myRange_on_mouseup()" id="myRange" />"
  29. "</body></html>";



  30. const static char http_OK[] ="OK";

  31. int level;

  32. //解析到HTTP请求的文件后,发送相应的网页信息
  33. int http_send_file(char *filename, int sockfd)
  34. {
  35.     if(strcmp(filename, "/doc.act")==0){
  36.         //返回控制页面
  37.         write(sockfd, http_head_ok, strlen(http_head_ok));
  38.         write(sockfd, http_doc, strlen(http_doc));
  39.     }
  40.     else{
  41.          //改变亮度
  42.         int level_new;
  43.         level_new=atoi(filename+1);
  44.         level=level_new;
  45.         printf("%s\n",filename);
  46.         printf("%d\n",level);
  47.         softPwmWrite(pinNumber,level);
  48.         write(sockfd, http_head_ok, strlen(http_head_ok));
  49.         write(sockfd, http_OK, strlen(http_OK));
  50.     }
  51.   return 0;
  52. }

  53. //HTTP请求解析
  54. void serve(int sockfd){
  55.     char buf[BUF_LEN];
  56.     read(sockfd, buf, BUF_LEN);
  57.     if(!strncmp(buf, "GET", 3)){
  58.         char *file = buf + 4;
  59.         char *space = strchr(file, ' ');
  60.         *space = '\0';
  61.         http_send_file(file, sockfd);
  62.     }
  63. }

  64. void main(){
  65.     //初始化wiringPi
  66.     if (-1 == wiringPiSetup()) {
  67.         return;
  68.     }
  69.     //默认输出全空
  70.     softPwmCreate(pinNumber,0,100);
  71.     level=0;
  72.     softPwmWrite(pinNumber,level);

  73.     int sockfd,err,newfd;
  74.     struct sockaddr_in addr;
  75.     //建立TCP套接字
  76.     sockfd = socket(AF_INET, SOCK_STREAM, 0);
  77.     if(sockfd < 0){
  78.         return;
  79.     }
  80.     memset(&addr, 0, sizeof(addr));
  81.     addr.sin_family = AF_INET;
  82.     //这里要注意,端口号一定要使用htons先转化为网络字节序,否则绑定的实际端口
  83.     addr.sin_port = htons(SERVER_PORT);
  84.     addr.sin_addr.s_addr = INADDR_ANY;
  85.     if(bind(sockfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_in))){
  86.         return;
  87.     }
  88.     listen(sockfd, 128);
  89.     while(1){
  90.         //不间断接收HTTP请求并处理,这里使用单线程
  91.         newfd = accept(sockfd, NULL, NULL);
  92.         serve(newfd);
  93.         close(newfd);
  94.     }
  95. }
复制代码
程序编译之后要以root身份运行


好了,程序方面介绍完毕了,下面说下硬件设备和接线:

本次使用的电机控制板是OCROBOT Motor Shield


关于这个控制板的详细介绍请参阅权威介绍:使用ocrobot motor shield 电机驱动板的简易说明

电机是常用的小车套件


传说中这种电机器的电压是3~6v的,
不过在实际测试中发现4枚AA充电(大约5V)是不能驱动 ocrobot motor shield 的,
后来加到8枚 ocrobot motor shield 才可以正常工作.

接线方式:

电机板 VIN -> 电池正极
电机板 GND -> 电池负极

电机板 -B -> 电机
电机板 +B -> 电机

电机板 GND -> RPI ground
电机板 D13 -> RPI ground
电机板 D8 -> RPI ground

电机板 D11 -> RPI GPIO 7


效果视频 1


效果视频 2


本帖子中包含更多资源

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

x
回复

使用道具 举报

 楼主| 发表于 2014-2-19 16:30:23 | 显示全部楼层

没人回 , RPI版好冷清.....
好歹我也用了ocrobot的模块 , 强强和毅毅不来顶两下么?
回复 支持 反对

使用道具 举报

发表于 2014-2-20 19:04:55 | 显示全部楼层
。。。。。。版块冷清,来顶贴~
回复 支持 反对

使用道具 举报

发表于 2014-2-21 09:14:44 | 显示全部楼层
认真看了一下,你的方法我还真的没有用过!学习一下!

我是在树莓派中借助apache2,通过jquery使用的ajax。

呵呵,不过楼主这样做也是一个很好的方法,开阔一下思路,了解ajax的本质!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-21 14:43:02 | 显示全部楼层
感谢回复,
相信下一帖就会见到我的小车了
回复 支持 反对

使用道具 举报

发表于 2014-3-3 23:59:27 | 显示全部楼层
楼主你的平板LINUX系统?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-4 09:44:27 | 显示全部楼层
for 发表于 2014-3-3 23:59
楼主你的平板LINUX系统?

是的,
上面的程序是在Raspbian上跑的
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-26 12:26 , Processed in 0.044014 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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