第二周汇总
概况
主要进行了抢答器的完成,从开始的计划筹备,以及元器件的选择,线路的连接,到对各个元器件进行逐个学习,完成单人的答题流程,到最后的整体连线,元器件的连接固定和故障调试,初步完成了抢答器的基本功能。
抢答器概要
本设计最终目的实现三路抢答功能,不同分值的加分功能,惩罚功能。为完成设计要求需要完成各个模组的线路连接,以及软件的架构,和最后软硬件的对接和测试。
硬件分析:抢答器的硬件主体为arduino Mega 2560单片机,所有其他模块接收到的数据都是由它采集和处理的。一个最基础的抢答单元,需要一个抢答按钮和作为提示的灯光蜂鸣器,需要一块LED显示屏展示得分情况,这里选用的是linksprite系列的Serial 16x2 LCD。最后需要使用舵机完成惩罚操作。
软件分析:单片机能对采集到的信息进行判断,选择出优先做出抢答的选手,还需要判断情况,根据不同模块传导的数据来进行不同分值的加分和惩罚工作。最后需要能在一次答题的整个流程结束后,迅速进入到下一次的准备中。
流程分析
根据题目的需求与任务,我们做了一个初步的想法。首先在开始抢答时,迅速判断出领先的选手,并立即使当前选手前的LED灯泡点亮和蜂鸣器长响,示意该选手完成抢答。接着程序自动进入到答题倒计时阶段(需要将时间展现给选手),计时结束后,由主持人做出选择,判断正误,若正确,则进入到加分环节,将设置几个不同的分值按钮可供选择,接着展示展示当前所有选手分值,流程结束。或回答错误,按下相应按钮后,触发惩罚程序,流程结束
相关的代码
串行led
#include <SoftwareSerial.h>
#define txPin 2
SoftwareSerial LCD = SoftwareSerial(0, txPin);
// since the LCD does not send data back to the Arduino, we should only define the txPin
const int LCDdelay=10; // conservative, 2 actually works
// wbp: goto with row & column
void lcdPosition(int row, int col) {
LCD.write(0xFE); //command flag
LCD.write((col + row*64 + 128)); //position
delay(LCDdelay);
}
void clearLCD(){
LCD.write(0xFE); //command flag
LCD.write(0x01); //clear command.
delay(LCDdelay);
}
void backlightOn() { //turns on the backlight
LCD.write(0x7C); //command flag for backlight stuff
LCD.write(157); //light level.
delay(LCDdelay);
}
void backlightOff(){ //turns off the backlight
LCD.write(0x7C); //command flag for backlight stuff
LCD.write(128); //light level for off.
delay(LCDdelay);
}
void serCommand(){ //a general function to call the command flag for issuing all other commands
LCD.write(0xFE);
}
void setup()
{
pinMode(txPin, OUTPUT);
LCD.begin(9600);
backlightOn() ;
clearLCD();
lcdPosition(0,0);
LCD.print("Hello world from LinkSprite!");
}
void loop()
{
}
四路七段数码管
#include "TM1637.h"
#define CLK 3//pins definitions for TM1637 and can be changed to other ports
#define DIO 2
TM1637 tm1637(CLK,DIO);
void setup()
{
tm1637.init();
tm1637.set(BRIGHT_DARKEST );//BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;
}
int i=0;
int a=0;
int b=0;
int c=0;
int d=0;
void loop()
{
int b1=0;
b1=analogRead(A0);
if(b1==1023)
{delay(300);
i++;
}
if(i<10)
{a=i;}
if(i>=10)
{a=i%10;b=i/10;}
tm1637.display(0,b);
tm1637.display(1,a);
tm1637.display(2,c);
tm1637.display(3,d);
delay(1000);
}
数据结构与SPI的学习
只是进行了初步的了解,关于SPI串行外设接口总线,其各个接口信号线的作用,以及数据传输时的大概流程。
SPI接口共有4根信号线,分别是:设备选择线、时钟线、串行输出数据线、串行输入数据线。设备选择线。
SS-;(CS)设备选择线 SS-线用于选择激活某Slave设备,低有效,由Master驱动输出。只有当SS-信号线为低电平时,对应Slave设备的SPI接口才处于工作状态。
SCLK:同步时钟信号线 SCLK用来同步主从设备的数据传输,由Master驱动输出,Slave设备按SCK的步调接收或发送数据。
串行数据线: SPI接口数据线是单向的,共有两根数据线,分别承担Master到Slave、Slave到Master的数据传输;但是不同厂家的数据线命名有差别。 Motorola的经典命名是MOSI和MISO,这是站在信号线的角度来命名的。
MOSI:When master, out line; when slave, in line
MISO:When master, in line; when slave, out line
不过,也有一些产家(比如Microchip)是按照类似SDI,SDO的方式来命名,这是站在器件的角度根据数据流向来定义的。 SDI:串行数据输入 SDO:串行数据输出。
多Slave的应用
SPI 也支持多Slave应用。多个Slave共享时钟线、数据线,可以直接并接在一起;而各Slave的片选线SS则单独与Master连接,受Master 控制。在一段时间内,Master只能通过某根SS线激活一个Slaven进行数据传输。Slave的时钟线和数据线端口则都应保持高阻状态,以免影响当前数据传输的进行。
关于数据结构
认识数据结构,数据,数据元素,数据项,数据对象。逻辑结构包括集合结构,线性结构,树形结构和图形结构。物理结构包括顺序存储结构和链式存储结构。初步掌握了算法效率的度量方法和算法时间复杂度的计算。
遇到的问题
对单片机上的引脚不够熟悉,错误的将LED3连接在了13好接口,导致其在通电后不停闪烁,错误的将8号接口定义为舵机的控制接口,导致舵机2在通电后一直进行自行旋转,并影响到了LED屏的正常工作。
各个元器件上的跳线过多,未进行正确的梳理,导致乱糟糟一团,在连线到面包版以及单片机时产生了很多操作上的难度,尤其是当其中一根跳线脱落时,更加难以排查。
对于控制串行UART 16x2 LCD,四七段数码管,舵机的复杂代码,只能做到最基本的使用和简单的修改,没能彻底掌握。