前言
从全国电子大赛的开始到结束,我们历经四天三夜的作品创作和一个月的作品等测结果,最后荣获国二。在前几天我们看到了立创的作品征集开源活动,我和我的队友们毫不犹豫的选择报名参加活动,我们想让更多的电子爱好者们了解我们“具有发电功能的储能小车”的这个作品,也想与更多的电子爱好者交流技术。
个人介绍
杨杰海
广西贵港
就读于广西职业技术学院
梁伟林
广西梧州
就读于广西职业技术学院
宋乐乐
广西贵港
就读于广西职业技术学院
项目分析
一 任务
设计并制作一个具有发电功能的智能小车,该小车具有液晶显示功能,采用超级电容(法拉电容)作为储能元件。手动推动小车在图 1 所示的手动发电区内,从 A 点单向直线运动至 B 点,重复该过程 5 次,完成一次完整充电过程,为超级电容充电。充电完成后的小车,按要求完成规定动作。
二 要求
1. 基本要求
(1) 小车在充电过程中,能够点亮 LED 指示灯。
(2) 将完成充电的小车,置于地面的指定起始点,一键启动,小车延迟 1s后向前行驶直至完全停止,测量小车从起始点到停止点的直线距离 L1,要求 L1 不小于 100cm,小于 100cm 扣分。
(3) 要求小车能实时显示其行驶距离。
2. 发挥部分
(1) 小车在手动发电区内完成充电后,将小车置于图 1 所示的圆形循迹区起 始点 S,一键启动,小车延迟 1s 后沿着黑色圆形循迹线行驶直至完全停止,记录小车行驶距离 L2, L2越远越好。
(2) 在圆形循迹线下方放置多枚人民币壹元硬币,要求小车在行驶的第一圈探测硬币,每探测到一枚硬币 LED 灯点亮一次,并显示探测硬币的枚数。一圈后 不再检测,错检、漏检或多检均扣分,硬币由参赛队自带。
项目功能介绍
本小车电路相对比较简单,单片机的使用的是Arduino NANO板编程起来也比较简单功耗也不大,但为了省电节能,把模块板上的供电led灯给焊掉。使用的是两个电机并联给电容充电,使用循迹模块来实现小车走小圆圈功能,检测硬币使用金属模块来实现检测到硬币就会发送一个高电平信号给单片机处理计数显示在屏幕上。记录距离这方面使用红外光电传感器模块,获取传感器发送的脉冲,通过单片机计算4mm为一个脉冲,然后再屏幕上显示距离。
主要模块:
单片机模块(Arduino NANO)
循迹模块
升压模块
金属模块
红外光电传感器模块
Nokia5110液晶显示模块
金属模块:使用的是PNP型接近开关
工作原理:PNP型接近开关使用的是PNP三极管作为输出,通过电阻将输出端下拉到地,将GND作为公共端。在没有到位信号时,PNP三极管的基极是高电平,三极管不导通,接近开关输出低电平;当有到位信号时,三极管的基极是低电平,三极管导通,接近开关输出高电平。PLC通过检测接近开关输出端的高低电平来判断是否到位。
循迹模块:它用的是CN70反射型红外对管,一共有三个
反射式光电传感器的工作原理:自带一个光源和一个光接收装置,光源发出的光经过待测物体的反射被光敏元件接收,再经过相关电路的处理得到所需要的信息。可以用来检测地面明暗和颜色的变化,也可以探测有无接近的物体。(循迹模块实际中是自己焊接的下面是电路图)
(循迹模块)红外光电传感器模块:使用的是对射型红外对管,通过光珊轮产生脉冲信号,一圈20个脉冲信号,再送给单片机进行计算通过显示屏显示。
升压模块:使用的是PW5100,这是一款非常好的升压模块,最低能够工作的电压是0.7V,非常适合我们这个项目。
单片机模块(Arduino NANO):编程简单,运行处理信息速度够用。
Nokia5110液晶显示模块:
Nokia5110是一款经典机型,由于较经典,旧机器很多,所以很多电子工程师就把旧机器的屏幕拆下来,自己驱动Nokia5110,用于开发的设备显示。取代LCD1602。5110采用84x48 的点阵LCD,可以显示4 行汉字;特点包括:
1) 性价比高,LCD1602可以显示32个字符,而Nokia5110可以显示15个汉字,30个字符。Nokia5110裸屏仅8.8元,LCD1602一般15元左右,LCD12864一般50~70元。
2) 接口简单,仅四根I/O线即可驱动,LCD1602需11根I/O线,LCD12864需12根。
3) 速度快,是LCD12864的20倍,是LCD1602的40倍。
4) Nokia5110工作电压3.3V,正常显示时工作电流200u以下,具有掉电模式,适合电池供电的便携式移动设备。
电机驱动
电机驱动这方面我们采用的是使用是4800场效应管来驱动电机,因为场效应管驱动方式是电压驱动,相比较普通的npn型三极管更好。
系统构图
原来的原理图
原来的PCB图
(由于比赛时间紧来不及改PCB图,所以实物用的是原pcb图,注:需要把原有的接到A7,A5,A4口断掉,接到A7-TX1,A5-RX0,A4-D7口,还有原原理图中不要的不用焊接。)
电路原理图
电路PCB图
(不想用原PCB也可以用已经改好的)
模块实物图
循迹模块:
金属探测模块:
测距模块(红外光电传感器模块):
车外观(有点粗糙):
程序代码
#include <Nokia5110.h>
#include <MsTimer2.h>
Nokia5110 lcd;
int JuLi=0;
int dlnum=200;
int Plus_Distance = 0;
int Plus_Cion = 0;
float cmPerPlus = 0.4; //每个脉冲代表的长度,单位cm
const byte ledPin = 13;
const byte interruptPin1 = 2;//距离测量传感器信号脚
const byte interruptPin2 = 3;//硬币检测信号脚
const byte CionSensorCtrPin = 4;//硬币传感器电源控制脚
unsigned char DistanceBuff[] = {"Juli:0000mm "};
unsigned char CoinNumBuff[] = {"CoinNumber:0 "};
byte sensor[3] = {0, 0, 0};
// 电机设置 //
#define Left_PIN 6
#define Right_PIN 5
// 循迹模块设置 //
#define left_track_PIN A0
#define middle_track_PIN A1
#define right_track_PIN A2
//键盘定义
#define K1 A6
#define K2 7
#define K3 1
#define K4 0
#define middle_track_PIN A1
#define right_track_PIN A2
void motor_control(void); //电机控制
void motor_pinint( ); //引脚初始化
void KeyPinInit();
void KeyPinInit()
{
// pinMode(K1, INPUT_PULLUP);
pinMode(K2, INPUT_PULLUP);
pinMode(K3, INPUT_PULLUP);
pinMode(K4, INPUT_PULLUP);
}
/*循迹模块引脚初始化*/
void track_pinint( )
{
pinMode (left_track_PIN, INPUT); //设置引脚为输入引脚
pinMode (middle_track_PIN, INPUT);//设置引脚为输入引脚
pinMode (right_track_PIN, INPUT); //设置引脚为输入引脚
}
/*电机引脚初始化*/
void motor_pinint( )
{
pinMode (Left_PIN, OUTPUT); //设置引脚为输出引脚
pinMode (Right_PIN, OUTPUT); //设置引脚为输出引脚
}
void ShowDistance() {//显示距离
lcd.LcdXY(0, 0);
lcd.LcdWriteString(DistanceBuff);
}
void ShowCoinNum() {//显示硬币数量
lcd.LcdXY(0, 0);
lcd.LcdWriteString(CoinNumBuff);
}
void setup() {
lcd.initLCD(9, 8, 10, 12, 11); //CLK,DIN,DC,CE,RST
motor_pinint();
track_pinint();
KeyPinInit();
pinMode(interruptPin1, INPUT_PULLUP);
pinMode(interruptPin2, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptPin1), JuLiCeL, RISING);
attachInterrupt(digitalPinToInterrupt(interruptPin2), YBJC, FALLING);
Plus_Distance = 0;
Plus_Cion = 0;
pinMode(CionSensorCtrPin,OUTPUT);
pinMode(ledPin,OUTPUT);
MsTimer2::set(500,zhong_duan);
}
void zhong_duan()
{
digitalWrite(ledPin,0);
MsTimer2::stop();
}
void JuLiCeL()//测量距离
{
unsigned int temp;
noInterrupts();
Plus_Distance++;
JuLi = (unsigned int)(Plus_Distance * cmPerPlus * 10);
DistanceBuff[5] = JuLi / 1000 + 0x30;
DistanceBuff[6] = JuLi / 100 % 10 + 0x30;
DistanceBuff[7] = JuLi / 10 % 10 + 0x30;
DistanceBuff[8] = JuLi % 10 + 0x30;
interrupts();
}
void YBJC()//硬币检测
{
noInterrupts();
if(JuLi<1800){ Plus_Cion++;digitalWrite(ledPin,1);}
CoinNumBuff[11] = Plus_Cion/10 + 0x30;
CoinNumBuff[12] = Plus_Cion%10 + 0x30;
interrupts();
MsTimer2::start();
}
void Stop()
{
digitalWrite(Left_PIN, 0);
digitalWrite(Right_PIN, 0);
}
void TurnLeft()
{
digitalWrite(Left_PIN, 0);
digitalWrite(Right_PIN, 1);
}
void TurnRight()
{
digitalWrite(Left_PIN, 1);
digitalWrite(Right_PIN, 0);
}
void Go()
{
digitalWrite(Left_PIN, 1);
digitalWrite(Right_PIN, 1);
}
void Move()
{
if (analogRead(left_track_PIN) * 5.0 / 1023 >= 0.5)sensor[0] = 1;
else sensor[0] = 0;
if (analogRead(middle_track_PIN) * 5.0 / 1023 >= 2.8)sensor[1] = 1;
else sensor[1] = 0;
if (analogRead(right_track_PIN) * 5.0 / 1023 >= 0.9)sensor[2] = 1;
else sensor[2] = 0;
if (sensor[0] == 0 && sensor[1] == 0 && sensor[2] == 0) //黑线外是1,黑线内是0
{
Go();
}
else if ((sensor[0] == 0 && sensor[1] == 0 && sensor[2] == 1) || (sensor[0] == 0 && sensor[1] == 1 && sensor[2] == 1))
{
TurnLeft();
}
else if ((sensor[0] == 1 && sensor[1] == 0 && sensor[2] == 0) || (sensor[0] == 1 && sensor[1] == 1 && sensor[2] == 0))
{
TurnRight();
}
else
{
Stop();
}
}
void loop() {
while (1) {
if (digitalRead(K4)==0)
{
delay(1000);
while (1)
{
ShowDistance();
Go();
}
}
if (digitalRead(K3)==0)
{
delay(1000);
while (1)
{
Move();
}
}
if (digitalRead(K2)==0)
{
digitalWrite(CionSensorCtrPin,HIGH);
while (1)
{
ShowCoinNum();
Move();
}
}
}
}
总结
这让我收获了很多东西,学会了很多。经过了这件事我们知道了在日常学习的重要性,在这次比赛中我们也用到了很多平时觉得用不到的比如:圆的周长;欧姆定律等。
在这次比赛中我们也知道了团结的重要性,队长是一个很重要的位置,有了队长就要相信队长,不可以自己有想法了就自己去干自己的,应该是先和队长商量,这样才能得出最好的解法,这样才是最好的。在我们做作品的过程也遇到了很多困难,我们都会一步一步的解决他。不会因为遇到点困难就相互的说,而是在一起想办法解决。
!注意:请使用浏览器自带下载,迅雷等下载软件可能无法下载到有效资源。
欢迎加入EEWorld参考设计群,也许能碰到搞同一个设计的小伙伴,群聊设计经验和难点。 入群方式:微信搜索“helloeeworld”或者扫描二维码,备注:参考设计,即可被拉入群。 另外,如您在下载此设计遇到问题,也可以微信添加“helloeeworld”及时沟通。
EEWorld Datasheet 技术支持