这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【更新至自制模块化平衡小车第二版】hlwhlw的两轮自平衡小车DIY进程帖​​

共45条 1/5 1 2 3 4 5 ›| 跳转至

【更新至自制模块化平衡小车第二版】hlwhlw的两轮自平衡小车DIY进程帖​​

助工
2015-05-23 16:04:26     打赏

我的两轮自平衡小车DIY进程开始了。。。

一楼作为进程更新的超链接


1、两轮自平衡小车的组装及测试·······································2楼

2、手机蓝牙连接平衡小车测试视频·····································5楼

3、平衡小车超声波避障················································6楼

平衡小车套件实验

实验1.LED闪烁·························································7

实验2.电机驱动实验····················································8

实验3.编码器数据采集实验·············································9

实验4.无线通讯实验(NRF24L01)··································10楼

实验5.传感器驱动实验(读取mpu6050原始数据)···················11楼

实验6.多传感器数据融合实验·········································12楼

实验7.PID调试实验···················································13

实验8. 实现平衡小车直立时处于静止状态·····························15

实验9.实现平衡小车绕圈圈············································16

实验10.实现平衡小车绕八字行走······································18

验11.实现小车自主避障·············································20

实验12.平衡小车跟踪移动物体·········································22

实验13.实现体感控制平衡小车·········································24

实验14.平衡小车在桌面静止···········································26



自制模块化平衡小车搞起

模块化平衡小车硬件篇······································27

模块化平衡小车相关硬件说明及资料·························30

模块化平衡小车直立调试····································32

模块化平衡小车桌面直立····································35

模块化平衡小车直立抗干扰··································36

手机蓝牙控制模块化平衡小车································37


自制模块化平衡小车第二版

自制模块化平衡小车第二版之硬件篇···························38

自制模块化平衡小车第二版之桌面直立·························39

自制模块化平衡小车第二版之直立抗干扰·······················40

自制模块化平衡小车第二版之手机蓝牙控制平衡小车············41




助工
2015-05-23 17:07:23     打赏
2楼

1、两轮自平衡小车的组装及测试

今天终于收到快递了,包装得非常棒,防震措施做得很好(忘记拍照了),迫不及待组装起来。

组装之前,当然要看“【EEPW专版】平衡小车使用说明(必看)”啦。


根据说明书一步一步组装,只要细心一点就一定可以组装好的哦

1、安装轮胎


2、安装4个双通螺柱


3、安装电池

注意:电池正面朝上,稍微用力压一下,使得电池刚好卡住


4、安装主板(使用 M2X16 铜柱(4 个)固定主板)


5、安装显示屏(部分套餐没有)

注意排针要自己焊接上去哦


6、接上电机线

这里必须要吐槽一下啦,由于电机线被捆扎线捆扎了,导致线太短了。因为害怕把电机线弄坏了,我只好轻轻地把电机线拉长出来,花了好一会儿时间,而且电机线有点旧,把我的手也弄脏了。

注意:把电池充电线放在电机线后面哦,这样电池充电线就不会影响到小车的移动啦,需要充电的时候再拿出来

强烈建议:店主在测试小车的时候不要用捆扎线啦,直接发两根捆扎线给我们自己来捆就行啦。



7、安装上层保护亚克力板(务必安装来保护电路板)

撕掉黄色的纸 ,就是透明的板子啦

使用四个螺丝锁紧固定。


8、接上电池接头


最后,上几张小车平衡时的靓照




下面附上测试视频。

注意:拨动左边的开,此时,红灯开始慢慢闪烁,代表蓝牙在等待配对,系统供电正常。与此同时,蓝灯也开始闪烁,代表着单片机已经正常启动了。但是,这时小车还不能保持直立,我们只需按一下小车左上方的按键,小车就可以保持平衡了。


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


菜鸟
2015-05-24 01:21:53     打赏
3楼
娃哈哈  挺好

助工
2015-05-24 09:07:59     打赏
4楼
你看看,如果电路板选择180度安装是不是线长恰到好处呢

助工
2015-05-24 15:34:45     打赏
5楼

2、手机蓝牙连接平衡小车测试视频

小车保持平衡后,把 Mini Balance_v1.2.apk 安装到安卓手机上,安装完成后打开 软件Mini Balance 这时会弹出“蓝牙请求许可”,点击“是”,再点击安卓手机的 menu键(菜单键),在弹出的菜单栏选择【连接设备】,在弹出的菜单栏点击【查找设备】,稍等片刻,会在【其他可用设备】中显示 SPP_CA,点击选择它。然后系统提示输入密码,输入 1234 即可。至此,蓝牙连接成功了,可以尽情地玩耍啦


蓝牙连接成功的截图


软件界面功能说明



最后附上视频




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

助工
2015-07-14 23:41:14     打赏
6楼

助工
2015-07-19 12:42:38     打赏
7楼

实验1.LED闪烁

实验目的:通过让stm32板子的LED闪烁,学习建立基本的stm32寄存器版本工程模板,用寄存器的方法实现对GPIO口的基本操作。

实验过程及分析:首先参照小车配套的学习程序建立工程模板,接下来就是写3个函数让LED亮起来,分别是main.c,LED.C,LED.H;同时在sys.h里注释掉没有用到的头文件。

学习要点:寄存器的配置(根据stm32的中文参考手册),C语言的位操作,条件编译,函数调用,宏定义,包含头文件等。具体见代码

LED.C

#include "led.h"
//初始化 PB8 为输出口.并使能PORTB口的时钟
void LED_Init(void)
{
RCC->APB2ENR|=1<<3; //使能 PORTB 时钟

GPIOB->CRH&=0XFFFFFFF0;//先清零PB8,而不影响其他位
GPIOB->CRH|=0X00000003;//PB8  推挽输出 最大速度50M
GPIOB->ODR|=1<<8; //PB8 输出高
}

LED.H

#ifndef __LED_H
#define __LED_H
#include "sys.h"
//LED 端口定义
#define LED PBout(8) // PB8
void LED_Init(void);  //初始化

#endif


main.c

#include "sys.h"
#include "led.h"
int main(void)
{
Stm32_Clock_Init(9);            //系统时钟设置
delay_init(72);                 //延时初始化
JTAG_Set(JTAG_SWD_DISABLE);     //=====关闭JTAG接口
JTAG_Set(SWD_ENABLE);           //=====打开SWD接口 可以利用主板的SWD接口调试
LED_Init();                     //初始化与 LED 连接的硬件接口
while(1)
{
GPIOB->ODR|=1<<8; //PB8 输出高 灯灭
delay_ms (500);

GPIOB->ODR=~(1<<8);//PB8输出低 灯亮
delay_ms (500);
}

}


实验现象:stm32板子的蓝色LED在闪烁。(同时有红色的LED也在闪烁,红色LED是检测蓝牙用的,与本实验无关)



实验总结:根据所要实现的功能建立相应的.C和.H文件,在.C文件里实现初始化功能,在.H文件里进行条件编译,在main.c文件里实现具体的功能。


遇到问题:为什么用ST—LINK下载程序后,要关掉stm32板子的开关,再打开开关,程序才能运行?我已经在MDK里设置run to main()了。




已解决:要把  reset and run 勾上





助工
2015-07-29 23:42:54     打赏
8楼


实验2.电机驱动实验

一.实验目的通过驱动电机,学习stm32的PWM输出,用配置寄存器的方法实现对stm32的PWM输出。

二.实验过程及分析:首先在LED灯闪烁的工程上添加motor.c和motor.h文件,然后修改main.c;同时在sys.h里注释掉没有用到的头文件。

学习要点:电机驱动芯片TB6612的使用,熟悉寄存器的配置(根据stm32的中文参考手册),stm32实现PWM输出的具体配置步骤。


电机驱动芯片TB6612的使用:

具体查看TB6612的数据手册,重点是如何看懂TB6612的控制功能表


接下来就是用stm32来控制TB6612芯片,从而驱动电机了。

具体就要看小车主板的原理图,重点是电机驱动部分的原理图

结合TB6612的控制功能表,我们知道只需控制IN1,IN2,PWM就可以实现驱动电机正反转了,具体就是控制PB0,PB1,PB12,PB13,PB14,PB15引脚。

具体实现可以看配套程序里面的motor.c和motor.h文件,注释非常详细。

然后修改main.c即可,具体见代码。

main.c


#include "sys.h"


int main(void)

{

Stm32_Clock_Init(9);            //系统时钟设置

delay_init(72);                 //延时初始化

JTAG_Set(JTAG_SWD_DISABLE);     //=====关闭JTAG接口

JTAG_Set(SWD_ENABLE);           //=====打开SWD接口 可以利用主板的SWD接口调试

LED_Init();                     //初始化与 LED 连接的硬件接口

MiniBalance_PWM_Init(3599,0);  //f = 72 000 000 /((3599+1)*(0+1)) = 20K

//=====初始化PWM 20KHZ 高频可以防止电机低频时的尖叫声



while(1)

{


PWMA = 2000;  //#define PWMA   TIM3->CCR4  在2000时电平发生翻转

PWMB = 2000;  //#define PWMB   TIM3->CCR3  在2000时电平发生翻转


GPIOB->ODR=~(1<<8);//PB8输出低 灯亮



AIN1 = 0;  //逆时针转(CCW)

AIN2 = 1;


// AIN1 = 1;  //顺时针转(CW)

// AIN2 = 0;


// BIN1 = 0;  //逆时针转(CCW)

// BIN2 = 1;


BIN1 = 0;  //顺时针转(CW)

BIN2 = 1;

}

}


可以在程序里修改PWMA和PWMB的值,实现改变电机的速度;

修改AIN1和 AIN2 的值,BIN1和 BIN2 的值实现改变电机的方向。


三.实验现象:电机转动起来了

四.实验总结:本次实验的主要学习目的是学会如何使用电机驱动芯片TB6612和用stm32输出PWM来驱动电机。


遇到问题:小车左右电机给同样的占空比,但速度相差很大。

刚开始我怀疑是小车的轮胎和电机轴的连接紧密程度有关,可后来把轮胎拆了,发现原来两个电机的电机轴转动的速度同样相差很大,甚至moto2电机的占空比是moto1电机的一半,可是moto2电机转得比moto1电机还快。

应该电机有问题,或者还有其他什么原因?



我发现原因了,LED的配置影响到PB0和PB1了。

我把GPIOB->ODR=~(1<<8);//PB8输出低 灯亮

改为GPIOB->ODR &= ~(1<<8);//PB8输出低 灯亮 电机正常转动了。



助工
2015-08-08 19:50:45     打赏
9楼

实验3.编码器数据采集实验


一.实验目的:通过编码器采集车轮转速,学习stm32的编码器接口模式功能,用配置寄存器的方法实现对stm32的编码器接口模式进行配置,并且利用串口把车轮转速打印出来。


二.实验过程及分析:首先在电机驱动实验的工程上添加control.c和control.h文件,encoder.c和encoder.h文件,timer.c和timer.h文件,然后修改main.c;同时在sys.h里注释掉没有用到的头文件。


学习要点:定时中断的初始化,编码器接口模式的配置,串口打印输出,在中断里读取编码器采集到的数据。


定时中断的初始化:具体见timer.c和timer.h文件,直接使用配套程序里面的程序,然后注释掉超声波部分即可。


编码器接口模式的配置:具体见encoder.c和encoder.h文件,直接使用配套程序里面的程序,就是把TIM2和TIM4初始化为编码器接口模式 ,然后在单位时间读取编码器计数值,返回车轮转动的速度。


中断处理函数:control.c和control.h文件,就是5ms读取一次编码器的值,然后利用串口打印输出来。


main.c


#include "sys.h"

int Encoder_Left,Encoder_Right;             //左右编码器的脉冲计数


int main(void)

{

Stm32_Clock_Init(9);            //系统时钟设置

delay_init(72);                 //延时初始化

JTAG_Set(JTAG_SWD_DISABLE);     //=====关闭JTAG接口

JTAG_Set(SWD_ENABLE);           //=====打开SWD接口 可以利用主板的SWD接口调试

LED_Init();                     //初始化与 LED 连接的硬件接口

uart_init(72,115200);           //初始化串口1

MiniBalance_PWM_Init(3599,0);  //f = 72 000 000 /((3599+1)*(0+1)) = 20K

//=====初始化PWM 20KHZ 高频可以防止电机低频时的尖叫声


Encoder_Init_TIM2();          //把TIM2初始化为编码器接口

Encoder_Init_TIM4();            //初始化编码器2


Timer1_Init(49,7199);           //=====5MS进一次中断服务函数


while(1)

{

GPIOB->ODR &= ~(1<<8);//PB8输出低 灯亮


PWMA = 2000;  //#define PWMA   TIM3->CCR4  在2000时电平发生翻转

PWMB = 2000;  //#define PWMB   TIM3->CCR3  在2000时电平发生翻转


AIN1 = 0;  //逆时针转(CCW)

AIN2 = 1;


// AIN1 = 1;  //顺时针转(CW)

// AIN2 = 0;


// BIN1 = 0;  //逆时针转(CCW)

// BIN2 = 1;



BIN1 = 0;  //顺时针转(CW)

BIN2 = 1;

}

}


control.c


#include "control.h"

int TIM1_UP_IRQHandler(void)

{

if(TIM1->SR&0X0001)//5ms定时中断

{

TIM1->SR&=~(1<<0); //===清除定时器1中断标志位

Encoder_Right=Read_Encoder(4);           //===读取编码器的值

Encoder_Left=-Read_Encoder(2);     //===读取编码器的值,

//因为两个电机的旋转了180度的,所以对其中一个取反,保证输出极性一致

printf("%d,%d\r\n",Encoder_Left,Encoder_Right); //编码器值采集实验

}

return 0;

}


control.h


#ifndef __CONTROL_H

#define __CONTROL_H

#include "sys.h"


int TIM1_UP_IRQHandler(void);

#endif


三.实验现象:车轮在转动的同时,stm32通过串口1发送编码器读到的数值(车轮转速)发送到串口调试助手上。


四.实验总结:本次实验的主要学习目的是学会stm32的编码器接口模式配置、定时中断的初始化以及中断处理函数的编写。


助工
2015-08-11 16:52:35     打赏
10楼

实验4.无线通讯实验(NRF24L01)

一.实验目的:通过无线通讯实验,学习stm32对NRF24L01的驱动,用两个NRF24L01分别作为主机和从机,实现双机通讯。

二.实验过程及分析:本实验利用野火开发板作为主机板,小车主板作为从机板,通过修改野火的无线传输-2.4G从机例程,移植到小车主板上,实现从机功能;而主机则是直接用野火的无线传输-2.4G主机例程,从而实现了双机通讯。

学习要点:NRF24L01模块的驱动,采用SPI驱动;主机和从机都可以设置为发送和接收模式,利用串口把主机和从机接收到的数据打印到串口调试助手上。

NRF24L01模块简介

本实验采用的无线模块芯片型号为 NRF24L01+,是工作在 2.4~2.5GHz 频段的,具备自动重发功能,6 个数据传输通道,最大无线传输速率为 2Mbits。MCU 可与该芯片通过SPI 接口访问芯片的寄存器进行配置,达到控制模块、通过该模块实现无线通讯的目的。

NRF 无线模块规格图

NRF无线模块引脚描述

原理图

从机程序在bsp_spi_nrf.c和bsp_spi_nrf.h修改相应引脚即可。


注意:引脚复用问题

JTAG调试用的引脚和24l01引脚复用了,所以应该关闭相应引脚的复用功能。

在从机的main函数里面SPI的初始化之前加上以下程序

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

//使能AFIO时钟

GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);

//开启SWD,失能JTAG


先开启从机的电源,再开启主机的电源(这是由实验代码的执行流程决定的)。

三、实验现象如下

主机端

从机端


四.实验总结:本次实验的主要学习目的是利用stm32的SPI驱动NRF24L01模块,实现双机通讯;同时应注意引脚的复用问题


共45条 1/5 1 2 3 4 5 ›| 跳转至

回复

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