请选择 进入手机版 | 继续访问电脑版
快捷导航
68 628

智能台灯项目

雨中桐 于 2017-12-22 19:24 发表在 [开源项目] [复制链接]
本帖最后由 雨中桐 于 2018-1-18 18:05 编辑

项目名称:智能台灯

项目成员:雨中桐、嘿嘿嘿、晏慧茹、chonghuang、1761300690、a1783463455

项目整体流程说明:
还有细节问题,待补充。

项目涉及模块及功能:
1.人体红外传感器及光敏传感器
(1)人体红外传感需配合光敏传感器一同使用,首先判断台灯面前是否有人并且判断周围的光照环境。
        (人体红外传感器只对运动中的目标进行检测发现反馈高电平,当用户在台灯前处于静止状态时,人体红外传感器将无法检测到结果。)
(2)另外在灯照前加一个光敏传感器用于记录用户调节的光照强度。

2.调灯旋钮详情
(1)旋钮可进行无限旋转,为用户带来更好的体验。
(2)旋钮的旋转速度决定亮度的变化幅度。
(3)旋钮的旋转方向决定亮度的亮暗变化。

3.信息反馈情况:
(1)无人出现台灯不进行任何操作。
(2)当有人出现但周围光照环境较强,台灯不进行操作。(备注:光照去亮度的范围后期具体补充)
(3)当周围光照强度较弱且有人出现时,进行开灯操作,同时驱动摄像头进行人脸识别,通过调用数据库信息,给出此人之前用过的合适光强,进而调节台灯达到数据库中记录的光照强度。

4.项目总体流程:
开灯事件:
传感器触发事件将台灯以规定亮度打开之后驱动摄像头负责采集数据,将数据送到服务器进行人脸识别得到特征值向量,再与数据库信息进行核对搜索,此处有两种情况:
(1)检索到相同值(即此人用过台灯有记录),将此人数据库中的对应的亮度值发送给MTK7688开发板,驱动继电器进而将亮度改变到用户之前调节的亮度。
(2)当检索不到对应的值时(即此人是第一次使用此台灯),为此人在数据库创建一条记录,此时亮度不做变化。
亮度调节事件:
用户通过旋转数字电位器,可以对台灯亮度进行改变,并且调节完成后会对数据库内容进行刷新,记录用户调节后的亮度。具体流程为,用户旋转数字电位器,触发两个事件:
(1)开发板会进行亮度值(可理解为电压值)的改变,进而调节数字电位器的输出值,通过可控硅对电压进行放大,中间通过继电器将电压传输给灯泡,达到控制灯泡的亮度。
(2)对用户调节的亮度进行记录。具体流程,用户旋转时不做记录,需对用户是否仍在旋转做判断,可以每隔5秒对旋钮进行一次判断,当5秒后旋钮仍在旋转继续延迟5秒判断,当5秒后发现旋钮不在旋转时,继续延迟5秒,如果还处于不旋转可视为调解结束,进而对数据库进行数据刷新,记录用户的调节亮度。
关灯事件:
当红外传感器检测到台灯面前没有人时,直接进行关灯关摄像头操作。

备注:具体细节考虑欠妥,后期逐步完善。

计划工期:
2017.12.25——2018.1.15

需采集设备:
人体红外传感器 X2
光敏传感器 X2
无驱摄像头 X1
数字定位器旋钮 X1
可控硅 X1
继电器 X1
白炽灯(220V) X1

框架图:



流程图:


本项目已开源:
版权使用信息:
    挂载Mozilla许可证协议,使用时需书写版权信息;

开源说明:https://www.mozilla.org/en-US/MPL/
版本信息:
第一版本作品:智能台灯
上传时间:2018/01/18
地点:安徽信息工程学院嵌入式实验室

项目后续完善部分:
1.可控硅控制灯泡时会出现灯泡闪烁情况。
2.行为预测部分还未实现,算法已有初步思路具体可咨询。

咨询指南:
人脸识别部分具体咨询 1761300690 邮箱:xxhxiaxin@gmail.com
数据库及行为预测部分具体咨询 a1783463455 邮箱:tianzhangfei@gmail.com
关于MTK7688开发板问题可咨询以下各位:
PWM驱动、串口及可控硅部分具体咨询 雨中桐 邮箱:13033038001@163.com
数字电位器部分具体咨询 chonghuang 邮箱:chonghuang419@163.com
传感器部分具体咨询 嘿嘿嘿 邮箱:811355413@qq.com
                               晏慧茹 邮箱:1430768401@qq.com

项目已结束,此帖已结。



本帖子中包含更多资源

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

x

点评

赞同: 5.0
anymsg 赞同: 5
  发表于 2018-1-11 09:13
Connecting & Messaging from Any.

共 68 个关于本帖的回复 最后回复于 2018-1-15 13:13

chonghuang 注册会员 发表于 2018-1-15 13:13:04 | 显示全部楼层
2018/1/15:今天项目评审结束,整个项目告一段落
下面是我所做模块中存在的问题:
1、MT7688现在的openwrt固件很多驱动都没有,固件不够完善,它现在有
的只是目前为止我们用到的
2、目前这个板子连不了有线网,初步认为是网口的问题,因为openwrt固件
和之前烧了的板子用的是一样的,那块是可以联网的,所以我们怀疑是板子本
身的问题
3、数字电位器的算法还不够完善,当旋转非常快的时候,捕捉到的次数就不是
实际旋转的次数了,毕竟线程不是中断触发
4、整个项目整体流程逻辑还有待改善
下面是整合后的代码和用到的头文件:

本帖子中包含更多资源

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

x
Connecting & Messaging from Any.
举报 使用道具
a1783463455 注册会员 发表于 2018-1-14 23:35:02 | 显示全部楼层
本帖最后由 a1783463455 于 2018-1-15 23:52 编辑

date:2018_1_14
1.关于断线哪么多天:1.因为之前一直和@1761300690在努力的学习和正常opencv上的人脸识别,之前已经让他帮忙写上去了,但是回过来看还是有点模糊的。2.遇到了很多错,已经总结。当时有点乱没来的急写下。现在把记得全补上吧。
2.遇到以下错误
,看图片即可知道问题。
a.首先整合代码中遇到以下几个问题,首先是opencv的部分,关于如何循环在数组添加图片库。已经解决,具体是抓住头然后接上自己的数据库函数。opencv 流程 初始化图库 把图像每个帧与图片册作为对比。即可
b.弄好这些后写了个多线程,关于tcp服务器,首先记下 windows.h 文件有线程的api 还有,windows 里的itoa 很多人说已经废弃了,改为_itoa_s ,关于strlen函数是显示数组长度,ps不是定义的a[x]的x值,是用的长度
c.关于数据库操作问题,这个很奇葩,带回上截图细说
d.操作系统书很好,阻塞用的 很舒服关于晚上奇葩的错误,早上奇葩的好了,说下感悟吧当一个线程修改的标志是另一个线程的启动条件,若是无法利用event这样的东西可以考虑在那个正要启动的线程中建立阻塞。
3.遗憾点:数据行为分析,整合的时候太耽误时间了,剩下一点小尾巴。
  1. #if 1
  2.     char sql[125];
  3.     int sum_users;
  4.     int max=0;
  5.     int Lot_lamp_power=0;
  6.     int seconed=0;
  7.     int day_ax=0;
  8.     int cc_time=0;
  9.     char max_date[25];
  10.     char min_date[25];
  11.     sprintf(sql,"SELECT COUNT(A_no) FROM t_lamp_user WHERE A_no=%d;",A_no);
  12.     MYSQL_RES *res=executeQuery(sql);
  13.     MYSQL_ROW row;

  14.     unsigned int sum_count;
  15.     unsigned int time_arr[23];

  16.     unsigned int num_fields;
  17.     num_fields = mysql_num_fields(res);

  18.     if (row=mysql_fetch_row(res))
  19.     {
  20.         char *s=row[0];
  21.        sum_count = atoi(s);

  22.         printf("row[0]:%d\n",sum_count);
  23.     }
  24.     printf("此用户的此时间段总使用次数:%d",num_fields);

  25.     // 求出各个时间点的使用次数
  26.     for(unsigned long int i=0;i<24;i++)
  27.     {
  28.         memset(sql,0,strlen(sql));
  29.         sprintf(sql,"SELECT COUNT(*) FROM t_lamp_user WHERE Time=%d;",i);
  30.         if (row=mysql_fetch_row(res))
  31.         {
  32.             char *s=row[0];
  33.             time_arr[i] = atoi(s);
  34.         }
  35.     }
  36.     for(unsigned long i=0;i<24;i++)
  37.     {
  38.         if(time_arr[i]>time_arr[max])
  39.         {
  40.             max=i;
  41.         }

  42.     }
  43.     for(unsigned long i=0;i<24;i++)
  44.     {
  45.         if(time_arr[i]=time_arr[max])
  46.         {
  47.             seconed=i;
  48.         }
  49.     }

  50.     if(time_arr[max]/sum_count>=0.5)
  51.     {
  52.         memset(sql,0,strlen(sql));
  53.         sprintf(sql,"SELECT Lamp_power FROM t_lamp_user  WHERE A_no=%d and Time=%d order by t_lamp_user.Date desc",A_no,max);
  54.         res=executeQuery(sql);
  55.         if (row=mysql_fetch_row(res))
  56.         {
  57.             char *s=row[0];
  58.             Lot_lamp_power=atoi(s);
  59.         }
  60.         memset(sql,0,strlen(sql));
  61.         sprintf(sql,"select Date from t_lamp_user  where  A_no= %d and time =%d order by Date desc;",A_no,max);
  62.         res=executeQuery(sql);
  63.         if (row=mysql_fetch_row(res))
  64.         {
  65.             char *s=row[0];
  66.             strncpy(max_date, s,strlen(s));
  67.         }
  68.         memset(sql,0,strlen(sql));
  69.         sprintf(sql,"select Date from t_lamp_user  where  A_no= %d and time =%d order by Date asc;",A_no,max);
  70.         res=executeQuery(sql);
  71.         if (row=mysql_fetch_row(res))
  72.         {
  73.             char *s=row[0];
  74.             strncpy(min_date, s,strlen(s));
  75.         }

  76.         memset(sql,0,strlen(sql));
  77.         sprintf(sql,"SELECT DATEDIFF('%s','%s');",max_date,min_date);
  78.         res=executeQuery(sql);
  79.         if (row=mysql_fetch_row(res))
  80.         {
  81.             char *s=row[0];
  82.             cc_time=atoi(s);
  83.         }
  84.         memset(sql,0,strlen(sql));
  85.         sprintf(sql,"INSERT INTO t_custom_out (A_no,Lot_time,Lot_Lamp_power,Cc_time)VALUES ('%d','%d','%d','%d');",A_no,max,Lot_lamp_power,cc_time);
  86.         executeNonQuery(sql);
  87.         if(seconed != 0)
  88.         {
  89.             memset(sql,0,strlen(sql));
  90.             sprintf(sql,"SELECT Lamp_power FROM t_lamp_user  WHERE A_no=%d and Time=%d order by t_lamp_user.Date desc",A_no,seconed);
  91.             res=executeQuery(sql);
  92.             if (row=mysql_fetch_row(res))
  93.             {
  94.                 char *s=row[0];
  95.                 Lot_lamp_power=atoi(s);
  96.             }
  97.             memset(sql,0,strlen(sql));
  98.             sprintf(sql,"select Date from t_lamp_user  where  A_no= %d and time =%d order by Date desc;",A_no,seconed);
  99.             res=executeQuery(sql);
  100.             if (row=mysql_fetch_row(res))
  101.             {
  102.                 char *s=row[0];
  103.                 strncpy(max_date, s,strlen(s));
  104.             }
  105.             memset(sql,0,strlen(sql));
  106.             sprintf(sql,"select Date from t_lamp_user  where  A_no= %d and time =%d order by Date asc;",A_no,seconed);
  107.             res=executeQuery(sql);
  108.             if (row=mysql_fetch_row(res))
  109.             {
  110.                 char *s=row[0];
  111.                 strncpy(min_date, s,strlen(s));
  112.             }

  113.             memset(sql,0,strlen(sql));
  114.             sprintf(sql,"SELECT DATEDIFF('%s','%s');",max_date,min_date);
  115.             res=executeQuery(sql);
  116.             if (row=mysql_fetch_row(res))
  117.             {
  118.                 char *s=row[0];
  119.                 day_ax=atoi(s);
  120.             }
  121.             cc_time=time_arr[seconed]/day_ax;
  122.             memset(sql,0,strlen(sql));
  123.             sprintf(sql,"INSERT INTO t_custom_out (A_no,Lot_time,Lot_Lamp_power,Cc_time)VALUES ('%d','%d','%d','%d');",A_no,seconed,Lot_lamp_power,cc_time);
  124.             executeNonQuery(sql);
  125.         }
复制代码
这是上述的小尾巴吧,这段代码已经实现从用户信息表中提取数据分析然后插入到行为预测表,具体思路的最长使用时间段最长使用亮度和一个执行标志(通过使用的次数和日期之差的比值来决定下一个动作的时间到来,如果是1表示此行为是每天都做的可能行较大,大于1的数值代表间此行为间隔几天做的可能性较大,如果小于0则视为1。)注()内为实现。还有一个尾巴是:识别效果有点差,做一个反思:这阶段写项目,感觉学到的东西有点远离本专业了,同时好像敲的有点花里胡哨,但是同时也得到一点启发:现阶段所带来的问题,理论知识很渣,这点应该大于以后实践。而且这学期学的位操作,rtos等等应该在多看看,很多应该都是基础。

本帖子中包含更多资源

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

x
Connecting & Messaging from Any.
举报 使用道具
雨中桐 注册会员 发表于 2018-1-14 23:27:59 | 显示全部楼层
项目结束了,可惜留下一点遗憾。就是可控硅那边控制灯泡时,灯泡闪烁的问题。
上网查了一下,说要进行过零检测,尝试过了貌似没什么效果,可能是我还不太了解什么是过零检测吧。
不过发现了一个可行的方法,就是将pwm信号转化为模拟信号,这个应该靠谱,后期有时间我还会尝试一下。
Connecting & Messaging from Any.
举报 使用道具
1761300690 注册会员 发表于 2018-1-14 23:27:46 | 显示全部楼层
20181/14
今日任务:
将人脸识别与开发板整合,遇到一些问题,首先就是视频卡顿,人脸识别有点延迟,然后就是数据暂时无法插入数据库(ps:之前数据库数据可以插入)
明日计划:
完成项目
Connecting & Messaging from Any.
举报 使用道具
chonghuang 注册会员 发表于 2018-1-14 23:19:44 | 显示全部楼层
2018/1/14:
今日进展:
今天终于把项目整合好了,演示视频也拍了,问题虽然有,但即便功能都实现了
接下来把需要解决的问题列举,待以后解决
代码明天再发
Connecting & Messaging from Any.
举报 使用道具
嘿嘿嘿 注册会员 发表于 2018-1-14 20:22:23 | 显示全部楼层
2018/1/14
1.项目整合
2.编写PPT
Connecting & Messaging from Any.
举报 使用道具
雨中桐 注册会员 发表于 2018-1-14 18:43:20 | 显示全部楼层
pwm测试代码:
sooall_pwm.h头文件
  1.     #ifndef _SOOALL_PWM_H_
  2.     #define _SOOALL_PWM_H_

  3.     /* the source of the clock */
  4.     typedef enum {
  5.     PWM_CLK_100KHZ,
  6.     PWM_CLK_40MHZ
  7.     }PWM_CLK_SRC;

  8.     /* clock div */
  9.     typedef enum {
  10.     PWM_CLI_DIV0 = 0,
  11.     PWM_CLK_DIV2,
  12.     PWM_CLK_DIV4,
  13.     PWM_CLK_DIV8,
  14.     PWM_CLK_DIV16,
  15.     PWM_CLK_DIV32,
  16.     PWM_CLK_DIV64,
  17.     PWM_CLK_DIV128,
  18.     }PWM_CLK_DIV;

  19.     struct pwm_cfg {
  20.     int no;
  21.     PWM_CLK_SRC clksrc;
  22.     PWM_CLK_DIV clkdiv;
  23.     unsigned char idelval;
  24.     unsigned char guardval;
  25.     unsigned short guarddur;
  26.     unsigned short wavenum;
  27.     unsigned short datawidth;
  28.     unsigned short threshold;
  29.     };

  30.     /* ioctl */
  31.     #define PWM_ENABLE 0
  32.     #define PWM_DISABLE 1
  33.     #define PWM_CONFIGURE 2
  34.     #define PWM_GETSNDNUM 3
  35.     #endif




复制代码
pwm_led.c测试文件
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <unistd.h>  
  4. #include <sys/types.h>  
  5. #include <sys/stat.h>  
  6. #include <fcntl.h>  
  7.   
  8. #include "sooall_pwm.h"  
  9.   
  10. #define PWM_DEV "/dev/sooall_pwm"  
  11.   
  12. int main(int argc, char *argv)  
  13. {  
  14.     int ret = -1;  
  15.     int pwm_fd;  
  16.     int pwmno;  
  17.     struct pwm_cfg  cfg;  
  18.   
  19.     pwm_fd = open(PWM_DEV, O_RDWR);  
  20.     if (pwm_fd < 0) {  
  21.         printf("open pwm fd failed\n");  
  22.         return -1;  
  23.     }  
  24.       
  25.     cfg.no        =   0;    /* pwm0 */  
  26.     cfg.clksrc    =   PWM_CLK_40MHZ;   
  27.     cfg.clkdiv    =   PWM_CLK_DIV2;  
  28.     cfg.idelval   =   0;   
  29.     cfg.guardval  =   0;  
  30.     cfg.guarddur  =   0;   
  31.     cfg.wavenum   =   0;  /* forever loop */  
  32.     cfg.datawidth =   1000;  
  33.     cfg.threshold =   500;   
  34.   
  35.     ioctl(pwm_fd, PWM_CONFIGURE, &cfg);   
  36.     ioctl(pwm_fd, PWM_ENABLE, &cfg);  
  37.          
  38.     while (1) {  
  39.         static int cnt = 0;  
  40.         sleep(5);  
  41.         ioctl(pwm_fd, PWM_GETSNDNUM, &cfg);  
  42.         printf("send wave num = %d\n", cfg.wavenum);  
  43.         cnt++;  
  44.         if (cnt == 10) {  
  45.             ioctl(pwm_fd, PWM_DISABLE, &cfg);  
  46.             break;  
  47.         }  
  48.     }  
  49.       
  50.     return 0;  
  51. }
复制代码
但目前还有新问题出现,那就是pwm控制可控硅在控制灯时,灯会时常闪烁。
问题1.pwm频率慢时,电流较稳定,但是。
问题2.pwm频率快时导致可控硅达不到正常电流,灯泡不闪,但是亮度只有在峰值时才变化。






Connecting & Messaging from Any.
举报 使用道具
雨中桐 注册会员 发表于 2018-1-14 18:33:06 | 显示全部楼层
第二部分PWM:
这部分相当麻烦,先看Makefile:
  1. PWD=$(shell pwd)
  2. KERNEL_DIR=/work/openwrt/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7688/linux-3.18.45
  3. TOOLCHAIN="/work/openwrt/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mipsel-openwrt-linux-"

  4. all:  
  5.         make -C $(KERNEL_DIR) ARCH=mips CROSS_COMPILE=$(TOOLCHAIN) M=$(PWD) modules

  6. clean:  
  7.         rm -f *.ko  
  8.         rm -f *.o  
  9.         rm -f *.mod.c  
  10.         rm -f *.mod.o  
  11.         rm -f *.order  
  12.         rm -f *.sysvers

  13. obj-m        +=Mt7688_pwm.o
复制代码
亲试可以用,将pwm驱动生成驱动文件。
pwm驱动:
  1. #include <linux/kernel.h>  
  2. #include <linux/version.h>  
  3. #include <linux/fs.h>  
  4. #include <linux/init.h>  
  5. #include <linux/delay.h>  
  6. #include <linux/irq.h>  
  7. #include <asm/uaccess.h>  
  8. #include <asm/irq.h>  
  9. #include <asm/io.h>  
  10. #include <linux/module.h>  
  11. #include <linux/device.h>           
  12. #include <linux/cdev.h>  
  13. #include <linux/interrupt.h>   
  14. #include <linux/sched.h>  
  15. #include <linux/wait.h>  
  16. #include <linux/poll.h>     
  17. #include <linux/fcntl.h>  
  18. #include <linux/spinlock.h>  

  19. #ifndef _SOOALL_PWM_H_  
  20. #define _SOOALL_PWM_H_  

  21. /* the source of the clock */  
  22. typedef enum {  
  23.     PWM_CLK_100KHZ,   
  24.     PWM_CLK_40MHZ  
  25. }PWM_CLK_SRC;  

  26. /* clock div */  
  27. typedef enum {  
  28.     PWM_CLI_DIV0 = 0,  
  29.     PWM_CLK_DIV2,  
  30.     PWM_CLK_DIV4,  
  31.     PWM_CLK_DIV8,  
  32.     PWM_CLK_DIV16,  
  33.     PWM_CLK_DIV32,  
  34.     PWM_CLK_DIV64,  
  35.     PWM_CLK_DIV128,  
  36. }PWM_CLK_DIV;  

  37. struct pwm_cfg {  
  38.     int no;  
  39.     PWM_CLK_SRC    clksrc;  
  40.     PWM_CLK_DIV    clkdiv;  
  41.     unsigned char  idelval;  
  42.     unsigned char  guardval;  
  43.     unsigned short guarddur;  
  44.     unsigned short wavenum;  
  45.     unsigned short datawidth;  
  46.     unsigned short threshold;  
  47. };  

  48. /* ioctl */  
  49. #define PWM_ENABLE      0  
  50. #define PWM_DISABLE     1   
  51. #define PWM_CONFIGURE   2   
  52. #define PWM_GETSNDNUM   3  
  53. #endif

  54. MODULE_LICENSE("GPL");  

  55. #define RALINK_CLK_CFG    0xB0000030   
  56. #define RALINK_AGPIO_CFG  0xB000003C  
  57. #define RALINK_GPIOMODE   0xB0000060   

  58. #define RALINK_PWM_BASE   0xB0005000

  59. //#define RALINK_CLK_CFG    0x10000030   
  60. //#define RALINK_AGPIO_CFG  0x1000003C  
  61. //#define RALINK_GPIOMODE   0x10000060   
  62. //#define RALINK_PWM_BASE   0x10005000      
  63. #define RALINK_PWM_ENABLE    RALINK_PWM_BASE   

  64. #define PWM_MODE_BIT      15   
  65. #define PWM_GVAL_BIT      8   
  66. #define PWM_IVAL_BIT      7   

  67. enum {  
  68.     PWM_REG_CON,  
  69.     PWM_REG_GDUR = 0x0C,  
  70.     PWM_REG_WNUM = 0x28,  
  71.     PWM_REG_DWID = 0x2C,  
  72.     PWM_REG_THRE = 0x30,  
  73.     PWM_REG_SNDNUM = 0x34,  
  74. }PWM_REG_OFF;  

  75. #define PWM_NUM  4   
  76. u32 PWM_REG[PWM_NUM] = {  
  77.     (RALINK_PWM_BASE + 0x10),    /* pwm0 base */  
  78.     (RALINK_PWM_BASE + 0x50),    /* pwm1 base */  
  79.     (RALINK_PWM_BASE + 0x90),    /* pwm2 base */  
  80.     (RALINK_PWM_BASE + 0xD0)     /* pwm3 base */  
  81. };  

  82. #define NAME  "sooall_pwm"  

  83. int pwm_major;  
  84. int pwm_minor  = 0;  
  85. int pwm_device_cnt = 1;  
  86. struct cdev pwm_cdev;  

  87. static struct class  *pwm_class;  
  88. static struct device *pwm_device;  

  89. spinlock_t pwm_lock;  

  90. static void sooall_pwm_cfg(struct pwm_cfg *cfg)  
  91. {  
  92.     u32 value;  
  93.     unsigned long  flags;  
  94.     u32 basereg;  

  95.     basereg = PWM_REG[cfg->no];  

  96.     spin_lock_irqsave(&pwm_lock, flags);  

  97.     /* 1. set the pwm control register */  
  98.     value  = le32_to_cpu(*(volatile u32 *)(basereg + PWM_REG_CON));  
  99.     /* old mode */  
  100.     value |= (1 << PWM_MODE_BIT);  
  101.     /* set the idel val and guard val */  
  102.     value &= ~((1 << PWM_IVAL_BIT) | (1 << PWM_GVAL_BIT));  
  103.     value |= ((cfg->idelval & 0x1) << PWM_IVAL_BIT);  
  104.     value |= ((cfg->guardval & 0x1) << PWM_GVAL_BIT);  
  105.     /* set the source clk */  
  106.     if (cfg->clksrc == PWM_CLK_100KHZ) {  
  107.         value &= ~(1<<3);      
  108.     } else {  
  109.         value |= (1<<3);   
  110.     }  
  111.     /* set the clk div */  
  112.     value &= ~0x7;  
  113.     value |= (0x7 & cfg->clkdiv);      
  114.     *(volatile u32 *)(basereg + PWM_REG_CON) = cpu_to_le32(value);   

  115.     /* 2. set the guard duration val */  
  116.     value  = le32_to_cpu(*(volatile u32 *)(basereg + PWM_REG_GDUR));  
  117.     value &= ~(0xffff);  
  118.     value |= (cfg->guarddur & 0xffff);  
  119.     *(volatile u32 *)(basereg + PWM_REG_GDUR) = cpu_to_le32(value);   


  120.     /* 3. set the wave num val */  
  121.     value  = le32_to_cpu(*(volatile u32 *)(basereg + PWM_REG_WNUM));  
  122.     value &= ~(0xffff);  
  123.     value |= (cfg->wavenum & 0xffff);  
  124.     *(volatile u32 *)(basereg + PWM_REG_WNUM) = cpu_to_le32(value);   


  125.     /* 4. set the data width val */  
  126.     value  = le32_to_cpu(*(volatile u32 *)(basereg + PWM_REG_DWID));  
  127.     value &= ~(0x1fff);  
  128.     value |= (cfg->datawidth & 0x1fff);  
  129.     *(volatile u32 *)(basereg + PWM_REG_DWID) = cpu_to_le32(value);   


  130.     /* 5. set the thresh  val */  
  131.     value  = le32_to_cpu(*(volatile u32 *)(basereg + PWM_REG_THRE));  
  132.     value &= ~(0x1fff);  
  133.     value |= (cfg->threshold & 0x1fff);  
  134.     *(volatile u32 *)(basereg + PWM_REG_THRE) = cpu_to_le32(value);   

  135.     spin_unlock_irqrestore(&pwm_lock, flags);  
  136. }  

  137. static void sooall_pwm_enable(int no)  
  138. {  
  139.     u32 value;  
  140.     unsigned long  flags;  

  141.     printk(KERN_INFO NAME "enable pwm%d\n", no);  

  142.     spin_lock_irqsave(&pwm_lock, flags);  
  143.     value  = le32_to_cpu(*(volatile u32 *)(RALINK_PWM_ENABLE));  
  144.     value  |= (1 << no);  
  145.     *(volatile u32 *)(RALINK_PWM_ENABLE) = cpu_to_le32(value);   
  146.     spin_unlock_irqrestore(&pwm_lock, flags);  
  147. }  

  148. static void sooall_pwm_disable(int no)  
  149. {  
  150.     u32 value;  
  151.     unsigned long  flags;  

  152.     printk(KERN_INFO NAME "disable pwm%d\n", no);  

  153.     spin_lock_irqsave(&pwm_lock, flags);  
  154.     value  = le32_to_cpu(*(volatile u32 *)(RALINK_PWM_ENABLE));  
  155.     value  &= ~(1 << no);  
  156.     *(volatile u32 *)(RALINK_PWM_ENABLE) = cpu_to_le32(value);   
  157.     spin_unlock_irqrestore(&pwm_lock, flags);  
  158. }

  159. static void sooall_pwm_getsndnum(struct pwm_cfg *cfg)  
  160. {  
  161.     u32 value;  
  162.     unsigned long  flags;  
  163.     u32 regbase = PWM_REG[cfg->no];  

  164.     spin_lock_irqsave(&pwm_lock, flags);  
  165.     value  = le32_to_cpu(*(volatile u32 *)(regbase + PWM_REG_SNDNUM));  
  166.     cfg->wavenum = value;  
  167.     spin_unlock_irqrestore(&pwm_lock, flags);  
  168. }  

  169. #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,35)  
  170. long sooall_pwm_ioctl(struct file *file, unsigned int req,  
  171.         unsigned long arg)  
  172. #else  
  173. int sooall_pwm_ioctl(struct inode *inode, struct file *file, unsigned int req,  
  174.         unsigned long arg)  
  175. #endif  
  176. {  
  177.     switch (req) {  
  178.     case PWM_ENABLE:  
  179.         sooall_pwm_enable(((struct pwm_cfg *)arg)->no);  
  180.         break;  
  181.     case PWM_DISABLE:  
  182.         sooall_pwm_disable(((struct pwm_cfg *)arg)->no);  
  183.         break;  
  184.     case PWM_CONFIGURE:  
  185.         sooall_pwm_cfg((struct pwm_cfg *)arg);  
  186.         break;  
  187.     case PWM_GETSNDNUM:  
  188.         sooall_pwm_getsndnum((struct pwm_cfg *)arg);  
  189.         break;  
  190.     default:  
  191.         return -ENOIOCTLCMD;  
  192.     }  

  193.     return 0;  
  194. }  

  195. static int sooall_pwm_open(struct inode * inode, struct file * filp)  
  196. {  
  197.     return 0;  
  198. }  

  199. static int sooall_pwm_close(struct inode *inode, struct file *file)  
  200. {  
  201.     return 0;  
  202. }  

  203. static const struct file_operations pwm_fops = {  
  204.     .owner      = THIS_MODULE,  
  205. #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,35)  
  206.     unlocked_ioctl:sooall_pwm_ioctl,  
  207. #else  
  208.     ioctl:sooall_pwm_ioctl,  
  209. #endif   
  210.     .open       = sooall_pwm_open,  
  211.     .release    = sooall_pwm_close,  
  212. };  

  213. static int setup_chrdev(void)  
  214. {  
  215.     dev_t dev;  
  216.     int err = 0;  

  217.     if (pwm_major) {  
  218.         dev = MKDEV(pwm_major, 0);               
  219.         err = register_chrdev_region(dev, pwm_device_cnt, NAME);  
  220.     } else {  
  221.         err = alloc_chrdev_region(&dev, 0, pwm_device_cnt, NAME);     
  222.         pwm_major = MAJOR(dev);  
  223.     }  

  224.     if (err < 0) {  
  225.         printk(KERN_ERR NAME "get device number failed\n");  
  226.         return -1;  
  227.     }  

  228.     cdev_init(&pwm_cdev, &pwm_fops);  
  229.     pwm_cdev.owner = THIS_MODULE;  
  230.     pwm_cdev.ops = &pwm_fops;     
  231.     err = cdev_add(&pwm_cdev, dev, pwm_device_cnt);  
  232.     if (err < 0) {  
  233.         printk(KERN_ERR NAME "cdev_add failed\n");   
  234.         unregister_chrdev_region(dev, pwm_device_cnt);  
  235.         return -1;   
  236.     }  

  237.     return 0;  
  238. }  

  239. static void clean_chrdev(void)  
  240. {  
  241.     dev_t dev = MKDEV(pwm_major, 0);  

  242.     cdev_del(&pwm_cdev);  
  243.     unregister_chrdev_region(dev, pwm_device_cnt);  
  244. }  

  245. static void setup_gpio(void)  
  246. {  
  247.     u32 value;  
  248.     int i = 0;  
  249.     /* pwm0 pwm1 */  

  250.     /* enable the pwm clk */  
  251.     value  = le32_to_cpu(*(volatile u32 *)(RALINK_CLK_CFG));  
  252.     value  |= (1 << 31);  
  253.     *(volatile u32 *)(RALINK_CLK_CFG) = cpu_to_le32(value);   

  254.     /* set the agpio cfg of ephy_gpio_aio_en */  
  255.     //value  = le32_to_cpu(*(volatile u32 *)(RALINK_AGPIO_CFG));  
  256.     //value  |= (0xF<<17);  
  257.     //*(volatile u32 *)(RALINK_AGPIO_CFG) = cpu_to_le32(value);     

  258.     /* set the pwm  mode */  
  259.     //value  = le32_to_cpu(*(volatile u32 *)(RALINK_GPIOMODE));  
  260.     //value  &= ~(3 << 28 | 3 << 30);  
  261.     //*(volatile u32 *)(RALINK_GPIOMODE) = cpu_to_le32(value);      

  262.    value  = le32_to_cpu(*(volatile u32 *)(RALINK_GPIOMODE));  
  263.    value  |= (2 << 24);  

  264.    *(volatile u32 *)(RALINK_GPIOMODE) = cpu_to_le32(value);         

  265.     /* disable all the pwm */  
  266.     for (i = 0; i < PWM_NUM; i++) {  
  267.         sooall_pwm_disable(i);   
  268.     }        
  269. }  

  270. static int sooall_pwm_init(void)  
  271. {  
  272.     int ret = 0;  

  273.     spin_lock_init(&pwm_lock);  

  274.     ret = setup_chrdev();  
  275.     if (ret < 0)   
  276.         return -1;  

  277.     pwm_class = class_create(THIS_MODULE, NAME);  
  278.     if (NULL == pwm_class) {  
  279.         printk(KERN_ERR NAME "class_create failed\n");   
  280.         goto dev_clean;  
  281.     }  

  282.     pwm_device = device_create(pwm_class, NULL,   
  283.                     MKDEV(pwm_major, pwm_minor), NULL, "sooall_pwm");  
  284.     if (NULL == pwm_device) {  
  285.         printk(KERN_ERR NAME "device_create failed\n");   
  286.         goto class_clean;  
  287.     }  

  288.     setup_gpio();     

  289.     printk(KERN_INFO "sooall pwm init success\n");   
  290.     return 0;  

  291. class_clean:  
  292.     class_destroy(pwm_class);     
  293. dev_clean:  
  294.     clean_chrdev();  
  295.     return -1;  
  296. }  

  297. static void sooall_pwm_exit(void)  
  298. {  
  299.     device_destroy(pwm_class, MKDEV(pwm_major, pwm_minor));  
  300.     class_destroy(pwm_class);     
  301.     clean_chrdev();  
  302.     printk(KERN_INFO "sooall pwm exit\n");  
  303. }  

  304. module_init(sooall_pwm_init);   
  305. module_exit(sooall_pwm_exit);
复制代码




Connecting & Messaging from Any.
举报 使用道具
雨中桐 注册会员 发表于 2018-1-14 18:29:00 | 显示全部楼层
忙了一天一夜终于将项目的功能全部实现了。首先是串口:
这部分 代码是类似于A8的串口代码。
只是mtk7688上有3个串口,ttyS0、ttyS1、ttyS2。
其中ttyS0是串口转USB就是打印在CRT上的。
ttyS1和ttyS2在开发板引脚上,分别为TXD1/2和RXD1、2.
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <fcntl.h>
  5. #include <unistd.h>
  6. #include <sys/ioctl.h>
  7. #include <time.h>
  8. #include <termios.h>
  9. #include <sys/select.h>
  10. #include <sys/types.h>

  11. #define UART_DEVICE        "/dev/ttyS1"

  12. static int init_ttyS(int fd_com1)
  13. {
  14.         struct termios newtio;

  15.         bzero(&newtio, sizeof(newtio));
  16.         tcgetattr(fd_com1, &newtio);       
  17.         cfsetispeed(&newtio, B9600);       
  18.         cfsetospeed(&newtio, B9600);
  19.         newtio.c_cflag |= (CLOCAL | CREAD);
  20.         newtio.c_cflag &= ~PARENB;
  21.         newtio.c_cflag &= ~CSTOPB;
  22.         newtio.c_cflag &= ~CSIZE;
  23.         newtio.c_cflag |= CS8;
  24.         newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
  25.         newtio.c_oflag &= ~(OPOST);

  26.         newtio.c_cc[VTIME]   = 0;
  27.         newtio.c_cc[VMIN]     = 0;   

  28.         tcflush(fd_com1, TCIFLUSH);       
  29.         tcsetattr(fd_com1,TCSANOW,&newtio);
  30.         return(0);
  31. }

  32. int main(int argc,char *argv[])
  33. {
  34.         int fd_com1;
  35.         fd_set uart_w[100];
  36.         fd_com1 = open(UART_DEVICE, O_RDWR);
  37.         if (fd_com1 < 0)
  38.         {
  39.                 printf("open erroy!");
  40.         }       

  41.         FD_ZERO(uart_w);
  42.         FD_SET(fd_com1,uart_w);

  43.         init_ttyS(fd_com1);

  44.         char *buffer="A100V";
  45.         char rec_buf[1024];
  46.         while(1)
  47. {
  48.         read(fd_com1,rec_buf,256);
  49.         //write(fd_com1,buffer,strlen(buffer));
  50.         printf("%s\n",rec_buf);
  51.         sleep(5);
  52. }

  53.         close(fd_com1);
  54.         return(0);
  55. }
复制代码
Connecting & Messaging from Any.
举报 使用道具
晏慧茹 注册会员 发表于 2018-1-14 17:16:24 | 显示全部楼层
2018/1/14
今日任务:
和组员一起完成PPT
准备拍摄项目视频
Connecting & Messaging from Any.
举报 使用道具
1761300690 注册会员 发表于 2018-1-14 02:06:12 | 显示全部楼层
2018/1/13
今日进展:
1.和组员@1783463455服务器的数据传输,但是遇到了一些问题,人脸识别循环进行,服务器数据却不能进行用户切换发送(中途用户改变时,数据无法切换),准备加班家电搞定。
2.解决了人脸识别和检测失败也能添加数据到数据库的问题。
明日计划:
完成所有项目的整合。
Connecting & Messaging from Any.
举报 使用道具
雨中桐 注册会员 发表于 2018-1-12 20:56:02 | 显示全部楼层
晚上板子刚到,不过插上有线网时发现没有网络,不知道是网口问题还是没配置导致的,之前的mtk插上网线就可以连网,感觉这开发板很不靠谱,
遇到的问题真多,考试考了一天,头疼,时间不多了有点慌。
Connecting & Messaging from Any.
举报 使用道具
1761300690 注册会员 发表于 2018-1-12 20:46:07 | 显示全部楼层
20181/12
今日进展:
由于今天出口测评,且下午组员参加软件工程测试,代码部分均已完工,仅仅和a1783463455将原来代码进行了多线程操作。
明日计划:
编写服务器操作,进行最后整合。
Connecting & Messaging from Any.
举报 使用道具
chonghuang 注册会员 发表于 2018-1-12 20:44:17 | 显示全部楼层
2018/1/12:
今日进展:
晚上第新板子重新烧固件,但过程中出现问题,新板子插网线没有反应
问了老板,老板说技术人员下班了,明天才能解决,自己上网找资料,没有找到
Connecting & Messaging from Any.
举报 使用道具
chonghuang 注册会员 发表于 2018-1-11 20:20:34 | 显示全部楼层
今日进展:
2018/1/11:
因为考试,今日没有对项目进行更进
明天考试结束后进行项目整合和试验
Connecting & Messaging from Any.
举报 使用道具
雨中桐 注册会员 发表于 2018-1-11 20:20:14 | 显示全部楼层
2018/1/11
由于最近考试所逼,项目上暂时放了一下,这些天所缺的进度,明晚加班补回来。
Connecting & Messaging from Any.
举报 使用道具
1761300690 注册会员 发表于 2018-1-11 20:04:23 | 显示全部楼层
2018/1/11
今日进展:
完成了人脸识别检测功能,和组员共同完成了与数据库的对接@a1783463455 ,大致所需功能均已实现。
明日计划:
10对数据库功能和人脸识别的完善。
2.服务器tcp的编写。
Connecting & Messaging from Any.
举报 使用道具
chonghuang 注册会员 发表于 2018-1-10 21:39:12 | 显示全部楼层
今日进展:
因明后两天要考试,所以没有进展
而且项目也进入最后一步,等板子一到就进行整合试验,进行最后的调试
Connecting & Messaging from Any.
举报 使用道具
1761300690 注册会员 发表于 2018-1-10 19:12:53 | 显示全部楼层
2018/1/10
今日进展:
从数据库中批量提取图片并与每一帧视频进行对比获取相似度fsimiscore并保存数组pairscore中。每到下一帧初始化数组一次,图片处理构成一个循环,当数组中含有相似度大于等于0.65的值时,确定含有此人,返回数据库提取亮度值。
  1.                                 fprintf(stdout, "Frame:%d\n", frame++);
  2.                                 float *pairscore = new float[number];//数组初始化
  3.                                 int judge = 0;
  4.                                 //====================================================数据库中批量图片与视频流进行人脸识别并将相似度fsimilscore输入数组pairscore
  5.                                 for (int index = 1; index <= number; index++)
  6.                                 {
  7.                                         VideoFaceModels = GetFaceModeVideo(VideoFaceRes, nFTRet, FREngine, VideoFramePic, 0);
  8.                                         //对比
  9.                                         nFRRet = AFR_FSDK_FacePairMatching(FREngine, &TagFaceModels[index], &VideoFaceModels, &fSimilScore);
  10.                                         if (nFRRet == MOK)
  11.                                         {
  12.                                                 pairscore[index] = fSimilScore;//输入数组
  13.                                                 fprintf(stdout, "fSimilScore =  %f\n", pairscore[index]);
  14.                                                 ///////////////////////////////判断是否为数据库中的人
  15.                                                 if (pairscore[index]>=0.65)
  16.                                                 {
  17.                                                         fprintf(stdout,"即为此人\n");
  18.                                                         judge = 1;
  19.                                                 }
  20.                                                 else
  21.                                                 {
  22.                                                         fprintf(stdout,"不是此人\n");
  23.                                                 }
  24.                                         }
  25.                                         else
  26.                                         {
  27.                                                 fprintf(stderr, "FacePairMatching failed , errorcode is %d \n", nFRRet);
  28.                                         }
  29.                                         fSimilScore = 0.0f;//相似度
  30.                                         fprintf(stdout, "Face[%d]: rect[%d,%d,%d,%d]\n orient[%d]\n\n", 0, VideoFaceRes->rcFace[0].left, VideoFaceRes->rcFace[0].top, VideoFaceRes->rcFace[0].right, VideoFaceRes->rcFace[0].bottom, VideoFaceRes->lfaceOrient);
  31.                                 }
  32.                                 //==============================================================
  33.                                 if (judge==0)
  34.                                 {
  35.                                         fprintf(stdout,"数据库中不存在视频流中当前人脸\n");//将当前帧保存到数据库中
  36.                                 }
  37.                                 else
  38.                                 {
  39.                                         fprintf(stdout,"数据库中存在视频流中当前人脸\n");
  40.                                 }
复制代码
明日计划:

Connecting & Messaging from Any.
举报 使用道具
雨中桐 注册会员 发表于 2018-1-10 12:18:52 | 显示全部楼层
2018/1/9
今天搞了一天的PWM,可惜驱动还是装不上。
先附上代码:
这是Makefile:
  1. obj-m = pwm.o
  2. PWD=$(shell pwd)
  3. KERNEL_DIR=/work/openwrt/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7688/linux-3.18.45/kernel/
  4. TOOLCHAIN="/work/openwrt/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/mipsel-openwrt-linux-uclibc"

  5. all:  
  6.         make -C $(KERNEL_DIR) ARCH=mips CROSS_COMPILE=$(TOOLCHAIN) M=$(PWD) modules

  7. clean:  
  8.         rm -f *.ko  
  9.         rm -f *.o  
  10.         rm -f *.mod.c  
  11.         rm -f *.mod.o  
  12.         rm -f *.order  
  13.         rm -f *.sysvers
复制代码
KERNEL_DIR是内核路径。
TOOLCHAIN是openwrt的交叉编译路径。
大体上没什么问题,但是编译就是不通过。
还有pwm的驱动,网上有资料就不发了。





Connecting & Messaging from Any.
举报 使用道具
1761300690 注册会员 发表于 2018-1-10 08:44:22 | 显示全部楼层
2018/1/9
今日进展:
1.vs重新搭建数据库(http://blog.csdn.net/bwangk/article/details/52516226
http://blog.csdn.net/daso_csdn/article/details/54646859由此链接成功)
2.可以用vs从开发板上获取摄像头数据并进行比对。
明日计划:
1.将人脸识别修改,从数据库中提取多张图片与每一帧视频对比并将相似度放入数组中(之前是提取一张图片与视频流对比)。
2.将数组中的相似度取max并判断max值是否大于0.65。若大于等于0.65,说明此max值对应的人脸图片即为视频中人脸;若max小于0.65,说明此图片库中没有符合的人脸图片。
Connecting & Messaging from Any.
举报 使用道具
chonghuang 注册会员 发表于 2018-1-9 21:31:46 | 显示全部楼层
2018/1/9:今日进展:
1、编写摄像头开启程序
参考网址:
http://blog.csdn.net/wonxxx/article/details/25072747
http://blog.csdn.net/eastmoon502136/article/details/8190262
之后出现一件让我奔溃的事,主板烧了,不知道原因,所以并没有对代码进行试验,不知道是否能开启成功
2、整合了传感器和数字电位器部分的代码
心态接近爆炸,弄了两个礼拜的板子呀

本帖子中包含更多资源

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

x
Connecting & Messaging from Any.
举报 使用道具
1761300690 注册会员 发表于 2018-1-9 08:42:36 | 显示全部楼层
本帖最后由 1761300690 于 2018-1-10 08:36 编辑

2018/1/8:
今日进展:
1.想将输出的文件下目录放入数组内,查阅结构体_finddata_t得到   
struct _finddata_t
        {
             unsigned attrib;
             time_t time_create;
             time_t time_access;
             time_t time_write;
             _fsize_t size;
             char name[_MAX_FNAME];
       };
unsigned atrrib:文件属性的存储位置。
time_t time_create:这里的time_t是一个变量类型(长整型?相当于long int?),用来存储时间的,我们暂时不用理它,只要知道,这个time_create变量是用来存储文件创建时间的就可以了。
time_t time_access:文件最后一次被访问的时间。
time_t time_write:文件最后一次被修改的时间。
_fsize_t size:文件的大小。这里的_fsize_t应该可以相当于unsigned整型,表示文件的字节数。
char name[_MAX_FNAME]:文件的文件名。这里的_MAX_FNAME是一个常量宏,它在头文件中被定义,表示的是文件名的最大长度。
2.搭建数据库失败,附加库目录,附加包含目录,附加依赖项均无误情况下产生无法解析的外部命令。折腾了一下午并请求组员帮助,依然失败,最终得出环境问题。
明日计划;
1.在vs上安装sql server,取消安装MySQL。
2.通过WiFi获取开发板上的摄像头数据。
Connecting & Messaging from Any.
举报 使用道具
嘿嘿嘿 注册会员 发表于 2018-1-9 08:36:09 | 显示全部楼层
本帖最后由 嘿嘿嘿 于 2018-1-9 08:41 编辑

2018/1/8
今日进程:协作a1783463455完善数据库的搭建,主要是整合部分,写了部分查询语句,感觉逻辑上出现问题
利用查询语句查询用户使用信息表, 此时间点使用台灯的次数/用户近期一共使用的台灯的次数。
利用查询语句获得在此时间点开灯的用户最早使用的日期和最晚使用的日期之差求出。

本帖子中包含更多资源

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

x
Connecting & Messaging from Any.
举报 使用道具
a1783463455 注册会员 发表于 2018-1-8 23:35:24 | 显示全部楼层
date:2018/1/8
1.mysql_store_result()函数mysql_store_result()将查询的全部结果读取到客户端,分配1个MYSQL_RES结构,并将结果置于该结构中。返回值:具有多个结果的MYSQL_RES结果集合。如果出现错误,返回NULL;2.碰到一下错误,错误1,开始是用的是先定义了char *sql,之后使用动态拼接技术把语句拼接到sql,报错数组越界。猜测char *此类型使用时只能char *s=“hello”;的形式,当对s进行字符拼接操作,s那边地址附件可能会用非法访问区域造成出错,当然只是一种猜想,还遇到一种文体是字符串转整形,或者相反。记忆中c++可以强转,但是c不行,于是可以引用一个库,stdlib.h 中atoi或者itoa方法。
3.又碰到一下问题,关于clion代码移植于vs2010,首先,clion跑的sql程序,lib和dll跑的环境好像x86,而vs上的opencv听其他组所说应该是x64,那么移植到vs上会出现问题,未找到具体原因,不过笨方法只有一个,下载完整版sql库和连接语句。
明天
1.解决第3错误。


本帖子中包含更多资源

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

x
Connecting & Messaging from Any.
举报 使用道具
chonghuang 注册会员 发表于 2018-1-8 22:01:20 | 显示全部楼层
本帖最后由 chonghuang 于 2018-1-8 22:03 编辑

2018/1/8:
今日进展:
1、数字电位器算法搞定,可以根据旋转方向进行加加减减
2、之前摄像头是图片,今天把它转换为视频,有了点眉目


地址为当前开发板的地址
参考网址:
http://blog.csdn.net/dfsae/article/details/78819927
http://blog.csdn.net/eastmoon502136/article/details/8190262

本帖子中包含更多资源

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

x
Connecting & Messaging from Any.
举报 使用道具
雨中桐 注册会员 发表于 2018-1-8 21:58:16 | 显示全部楼层
2018/1/8
不得不吐槽一下,MTK7688真的是麻烦,拿到手的openwrt可以说是什么都没有,无论是WIFI驱动,还是串口驱动,以及将要搞得PWM驱动,想要的
全都没有。最关键的是网上给的用上没什么反应。
上午和组员一起完成了电位器那边的算法,还算有点收获。代码部分组员上传了,我就不发了。
下午一直在搞串口,基本命令:
echo "hello!" > /dev/tty  这是向所有串口发送数据,你会发现你的CRT会打印hello!,因为CRT用的就是UART0串口,
但是UART1和UART2依然没有数据。因为要安装stty
  1.     root@OpenWrt:~# opkg install coreutils-stty
  2.     Installing coreutils-stty (8.23-1) to root...
  3.     Downloading http://downloads.openwrt.org/chaos_calmer/15.05/ramips/mt7628/packages/packages/coreutils-stty_8.23-1_ramips_24kec.ipk.
  4.     Installing coreutils (8.23-1) to root...
  5.     Downloading http://downloads.openwrt.org/chaos_calmer/15.05/ramips/mt7628/packages/packages/coreutils_8.23-1_ramips_24kec.ipk.
  6.     Configuring coreutils.
  7.     Configuring coreutils-stty.
复制代码

可是我的安装时会报错,提示找不到stty,没办法,还在寻求问题解决的方法。

Connecting & Messaging from Any.
举报 使用道具
晏慧茹 注册会员 发表于 2018-1-8 20:01:15 | 显示全部楼层
2018/1/8
今日任务:整合光敏传感器和红外传感器的代码,并实现当两个传感器都输出高电平时,将GPIO9设为高电平输出模式。
下一步计划:继续项目整合
Connecting & Messaging from Any.
举报 使用道具
嘿嘿嘿 注册会员 发表于 2018-1-7 21:41:24 | 显示全部楼层
2018.1.7
1.基本上解决了红外的功能,之后看整合会出现什么问题。
2.组员被电到了,感觉这根电线存在安全隐患,外面再报一层绝缘最好
3.电压不稳定,“可控硅不可控”,可能有风险,投资需谨慎
Connecting & Messaging from Any.
举报 使用道具
雨中桐 注册会员 发表于 2018-1-7 17:47:32 | 显示全部楼层
下午调了一下可控硅,发现了一个问题。
首先是可控硅的信号电压是3.3~24V,这和预期想要的3.3~5V不一样,当时下单疏忽了。
其次是当接上可控硅与电灯泡时发现电压不稳,不知道是插头问题还是可控硅问题,百度了一下说是没进行过零检测。
经过查询个人理解过零检测就是防止电路的突然接通或切断对负载冲击过大造成的损伤。但具体到过零检测的变压器隔离,光耦隔离还是不太懂。
还有个更关键的问题就是可控硅好像有点危险,组员下午因为接触通电的可控硅被电到了。
这些问题明天继续解决。
Connecting & Messaging from Any.
举报 使用道具
晏慧茹 注册会员 发表于 2018-1-7 17:07:43 | 显示全部楼层
2018/1/7
今日任务:
1.完善光敏传感器的功能,发现MT7688的外部引脚有的不能用,换了几个引脚。
2.看组员连接可控硅,继电器,板子和灯,有点危险
下一步计划:
继续学习MT7688

Connecting & Messaging from Any.
举报 使用道具
a1783463455 注册会员 发表于 2018-1-6 12:30:48 | 显示全部楼层
a1783463455 发表于 2018-1-5 22:56
2018/1/5
今日进程:
1.学习了有关cmake编写:link_libaries() 连接 第三方库文件 于是,便尝试编写了有 ...

问题已经解决,link_libraries(libmysql.dll)改成这个,在到cmake-bulid-debug目录下考录一份libmysql.dll.虽然问题解决但是依旧感到疑惑对于link_libraries用法;
Connecting & Messaging from Any.
举报 使用道具
a1783463455 注册会员 发表于 2018-1-5 22:56:09 | 显示全部楼层
2018/1/5
今日进程:
1.学习了有关cmake编写:link_libaries() 连接 第三方库文件 于是,便尝试编写了有关mysql的cmake
cmake_minimum_required(VERSION 3.9)
project(sql C)

set(CMAKE_C_STANDARD 99)
set(INC_DIR C:/Users/Administrator/CLionProjects/sql/include)
set(LINK_DIR C:/Users/Administrator/CLionProjects/sql/lib)

include_directories(${INC_DIR})
link_directories(${LINK_DIR})
link_libraries(mysql.h)
add_executable(sql main.c)可怕的事情来了。分析了下原因,第一:cmake编写出错但是疑惑点,include那个头文件没有报错第二:可能是exe文件目录下没有lib so。2.看完了c语言操作sql的视频,3.成功在vs环境下移植了clion写的tcp 服务器明日任务1.完成sql与clion相连
[img]file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\1783463455\QQ\WinTemp\RichOle\S)$@2WAK(}W5A[6VS37VY00.png[/img]

本帖子中包含更多资源

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

x
Connecting & Messaging from Any.
举报 使用道具
嘿嘿嘿 注册会员 发表于 2018-1-5 20:44:47 | 显示全部楼层
本帖最后由 嘿嘿嘿 于 2018-1-5 20:47 编辑

2018/1/5
今日进程:
先说下红外吧,决定继续使用Mt7688,想要查下引脚编号,于是,查了下Datasheet,看了下引脚

之后看了下Linux下用文件IO的方式操作GPIO,讲的比较晦涩,大致理解是
通过sysfs方式控制GPIO,先访问/sys/class/gpio目录,向export文件写入GPIO编号,
使得该GPIO的操作接口从内核空间暴露到用户空间,GPIO的操作接口包括direction和value等
,direction控制GPIO方向(是控制输出还是输入),而value可控制GPIO输出或获得GPIO输入
(通过它设置引脚的值是写入1或0)。文件IO方式操作GPIO,使用到了4个函数open、close、read、write
。需要注意的是direction文件,定义输入输入方向,可以通过下面命令定义为输出。
direction接受的参数:in, out, high, low。high/low同时设置方向为输出,并将value设置为相应的1/0
给了一个读写过程,但是在虚拟机上没有跑成功,就不贴出来了。等明天修改一下,再发吧

本帖子中包含更多资源

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

x
Connecting & Messaging from Any.
举报 使用道具
晏慧茹 注册会员 发表于 2018-1-5 20:43:26 | 显示全部楼层
本帖最后由 晏慧茹 于 2018-1-5 20:45 编辑

2018/1//5
今日任务:
1.解决了引脚操作问题,通过排查,发现之前的write()函数没有成功写入,是因为文件的权限问题。在网上搜到了chmod()和 fchmod()函数,可以对文件进行权限的更改。其头文件是#include <sys/stat.h>,函数原型为int chmod(const char *path, mode_t mode);int fchmod(int fd, mode_t mode)。chmod函数在指定的文件上进行操作,改变现有文件的访问
权限。fchmod对已打开的文件进行操作。

2.实现了光敏传感器感受外部光线,向GPIO3,发出低电平或高电平,MT7688可读出该电平。
下一步计划:学习MT7688是否有关于中断的操作,继续完善相应模块。


本帖子中包含更多资源

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

x
Connecting & Messaging from Any.
举报 使用道具
chonghuang 注册会员 发表于 2018-1-5 19:42:28 | 显示全部楼层
2018/1/5:
今日进展:
1、在MT7688上找到了外部引脚与内部引脚的对应关系

2、数字电位器代码编译的前期构思阶段,在网上找到了资料,不过是STM32 板子的,下载了代码,准备参考
http://blog.csdn.net/wang328452854/article/details/50579832
http://bbs.eeworld.com.cn/thread-546854-1-1.html
通过这些资料及自己的实验发现数字电位器只需接4个引脚即可,两个脉冲信号引脚(S1和S2),一个5v的vcc,还有一个gnd
当不旋时,信号引脚是高电平
正旋时S1先输出高电平然后S2输出高电平,接着S1、S2先后输出低电平,如此反复
反旋时S2先输出高电平然后S1输出高电平,接着S2、S1先后输出低电平,如此反复
如图:

它们之间总有4/1π的相位差,不过它们输出的信号不是很强
之后通过看代码发现他们使用定时器TIM中断以及TIM的上升下降都边沿触发去处理电位器的脉冲信号,
而MT7688开发板没有定时器TIM,所以我们准备参考他们的中断,自己写中断程序,或者使用线程
3、通过网上查资料发现openwrt的中断方法在 /proc/interrupt 目录下
      
今天先到这,明天继续,开始进行代码试验,这个礼拜一定要搞定数字电位器和可控硅
争取下个礼拜进行项目试验阶段

本帖子中包含更多资源

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

x
Connecting & Messaging from Any.
举报 使用道具
雨中桐 注册会员 发表于 2018-1-5 19:39:50 | 显示全部楼层
2018/1/5
今天上午发现MTK插网线可以正常联网,但是可能因为openwrt当时烧录问题导致现在MTK只有在有线情况下联网。不能无线联网,也不可以做路由器供其他设备联网。上网查了一下,才知道MTK有两种模式:
STA模式:

STA模式仅仅把MTK看做一个设备,可以连接到其他路由器上。
AP模式:

AP模式就是将MTK当做路由器,其他设备可以连接MTK,并且MTK有自己的网段(可以自己设置)。
本次项目就是将MTK当做路由器使用。
但现在又遇到一个问题还是没有解决,就是电位器那边,网上的使用方法大多建立再有定时器的开发板上,但下午查了一下发现MTK开发板上没有定时器,
自己想了一些算法,发现可以解决一些正常情况下的旋转,但使用者旋转并未达到下一个中断(下降沿触发)就反向旋转,此时计数就会乱掉。
后面可能会采取外接定时器或者用其他可行的算法解决。

本帖子中包含更多资源

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

x
Connecting & Messaging from Any.
举报 使用道具
1761300690 注册会员 发表于 2018-1-5 19:32:30 | 显示全部楼层
2018/1/5
今日进展:
1.重新构建人脸识别功能思路,分别从开发板和数据库中提取人脸图片并进行比较,当相似度达到一定值时,从数据库中图片对应的亮度传输给开发板中,否则添加一个新的人脸数据。
2.了解并整理了有关头文件io.h:
(  1.write()写文件函数;_write()写文件函数
2.read()读文件函数 ;_read()读文件函数
3.open()打开文件进行读写的函数;_open()打开一个文件进行读写的函数
4.close()关闭文件函数;lseek()移动文件指针函数
5.chmod()改变文件存取权限的函数;_chmod()改变文件存取权限的函数
详情参考网址:http://blog.csdn.net/babygjx/article/details/5740038  )
3。简单编写了读取目录下文件列表的代码:
  1. #include"stdafx.h"
  2. #include <io.h>
  3. #include <stdio.h>

  4. void printDir(const char* path)
  5. {
  6.         struct _finddata_t data;
  7.         long hnd = _findfirst(path, &data);
  8.         if (hnd < 0)
  9.         {
  10.                 perror(path);
  11.         }
  12.         int  nRet = (hnd <0) ? -1 : 1;
  13.         while (nRet >= 0)
  14.         {
  15.                 if (data.attrib == _A_SUBDIR)  // 如果是目录
  16.                         printf(" [%s]*\n", data.name);
  17.                 else
  18.                         printf(" [%s]\n", data.name);
  19.                 nRet = _findnext(hnd, &data);
  20.         }
  21.         _findclose(hnd);
  22. }
  23. void main()
  24. {
  25.         printDir("D:\\ai-led\\face to analy\\picture");
  26. }
复制代码

明日计划:
1.继续了解人脸识别功能。

Connecting & Messaging from Any.
举报 使用道具
雨中桐 注册会员 发表于 2018-1-4 22:29:35 | 显示全部楼层
框架图:

今日进度:
将开发板视频全部看完,并做笔记。
学习了驱动创建:
入口:
1.注册file_operations结构体。
2.创建类。class_creat;
3.在类下创建设备节点。 device_create;
出口:
1.device_destroy  清除设备节点
2.class_destroy  清除类
3.unregister_chrdev


本帖子中包含更多资源

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

x
Connecting & Messaging from Any.
举报 使用道具
1761300690 注册会员 发表于 2018-1-4 22:19:14 | 显示全部楼层
2018/1/4
今日进展:
1.帮助组员完成数据库搭建(视频教程http://www.rupeng.com/Segments/Index/1800)。

2. 与组员讨论人脸识别与其他部件之间的联系问题。
明日计划:
1.人脸识别重新构建思路并查阅有关opencv资料。

本帖子中包含更多资源

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

x
Connecting & Messaging from Any.
举报 使用道具
a1783463455 注册会员 发表于 2018-1-4 22:02:14 | 显示全部楼层
date:2018/1/4
今日任务:
1.今天努力的奋斗,数据库发现sqlite,操作麻烦,但是功能都有,只可惜报错比较多,所以选择相对于稳定了mysql。可惜配置比较难。
2.看完了c语言连接mysql的数据库,接下来配置好clion和mysql。
明日任务:
1.配置mysql和clion的对接
Connecting & Messaging from Any.
举报 使用道具
chonghuang 注册会员 发表于 2018-1-4 21:17:23 | 显示全部楼层
本帖最后由 chonghuang 于 2018-1-4 21:19 编辑

2018/1/4:
今日进展:
应该说今天没什么进展,因为今天虚拟机出现了问题,打开虚拟机输入密码之后又重新回到登录界面,一直反复
然后网上百度解决:

一开始使用命令Ctrl+Alt+F1无用,后来发现笔记本键盘不行,然后接了个键盘才进入tty1命令行
根据提示操作发现虚拟机的.xsession-errors没有任何语句

然后换一个方法,同样进入tty1命令行界面
一步步操作,最后什么效果没有
接着再换,换了很多个,接近奔溃,最后

虽然登录问题没有解决,但至少进入图形界面了

个人一直觉得问题在

但一直找不到类似的解决方案,这个被设置为此值的环境变量也没有找到,留待以后有时间解决
其他的进展:
1、昨天找到的引脚目录原本不知道怎么用代码使用它,今天通过网上的相似代码了解到可以像之前A8打开串口文件相似,
使用open函数即可
2、虚拟机移植到借来的台式电脑上,可以一起使用借助过的博客有:
http://www.linuxidc.com/Linux/2016-08/134257.htm
https://www.cnblogs.com/kaituorensheng/p/3376094.html
http://bbs.chinaunix.net/thread-4177948-1-1.html
http://blog.csdn.net/qq1084283172/article/details/54421090


本帖子中包含更多资源

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

x
Connecting & Messaging from Any.
举报 使用道具
嘿嘿嘿 注册会员 发表于 2018-1-4 19:48:33 | 显示全部楼层
本帖最后由 嘿嘿嘿 于 2018-1-4 19:53 编辑

2018/1/4
今日任务:将前两天的疑问集中解答一下,之前主要考虑的是探测静态人体活动,通过与俊哥和组员的讨论。表示不再单独使用红外去检测人体的整个活动过程。是因为市面上传统的热释电不能做出静止人体的活动判定,而当人体在运动的时候,红外检测到人体辐射出的红外线并感应到人体温度与环境温度的差别变化。故传递出高电平信号给下一模块。开始想的是加入一个辅助探测器,类似与二氧化碳探测器,当人体运动靠近红外感应模块时,使用红外感应。当人体静止时,使用二氧化碳探测器去工作。逛了几篇帖子,理论上是行的通,但是去某宝逛了下,成本过高。就放弃这个想法。还有一个想法是加入一个运动模块,协作红外运动,将红外装在一个做圆周运动的支架上面。如此对于探测器参考来说,静止人体在做相对运动,经过试验,偶有成功,但是会有BUG。仍有漏洞,比如再做圆周运动时,会扯动后面的杜邦线,导致直接赋予高电平。例如,在无人环境中,会给出一个错误的高电平信号。下面是前两种想法
(1)热释电红外结合其它人体探测技术:热释电红外+超声波探测 热释电红外+主动红外传探测等。
(2)遵循“人静、探测器动”的原理改造探测器:探测器安装在旋转电机支架上、探测器置于旋转云台上,扫描静态热源信号等等。
而且之后,还看了一种做法和一个产品:基于双稳态液晶光阀的动静态人体探测器和日本松下公司的一款AMG8853,类似于是一个红外矩阵,提供像素阵列和视野。
第一个我没看懂,没看懂双稳态液晶光阀执行模块:(引用原文:双稳态液晶光阀的两端分别接入CD4052芯片的脚3(Ycom)、13(Xcom);MCU主控模块IO口取不同值,即CD4052芯片脚10(B端)、9(A端)取不同值;B、A端取不同值,可选通X0 /Y0、或X1/ Y1、或X2/ Y2 、或X3/Y3 。X0/Y0选通时,电源VCC经R充电、X0端、Xcom端至双稳态液晶光阀的一端,双稳态液晶光阀的另一端经Ycom端、Y0端接地形成充电回路;)电路图我现在发不出来(后再更新)
最终,俊哥给我一个解决办法:不再单独使用红外检测,红外只负责检测过来的人体,和离去的人体。只要走过来坐下,这个动作,别红外识别到,就会记录下来,那么红外任务完成,只要此人没离开,就认为在房间内,就不再使用红外判断人了,判断环境就行了。现在,基本完成红外任务。之后考虑跟光敏放在一起。如果后来继续用摄像头的话,也可以用摄像头。
接下来,考虑的是在MT7688板子上,红外和光敏能否使用。之前据Serial说,MT7688作用是作为通信模块使用,红外模块不能工作。但是组内和客服沟通了下,认为是可以。明天再去跟俊哥沟通下,讨论下MT7688
Connecting & Messaging from Any.
举报 使用道具
雨中桐 注册会员 发表于 2018-1-4 19:34:11 | 显示全部楼层
2018/1/3
补帖:
由于今天考试,外加其他事情,今天对项目上做的较少。
学习了,指令控制引脚。
LED1->GPIO43、LED2->GPIO42
指令:mt7688_pinmux get   //查看引脚模式
          mt7688_pinmux set ephy gpio   //将引脚模式换为gpio模式
          cd sys/class/gpio/    //进入gpio目录
          echo 43 > export    //43引脚出口
          echo out(in) > direction  //输入输出模式
          echo 1(0) > value    //高低电平
          cat direction    //查看输入输出模式
Connecting & Messaging from Any.
举报 使用道具
晏慧茹 注册会员 发表于 2018-1-4 16:35:01 | 显示全部楼层
本帖最后由 晏慧茹 于 2018-1-4 17:28 编辑

2018/1/4
今日任务:
1.尝试了昨天两种对于GPIO的操作方法,具体内容如下:
a.用文件IO的方式操作GPIO,成功打开端口(GPIO3),但是设置端口方向(输入输出模式)、端口值设置(高电平、低电平)失败。考虑可能是端口复用问题,或者权限问题,或者操作不当。后续会解决。



b.用linux/gpio.h,使用函数对GPIO操作,编译出现error:no such file,可能并不支持这种方式,pass。
c.mipsel-openwrt-linux-gcc,实现交叉编译
2.熟悉通过FileZilla将交叉编译好的文件传到MT7688开发板中,通过串口工具,对开发板进行操作。
  cat direction,查看引脚的方向,mt7688_pinmux get,查看引脚复用情况,mt7688_pinmux set,改变引脚功能。不太好的是,每次关掉开发板电源,引脚功能又会恢复默认设置。


下一步计划:继续学习MT7688的相关知识,解决GPIO的操作。

疑问:不知道MT7688是否能连接光敏和红外,实现相应的功能。感觉MT7688多数采用引脚复用,且对于GPIO的操作过于复杂。



本帖子中包含更多资源

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

x
Connecting & Messaging from Any.
举报 使用道具
1761300690 注册会员 发表于 2018-1-3 21:56:48 | 显示全部楼层
2018/1/3
今日进展:
1.通过开发板安装摄像头驱动后得出的结论并与同学讨论,将人脸识别功能修改,保留了提取本地目录一张人脸图片的特征值。
明日计划:
1. 完成数据库的安装和环境的搭建。
2.数据库与开发板之间的通信。
Connecting & Messaging from Any.
举报 使用道具
嘿嘿嘿 注册会员 发表于 2018-1-3 21:54:58 | 显示全部楼层
2018/1/3
今日任务:大量实验之后,除了静止人体其余检测功能都可以。市面上所有的热释电皆不能检测静止。
                 所采购的红外传感器不具备检测功能,先使用原来实验室的红外,实验结果:检测范围角度150度
                  检测距离3.5米。亮灯任务正常。 考虑是否加入另一辅助模块检测人体,或将原先红外检测到人体活动
                  展开的开关灯任务分割给摄像头检测不到人脸时延时关灯。
明日任务:与组员商讨具体事宜
Connecting & Messaging from Any.
举报 使用道具
chonghuang 注册会员 发表于 2018-1-3 21:52:40 | 显示全部楼层
2018/1/3:今日进展:
1、查找到MT7688所有引脚所在的路径是“/sys/class/”

使用到的MT7688命令有:
mt7688_pinmux  get:得到所有引脚当前状态是什么功能
mt7688_pinmux  set <group> <function>:将<group>设置成<function>
echo 值/状态 > 属性:设置这个属性的值/状态
cat 属性:查看这个属性的值/状态

2、昨天安装了摄像头驱动,今天驱动摄像头时出现错误,提示没有output_file.so文件,百度解决:

驱动摄像头进行得到的图片存在“/tmp”中

但是每当开发板重启之后图片就自动删除了,不过对我们项目应该没影响

在交叉编译生成output_file.so文件时报出一个错误一个警告:
错误:提示交叉编译命令有误
解决办法:使用命令“vi /etc/environment”,然后在PATH的最后加上:/work/openwrt/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/bin即可
警告:提示STAGING_DIR没有定义
解决办法:直接在命令行敲“export STAGING_DIR=/work/openwrt/staging_dir/”

本帖子中包含更多资源

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

x
Connecting & Messaging from Any.
举报 使用道具
a1783463455 注册会员 发表于 2018-1-3 21:52:13 | 显示全部楼层
date:2018/1/3
今日进展:
1.对比了mysql和sqlite3,首先mysql 这里资料比较完善,但是配置比较难,他的优点:对数据库操作比较迅捷,sqllite3 安装比较简单,但是开发资料不怎么完备,可视化工具好像不怎么会用,但是优点很显著,他安装简单,完全免费小巧性能高几乎支持目前用到的所以语言。对比了下,sqlite3方案,会比较好。
2.人脸识别那块,已经能和图片提取到特征值了,但是相似算法未写好。
明日进展:
1.学习sqlite3,安装建表。配置cmake。
Connecting & Messaging from Any.
举报 使用道具
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

推荐板块

精彩推荐

热门排行

明星用户

手机版|小黑屋|AnyMSG ( ©AnyMSG 2009 - 2017 · ICP备16009991号 )

GMT+8, 2018-12-11 12:58