【Intel Edison Roadshow】二等奖项目:Care Here
本帖最后由 孙毅 于 2016-12-27 23:12 编辑因为各种原因好久没有跟大家分享了啊。好吧,一直看着别人参加intel Edison roadshow 一直都是分享着别人的比赛项目,终于可以参加比赛了,好久了,兴奋已经消退,把大概内容跟大家分享一下吧:
这次的参赛项目是《Care Here》,大概是让大家可以更近距离的接触心肺复苏训练这样的项目,以及可以起到推广以及扩大公众认知的效果。
有了这样的idea之后,初步的方案是这样的:
然后下面就是具体的实现了:
首先,找一个类似的假人,如下图:
然后,在胸部的四个黄色的点处分别放置一个压电陶瓷传感器。如下图所示:
https://wiki.dfrobot.com.cn/images/thumb/c/c5/DFR0052_x.png/300px-DFR0052_x.png
接着,在空腔处放置一个 水流计,如下图:
https://wiki.dfrobot.com.cn/images/thumb/e/e9/SEN0216.jpg/300px-SEN0216.jpg
基本上必要的硬件已经差不多了,轮到我们的主角上场了——Edison。相信在DF论坛里久泡的坛友们,对Edison并不陌生了,关于基础知识,这里也不赘述了吧。
连好线后的状态是这个样子:
这里简单描述下传感器的接线方法:
1, 压电陶瓷输出是模拟量,所以分别接在了Edison Arduino扩展板的A0-A3上。
2, 水流计输出是方波,接在Edison Arduino扩展板的模拟口或者数字口均可,为方便这里接在了A4上面。
3,使用了一个 小氪机器人 双模蓝牙模块,将模块的串口接在了扩展板的RX 和 TX 上。
好了,传感器准备完毕了,废话不多说,直接上code了:
当然,code大家可以直接在github上下载到:
https://github.com/ysun/edison_roadshow/blob/master/uart.c
#include "stdio.h"
//!
#include "mraa.h"
#include <unistd.h>
#include <fcntl.h>
#include <sys/select.h>
#define READ_TERMINAL 0
#define WRITE_TERMINAL 1
#define NUM_PRESS 5
mraa_uart_context uart;
mraa_aio_context adc_a0;
struct ARG {
int ano;
};
void mydelay(int n) {
int z = 0;
for(z = 0; z < n; z++);
}
int data_press = {0};
char buffer[] = {'\xFF','\x55',
'\x02','\x1','\x15',
'\xEE'};
int do_main(int argc, char** argv);
static void sleep_ms(unsigned int secs) {
struct timeval tval;
tval.tv_sec=secs/1000;
tval.tv_usec=(secs*1000)%1000000;
select(0,NULL,NULL,NULL,&tval);
}
void thread_press(struct ARG *arg) {
uint16_t adc_value = 0, max_value = 0, value_pre = 0,value_cur = 0;
char pre_high = 0;
// int i = 0;
while(1) {
sleep_ms(100);
adc_value = value_cur = mraa_aio_read(adc_a0);
if (arg->ano == 4) {
value_cur = abs(adc_value - value_pre);
if(value_cur > 50) {
buffer = value_cur;
buffer = arg->ano + 1;
mraa_uart_write(uart, buffer, sizeof(buffer));
printf("press: %d: %d\n", arg->ano, value_cur);
}
value_pre = adc_value;
} else {
if(adc_value > 50) {
pre_high = 1;
max_value = max_value > adc_value ? max_value: adc_value;
} else {
if(pre_high) {
buffer = max_value;
buffer = arg->ano + 1;
mraa_uart_write(uart, buffer, sizeof(buffer));
printf("press: %d: %d\n", arg->ano,max_value);
}
max_value = adc_value;
pre_high = 0;
}
}
// adc_value_float = mraa_aio_read_float(adc_a0);
// data_press = adc_value;
// i = (i + 1) %5;
}
}
int main(int argc, char** argv)
{
pthread_t pid_press;
struct ARG arg_press;
int ret = 0, i;
//Init UART
uart = mraa_uart_init(0);
mraa_uart_set_baudrate(uart, 115200);
if (uart == NULL) {
fprintf(stderr, "UART failed to setup\n");
return EXIT_FAILURE;
}
//test uart write!
//mraa_uart_write(uart, buffer, sizeof(buffer));
for(i = 0; i<NUM_PRESS; i++) {
//Init AIO
adc_a0 = mraa_aio_init(i);
if (adc_a0 == NULL) {
fprintf(stderr, "AIO0[%d] failed to setup\n", i);
}
//Create child thread!
arg_press.ano = i;
ret = pthread_create(&pid_press, NULL, (void*)thread_press, (void*) &arg_press);
if(ret != 0)
printf("Thread Create Error: %d\n", i);
}
pthread_join(pid_press, NULL);
//But, should not run here!
pthread_join(pid_press, NULL);
printf("Main Ends\n");
mraa_uart_stop(uart);
mraa_deinit();
// mraa_aio_close(adc_a0);
return EXIT_SUCCESS;
}
int do_main(int argc, char** argv) {
return 0;
}
int aio() {
return MRAA_SUCCESS;
}
然后,更有情怀的来了,我们仅用了10个小时做了一个Android App
打开Care Here APP,可以通过搜索蓝牙,连接小氪机器人的蓝牙模块,然后会显示如下界面:
然后,随着心肺复苏的动作,这个界面会给你指导提示:比如频率的高低、位置的上下左右、按压力度的大小 以及 呼气的大小等等。
这里比较懒,就只截了默认画面,没有连接假人。有兴趣的同学们可以自己尝试下。当然,我们依然有情怀的分享了APP的source code!
https://github.com/ysun/HereCare
好吧,希望这个项目可以给大家带来一些启发和乐趣!
最后,必须来一张获奖照片:
@Ash 大大,我完成任务了,希望还不是很晚啊,你懂得~~!{:5_166:} 孙毅 发表于 2016-12-27 23:13
@Ash 大大,我完成任务了,希望还不是很晚啊,你懂得~~!
大肾注意身体,头发又少了 hnyzcj 发表于 2016-12-29 09:56
大肾注意身体,头发又少了
你又看见了?! 你还穿着那款经典小寸衫 {:5_153:} 666
页:
[1]