查看: 2496|回复: 5

[项目分享] 【Intel Edison Roadshow】二等奖项目:Care Here

[复制链接]
本帖最后由 孙毅 于 2016-12-27 23:12 编辑

因为各种原因好久没有跟大家分享了啊。好吧,一直看着别人参加intel Edison roadshow 一直都是分享着别人的比赛项目,终于可以参加比赛了,好久了,兴奋已经消退,把大概内容跟大家分享一下吧:
这次的参赛项目是《Care Here》,大概是让大家可以更近距离的接触心肺复苏训练这样的项目,以及可以起到推广以及扩大公众认知的效果。
h1.jpg

h2.jpg


有了这样的idea之后,初步的方案是这样的:

h3.jpg

h4.jpg

然后下面就是具体的实现了:
h5.jpg
首先,找一个类似的假人,如下图:
h6.jpg

然后,在胸部的四个黄色的点处分别放置一个压电陶瓷传感器。如下图所示:


接着,在空腔处放置一个 水流计,如下图:


基本上必要的硬件已经差不多了,轮到我们的主角上场了——Edison。相信在DF论坛里久泡的坛友们,对Edison并不陌生了,关于基础知识,这里也不赘述了吧。

连好线后的状态是这个样子:
h10.jpg
h9.jpg
h8.jpg


这里简单描述下传感器的接线方法:
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

[C] 纯文本查看 复制代码
#include "stdio.h"
//! [Interesting]
#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[NUM_PRESS];

struct ARG {
        int ano;
};

void mydelay(int n) {
    int z = 0;
    for(z = 0; z < n; z++);
}

int data_press[5] = {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[arg->ano]);

        if (arg->ano == 4) {
                value_cur = abs(adc_value - value_pre);

                if(value_cur > 50) {
                        buffer[4] = value_cur;
                        buffer[3] = 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[4] = max_value;
                                buffer[3] = 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[i%5] = adc_value;
//        i = (i + 1) %5;
    }
}

int main(int argc, char** argv)
{
    pthread_t pid_press[5];
    struct ARG arg_press[5];
    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[i] = mraa_aio_init(i);
            if (adc_a0[i] == NULL) {
                    fprintf(stderr, "AIO0[%d] failed to setup\n", i);
            }

            //Create child thread!
            arg_press[i].ano = i;
            ret = pthread_create(&pid_press[i], NULL, (void*)thread_press, (void*) &arg_press[i]);

            if(ret != 0)
                    printf("Thread Create Error: %d\n", i);
    }

    pthread_join(pid_press[0], NULL);

//But, should not run here!
    pthread_join(pid_press[0], 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
h11.jpg
h12.jpg


打开Care Here APP,可以通过搜索蓝牙,连接小氪机器人的蓝牙模块,然后会显示如下界面:
h13.png

然后,随着心肺复苏的动作,这个界面会给你指导提示:比如频率的高低、位置的上下左右、按压力度的大小 以及 呼气的大小等等。
这里比较懒,就只截了默认画面,没有连接假人。有兴趣的同学们可以自己尝试下。当然,我们依然有情怀的分享了APP的source code!
https://github.com/ysun/HereCare

好吧,希望这个项目可以给大家带来一些启发和乐趣!

最后,必须来一张获奖照片:
h13.jpg

孙毅  版主
 楼主|

发表于 2016-12-27 23:13:34

@Ash 大大,我完成任务了,希望还不是很晚啊,你懂得~~!
回复 支持 反对

使用道具 举报

hnyzcj  超级版主

发表于 2016-12-29 09:56:18

孙毅 发表于 2016-12-27 23:13
@Ash 大大,我完成任务了,希望还不是很晚啊,你懂得~~!

大肾注意身体,头发又少了
回复 支持 反对

使用道具 举报

孙毅  版主
 楼主|

发表于 2016-12-29 10:10:36

hnyzcj 发表于 2016-12-29 09:56
大肾注意身体,头发又少了

你又看见了?!
回复 支持 反对

使用道具 举报

hnyzcj  超级版主

发表于 2016-12-29 10:17:52

你还穿着那款经典小寸衫
回复 支持 反对

使用道具 举报

iooops  版主

发表于 2016-12-31 17:28:01

666
回复 支持 反对

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
wifi气象站

硬件清单

btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2019 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail