一、功能要求
功能需求:
靠近时,垃圾桶开启2秒,2秒后关闭
垃圾桶开启带滴滴声
垃圾桶开启超过10秒,滴滴声警报
垃圾桶长期开启不能让舵机有顿挫感 (尚未解决)
语音控制垃圾桶开关盖
拓展需求:回顾二阶段的Socket编程,实现Sockect客户端发送指令远程打开/关闭垃圾桶,并打印出垃圾桶状态
二、开发环境
1、准备电子器件:
Orangepi Zero2 全志H616开发板,超声波模块,蜂鸣器,舵机sg90,语音模块SU-03T
2,使用软件:
MobaXterm_Personal_20.3(命令控制终端控制开发板)
3、配置
语音模块的配置如下图,按照官网步骤检测配置通过即可
4、引脚分配
通过输入gpio readall可以查看开发板上的所有引脚图
全部模块vcc接5v,gnd接gnd,!!!除了蜂鸣器vcc接3.3v
语音模块:b7接开发板的RXD.5 wPi 4口
蜂鸣器:I/O接开发板的 wPi 7口
舵机:PWM接开发板的wPi 5口
超声波:Trig 接开发板的wPi 0口,Echo 接开发板的wPi 1口
5、环境变量
添加环境变量命令 export PATH=$PATH:(你想要添加的环境变量路径),
我添加的环境变量路径因为里面有自用需包含头文件的 uartTool.h,如果下列操作编译不通过可能没有这个头文件,或者有其他库没安装。
6、编译运行
(1)服务运行端rubbinTest.c
先编译,编译rubbinTest.c 和 uartTool.h通过,没通过,看编译报警
gcc rubbinTest.c uartTool.c -lwiringPi -lwiringPiDev -lpthread -lm -lcrypt -lrt
运行(sudo是用户超级权限,./a.out是运行程序,/dev/ttyS5是串口,127.0.0.1 是本地可用ip,8989是端口号)
sudo ./a.out /dev/ttyS5 127.0.0.1 8989
(2)socket控制端clientTest.c
先编译,gcc clientTest.c -o client
编程出运行程序名字叫client
运行
./client 127.0.0.1 8989
三、代码
rubbinTest.c文件的代码
#include <stdio.h>
#include <string.h>
#include <wiringPi.h>
#include <sys/time.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <pthread.h> //线程
#include <sys/types.h> //socket
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include "uartTool.h"
#define BEEP 7 //设置7针脚为蜂鸣器控制引脚
#define Trig 0
#define Echo 1
#define SG90Pin 5
int fd;
int jd = 0;
double distance;
int jd_bak;
char get_cmd;
/******socket所需变量**************/
char readBuf[128];
static int c_fd;
int n_read;
int fdPipe[2];
//int pid;
char buf[128];
/********************/
static int i = 0;
static int openCnt = 0;
static int openUart = 0;
static int openSocket = 0;
static int j = 0;
/***********服务器指令控制****************/
char get_cmd_type(char *get_cmd)
{
if(strstr(get_cmd,"open") !=NULL) return 'O';
if(strstr(get_cmd,"close") !=NULL) return 'C';
if(strstr(get_cmd,"alarm") !=NULL) return 'A';
return 'E';//error
}
void* mysocket_cmd()
{
while(1){
// memset(buffer,'\0',sizeof(buffer));
// serialGetstring(fd, buffer);
memset(readBuf,0,sizeof(readBuf));
n_read = read(c_fd,readBuf,128);
if(n_read == -1){
perror("read");
}else{
printf("\n read get:%s\n",readBuf);
get_cmd = get_cmd_type(readBuf);
}
printf("socket GET->0x%c\n",get_cmd);
switch(get_cmd){
case 'O':
printf("open\n");
openSocket = 1;
close(fdPipe[0]);//无名管道,用于进程间通信
write(fdPipe[1],&openSocket,sizeof(int));
// wait();
break;
case 'C':
printf("close\n");
if(distance < 10.00){
openSocket = 1;
}else{
openSocket = 0;
}
close(fdPipe[0]);//无名管道,用于进程间通信
write(fdPipe[1],&openSocket,sizeof(int));
// wait();
break;
case 'A':
printf("alarm\n");
break;
default :
printf("input cmd error!\n");
}
}
}
/*********串口部分语音控制部分************/
void* readSerial()
{
char cmd;
while(