论坛» DIY与开源设计» 电子DIY

w759067820的智能车DIY进程贴--!更新至小车绕8字!

菜鸟
2015-05-25 12:40 1楼

平衡车,好高大上。。一个月前接触STM32,刚好碰到这个活动,做个东西练练手。为以后参加各种电子比赛做准备!第一次做这个东西,发现自己还有很多很多东西需要学习!珍惜这个机会!开干!

发现给的资料都是用寄存器版本写的,程序不方便解读。所以我决定,用库函数再学习一次!

一楼作为快捷跳楼方式,方便查看!点击即可链接。。


1-------------------------------组装-------------------------

2----------------------软件安装与程序烧录---------------补充了蓝牙连接教程!

3--------------------------学习进程-------------------------觉得写得不够详细,又重新更了!


3.1点亮LED学习。

3.2按键学习。

3.3OLED显示 学习。

3.4AD采集、获得电压值

3.5定时器学习

4----------------------------电机驱动实验--------------------------------

5-----------------------编码器数据采集实验 ---------------------------

6-------------------------------蓝牙控制----------------------------------

7------------------------------超声波避障--------------------------------

8------------------------------小车绕8字---------------------------------

9--------------------总结--------------------

学习进行中------

终于有视频咯!


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

院士
2015-05-25 13:25 2楼
Go on
菜鸟
2015-05-25 16:32 3楼

一、组装

!准备好所有的组装材料,开始组装!(悲催的发现少了一个固定OLED的螺丝,应该无关紧要吧)

第一步。将车底架的电机的螺丝拧好,为固定主板做准备。

第二步。紧接着将电池放在上面!PS,发现这硬件设计不是一般好,简直perfect.电池刚刚卡在柱子中!这种电池也是杠杠的!妈妈再也不担心我的速度了!!

第三步。固定好主控制板!

第四步。固定好上亚克力板。

第五步。装上轮胎,插上电源线和电机线。组装完毕!

上电试一试,发现里面卖家已经下载好测试程序。上电后就能看到OLED上面显示各种参数。可以看到工作方式、温度、电机转速、电压、角度值。


保持平衡,按下按键,整个小车就能顺利的工作了,工作时OLED参数就不动态显示额。用手推动小车,小车能恢复平衡,但是用力过猛,会出现翻车现象。拿起来电机猛转,感觉角度度超过某个设定值就电子就不工作了。

最后帖一张小车自平衡的图!

接下来的工作再看看程序。增加新功能。

视频录制之中。。敬请期待!

菜鸟
2015-05-26 11:14 4楼

软件的安装

以前学习51用的keilC51版,然后又学习32,又得再安装一个ARM版本的keil。两个软件有的时候会不兼容,所以觉得特别不方便。后来发现了这个keil5软件。可以同时使用C51和ARM。

此楼附上我的Keil软件。
点击此处下载链接: http://pan.baidu.com/s/1i39vPMP 密码: j7sr

先安装4个安装keil安装和补丁文件,在进行破解。一定要安装keil5pack,不然选择不了芯片!

程序的烧录

使用MCUISP 烧录机进行程序的烧录,

第一步。硬件准备

连接好USB串口下载线

PA10----连接下载器TXD

PA9-----连接下载器RXD

GND连接

将小车拨码开关拨到OFF

第二步。软件的下载按照图中所示。即可给小车下载程序了。

注意:下载程序后,重新上电要将拨码开关拨到ON,小车才能运行

蓝牙连接

第一步,将资料中的APP安装到安卓手机上面

第二步、蓝牙里面先对蓝牙设备进行配对,配对密码为 1234 。紧接着打开APP,按照下图所示步骤连接蓝牙。


成功连接后就可以通过蓝牙来控制小车!

高工
2015-05-26 11:44 5楼

不错

菜鸟
2015-05-27 18:09 6楼

想了想,我还是觉得要从零开始学起,第一步点亮LED灯。库函数走起!!


一、查看LED连接的原理图

注意图示的LED方向错了

再原理图中LED灯连接 PB8 端口,根据图示说明 ,只要将 PB8 IO口的电平拉低,就将点亮LED灯!

二、编写LED端口初始化的程序:在程序中,使用IO口模式为推挽输出。

三、编写LED点亮的子程序;由于使用的位带(bit-band)操作,使得操作STM32的IO口如同51一样方便。大大提高了编程的速度!

支持位带操作的两个内存区的范围是:
0x2000_0000‐0x200F_FFFF(SRAM 区中的最低 1MB)
0x4000_0000‐0x400F_FFFF(片上外设区中的最低 1MB)
对 SRAM 位带区的某个比特,记它所在字节地址为 A,位序号为n(0<=n<=7),则该比特在别名区的地址为:
AliasAddr=0x22000000+((A-0x20000000)*8+n)*4=0x22000000+(A-0x20000000)*32+n*4
对于片上外设位带区的某个比特,记它所在字节的地址为 A,位序号为 n(0<=n<=7),则该比特在别名区的地址为:
AliasAddr=0x42000000+((A-0x40000000)*8+n)*4=0x42000000+(A-0x40000000)*32+n*4
上式中,“*4”表示一个字为 4 个字节,“*8”表示一个字节中有 8 个比特。
举个例子定义PBout端口,那么

A = GPIOA_BASE + ODR的偏移地址 = GPIOA_BASE + 0x0c

A = GPIOA_BASE + IDR的偏移地址 = GPIOA_BASE + 0x08

#define GPIOB_ODR_Addr (GPIOB_BASE+12)//0x40010C0C

#define BitBand(Addr, BitNum)*((volatile unsigned long *)((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))//乘32等于左移5乘5等于左移2

#define PBout(n) BitBand(GPIOB_ODR_Addr,n)

#define LED1 PBout(8)

具体实现思想,参考<>第五章(87页~92页).

这样就可以对LED1进行位操作

在程序中是这么实现的:

//位带操作,实现51类似的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)//输入

同时宏定义LED端口
#define LED1 PBout(8)

LED点亮的子程序:

最后、在主程序中点亮LED

int main(void)
{
delay_init();
LED_Init();
while(1)
{
LED_Flash(200);//led闪烁延时200ms
}
}

这样就顺利的点亮了LED灯!

菜鸟
2015-05-28 15:59 7楼

按键学习:

一、根据原理图设置IO口;由图中可以知道 按键IO口为 PB 5,并且连接有上拉电阻,所以在配置IO口的时候需要配置为上拉输入模式GPIO_Mode_IPU。同时按键输入信号为低电平。

二、进行按键的初始化,在案件的初始化过程中,我们需要知道的是按键所用GPIOB挂在RCC_APB2控制总线上,所以在初始化中,第一步需要使能PB端口的时钟,使用函数为RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); 然后再进行IO的配置过程,管脚为PB5,模式使用上拉输入模式GPIO_Mode_IPU;

这里需要注意在时钟初始化RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE),写成RCC_APB1PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE),在编译过程中,是不会报错的!

以下为按键初始化函数:

在主函数中调用KEY-Init();进行初始化!

三、进行按键扫描函数的编写,这里我们可以调用GPIO_ReadInputDataBit()函数来读取IO口的状态;可以在.h文件中宏定义#define KEY0 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5),我们简单的进行按键扫描程序的编写:

void Key_Scan(void)
{
if(KEY1==0)
{
delay_ms(10); //按键消抖
//这里写按键操作的程序 比如:

LED1 = ~LED1;
}
}
这只是我简单的学习程序,就能实现按键的操作!当然在实际实践中,还是要参考DIY例程中的程序,能将一个按键进行多种控制方式!

菜鸟
2015-06-05 23:45 8楼

OLED的测试:

先科普一下OLED,即有机发光二极管( Organic Light-Emitting Diode),又称为有机电激光显示( Organic
Electroluminesence Display, OELD)。 OLED 由于同时具备自发光,不需背光源、对比度高、
厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优
异之特性,被认为是下一代的平面显示器新兴应用技术。
LCD 都需要背光,而 OLED 不需要,因为它是自发光的。这样同样的显示, OLED 效果要来得好一些。 以目前的技术, OLED 的尺寸还难以大型化,但是分辨率确可以做到很高。

OLED的接口方式:8080 接口方式
CS: OLED 片选信号。
WR:向 OLED 写入数据。
RD:从 OLED 读取数据。
D[7: 0]: 8 位双向数据线。
RST(RES):硬复位 OLED。
DC:命令/数据标志( 0,读写命令; 1,读写数据)。

4线串行(SPI)接口方式也是小车使用的口方式

CS: OLED 片选信号。
RST(RES):硬复位 OLED。
DC:命令/数据标志( 0,读写命令; 1,读写数据)。
SCLK:串行时钟线。
SDIN:串行数据线。

根据原理图和小车硬件的设置:原理图标识有错误!

OLED连线为

D/C----------PB9
RST--------PC13

SCLK------PC15

SDIN-------PC14

我觉得对于OLED,我先搞懂怎么用,具体的我暂时不打算深究!我想原理应该和点阵差不多吧。我只了解了接口,然后了解显示函数的用法就行了。以后再研究研究吧!

附上我的ID show!


助工
2015-06-06 00:00 9楼

非常棒,原理图的错误十分抱歉!

菜鸟
2015-06-09 20:05 10楼

最近,学校安排实训!然后周末又要考四级!时间安排不当,这周就不打算更了!我要努力的考四级,都考了3次了,还没过!

共32条 1/4 1 2 3 4 跳转至

回复

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