6077| 5
|
【Intel Edison Roadshow】二等奖项目:Care Here |
本帖最后由 孙毅 于 2016-12-27 23:12 编辑 因为各种原因好久没有跟大家分享了啊。好吧,一直看着别人参加intel Edison roadshow 一直都是分享着别人的比赛项目,终于可以参加比赛了,好久了,兴奋已经消退,把大概内容跟大家分享一下吧: 这次的参赛项目是《Care Here》,大概是让大家可以更近距离的接触心肺复苏训练这样的项目,以及可以起到推广以及扩大公众认知的效果。 有了这样的idea之后,初步的方案是这样的: 然后下面就是具体的实现了: 首先,找一个类似的假人,如下图: 然后,在胸部的四个黄色的点处分别放置一个压电陶瓷传感器。如下图所示: 接着,在空腔处放置一个 水流计,如下图: 基本上必要的硬件已经差不多了,轮到我们的主角上场了——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 [mw_shl_code=c,true]#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 = 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[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; }[/mw_shl_code] 然后,更有情怀的来了,我们仅用了10个小时做了一个Android App 打开Care Here APP,可以通过搜索蓝牙,连接小氪机器人的蓝牙模块,然后会显示如下界面: 然后,随着心肺复苏的动作,这个界面会给你指导提示:比如频率的高低、位置的上下左右、按压力度的大小 以及 呼气的大小等等。 这里比较懒,就只截了默认画面,没有连接假人。有兴趣的同学们可以自己尝试下。当然,我们依然有情怀的分享了APP的source code! https://github.com/ysun/HereCare 好吧,希望这个项目可以给大家带来一些启发和乐趣! 最后,必须来一张获奖照片: |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed