2021年I题-具有发电功能的储能小车-步行也得行队 - 嘉立创EDA开源硬件平台

编辑器版本 ×
标准版 Standard

1、简单易用,可快速上手

2、流畅支持300个器件或1000个焊盘以下的设计规模

3、支持简单的电路仿真

4、面向学生、老师、创客

专业版 professional

1、全新的交互和界面

2、流畅支持超过3w器件或10w焊盘的设计规模,支持面板和外壳设计

3、更严谨的设计约束,更规范的流程

4、面向企业、更专业的用户

标准版 2021年I题-具有发电功能的储能小车-步行也得行队

  • 6.4k
  • 1
  • 3

简介:设计并制作一个具有发电功能的智能小车,该小车具有液晶显示功能,采用超级电容(法拉电容)作为储能元件。

开源协议: Public Domain

(未经作者授权,禁止转载)

创建时间: 2021-12-12 16:44:37
更新时间: 2023-07-02 01:34:10
描述

前言
从全国电子大赛的开始到结束,我们历经四天三夜的作品创作和一个月的作品等测结果,最后荣获国二。在前几天我们看到了立创的作品征集开源活动,我和我的队友们毫不犹豫的选择报名参加活动,我们想让更多的电子爱好者们了解我们“具有发电功能的储能小车”的这个作品,也想与更多的电子爱好者交流技术。           
个人介绍
杨杰海
广西贵港
就读于广西职业技术学院
梁伟林
广西梧州
就读于广西职业技术学院
宋乐乐
广西贵港
就读于广西职业技术学院

项目分析

一 任务

设计并制作一个具有发电功能的智能小车,该小车具有液晶显示功能,采用超级电容(法拉电容)作为储能元件。手动推动小车在图 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通过检测接近开关输出端的高低电平来判断是否到位。

QQ图片20211215135849

循迹模块:它用的是CN70反射型红外对管,一共有三个

反射式光电传感器的工作原理:自带一个光源和一个光接收装置,光源发出的光经过待测物体的反射被光敏元件接收,再经过相关电路的处理得到所需要的信息。可以用来检测地面明暗和颜色的变化,也可以探测有无接近的物体。(循迹模块实际中是自己焊接的下面是电路图)

QQ图片20211215134743

(循迹模块)红外光电传感器模块:使用的是对射型红外对管,通过光珊轮产生脉冲信号,一圈20个脉冲信号,再送给单片机进行计算通过显示屏显示。

QQ图片20211215140144

升压模块:使用的是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型三极管更好。

系统构图

系统组成框图

原来的原理图

QQ图片20211216200420

原来的PCB图

(由于比赛时间紧来不及改PCB图,所以实物用的是原pcb图,注:需要把原有的接到A7,A5,A4口断掉,接到A7-TX1,A5-RX0,A4-D7口,还有原原理图中不要的不用焊接。)

QQ图片20211216200443

电路原理图


电路PCB图

(不想用原PCB也可以用已经改好的)

QQ图片20211215163009

QQ图片20211215162850

QQ图片20211215162846

模块实物图

循迹模块:

IMG_20211217_091747

金属探测模块:

IMG_20211217_091758

测距模块(红外光电传感器模块):

IMG_20211217_091831

车外观(有点粗糙):

IMG_20211217_111658

IMG_20211217_111731

IMG_20211217_111707

IMG_20211217_091737

程序代码

#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();

}

}

}

}

总结

这让我收获了很多东西,学会了很多。经过了这件事我们知道了在日常学习的重要性,在这次比赛中我们也用到了很多平时觉得用不到的比如:圆的周长;欧姆定律等。
在这次比赛中我们也知道了团结的重要性,队长是一个很重要的位置,有了队长就要相信队长,不可以自己有想法了就自己去干自己的,应该是先和队长商量,这样才能得出最好的解法,这样才是最好的。在我们做作品的过程也遇到了很多困难,我们都会一步一步的解决他。不会因为遇到点困难就相互的说,而是在一起想办法解决。

设计图
原理图
1 /
PCB
1 /
未生成预览图,请在编辑器重新保存一次
侵权投诉
相关工程
换一批
加载中...
添加到专辑 ×

加载中...

温馨提示 ×

是否需要添加此工程到专辑?

温馨提示
动态内容涉嫌违规
内容:
  • 153 6159 2675

服务时间

周一至周五 9:00~18:00
  • 技术支持

support
  • 开源平台公众号

MP