这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 意念控制平衡小车

共16条 1/2 1 2 跳转至

意念控制平衡小车

专家
2015-06-27 17:01:22     打赏

终极目标:意念控制小车行进!

大致像这样,方式是一样的

关于脑电波,请点击



视频地址:http://player.youku.com/player.php/sid/XMTI2MTk5MDM4NA==/v.swf


DIY进程计划 <>


一步一个脚印:

1、Mini Balance原理图的解读

2、楼主在EEPW有史以来最长的帖子之知其所以然——STM32F1xx Cortex-M3 Keil uVision 环境搭建及建立工程

3、趁热打铁——玩转GPIO之点亮LED

4、硬件消抖效果显著——中断实验之按键控制LED亮&灭

5、串口屏输出显示——片上ADC实验之测量电池电压

6、四种呼吸频率模式——PWM实验之呼吸的LED

7、PWM实验之五彩斑斓RGB LED灯(RGB LED)

8、简单电机控制实验之电机正反转

9、串口实验之收集脑波数据上位机显示(脑电模块)

10、I2C实验之OLED显示(OLED)

11、暴走的变色龙小车(TCS3200+RGB LED)

12、SPI实验之nRF24L01无线通信(nRF4L01)

13、六轴姿态实验之MPU6050上位机模拟

14、脑电控制小车行进




关键词: 意念     控制     平衡     小车     姿态     OLED     PWM         

专家
2015-06-27 17:23:39     打赏
2楼

Mini Balance Car原理图的解读


一、电源



整个电路中有三种电压:1、电池电压即电机驱动供电:12V左右  2、电机驱动芯片数字逻辑和超声波模块供电电压:5V  3、系统和大部分外设芯片供电电压:3.3V


二、数字接口


1、LED接PB8——>PB8在Datasheet里显示是复用接口

同时是通用定时器TIM4的接口,可用作PWM功能,控制LED作为呼吸灯,即可以实现实验3和6

2、按键S3接PB5,接法是上拉,平时处于高电平,按键按下是低电平,一次来检测按键是否按下


3、拨码开关常态下使BOOT0处于高电平,可用来选择STM32的BOOt方式



原理图中PB2/BOOT1接地,即BOOT[1:0]=01;启动模式为系统存储器

4、线性CCD接口需要一个ADC接口和一个可以产生时钟信号的接口,原理图中用到了PB4、PA12、PA7



所以PB4接线性CCD模块的串行输入SI 脚,PA12接线性CCD模块的时钟管脚SCL,来控制电荷转换、像素输出和芯片复位,PA7接线性CCD模块的模拟输出口


5、串口&超声波模块接口


6、无线模块nRF24L01接口


采用了SPI总线方式,非GPIO模拟SPI方式


7、OLED接口

OLED可选择为SPI或I2C接口驱动方式,课件原理图设计的是模拟这两种串行总线的方式来驱动OLED的


8、电机编码器接口

A

B

都接了STM32的定时器接口,方便计算小车行进速度



专家
2015-06-27 19:25:39     打赏
3楼

继续剖析原理图部分



9、MPU6050接口

六轴传感器只用了两根线接MCU

但实际上并没有用STM32的片内I2C接口,是用GPIO模拟I2C接口的


10、电机驱动芯片接口

PB0和PB1用来产生PWM波,达到PID调节电机转速的目的

PB12~PB15用来控制电机转动方向


11、蓝牙接口

很简单,直接接串口上


12、串口1接口是使用的UART1


13、调试接口没什么说的,按照datasheet连接的


专家
2015-06-27 19:35:08     打赏
4楼

小车明天到,周末企业单位快递公司不送快递,打电话催才确定明天给送

找了几样手上有用的工具

J-link V9还有两块nRF24L01模块,还有块STM32最小系统板,用来采集脑电数据


专家
2015-06-27 19:44:03     打赏
5楼

对了,脑电采集有专门的模块,不用很麻烦,模块已经帮助把脑电的数据都采集量化了


