暑假学习第三周
抢答器完成
1)连接好硬件部分,开始运行程序后,无操作时,所有模块处于待机状态,无异常现象。
2)尽可能快的同时按下三个选手的抢答器按钮时,只亮起先按下选手的LED及对应的蜂鸣器发出声音,不存在同时亮灯或都不亮灯的情况。
3)抢答完成等候四位数码管模块上显示5秒的倒计时,倒计时完成后,裁判员根据选手的答题情况选择不同的分值或者给予该选手惩罚措施。
4)按下惩罚按钮后,舵机会转动一圈以示警告。
5)按下加分按钮后,选手分值将显示在LCD显示屏上,并持续5秒钟。
经测试,可以实现抢答器的抢答及加分功能。在所有程序执行完成后即可完成下一回合的抢答,经验证每回合所储存的分数将会正常的进行累加。下图分别为测试图片。
效果图1
效果图2
效果图3
关于操作过程中的调试方法
程序中可以首先使用val=analogRead(potpin)来获取模块当前的返回值,其中potpin是当前要测试模块信号线连接的引脚号,val用于储存返回值,然后再通过Serial.println(val),将返回值显示给用户,用户可使用串口监视器来看到当前模块的返回值以此来判断模块是否正常运行。
设计代码
#include "TM1637.h"
#define CLK 5 //四位数码管 //pins definitions for TM1637 and can be changed to other ports
#define DIO 6 //四位数码管
#include <SoftwareSerial.h>
#include <Servo.h>
Servo myservo1;
Servo myservo2;
Servo myservo3;
#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() { //s on the backlight
LCD.write(0x7C); //command flag for backlight stuff
LCD.write(157); //ght level.
delay(LCDdelay);
}
void backlightOff(){ //s off the backlight
LCD.write(0x7C); //command flag for backlight stuff
LCD.write(128); //ght level for off.
delay(LCDdelay);
}
void serCommand(){ //a general function to call the command flag for issuing all other commands
LCD.write(0xFE);
}
TM1637 tm1637(CLK,DIO);
int pinmod1=11;
int pinmod2=12;//led接口
int pinmod3=13;
int button1=A1;
int button2=A2;
int button3=A3;//led按钮接口
int b1=0;//led按钮
int b2=0;
int b3=0;
int button0=A0;
int buttons=A4;//加分按钮接口
int a=0; //四位数码管
int b=0; //四位数码管
int c=0; //四位数码管
int d=0; //四位数码管
int k=0;
int j=0;
int l=0;
int b0=0;
int a0=0;
void setup(){
pinMode(txPin, OUTPUT);
LCD.begin(9600);
backlightOn() ;
clearLCD();
lcdPosition(0,0);
Serial.begin(9600);
pinMode(button1,INPUT);
pinMode(pinmod1,OUTPUT);
pinMode(button0,INPUT);
pinMode(button2,INPUT);
pinMode(pinmod2,OUTPUT);
pinMode(button3,INPUT);
pinMode(pinmod3,OUTPUT);
myservo1.attach(8);
myservo2.attach(9);
myservo3.attach(10);
tm1637.init();
tm1637.set(BRIGHT_DARKEST ); //BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;
}
void loop(){
b1=analogRead(button1);
if(b1>1000){
for(int i=0;i<400;i++){ //i 抢答器led,蜂鸣器显示
digitalWrite(pinmod1,HIGH);
delay(1);
digitalWrite(pinmod1,LOW);
delay(1);
}
for(int j=5;j>=0;j--){ //j 倒计时显示
d=j;
tm1637.display(0,a);
tm1637.display(1,b);
tm1637.display(2,c);
tm1637.display(3,d);
delay(1000);
}
while (1){
b0=analogRead(button0);
a0=analogRead(buttons);
if(b0>1000){
k++;
break;
}
else if(a0>1000)
{
myservo1.write(0); // 指定舵机转向的角度
delay(700);
myservo1.write(90); // 指定舵机转向的角度
delay(1000); // 等待15ms让舵机到达指定位置
break;
}
}
clearLCD();
LCD.print(k);
delay(5000);
clearLCD();
}
b2=analogRead(button2);
if(b2>1000){
for(int i=0;i<400;i++){ //i 抢答器led,蜂鸣器显示
digitalWrite(pinmod2,HIGH);
delay(1);
digitalWrite(pinmod2,LOW);
delay(1);
}
for(int j=5;j>=0;j--){ //j 倒计时显示
d=j;
tm1637.display(0,a);
tm1637.display(1,b);
tm1637.display(2,c);
tm1637.display(3,d);
delay(1000);
}
while (1){
b0=analogRead(button0);
a0=analogRead(buttons);
if(b0>1000){
j++;
break;
}
else if(a0>1000)
{
myservo2.write(0); // 指定舵机转向的角度
delay(700);
myservo2.write(90); // 指定舵机转向的角度
delay(1000); // 等待15ms让舵机到达指定位置
break;
}
}
clearLCD();
LCD.print(j);
delay(5000);
clearLCD();
}
b3=analogRead(button3);
if(b3>1000){
for(int i=0;i<400;i++){ //i 抢答器led,蜂鸣器显示
digitalWrite(pinmod3,HIGH);
delay(1);
digitalWrite(pinmod3,LOW);
delay(1);
}
for(int j=5;j>=0;j--){ //j 倒计时显示
d=j;
tm1637.display(0,a);
tm1637.display(1,b);
tm1637.display(2,c);
tm1637.display(3,d);
delay(1000);
}
while (1){
b0=analogRead(button0);
a0=analogRead(buttons);
if(b0>1000){
l++;
break;
}
else if(a0>1000)
{
myservo3.write(0); // 指定舵机转向的角度
delay(700);
myservo3.write(90); // 指定舵机转向的角度
delay(1000); // 等待15ms让舵机到达指定位置
break;
}
}
clearLCD();
LCD.print(l);
delay(5000);
clearLCD();
}
}
总结
自从确定抢答器项目后,我们就开始了积极的准备工作,在初步设计好抢答器的各项功能后,在初期我们主要对抢答器的各个部分进行了重点突破,我们搜集器件,查阅资料,对于舵机、LCD、四位数码管这类我们没接触过的模块,在网上进行资料的查阅,不断地测试试验的过程中,让我们逐渐掌握并能成功的使用它们。随着工作的进行,问题随之而来,由于此次设计所需要的零部件太多,线路尤为繁杂,在设计中期的线路连接过程中常常出现线路乱成一团糟的情况,在查错和保管时容易出现很大的问题,后来我们根据学长的提示,对各组线路进行了分组整理,将电源线,接地线和信号线进行了有效的区分和固定,改良后的线路易于区分和查改。在设计的后期,在线路连接正常和软件独立运行都正常的情况下,在软硬件对接时却出现了种种问题(如接通电源后,舵机会无故进行转动,导致整个程序正常运转),在一次次检查和学长的提示下,终于发现了问题的根源在于控制舵机转动的函数上,最后我们通过将attach()函数改为自己编写的代码,从而解决了问题。
数据结构的学习
在完成抢答器设计的同时,进行数据结构的学习,具体是根据《大话数据结构》这本书进行学习了解。目前进行第三章对链表的学习。在学习的过程中再次对c语言进行了复习。