下面这个是和脑电没有关系的,是心电模块,可以采集人体的心电信息,从而计算出心率脉搏以及评估HRV,预测疾病风险





专家
2015-06-30 08:45:35     打赏
6楼

首先来科普下脑电波


脑电波(Electroencephalogram,EEG)是大脑在活动时,脑皮质细胞群之间形成电位差,从而在大脑皮质的细胞外产生电流。它记录大脑活动时的电波变化,是脑神经细胞的电生理活动在大脑皮层或头皮表面的总体反映。



现代科学研究已经知道,人脑工作时会产生自己的脑电波,可用电子扫描仪检测出,至少有四个重要的波段。经过研究证实大脑在至少有四个不同的脑电波。

脑电波是是一些自发的有节律的神经电活动,其频率变动范围在每秒1-30次之间的,可划分为四个波段,即δ(1-3Hz)、θ(4-7Hz)、α(8-13Hz)、β(14-30Hz)。 (这几种波的频率边界,在学界还没有完全统一的标准。亦有学者认为δ波小于4Hz,θ波4~7Hz,α波8~12Hz,β波13~35Hz,并认为有大于35Hz的脑电波,并命名为γ波。长期处于该状态下的人会有生命危险)

δ波,频率为每秒1-3次,当人在婴儿期或智力发育不成熟、成年人在极度疲劳和昏睡状态下,可出现这种波段。

θ波,频率为每秒4-7次,成年人在意愿受到挫折和抑郁时以及精神病患者这种波极为显著。但此波为少年(10-17岁)的脑电图中的主要成分。

α波,频率为每秒8-13次,平均数为10次左右,它是正常人脑电波的基本节律,如果没有外加的刺激,其频率是相当恒定的。人在清醒、安静并闭眼时该节律最为明显,睁开眼睛或接受其它刺激时,α波即刻消失。

β波,频率为每秒14-30次,当精神紧张和情绪激动或亢奋时出现此波,当人从睡梦中惊醒时,原来的慢波节律可立即被该节律所替代。

在人心情愉悦或静思冥想时,一直兴奋的β波、δ波或θ波此刻弱了下来,α波相对来说得到了强化。因为这种波形最接近右脑的脑电生物节律,于是人的灵感状态就出现了(摘自孙作东著《激活沉睡的脑》一书)。



脑电波或脑电图是一种比较敏感的客观指标,不仅可以用于脑科学的基础理论研究,而且更重要的意义在于它的临床实践的应用,与人类的生命健康息息相关。

脑电波是诊断癫痫的必要依据,脑电波对于各种颅内病变,如脑中风、脑炎、脑瘤、代谢性脑病变等,亦有很大的诊断帮助。脑波图仍是目前研究睡眠最客观的依据,藉由监测睡眠中脑波变化,人们可以区分睡眠中的不同时期。



专家
2015-07-25 12:14:06     打赏
7楼

温馨提示:图片中包含的相关目录在页面放大的情况下观看更清晰

看懂此教程后,包你对STM32的开发中减少绝大部分疑惑!


2、STM32F1xx Cortex-M3 Keil uVision 环境搭建及建立工程

内容及目的:以安装MDK5为例搭建STM32开发环境

准备工作:MDK5安装包(破解版,商业行为请购买正版!)

安装过程:略(鉴于大家多数都是玩过单片机的,对于MDK不再陌生,安装过程很简单,并且网上的安装及破解教程很多)

什么是STM32的库?

STM32库是由ST公司针对STM32提供的函数接口,即API(Application Program Interface,使用STM32的开发者可以调用这些函数接口来配置STM32的寄存器,使开发人员得以脱离最底层的寄存器操作(当然你很乐意玩抽象的寄存器的话,也可以试试寄存器版的STM32开发!只能说,然并卵!ST的工程师已经帮你做了这部分开发工作,那么较真干嘛),有开发快速、易于阅读、维护成本低的优点。

当我们调用库里的API时可以不用挖空心思去了解库底层的寄存器操作,就像我们最初学习C语言时使用printf()函数一样,不用去研究它的代码如何实现,只需要学会它的使用格式即可!

有过编码经验的开发人员都知道库是架设在寄存器与用户驱动层之间的代码,向下处理与寄存器直接相关的配置,向上为用户提供配置寄存器的接口。

STM32结构及库层次关系

必须了解什么是“CMSIS标准”!

CMSIS是ARM公司与多家不同的芯片和软件供应商一起紧密合作定义的,提供了内核与外设、实时操作系统中间设备之间的通用接口。同样,我们使用STM32,ST公司使用ARM公司的Cortex-M3片技术的授权,提供了在内核之外的部件,被我们称之为片上外设。如STM32芯片的模数转换器ADC、串口UART、定时器TIM等。

CMSIS标准中最主要的是CMSIS核心层,它包括:

※内核函数层:其中包含用于访问内核的名称、地址定义,主要有ARM公司定义

※设备外设访问层:提供了片上外设的地址和中断定义,主要由像ST这样的芯片生产厂商提供

可见CMSIS层位于硬件层与操作系统或用户层之间,提供了与芯片厂商无关的硬件抽象层,可以为借口外设、实时操作系统提供简单的处理器软件接口,屏蔽了各个芯片厂商的硬件差异,对软件的移植具有很大的好处。STM32固件库就是按照CMSIS标准建立的。也就是说如果今后我们学习其他芯片厂商如NXP、TI、Freescale、ADI等生产的Cortex-M3时同样可以灵活使用,达到举一反三。

那么在此我就提供一个STM32开发人员经常使用的STM32固件库,其实在网络中很容易下载得到,这里我借花献佛提供给伸手党

STM32F10x_StdPeriph_Lib_V3.5.0.rar

以及固件库开发相关的文档

STM32固件库使用手册的中文翻译版.pdf

Stm32寄存器与库函数概览(摘自固件库使用手册).doc


更多资料后续陆续上传......



库目录、文件简介

有了固件库文件,那么它的目录下面的目录和文件是做什么用的呢?

以上提供的3.5的固件库解压后内容如下:


1)_htmrescST 的logo 完全无用,不用理会

2)Libraries比较重要的文件包含STM32的系统文件和大量头文件,也就是库文件了

3)Project包含大量外设的例程,和各个软件版本的评估版工程模板。KEIL 对应的就是MDK-ARM 文件下的工程模板。你也可以利用这个工程模板来修
改,得到你自己的工程模块(不推荐)

4)Utilities就是评估版的相关文件:暂时不会用到,无视

5)Release_Notes.html:库版本更新说明

6)最后一个带问号的是库使用帮助文档

还有以上这些目录下的文件,

core_cm3.c/.h :CMSIS标准的核内设备函数层的CM3核通用的源文件和头文件



system_stm32f10x.c此文件的功能是设置STM32复杂的系统时钟和总线时钟



stm32f10x.h包含STM32中寄存器地址和结构体类型定义,使用到STM32固件库的地方都要包含此头文件

启动文件:不同的文件对应不同的芯片型号,使用时需要注意

※cl:互联型产品,stm32f105/107系列

※vl:超值型产品,stm32f100系列

※xl:超高密度(容量)产品,stm32f102/103系列

※ld:低密度产品,flash小于64KB

※md:中等密度产品,flash等于64KB或128KB

※hd:高密度产品,flash大于128KB

提示:本次活动采用的是STM32F103C8T6,flash为64KB,故在下面将要建立的MDK工程中选择英文缩写为md的文件!



STM32F10x_StdPeriph_Driver文件夹包含inc(include)和src(source)两个文件夹,属于CMSIS设备外设函数。src里面的每个设备外设驱动程序.具体到每个.c文件的用途,有点单片机知识的都会知道是干什么用的,以后在使用中用到再提一下。



stm32f10x_it.c和stm32f10x_conf.h下图的文件夹下存放了官方的库工程模板,我们在用库建立一个完整的工程时,需要添加stm32f10x_it.c、stm32f10x_it.h和stm32f10x_conf.h这三个文件。stm32f10x_it.c专门用来编写中断服务函数,其中包含了相当多的中断函数接口,实现函数都是空的,需要开发人员自己编写实现中断处理函数,并且这些中断处理函数的名称是不可以随便修改的。stm32f10x_conf.h文件被包含在了stm32f10x.h文件中,用来配置工程当中使用了什么外设的头文件。

其它






一、建立工程模板

1)启动Keil uVision5,通过工具栏Project->New uVision Project新建工程,并保存在事先计划好的目录下


2)接下来选择目标器件,此次活动选用的是STM32F103C8T6

由于MDK5的特性和之前版本有些许差别,这里会弹出我已经安装过的器件系列,之前玩过BLE,所以会出现这个,选择默认的第一个选项跳转到器件选择



选择相应器件






这里会弹出我之前下载安装过的一些东西,先无视,直接  ok






新建立的工程下目录是空的,为了便于工程的结构清晰,我们首先需要在工程目录下建立这样几个新文件夹

USER(用于存放工程文件和用户层代码,包裹主函数main.c)

FWlib(用于存放STM32库里的inc和src这两个文件夹,这两个文件夹包含了芯片上的所有驱动,这两个文件夹下的文件是不需要我们修改的)

CMSIS(用于存放库为我们自带的文件和一些位于CMSIS层的文件)

Output(用于保存软件编译厚输出的文件,如最终的烧写到STM32的flash里的.HEX文件)

Listing(由于MDK编译生成的大量链接文件,便于归类,建立此文件夹加以保存)

...

这些文件夹不是必须的,只是为了做一个习惯良好的“处女座”(PS:其实楼主是巨蟹!)



楼主事先建好的文件夹,已经添加好相应的文件


步骤:

1)将下图的inc和src文件夹放在自己建立的工程目录下的目录FWlib(楼主的.../Demo/FWlib)



放置后的结果



2)将下图的工程模板放到USER目录下(楼主的.../Demo/USER)



放置后的结果


3)将下图的几个文件和文件夹放在CMSIS文件夹下(楼主的.../Demo/CMSIS)





放置后的结果



好了,接下来回到Keil工程

右键Target1图标->Manage Project Iterms...

弹出的对话框添加以上几个文件夹,相应的,你可以在该工程文件夹下手动先建立这几个文件夹STARTCODE、USER、FWlib、CMSIS







向这几个工程文件夹下添加相应的文件或/和文件夹

STARTCODE工程文件夹下为启动文件(此次活动主器件STM32F103C8T6对应startup_stm32f10x_md.s)


USER工程文件夹下添加main.c和stm32f10x_it.c



FWlib工程文件夹下添加src文件夹下的所有.c文件(当然遇到具体的需求按照需求添加,有些文件可能不需要,全选会避免漏掉某个文件,但是会大大延长Keil编译工程的时间)



CMSIS工程文件夹下添加core_cm3.c、system_stm32f10x.c文件


至此,MDK工程已经基本能建好



接下来配置MDK的某些选项卡

点击Options for Target...选项


1)Output选项指向我们建立的Output文件夹,选中Create HEX File选项



2)ListingOutput选项指向我们建立的Listing文件夹


3)在C/C++选项的下图两个地方添加内容

其中Define:栏添加两个宏定义:USE_STDPERIPH_DRIVER,STM32F10X_MD

添加USE_STDPERIPH_DRIVER时因为我们使用ST的官方库,添加STM32F10X_MD是因为我们使用的芯片是中等容量的。

在Include Path:栏添加头文件目录



添加完成后的结果



4)由于本次活动提供了串口和SWD两种程序下载接口,在Keil工程中以STLink为下载器设置相关选项



下图选择SW模式


Flash Download选项添加芯片下载算法



若下载完复位并且启动,勾选此项

Utilities选项勾选去除图中选项


选择STLink

至此,所有设置完毕!



专家
2015-07-25 17:10:21     打赏
8楼

3、趁热打铁——玩转GPIO之点亮LED

所需3.5版本固件库文件:

※STARTCODE/start_stm32f10x_md.s

※CMSIS/core_cm3.c

※CMSIS/system_stm32f10x.c

※FWlib/stm32f10x_gpio.c(GPIO配置相关)

※FWlib/stm32f10x_rcc.c(时钟配置相关)

用户代码:

※USER/main.c

※USER/stm32f10x_it.c(中断服务程序,此处没有用到)

※USER/led.c、led.h及其它

/*****************************************

led.c

******************************************/

#include "stm32f10x.h"
#include "led.h"

/************************************************************

硬件连接 LED------>GPIOB.8

*************************************************************/
void LED_Init(void)
{
//定义一个GPIO_InitTypeDef类型的的结构体
GPIO_InitTypeDef GPIO_InitStructure;
//开启GPIOB的外设时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
//选择需要控制的引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
//设置引脚模式为通用推挽输出,因为本次活动的原理图中LED用GPIO驱动的,为了提高驱动能力,故选择推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
//设置引脚速率为50MHz
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//调用库函数初始化GPIOB
GPIO_Init(GPIOB,&GPIO_InitStructure);
//默认关闭LED灯,输出高电平关闭,低电平开启
GPIO_SetBits(GPIOB,GPIO_Pin_8);
}

/***********************************************

端口模式借鉴正点原子的做法,使用起来很方便

port.h

************************************************/

#ifndef __PORT_H
#define __PORT_H
#include "stm32f10x.h"

//便于GPIO的操作,这里引入宏定义,定义GPIO输入还是输出
//IO口操作宏定义
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))

//IO口地址映射
#define GPIOA_ODR_Addr    (GPIOA_BASE+12) //0x4001080C
#define GPIOB_ODR_Addr    (GPIOB_BASE+12) //0x40010C0C
#define GPIOC_ODR_Addr    (GPIOC_BASE+12) //0x4001100C
#define GPIOD_ODR_Addr    (GPIOD_BASE+12) //0x4001140C
#define GPIOE_ODR_Addr    (GPIOE_BASE+12) //0x4001180C
#define GPIOF_ODR_Addr    (GPIOF_BASE+12) //0x40011A0C
#define GPIOG_ODR_Addr    (GPIOG_BASE+12) //0x40011E0C

#define GPIOA_IDR_Addr    (GPIOA_BASE+8) //0x40010808
#define GPIOB_IDR_Addr    (GPIOB_BASE+8) //0x40010C08
#define GPIOC_IDR_Addr    (GPIOC_BASE+8) //0x40011008
#define GPIOD_IDR_Addr    (GPIOD_BASE+8) //0x40011408
#define GPIOE_IDR_Addr    (GPIOE_BASE+8) //0x40011808
#define GPIOF_IDR_Addr    (GPIOF_BASE+8) //0x40011A08
#define GPIOG_IDR_Addr    (GPIOG_BASE+8) //0x40011E08

//IO口操作,只对单一的IO口!
//确保n的值小于16!
#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //输出
#define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //输入

#define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //输出
#define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //输入

#define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  //输出
#define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  //输入

#define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  //输出
#define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  //输入

#define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  //输出
#define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  //输入

#define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  //输出
#define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)  //输入

#define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)  //输出
#define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)  //输入

#endif


/***************************************************

main.c

****************************************************/

#include "stm32f10x.h"
#include
#include "led.h"

int main(void)
{
LED_Init();//LED初始化
while(1)
{
LED = ON; //开启LED

}

}










专家
2015-07-26 13:10:26     打赏
9楼



中断实验出现按键抖动严重的现象


视频地址:http://player.youku.com/player.php/sid/XMTI5MzQ3MTA0MA==/v.swf



由于软件消抖是采用延时的方法,所以中断信号会被延时过程所屏蔽,于是在按键两端加一颗电容进行硬件消抖,效果相当明显


视频地址:http://player.youku.com/player.php/sid/XMTI5Mzg1MTU0OA==/v.swf


专家
2015-08-01 14:33:38     打赏
10楼

今天完成STM32片内ADC的实验

实验目的:测量板载电池电压(DMA方式),使用串口输出到串口屏幕上


共16条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]